Added cobra-cli to stop using the os.Args[] and a logger

This commit is contained in:
2025-01-06 14:42:06 +00:00
parent 519446c20f
commit b8e7725510
8 changed files with 299 additions and 154 deletions
+127
View File
@@ -0,0 +1,127 @@
package main
import (
"bytes"
"encoding/binary"
"fmt"
"log"
"os"
"os/signal"
"strings"
"syscall"
"time"
)
type GameSource interface {
GetData(string) (interface{}, error)
UpdateData() error
}
type DataPacket struct {
Speed int32
Gear int32
RPM int32
}
func msToKph(v float32) int {
return int((3600 * v) / 1000)
}
func (e *ESDI) telemetry() {
// Set the handlers
sigc := make(chan os.Signal, 1)
signal.Notify(sigc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT,
)
done := make(chan struct{})
go func() {
s := <-sigc
switch s {
case syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP:
fmt.Printf("Received signal: %v\n", s)
fmt.Print("\033[?25h\033[2J\033[H")
}
close(done)
e.Close()
}()
lastTime := time.Now().UnixMilli()
lastDataSent := time.Now().UnixMilli()
for {
select {
case <-done:
return
default:
time.Sleep(time.Second / 60)
var err error
var buffer strings.Builder
buffer.WriteString("\033[?25l\033[2J\033[H")
err = e.Source.UpdateData()
if err != nil {
fmt.Printf("could not update data: %v", err)
continue
}
curGear, err := e.Source.GetData("Gear")
if err != nil {
log.Fatalf("could not get field `Gear`: %v", err)
}
curRPM, err := e.Source.GetData("RPM")
if err != nil {
log.Fatalf("could not get field `RPM`: %v", err)
}
curSpeed, err := e.Source.GetData("Speed")
if err != nil {
log.Fatalf("could not get field `Speed`: %v", err)
}
gear := int32(curGear.(int))
rpm := int32(curRPM.(float32))
speed := int32(msToKph(curSpeed.(float32)))
buffer.WriteString(fmt.Sprintf("Gear: %d, RPM: %d, Speed: %d", gear, rpm, speed))
curTime := time.Now().UnixMilli()
message := fmt.Sprintf("%d,%d\n", gear-1, rpm)
buffer.WriteString("\n" + message)
messageWasSentMark := "N"
if curTime-lastDataSent > 25 {
packet := DataPacket{
Speed: speed,
Gear: gear,
RPM: rpm,
}
var buf bytes.Buffer
err = binary.Write(&buf, binary.LittleEndian, packet)
_, err = e.SerialConn.Write(buf.Bytes())
if err != nil {
log.Printf("Unable to write data: %v", err)
break
}
messageWasSentMark = "Y"
lastDataSent = curTime
}
buffer.WriteString(" -> " + messageWasSentMark)
if curTime-lastTime > 100 {
fmt.Print(buffer.String())
lastTime = curTime
}
}
}
e.Close()
}