From 68299379db9bf236fe454f5d40cf520c61b2c3ee Mon Sep 17 00:00:00 2001 From: Nonoo Date: Sun, 25 Oct 2020 12:00:04 +0100 Subject: [PATCH] Add serial read/write, not completed yet --- serialstream.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/serialstream.go b/serialstream.go index 39336f4..4623c44 100644 --- a/serialstream.go +++ b/serialstream.go @@ -9,11 +9,57 @@ type serialStream struct { serialPort serialPortStruct + sendSeq uint16 + deinitNeededChan chan bool deinitFinishedChan chan bool } +func (s *serialStream) send(d []byte) error { + s.common.pkt0.sendSeqLock() + defer s.common.pkt0.sendSeqUnlock() + + l := byte(len(d)) + p := append([]byte{0x15 + l, 0x00, 0x00, 0x00, 0x00, 0x00, byte(s.common.pkt0.sendSeq), byte(s.common.pkt0.sendSeq >> 8), + byte(s.common.localSID >> 24), byte(s.common.localSID >> 16), byte(s.common.localSID >> 8), byte(s.common.localSID), + byte(s.common.remoteSID >> 24), byte(s.common.remoteSID >> 16), byte(s.common.remoteSID >> 8), byte(s.common.remoteSID), + 0xc1, l, 0x00, byte(s.sendSeq >> 8), byte(s.sendSeq)}, d...) + if err := s.common.send(p); err != nil { + return err + } + s.sendSeq++ + return nil +} + +func (s *serialStream) sendOpenClose(close bool) error { + s.common.pkt0.sendSeqLock() + defer s.common.pkt0.sendSeqUnlock() + + var magic byte + if close { + magic = 0x00 + } else { + magic = 0x05 + } + + p := []byte{0x16, 0x00, 0x00, 0x00, 0x00, 0x00, byte(s.common.pkt0.sendSeq), byte(s.common.pkt0.sendSeq >> 8), + byte(s.common.localSID >> 24), byte(s.common.localSID >> 16), byte(s.common.localSID >> 8), byte(s.common.localSID), + byte(s.common.remoteSID >> 24), byte(s.common.remoteSID >> 16), byte(s.common.remoteSID >> 8), byte(s.common.remoteSID), + 0xc0, 0x01, 0x00, byte(s.sendSeq >> 8), byte(s.sendSeq), magic} + if err := s.common.send(p); err != nil { + return err + } + s.sendSeq++ + return nil +} + func (s *serialStream) handleRead(r []byte) { + if len(r) >= 22 { + if r[16] == 0xc1 && r[0]-0x15 == r[17] { + s.serialPort.write <- r[21:] + } + } + } func (s *serialStream) loop() { @@ -21,6 +67,10 @@ func (s *serialStream) loop() { select { case r := <-s.common.readChan: s.handleRead(r) + case r := <-s.serialPort.read: + if err := s.send(r); err != nil { + reportError(err) + } case <-s.deinitNeededChan: s.deinitFinishedChan <- true return @@ -49,6 +99,11 @@ func (s *serialStream) start(devName string) error { log.Print("stream started") s.common.pkt7.startPeriodicSend(&s.common, 1, false) + s.common.pkt0.startPeriodicSend(&s.common) + + if err := s.sendOpenClose(false); err != nil { + return err + } s.deinitNeededChan = make(chan bool) s.deinitFinishedChan = make(chan bool) @@ -64,6 +119,10 @@ func (s *serialStream) init() error { } func (s *serialStream) deinit() { + if s.common.pkt0.sendTicker != nil { // Stream opened? + _ = s.sendOpenClose(true) + } + if s.deinitNeededChan != nil { s.deinitNeededChan <- true <-s.deinitFinishedChan