123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- package bx
- import (
- "bytes"
- "encoding/binary"
- "fmt"
- "github.com/sirupsen/logrus"
- "time"
- )
- type bxFile struct {
- type_ byte
- name string
- len uint32
- content string
- Priority byte
- DisplayType uint16
- PlayTimes byte
-
-
-
-
- ProgramLife string
-
-
-
-
-
- ProgramWeek byte
-
- ProgramTime byte
-
- PlayPeriodGrpNum byte
-
-
- Areas []BxArea
- }
- func NewBxFile(fileName string, diedLine string, areas []BxArea) bxFile {
- return bxFile{
- name: fileName,
- Areas: areas,
- ProgramLife: diedLine,
- Priority: 0xff,
- PlayTimes: 1,
- ProgramWeek: 1,
- }
- }
- func (f bxFile) NewCmdWriteFile() *CmdWriteFile {
- return &CmdWriteFile{
- baseBxCmd: newBaseCmd(CMD_WRITE_FILE.group, CMD_WRITE_FILE.code),
- file: &f,
- LastBlockFlag: 1,
- }
- }
- func (f bxFile) encodeProgramLife() []byte {
- if f.ProgramLife == "" {
- return []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
- }
- w := bufPoll.Get().(*bytes.Buffer)
- now := time.Now()
- y := Uint2BCD(uint64(now.Year()), false)
- m := Uint2BCD(uint64(now.Month()), false)
- d := Uint2BCD(uint64(now.Day()), false)
- binary.Write(w, binary.BigEndian, y)
- binary.Write(w, binary.BigEndian, m)
- binary.Write(w, binary.BigEndian, d)
- end, err := time.Parse("2006-01-02", f.ProgramLife)
- if err != nil {
- logrus.Error("时间解析错误:", err)
- return nil
- }
- endY := Uint2BCD(uint64(end.Year()), false)
- endM := Uint2BCD(uint64(end.Month()), false)
- endD := Uint2BCD(uint64(end.Day()), false)
- binary.Write(w, binary.BigEndian, endY)
- binary.Write(w, binary.BigEndian, endM)
- binary.Write(w, binary.BigEndian, endD)
- return w.Bytes()
- }
- type CmdWriteFile struct {
- baseBxCmd
- state byte
- file *bxFile
- LastBlockFlag byte
- BlockNum uint16
- BlockLen uint16
- BlockAddr uint32
- temp []byte
- }
- func (cmd *CmdWriteFile) Build() []byte {
- if cmd.state == 0 {
-
- w0 := bytes.NewBuffer(make([]byte, 0, 1024))
- for _, v := range cmd.file.Areas {
- b := v.Build()
- binary.Write(w0, binary.LittleEndian, uint32(len(b))+4)
- binary.Write(w0, binary.LittleEndian, b)
- }
- l := w0.Len() + 27
- cmd.BlockLen = uint16(l)
- cmd.file.len = uint32(l)
- fmt.Println("传输的长度:", l)
-
- w1 := bytes.NewBuffer(make([]byte, 0, 1024))
-
- binary.Write(w1, binary.LittleEndian, cmd.Group())
- binary.Write(w1, binary.LittleEndian, cmd.Cmd())
- binary.Write(w1, binary.LittleEndian, byte(0x01))
- binary.Write(w1, binary.LittleEndian, []byte{0x00, 0x00})
- binary.Write(w1, binary.BigEndian, []byte(cmd.file.name))
- binary.Write(w1, binary.LittleEndian, cmd.LastBlockFlag)
- binary.Write(w1, binary.LittleEndian, cmd.BlockNum)
- binary.Write(w1, binary.LittleEndian, cmd.BlockLen)
- binary.Write(w1, binary.LittleEndian, cmd.BlockAddr)
-
- w2 := bytes.NewBuffer(make([]byte, 0, 1024))
- binary.Write(w2, binary.LittleEndian, cmd.file.type_)
- binary.Write(w2, binary.BigEndian, []byte(cmd.file.name))
- binary.Write(w2, binary.LittleEndian, cmd.file.len)
- binary.Write(w2, binary.LittleEndian, cmd.file.Priority)
- binary.Write(w2, binary.LittleEndian, cmd.file.DisplayType)
- binary.Write(w2, binary.LittleEndian, cmd.file.PlayTimes)
- binary.Write(w2, binary.BigEndian, cmd.file.encodeProgramLife())
- binary.Write(w2, binary.LittleEndian, cmd.file.ProgramWeek)
- binary.Write(w2, binary.LittleEndian, cmd.file.ProgramTime)
- binary.Write(w2, binary.LittleEndian, cmd.file.PlayPeriodGrpNum)
-
- binary.Write(w2, binary.LittleEndian, byte(len(cmd.file.Areas)))
- binary.Write(w2, binary.LittleEndian, w0.Bytes())
- b2 := w2.Bytes()
- binary.Write(w1, binary.BigEndian, b2)
- crc16 := CRC16(b2, 0, w2.Len())
- fmt.Printf("文件校验:% 02x\n", crc16)
- binary.Write(w1, binary.LittleEndian, crc16)
- cmd.temp = w1.Bytes()
-
- w3 := bytes.NewBuffer(make([]byte, 0, 64))
- binary.Write(w3, binary.LittleEndian, CMD_START_WRITE_FILE.group)
- binary.Write(w3, binary.LittleEndian, CMD_START_WRITE_FILE.code)
- binary.Write(w3, binary.LittleEndian, byte(0x01))
- binary.Write(w3, binary.LittleEndian, []byte{0x00, 0x00})
- binary.Write(w3, binary.LittleEndian, byte(0x01))
- binary.Write(w3, binary.BigEndian, []byte(cmd.file.name))
- binary.Write(w3, binary.LittleEndian, cmd.file.len)
- cmd.state = 1
- return w3.Bytes()
- } else {
- return cmd.temp
- }
- }
- type cmdFileBeginWrite struct {
- baseBxCmd
- }
- func NewCmdFileBeginWrite() cmdFileBeginWrite {
- return cmdFileBeginWrite{
- baseBxCmd: newBaseCmd(CMD_START_WRITE_FILE.group, CMD_START_WRITE_FILE.code),
- }
- }
|