Skip to content

Commit

Permalink
ELEC-575: Fix generation of fake data for driver display (#33)
Browse files Browse the repository at this point in the history
- Add function to generate fake CAN messages with source and ID pre-specified.
- Use codegen-tooling to generate new go package, canmsgdefs, that defines CAN message IDs.
- Add function to generate uint64 rawData when passing in several uint8/uint16/uint32.
- Update generation of CAN messages for publishing over message bus.
  • Loading branch information
aaronhktan authored Mar 25, 2019
1 parent c744d03 commit 78b9652
Show file tree
Hide file tree
Showing 4 changed files with 229 additions and 52 deletions.
14 changes: 11 additions & 3 deletions client/src/ts/dd_main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,11 +186,18 @@ ws.onmessage = (event) => {
const msg = JSON.parse(event.data);

switch (msg.id) {
case canDefs.CanMessage.CAN_MESSAGE_BPS_HEARTBEAT:
console.log(event.data);
break;
case canDefs.CanMessage.CAN_MESSAGE_SOLAR_DATA_REAR: // Not working.
// solarReadout.value(msg.data);
const solarRearPower = (msg.data.voltage / 1000) *
(msg.data.current / 1000);
solarReadout.value(solarRearPower);
break;
case canDefs.CanMessage.CAN_MESSAGE_SOLAR_DATA_FRONT: // Not working.
// solarReadout.value(msg.data);
const solarFrontPower = (msg.data.voltage / 1000) *
(msg.data.current / 1000);
solarReadout.value(solarFrontPower);
break;
case canDefs.CanMessage.CAN_MESSAGE_MOTOR_VELOCITY:
// The << 32 >> 32 converts from unsigned to signed.
Expand All @@ -207,6 +214,7 @@ ws.onmessage = (event) => {
case canDefs.CanMessage.CAN_MESSAGE_MOTOR_CONTROLLER_VC:
const power = msg.data.mc_voltage_1 * msg.data.mc_current_1 +
msg.data.mc_voltage_2 * msg.data.mc_current_2;
consumptionReadout.value(power);
break;
case canDefs.CanMessage.CAN_MESSAGE_DRIVE_OUTPUT:
if (msg.data.direction === 0) {
Expand Down Expand Up @@ -270,10 +278,10 @@ ws.onmessage = (event) => {
(converted_voltage).toFixed(1) + ' V';
power_consumption_graph.addData(
{x: msg.timestamp, y: converted_current * converted_voltage});
consumptionReadout.value(power);
batteryDial.value(mapSocPercent(converted_voltage));
break;
default:
console.log(`No handler found: data=${event.data}`);
break;
}
};
74 changes: 74 additions & 0 deletions pkg/canmsgdefs/can_msg_defs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package canmsgdefs

// NOTE: This file is generated by codegen-tooling,
// with minor changes so that Golint doesn't complain.
// Currently, this file is copy-pasted from codegen output.

// TODO: Automate this process.

// CanDeviceID is a 16-bit integer for the source of a CAN message
type CanDeviceID uint16

// CanMsgID is a 32-bit integer for the type of CAN message
type CanMsgID uint32

// For setting the CAN device
const (
SystemCanDeviceReserved CanDeviceID = 0
SystemCanDevicePlutus CanDeviceID = 1
SystemCanDevicePlutusSlave CanDeviceID = 2
SystemCanDeviceChaos CanDeviceID = 3
SystemCanDeviceTelemetry CanDeviceID = 4
SystemCanDeviceLightsFront CanDeviceID = 5
SystemCanDeviceLightsRear CanDeviceID = 6
SystemCanDeviceMotorController CanDeviceID = 7
SystemCanDeviceDriverControls CanDeviceID = 8
SystemCanDeviceDriverDisplay CanDeviceID = 9
SystemCanDeviceSolarMasterFront CanDeviceID = 10
SystemCanDeviceSolarMasterRear CanDeviceID = 11
SystemCanDeviceSensorBoard CanDeviceID = 12
SystemCanDeviceCharger CanDeviceID = 13
)

// For setting the CAN message ID
const (
SystemCanMessageBpsHeartbeat CanMsgID = 0
SystemCanMessagePowerDistributionFault CanMsgID = 1
SystemCanMessageBatteryRelayMain CanMsgID = 2
SystemCanMessageBatteryRelaySlave CanMsgID = 3
SystemCanMessageMotorRelay CanMsgID = 4
SystemCanMessageSolarRelayRear CanMsgID = 5
SystemCanMessageSolarRelayFront CanMsgID = 6
SystemCanMessagePowerState CanMsgID = 7
SystemCanMessagePowertrainHeartbeat CanMsgID = 8
SystemCanMessageMotorControllerReset CanMsgID = 15
SystemCanMessageOvuvDcdcAux CanMsgID = 16
SystemCanMessageMcErrorLimits CanMsgID = 17
SystemCanMessageDriveOutput CanMsgID = 18
SystemCanMessageCruiseTarget CanMsgID = 19
SystemCanMessageFanControl CanMsgID = 20
SystemCanMessageSetDischargeBitset CanMsgID = 21
SystemCanMessageDischargeState CanMsgID = 22
SystemCanMessageLightsSync CanMsgID = 23
SystemCanMessageLightsState CanMsgID = 24
SystemCanMessageHorn CanMsgID = 25
SystemCanMessageChargerConnState CanMsgID = 26
SystemCanMessageChargerSetRelayState CanMsgID = 27
SystemCanMessageSteeringAngle CanMsgID = 28
SystemCanMessageBatterySoc CanMsgID = 31
SystemCanMessageBatteryVt CanMsgID = 32
SystemCanMessageBatteryAggregateVc CanMsgID = 33
SystemCanMessageMotorControllerVc CanMsgID = 35
SystemCanMessageMotorVelocity CanMsgID = 36
SystemCanMessageMotorDebug CanMsgID = 37
SystemCanMessageMotorTemps CanMsgID = 38
SystemCanMessageMotorAmpHr CanMsgID = 39
SystemCanMessageOdometer CanMsgID = 40
SystemCanMessageAuxDcdcVc CanMsgID = 43
SystemCanMessageDcdcTemps CanMsgID = 44
SystemCanMessageSolarDataFront CanMsgID = 45
SystemCanMessageSolarDataRear CanMsgID = 46
SystemCanMessageChargerInfo CanMsgID = 47
SystemCanMessageLinearAcceleration CanMsgID = 51
SystemCanMessageAngularRotation CanMsgID = 52
)
27 changes: 26 additions & 1 deletion pkg/msgs/can_msgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,25 @@ func NewCAN(rawID uint32, rawData uint64, dlc uint8) CAN {
return canMsg
}

// NewFakeCAN creates a CAN struct with an ID already specified.
func NewFakeCAN(source uint8, ID uint16, rawData uint64, dlc uint8) CAN {
var canMsg CAN
canMsg.DLC = dlc
canMsg.Data = make(map[string]interface{})
canMsg.Timestamp = uint64(time.Now().UnixNano()) / uint64(time.Millisecond)
canMsg.Source = source
canMsg.RTR = false
canMsg.ID = ID
srcMsg := findCanMessage(uint32(canMsg.ID))
if srcMsg == nil {
log.Errorf("Error: no matching schema for", canMsg.ID)
canMsg.Data["raw"] = rawData
} else {
unpackByType(rawData, srcMsg, &canMsg)
}
return canMsg
}

func parse(rawID uint32, rawData uint64, canMsg *CAN) {
canMsg.Timestamp = uint64(time.Now().UnixNano()) / uint64(time.Millisecond)
canMsg.Source = uint8(rawID & 0xF)
Expand All @@ -71,7 +90,12 @@ func parse(rawID uint32, rawData uint64, canMsg *CAN) {
if srcMsg == nil {
log.Errorf("Error: no matching schema for", canMsg.ID)
canMsg.Data["raw"] = rawData
return
}
unpackByType(rawData, srcMsg, canMsg)
}

func unpackByType(rawData uint64, srcMsg *canpb.CanMsg, canMsg *CAN) {
switch srcMsg.GetCanData().GetFrame().(type) {
case *canpb.CanData_U8:
data := srcMsg.GetCanData().GetU8()
Expand Down Expand Up @@ -112,7 +136,8 @@ func parse(rawID uint32, rawData uint64, canMsg *CAN) {
data := srcMsg.GetCanData().GetU16()
name := data.GetFieldName_1()
if name != "" {
canMsg.Data[name] = extractData(rawData, 0xFFFF, 1, 16)
value := extractData(rawData, 0xFFFF, 1, 16)
canMsg.Data[name] = value
}
name = data.GetFieldName_2()
if name != "" {
Expand Down
Loading

0 comments on commit 78b9652

Please sign in to comment.