job handling
parent
aa85119dad
commit
38caf71144
|
@ -48,17 +48,17 @@ func IsRobotInList(robotId string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetRobotByName(robotId string) structs.Robot {
|
func GetRobotByName(robotName string) *structs.Robot {
|
||||||
rMu.RLock()
|
rMu.RLock()
|
||||||
defer rMu.RUnlock()
|
defer rMu.RUnlock()
|
||||||
|
|
||||||
for _, r := range robots {
|
for _, r := range robots {
|
||||||
if r.Id == robotId {
|
if r.Name == robotName {
|
||||||
return *r
|
return r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return structs.Robot{}
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func RemoveRobotById(robotId string) {
|
func RemoveRobotById(robotId string) {
|
||||||
|
|
|
@ -10,6 +10,7 @@ type Robot struct {
|
||||||
Address string `gorm:"-"`
|
Address string `gorm:"-"`
|
||||||
CurrentJobId string
|
CurrentJobId string
|
||||||
CurrentTask string
|
CurrentTask string
|
||||||
|
LastTaskAt time.Time `gorm:"-"`
|
||||||
ConnectedAt time.Time `gorm:"-"`
|
ConnectedAt time.Time `gorm:"-"`
|
||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
}
|
}
|
||||||
|
@ -48,3 +49,7 @@ type GetRobotsResponse struct {
|
||||||
type RobotIdParams struct {
|
type RobotIdParams struct {
|
||||||
RobotId string
|
RobotId string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RobotNameParams struct {
|
||||||
|
RobotName string
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
package control
|
package control
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"jannex/robot-control-manager/modules/cache"
|
||||||
"jannex/robot-control-manager/modules/structs"
|
"jannex/robot-control-manager/modules/structs"
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.ex.umbach.dev/Alex/roese-utils/rsutils"
|
"git.ex.umbach.dev/Alex/roese-utils/rsutils"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
@ -30,6 +31,10 @@ func ControlRex(c *fiber.Ctx) error {
|
||||||
// responses:
|
// responses:
|
||||||
// "200":
|
// "200":
|
||||||
// description: Control Rex
|
// description: Control Rex
|
||||||
|
// "400":
|
||||||
|
// description: Invalid request body
|
||||||
|
// "422":
|
||||||
|
// description: Robot not found
|
||||||
|
|
||||||
log.Info().Msgf("body %v", string(c.Body()))
|
log.Info().Msgf("body %v", string(c.Body()))
|
||||||
|
|
||||||
|
@ -47,7 +52,94 @@ func ControlRex(c *fiber.Ctx) error {
|
||||||
fmt.Printf("y-value: %d\n", *body.Task.Y)
|
fmt.Printf("y-value: %d\n", *body.Task.Y)
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(10 * time.Second)
|
robot := cache.GetRobotByName(body.RobotName)
|
||||||
|
|
||||||
|
if robot.Id == "" {
|
||||||
|
return c.SendStatus(fiber.StatusUnprocessableEntity)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info().Msgf("robot %v", robot)
|
||||||
|
|
||||||
|
// wait until the robot finished the job
|
||||||
|
|
||||||
|
for robot.CurrentJobId != "" {
|
||||||
|
robot.CurrentJobId = body.JobId
|
||||||
|
log.Debug().Msgf("robot is free %v", body.JobId)
|
||||||
|
|
||||||
|
controlRexRequest(robot.Address, body)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
func controlRexRequest(address string, body any) {
|
||||||
|
a := fiber.AcquireAgent()
|
||||||
|
|
||||||
|
// TODO: port only for testing - remove it
|
||||||
|
url := "http://" + address + ":5000" + "/api/v1/control"
|
||||||
|
|
||||||
|
req := a.Request()
|
||||||
|
req.Header.SetMethod(fiber.MethodPost)
|
||||||
|
req.SetRequestURI(url)
|
||||||
|
req.Header.SetContentType("application/json")
|
||||||
|
|
||||||
|
log.Info().Msgf("url %s", url)
|
||||||
|
|
||||||
|
reqestBodyBytes, err := json.Marshal(body)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Msgf("Failed to marshal request body, err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
req.SetBody(reqestBodyBytes)
|
||||||
|
|
||||||
|
if err := a.Parse(); err != nil {
|
||||||
|
log.Error().Msgf("Failed to parse request, err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
code, body, _ := a.Bytes()
|
||||||
|
|
||||||
|
log.Info().Msgf("code %v body %v", code, body)
|
||||||
|
}
|
||||||
|
|
||||||
|
func FinishControlRex(c *fiber.Ctx) error {
|
||||||
|
// swagger:operation POST /control/0/finish/{robotName} control finishControlRex
|
||||||
|
// ---
|
||||||
|
// summary: Finish control Rex.
|
||||||
|
// description: |
|
||||||
|
// This is used to finish control Rex.
|
||||||
|
// consumes:
|
||||||
|
// - application/json
|
||||||
|
// produces:
|
||||||
|
// - application/json
|
||||||
|
// responses:
|
||||||
|
// "200":
|
||||||
|
// description: Finish control Rex
|
||||||
|
// "400":
|
||||||
|
// description: Invalid robot name
|
||||||
|
// "422":
|
||||||
|
// description: Robot not found
|
||||||
|
|
||||||
|
var params structs.RobotNameParams
|
||||||
|
|
||||||
|
if err := rsutils.ParamsParserHelper(c, ¶ms); err != nil {
|
||||||
|
return c.SendStatus(fiber.StatusBadRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug().Msgf("before finish control robot %v", cache.GetRobotByName(params.RobotName).CurrentJobId)
|
||||||
|
|
||||||
|
robot := cache.GetRobotByName(params.RobotName)
|
||||||
|
|
||||||
|
if robot.Id == "" {
|
||||||
|
return c.SendStatus(fiber.StatusUnprocessableEntity)
|
||||||
|
}
|
||||||
|
|
||||||
|
robot.CurrentJobId = ""
|
||||||
|
|
||||||
|
log.Debug().Msgf("finish control robot %v", cache.GetRobotByName(params.RobotName).CurrentJobId)
|
||||||
|
|
||||||
return c.SendStatus(fiber.StatusOK)
|
return c.SendStatus(fiber.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,8 @@ func SetPermitJoin(c *fiber.Ctx) error {
|
||||||
// responses:
|
// responses:
|
||||||
// "200":
|
// "200":
|
||||||
// description: Permit join set
|
// description: Permit join set
|
||||||
|
// "400":
|
||||||
|
// description: Invalid request body
|
||||||
|
|
||||||
var params structs.PermitJoinParam
|
var params structs.PermitJoinParam
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,10 @@ func FirstRequest(c *fiber.Ctx) error {
|
||||||
// description: Robot identified
|
// description: Robot identified
|
||||||
// schema:
|
// schema:
|
||||||
// "$ref": "#/definitions/StatusResponse"
|
// "$ref": "#/definitions/StatusResponse"
|
||||||
|
// "400":
|
||||||
|
// description: Invalid request body
|
||||||
|
// "403":
|
||||||
|
// description: Permit join is enabled
|
||||||
|
|
||||||
var body structs.FirstRequestBody
|
var body structs.FirstRequestBody
|
||||||
|
|
||||||
|
@ -118,6 +122,8 @@ func AuthorizeRobot(c *fiber.Ctx) error {
|
||||||
// responses:
|
// responses:
|
||||||
// "200":
|
// "200":
|
||||||
// description: Robot authorized
|
// description: Robot authorized
|
||||||
|
// "400":
|
||||||
|
// description: Invalid robot id
|
||||||
// "422":
|
// "422":
|
||||||
// description: Robot not found
|
// description: Robot not found
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ func SetupRoutes(app *fiber.App) {
|
||||||
|
|
||||||
c := v1.Group("/control")
|
c := v1.Group("/control")
|
||||||
c.Post("/0", control.ControlRex)
|
c.Post("/0", control.ControlRex)
|
||||||
|
c.Post("/0/finish/:robotName", control.FinishControlRex)
|
||||||
|
|
||||||
pj := v1.Group("/permitjoin")
|
pj := v1.Group("/permitjoin")
|
||||||
pj.Post("/:enabled", permitjoin.SetPermitJoin)
|
pj.Post("/:enabled", permitjoin.SetPermitJoin)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
from flask import Flask, request, jsonify
|
from flask import Flask, request, jsonify
|
||||||
import requests
|
import requests
|
||||||
|
import time
|
||||||
|
|
||||||
robot_control_server_url = 'http://localhost:50055/v1'
|
robot_control_server_url = 'http://localhost:50055/v1'
|
||||||
|
|
||||||
|
@ -9,6 +10,7 @@ class RexRobot:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.id = "B24"
|
self.id = "B24"
|
||||||
self.version = "0.0.1"
|
self.version = "0.0.1"
|
||||||
|
self.currentJobId = ""
|
||||||
|
|
||||||
# connecting with robot server
|
# connecting with robot server
|
||||||
print("connecting with robot server")
|
print("connecting with robot server")
|
||||||
|
@ -20,13 +22,24 @@ class RexRobot:
|
||||||
print("permit join disabled")
|
print("permit join disabled")
|
||||||
exit(1) # esp should here restart
|
exit(1) # esp should here restart
|
||||||
|
|
||||||
RexRobot()
|
def setCurrentJobId(self, jobId):
|
||||||
|
self.currentJobId = jobId
|
||||||
|
|
||||||
|
rex = RexRobot()
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
@app.route('/api/control', methods=['POST'])
|
@app.route('/api/v1/control', methods=['POST'])
|
||||||
def hello():
|
def hello():
|
||||||
print("Hallo, Welt!")
|
body = request.get_json()
|
||||||
|
|
||||||
|
print("controlling robot", body)
|
||||||
|
|
||||||
|
time.sleep(15)
|
||||||
|
|
||||||
|
|
||||||
|
print("robot controlled")
|
||||||
|
|
||||||
return jsonify({'status': 'ok'})
|
return jsonify({'status': 'ok'})
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
Loading…
Reference in New Issue