From 96b2a1e6fabc587132f15fdc95cb2c0250fef60a Mon Sep 17 00:00:00 2001 From: Jonathan Hudson Date: Sat, 11 Mar 2023 22:37:12 +0000 Subject: [PATCH] migrate to go-tty for better portabiliy reinstall signal handler and proc rework TX sender --- go.mod | 2 +- go.sum | 12 ++- pkg/options/options.go | 4 +- pkg/sitlgen/msp.go | 172 +++++++++++++++++++++++------------- pkg/sitlgen/proc_other.go | 23 +++++ pkg/sitlgen/proc_windows.go | 21 +++++ pkg/sitlgen/read_cfg.go | 51 +++++------ pkg/sitlgen/sitlgen.go | 137 +++++++++++++++++----------- 8 files changed, 274 insertions(+), 148 deletions(-) create mode 100644 pkg/sitlgen/proc_other.go create mode 100644 pkg/sitlgen/proc_windows.go diff --git a/go.mod b/go.mod index 7b5c09d..09215e5 100644 --- a/go.mod +++ b/go.mod @@ -7,8 +7,8 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/deet/simpleline v0.0.0-20140919022041-9d297ff784a2 github.com/eclipse/paho.mqtt.golang v1.4.2 - github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 github.com/gorilla/websocket v1.5.0 // indirect + github.com/mattn/go-tty v0.0.4 github.com/mazznoer/colorgrad v0.9.1 github.com/mazznoer/csscolorparser v0.1.3 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect diff --git a/go.sum b/go.sum index f602086..712b797 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,6 @@ github.com/deet/simpleline v0.0.0-20140919022041-9d297ff784a2 h1:pDneKHtEn84/jIL github.com/deet/simpleline v0.0.0-20140919022041-9d297ff784a2/go.mod h1:dKjFZHH1uVU5Ui2LWp5vewMIybnstN1rw01ajCIpIl8= github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4= github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA= -github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= -github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -23,6 +21,13 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-tty v0.0.4 h1:NVikla9X8MN0SQAqCYzpGyXv0jY7MNl3HOWD2dkle7E= +github.com/mattn/go-tty v0.0.4/go.mod h1:u5GGXBtZU6RQoKV8gY5W6UhMudbR5vXnUe7j3pxse28= github.com/mazznoer/colorgrad v0.9.1 h1:MB80JYVndKWSMEM1beNqnuOowWGhoQc3DXWXkFp6JlM= github.com/mazznoer/colorgrad v0.9.1/go.mod h1:WX2R9wt9B47+txJZVVpM9LY+LAGIdi4lTI5wIyreDH4= github.com/mazznoer/csscolorparser v0.1.2/go.mod h1:Aj22+L/rYN/Y6bj3bYqO3N6g1dtdHtGfQ32xZ5PJQic= @@ -65,7 +70,10 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/pkg/options/options.go b/pkg/options/options.go index 38057ad..f4d66d5 100644 --- a/pkg/options/options.go +++ b/pkg/options/options.go @@ -50,7 +50,7 @@ type Configuration struct { RedIsLow bool `json:"low-is-red"` SitlEEprom string `json:"-"` SitlListen string `json:"-"` - SitlPort string `json:"-"` + SitlPort int `json:"-"` Verbose int `json:"-"` } @@ -160,7 +160,7 @@ func ParseCLI(gv func() string) ([]string, string) { Config.Idx = 1 flag.StringVar(&Config.SitlEEprom, "eeprom", "", "EEprom name") flag.StringVar(&Config.SitlListen, "listen", ":49000", "Listening port") - flag.StringVar(&Config.SitlPort, "txport", "127.0.0.1:5761", "host:port for serial TX") + flag.IntVar(&Config.SitlPort, "txport", 5761, "host:port for serial TX") flag.IntVar(&Config.Verbose, "verbose", 0, "Verbosity") } else { flag.BoolVar(&Config.Kml, "kml", Config.Kml, "Generate KML (vice default KMZ)") diff --git a/pkg/sitlgen/msp.go b/pkg/sitlgen/msp.go index 03108ef..2ba6e21 100644 --- a/pkg/sitlgen/msp.go +++ b/pkg/sitlgen/msp.go @@ -57,6 +57,14 @@ const ( RX_DISARM ) +const ( + SEND_NONE = iota + SEND_MSP + SEND_RSSI + SEND_CHANS + SEND_TIMEOUT +) + const SETTING_STR string = "nav_extra_arming_safety" const MAX_MODE_ACTIVATION_CONDITION_COUNT int = 40 @@ -78,6 +86,7 @@ type MSPSerial struct { bypass bool c0 chan SChan mranges []ModeRange + ok bool } type ModeRange struct { @@ -251,13 +260,18 @@ func (m *MSPSerial) Read_msp(c0 chan SChan) { } } } else { + m.ok = false if err != nil { - log.Printf("Serial Read %v\n", err) + if options.Config.Verbose > 1 { + log.Printf("Serial Read %v\n", err) + } } else { log.Println("serial EOF") } - c0 <- SChan{} + + c0 <- SChan{ok: false} m.conn.Close() + return } } } @@ -271,14 +285,16 @@ func NewMSPSerial(remote string) (*MSPSerial, error) { if err != nil { return nil, err } - return &MSPSerial{conn: conn}, nil + return &MSPSerial{conn: conn, ok: true}, nil } func (m *MSPSerial) Send_msp(cmd uint16, payload []byte) { - buf := encode_msp2(cmd, payload) - _, err := m.conn.Write(buf) - if err != nil { - log.Println(err) + if m.ok { + buf := encode_msp2(cmd, payload) + _, err := m.conn.Write(buf) + if err != nil { + log.Println(err) + } } } @@ -353,9 +369,9 @@ func (m *MSPSerial) init(nchan chan MSPChans, schan chan byte, rssich chan byte) } else { log.Println("MAP error") } - txinfo := []byte{0x02, 0x6c, 0x07, 0xdc, 0x05, 0x4c, 0x04, 0x00, 0x75, 0x03, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02} - m.Send_msp(msp_SET_RX_CONFIG, txinfo) - case msp_SET_RX_CONFIG: + // txinfo := []byte{0x02, 0x6c, 0x07, 0xdc, 0x05, 0x4c, 0x04, 0x00, 0x75, 0x03, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02} + // m.Send_msp(msp_SET_RX_CONFIG, txinfo) + // case msp_SET_RX_CONFIG: m.Send_msp(msp_NAME, nil) case msp_NAME: if v.len > 0 { @@ -435,6 +451,7 @@ func (m *MSPSerial) run(nchan chan MSPChans, schan chan byte, rssich chan byte) ichan := MSPChans{} xstatus := uint64(0) rssi := byte(0) + lrssi := byte(0) ichan[0] = 1500 ichan[1] = 1500 if m.bypass { @@ -446,81 +463,112 @@ func (m *MSPSerial) run(nchan chan MSPChans, schan chan byte, rssich chan byte) for j := 4; j < 16; j++ { ichan[j] = 1001 } - tdata := m.serialise_rx(ichan) - m.Send_msp(msp_SET_RAW_RC, tdata) - <-m.c0 rvstat := byte(0) - + mcnt := byte(0) + var sv SChan + tdata := m.serialise_rx(ichan) + m.Send_msp(msp_SET_RAW_RC, tdata) + log.Printf("RC init done\n") for { + event := SEND_NONE select { - case r := <-rssich: - rssi = r - case <-time.After(100 * time.Millisecond): + case v := <-m.c0: + // sv_cmd = v.cmd + //sv_ok = v.ok + sv = v + mcnt += 1 + event = SEND_MSP + case v := <-rssich: + event = SEND_RSSI + rssi = v + case <-time.After(50 * time.Millisecond): + event = SEND_TIMEOUT + case v := <-nchan: + event = SEND_CHANS + for j, u := range v { + if u != 0xffff { + ichan[j] = u + } + } + } + switch event { + case SEND_TIMEOUT: tdata := m.serialise_rx(ichan) m.Send_msp(msp_SET_RAW_RC, tdata) - sv := <-m.c0 - if sv.ok && sv.cmd == msp_SET_RAW_RC { - status, armflags := m.get_status() - // Unarmed, able to arm - if (status&1) == 0 && armflags < 0x200 { - if rvstat != 1 { - rvstat = 1 - if options.Config.Verbose > 1 { - log.Printf("Set status %d (%x)\n", rvstat, armflags) - } - schan <- 1 + case SEND_MSP: + if sv.ok { + send_chans := true + if sv.cmd == msp_SET_RAW_RC && mcnt%5 == 0 { + send_chans = false + m.Send_msp(msp2_INAV_STATUS, nil) + } else if sv.cmd == msp2_INAV_STATUS { + status := binary.LittleEndian.Uint64(sv.data[13:21]) + armflags := binary.LittleEndian.Uint32(sv.data[9:13]) + if options.Config.Verbose > 2 { + log.Printf("Status, Armflags %x %x\n", status, armflags) } - } - if (xstatus & 1) != (status & 1) { - if options.Config.Verbose > 0 { - log.Printf("status changed %x -> %x (%x)\n", xstatus, status, armflags) - } - xstatus = status - if (status & 1) == 0 { - if rvstat != 2 { - rvstat = 2 + // Unarmed, able to arm + if (status&1) == 0 && armflags < 0x200 { + if rvstat != 1 { + rvstat = 1 if options.Config.Verbose > 1 { log.Printf("Set status %d (%x)\n", rvstat, armflags) } - schan <- 2 + schan <- 1 } - } else { - if rvstat != 3 { - rvstat = 3 - if options.Config.Verbose > 1 { - log.Printf("Set status %d (%x)\n", rvstat, armflags) + } + if (xstatus & 1) != (status & 1) { + if options.Config.Verbose > 0 { + log.Printf("status changed %x -> %x (%x)\n", xstatus, status, armflags) + } + xstatus = status + if (status & 1) == 0 { + if rvstat != 2 { + rvstat = 2 + if options.Config.Verbose > 1 { + log.Printf("Set status %d (%x)\n", rvstat, armflags) + } + schan <- 2 + } + } else { + if rvstat != 3 { + rvstat = 3 + if options.Config.Verbose > 1 { + log.Printf("Set status %d (%x)\n", rvstat, armflags) + } + schan <- 3 } - schan <- 3 } } } - m.Rssi(rssi) - <-m.c0 + + if send_chans { + tdata := m.serialise_rx(ichan) + m.Send_msp(msp_SET_RAW_RC, tdata) + } } else { - log.Println("RC data send failed") + if options.Config.Verbose > 1 { + log.Println("RC data send failed") + } schan <- 0xff } - case v := <-nchan: - for j, u := range v { - if u != 0xffff { - ichan[j] = u - } + case SEND_RSSI: + if lrssi != rssi { + m.Rssi(rssi) + lrssi = rssi } + case SEND_CHANS: + tdata := m.serialise_rx(ichan) + m.Send_msp(msp_SET_RAW_RC, tdata) } } } -func (m *MSPSerial) get_status() (uint64, uint32) { - status := uint64(0) - armf := uint32(0) - - m.Send_msp(msp2_INAV_STATUS, nil) - v := <-m.c0 - if v.ok { - status = binary.LittleEndian.Uint64(v.data[13:21]) - armf = binary.LittleEndian.Uint32(v.data[9:13]) +func (m *MSPSerial) Close() { + if m.ok { + m.ok = false + m.conn.Close() } - return status, armf } diff --git a/pkg/sitlgen/proc_other.go b/pkg/sitlgen/proc_other.go new file mode 100644 index 0000000..fbcb726 --- /dev/null +++ b/pkg/sitlgen/proc_other.go @@ -0,0 +1,23 @@ +//go:build !windows +// +build !windows + +package sitlgen + +import ( + "os" + "os/exec" + "syscall" +) + +func proc_start(args ...string) (p *os.Process, err error) { + if args[0], err = exec.LookPath(args[0]); err == nil { + var procAttr os.ProcAttr + procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr} + procAttr.Sys = &syscall.SysProcAttr{Foreground: false, Setsid: true} + p, err := os.StartProcess(args[0], args, &procAttr) + if err == nil { + return p, nil + } + } + return nil, err +} diff --git a/pkg/sitlgen/proc_windows.go b/pkg/sitlgen/proc_windows.go new file mode 100644 index 0000000..32a3b49 --- /dev/null +++ b/pkg/sitlgen/proc_windows.go @@ -0,0 +1,21 @@ +//go:build windows +// +build windows + +package sitlgen + +import ( + "os" + "os/exec" +) + +func proc_start(args ...string) (p *os.Process, err error) { + if args[0], err = exec.LookPath(args[0]); err == nil { + var procAttr os.ProcAttr + procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr} + p, err := os.StartProcess(args[0], args, &procAttr) + if err == nil { + return p, nil + } + } + return nil, err +} diff --git a/pkg/sitlgen/read_cfg.go b/pkg/sitlgen/read_cfg.go index feccc17..b6e4c95 100644 --- a/pkg/sitlgen/read_cfg.go +++ b/pkg/sitlgen/read_cfg.go @@ -2,7 +2,6 @@ package sitlgen import ( "bufio" - "fmt" types "github.com/stronnag/bbl2kml/pkg/api/types" "log" "os" @@ -10,14 +9,21 @@ import ( "strings" ) -func read_cfg(eeprom string) []string { +type SimMeta struct { + sitl string + ip string + port string + path string + eeprom string +} + +func read_cfg() SimMeta { + sitl := SimMeta{} cdir := types.GetConfigDir() fn := filepath.Join(cdir, "fl2sitl.conf") - var args []string r, err := os.Open(fn) if err == nil { defer r.Close() - h := make(map[string]string) scanner := bufio.NewScanner(r) for scanner.Scan() { l := scanner.Text() @@ -27,36 +33,23 @@ func read_cfg(eeprom string) []string { if len(parts) == 2 { key := strings.TrimSpace(parts[0]) val := strings.TrimSpace(parts[1]) - h[key] = val - } - } - } - - if v, ok := h["sitl"]; ok { - args = append(args, v) - args = append(args, "--sim=xp") - if v, ok = h["simip"]; ok { - args = append(args, fmt.Sprintf("--simip=%s", v)) - } - if v, ok = h["simport"]; ok { - args = append(args, fmt.Sprintf("--simport=%s", v)) - } - - if v, ok = h["eeprom-path"]; ok { - ep := os.ExpandEnv(v) - if len(eeprom) == 0 { - if v, ok = h["default-eeprom"]; ok { - eeprom = v - } else { - eeprom = "eeprom.bin" + switch key { + case "sitl": + sitl.sitl = val + case "simip": + sitl.ip = val + case "simport": + sitl.port = val + case "eeprom-path": + sitl.path = val + case "default-eeprom": + sitl.eeprom = val } } - ep = filepath.Join(ep, eeprom) - args = append(args, fmt.Sprintf("--path=%s", ep)) } } } else { log.Fatal("%s : %v\n", fn, err) } - return args + return sitl } diff --git a/pkg/sitlgen/sitlgen.go b/pkg/sitlgen/sitlgen.go index aaec040..063fad8 100644 --- a/pkg/sitlgen/sitlgen.go +++ b/pkg/sitlgen/sitlgen.go @@ -4,15 +4,18 @@ import ( "bytes" "encoding/binary" "fmt" - "github.com/eiannone/keyboard" + "github.com/mattn/go-tty" + "path/filepath" + types "github.com/stronnag/bbl2kml/pkg/api/types" options "github.com/stronnag/bbl2kml/pkg/options" "log" "math" "net" "os" - "os/exec" + "os/signal" "strings" + "syscall" "time" ) @@ -264,18 +267,6 @@ func to_hg(alt float32) float32 { return float32(0.0295299837 * p) } -func proc_start(args ...string) (p *os.Process, err error) { - if args[0], err = exec.LookPath(args[0]); err == nil { - var procAttr os.ProcAttr - procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr} - p, err := os.StartProcess(args[0], args, &procAttr) - if err == nil { - return p, nil - } - } - return nil, err -} - func (x *SitlGen) arm_action(rxchan chan MSPChans, action bool) { if x.swchan != -1 { var act string @@ -317,9 +308,11 @@ func log_mode_change(mranges []ModeRange, imodes []uint16, fname string) { } func (x *SitlGen) Run(rdrchan chan interface{}, meta types.FlightMeta) { + var txhost string + log.SetPrefix("[fl2sitm] ") - log.SetFlags(log.Ltime) - args := read_cfg(options.Config.SitlEEprom) + log.SetFlags(log.Ltime | log.Lmicroseconds) + conf := read_cfg() uaddr, err := net.ResolveUDPAddr("udp", options.Config.SitlListen) if err != nil { @@ -332,16 +325,51 @@ func (x *SitlGen) Run(rdrchan chan interface{}, meta types.FlightMeta) { } defer conn.Close() - if proc, err := proc_start(args...); err == nil { - defer func() { - if options.Config.Verbose > 10 { - log.Printf("DBG kill proc +%v\n", proc) + if options.Config.Verbose > 0 { + log.Printf("Conf = %+v\n", conf) + } + + if conf.sitl != "" { + args := []string{} + args = append(args, conf.sitl) + args = append(args, "--sim=xp") + if conf.ip != "" { + args = append(args, fmt.Sprintf("--simip=%s", conf.ip)) + } + if conf.port != "" { + args = append(args, fmt.Sprintf("--simport=%s", conf.port)) + } + + if conf.path != "" { + ep := os.ExpandEnv(conf.path) + var eeprom string + if len(options.Config.SitlEEprom) == 0 { + if conf.eeprom != "" { + eeprom = conf.eeprom + } else { + eeprom = "eeprom.bin" + } + } else { + eeprom = options.Config.SitlEEprom } - proc.Kill() - proc.Wait() - }() + ep = filepath.Join(ep, eeprom) + args = append(args, fmt.Sprintf("--path=%s", ep)) + } + + if proc, err := proc_start(args...); err == nil { + defer func() { + if options.Config.Verbose > 10 { + log.Printf("DBG kill proc +%v\n", proc) + } + proc.Kill() + proc.Wait() + }() + } } + cc := make(chan os.Signal, 1) + signal.Notify(cc, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + var sim SimData // sim data to SITL @@ -373,27 +401,33 @@ func (x *SitlGen) Run(rdrchan chan interface{}, meta types.FlightMeta) { armed := false lastfm := uint16(types.FM_UNK) var mranges []ModeRange - - keysEvents, err := keyboard.GetKeys(10) + tty, err := tty.Open() if err != nil { - panic(err) + log.Fatal(err) } - defer func() { - err := keyboard.Close() - if options.Config.Verbose > 10 { - log.Printf("DBG reset k/bd +%v\n", err) + defer tty.Close() + + evchan := make(chan rune) + go func() { + for { + r, err := tty.ReadRune() + if err != nil { + log.Panic(err) + } + evchan <- r } }() - for done := false; done == false; { cnt += 1 - if options.Config.Verbose > 4 { + if options.Config.Verbose > 9 { log.Printf("Tick %d\n", cnt) } select { case addr := <-addrchan: + txhost, _, _ = net.SplitHostPort(addr.String()) + // txhost = strings.Split(addr.String(), ":")[0] if options.Config.Verbose > 1 { - log.Printf("Got connection %+v\n", addr) + log.Printf("Got connection %s\n", addr.String()) } go x.sender(conn, addr, simchan) serial_ok = 1 @@ -409,7 +443,8 @@ func (x *SitlGen) Run(rdrchan chan interface{}, meta types.FlightMeta) { case <-time.After(100 * time.Millisecond): switch serial_ok { case 1: - m, err = NewMSPSerial(options.Config.SitlPort) + uart2 := fmt.Sprintf("%s:%d", txhost, options.Config.SitlPort) + m, err = NewMSPSerial(uart2) if err == nil { log.Printf("******** Opened RX **************\n") serial_ok = 2 @@ -490,29 +525,24 @@ func (x *SitlGen) Run(rdrchan chan interface{}, meta types.FlightMeta) { bbcmd <- 1 // awake reader case 0xff: done = true + armed = false // we can't disarm if the FC is dead break default: } - case ev := <-keysEvents: - if ev.Err != nil { - panic(ev.Err) - } - if ev.Key == 0 { - switch ev.Rune { - case 'A', 'a': - x.arm_action(rxchan, true) - case 'U': - x.arm_action(rxchan, false) - case 'Q', 'q': - log.Println("Quit") - done = true - } - } else if ev.Key == keyboard.KeyCtrlC { - log.Println("Interrupt") + case ev := <-evchan: + switch ev { + case 'A', 'a': + x.arm_action(rxchan, true) + case 'U': + x.arm_action(rxchan, false) + case 'Q', 'q': + log.Println("Quit") done = true } - + case <-cc: + log.Println("Interrupt") + done = true } } @@ -530,6 +560,9 @@ func (x *SitlGen) Run(rdrchan chan interface{}, meta types.FlightMeta) { } log.Println("Cleanup ...") time.Sleep(2500 * time.Millisecond) - log.Println("Done") + } else { + m.Close() + time.Sleep(500 * time.Millisecond) } + log.Println("Done") }