133 lines
3.1 KiB
Go
133 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"alox.tool/api"
|
|
"alox.tool/eventbus"
|
|
"alox.tool/frontend"
|
|
"alox.tool/testrunner"
|
|
"alox.tool/uart"
|
|
)
|
|
|
|
var (
|
|
Tests bool
|
|
)
|
|
|
|
func main() {
|
|
flag.BoolVar(&Tests, "t", false, "Tests")
|
|
|
|
flag.Parse()
|
|
config := Config{
|
|
Port: 8000,
|
|
Host: "0.0.0.0",
|
|
UartPort: "/dev/ttyUSB0",
|
|
Baudrate: 115200,
|
|
}
|
|
if Tests {
|
|
StartTests(config)
|
|
return
|
|
}
|
|
StartApp(config)
|
|
}
|
|
|
|
func StartTests(config Config) {
|
|
bus := eventbus.New()
|
|
com, err := uart.Connect(bus, config.UartPort, config.Baudrate)
|
|
if err != nil {
|
|
log.Printf("Could not Connect with Uart Device %v", err)
|
|
}
|
|
defer com.Close()
|
|
|
|
tr := testrunner.New(bus, com)
|
|
|
|
testTest1 := make(map[string]func() error)
|
|
testTest1["Echo Test"] = tr.RunEchoTest
|
|
testTest1["Version Test"] = tr.RunVersionTest
|
|
testTest1["Info Test"] = tr.RunClientInfoTest
|
|
testTest1["Input Test"] = tr.RunClientInputTest
|
|
|
|
tr.RunTestSet(testTest1)
|
|
}
|
|
|
|
func StartApp(config Config) {
|
|
bus := eventbus.New()
|
|
com, err := uart.Connect(bus, config.UartPort, config.Baudrate)
|
|
if err != nil {
|
|
log.Printf("Could not Connect with Uart Device %v", err)
|
|
}
|
|
defer com.Close()
|
|
|
|
tr := testrunner.New(bus, com)
|
|
tr.RunVersionTest()
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case msg := <-bus.Subscribe(api.TopicUARTTx):
|
|
log.Printf("MSG[TX]: % X", msg)
|
|
case msg := <-bus.Subscribe(api.TopicUARTRx):
|
|
log.Printf("MSG[RX]: % X", msg)
|
|
val, ok := msg.(api.Frame)
|
|
if !ok {
|
|
log.Printf("val is not type api.Frame its %T", val)
|
|
continue
|
|
}
|
|
log.Printf("[%d] Frame: %X, % X", val.Time, val.ID, val.Data)
|
|
|
|
switch val.ID {
|
|
case api.CmdEcho:
|
|
case api.CmdVersion:
|
|
v, err := uart.ParseFrameVersion(val)
|
|
if err != nil {
|
|
log.Printf("Could not Parse Version %v", err)
|
|
continue
|
|
}
|
|
log.Printf("Version Info %d %s", v.Version, v.Buildhash)
|
|
case api.CmdClientInfo:
|
|
v, err := uart.ParseFrameClientInfo(val)
|
|
if err != nil {
|
|
log.Printf("Could not Parse Client Info %v", err)
|
|
continue
|
|
}
|
|
for _, c := range v {
|
|
log.Printf("Client ID %d", c.ClientID)
|
|
log.Printf("\tIsAvailable %d", c.IsAvailable)
|
|
log.Printf("\tLastPing %d", c.LastPing)
|
|
log.Printf("\tLastSuccessfulPing %d", c.LastSuccessfulPing)
|
|
log.Printf("\tSlotIsUsed %d", c.SlotIsUsed)
|
|
log.Printf("\tVersion %d", c.Version)
|
|
log.Printf("\tMACAddr % X", c.MACAddr)
|
|
}
|
|
case api.CmdClientInput:
|
|
v, err := uart.ParseFrameClientInput(val)
|
|
if err != nil {
|
|
log.Printf("Could not Parse Client Input %v", err)
|
|
continue
|
|
}
|
|
for _, c := range v {
|
|
log.Printf("Client ID %d", c.ClientID)
|
|
log.Printf("\tX %f", c.X)
|
|
log.Printf("\tY %f", c.Y)
|
|
log.Printf("\tBitmask %08b", c.InputMask)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
|
|
time.Sleep(time.Millisecond * 5)
|
|
|
|
com.Send(api.CmdEcho, make([]byte, 0))
|
|
com.Send(api.CmdVersion, make([]byte, 0))
|
|
com.Send(api.CmdClientInfo, make([]byte, 0))
|
|
com.Send(api.CmdClientInput, make([]byte, 0))
|
|
|
|
url := fmt.Sprintf("%s:%d", config.Host, config.Port)
|
|
fserver := frontend.New(bus)
|
|
fserver.Start(url)
|
|
}
|