123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- package bx
- import (
- "encoding/binary"
- "encoding/hex"
- "fmt"
- )
- type BxResp struct {
- group, cmd, Err, r0, r1 byte
- Data []byte
- //StateInfo *StateInfo
- }
- func parse_(pack BxDataPack) *BxResp {
- var offset int
- resp := &BxResp{}
- resp.group = pack.data[offset]
- offset++
- resp.cmd = pack.data[offset]
- offset++
- resp.Err = pack.data[offset]
- offset++
- resp.r0 = pack.data[offset]
- offset++
- resp.r1 = pack.data[offset]
- offset++
- resp.Data = pack.data[offset:(offset + int(pack.dataLen) - 5)]
- //if !resp.IsInfo() {
- // return resp
- //}
- //offset = 0
- //resp.StateInfo = &StateInfo{}
- //resp.StateInfo.OnOff = resp.Data[offset]
- //offset++
- //resp.StateInfo.Brightness = resp.Data[offset]
- //offset++
- //t := resp.Data[offset : offset+8]
- //resp.StateInfo.SystemTime = hex.EncodeToString(t)
- //offset += 8
- //resp.StateInfo.ProgramNum = resp.Data[offset]
- //offset++
- //resp.StateInfo.CruFileName = string(resp.Data[offset : offset+4])
- //offset += 4
- //resp.StateInfo.SpecialDynaArea = resp.Data[offset]
- //offset++
- //resp.StateInfo.PageNum = resp.Data[offset]
- //offset++
- //resp.StateInfo.DynaAreaNum = resp.Data[offset]
- //offset++
- //for i := byte(0); i < resp.StateInfo.ProgramNum; i++ {
- // resp.StateInfo.DynaAreaIDs = append(resp.StateInfo.DynaAreaIDs, resp.Data[offset])
- // offset++
- //}
- //resp.StateInfo.BarCode = string(resp.Data[offset : offset+16])
- return resp
- }
- func (r BxResp) Parse(src []byte, len int) *BxResp {
- dp := dpParse(src, len)
- if dp == nil {
- return nil
- } else {
- return parse_(*dp)
- }
- }
- func (r BxResp) IsAck() bool {
- if r.group == CMD_ACK.group && r.cmd == CMD_ACK.code {
- return true
- } else {
- return false
- }
- }
- func (r BxResp) NoError() bool {
- return r.Err == 0
- }
- func (r BxResp) Error() BxError {
- return bxErrors[r.Err]
- }
- // IsInfo 是否是返回"控制器状态"信息
- func (r BxResp) IsInfo() bool {
- if r.group == CMD_SYSTEM_STATE.group && r.cmd == CMD_SYSTEM_STATE.code {
- return true
- } else {
- return false
- }
- }
- type StateInfo struct {
- OnOff byte
- Brightness byte
- SystemTime string //年(2)+月(1)+日(1)+星期(1)+时(1)+分(1)+秒(1)
- ProgramNum byte
- CruFileName string
- SpecialDynaArea byte
- PageNum byte
- DynaAreaNum byte
- DynaAreaIDs []byte
- BarCode string
- //CustomId string
- }
- func (s *StateInfo) Print(name string) {
- info :=
- `==== %s ====
- 电源状态: %s
- 系统时间: %s
- 节目数量: %d
- 当前播放: %s
- 动态区数: %d
- 条码: %s
- ===============
- `
- onoff := ""
- if s.OnOff == 1 {
- onoff = "开机"
- } else {
- onoff = "关机"
- }
- fmt.Printf(info, name, onoff, s.SystemTime, s.ProgramNum, s.CruFileName, s.DynaAreaNum, s.BarCode)
- }
- func (s *StateInfo) Parse(data []byte) {
- offset := 0
- s.OnOff = data[offset]
- offset++
- s.Brightness = data[offset]
- offset++
- t := data[offset : offset+8]
- s.SystemTime = hex.EncodeToString(t)
- offset += 8
- s.ProgramNum = data[offset]
- offset++
- s.CruFileName = string(data[offset : offset+4])
- offset += 4
- s.SpecialDynaArea = data[offset]
- offset++
- s.PageNum = data[offset]
- offset++
- s.DynaAreaNum = data[offset]
- offset++
- for i := byte(0); i < s.DynaAreaNum; i++ {
- s.DynaAreaIDs = append(s.DynaAreaIDs, data[offset])
- offset++
- }
- s.BarCode = string(data[offset : offset+16])
- }
- type Params struct {
- Address uint16
- DeviceType byte
- BaudRate byte
- ScreenWidth uint16
- ScreenHeight uint16
- Color byte
- DA byte
- OE byte
- FreqPar byte
- RowOrder byte
- MirrorMode byte
- OEAngle byte
- ScanMode byte
- ScanConfNum byte
- LatticeMode byte
- //Reserved []byte
- }
- func (p *Params) Parse(data []byte) {
- offset := 0
- addr, err := BIN2Uint64(data[offset:offset+2], binary.LittleEndian)
- if err == nil {
- p.Address = uint16(addr)
- }
- offset += 2
- p.DeviceType = data[offset]
- offset++
- p.BaudRate = data[offset]
- offset++
- w, err := BIN2Uint64(data[offset:offset+2], binary.LittleEndian)
- if err == nil {
- p.ScreenWidth = uint16(w)
- }
- offset += 2
- h, err := BIN2Uint64(data[offset:offset+2], binary.LittleEndian)
- if err == nil {
- p.ScreenHeight = uint16(h)
- }
- offset += 2
- p.Color = data[offset]
- offset++
- p.DA = data[offset]
- offset++
- p.OE = data[offset]
- offset++
- p.FreqPar = data[offset]
- offset++
- p.RowOrder = data[offset]
- offset++
- p.MirrorMode = data[offset]
- offset++
- p.OEAngle = data[offset]
- offset++
- p.ScanMode = data[offset]
- offset++
- p.ScanConfNum = data[offset]
- offset++
- //p.LatticeMode = data[offset]
- //offset++
- }
|