diff --git a/cmd/hilapp/gotobuf/lvcontroller.pb.go b/cmd/hilapp/gotobuf/lvcontroller.pb.go new file mode 100644 index 0000000..8e4c602 --- /dev/null +++ b/cmd/hilapp/gotobuf/lvcontroller.pb.go @@ -0,0 +1,427 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.10 +// protoc v6.33.0 +// source: lvcontroller.proto + +package gotobuf + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type PWM struct { + state protoimpl.MessageState `protogen:"open.v1"` + FrequencyHz float32 `protobuf:"fixed32,1,opt,name=frequency_hz,json=frequencyHz,proto3" json:"frequency_hz,omitempty"` + DutyCycle float32 `protobuf:"fixed32,2,opt,name=duty_cycle,json=dutyCycle,proto3" json:"duty_cycle,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PWM) Reset() { + *x = PWM{} + mi := &file_lvcontroller_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PWM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PWM) ProtoMessage() {} + +func (x *PWM) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PWM.ProtoReflect.Descriptor instead. +func (*PWM) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{0} +} + +func (x *PWM) GetFrequencyHz() float32 { + if x != nil { + return x.FrequencyHz + } + return 0 +} + +func (x *PWM) GetDutyCycle() float32 { + if x != nil { + return x.DutyCycle + } + return 0 +} + +type Output struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Tractive system status indicator + TssiEn bool `protobuf:"varint,1,opt,name=tssi_en,json=tssiEn,proto3" json:"tssi_en,omitempty"` + TssiRedSignal bool `protobuf:"varint,2,opt,name=tssi_red_signal,json=tssiRedSignal,proto3" json:"tssi_red_signal,omitempty"` + TssiGreenSignal bool `protobuf:"varint,3,opt,name=tssi_green_signal,json=tssiGreenSignal,proto3" json:"tssi_green_signal,omitempty"` + // Powertrain cooling + PowertrainPump1En bool `protobuf:"varint,4,opt,name=powertrain_pump1_en,json=powertrainPump1En,proto3" json:"powertrain_pump1_en,omitempty"` + PowertrainPump2En bool `protobuf:"varint,5,opt,name=powertrain_pump2_en,json=powertrainPump2En,proto3" json:"powertrain_pump2_en,omitempty"` + PowertrainFan1En bool `protobuf:"varint,6,opt,name=powertrain_fan1_en,json=powertrainFan1En,proto3" json:"powertrain_fan1_en,omitempty"` + PowertrainFan2En bool `protobuf:"varint,7,opt,name=powertrain_fan2_en,json=powertrainFan2En,proto3" json:"powertrain_fan2_en,omitempty"` + PowertrainFanPwm *PWM `protobuf:"bytes,8,opt,name=powertrain_fan_pwm,json=powertrainFanPwm,proto3" json:"powertrain_fan_pwm,omitempty"` + // Motor Controller + MotorControllerEn bool `protobuf:"varint,9,opt,name=motor_controller_en,json=motorControllerEn,proto3" json:"motor_controller_en,omitempty"` + MotorCtrlPrechargeEn bool `protobuf:"varint,10,opt,name=motor_ctrl_precharge_en,json=motorCtrlPrechargeEn,proto3" json:"motor_ctrl_precharge_en,omitempty"` + MotorCtrlSwitchEn bool `protobuf:"varint,11,opt,name=motor_ctrl_switch_en,json=motorCtrlSwitchEn,proto3" json:"motor_ctrl_switch_en,omitempty"` + // Subsystems + AccumulatorEn bool `protobuf:"varint,12,opt,name=accumulator_en,json=accumulatorEn,proto3" json:"accumulator_en,omitempty"` + FrontControllerEn bool `protobuf:"varint,13,opt,name=front_controller_en,json=frontControllerEn,proto3" json:"front_controller_en,omitempty"` + ImuGpsEn bool `protobuf:"varint,14,opt,name=imu_gps_en,json=imuGpsEn,proto3" json:"imu_gps_en,omitempty"` + ShutdownCircuitEn bool `protobuf:"varint,15,opt,name=shutdown_circuit_en,json=shutdownCircuitEn,proto3" json:"shutdown_circuit_en,omitempty"` + // DCDC System & measurement + DcdcEn bool `protobuf:"varint,16,opt,name=dcdc_en,json=dcdcEn,proto3" json:"dcdc_en,omitempty"` + DcdcSenseSelect bool `protobuf:"varint,17,opt,name=dcdc_sense_select,json=dcdcSenseSelect,proto3" json:"dcdc_sense_select,omitempty"` + // Other + BrakeLightEn bool `protobuf:"varint,18,opt,name=brake_light_en,json=brakeLightEn,proto3" json:"brake_light_en,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Output) Reset() { + *x = Output{} + mi := &file_lvcontroller_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Output) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Output) ProtoMessage() {} + +func (x *Output) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Output.ProtoReflect.Descriptor instead. +func (*Output) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{1} +} + +func (x *Output) GetTssiEn() bool { + if x != nil { + return x.TssiEn + } + return false +} + +func (x *Output) GetTssiRedSignal() bool { + if x != nil { + return x.TssiRedSignal + } + return false +} + +func (x *Output) GetTssiGreenSignal() bool { + if x != nil { + return x.TssiGreenSignal + } + return false +} + +func (x *Output) GetPowertrainPump1En() bool { + if x != nil { + return x.PowertrainPump1En + } + return false +} + +func (x *Output) GetPowertrainPump2En() bool { + if x != nil { + return x.PowertrainPump2En + } + return false +} + +func (x *Output) GetPowertrainFan1En() bool { + if x != nil { + return x.PowertrainFan1En + } + return false +} + +func (x *Output) GetPowertrainFan2En() bool { + if x != nil { + return x.PowertrainFan2En + } + return false +} + +func (x *Output) GetPowertrainFanPwm() *PWM { + if x != nil { + return x.PowertrainFanPwm + } + return nil +} + +func (x *Output) GetMotorControllerEn() bool { + if x != nil { + return x.MotorControllerEn + } + return false +} + +func (x *Output) GetMotorCtrlPrechargeEn() bool { + if x != nil { + return x.MotorCtrlPrechargeEn + } + return false +} + +func (x *Output) GetMotorCtrlSwitchEn() bool { + if x != nil { + return x.MotorCtrlSwitchEn + } + return false +} + +func (x *Output) GetAccumulatorEn() bool { + if x != nil { + return x.AccumulatorEn + } + return false +} + +func (x *Output) GetFrontControllerEn() bool { + if x != nil { + return x.FrontControllerEn + } + return false +} + +func (x *Output) GetImuGpsEn() bool { + if x != nil { + return x.ImuGpsEn + } + return false +} + +func (x *Output) GetShutdownCircuitEn() bool { + if x != nil { + return x.ShutdownCircuitEn + } + return false +} + +func (x *Output) GetDcdcEn() bool { + if x != nil { + return x.DcdcEn + } + return false +} + +func (x *Output) GetDcdcSenseSelect() bool { + if x != nil { + return x.DcdcSenseSelect + } + return false +} + +func (x *Output) GetBrakeLightEn() bool { + if x != nil { + return x.BrakeLightEn + } + return false +} + +type Input struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Tractive system status indicator + ImdFault bool `protobuf:"varint,1,opt,name=imd_fault,json=imdFault,proto3" json:"imd_fault,omitempty"` + BmsFault bool `protobuf:"varint,2,opt,name=bms_fault,json=bmsFault,proto3" json:"bms_fault,omitempty"` + // DCDC System & Measurement + DcdcSense float32 `protobuf:"fixed32,3,opt,name=dcdc_sense,json=dcdcSense,proto3" json:"dcdc_sense,omitempty"` + SuspensionTravel3 float32 `protobuf:"fixed32,4,opt,name=suspension_travel3,json=suspensionTravel3,proto3" json:"suspension_travel3,omitempty"` + SuspensionTravel4 float32 `protobuf:"fixed32,5,opt,name=suspension_travel4,json=suspensionTravel4,proto3" json:"suspension_travel4,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Input) Reset() { + *x = Input{} + mi := &file_lvcontroller_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Input) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Input) ProtoMessage() {} + +func (x *Input) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Input.ProtoReflect.Descriptor instead. +func (*Input) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{2} +} + +func (x *Input) GetImdFault() bool { + if x != nil { + return x.ImdFault + } + return false +} + +func (x *Input) GetBmsFault() bool { + if x != nil { + return x.BmsFault + } + return false +} + +func (x *Input) GetDcdcSense() float32 { + if x != nil { + return x.DcdcSense + } + return 0 +} + +func (x *Input) GetSuspensionTravel3() float32 { + if x != nil { + return x.SuspensionTravel3 + } + return 0 +} + +func (x *Input) GetSuspensionTravel4() float32 { + if x != nil { + return x.SuspensionTravel4 + } + return 0 +} + +var File_lvcontroller_proto protoreflect.FileDescriptor + +const file_lvcontroller_proto_rawDesc = "" + + "\n" + + "\x12lvcontroller.proto\x12\flvcontroller\"G\n" + + "\x03PWM\x12!\n" + + "\ffrequency_hz\x18\x01 \x01(\x02R\vfrequencyHz\x12\x1d\n" + + "\n" + + "duty_cycle\x18\x02 \x01(\x02R\tdutyCycle\"\x9a\x06\n" + + "\x06Output\x12\x17\n" + + "\atssi_en\x18\x01 \x01(\bR\x06tssiEn\x12&\n" + + "\x0ftssi_red_signal\x18\x02 \x01(\bR\rtssiRedSignal\x12*\n" + + "\x11tssi_green_signal\x18\x03 \x01(\bR\x0ftssiGreenSignal\x12.\n" + + "\x13powertrain_pump1_en\x18\x04 \x01(\bR\x11powertrainPump1En\x12.\n" + + "\x13powertrain_pump2_en\x18\x05 \x01(\bR\x11powertrainPump2En\x12,\n" + + "\x12powertrain_fan1_en\x18\x06 \x01(\bR\x10powertrainFan1En\x12,\n" + + "\x12powertrain_fan2_en\x18\a \x01(\bR\x10powertrainFan2En\x12?\n" + + "\x12powertrain_fan_pwm\x18\b \x01(\v2\x11.lvcontroller.PWMR\x10powertrainFanPwm\x12.\n" + + "\x13motor_controller_en\x18\t \x01(\bR\x11motorControllerEn\x125\n" + + "\x17motor_ctrl_precharge_en\x18\n" + + " \x01(\bR\x14motorCtrlPrechargeEn\x12/\n" + + "\x14motor_ctrl_switch_en\x18\v \x01(\bR\x11motorCtrlSwitchEn\x12%\n" + + "\x0eaccumulator_en\x18\f \x01(\bR\raccumulatorEn\x12.\n" + + "\x13front_controller_en\x18\r \x01(\bR\x11frontControllerEn\x12\x1c\n" + + "\n" + + "imu_gps_en\x18\x0e \x01(\bR\bimuGpsEn\x12.\n" + + "\x13shutdown_circuit_en\x18\x0f \x01(\bR\x11shutdownCircuitEn\x12\x17\n" + + "\adcdc_en\x18\x10 \x01(\bR\x06dcdcEn\x12*\n" + + "\x11dcdc_sense_select\x18\x11 \x01(\bR\x0fdcdcSenseSelect\x12$\n" + + "\x0ebrake_light_en\x18\x12 \x01(\bR\fbrakeLightEn\"\xbe\x01\n" + + "\x05Input\x12\x1b\n" + + "\timd_fault\x18\x01 \x01(\bR\bimdFault\x12\x1b\n" + + "\tbms_fault\x18\x02 \x01(\bR\bbmsFault\x12\x1d\n" + + "\n" + + "dcdc_sense\x18\x03 \x01(\x02R\tdcdcSense\x12-\n" + + "\x12suspension_travel3\x18\x04 \x01(\x02R\x11suspensionTravel3\x12-\n" + + "\x12suspension_travel4\x18\x05 \x01(\x02R\x11suspensionTravel4B\vZ\t./gotobufb\x06proto3" + +var ( + file_lvcontroller_proto_rawDescOnce sync.Once + file_lvcontroller_proto_rawDescData []byte +) + +func file_lvcontroller_proto_rawDescGZIP() []byte { + file_lvcontroller_proto_rawDescOnce.Do(func() { + file_lvcontroller_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_lvcontroller_proto_rawDesc), len(file_lvcontroller_proto_rawDesc))) + }) + return file_lvcontroller_proto_rawDescData +} + +var file_lvcontroller_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_lvcontroller_proto_goTypes = []any{ + (*PWM)(nil), // 0: lvcontroller.PWM + (*Output)(nil), // 1: lvcontroller.Output + (*Input)(nil), // 2: lvcontroller.Input +} +var file_lvcontroller_proto_depIdxs = []int32{ + 0, // 0: lvcontroller.Output.powertrain_fan_pwm:type_name -> lvcontroller.PWM + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_lvcontroller_proto_init() } +func file_lvcontroller_proto_init() { + if File_lvcontroller_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_lvcontroller_proto_rawDesc), len(file_lvcontroller_proto_rawDesc)), + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_lvcontroller_proto_goTypes, + DependencyIndexes: file_lvcontroller_proto_depIdxs, + MessageInfos: file_lvcontroller_proto_msgTypes, + }.Build() + File_lvcontroller_proto = out.File + file_lvcontroller_proto_goTypes = nil + file_lvcontroller_proto_depIdxs = nil +} diff --git a/cmd/iocheckout/main.go b/cmd/iocheckout/main.go index 1589ee2..ffaa44e 100644 --- a/cmd/iocheckout/main.go +++ b/cmd/iocheckout/main.go @@ -9,7 +9,6 @@ import ( "github.com/macformula/hil/iocontrol" "github.com/macformula/hil/iocontrol/raspi" - // "github.com/macformula/hil/iocontrol/sil" "github.com/macformula/hil/iocontrol/speedgoat" "github.com/macformula/hil/macformula" "github.com/macformula/hil/macformula/pinout" @@ -67,8 +66,8 @@ func main() { } // if *useSil { - // s := sil.NewController(_silPort, logger) - // ioControlOpts = append(ioControlOpts, iocontrol.WithSil(s)) + // //s := sil.NewController(_silPort, logger) + // //ioControlOpts = append(ioControlOpts, iocontrol.WithSil(s)) // } ioControl := iocontrol.NewIOControl(logger, ioControlOpts...) diff --git a/go.mod b/go.mod index 3e6af87..6c0b1a1 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/ethereum/go-ethereum v1.13.5 github.com/fatih/color v1.15.0 github.com/google/uuid v1.3.1 + github.com/justincpresley/go-cobs v1.6.0 github.com/manifoldco/promptui v0.9.0 github.com/muesli/reflow v0.3.0 github.com/muesli/termenv v0.15.2 diff --git a/go.sum b/go.sum index c4621a3..df62276 100644 --- a/go.sum +++ b/go.sum @@ -42,6 +42,8 @@ github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/justincpresley/go-cobs v1.6.0 h1:b2EY8dq+OV6T6Xooh5eSWbAbLPCNG+IS0V99nd7Yfk0= +github.com/justincpresley/go-cobs v1.6.0/go.mod h1:ZOlkaf500pIluUaBrpNxTOI6+cxwsH718/GVlEXQVv8= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= diff --git a/gotobuf/lvcontroller.pb.go b/gotobuf/lvcontroller.pb.go new file mode 100644 index 0000000..8e4c602 --- /dev/null +++ b/gotobuf/lvcontroller.pb.go @@ -0,0 +1,427 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.10 +// protoc v6.33.0 +// source: lvcontroller.proto + +package gotobuf + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type PWM struct { + state protoimpl.MessageState `protogen:"open.v1"` + FrequencyHz float32 `protobuf:"fixed32,1,opt,name=frequency_hz,json=frequencyHz,proto3" json:"frequency_hz,omitempty"` + DutyCycle float32 `protobuf:"fixed32,2,opt,name=duty_cycle,json=dutyCycle,proto3" json:"duty_cycle,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PWM) Reset() { + *x = PWM{} + mi := &file_lvcontroller_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PWM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PWM) ProtoMessage() {} + +func (x *PWM) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PWM.ProtoReflect.Descriptor instead. +func (*PWM) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{0} +} + +func (x *PWM) GetFrequencyHz() float32 { + if x != nil { + return x.FrequencyHz + } + return 0 +} + +func (x *PWM) GetDutyCycle() float32 { + if x != nil { + return x.DutyCycle + } + return 0 +} + +type Output struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Tractive system status indicator + TssiEn bool `protobuf:"varint,1,opt,name=tssi_en,json=tssiEn,proto3" json:"tssi_en,omitempty"` + TssiRedSignal bool `protobuf:"varint,2,opt,name=tssi_red_signal,json=tssiRedSignal,proto3" json:"tssi_red_signal,omitempty"` + TssiGreenSignal bool `protobuf:"varint,3,opt,name=tssi_green_signal,json=tssiGreenSignal,proto3" json:"tssi_green_signal,omitempty"` + // Powertrain cooling + PowertrainPump1En bool `protobuf:"varint,4,opt,name=powertrain_pump1_en,json=powertrainPump1En,proto3" json:"powertrain_pump1_en,omitempty"` + PowertrainPump2En bool `protobuf:"varint,5,opt,name=powertrain_pump2_en,json=powertrainPump2En,proto3" json:"powertrain_pump2_en,omitempty"` + PowertrainFan1En bool `protobuf:"varint,6,opt,name=powertrain_fan1_en,json=powertrainFan1En,proto3" json:"powertrain_fan1_en,omitempty"` + PowertrainFan2En bool `protobuf:"varint,7,opt,name=powertrain_fan2_en,json=powertrainFan2En,proto3" json:"powertrain_fan2_en,omitempty"` + PowertrainFanPwm *PWM `protobuf:"bytes,8,opt,name=powertrain_fan_pwm,json=powertrainFanPwm,proto3" json:"powertrain_fan_pwm,omitempty"` + // Motor Controller + MotorControllerEn bool `protobuf:"varint,9,opt,name=motor_controller_en,json=motorControllerEn,proto3" json:"motor_controller_en,omitempty"` + MotorCtrlPrechargeEn bool `protobuf:"varint,10,opt,name=motor_ctrl_precharge_en,json=motorCtrlPrechargeEn,proto3" json:"motor_ctrl_precharge_en,omitempty"` + MotorCtrlSwitchEn bool `protobuf:"varint,11,opt,name=motor_ctrl_switch_en,json=motorCtrlSwitchEn,proto3" json:"motor_ctrl_switch_en,omitempty"` + // Subsystems + AccumulatorEn bool `protobuf:"varint,12,opt,name=accumulator_en,json=accumulatorEn,proto3" json:"accumulator_en,omitempty"` + FrontControllerEn bool `protobuf:"varint,13,opt,name=front_controller_en,json=frontControllerEn,proto3" json:"front_controller_en,omitempty"` + ImuGpsEn bool `protobuf:"varint,14,opt,name=imu_gps_en,json=imuGpsEn,proto3" json:"imu_gps_en,omitempty"` + ShutdownCircuitEn bool `protobuf:"varint,15,opt,name=shutdown_circuit_en,json=shutdownCircuitEn,proto3" json:"shutdown_circuit_en,omitempty"` + // DCDC System & measurement + DcdcEn bool `protobuf:"varint,16,opt,name=dcdc_en,json=dcdcEn,proto3" json:"dcdc_en,omitempty"` + DcdcSenseSelect bool `protobuf:"varint,17,opt,name=dcdc_sense_select,json=dcdcSenseSelect,proto3" json:"dcdc_sense_select,omitempty"` + // Other + BrakeLightEn bool `protobuf:"varint,18,opt,name=brake_light_en,json=brakeLightEn,proto3" json:"brake_light_en,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Output) Reset() { + *x = Output{} + mi := &file_lvcontroller_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Output) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Output) ProtoMessage() {} + +func (x *Output) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Output.ProtoReflect.Descriptor instead. +func (*Output) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{1} +} + +func (x *Output) GetTssiEn() bool { + if x != nil { + return x.TssiEn + } + return false +} + +func (x *Output) GetTssiRedSignal() bool { + if x != nil { + return x.TssiRedSignal + } + return false +} + +func (x *Output) GetTssiGreenSignal() bool { + if x != nil { + return x.TssiGreenSignal + } + return false +} + +func (x *Output) GetPowertrainPump1En() bool { + if x != nil { + return x.PowertrainPump1En + } + return false +} + +func (x *Output) GetPowertrainPump2En() bool { + if x != nil { + return x.PowertrainPump2En + } + return false +} + +func (x *Output) GetPowertrainFan1En() bool { + if x != nil { + return x.PowertrainFan1En + } + return false +} + +func (x *Output) GetPowertrainFan2En() bool { + if x != nil { + return x.PowertrainFan2En + } + return false +} + +func (x *Output) GetPowertrainFanPwm() *PWM { + if x != nil { + return x.PowertrainFanPwm + } + return nil +} + +func (x *Output) GetMotorControllerEn() bool { + if x != nil { + return x.MotorControllerEn + } + return false +} + +func (x *Output) GetMotorCtrlPrechargeEn() bool { + if x != nil { + return x.MotorCtrlPrechargeEn + } + return false +} + +func (x *Output) GetMotorCtrlSwitchEn() bool { + if x != nil { + return x.MotorCtrlSwitchEn + } + return false +} + +func (x *Output) GetAccumulatorEn() bool { + if x != nil { + return x.AccumulatorEn + } + return false +} + +func (x *Output) GetFrontControllerEn() bool { + if x != nil { + return x.FrontControllerEn + } + return false +} + +func (x *Output) GetImuGpsEn() bool { + if x != nil { + return x.ImuGpsEn + } + return false +} + +func (x *Output) GetShutdownCircuitEn() bool { + if x != nil { + return x.ShutdownCircuitEn + } + return false +} + +func (x *Output) GetDcdcEn() bool { + if x != nil { + return x.DcdcEn + } + return false +} + +func (x *Output) GetDcdcSenseSelect() bool { + if x != nil { + return x.DcdcSenseSelect + } + return false +} + +func (x *Output) GetBrakeLightEn() bool { + if x != nil { + return x.BrakeLightEn + } + return false +} + +type Input struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Tractive system status indicator + ImdFault bool `protobuf:"varint,1,opt,name=imd_fault,json=imdFault,proto3" json:"imd_fault,omitempty"` + BmsFault bool `protobuf:"varint,2,opt,name=bms_fault,json=bmsFault,proto3" json:"bms_fault,omitempty"` + // DCDC System & Measurement + DcdcSense float32 `protobuf:"fixed32,3,opt,name=dcdc_sense,json=dcdcSense,proto3" json:"dcdc_sense,omitempty"` + SuspensionTravel3 float32 `protobuf:"fixed32,4,opt,name=suspension_travel3,json=suspensionTravel3,proto3" json:"suspension_travel3,omitempty"` + SuspensionTravel4 float32 `protobuf:"fixed32,5,opt,name=suspension_travel4,json=suspensionTravel4,proto3" json:"suspension_travel4,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Input) Reset() { + *x = Input{} + mi := &file_lvcontroller_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Input) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Input) ProtoMessage() {} + +func (x *Input) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Input.ProtoReflect.Descriptor instead. +func (*Input) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{2} +} + +func (x *Input) GetImdFault() bool { + if x != nil { + return x.ImdFault + } + return false +} + +func (x *Input) GetBmsFault() bool { + if x != nil { + return x.BmsFault + } + return false +} + +func (x *Input) GetDcdcSense() float32 { + if x != nil { + return x.DcdcSense + } + return 0 +} + +func (x *Input) GetSuspensionTravel3() float32 { + if x != nil { + return x.SuspensionTravel3 + } + return 0 +} + +func (x *Input) GetSuspensionTravel4() float32 { + if x != nil { + return x.SuspensionTravel4 + } + return 0 +} + +var File_lvcontroller_proto protoreflect.FileDescriptor + +const file_lvcontroller_proto_rawDesc = "" + + "\n" + + "\x12lvcontroller.proto\x12\flvcontroller\"G\n" + + "\x03PWM\x12!\n" + + "\ffrequency_hz\x18\x01 \x01(\x02R\vfrequencyHz\x12\x1d\n" + + "\n" + + "duty_cycle\x18\x02 \x01(\x02R\tdutyCycle\"\x9a\x06\n" + + "\x06Output\x12\x17\n" + + "\atssi_en\x18\x01 \x01(\bR\x06tssiEn\x12&\n" + + "\x0ftssi_red_signal\x18\x02 \x01(\bR\rtssiRedSignal\x12*\n" + + "\x11tssi_green_signal\x18\x03 \x01(\bR\x0ftssiGreenSignal\x12.\n" + + "\x13powertrain_pump1_en\x18\x04 \x01(\bR\x11powertrainPump1En\x12.\n" + + "\x13powertrain_pump2_en\x18\x05 \x01(\bR\x11powertrainPump2En\x12,\n" + + "\x12powertrain_fan1_en\x18\x06 \x01(\bR\x10powertrainFan1En\x12,\n" + + "\x12powertrain_fan2_en\x18\a \x01(\bR\x10powertrainFan2En\x12?\n" + + "\x12powertrain_fan_pwm\x18\b \x01(\v2\x11.lvcontroller.PWMR\x10powertrainFanPwm\x12.\n" + + "\x13motor_controller_en\x18\t \x01(\bR\x11motorControllerEn\x125\n" + + "\x17motor_ctrl_precharge_en\x18\n" + + " \x01(\bR\x14motorCtrlPrechargeEn\x12/\n" + + "\x14motor_ctrl_switch_en\x18\v \x01(\bR\x11motorCtrlSwitchEn\x12%\n" + + "\x0eaccumulator_en\x18\f \x01(\bR\raccumulatorEn\x12.\n" + + "\x13front_controller_en\x18\r \x01(\bR\x11frontControllerEn\x12\x1c\n" + + "\n" + + "imu_gps_en\x18\x0e \x01(\bR\bimuGpsEn\x12.\n" + + "\x13shutdown_circuit_en\x18\x0f \x01(\bR\x11shutdownCircuitEn\x12\x17\n" + + "\adcdc_en\x18\x10 \x01(\bR\x06dcdcEn\x12*\n" + + "\x11dcdc_sense_select\x18\x11 \x01(\bR\x0fdcdcSenseSelect\x12$\n" + + "\x0ebrake_light_en\x18\x12 \x01(\bR\fbrakeLightEn\"\xbe\x01\n" + + "\x05Input\x12\x1b\n" + + "\timd_fault\x18\x01 \x01(\bR\bimdFault\x12\x1b\n" + + "\tbms_fault\x18\x02 \x01(\bR\bbmsFault\x12\x1d\n" + + "\n" + + "dcdc_sense\x18\x03 \x01(\x02R\tdcdcSense\x12-\n" + + "\x12suspension_travel3\x18\x04 \x01(\x02R\x11suspensionTravel3\x12-\n" + + "\x12suspension_travel4\x18\x05 \x01(\x02R\x11suspensionTravel4B\vZ\t./gotobufb\x06proto3" + +var ( + file_lvcontroller_proto_rawDescOnce sync.Once + file_lvcontroller_proto_rawDescData []byte +) + +func file_lvcontroller_proto_rawDescGZIP() []byte { + file_lvcontroller_proto_rawDescOnce.Do(func() { + file_lvcontroller_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_lvcontroller_proto_rawDesc), len(file_lvcontroller_proto_rawDesc))) + }) + return file_lvcontroller_proto_rawDescData +} + +var file_lvcontroller_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_lvcontroller_proto_goTypes = []any{ + (*PWM)(nil), // 0: lvcontroller.PWM + (*Output)(nil), // 1: lvcontroller.Output + (*Input)(nil), // 2: lvcontroller.Input +} +var file_lvcontroller_proto_depIdxs = []int32{ + 0, // 0: lvcontroller.Output.powertrain_fan_pwm:type_name -> lvcontroller.PWM + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_lvcontroller_proto_init() } +func file_lvcontroller_proto_init() { + if File_lvcontroller_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_lvcontroller_proto_rawDesc), len(file_lvcontroller_proto_rawDesc)), + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_lvcontroller_proto_goTypes, + DependencyIndexes: file_lvcontroller_proto_depIdxs, + MessageInfos: file_lvcontroller_proto_msgTypes, + }.Build() + File_lvcontroller_proto = out.File + file_lvcontroller_proto_goTypes = nil + file_lvcontroller_proto_depIdxs = nil +} diff --git a/hilapp b/hilapp new file mode 100755 index 0000000..28ce2ec Binary files /dev/null and b/hilapp differ diff --git a/iocontrol/iocontrol.go b/iocontrol/iocontrol.go index 418ccb8..3035271 100644 --- a/iocontrol/iocontrol.go +++ b/iocontrol/iocontrol.go @@ -248,7 +248,7 @@ func (io *IOControl) ReadVoltage(input AnalogPin) (float64, error) { } // WriteCurrent sets the current of a specified output analog pin -func (io *IOControl) WriteCurrent(output AnalogPin, current float64) error { +/*func (io *IOControl) WriteCurrent(output AnalogPin, current float64) error { var err error switch pin := output.(type) { @@ -284,10 +284,10 @@ func (io *IOControl) WriteCurrent(output AnalogPin, current float64) error { } return nil -} +}*/ // ReadCurrent returns the current of a specified input analog pin -func (io *IOControl) ReadCurrent(input AnalogPin) (float64, error) { +/*func (io *IOControl) ReadCurrent(input AnalogPin) (float64, error) { var ( current float64 err error @@ -326,7 +326,7 @@ func (io *IOControl) ReadCurrent(input AnalogPin) (float64, error) { } return current, nil -} +}*/ func (io *IOControl) Close() error { if io.rp != nil { diff --git a/iocontrol/sil/controller.go b/iocontrol/sil/controller.go index 759d493..35d2366 100644 --- a/iocontrol/sil/controller.go +++ b/iocontrol/sil/controller.go @@ -5,11 +5,15 @@ import ( "fmt" "io" "net" + "time" "github.com/pkg/errors" "go.uber.org/zap" + "google.golang.org/protobuf/proto" flatbuffers "github.com/google/flatbuffers/go" + cobs "github.com/justincpresley/go-cobs/src" + pb "github.com/macformula/hil/iocontrol/sil/gotobuf" signals "github.com/macformula/hil/iocontrol/sil/signals" ) @@ -19,23 +23,68 @@ const ( ) //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/signals.proto +type CircularBuffer struct { + buffer []byte + size int + write_head int + full bool +} + +func NewCircularBuffer(size int) *CircularBuffer { + return &CircularBuffer{ + buffer: make([]byte, size), + size: size, + } +} +func (b *CircularBuffer) Add(entry byte) { + b.buffer[b.write_head] = entry + b.write_head++ + if b.write_head == b.size { + if !b.full { + b.full = true + } + b.write_head = 0 + } +} +func (b *CircularBuffer) Get() (int, []byte) { + return_buffer := make([]byte, b.size) + len := 0 + if b.full { + len = b.size + } else { + len = b.write_head + } + for i := range b.size { + return_buffer[i] = b.buffer[(b.write_head+b.size-i-1)%b.size] + } + + return len, return_buffer +} + type Controller struct { l *zap.Logger port int listener net.Listener Pins *PinModel + inputs *pb.Input + outputs *pb.Output + //Inputs lvcontroller_inputs + //Outputs lvcontroller_outputs // find what these should be called } // NewController returns a new SIL Controller. func NewController(port int, l *zap.Logger, digitalInputs []*DigitalPin, digitalOutputs []*DigitalPin, analogInputs []*AnalogPin, analogOutputs []*AnalogPin) *Controller { return &Controller{ - l: l, - port: port, - Pins: NewPinModel(l, digitalInputs, digitalOutputs, analogInputs, analogOutputs), + l: l, + port: port, + Pins: NewPinModel(l, digitalInputs, digitalOutputs, analogInputs, analogOutputs), + inputs: &pb.Input{}, + outputs: &pb.Output{}, } } func (c *Controller) Open(ctx context.Context) error { + c.l.Info("opening sil FbController") addr := fmt.Sprintf("localhost:%v", c.port) @@ -65,158 +114,94 @@ func (c *Controller) Close() error { } func (c *Controller) handleConnection(conn net.Conn) { + WriteEncoder, err := cobs.NewEncoder(cobs.Config{ + SpecialByte: 0x00, + Delimiter: true, + EndingSave: true, + Type: cobs.Native, + }) + if err != nil { + c.l.Info(fmt.Sprintf("Error in creating the write encoder: %v", err)) + } + ReadEncoder, err := cobs.NewEncoder(cobs.Config{ + SpecialByte: 0x00, + Delimiter: true, + EndingSave: true, + Type: cobs.ReversedNative, + }) + if err != nil { + c.l.Info(fmt.Sprintf("Error in creating the read encoder: %v", err)) + } + go c.Writer(conn, WriteEncoder) + go c.Reader(conn, ReadEncoder) +} + +func (c *Controller) Reader(conn net.Conn, encoder cobs.Encoder) { defer conn.Close() + c.l.Sync() + buffer := NewCircularBuffer(40) + output := &pb.Output{} - buffer := make([]byte, 2024) for { - _, err := conn.Read(buffer) + readbuf := make([]byte, 2048) + bytes_read, err := conn.Read(readbuf) if err != nil { if err != io.EOF { c.l.Error(fmt.Sprintf("read error: %s", err)) } - break } - request := signals.GetRootAsRequest(buffer, 0) - - unionTable := new(flatbuffers.Table) - if request.Request(unionTable) { - requestType := request.RequestType() - switch requestType { - case signals.RequestTypeReadRequest: - ecu, sigName, sigType, sigDirection := deserializeReadRequest(unionTable) - - switch sigType { - case signals.SIGNAL_TYPEDIGITAL: - switch sigDirection { - case signals.SIGNAL_DIRECTIONINPUT: - pin := NewDigitalInputPin(ecu, sigName) - level, err := c.Pins.ReadDigitalInput(pin) - if err != nil { - c.l.Error(fmt.Sprintf("read digital input ecu (%s) signal name (%s) error: %s", ecu, sigName, err)) - - response := serializeReadResponse(signals.SignalValueDigital, _unsetDigitalValue, _unsetAnalogValue, false, fmt.Sprintf("read digital input ecu (%s) signal name (%s) error: %s", ecu, sigName, err)) - _, err = conn.Write(response) - if err != nil { - c.l.Error(fmt.Sprintf("write sil response (%s)", err.Error())) - } - } - - response := serializeReadResponse(signals.SignalValueDigital, level, _unsetAnalogValue, true, "") - _, err = conn.Write(response) - if err != nil { - c.l.Error(fmt.Sprintf("write sil response (%s)", err.Error())) - } - case signals.SIGNAL_DIRECTIONOUTPUT: - pin := NewDigitalOutputPin(ecu, sigName) - level, err := c.Pins.ReadDigitalOutput(pin) - if err != nil { - c.l.Error(fmt.Sprintf("read digital output ecu (%s) signal name (%s)", ecu, sigName)) - - response := serializeReadResponse(signals.SignalValueDigital, _unsetDigitalValue, _unsetAnalogValue, false, fmt.Sprintf("read digital output ecu (%s) signal name (%s)", ecu, sigName)) - _, err = conn.Write(response) - if err != nil { - c.l.Error(fmt.Sprintf("write sil response (%s)", err.Error())) - } - } - - response := serializeReadResponse(signals.SignalValueDigital, level, _unsetAnalogValue, true, "") - _, err = conn.Write(response) - if err != nil { - c.l.Error(fmt.Sprintf("write sil response (%s)", err.Error())) - } - } - case signals.SIGNAL_TYPEANALOG: - switch sigDirection { - case signals.SIGNAL_DIRECTIONINPUT: - pin := NewAnalogInputPin(ecu, sigName) - voltage, err := c.Pins.ReadAnalogInput(pin) - if err != nil { - c.l.Error(fmt.Sprintf("read analog input ecu (%s) signal name (%s)", ecu, sigName)) - - response := serializeReadResponse(signals.SignalValueAnalog, _unsetDigitalValue, _unsetAnalogValue, false, fmt.Sprintf("read digital output ecu (%s) signal name (%s)", ecu, sigName)) - _, err = conn.Write(response) - if err != nil { - c.l.Error(fmt.Sprintf("write sil response (%s)", err.Error())) - } - } - - response := serializeReadResponse(signals.SignalValueDigital, _unsetDigitalValue, voltage, true, "") - _, err = conn.Write(response) - if err != nil { - c.l.Error(fmt.Sprintf("write sil response (%s)", err.Error())) - } - case signals.SIGNAL_DIRECTIONOUTPUT: - pin := NewAnalogOutputPin(ecu, sigName) - voltage, err := c.Pins.ReadAnalogOutput(pin) - if err != nil { - c.l.Error(fmt.Sprintf("read analog output ecu (%s) signal name (%s)", ecu, sigName)) - - response := serializeReadResponse(signals.SignalValueDigital, _unsetDigitalValue, _unsetAnalogValue, false, fmt.Sprintf("read analog output ecu (%s) signal name (%s)", ecu, sigName)) - _, err = conn.Write(response) - if err != nil { - c.l.Error(fmt.Sprintf("write sil response (%s)", err.Error())) - } - } - - response := serializeReadResponse(signals.SignalValueDigital, _unsetDigitalValue, voltage, true, "") - _, err = conn.Write(response) - if err != nil { - c.l.Error(fmt.Sprintf("write sil response (%s)", err.Error())) - } - } - } - case signals.RequestTypeSetRequest: - ecu, sigName, sigType, sigDirection, value, voltage := deserializeSetRequest(unionTable) - - switch sigType { - case signals.SIGNAL_TYPEDIGITAL: - switch sigDirection { - case signals.SIGNAL_DIRECTIONINPUT: - pin := NewDigitalInputPin(ecu, sigName) - c.Pins.SetDigitalInput(pin, value) - case signals.SIGNAL_DIRECTIONOUTPUT: - pin := NewDigitalOutputPin(ecu, sigName) - c.Pins.SetDigitalOutput(pin, value) - } - case signals.SIGNAL_TYPEANALOG: - switch sigDirection { - case signals.SIGNAL_DIRECTIONINPUT: - pin := NewAnalogInputPin(ecu, sigName) - c.Pins.SetAnalogInput(pin, voltage) - case signals.SIGNAL_DIRECTIONOUTPUT: - pin := NewAnalogOutputPin(ecu, sigName) - c.Pins.SetAnalogOutput(pin, voltage) - } - } - - case signals.RequestTypeRegisterRequest: - ecu, sigName, sigType, sigDirection := deserializeRegisterRequest(unionTable) - - switch sigType { - case signals.SIGNAL_TYPEDIGITAL: - switch sigDirection { - case signals.SIGNAL_DIRECTIONINPUT: - pin := NewDigitalInputPin(ecu, sigName) - c.Pins.RegisterDigitalInput(pin) - case signals.SIGNAL_DIRECTIONOUTPUT: - pin := NewDigitalOutputPin(ecu, sigName) - c.Pins.RegisterDigitalOutput(pin) - } - case signals.SIGNAL_TYPEANALOG: - switch sigDirection { - case signals.SIGNAL_DIRECTIONINPUT: - pin := NewAnalogInputPin(ecu, sigName) - c.Pins.RegisterAnalogInput(pin) - case signals.SIGNAL_DIRECTIONOUTPUT: - pin := NewAnalogOutputPin(ecu, sigName) - c.Pins.RegisterAnalogOutput(pin) - } - } - } + c.l.Sync() + for i := range bytes_read { + buffer.Add(readbuf[i]) + } + start_index := -1 + end_index := -1 + buf_len, msg_buf := buffer.Get() + for i := range buf_len { + if start_index != -1 && msg_buf[i] == 0 { + end_index = i + 1 + break + } + if msg_buf[i] == 0 { + start_index = i + 1 + } } + if end_index != -1 { + read_slice := msg_buf[start_index:end_index] + cobs_decoded := encoder.Decode(read_slice) + for i := 0; i < len(cobs_decoded)/2; i++ { + cobs_decoded[i], cobs_decoded[len(cobs_decoded)-1-i] = + cobs_decoded[len(cobs_decoded)-1-i], cobs_decoded[i] + } + err = proto.Unmarshal(cobs_decoded, output) + if err != nil { + c.l.Info(fmt.Sprintf("unmarshal error: %s", err)) + } + c.l.Sync() + } + time.Sleep(time.Millisecond * 50) } } +func (c *Controller) Writer(conn net.Conn, encoder cobs.Encoder) { + defer conn.Close() + //write + for { + c.inputs.ImdFault = !c.inputs.ImdFault + c.inputs.BmsFault = !c.inputs.BmsFault + proto_encoded, err := proto.Marshal(c.inputs) + if err != nil { + c.l.Info(fmt.Sprintf("marshalling error: %v", err)) + } + cobs_encoded := encoder.Encode(proto_encoded) + _, err = conn.Write(cobs_encoded) + if err != nil { + c.l.Info(fmt.Sprintf("write error: %s", err)) + } + time.Sleep(time.Millisecond * 2000) + } + +} // WriteCurrent sets the current of a SIL analog pin (unimplemented for SIL). func (c *Controller) WriteCurrent(_ *AnalogPin, _ float64) error { diff --git a/iocontrol/sil/gotobuf/lvcontroller.pb.go b/iocontrol/sil/gotobuf/lvcontroller.pb.go new file mode 100644 index 0000000..8e4c602 --- /dev/null +++ b/iocontrol/sil/gotobuf/lvcontroller.pb.go @@ -0,0 +1,427 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.10 +// protoc v6.33.0 +// source: lvcontroller.proto + +package gotobuf + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type PWM struct { + state protoimpl.MessageState `protogen:"open.v1"` + FrequencyHz float32 `protobuf:"fixed32,1,opt,name=frequency_hz,json=frequencyHz,proto3" json:"frequency_hz,omitempty"` + DutyCycle float32 `protobuf:"fixed32,2,opt,name=duty_cycle,json=dutyCycle,proto3" json:"duty_cycle,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PWM) Reset() { + *x = PWM{} + mi := &file_lvcontroller_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PWM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PWM) ProtoMessage() {} + +func (x *PWM) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PWM.ProtoReflect.Descriptor instead. +func (*PWM) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{0} +} + +func (x *PWM) GetFrequencyHz() float32 { + if x != nil { + return x.FrequencyHz + } + return 0 +} + +func (x *PWM) GetDutyCycle() float32 { + if x != nil { + return x.DutyCycle + } + return 0 +} + +type Output struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Tractive system status indicator + TssiEn bool `protobuf:"varint,1,opt,name=tssi_en,json=tssiEn,proto3" json:"tssi_en,omitempty"` + TssiRedSignal bool `protobuf:"varint,2,opt,name=tssi_red_signal,json=tssiRedSignal,proto3" json:"tssi_red_signal,omitempty"` + TssiGreenSignal bool `protobuf:"varint,3,opt,name=tssi_green_signal,json=tssiGreenSignal,proto3" json:"tssi_green_signal,omitempty"` + // Powertrain cooling + PowertrainPump1En bool `protobuf:"varint,4,opt,name=powertrain_pump1_en,json=powertrainPump1En,proto3" json:"powertrain_pump1_en,omitempty"` + PowertrainPump2En bool `protobuf:"varint,5,opt,name=powertrain_pump2_en,json=powertrainPump2En,proto3" json:"powertrain_pump2_en,omitempty"` + PowertrainFan1En bool `protobuf:"varint,6,opt,name=powertrain_fan1_en,json=powertrainFan1En,proto3" json:"powertrain_fan1_en,omitempty"` + PowertrainFan2En bool `protobuf:"varint,7,opt,name=powertrain_fan2_en,json=powertrainFan2En,proto3" json:"powertrain_fan2_en,omitempty"` + PowertrainFanPwm *PWM `protobuf:"bytes,8,opt,name=powertrain_fan_pwm,json=powertrainFanPwm,proto3" json:"powertrain_fan_pwm,omitempty"` + // Motor Controller + MotorControllerEn bool `protobuf:"varint,9,opt,name=motor_controller_en,json=motorControllerEn,proto3" json:"motor_controller_en,omitempty"` + MotorCtrlPrechargeEn bool `protobuf:"varint,10,opt,name=motor_ctrl_precharge_en,json=motorCtrlPrechargeEn,proto3" json:"motor_ctrl_precharge_en,omitempty"` + MotorCtrlSwitchEn bool `protobuf:"varint,11,opt,name=motor_ctrl_switch_en,json=motorCtrlSwitchEn,proto3" json:"motor_ctrl_switch_en,omitempty"` + // Subsystems + AccumulatorEn bool `protobuf:"varint,12,opt,name=accumulator_en,json=accumulatorEn,proto3" json:"accumulator_en,omitempty"` + FrontControllerEn bool `protobuf:"varint,13,opt,name=front_controller_en,json=frontControllerEn,proto3" json:"front_controller_en,omitempty"` + ImuGpsEn bool `protobuf:"varint,14,opt,name=imu_gps_en,json=imuGpsEn,proto3" json:"imu_gps_en,omitempty"` + ShutdownCircuitEn bool `protobuf:"varint,15,opt,name=shutdown_circuit_en,json=shutdownCircuitEn,proto3" json:"shutdown_circuit_en,omitempty"` + // DCDC System & measurement + DcdcEn bool `protobuf:"varint,16,opt,name=dcdc_en,json=dcdcEn,proto3" json:"dcdc_en,omitempty"` + DcdcSenseSelect bool `protobuf:"varint,17,opt,name=dcdc_sense_select,json=dcdcSenseSelect,proto3" json:"dcdc_sense_select,omitempty"` + // Other + BrakeLightEn bool `protobuf:"varint,18,opt,name=brake_light_en,json=brakeLightEn,proto3" json:"brake_light_en,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Output) Reset() { + *x = Output{} + mi := &file_lvcontroller_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Output) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Output) ProtoMessage() {} + +func (x *Output) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Output.ProtoReflect.Descriptor instead. +func (*Output) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{1} +} + +func (x *Output) GetTssiEn() bool { + if x != nil { + return x.TssiEn + } + return false +} + +func (x *Output) GetTssiRedSignal() bool { + if x != nil { + return x.TssiRedSignal + } + return false +} + +func (x *Output) GetTssiGreenSignal() bool { + if x != nil { + return x.TssiGreenSignal + } + return false +} + +func (x *Output) GetPowertrainPump1En() bool { + if x != nil { + return x.PowertrainPump1En + } + return false +} + +func (x *Output) GetPowertrainPump2En() bool { + if x != nil { + return x.PowertrainPump2En + } + return false +} + +func (x *Output) GetPowertrainFan1En() bool { + if x != nil { + return x.PowertrainFan1En + } + return false +} + +func (x *Output) GetPowertrainFan2En() bool { + if x != nil { + return x.PowertrainFan2En + } + return false +} + +func (x *Output) GetPowertrainFanPwm() *PWM { + if x != nil { + return x.PowertrainFanPwm + } + return nil +} + +func (x *Output) GetMotorControllerEn() bool { + if x != nil { + return x.MotorControllerEn + } + return false +} + +func (x *Output) GetMotorCtrlPrechargeEn() bool { + if x != nil { + return x.MotorCtrlPrechargeEn + } + return false +} + +func (x *Output) GetMotorCtrlSwitchEn() bool { + if x != nil { + return x.MotorCtrlSwitchEn + } + return false +} + +func (x *Output) GetAccumulatorEn() bool { + if x != nil { + return x.AccumulatorEn + } + return false +} + +func (x *Output) GetFrontControllerEn() bool { + if x != nil { + return x.FrontControllerEn + } + return false +} + +func (x *Output) GetImuGpsEn() bool { + if x != nil { + return x.ImuGpsEn + } + return false +} + +func (x *Output) GetShutdownCircuitEn() bool { + if x != nil { + return x.ShutdownCircuitEn + } + return false +} + +func (x *Output) GetDcdcEn() bool { + if x != nil { + return x.DcdcEn + } + return false +} + +func (x *Output) GetDcdcSenseSelect() bool { + if x != nil { + return x.DcdcSenseSelect + } + return false +} + +func (x *Output) GetBrakeLightEn() bool { + if x != nil { + return x.BrakeLightEn + } + return false +} + +type Input struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Tractive system status indicator + ImdFault bool `protobuf:"varint,1,opt,name=imd_fault,json=imdFault,proto3" json:"imd_fault,omitempty"` + BmsFault bool `protobuf:"varint,2,opt,name=bms_fault,json=bmsFault,proto3" json:"bms_fault,omitempty"` + // DCDC System & Measurement + DcdcSense float32 `protobuf:"fixed32,3,opt,name=dcdc_sense,json=dcdcSense,proto3" json:"dcdc_sense,omitempty"` + SuspensionTravel3 float32 `protobuf:"fixed32,4,opt,name=suspension_travel3,json=suspensionTravel3,proto3" json:"suspension_travel3,omitempty"` + SuspensionTravel4 float32 `protobuf:"fixed32,5,opt,name=suspension_travel4,json=suspensionTravel4,proto3" json:"suspension_travel4,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Input) Reset() { + *x = Input{} + mi := &file_lvcontroller_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Input) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Input) ProtoMessage() {} + +func (x *Input) ProtoReflect() protoreflect.Message { + mi := &file_lvcontroller_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Input.ProtoReflect.Descriptor instead. +func (*Input) Descriptor() ([]byte, []int) { + return file_lvcontroller_proto_rawDescGZIP(), []int{2} +} + +func (x *Input) GetImdFault() bool { + if x != nil { + return x.ImdFault + } + return false +} + +func (x *Input) GetBmsFault() bool { + if x != nil { + return x.BmsFault + } + return false +} + +func (x *Input) GetDcdcSense() float32 { + if x != nil { + return x.DcdcSense + } + return 0 +} + +func (x *Input) GetSuspensionTravel3() float32 { + if x != nil { + return x.SuspensionTravel3 + } + return 0 +} + +func (x *Input) GetSuspensionTravel4() float32 { + if x != nil { + return x.SuspensionTravel4 + } + return 0 +} + +var File_lvcontroller_proto protoreflect.FileDescriptor + +const file_lvcontroller_proto_rawDesc = "" + + "\n" + + "\x12lvcontroller.proto\x12\flvcontroller\"G\n" + + "\x03PWM\x12!\n" + + "\ffrequency_hz\x18\x01 \x01(\x02R\vfrequencyHz\x12\x1d\n" + + "\n" + + "duty_cycle\x18\x02 \x01(\x02R\tdutyCycle\"\x9a\x06\n" + + "\x06Output\x12\x17\n" + + "\atssi_en\x18\x01 \x01(\bR\x06tssiEn\x12&\n" + + "\x0ftssi_red_signal\x18\x02 \x01(\bR\rtssiRedSignal\x12*\n" + + "\x11tssi_green_signal\x18\x03 \x01(\bR\x0ftssiGreenSignal\x12.\n" + + "\x13powertrain_pump1_en\x18\x04 \x01(\bR\x11powertrainPump1En\x12.\n" + + "\x13powertrain_pump2_en\x18\x05 \x01(\bR\x11powertrainPump2En\x12,\n" + + "\x12powertrain_fan1_en\x18\x06 \x01(\bR\x10powertrainFan1En\x12,\n" + + "\x12powertrain_fan2_en\x18\a \x01(\bR\x10powertrainFan2En\x12?\n" + + "\x12powertrain_fan_pwm\x18\b \x01(\v2\x11.lvcontroller.PWMR\x10powertrainFanPwm\x12.\n" + + "\x13motor_controller_en\x18\t \x01(\bR\x11motorControllerEn\x125\n" + + "\x17motor_ctrl_precharge_en\x18\n" + + " \x01(\bR\x14motorCtrlPrechargeEn\x12/\n" + + "\x14motor_ctrl_switch_en\x18\v \x01(\bR\x11motorCtrlSwitchEn\x12%\n" + + "\x0eaccumulator_en\x18\f \x01(\bR\raccumulatorEn\x12.\n" + + "\x13front_controller_en\x18\r \x01(\bR\x11frontControllerEn\x12\x1c\n" + + "\n" + + "imu_gps_en\x18\x0e \x01(\bR\bimuGpsEn\x12.\n" + + "\x13shutdown_circuit_en\x18\x0f \x01(\bR\x11shutdownCircuitEn\x12\x17\n" + + "\adcdc_en\x18\x10 \x01(\bR\x06dcdcEn\x12*\n" + + "\x11dcdc_sense_select\x18\x11 \x01(\bR\x0fdcdcSenseSelect\x12$\n" + + "\x0ebrake_light_en\x18\x12 \x01(\bR\fbrakeLightEn\"\xbe\x01\n" + + "\x05Input\x12\x1b\n" + + "\timd_fault\x18\x01 \x01(\bR\bimdFault\x12\x1b\n" + + "\tbms_fault\x18\x02 \x01(\bR\bbmsFault\x12\x1d\n" + + "\n" + + "dcdc_sense\x18\x03 \x01(\x02R\tdcdcSense\x12-\n" + + "\x12suspension_travel3\x18\x04 \x01(\x02R\x11suspensionTravel3\x12-\n" + + "\x12suspension_travel4\x18\x05 \x01(\x02R\x11suspensionTravel4B\vZ\t./gotobufb\x06proto3" + +var ( + file_lvcontroller_proto_rawDescOnce sync.Once + file_lvcontroller_proto_rawDescData []byte +) + +func file_lvcontroller_proto_rawDescGZIP() []byte { + file_lvcontroller_proto_rawDescOnce.Do(func() { + file_lvcontroller_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_lvcontroller_proto_rawDesc), len(file_lvcontroller_proto_rawDesc))) + }) + return file_lvcontroller_proto_rawDescData +} + +var file_lvcontroller_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_lvcontroller_proto_goTypes = []any{ + (*PWM)(nil), // 0: lvcontroller.PWM + (*Output)(nil), // 1: lvcontroller.Output + (*Input)(nil), // 2: lvcontroller.Input +} +var file_lvcontroller_proto_depIdxs = []int32{ + 0, // 0: lvcontroller.Output.powertrain_fan_pwm:type_name -> lvcontroller.PWM + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_lvcontroller_proto_init() } +func file_lvcontroller_proto_init() { + if File_lvcontroller_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_lvcontroller_proto_rawDesc), len(file_lvcontroller_proto_rawDesc)), + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_lvcontroller_proto_goTypes, + DependencyIndexes: file_lvcontroller_proto_depIdxs, + MessageInfos: file_lvcontroller_proto_msgTypes, + }.Build() + File_lvcontroller_proto = out.File + file_lvcontroller_proto_goTypes = nil + file_lvcontroller_proto_depIdxs = nil +} diff --git a/iocontrol/speedgoat/controller.go b/iocontrol/speedgoat/controller.go index ddceea8..82aba09 100644 --- a/iocontrol/speedgoat/controller.go +++ b/iocontrol/speedgoat/controller.go @@ -181,16 +181,6 @@ func (c *Controller) ReadVoltage(input *AnalogPin) (float64, error) { return c.analog[input.index], nil } -// WriteCurrent sets the current of a Speedgoat analog pin (unimplemented for Speedgoat). -func (c *Controller) WriteCurrent(_ *AnalogPin, _ float64) error { - return errors.New("unimplemented function on speedgoat controller") -} - -// ReadCurrent returns the current of a Speedgoat analog pin (unimplemented for Speedgoat). -func (c *Controller) ReadCurrent(_ *AnalogPin) (float64, error) { - return 0.0, errors.New("unimplemented function on speedgoat controller") -} - // tickOutputs transmits the packed data for the digital and analog outputs to the Speedgoat at a set time interval. func (c *Controller) tickOutputs() { ticker := time.NewTicker(_tickTime) diff --git a/macformula/config/config.yaml b/macformula/config/config.yaml index 9050266..18a9f57 100644 --- a/macformula/config/config.yaml +++ b/macformula/config/config.yaml @@ -2,8 +2,8 @@ revision: "sil" canInterfaces: veh: "vcan0" pt: "vcan1" -resultsDir: "macformula/results" -logsDir: "macformula/results/logs" -tagsFilePath: "macformula/config/tags.yaml" +resultsDir: "../../macformula/results" +logsDir: "../../macformula/results/logs" +tagsFilePath: "../../macformula/config/tags.yaml" canTracerTimeoutMinutes: 10 -silPort: 8080 +silPort: 11001 \ No newline at end of file diff --git a/macformula/state/basicio.go b/macformula/state/basicio.go old mode 100644 new mode 100755