diff --git a/SerialInteraction/serial.go b/SerialInteraction/serial.go index cf4022c..a8e358d 100644 --- a/SerialInteraction/serial.go +++ b/SerialInteraction/serial.go @@ -22,10 +22,7 @@ func (sc *SerialConnection) GetPortPath() string { return sc.portPath } -func (sc *SerialConnection) Connect(portPath string) error { - mode := &serial.Mode{ - BaudRate: 115200, - } +func (sc *SerialConnection) Connect(portPath string, mode *serial.Mode) error { port, err := serial.Open(portPath, mode) if err != nil { return err diff --git a/go.mod b/go.mod index 31e2fea..52cc3f7 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,11 @@ module serialAlox go 1.23.6 require ( - github.com/stretchr/testify v1.7.0 + github.com/micmonay/keybd_event v1.1.2 go.bug.st/serial v1.6.2 ) require ( github.com/creack/goselect v0.1.2 // indirect - github.com/davecgh/go-spew v1.1.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect ) diff --git a/go.sum b/go.sum index 95d3bb7..34d2c82 100644 --- a/go.sum +++ b/go.sum @@ -2,16 +2,15 @@ github.com/creack/goselect v0.1.2 h1:2DNy14+JPjRBgPzAd1thbQp4BSIihxcBf0IXhQXDRa0 github.com/creack/goselect v0.1.2/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglDzQP3hKY= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/micmonay/keybd_event v1.1.2 h1:RpgvPJKOh4Jc+ZYe0OrVzGd2eNMCfuVg3dFTCsuSah4= +github.com/micmonay/keybd_event v1.1.2/go.mod h1:CGMWMDNgsfPljzrAWoybUOSKafQPZpv+rLigt2LzNGI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= go.bug.st/serial v1.6.2 h1:kn9LRX3sdm+WxWKufMlIRndwGfPWsH1/9lCWXQCasq8= go.bug.st/serial v1.6.2/go.mod h1:UABfsluHAiaNI+La2iESysd9Vetq7VRdpxvjx7CmmOE= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index 96aa365..e878b1d 100644 --- a/main.go +++ b/main.go @@ -4,8 +4,12 @@ import ( "fmt" "log" "net/http" + "runtime" parser "serialAlox/Parser" serialinteraction "serialAlox/SerialInteraction" + "time" + + "github.com/micmonay/keybd_event" ) type MainConfig struct { @@ -21,6 +25,15 @@ func NewMainConfig() *MainConfig { } func main() { + kb, err := keybd_event.NewKeyBonding() + if err != nil { + panic(err) + } + + if runtime.GOOS == "linux" { + time.Sleep(2 * time.Second) + } + mc := NewMainConfig() mc.Debug = true @@ -29,8 +42,19 @@ func main() { msParserConf := parser.NewParserConfig() msParser := parser.NewParser(*msParserConf) - //msHandler := NewMessageHandler(&sc, *msConf) - _ = NewMessageHandler(&sc, *msConf, msParser) + msHandler := NewMessageHandler(&sc, *msConf, msParser) + + msHandler.RegisterMessageCallback(0x01, func(b1 byte, b2 []byte) { + log.Printf("ICH BIN DER HANDLER % X, % X", b1, b2) + kb.SetKeys(keybd_event.VK_A, keybd_event.VK_B) + kb.Press() + time.Sleep(10 * time.Millisecond) + kb.Release() + }) + + go msHandler.ListenAndServe() + + msHandler.MessageParser.ParseBytes([]byte{0xAA, 0x01, 0x02, 0x10, 0x20, 0x33}) log.Printf("Started Server on %d", mc.Port) connectString := fmt.Sprintf(":%d", mc.Port) diff --git a/message_handler.go b/message_handler.go index e8d0594..35f204c 100644 --- a/message_handler.go +++ b/message_handler.go @@ -1,5 +1,10 @@ package main +import ( + "context" + "log" +) + type ReaderWriter interface { Write(p []byte) (n int, err error) Read(b []byte) (n int, err error) @@ -32,5 +37,50 @@ func NewMessageHandler(con ReaderWriter, conf MessageHandlerConfig, msgParser Pa WriterReader: con, Conf: conf, MessageParser: msgParser, + handlers: make(map[byte]HandlerFunc), + } +} + +func (mh *MessageHandler) RegisterMessageCallback(typeByte byte, fn HandlerFunc) error { + mh.handlers[typeByte] = fn + return nil +} + +func (mh *MessageHandler) ListenAndServe() { + ctx, cancle := context.WithCancel(context.Background()) + go mh.readBytes(ctx) + defer cancle() + + for { + if mh.MessageParser.IsMessageAvailable() { + msgType, msgPayload, err := mh.MessageParser.GetNextMessage() + if err != nil { + log.Printf("Error getting message %v", err) + return + } + log.Printf("Got messagetype % X, with payload % X", msgType, msgPayload) + if mh.handlers[msgType] != nil { + mh.handlers[msgType](msgType, msgPayload) + } + } + } +} + +func (mh *MessageHandler) readBytes(ctx context.Context) error { + buffer := make([]byte, 1024) + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + // Proceed with reading + n, err := mh.WriterReader.Read(buffer) + if err != nil { + return err + } + // Process the read bytes + mh.MessageParser.ParseBytes(buffer[:n]) + //time.Sleep(100 * time.Millisecond) + } } } diff --git a/testdata/prot1.json b/testdata/prot1.json new file mode 100644 index 0000000..963d9f8 --- /dev/null +++ b/testdata/prot1.json @@ -0,0 +1,62 @@ +{ + "protocol": { + "start_byte": "0xAA", + "message_length": 0, + "max_payload": 255, + "checksum": "xor" + }, + "messages_esp_to_pc": [ + { + "name": "Clients", + "id": "0xE1", + "payload": [ + { "name": "clientCount", "type": "uint8_t" }, + { "name": "clientAvaiableBitMask", "type": "uint32_t" } + ] + }, + { + "name": "Status", + "id": "0xE2", + "payload": [ + { "name": "clientId", "type": "uint8_t" }, + { "name": "mac", "type": "uint8_t", "array": 6 } + ] + }, + { + "name": "Pong", + "id": "0xD1", + "payload": [ + { "name": "clientId", "type": "uint8_t" }, + { "name": "ping", "type": "uint32_t" } + ] + } + ], + "messages_pc_to_esp": [ + { + "name": "RequestPing", + "id": "0xE1", + "payload": [ + { "name": "clientId", "type": "uint8_t" } + ] + }, + { + "name": "RequestStatus", + "id": "0xE2", + "payload": [ + { "name": "clientId", "type": "uint8_t" } + ] + }, + { + "name": "PrepareFirmwareUpdate", + "id": "0xF1" + }, + { + "name": "FirmwareUpdateLine", + "id": "0xF2", + "payload": [ + { "name": "data", "type": "uint8_t", "array": 240 } + ] + } + ] +} +