|
|
package Adl400Impl
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
"tgk-touch/internal/global"
|
|
|
"tgk-touch/internal/library/ADL400"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
func (a *Adl400Impl) ReadYear(commUid string, addr byte) (int, error) {
|
|
|
read, err := ADL400.H003E.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, err
|
|
|
}
|
|
|
value := read[0]
|
|
|
|
|
|
bytes := []byte{byte(value >> 8), byte(value)}
|
|
|
_, year := int(bytes[0]), int(bytes[1])
|
|
|
return year, nil
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadMonth(commUid string, addr byte) (int, error) {
|
|
|
read, err := ADL400.H003E.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, err
|
|
|
}
|
|
|
value := read[0] // 低字节为月份
|
|
|
bytes := []byte{byte(value >> 8), byte(value)}
|
|
|
month, _ := int(bytes[0]), int(bytes[1])
|
|
|
return month, nil
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadDay(commUid string, addr byte) (int, error) {
|
|
|
read, err := ADL400.H003D.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, err
|
|
|
}
|
|
|
value := read[0]
|
|
|
//hour := value >> 8 // 高字节=小时(9)
|
|
|
day := value & 0xFF // 低字节=日(27)
|
|
|
return int(day), nil
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadHour(commUid string, addr byte) (int, error) {
|
|
|
read, err := ADL400.H003D.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, err
|
|
|
}
|
|
|
value := read[0]
|
|
|
hour := value >> 8 // 高字节=小时(9)
|
|
|
//day := value & 0xFF // 低字节=日(27)
|
|
|
return int(hour), nil
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadMinute(commUid string, addr byte) (int, error) {
|
|
|
read, err := ADL400.H003C.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, err
|
|
|
}
|
|
|
value := read[0]
|
|
|
//second := value >> 8 // 高字节=小时(9)
|
|
|
minute := value & 0xFF // 低字节=日(27)
|
|
|
return int(minute), nil
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadSecond(commUid string, addr byte) (int, error) {
|
|
|
read, err := ADL400.H003C.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, err
|
|
|
}
|
|
|
value := read[0]
|
|
|
second := value >> 8 // 高字节=小时(9)
|
|
|
//minute := value & 0xFF // 低字节=日(27)
|
|
|
return int(second), nil
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadTime(commUid string, addr byte) (time.Time, error) {
|
|
|
// 读取各个时间组件
|
|
|
year, err := a.ReadYear(commUid, addr)
|
|
|
if err != nil {
|
|
|
return time.Time{}, fmt.Errorf("failed to read year: %v", err)
|
|
|
}
|
|
|
|
|
|
month, err := a.ReadMonth(commUid, addr)
|
|
|
if err != nil {
|
|
|
return time.Time{}, fmt.Errorf("failed to read month: %v", err)
|
|
|
}
|
|
|
|
|
|
day, err := a.ReadDay(commUid, addr)
|
|
|
if err != nil {
|
|
|
return time.Time{}, fmt.Errorf("failed to read day: %v", err)
|
|
|
}
|
|
|
|
|
|
hour, err := a.ReadHour(commUid, addr)
|
|
|
if err != nil {
|
|
|
return time.Time{}, fmt.Errorf("failed to read hour: %v", err)
|
|
|
}
|
|
|
|
|
|
minute, err := a.ReadMinute(commUid, addr)
|
|
|
if err != nil {
|
|
|
return time.Time{}, fmt.Errorf("failed to read minute: %v", err)
|
|
|
}
|
|
|
|
|
|
second, err := a.ReadSecond(commUid, addr)
|
|
|
if err != nil {
|
|
|
return time.Time{}, fmt.Errorf("failed to read second: %v", err)
|
|
|
}
|
|
|
// 构建时间对象
|
|
|
loc, _ := time.LoadLocation("Local") // 使用本地时区
|
|
|
t := time.Date(
|
|
|
year+2000, // 假设年份是2位数,加上2000
|
|
|
time.Month(month),
|
|
|
day,
|
|
|
hour,
|
|
|
minute,
|
|
|
second,
|
|
|
0, // 纳秒
|
|
|
loc,
|
|
|
)
|
|
|
return t, nil
|
|
|
}
|
|
|
|
|
|
func (a *Adl400Impl) ReadVoltage(commUid string, addr byte) (totalVoltage, aVoltage, bVoltage, cVoltage float64, err error) {
|
|
|
aRead, err := ADL400.H0061.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
aVoltage = float64(aRead[0]) * 0.1
|
|
|
bRead, err := ADL400.H0062.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
bVoltage = float64(bRead[0]) * 0.1
|
|
|
cRead, err := ADL400.H0063.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
cVoltage = float64(cRead[0]) * 0.1
|
|
|
return totalVoltage, aVoltage, bVoltage, cVoltage, err
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadElectricCurrent(commUid string, addr byte) (totalElectricCurrent, aElectricCurrent, bElectricCurrent, cElectricCurrent float64, err error) {
|
|
|
aRead, err := ADL400.H0064.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
aElectricCurrent = float64(aRead[0]) * 0.01
|
|
|
bRead, err := ADL400.H0065.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
bElectricCurrent = float64(bRead[0]) * 0.01
|
|
|
|
|
|
cRead, err := ADL400.H0066.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
cElectricCurrent = float64(cRead[0]) * 0.01
|
|
|
|
|
|
return totalElectricCurrent, aElectricCurrent, bElectricCurrent, cElectricCurrent, err
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadPower(commUid string, addr byte) (totalPower, aPower, bPower, cPower float64, err error) {
|
|
|
aRead, err := ADL400.H0067.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
aPower = float64(aRead[0]) * 0.001
|
|
|
bRead, err := ADL400.H0068.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
bPower = float64(bRead[0]) * 0.001
|
|
|
|
|
|
cRead, err := ADL400.H0069.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
cPower = float64(cRead[0]) * 0.001
|
|
|
tRead, err := ADL400.H006A.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, 0, 0, 0, err
|
|
|
}
|
|
|
totalPower = float64(tRead[0]) * 0.001
|
|
|
return totalPower, aPower, bPower, cPower, err
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadTotalPower(commUid string, addr byte) (totalPower float64, err error) {
|
|
|
tRead, err := ADL400.H006A.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, err
|
|
|
}
|
|
|
totalPower = float64(tRead[0]) * 0.001
|
|
|
return totalPower, err
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadEnergy(commUid string, addr byte) (totalEnergy, aEnergy, bEnergy, cEnergy float64, err error) {
|
|
|
read, err := ADL400.H000A.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
high := uint32(read[0]) // 高16位
|
|
|
low := uint32(read[1]) // 低16位
|
|
|
value := (high << 16) | low // 组合为32位整数
|
|
|
totalEnergy = float64(value) * 0.01
|
|
|
|
|
|
aRead, err := ADL400.H0087.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
ahigh := uint32(aRead[0]) // 高16位
|
|
|
alow := uint32(aRead[1]) // 低16位
|
|
|
avalue := (ahigh << 16) | alow // 组合为32位整数
|
|
|
aEnergy = float64(avalue) * 0.01
|
|
|
|
|
|
bRead, err := ADL400.H0089.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
bhigh := uint32(bRead[0]) // 高16位
|
|
|
blow := uint32(bRead[1]) // 低16位
|
|
|
bvalue := (bhigh << 16) | blow // 组合为32位整数
|
|
|
bEnergy = float64(bvalue) * 0.01
|
|
|
|
|
|
cRead, err := ADL400.H008B.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
chigh := uint32(cRead[0]) // 高16位
|
|
|
clow := uint32(cRead[1]) // 低16位
|
|
|
cvalue := (chigh << 16) | clow // 组合为32位整数
|
|
|
cEnergy = float64(cvalue) * 0.01
|
|
|
|
|
|
return totalEnergy, aEnergy, bEnergy, cEnergy, err
|
|
|
}
|
|
|
|
|
|
func (a *Adl400Impl) ReadPowerFactor(commUid string, addr byte) (totalPf, aPf, bPf, cPf float64, err error) {
|
|
|
aRead, err := ADL400.H0073.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
aPf = float64(aRead[0]) * 0.001
|
|
|
bRead, err := ADL400.H0074.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
bPf = float64(bRead[0]) * 0.001
|
|
|
|
|
|
cRead, err := ADL400.H0075.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
cPf = float64(cRead[0]) * 0.001
|
|
|
tRead, err := ADL400.H0076.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, 0, 0, 0, err
|
|
|
}
|
|
|
totalPf = float64(tRead[0]) * 0.001
|
|
|
return totalPf, aPf, bPf, cPf, err
|
|
|
}
|
|
|
func (a *Adl400Impl) ReadMsgAddr(commUid string, addr byte) (msgAddr byte, err error) {
|
|
|
read, err := ADL400.H003F.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return 0, err
|
|
|
}
|
|
|
|
|
|
// 调试日志:打印原始数据
|
|
|
g.Log().Infof("ReadMsgAddr raw data: len=%d, data=% X", len(read), read)
|
|
|
|
|
|
// 根据实际数据长度处理不同情况
|
|
|
switch len(read) {
|
|
|
case 1: // 单个 uint16 值 (2字节)
|
|
|
// 示例日志: [5C03] -> 0x5C03
|
|
|
value := read[0] // 假设返回的是 uint16 类型
|
|
|
msgAddr = byte(value >> 8) // 取高字节 (0x5C)
|
|
|
g.Log().Infof("Extracted from uint16: 0x%X -> msgAddr=0x%X (%d)", value, msgAddr, msgAddr)
|
|
|
/*
|
|
|
case 2: // 两个字节 [high, low]
|
|
|
// 示例: [5C 03] -> msgAddr=0x5C
|
|
|
msgAddr = read[0]
|
|
|
g.Log().Infof("Extracted from bytes: [% X] -> msgAddr=0x%X (%d)", read, msgAddr, msgAddr)
|
|
|
|
|
|
default:
|
|
|
return 0, fmt.Errorf("unexpected data length: %d bytes", len(read))*/
|
|
|
}
|
|
|
|
|
|
return msgAddr, nil
|
|
|
}
|
|
|
|
|
|
func (a *Adl400Impl) ReadMainAddr(commUid string, addr byte) (mainAddr byte, err error) {
|
|
|
/* read, err := ADL400.H0099_009E.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return "", err
|
|
|
}
|
|
|
|
|
|
// 调试日志
|
|
|
g.Log().Infof("ReadMainAddr raw data: len=%d, data=% X", len(read), read)
|
|
|
|
|
|
// 根据实际数据长度处理
|
|
|
var bcdData []byte
|
|
|
switch v := read.(type) {
|
|
|
case []uint16: // 返回的是 uint16 数组
|
|
|
// 示例: [0000 0000 0050] -> BCD "000000000050"
|
|
|
for _, reg := range v {
|
|
|
bcdData = append(bcdData, byte(reg>>8), byte(reg))
|
|
|
}
|
|
|
|
|
|
case []byte: // 直接返回字节数组
|
|
|
bcdData = v
|
|
|
|
|
|
default:
|
|
|
return "", fmt.Errorf("unexpected data type: %T", read)
|
|
|
}
|
|
|
|
|
|
// 验证数据长度
|
|
|
if len(bcdData) != 12 {
|
|
|
return "", fmt.Errorf("invalid BCD data length: expected 12 bytes, got %d", len(bcdData))
|
|
|
}
|
|
|
|
|
|
// 转换BCD码为字符串
|
|
|
var builder strings.Builder
|
|
|
for _, b := range bcdData {
|
|
|
high := b >> 4
|
|
|
low := b & 0x0F
|
|
|
|
|
|
if high > 9 || low > 9 {
|
|
|
return "", fmt.Errorf("invalid BCD digit: %X", b)
|
|
|
}
|
|
|
|
|
|
builder.WriteByte('0' + high)
|
|
|
builder.WriteByte('0' + low)
|
|
|
}
|
|
|
|
|
|
mainAddr = builder.String()
|
|
|
g.Log().Infof("Converted mainAddr: %s", mainAddr)*/
|
|
|
return
|
|
|
}
|
|
|
|
|
|
func (a *Adl400Impl) ReadDailyFreezingTime(commUid string, addr byte) (dailyFreezingTime string, err error) {
|
|
|
read, err := ADL400.H0121.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return "", err
|
|
|
}
|
|
|
value := read[0]
|
|
|
minute := value >> 8 // 高字节=小时(9)
|
|
|
hour := value & 0xFF // 低字节=日(27)
|
|
|
// 校验有效时间范围
|
|
|
if hour < 0 || hour > 23 || minute < 0 || minute > 59 {
|
|
|
return fmt.Sprintf("%03d:%02d", hour, minute), nil
|
|
|
}
|
|
|
return fmt.Sprintf("%02d:%02d", hour, minute), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
func (a *Adl400Impl) ReadMonthlyFreezingTime(commUid string, addr byte) (dayStr, hourStr string, err error) {
|
|
|
read, err := ADL400.H0122.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return "", "", err
|
|
|
}
|
|
|
value := read[0]
|
|
|
day := value >> 8 // 高字节=小时(9)
|
|
|
hour := value & 0xFF // 低字节=日(27)
|
|
|
|
|
|
return fmt.Sprintf("%02d", day), fmt.Sprintf("%02d", hour), err
|
|
|
}
|