Add method to stream modules status

This commit is contained in:
wpetit 2018-10-16 19:07:35 +02:00
parent 187d53fd29
commit 4da7f14564
2 changed files with 181 additions and 0 deletions

View File

@ -0,0 +1,142 @@
package reachview
import (
"context"
"forge.cadoles.com/Pyxis/golang-socketio"
"github.com/mitchellh/mapstructure"
)
const (
eventStatusBroadcast = "status broadcast"
)
// StatusBroadcast is a broadcasted message containing modules'
// positioning informations
/* Source sample
{
"receiver time mark count": "0",
"ant type base": "",
"solution status": "-",
"vel enu (m/s) base": "0.000,0.000,0.000",
"time of receiver clock rover": "2018/10/16 13:55:26.006000000",
"baseline length float (m)": "0.000",
"# of rtcm messages rover": "",
"time sys offset (ns)": "26.748,-6.962,0.000,0.000",
"# of average single pos base": "0",
"pos xyz float std (m) rover": "0.000,0.000,0.000",
"ant delta rover": "0.000 0.000 0.000",
"# of rtcm messages corr": "",
"accumulated time to run": "05:45:59.7",
"cpu time for a cycle (ms)": "16",
"Parameter": "Value",
"# of rtcm messages base": "",
"vel enu (m/s) rover": "0.467,0.476,0.577",
"ant type rover": "",
"pos xyz single (m) rover": "4315030.518,379718.279,4666208.342",
"pos xyz (m) base": "0.000,0.000,0.000",
"# of input data corr": "obs(0),nav(0),gnav(0),ion(0),sbs(0),pos(0),dgps(0),ssr(0),err(0)",
"rtk server state": "run",
"pos xyz fixed (m) rover": "0.000,0.000,0.000",
"age of differential (s)": "0.000",
"pos xyz fixed std (m) rover": "0.000,0.000,0.000",
"# of all estimated states": "170",
"processing cycle (ms)": "10",
"ant delta base": "0.000 0.000 0.000",
"# of valid satellites": "6",
"rtklib version": "2.4.3 Emlid b28",
"bytes in input buffer": "0,0",
"# of satellites rover": "11",
"# of input data rover": "obs(103738),nav(60),gnav(45),ion(3305),sbs(0),pos(0),dgps(0),ssr(0),err(0)",
"pos xyz float (m) rover": "0.000,0.000,0.000",
"ratio for ar validation": "0.000",
"pos llh (deg,m) base": "0.00000000,0.00000000,0.000",
"missing obs data count": "4468",
"# of real estimated states": "9",
"baseline length fixed (m)": "0.000",
"# of satellites base": "0",
"last time mark": "-",
"# of input data base": "obs(0),nav(0),gnav(0),ion(0),sbs(0),pos(0),dgps(0),ssr(0),err(0)",
"GDOP/PDOP/HDOP/VDOP": "0.0,0.0,0.0,0.0",
"positioning mode": "kinematic",
"pos llh single (deg,m) rover": "47.32085966,5.02901552,257.086",
"solution interval (s)": "0.200",
"rtklib time mark count": "0"
}
*/
type Status struct {
ReceiverTimeMarkCount int `mapstructure:"receiver time mark count"`
BaseAntType string `mapstructure:"ant type base"`
SolutionStatus string `mapstructure:"solution status"`
PositioningMode string `mapstructure:"positioning mode"`
BaseVelocityEnum string `mapstructure:"vel enu (m/s) base"`
RoverReceiverTime string `mapstructure:"time of receiver clock rover"`
BaselineLengthFloat string `mapstructure:"baseline length float (m)"`
RoverNumberOfRTCMMessages string `mapstructure:"# of rtcm messages rover"`
TimeSysOffset string `mapstructure:"time sys offset (ns)"`
BaseNumberOfAverageSinglePos int `mapstructure:"# of average single pos base"`
RoverPosXYZStandaloneFloat string `mapstructure:"pos xyz float std (m) rover"`
RoverAntDelta string `mapstructure:"ant delta rover"`
NumberOfRTCMCorrection string `mapstructure:"# of rtcm messages corr"`
AccumulatedTimeToRun string `mapstructure:"accumulated time to run"`
CPUTimeForACycle int `mapstructure:"cpu time for a cycle (ms)"`
Parameter string `mapstructure:"Parameter"`
BaseNumberOfRTCMMessages string `mapstructure:"# of rtcm messages base"`
RoverVelocityEnum string `mapstructure:"vel enu (m/s) rover"`
RoverAntType string `mapstructure:"ant type rover"`
RoverPosXYZSingle string `mapstructure:"pos xyz single (m) rover"`
BasePosXYZ string `mapstructure:"pos xyz (m) base"`
NumberOfInputDataCorrection string `mapstructure:"# of input data corr"`
RTKServerState string `mapstructure:"rtk server state"`
RoverPosXYZFixed string `mapstructure:"pos xyz fixed (m) rover"`
AgeOfDifferential float32 `mapstructure:"age of differential (s)"`
RoverPosXYZStandaloneFixed string `mapstructure:"pos xyz fixed std (m) rover"`
NumberOfAllEstimatedStates int `mapstructure:"# of all estimated states"`
ProcessingCycle int `mapstructure:"processing cycle (ms)"`
BaseAntDelta string `mapstructure:"ant delta base"`
NumberOfValidStellites int `mapstructure:"# of valid satellites"`
RTKLibVersion string `mapstructure:"2.4.3 Emlid b28"`
BytesInInputBuffer string `mapstructure:"bytes in input buffer"`
RoverNumberOfSatellites int `mapstructure:"# of satellites rover"`
RoverNumberOfInputData string `mapstructure:"# of input data rover"`
RoverPosXYZFloat string `mapstructure:"pos xyz float (m) rover"`
RatioForARValidation float32 `mapstructure:"ratio for ar validation"`
BasePosLLH string `mapstructure:"pos llh (deg,m) base"`
MissingObsDataCount int `mapstructure:"missing obs data count"`
NumberOfRealEstimatedStates int `mapstructure:"# of real estimated states"`
BaselineLengthFixed float32 `mapstructure:"baseline length fixed (m)"`
BaseNumberOfSatellites int `mapstructure:"# of satellites base"`
LastTimemark string `mapstructure:"last time mark"`
BaseNumberOfInputData string `mapstructure:"# of input data base"`
GdopPdopHdopVdop string `mapstructure:"GDOP/PDOP/HDOP/VDOP"`
RoverPosLLHSingle string `mapstructure:"pos llh single (deg,m) rover"`
SolutionInterval float32 `mapstructure:"solution interval (s)"`
RTKLibTimeMarkCount int `mapstructure:"rtklib time mark count"`
}
// StatusBroadcast listens for StatusBroadcast messages
func (c *Client) StatusBroadcast(ctx context.Context) (chan Status, error) {
out := make(chan Status)
handler := func(_ *gosocketio.Channel, data interface{}) {
res := Status{}
if err := mapstructure.WeakDecode(data, &res); err != nil {
c.Logf("error while decoding status broadcast: %s", err)
}
select {
case <-ctx.Done():
c.Off(eventStatusBroadcast)
close(out)
default:
out <- res
}
}
if err := c.On(eventStatusBroadcast, handler); err != nil {
return nil, err
}
return out, nil
}

View File

@ -0,0 +1,39 @@
package reachview
import (
"context"
"testing"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
"github.com/davecgh/go-spew/spew"
)
func TestReachViewStatusBroadcast(t *testing.T) {
if !*runReachViewIntegrationTests {
t.Skip("To run this test, use: go test -reachview-integration")
}
client := NewClient(
emlid.WithStandardLogger(),
emlid.WithEndpoint(*reachHost, 80),
)
if err := client.Connect(); err != nil {
t.Fatal(err)
}
defer client.Close()
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
statuses, err := client.StatusBroadcast(ctx)
if err != nil {
t.Fatal(err)
}
for s := range statuses {
spew.Dump(s)
}
}