Initial setup of motor server
This commit is contained in:
parent
d950ba6d1d
commit
202aad293f
4 changed files with 88 additions and 7 deletions
|
@ -12,7 +12,6 @@ import (
|
|||
"context"
|
||||
"log"
|
||||
"time"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
|
|
|
@ -12,6 +12,21 @@ import (
|
|||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
type config struct {
|
||||
Id uint16
|
||||
Port uint16
|
||||
Min_pos float64
|
||||
Max_pos float64
|
||||
Max_vel float64
|
||||
Accel float64
|
||||
}
|
||||
|
||||
var(
|
||||
motorID uint16 = 0 //Requested ID
|
||||
ip string = "localhost" //localhost=127.0.0.1
|
||||
curr_config config //Current config of the motor
|
||||
)
|
||||
|
||||
// motorCmd represents the motor command
|
||||
var motorCmd = &cobra.Command{
|
||||
Use: "motor",
|
||||
|
@ -29,7 +44,7 @@ func init() {
|
|||
|
||||
// Cobra supports Persistent Flags which will work for this command
|
||||
// and all subcommands, e.g.:
|
||||
motorCmd.PersistentFlags().Uint16("id", 0, "Identifier number")
|
||||
motorCmd.PersistentFlags().Uint16Var(&motorID, "id", 0, "Identifier number")
|
||||
motorCmd.MarkFlagRequired("id")
|
||||
|
||||
// Cobra supports local flags which will only run when this command
|
||||
|
|
|
@ -8,8 +8,16 @@ import (
|
|||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
|
||||
"context"
|
||||
"log"
|
||||
"net"
|
||||
"google.golang.org/grpc"
|
||||
pb "github.com/AntoineHX/multi-motors-controller/src/proto"
|
||||
)
|
||||
|
||||
//Cobra CLI
|
||||
// serveCmd represents the serve command
|
||||
var serveCmd = &cobra.Command{
|
||||
Use: "serve",
|
||||
|
@ -17,7 +25,9 @@ var serveCmd = &cobra.Command{
|
|||
Long: `serve command descritpion`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
fmt.Println("serve called with ID ", cmd.Flag("id").Value)
|
||||
fmt.Println(cmd.CommandPath())
|
||||
// fmt.Println(cmd.CommandPath())
|
||||
updateConfig()
|
||||
serve()
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -35,4 +45,61 @@ func init() {
|
|||
// serveCmd.Flags().Uint16P("port", "p", 8080, "Port")
|
||||
|
||||
//TODO: Support Motor ID flag
|
||||
}
|
||||
|
||||
func updateConfig(){
|
||||
//Find correct ID in config file
|
||||
i := 0
|
||||
config_id := fmt.Sprintf("motors.%d.id",i)
|
||||
for viper.IsSet(config_id){
|
||||
// log.Printf("%v / %v", viper.GetInt(config_id), int(motorID))
|
||||
if viper.GetInt(config_id) == int(motorID) {
|
||||
//Extract config for this motor
|
||||
err := viper.UnmarshalKey(fmt.Sprintf("motors.%d",i), &curr_config)
|
||||
if err != nil {
|
||||
log.Fatalf("unable to decode into struct, %v", err)
|
||||
break
|
||||
}
|
||||
|
||||
//Sanity check
|
||||
if curr_config.Id != motorID {
|
||||
log.Fatalf("Failed to update config. Requested ID: %d. Got: %d.", motorID, curr_config.Id)
|
||||
}
|
||||
break
|
||||
}
|
||||
//Next motor
|
||||
i++
|
||||
config_id = fmt.Sprintf("motors.%d.id",i)
|
||||
}
|
||||
|
||||
log.Printf("Using config: %+v", curr_config)
|
||||
}
|
||||
|
||||
//gRPC server
|
||||
// server is used to implement MotorsControllerServer.
|
||||
type server struct {
|
||||
pb.UnimplementedMotorsControllerServer
|
||||
}
|
||||
|
||||
//TODO: Fix compiling issue with google.protobuf.Empty message
|
||||
func (s *server) SetVolicty(ctx context.Context, in *pb.Velocity) (*pb.Empty, error) {
|
||||
log.Printf("Received: %v", in.GetVelocity())
|
||||
return &pb.Empty{}, nil
|
||||
}
|
||||
|
||||
func (s *server) GetData(ctx context.Context, in *pb.Empty) (*pb.MotorData, error) {
|
||||
return &pb.MotorData{Angle: 0, Velocity: 0, Error: ""}, nil
|
||||
}
|
||||
|
||||
func serve() {
|
||||
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", curr_config.Port))
|
||||
if err != nil {
|
||||
log.Fatalf("failed to listen: %v", err)
|
||||
}
|
||||
s := grpc.NewServer()
|
||||
pb.RegisterMotorsControllerServer(s, &server{})
|
||||
log.Printf("server listening at %v", lis.Addr())
|
||||
if err := s.Serve(lis); err != nil {
|
||||
log.Fatalf("failed to serve: %v", err)
|
||||
}
|
||||
}
|
|
@ -12,10 +12,10 @@ service MotorsController {
|
|||
rpc GetJoints(Empty) returns (Angles) {}
|
||||
}
|
||||
// Server converting target angles to velocity profile for mo
|
||||
//service Motor {
|
||||
// rpc SetVolicty(Velocity) returns (Empty) {}
|
||||
// rpc ReceiveDataStream(Empty) returns (stream
|
||||
//}
|
||||
service Motor {
|
||||
rpc SetVolicty(Velocity) returns (Empty) {}
|
||||
rpc GetData(Empty) returns (MotorData) {}
|
||||
}
|
||||
|
||||
message Angles {
|
||||
repeated double angles = 1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue