kopia lustrzana https://github.com/cyoung/stratux
commit
fd18c54381
|
@ -984,6 +984,7 @@ type settings struct {
|
||||||
ES_Enabled bool
|
ES_Enabled bool
|
||||||
Ping_Enabled bool
|
Ping_Enabled bool
|
||||||
GPS_Enabled bool
|
GPS_Enabled bool
|
||||||
|
GpsdAddress string
|
||||||
NetworkOutputs []networkConnection
|
NetworkOutputs []networkConnection
|
||||||
SerialOutputs map[string]serialConnection
|
SerialOutputs map[string]serialConnection
|
||||||
AHRS_Enabled bool
|
AHRS_Enabled bool
|
||||||
|
@ -1046,6 +1047,7 @@ func defaultSettings() {
|
||||||
globalSettings.UAT_Enabled = true
|
globalSettings.UAT_Enabled = true
|
||||||
globalSettings.ES_Enabled = true
|
globalSettings.ES_Enabled = true
|
||||||
globalSettings.GPS_Enabled = true
|
globalSettings.GPS_Enabled = true
|
||||||
|
globalSettings.GpsdAddress = "localhost:2947"
|
||||||
//FIXME: Need to change format below.
|
//FIXME: Need to change format below.
|
||||||
globalSettings.NetworkOutputs = []networkConnection{
|
globalSettings.NetworkOutputs = []networkConnection{
|
||||||
{Conn: nil, Ip: "", Port: 4000, Capability: NETWORK_GDL90_STANDARD | NETWORK_AHRS_GDL90},
|
{Conn: nil, Ip: "", Port: 4000, Capability: NETWORK_GDL90_STANDARD | NETWORK_AHRS_GDL90},
|
||||||
|
|
84
main/gpsd.go
84
main/gpsd.go
|
@ -6,8 +6,13 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Channel to disconnect current gpsd connection
|
||||||
|
var killGpsd chan struct{}
|
||||||
|
var gps *gpsd.Session
|
||||||
|
|
||||||
// Determine type of satellite based on PRN number.
|
// Determine type of satellite based on PRN number.
|
||||||
func satelliteType(prnId int) uint8 {
|
func satelliteType(prnId int) uint8 {
|
||||||
// TODO: Galileo
|
// TODO: Galileo
|
||||||
|
@ -53,7 +58,9 @@ func isSbasInSolution() bool {
|
||||||
|
|
||||||
func processDEVICES(r interface{}) {
|
func processDEVICES(r interface{}) {
|
||||||
devices := r.(*gpsd.DEVICESReport)
|
devices := r.(*gpsd.DEVICESReport)
|
||||||
log.Printf("DEVICES (%d)", len(devices.Devices))
|
if globalSettings.DEBUG {
|
||||||
|
log.Printf("DEVICES (%d)", len(devices.Devices))
|
||||||
|
}
|
||||||
for _, dev := range devices.Devices {
|
for _, dev := range devices.Devices {
|
||||||
log.Printf(" %s %s %x %s %s %i %s %s %i %s %s %i %d %d",
|
log.Printf(" %s %s %x %s %s %i %s %s %i %s %s %i %d %d",
|
||||||
dev.Path,
|
dev.Path,
|
||||||
|
@ -78,7 +85,9 @@ func processDEVICES(r interface{}) {
|
||||||
|
|
||||||
func processTPV(r interface{}) {
|
func processTPV(r interface{}) {
|
||||||
tpv := r.(*gpsd.TPVReport)
|
tpv := r.(*gpsd.TPVReport)
|
||||||
log.Printf("TPV", tpv.Device, tpv.Mode, tpv.Time, tpv.Tag)
|
if globalSettings.DEBUG {
|
||||||
|
log.Printf("TPV", tpv.Device, tpv.Mode, tpv.Time, tpv.Tag)
|
||||||
|
}
|
||||||
|
|
||||||
mySituation.mu_GPS.Lock()
|
mySituation.mu_GPS.Lock()
|
||||||
satelliteMutex.Lock()
|
satelliteMutex.Lock()
|
||||||
|
@ -128,7 +137,9 @@ func processTPV(r interface{}) {
|
||||||
|
|
||||||
func processSKY(r interface{}) {
|
func processSKY(r interface{}) {
|
||||||
sky := r.(*gpsd.SKYReport)
|
sky := r.(*gpsd.SKYReport)
|
||||||
log.Printf("SKY", sky.Device, sky.Tag)
|
if globalSettings.DEBUG {
|
||||||
|
log.Printf("SKY", sky.Device, sky.Tag)
|
||||||
|
}
|
||||||
|
|
||||||
mySituation.mu_GPS.Lock()
|
mySituation.mu_GPS.Lock()
|
||||||
satelliteMutex.Lock()
|
satelliteMutex.Lock()
|
||||||
|
@ -171,7 +182,9 @@ func processSKY(r interface{}) {
|
||||||
|
|
||||||
func processATT(r interface{}) {
|
func processATT(r interface{}) {
|
||||||
att := r.(*gpsd.ATTReport)
|
att := r.(*gpsd.ATTReport)
|
||||||
log.Printf("ATT", att.Device, att.Tag, att.Pitch, att.Roll, att.Heading)
|
if globalSettings.DEBUG {
|
||||||
|
log.Printf("ATT", att.Device, att.Tag, att.Pitch, att.Roll, att.Heading)
|
||||||
|
}
|
||||||
|
|
||||||
mySituation.mu_GPS.Lock()
|
mySituation.mu_GPS.Lock()
|
||||||
|
|
||||||
|
@ -196,18 +209,61 @@ func initGpsd() {
|
||||||
satelliteMutex = &sync.Mutex{}
|
satelliteMutex = &sync.Mutex{}
|
||||||
Satellites = make(map[string]SatelliteInfo)
|
Satellites = make(map[string]SatelliteInfo)
|
||||||
|
|
||||||
var gps *gpsd.Session
|
killGpsd = make(chan struct{})
|
||||||
var err error
|
|
||||||
|
|
||||||
if gps, err = gpsd.Dial(gpsd.DefaultAddress); err != nil {
|
if globalSettings.GPS_Enabled {
|
||||||
log.Printf("Failed to connect to gpsd: %s", err)
|
connectGpsd(globalSettings.GpsdAddress)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main interface for enabling and changing the gpsd connection
|
||||||
|
// Calling will block until previous connection disconnects
|
||||||
|
// If address is zero value, it connects to gpsd on the local machine
|
||||||
|
func connectGpsd(address string) {
|
||||||
|
// kill existing monitor goroutine if it exists
|
||||||
|
if gps != nil {
|
||||||
|
disconnectGpsd()
|
||||||
}
|
}
|
||||||
|
|
||||||
gps.AddFilter("DEVICES", processDEVICES)
|
if address == "" {
|
||||||
gps.AddFilter("TPV", processTPV)
|
address = gpsd.DefaultAddress
|
||||||
gps.AddFilter("SKY", processSKY)
|
}
|
||||||
gps.AddFilter("ATT", processATT)
|
|
||||||
|
|
||||||
gps.SendCommand("DEVICES")
|
go func() {
|
||||||
gps.Watch()
|
for {
|
||||||
|
var err error
|
||||||
|
if gps, err = gpsd.Dial(address); err != nil {
|
||||||
|
log.Printf("Failed to connect to gpsd: %s", err)
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Gpsd %s Connected.", address)
|
||||||
|
|
||||||
|
gps.AddFilter("DEVICES", processDEVICES)
|
||||||
|
gps.AddFilter("TPV", processTPV)
|
||||||
|
gps.AddFilter("SKY", processSKY)
|
||||||
|
gps.AddFilter("ATT", processATT)
|
||||||
|
|
||||||
|
reconnect := gps.Watch()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-killGpsd:
|
||||||
|
log.Printf("Gpsd %s disconnecting", address)
|
||||||
|
gps.Close()
|
||||||
|
gps = nil
|
||||||
|
return
|
||||||
|
case <-reconnect:
|
||||||
|
log.Printf("Gpsd %s disconnected. Reconnecting..", address)
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disconnect from gpsd
|
||||||
|
// Blocks until connection is disconnected and all goroutines are stopped
|
||||||
|
func disconnectGpsd() {
|
||||||
|
log.Printf("Stopping gpsd session")
|
||||||
|
killGpsd <- struct{}{}
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,6 +218,12 @@ func handleSettingsSetRequest(w http.ResponseWriter, r *http.Request) {
|
||||||
case "Ping_Enabled":
|
case "Ping_Enabled":
|
||||||
globalSettings.Ping_Enabled = val.(bool)
|
globalSettings.Ping_Enabled = val.(bool)
|
||||||
case "GPS_Enabled":
|
case "GPS_Enabled":
|
||||||
|
switch {
|
||||||
|
case val.(bool) == true && globalSettings.GPS_Enabled == false:
|
||||||
|
connectGpsd(globalSettings.GpsdAddress)
|
||||||
|
case val.(bool) == false && globalSettings.GPS_Enabled == true:
|
||||||
|
disconnectGpsd()
|
||||||
|
}
|
||||||
globalSettings.GPS_Enabled = val.(bool)
|
globalSettings.GPS_Enabled = val.(bool)
|
||||||
case "AHRS_Enabled":
|
case "AHRS_Enabled":
|
||||||
globalSettings.AHRS_Enabled = val.(bool)
|
globalSettings.AHRS_Enabled = val.(bool)
|
||||||
|
|
Ładowanie…
Reference in New Issue