You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.4 KiB
85 lines
1.4 KiB
package main
|
|
|
|
import (
|
|
"cli-mon/can"
|
|
"cli-mon/ui"
|
|
"cli-mon/yabl"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
filename := flag.String("f", "", "Candump filename")
|
|
canbus := flag.String("i", "", "CAN bus interface")
|
|
stdin := flag.Bool("s", false, "Read from stdin")
|
|
gui := flag.Bool("gui", false, "Text mode gui")
|
|
flag.Parse()
|
|
|
|
var frames <-chan *can.CanFrame
|
|
|
|
switch {
|
|
case *stdin:
|
|
frames = can.ReadStdin()
|
|
case len(*filename) > 0:
|
|
frames = can.Readfile(filename)
|
|
case len(*canbus) > 0:
|
|
var err error
|
|
frames, err = can.StartCan(*canbus)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
default:
|
|
flag.Usage()
|
|
}
|
|
|
|
if frames == nil {
|
|
fmt.Println("Get no data")
|
|
os.Exit(0)
|
|
}
|
|
|
|
converter := yabl.NewProtocolConverter()
|
|
|
|
var display ui.UI
|
|
|
|
if *gui {
|
|
display = ui.NewUI()
|
|
} else {
|
|
display = ui.NewLog()
|
|
}
|
|
|
|
display.Start()
|
|
|
|
updates := make(chan *yabl.Event, 1000)
|
|
|
|
var f func()
|
|
f = func() {
|
|
if events, ok := converter.CheckTimeouts(); ok {
|
|
for _, event := range events {
|
|
updates <- event
|
|
}
|
|
}
|
|
time.AfterFunc(50*time.Millisecond, f)
|
|
}
|
|
|
|
time.AfterFunc(5*time.Second, f)
|
|
|
|
go func() {
|
|
for frame := range frames {
|
|
if events, ok := converter.EventsFromFrame(frame); ok {
|
|
for _, event := range events {
|
|
updates <- event
|
|
}
|
|
}
|
|
}
|
|
close(updates)
|
|
}()
|
|
|
|
for event := range updates {
|
|
display.Consume(event)
|
|
}
|
|
|
|
display.Stop()
|
|
}
|
|
|