|
|
package m9z
|
|
|
|
|
|
import (
|
|
|
"encoding/binary"
|
|
|
"fmt"
|
|
|
"tgk-touch/internal/global"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
type DeviceStatus struct {
|
|
|
Mode uint // 模式 (0=自动, 1=手动)
|
|
|
DeviceTime time.Time // 系统时间 (UTC秒数)
|
|
|
Relays [10]bool // 10路继电器状态 (true=动作)
|
|
|
Optocoupler [8]bool // 8路光耦输入状态 (true=触发)
|
|
|
PWMOutputs [10]uint8 // 10路PWM输出值 (0-100)
|
|
|
}
|
|
|
|
|
|
func DeviceStatusRead(deviceId string) (*DeviceStatus, error) {
|
|
|
cmd, err := ReadCmd(deviceId, deviceStatus, "读取设备的状态")
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
data := cmd.Data
|
|
|
|
|
|
// 数据长度校验 (至少需要18字节)
|
|
|
if len(data) < 18 {
|
|
|
return nil, fmt.Errorf("invalid data length: expect 18 bytes, got %d", len(data))
|
|
|
}
|
|
|
|
|
|
ds := &DeviceStatus{}
|
|
|
|
|
|
// 1. 解析工作模式 (Byte0)
|
|
|
ds.Mode = uint(data[0])
|
|
|
|
|
|
// 2. 解析系统时间 (Byte1~4 小端序uint32)
|
|
|
unixSec := int64(binary.LittleEndian.Uint32(data[1:5]))
|
|
|
ds.DeviceTime = time.Unix(unixSec, 0).UTC()
|
|
|
|
|
|
// 3. 解析10路继电器状态 (Byte5~6 小端序uint16)
|
|
|
//relayBits := binary.LittleEndian.Uint16(data[5:7])
|
|
|
relayBits := binary.LittleEndian.Uint16(data[5:7])
|
|
|
g.Log().Debugf("%s 解析10路继电器状态(二进制): %016b ,% X", deviceId, relayBits, data[5:7]) // 补零显示16位
|
|
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
ds.Relays[i] = (relayBits & (1 << i)) != 0
|
|
|
}
|
|
|
|
|
|
// 4. 解析8路光耦输入 (Byte7)
|
|
|
optoByte := data[7]
|
|
|
for i := 0; i < 8; i++ {
|
|
|
ds.Optocoupler[i] = (optoByte & (1 << i)) != 0
|
|
|
}
|
|
|
|
|
|
// 5. 解析10路PWM输出 (Byte8~17)
|
|
|
for i := 0; i < 10; i++ {
|
|
|
ds.PWMOutputs[i] = uint8(data[8+i])
|
|
|
}
|
|
|
|
|
|
return ds, nil
|
|
|
}
|