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() }