Make roverConfiguration with JSON-RPC possible
This commit is contained in:
parent
128b135d5c
commit
e3bfd27b0a
|
@ -8,6 +8,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"forge.cadoles.com/Pyxis/orion/emlid"
|
"forge.cadoles.com/Pyxis/orion/emlid"
|
||||||
|
"forge.cadoles.com/Pyxis/orion/emlid/reachview"
|
||||||
"forge.cadoles.com/Pyxis/orion/emlid/updater"
|
"forge.cadoles.com/Pyxis/orion/emlid/updater"
|
||||||
"forge.cadoles.com/Pyxis/orion/openwrt"
|
"forge.cadoles.com/Pyxis/orion/openwrt"
|
||||||
"github.com/gorilla/rpc"
|
"github.com/gorilla/rpc"
|
||||||
|
@ -193,7 +194,7 @@ type UpdateOrionBoxResponse struct {
|
||||||
Results *updater.TestResults
|
Results *updater.TestResults
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect wifi interface to a Orion box wifi hotspot!
|
// connect wifi interface to a Orion box wifi hotspot!
|
||||||
func (o *OrionService) connectBox(box *OrionBox, server *OrionServer) error {
|
func (o *OrionService) connectBox(box *OrionBox, server *OrionServer) error {
|
||||||
o.UCI.LoadWirelessConf()
|
o.UCI.LoadWirelessConf()
|
||||||
if server == nil {
|
if server == nil {
|
||||||
|
@ -265,7 +266,10 @@ func (o *OrionService) setupMasterWifi(rqContext context.Context, box *OrionBox,
|
||||||
server.Security = string(updater.SecurityWPAPSK)
|
server.Security = string(updater.SecurityWPAPSK)
|
||||||
}
|
}
|
||||||
|
|
||||||
boxCli, err := o.connectUpdater(rqContext, box)
|
boxCli, cliErr := o.connectUpdater(rqContext, box)
|
||||||
|
if cliErr != nil {
|
||||||
|
return errors.Wrap(cliErr, "Creation of updater client failed")
|
||||||
|
}
|
||||||
|
|
||||||
if err := boxCli.Connect(); err != nil {
|
if err := boxCli.Connect(); err != nil {
|
||||||
return errors.Wrap(err, "Connecting to Box failed")
|
return errors.Wrap(err, "Connecting to Box failed")
|
||||||
|
@ -275,7 +279,7 @@ func (o *OrionService) setupMasterWifi(rqContext context.Context, box *OrionBox,
|
||||||
fmt.Println("Running Tests !")
|
fmt.Println("Running Tests !")
|
||||||
ctx, testResultsCancel := context.WithTimeout(rqContext, 55*time.Second)
|
ctx, testResultsCancel := context.WithTimeout(rqContext, 55*time.Second)
|
||||||
defer testResultsCancel()
|
defer testResultsCancel()
|
||||||
_, err = boxCli.TestResults(ctx)
|
_, err := boxCli.TestResults(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Minimal test failed")
|
return errors.Wrap(err, "Minimal test failed")
|
||||||
}
|
}
|
||||||
|
@ -304,7 +308,7 @@ func (o *OrionService) setupMasterWifi(rqContext context.Context, box *OrionBox,
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateAndReboot connects to the box with the New address and run basic tests on version dans updates
|
// updateAndReboot connects to the box with the New address and run basic tests on version dans updates
|
||||||
func (o *OrionService) updateAndReboot(rqContext context.Context, box *OrionBox, server *OrionServer, reply *UpdateOrionBoxResponse) error {
|
func (o *OrionService) updateAndReboot(rqContext context.Context, box *OrionBox, reply *UpdateOrionBoxResponse) error {
|
||||||
time.Sleep(3 * time.Second)
|
time.Sleep(3 * time.Second)
|
||||||
boxCli, err := o.connectUpdater(rqContext, box)
|
boxCli, err := o.connectUpdater(rqContext, box)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -367,7 +371,147 @@ func (o *OrionService) UpdateOrionBox(r *http.Request,
|
||||||
// return err
|
// return err
|
||||||
// }
|
// }
|
||||||
_ = o.setupMasterWifi(r.Context(), args.Box, args.Server)
|
_ = o.setupMasterWifi(r.Context(), args.Box, args.Server)
|
||||||
return o.updateAndReboot(r.Context(), args.Box, args.Server, reply)
|
return o.updateAndReboot(r.Context(), args.Box, reply)
|
||||||
|
}
|
||||||
|
|
||||||
|
// connectReachview creates the client to a reachview module and returns it !
|
||||||
|
func (o *OrionService) connectReachView(rqContext context.Context, box *OrionBox) (*reachview.Client, error) {
|
||||||
|
var boxCli *reachview.Client
|
||||||
|
service, err := o.discoverService(rqContext)
|
||||||
|
fmt.Printf("DEBUG len = %d\n", len(service))
|
||||||
|
if len(service) == 0 {
|
||||||
|
fmt.Println("DEBUG Connecting to box with EndPoint !")
|
||||||
|
boxCli = reachview.NewClient(
|
||||||
|
emlid.WithEndpoint(box.Address, 80),
|
||||||
|
)
|
||||||
|
} else if err == nil {
|
||||||
|
fmt.Println("DEBUG Connecting to box with Service !")
|
||||||
|
boxCli = reachview.NewClient(
|
||||||
|
emlid.WithService(service[0]),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Non mais là c'est vraiment étrange !")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
//fmt.Printf("NAME: %s, IP: %s", service[0].Name, service[0].AddrV4)
|
||||||
|
return boxCli, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConfigOrionBoxArgs argument structure for exported method OwrtCreateWifiInterface
|
||||||
|
type ConfigOrionBoxArgs struct {
|
||||||
|
Box *OrionBox
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConfigOrionBoxResponse argument structure for exported method OwrtCreateWifiInterface
|
||||||
|
type ConfigOrionBoxResponse struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrionService) resetConfiguration(rqContext context.Context, c *reachview.Client) {
|
||||||
|
ctx, resetCancel := context.WithTimeout(rqContext, 55*time.Second)
|
||||||
|
defer resetCancel()
|
||||||
|
result, _, err := c.ResetConfiguration(ctx)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if result != reachview.ConfigurationApplySuccess {
|
||||||
|
log.Fatal("configuration reset failed !")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME have to came from parameters !
|
||||||
|
func (o *OrionService) getCommonConfiguration() *reachview.Configuration {
|
||||||
|
return &reachview.Configuration{
|
||||||
|
RTKSettings: &reachview.RTKSettings{
|
||||||
|
PositioningSystems: &reachview.PositionningSystems{
|
||||||
|
GPS: reachview.True,
|
||||||
|
GLONASS: reachview.True,
|
||||||
|
Galileo: reachview.True,
|
||||||
|
SBAS: reachview.True,
|
||||||
|
QZSS: reachview.True,
|
||||||
|
},
|
||||||
|
UpdateRate: reachview.String("5"),
|
||||||
|
},
|
||||||
|
LoRa: &reachview.LoRa{
|
||||||
|
AirRate: reachview.String("9.11"),
|
||||||
|
Frequency: reachview.Float(868000),
|
||||||
|
OutputPower: reachview.String("20"),
|
||||||
|
},
|
||||||
|
PositionOutput: &reachview.PositionOutput{
|
||||||
|
Output1: &reachview.Output{
|
||||||
|
Enabled: reachview.False,
|
||||||
|
},
|
||||||
|
Output2: &reachview.Output{
|
||||||
|
Enabled: reachview.False,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrionService) applyConfiguration(rqContext context.Context, c *reachview.Client, config *reachview.Configuration) error {
|
||||||
|
|
||||||
|
ctx, applyConfCancel := context.WithTimeout(rqContext, 55*time.Second)
|
||||||
|
defer applyConfCancel()
|
||||||
|
|
||||||
|
result, _, err := c.ApplyConfiguration(ctx, config)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if result != reachview.ConfigurationApplySuccess {
|
||||||
|
return fmt.Errorf("Configuration update failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.RestartRTKLib()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OrionService) configureRover(rqContext context.Context, c *reachview.Client) error {
|
||||||
|
|
||||||
|
_ = c.Connect()
|
||||||
|
defer c.Close()
|
||||||
|
|
||||||
|
o.resetConfiguration(rqContext, c)
|
||||||
|
|
||||||
|
config := o.getCommonConfiguration()
|
||||||
|
config.RTKSettings.GPSARMode = reachview.GPSARModeFixAndHold
|
||||||
|
config.RTKSettings.GLONASSARMode = reachview.On
|
||||||
|
config.RTKSettings.PositionningMode = reachview.PositionningModeKinematic
|
||||||
|
config.RTKSettings.UpdateRate = reachview.String("5")
|
||||||
|
config.CorrectionInput = &reachview.CorrectionInput{
|
||||||
|
Input2: &reachview.Input2{
|
||||||
|
Input: reachview.Input{
|
||||||
|
Enabled: reachview.True,
|
||||||
|
Format: reachview.IOFormatRTCM3,
|
||||||
|
Type: reachview.IOTypeLoRa,
|
||||||
|
Path: reachview.String("lora"),
|
||||||
|
},
|
||||||
|
SendPositionToBase: reachview.Off,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
config.BaseMode = &reachview.BaseMode{
|
||||||
|
Output: &reachview.Output{
|
||||||
|
Enabled: reachview.False,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
log.Println("configuring module as rover")
|
||||||
|
|
||||||
|
return o.applyConfiguration(rqContext, c, config)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConfigureOrionBox starts provisionning process for an Orion box (base or rover)
|
||||||
|
func (o *OrionService) ConfigureOrionBox(r *http.Request,
|
||||||
|
args *ConfigOrionBoxArgs,
|
||||||
|
reply *ConfigOrionBoxResponse) error {
|
||||||
|
|
||||||
|
reach, err := o.connectReachView(r.Context(), args.Box)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "Impossible to create ReachView client")
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Start Rover Configuraiton !")
|
||||||
|
return o.configureRover(r.Context(), reach)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewServer returns a new configured JSON-RPC server
|
// NewServer returns a new configured JSON-RPC server
|
||||||
|
|
|
@ -72,4 +72,22 @@ content-type: application/json
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} ]
|
} ]
|
||||||
|
}
|
||||||
|
|
||||||
|
###
|
||||||
|
POST http://192.168.100.1:8888/rpc HTTP/1.1
|
||||||
|
content-type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"method": "Orion.ConfigureOrionBox",
|
||||||
|
"params": [ {
|
||||||
|
"Box": {
|
||||||
|
"Address": "",
|
||||||
|
"NewAddress": "",
|
||||||
|
"Security": "",
|
||||||
|
"SSID" : "reach:2a:03",
|
||||||
|
"WifiKey": "emlidreach"
|
||||||
|
}
|
||||||
|
} ]
|
||||||
}
|
}
|
Reference in New Issue