changed ubx height reference and optimized logging

This commit is contained in:
Timo Volkmann 2020-12-06 22:26:49 +01:00
parent 64c7f9b644
commit eae4bc2e67
6 changed files with 67 additions and 40 deletions

View File

@ -17,7 +17,6 @@ func main() {
log.Println("initialize processing pipeline") log.Println("initialize processing pipeline")
processor := core.NewPipeline(dispatcher, 50, 1000) processor := core.NewPipeline(dispatcher, 50, 1000)
processor.Run() processor.Run()
log.Println("start data collectors")
collectRoutines(processor) collectRoutines(processor)
log.Println("start http server") log.Println("start http server")
core.HttpListenAndServe(dispatcher, HTTP_PORT) core.HttpListenAndServe(dispatcher, HTTP_PORT)

View File

@ -2,14 +2,17 @@ package core
import ( import (
"fmt" "fmt"
"git.timovolkmann.de/gyrogpsc/ublox"
"go.bug.st/serial"
"log" "log"
"net" "net"
"os" "os"
"git.timovolkmann.de/gyrogpsc/ublox"
"go.bug.st/serial"
) )
func TcpCollector(proc Processor, tcpPort string) { func TcpCollector(proc Processor, tcpPort string) {
log.Println("start tcp collectors")
listener, err := net.Listen("tcp", tcpPort) listener, err := net.Listen("tcp", tcpPort)
if err != nil { if err != nil {
fmt.Println("Error listening:", err.Error()) fmt.Println("Error listening:", err.Error())
@ -25,6 +28,8 @@ func TcpCollector(proc Processor, tcpPort string) {
fmt.Println("Error accepting: ", err.Error()) fmt.Println("Error accepting: ", err.Error())
os.Exit(1) os.Exit(1)
} }
log.Println("...new incoming tcp connection...")
// Handle connections in a new goroutine. // Handle connections in a new goroutine.
go jsonHandler(conn, proc) go jsonHandler(conn, proc)
} }
@ -32,6 +37,7 @@ func TcpCollector(proc Processor, tcpPort string) {
// handles incoming tcp connections with json payload. // handles incoming tcp connections with json payload.
func jsonHandler(conn net.Conn, proc Processor) { func jsonHandler(conn net.Conn, proc Processor) {
defer conn.Close() defer conn.Close()
// TRY reader := bufio.NewReader(conn) OR NewScanner(conn) // TRY reader := bufio.NewReader(conn) OR NewScanner(conn)
@ -45,7 +51,7 @@ func jsonHandler(conn net.Conn, proc Processor) {
} }
//json := pretty.Pretty(buf[:n]) //json := pretty.Pretty(buf[:n])
//fmt.Println(string(json)) //fmt.Println(string(json))
fmt.Println(string(buf[:n])) //fmt.Println(string(buf[:n]))
sd, err := ConvertSensorDataPhone(buf[:n]) sd, err := ConvertSensorDataPhone(buf[:n])
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@ -61,6 +67,7 @@ func jsonHandler(conn net.Conn, proc Processor) {
} }
func SerialCollector(proc Processor, serialPort string) { func SerialCollector(proc Processor, serialPort string) {
log.Println("start serial collectors")
mode := &serial.Mode{ mode := &serial.Mode{
BaudRate: 115200, BaudRate: 115200,
} }

View File

@ -3,6 +3,7 @@ package core
import ( import (
"errors" "errors"
"git.timovolkmann.de/gyrogpsc/ublox" "git.timovolkmann.de/gyrogpsc/ublox"
"github.com/tidwall/gjson"
"log" "log"
"time" "time"
@ -84,16 +85,16 @@ func ConvertUbxToSensorData(msg interface{}) (*Sensordata, error) {
//log.Println("NAV-PVT") //log.Println("NAV-PVT")
sd.itow = v.ITOW_ms sd.itow = v.ITOW_ms
sd.Timestamp = time.Date(int(v.Year_y), time.Month(v.Month_month), int(v.Day_d), int(v.Hour_h), int(v.Min_min), int(v.Sec_s), int(v.Nano_ns), time.UTC).UnixNano() sd.Timestamp = time.Date(int(v.Year_y), time.Month(v.Month_month), int(v.Day_d), int(v.Hour_h), int(v.Min_min), int(v.Sec_s), int(v.Nano_ns), time.UTC).UnixNano()
sd.Position[0] = float64(v.Lat_dege7) sd.Position[0] = float64(v.Lat_dege7) / 1e+7
sd.Position[1] = float64(v.Lon_dege7) sd.Position[1] = float64(v.Lon_dege7) / 1e+7
sd.Position[2] = float64(v.Height_mm) sd.Position[2] = float64(v.HMSL_mm) / 1e+3 // mm in m
case *ublox.HnrPvt: case *ublox.HnrPvt:
//log.Println("HNR-PVT") //log.Println("HNR-PVT")
sd.itow = v.ITOW_ms sd.itow = v.ITOW_ms
sd.Timestamp = time.Date(int(v.Year_y), time.Month(v.Month_month), int(v.Day_d), int(v.Hour_h), int(v.Min_min), int(v.Sec_s), int(v.Nano_ns), time.UTC).UnixNano() sd.Timestamp = time.Date(int(v.Year_y), time.Month(v.Month_month), int(v.Day_d), int(v.Hour_h), int(v.Min_min), int(v.Sec_s), int(v.Nano_ns), time.UTC).UnixNano()
sd.Position[0] = float64(v.Lat_dege7) sd.Position[0] = float64(v.Lat_dege7) / 1e+7
sd.Position[1] = float64(v.Lon_dege7) sd.Position[1] = float64(v.Lon_dege7) / 1e+7
sd.Position[2] = float64(v.Height_mm) sd.Position[2] = float64(v.HMSL_mm) / 1e+3 // mm in m
case *ublox.NavAtt: case *ublox.NavAtt:
//log.Println("NAV-ATT") //log.Println("NAV-ATT")
sd.itow = v.ITOW_ms sd.itow = v.ITOW_ms
@ -112,9 +113,28 @@ func ConvertUbxToSensorData(msg interface{}) (*Sensordata, error) {
} }
func ConvertSensorDataPhone(jsonData []byte) (*Sensordata, error) { func ConvertSensorDataPhone(jsonData []byte) (*Sensordata, error) {
return convertAndroidHyperImu(jsonData) if gjson.Get(string(jsonData), "os").String() == "hyperimu" {
return convertAndroidHyperImu(jsonData)
}
return convertIPhoneSensorLog(jsonData)
} }
func convertIPhoneSensorLog(jsonData []byte) (*Sensordata, error) {
timestamp := gjson.Get(string(jsonData), "locationTimestamp_since1970").Float()
lat := gjson.Get(string(jsonData), "locationLatitude").Float()
lon := gjson.Get(string(jsonData), "locationLongitude").Float()
alt := gjson.Get(string(jsonData), "locationAltitude").Float()
sd := &Sensordata{
SourceId: SOURCE_TCP,
Timestamp: int64(timestamp * float64(time.Second)),
//Timestamp: time.Unix(0, prep.Timestamp * int64(time.Millisecond)),
Position: [3]float64{lat, lon, alt},
Orientation: [3]float64{0, 0, 0},
}
return sd, nil
}
func convertAndroidHyperImu(jsonData []byte) (*Sensordata, error) { func convertAndroidHyperImu(jsonData []byte) (*Sensordata, error) {
prep := struct { prep := struct {
Timestamp int64 `njson:"Timestamp"` Timestamp int64 `njson:"Timestamp"`

View File

@ -30,7 +30,7 @@ func echo(sub Subscriber) func(w http.ResponseWriter, r *http.Request) {
dispatcherId, channel := sub.Subscribe() dispatcherId, channel := sub.Subscribe()
defer sub.Unsubscribe(dispatcherId) defer sub.Unsubscribe(dispatcherId)
for { for {
log.Println("") //log.Println("")
//if err != nil { //if err != nil {
// log.Println("read:", err) // log.Println("read:", err)
// break // break

View File

@ -15,9 +15,9 @@ type Processor interface {
} }
type pipeline struct { type pipeline struct {
synchronizer syn synchronizer
aggregator agr aggregator
Publisher pub Publisher
publishTicker *time.Ticker publishTicker *time.Ticker
} }
@ -38,12 +38,12 @@ func NewPipeline(d Publisher, publishIntervalMs int, delayUpdateIntervalMs int)
} }
func (p *pipeline) Run() { func (p *pipeline) Run() {
go p.schedule() go p.syn.schedule()
go func() { go func() {
for { for {
<-p.publishTicker.C <-p.publishTicker.C
err := p.Publish() err := p.Publish()
if err != nil /*&& err.Error() != "no data available"*/ { if err != nil && err.Error() != "no data available" {
log.Println(err) log.Println(err)
} }
} }
@ -52,30 +52,30 @@ func (p *pipeline) Run() {
} }
func (p *pipeline) Publish() error { func (p *pipeline) Publish() error {
p.tcpMutex.Lock() p.agr.tcpMutex.Lock()
p.serialMutex.Lock() p.agr.serialMutex.Lock()
//log.Println(p.tcpSensorData) //log.Println(pub.tcpSensorData)
//log.Println(p.serialSensorData) //log.Println(pub.serialSensorData)
if (p.tcpSensorData == Sensordata{} && p.serialSensorData == Sensordata{}) { if (p.agr.tcpSensorData == Sensordata{} && p.agr.serialSensorData == Sensordata{}) {
p.tcpMutex.Unlock() p.agr.tcpMutex.Unlock()
p.serialMutex.Unlock() p.agr.serialMutex.Unlock()
return errors.New("no data available") return errors.New("no data available")
} }
data := map[string]Sensordata{ data := map[string]Sensordata{
string(SOURCE_TCP): p.tcpSensorData, string(SOURCE_TCP): p.agr.tcpSensorData,
string(SOURCE_SERIAL): p.serialSensorData, string(SOURCE_SERIAL): p.agr.serialSensorData,
} }
p.tcpSensorData = Sensordata{} p.agr.tcpSensorData = Sensordata{}
p.serialSensorData = Sensordata{} p.agr.serialSensorData = Sensordata{}
p.tcpMutex.Unlock() p.agr.tcpMutex.Unlock()
p.serialMutex.Unlock() p.agr.serialMutex.Unlock()
jdata, err := json.Marshal(data) jdata, err := json.Marshal(data)
log.Println(string(jdata)) //log.Println(string(pretty.Pretty(jdata)))
if err != nil { if err != nil {
return err return err
} }
p.Publisher.Publish(string(jdata)) p.pub.Publish(string(jdata))
return nil return nil
} }
@ -137,14 +137,14 @@ func (p *pipeline) Process(data *Sensordata) error {
} }
func (p *pipeline) pushTcpDataToBuffer(data Sensordata) { func (p *pipeline) pushTcpDataToBuffer(data Sensordata) {
time.Sleep(time.Duration(p.tcpDelayMs)) time.Sleep(time.Duration(p.syn.tcpDelayMs))
p.tcpMutex.Lock() p.agr.tcpMutex.Lock()
p.tcpSensorData = data p.agr.tcpSensorData = data
p.tcpMutex.Unlock() p.agr.tcpMutex.Unlock()
} }
func (p *pipeline) pushSerialDataToBuffer(data Sensordata) { func (p *pipeline) pushSerialDataToBuffer(data Sensordata) {
time.Sleep(time.Duration(p.serialDelayMs)) time.Sleep(time.Duration(p.syn.serialDelayMs))
p.serialMutex.Lock() p.agr.serialMutex.Lock()
p.serialSensorData = p.serialSensorData.Consolidate(data) p.agr.serialSensorData = p.agr.serialSensorData.Consolidate(data)
p.serialMutex.Unlock() p.agr.serialMutex.Unlock()
} }

1
go.mod
View File

@ -5,6 +5,7 @@ go 1.15
require ( require (
github.com/gorilla/websocket v1.4.2 github.com/gorilla/websocket v1.4.2
github.com/m7shapan/njson v1.0.1 github.com/m7shapan/njson v1.0.1
github.com/tidwall/gjson v1.6.0
github.com/tidwall/pretty v1.0.2 github.com/tidwall/pretty v1.0.2
go.bug.st/serial v1.1.1 go.bug.st/serial v1.1.1
golang.org/x/sys v0.0.0-20201107080550-4d91cf3a1aaf // indirect golang.org/x/sys v0.0.0-20201107080550-4d91cf3a1aaf // indirect