changed ubx height reference and optimized logging
This commit is contained in:
parent
64c7f9b644
commit
eae4bc2e67
@ -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)
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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"`
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
1
go.mod
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user