query.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package ym485
  2. import (
  3. "github.com/valyala/bytebufferpool"
  4. )
  5. // QuerySoftVerAck 1E,查询单灯控制器软件版本响应,终端上报
  6. type QuerySoftVerAck struct {
  7. Dp DataPack
  8. Mark [4]byte
  9. Model string //软件型号,ascii码
  10. Version string //2字节BCD码,版本号
  11. Date string //日期,日月年顺序
  12. }
  13. func (o *QuerySoftVerAck) EnCode(Addr string, Mark [4]byte, Model string, Version string, Date string) (*bytebufferpool.ByteBuffer, error) {
  14. copy(o.Mark[0:], Mark[0:])
  15. o.Model = Model
  16. o.Version = Version
  17. o.Date = Date
  18. tmpModel := make([]byte, 16)
  19. if len(Model) <= 16 {
  20. copy(tmpModel, o.Model)
  21. } else {
  22. copy(tmpModel, []byte(o.Model)[0:16])
  23. }
  24. dataBuf := make([]byte, 0, 25)
  25. dataBuf = append(dataBuf, o.Mark[0:]...)
  26. dataBuf = append(dataBuf, tmpModel[0:]...)
  27. dataBuf = append(dataBuf, o.Version[0:]...)
  28. dataBuf = append(dataBuf, o.Date[0:]...)
  29. return o.Dp.EnCode(Addr, 0x1E, dataBuf)
  30. }
  31. func (o *QuerySoftVerAck) DeCode(data []byte) error {
  32. if err := o.Dp.DeCode(data); err == nil {
  33. len0 := len(o.Dp.Data)
  34. if len0 >= 25 {
  35. copy(o.Mark[0:], o.Dp.Data[0:4])
  36. o.Model = string(o.Dp.Data[4:20])
  37. o.Version = string(bcd2Ascii(o.Dp.Data[20:22]))
  38. o.Date = string(bcd2Ascii(o.Dp.Data[22:25]))
  39. }
  40. return nil
  41. } else {
  42. return err
  43. }
  44. }
  45. type DeviceState struct {
  46. State uint8 //当前状态
  47. Voltage float64 //电压,2字节bcd码,1位小数从000.0~999.9
  48. Current float64 //电压,2字节bcd码,2位小数从00.00~99.99
  49. ActivePower uint16 //有功功率,2字节bcd码,无小数
  50. LeakageCurrent float64 //漏电流值,2字节bcd码,2位小数
  51. BrightnessState uint8 //调光状态,1字节BIN码
  52. ColorState uint8 //调色温状态,1字节BIN码
  53. Degree float64 //当前电度值,4字节bcd码,2位小数
  54. }
  55. // QueryDeviceStateAck 1E,查询单灯控制器软件版本响应,终端上报
  56. type QueryDeviceStateAck struct {
  57. Dp DataPack
  58. Mark [4]byte
  59. V byte //数据区版本号,03H
  60. L uint8 //路数
  61. State []DeviceState //路n的状态
  62. }
  63. func (o *QueryDeviceStateAck) EnCode(Addr string, Mark [4]byte, State []DeviceState) (*bytebufferpool.ByteBuffer, error) {
  64. copy(o.Mark[0:], Mark[0:])
  65. o.V = 0x03
  66. o.L = uint8(len(State))
  67. dataBuf := make([]byte, 0, 6+15*len(State))
  68. dataBuf = append(dataBuf, o.Mark[0:]...)
  69. dataBuf = append(dataBuf, o.V, o.L)
  70. for _, v := range State {
  71. dataBuf = append(dataBuf, v.State)
  72. buf, err := EncodeFloat64(v.Voltage, 3, 1)
  73. if err == nil {
  74. dataBuf = append(dataBuf, buf...)
  75. }
  76. buf, err = EncodeFloat64(v.Current, 2, 2)
  77. if err == nil {
  78. dataBuf = append(dataBuf, buf...)
  79. }
  80. buf, err = EncodeFloat64(float64(v.ActivePower), 4, 0)
  81. if err == nil {
  82. dataBuf = append(dataBuf, buf...)
  83. }
  84. buf, err = EncodeFloat64(v.LeakageCurrent, 2, 2)
  85. if err == nil {
  86. dataBuf = append(dataBuf, buf...)
  87. }
  88. dataBuf = append(dataBuf, v.BrightnessState)
  89. dataBuf = append(dataBuf, v.ColorState)
  90. buf, err = EncodeFloat64(v.Degree, 6, 2)
  91. if err == nil {
  92. dataBuf = append(dataBuf, buf...)
  93. }
  94. }
  95. return o.Dp.EnCode(Addr, 0x1E, dataBuf)
  96. }
  97. // DeCode 解码串口返回的数据
  98. func (o *QueryDeviceStateAck) DeCode(data []byte) error {
  99. if err := o.Dp.DeCode(data); err == nil { //串口回的数据校验打包
  100. len0 := len(o.Dp.Data)
  101. if len0 >= 6 {
  102. copy(o.Mark[0:], o.Dp.Data[0:4])
  103. o.V = o.Dp.Data[4]
  104. o.L = o.Dp.Data[5]
  105. tmpData := o.Dp.Data[6:]
  106. for {
  107. obj, err := ParseState(tmpData) //解析所有路的电压电度等
  108. if err == nil {
  109. o.State = append(o.State, *obj)
  110. tmpData = tmpData[15:]
  111. } else {
  112. break
  113. }
  114. }
  115. }
  116. return nil
  117. } else {
  118. return err
  119. }
  120. }
  121. func ParseState(data []byte) (*DeviceState, error) {
  122. if len(data) >= 15 {
  123. var obj DeviceState
  124. obj.State = data[0]
  125. f, err := DecodeFloat64(data[1:3], 1)
  126. if err == nil {
  127. obj.Voltage = f
  128. }
  129. f, err = DecodeFloat64(data[3:5], 2)
  130. if err == nil {
  131. obj.Current = f
  132. }
  133. f, err = DecodeFloat64(data[5:7], 0)
  134. if err == nil {
  135. obj.ActivePower = uint16(f)
  136. }
  137. f, err = DecodeFloat64(data[7:9], 2)
  138. if err == nil {
  139. obj.LeakageCurrent = f
  140. }
  141. obj.BrightnessState = data[9]
  142. obj.ColorState = data[10]
  143. f, err = DecodeFloat64(data[11:15], 2)
  144. if err == nil {
  145. obj.Degree = f
  146. }
  147. return &obj, nil
  148. }
  149. return nil, ErrorInvalidLenght
  150. }