gotelem/skylab/skylab_gen.go
saji c4bdf122a8 major cleanup/refactor
delete mprpc
move can frame to it's own library
create CANID type (better extended id support)
rework database format, only uses name + json now
busEvent and rawJsonEvent don't store the Id anymore
2024-02-12 09:45:23 -06:00

5935 lines
179 KiB
Go

// generated by gen_skylab.go at 2024-02-12 01:42:40.427923631 -0600 CST m=+0.004005217 DO NOT EDIT!
package skylab
import (
"errors"
"encoding/binary"
"github.com/kschamplin/gotelem/internal/can"
"encoding/json"
)
type SkylabId uint32
const (
BmsMeasurementId SkylabId = 0x10
BatteryStatusId SkylabId = 0x11
BmsKillReasonId SkylabId = 0x12
BmsModuleMinMaxId SkylabId = 0x13
BmsSocId SkylabId = 0x14
BmsCapacityId SkylabId = 0x15
BmsCurrentlimitId SkylabId = 0x18
BmsFanInfoId SkylabId = 0x19
BmsSetMinFanSpeedId SkylabId = 0x1B
BmsModuleId SkylabId = 0x40
BmsChargerResponseId SkylabId = 0x75
ChassisIsolationFaultId SkylabId = 0x38
BmsImdInfoId SkylabId = 0x37
DashboardPedalPercentagesId SkylabId = 0x290
CarStateId SkylabId = 0x291
DashboardPedalFaultId SkylabId = 0x292
DashboardSystemTimeoutTestId SkylabId = 0x299
CarSpeedId SkylabId = 0x29A
FlightComputerLvBoardDisconnectCountsId SkylabId = 0x29B
FlightComputerHvBoardDisconnectCountsId SkylabId = 0x29C
FlightComputerInternalStateId SkylabId = 0x29D
PowerToDriveId SkylabId = 0x19E
ArrayPowerId SkylabId = 0x19F
ArrayEnergyId SkylabId = 0x119
ArrayEnergyResetId SkylabId = 0x120
VisionTurnSignalsCommandId SkylabId = 0x2B0
VisionBrakeLightsCommandId SkylabId = 0x2B1
VisionHeadlightsCommandId SkylabId = 0x2B2
VisionHornCommandId SkylabId = 0x2B3
VisionArrayLatchesCommandId SkylabId = 0x2B4
VisionRearviewCommandId SkylabId = 0x2B5
TrackerEnableId SkylabId = 0x610
DistanceTraveledId SkylabId = 0x19D
ChargerStateId SkylabId = 0x573
ChargerBmsRequestId SkylabId = 0x74
ChargerCurrentVoltageId SkylabId = 0x576
ChargerPowerId SkylabId = 0x577
ThunderstruckControlMessageId SkylabId = 0x18E54024
VisionStatusFrontId SkylabId = 0x2B6
VisionStatusRearId SkylabId = 0x2B7
LightsFrontIdId SkylabId = 0x300
LightsBackIdId SkylabId = 0x301
VisionIdId SkylabId = 0x302
SteeringPressCount1Id SkylabId = 0x240
SteeringPressCount2Id SkylabId = 0x250
SteeringButtonColors1Id SkylabId = 0x241
SteeringButtonColors2Id SkylabId = 0x251
SteeringHornId SkylabId = 0x242
ThunderstruckStatusMessageId SkylabId = 0x18EB2440
TrackerDataId SkylabId = 0x600
TritiumMotorDriveLId SkylabId = 0x121
TritiumMotorPowerLId SkylabId = 0x122
TritiumResetLId SkylabId = 0x123
TritiumMotorDriveRId SkylabId = 0x161
TritiumMotorPowerRId SkylabId = 0x162
TritiumResetRId SkylabId = 0x163
BmsAhSetId SkylabId = 0x16
BmsWhSetId SkylabId = 0x17
BmsKillId SkylabId = 0x1A
TelemetryRtcResetId SkylabId = 0x700
WsrIdentificationId SkylabId = 0x140
WsrStatusInformationId SkylabId = 0x141
WsrBusMeasurementId SkylabId = 0x142
WsrVelocityId SkylabId = 0x143
WsrPhaseCurrentId SkylabId = 0x144
WsrMotorVoltageVectorId SkylabId = 0x145
WsrMotorCurrentVectorId SkylabId = 0x146
WsrMotorBackemfId SkylabId = 0x147
Wsr15165VoltageRailId SkylabId = 0x148
Wsr2512VoltageRailId SkylabId = 0x149
WsrHeatsinkMotorTempId SkylabId = 0x14B
WsrDspBoardTempId SkylabId = 0x14C
WsrReservedId SkylabId = 0x14D
WsrOdometerBusAmphoursMeasurementId SkylabId = 0x14E
WsrSlipSpeedMeasurementId SkylabId = 0x157
WslIdentificationId SkylabId = 0x100
WslStatusInformationId SkylabId = 0x101
WslBusMeasurementId SkylabId = 0x102
WslVelocityId SkylabId = 0x103
WslPhaseCurrentId SkylabId = 0x104
WslMotorVoltageVectorId SkylabId = 0x105
WslMotorCurrentVectorId SkylabId = 0x106
WslMotorBackemfId SkylabId = 0x107
Wsl15165VoltageRailId SkylabId = 0x108
Wsl2512VoltageRailId SkylabId = 0x109
WslHeatsinkMotorTempId SkylabId = 0x10B
WslDspBoardTempId SkylabId = 0x10C
WslOdometerBusAmphoursMeasurementId SkylabId = 0x10E
WslReservedId SkylabId = 0x10D
WslSlipSpeedMeasurementId SkylabId = 0x117
)
var nameToIdMap = map[string]can.CanID{
}
// list of every packet ID. can be used for O(1) checks.
var idMap = map[can.CanID]bool{
can.CanID{ Id: 0x10, Extended: false }: true,
can.CanID{ Id: 0x11, Extended: false }: true,
can.CanID{ Id: 0x12, Extended: false }: true,
can.CanID{ Id: 0x13, Extended: false }: true,
can.CanID{ Id: 0x14, Extended: false }: true,
can.CanID{ Id: 0x15, Extended: false }: true,
can.CanID{ Id: 0x18, Extended: false }: true,
can.CanID{ Id: 0x19, Extended: false }: true,
can.CanID{ Id: 0x1B, Extended: false }: true,
can.CanID{ Id: 0x40, Extended: false }: true,
can.CanID{ Id: 0x41, Extended: false }: true,
can.CanID{ Id: 0x42, Extended: false }: true,
can.CanID{ Id: 0x43, Extended: false }: true,
can.CanID{ Id: 0x44, Extended: false }: true,
can.CanID{ Id: 0x45, Extended: false }: true,
can.CanID{ Id: 0x46, Extended: false }: true,
can.CanID{ Id: 0x47, Extended: false }: true,
can.CanID{ Id: 0x48, Extended: false }: true,
can.CanID{ Id: 0x49, Extended: false }: true,
can.CanID{ Id: 0x4A, Extended: false }: true,
can.CanID{ Id: 0x4B, Extended: false }: true,
can.CanID{ Id: 0x4C, Extended: false }: true,
can.CanID{ Id: 0x4D, Extended: false }: true,
can.CanID{ Id: 0x4E, Extended: false }: true,
can.CanID{ Id: 0x4F, Extended: false }: true,
can.CanID{ Id: 0x50, Extended: false }: true,
can.CanID{ Id: 0x51, Extended: false }: true,
can.CanID{ Id: 0x52, Extended: false }: true,
can.CanID{ Id: 0x53, Extended: false }: true,
can.CanID{ Id: 0x54, Extended: false }: true,
can.CanID{ Id: 0x55, Extended: false }: true,
can.CanID{ Id: 0x56, Extended: false }: true,
can.CanID{ Id: 0x57, Extended: false }: true,
can.CanID{ Id: 0x58, Extended: false }: true,
can.CanID{ Id: 0x59, Extended: false }: true,
can.CanID{ Id: 0x5A, Extended: false }: true,
can.CanID{ Id: 0x5B, Extended: false }: true,
can.CanID{ Id: 0x5C, Extended: false }: true,
can.CanID{ Id: 0x5D, Extended: false }: true,
can.CanID{ Id: 0x5E, Extended: false }: true,
can.CanID{ Id: 0x5F, Extended: false }: true,
can.CanID{ Id: 0x60, Extended: false }: true,
can.CanID{ Id: 0x61, Extended: false }: true,
can.CanID{ Id: 0x62, Extended: false }: true,
can.CanID{ Id: 0x63, Extended: false }: true,
can.CanID{ Id: 0x75, Extended: false }: true,
can.CanID{ Id: 0x38, Extended: false }: true,
can.CanID{ Id: 0x37, Extended: false }: true,
can.CanID{ Id: 0x290, Extended: false }: true,
can.CanID{ Id: 0x291, Extended: false }: true,
can.CanID{ Id: 0x292, Extended: false }: true,
can.CanID{ Id: 0x299, Extended: false }: true,
can.CanID{ Id: 0x29A, Extended: false }: true,
can.CanID{ Id: 0x29B, Extended: false }: true,
can.CanID{ Id: 0x29C, Extended: false }: true,
can.CanID{ Id: 0x29D, Extended: false }: true,
can.CanID{ Id: 0x19E, Extended: false }: true,
can.CanID{ Id: 0x19F, Extended: false }: true,
can.CanID{ Id: 0x119, Extended: false }: true,
can.CanID{ Id: 0x120, Extended: false }: true,
can.CanID{ Id: 0x2B0, Extended: false }: true,
can.CanID{ Id: 0x2B1, Extended: false }: true,
can.CanID{ Id: 0x2B2, Extended: false }: true,
can.CanID{ Id: 0x2B3, Extended: false }: true,
can.CanID{ Id: 0x2B4, Extended: false }: true,
can.CanID{ Id: 0x2B5, Extended: false }: true,
can.CanID{ Id: 0x610, Extended: false }: true,
can.CanID{ Id: 0x611, Extended: false }: true,
can.CanID{ Id: 0x612, Extended: false }: true,
can.CanID{ Id: 0x613, Extended: false }: true,
can.CanID{ Id: 0x614, Extended: false }: true,
can.CanID{ Id: 0x615, Extended: false }: true,
can.CanID{ Id: 0x19D, Extended: false }: true,
can.CanID{ Id: 0x573, Extended: false }: true,
can.CanID{ Id: 0x74, Extended: false }: true,
can.CanID{ Id: 0x576, Extended: false }: true,
can.CanID{ Id: 0x577, Extended: false }: true,
can.CanID{ Id: 0x18E54024, Extended: true }: true,
can.CanID{ Id: 0x2B6, Extended: false }: true,
can.CanID{ Id: 0x2B7, Extended: false }: true,
can.CanID{ Id: 0x300, Extended: false }: true,
can.CanID{ Id: 0x301, Extended: false }: true,
can.CanID{ Id: 0x302, Extended: false }: true,
can.CanID{ Id: 0x240, Extended: false }: true,
can.CanID{ Id: 0x250, Extended: false }: true,
can.CanID{ Id: 0x241, Extended: false }: true,
can.CanID{ Id: 0x251, Extended: false }: true,
can.CanID{ Id: 0x242, Extended: false }: true,
can.CanID{ Id: 0x18EB2440, Extended: true }: true,
can.CanID{ Id: 0x600, Extended: false }: true,
can.CanID{ Id: 0x601, Extended: false }: true,
can.CanID{ Id: 0x602, Extended: false }: true,
can.CanID{ Id: 0x603, Extended: false }: true,
can.CanID{ Id: 0x604, Extended: false }: true,
can.CanID{ Id: 0x605, Extended: false }: true,
can.CanID{ Id: 0x121, Extended: false }: true,
can.CanID{ Id: 0x122, Extended: false }: true,
can.CanID{ Id: 0x123, Extended: false }: true,
can.CanID{ Id: 0x161, Extended: false }: true,
can.CanID{ Id: 0x162, Extended: false }: true,
can.CanID{ Id: 0x163, Extended: false }: true,
can.CanID{ Id: 0x16, Extended: false }: true,
can.CanID{ Id: 0x17, Extended: false }: true,
can.CanID{ Id: 0x1A, Extended: false }: true,
can.CanID{ Id: 0x700, Extended: false }: true,
can.CanID{ Id: 0x140, Extended: false }: true,
can.CanID{ Id: 0x141, Extended: false }: true,
can.CanID{ Id: 0x142, Extended: false }: true,
can.CanID{ Id: 0x143, Extended: false }: true,
can.CanID{ Id: 0x144, Extended: false }: true,
can.CanID{ Id: 0x145, Extended: false }: true,
can.CanID{ Id: 0x146, Extended: false }: true,
can.CanID{ Id: 0x147, Extended: false }: true,
can.CanID{ Id: 0x148, Extended: false }: true,
can.CanID{ Id: 0x149, Extended: false }: true,
can.CanID{ Id: 0x14B, Extended: false }: true,
can.CanID{ Id: 0x14C, Extended: false }: true,
can.CanID{ Id: 0x14D, Extended: false }: true,
can.CanID{ Id: 0x14E, Extended: false }: true,
can.CanID{ Id: 0x157, Extended: false }: true,
can.CanID{ Id: 0x100, Extended: false }: true,
can.CanID{ Id: 0x101, Extended: false }: true,
can.CanID{ Id: 0x102, Extended: false }: true,
can.CanID{ Id: 0x103, Extended: false }: true,
can.CanID{ Id: 0x104, Extended: false }: true,
can.CanID{ Id: 0x105, Extended: false }: true,
can.CanID{ Id: 0x106, Extended: false }: true,
can.CanID{ Id: 0x107, Extended: false }: true,
can.CanID{ Id: 0x108, Extended: false }: true,
can.CanID{ Id: 0x109, Extended: false }: true,
can.CanID{ Id: 0x10B, Extended: false }: true,
can.CanID{ Id: 0x10C, Extended: false }: true,
can.CanID{ Id: 0x10E, Extended: false }: true,
can.CanID{ Id: 0x10D, Extended: false }: true,
can.CanID{ Id: 0x117, Extended: false }: true,
}
// FromCanFrame creates a Packet from a given CAN ID and data payload.
// If the CAN ID is unknown, it will return an error.
func FromCanFrame(f can.Frame) (Packet, error) {
id := f.Id
if !idMap[id] {
return nil, &UnknownIdError{ id.Id }
}
switch id {
case can.CanID{ Id: 0x10, Extended: false }:
var res = &BmsMeasurement{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x11, Extended: false }:
var res = &BatteryStatus{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x12, Extended: false }:
var res = &BmsKillReason{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x13, Extended: false }:
var res = &BmsModuleMinMax{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x14, Extended: false }:
var res = &BmsSoc{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x15, Extended: false }:
var res = &BmsCapacity{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x18, Extended: false }:
var res = &BmsCurrentlimit{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x19, Extended: false }:
var res = &BmsFanInfo{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x1B, Extended: false }:
var res = &BmsSetMinFanSpeed{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x40, Extended: false },can.CanID{ Id: 0x41, Extended: false },can.CanID{ Id: 0x42, Extended: false },can.CanID{ Id: 0x43, Extended: false },can.CanID{ Id: 0x44, Extended: false },can.CanID{ Id: 0x45, Extended: false },can.CanID{ Id: 0x46, Extended: false },can.CanID{ Id: 0x47, Extended: false },can.CanID{ Id: 0x48, Extended: false },can.CanID{ Id: 0x49, Extended: false },can.CanID{ Id: 0x4A, Extended: false },can.CanID{ Id: 0x4B, Extended: false },can.CanID{ Id: 0x4C, Extended: false },can.CanID{ Id: 0x4D, Extended: false },can.CanID{ Id: 0x4E, Extended: false },can.CanID{ Id: 0x4F, Extended: false },can.CanID{ Id: 0x50, Extended: false },can.CanID{ Id: 0x51, Extended: false },can.CanID{ Id: 0x52, Extended: false },can.CanID{ Id: 0x53, Extended: false },can.CanID{ Id: 0x54, Extended: false },can.CanID{ Id: 0x55, Extended: false },can.CanID{ Id: 0x56, Extended: false },can.CanID{ Id: 0x57, Extended: false },can.CanID{ Id: 0x58, Extended: false },can.CanID{ Id: 0x59, Extended: false },can.CanID{ Id: 0x5A, Extended: false },can.CanID{ Id: 0x5B, Extended: false },can.CanID{ Id: 0x5C, Extended: false },can.CanID{ Id: 0x5D, Extended: false },can.CanID{ Id: 0x5E, Extended: false },can.CanID{ Id: 0x5F, Extended: false },can.CanID{ Id: 0x60, Extended: false },can.CanID{ Id: 0x61, Extended: false },can.CanID{ Id: 0x62, Extended: false },can.CanID{ Id: 0x63, Extended: false }:
var res = &BmsModule{}
res.UnmarshalPacket(f.Data)
res.Idx = id.Id - 0x40
return res, nil
case can.CanID{ Id: 0x75, Extended: false }:
var res = &BmsChargerResponse{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x38, Extended: false }:
var res = &ChassisIsolationFault{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x37, Extended: false }:
var res = &BmsImdInfo{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x290, Extended: false }:
var res = &DashboardPedalPercentages{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x291, Extended: false }:
var res = &CarState{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x292, Extended: false }:
var res = &DashboardPedalFault{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x299, Extended: false }:
var res = &DashboardSystemTimeoutTest{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x29A, Extended: false }:
var res = &CarSpeed{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x29B, Extended: false }:
var res = &FlightComputerLvBoardDisconnectCounts{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x29C, Extended: false }:
var res = &FlightComputerHvBoardDisconnectCounts{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x29D, Extended: false }:
var res = &FlightComputerInternalState{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x19E, Extended: false }:
var res = &PowerToDrive{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x19F, Extended: false }:
var res = &ArrayPower{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x119, Extended: false }:
var res = &ArrayEnergy{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x120, Extended: false }:
var res = &ArrayEnergyReset{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x2B0, Extended: false }:
var res = &VisionTurnSignalsCommand{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x2B1, Extended: false }:
var res = &VisionBrakeLightsCommand{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x2B2, Extended: false }:
var res = &VisionHeadlightsCommand{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x2B3, Extended: false }:
var res = &VisionHornCommand{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x2B4, Extended: false }:
var res = &VisionArrayLatchesCommand{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x2B5, Extended: false }:
var res = &VisionRearviewCommand{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x610, Extended: false },can.CanID{ Id: 0x611, Extended: false },can.CanID{ Id: 0x612, Extended: false },can.CanID{ Id: 0x613, Extended: false },can.CanID{ Id: 0x614, Extended: false },can.CanID{ Id: 0x615, Extended: false }:
var res = &TrackerEnable{}
res.UnmarshalPacket(f.Data)
res.Idx = id.Id - 0x610
return res, nil
case can.CanID{ Id: 0x19D, Extended: false }:
var res = &DistanceTraveled{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x573, Extended: false }:
var res = &ChargerState{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x74, Extended: false }:
var res = &ChargerBmsRequest{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x576, Extended: false }:
var res = &ChargerCurrentVoltage{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x577, Extended: false }:
var res = &ChargerPower{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x18E54024, Extended: true }:
var res = &ThunderstruckControlMessage{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x2B6, Extended: false }:
var res = &VisionStatusFront{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x2B7, Extended: false }:
var res = &VisionStatusRear{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x300, Extended: false }:
var res = &LightsFrontId{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x301, Extended: false }:
var res = &LightsBackId{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x302, Extended: false }:
var res = &VisionId{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x240, Extended: false }:
var res = &SteeringPressCount1{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x250, Extended: false }:
var res = &SteeringPressCount2{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x241, Extended: false }:
var res = &SteeringButtonColors1{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x251, Extended: false }:
var res = &SteeringButtonColors2{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x242, Extended: false }:
var res = &SteeringHorn{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x18EB2440, Extended: true }:
var res = &ThunderstruckStatusMessage{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x600, Extended: false },can.CanID{ Id: 0x601, Extended: false },can.CanID{ Id: 0x602, Extended: false },can.CanID{ Id: 0x603, Extended: false },can.CanID{ Id: 0x604, Extended: false },can.CanID{ Id: 0x605, Extended: false }:
var res = &TrackerData{}
res.UnmarshalPacket(f.Data)
res.Idx = id.Id - 0x600
return res, nil
case can.CanID{ Id: 0x121, Extended: false }:
var res = &TritiumMotorDriveL{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x122, Extended: false }:
var res = &TritiumMotorPowerL{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x123, Extended: false }:
var res = &TritiumResetL{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x161, Extended: false }:
var res = &TritiumMotorDriveR{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x162, Extended: false }:
var res = &TritiumMotorPowerR{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x163, Extended: false }:
var res = &TritiumResetR{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x16, Extended: false }:
var res = &BmsAhSet{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x17, Extended: false }:
var res = &BmsWhSet{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x1A, Extended: false }:
var res = &BmsKill{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x700, Extended: false }:
var res = &TelemetryRtcReset{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x140, Extended: false }:
var res = &WsrIdentification{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x141, Extended: false }:
var res = &WsrStatusInformation{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x142, Extended: false }:
var res = &WsrBusMeasurement{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x143, Extended: false }:
var res = &WsrVelocity{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x144, Extended: false }:
var res = &WsrPhaseCurrent{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x145, Extended: false }:
var res = &WsrMotorVoltageVector{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x146, Extended: false }:
var res = &WsrMotorCurrentVector{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x147, Extended: false }:
var res = &WsrMotorBackemf{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x148, Extended: false }:
var res = &Wsr15165VoltageRail{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x149, Extended: false }:
var res = &Wsr2512VoltageRail{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x14B, Extended: false }:
var res = &WsrHeatsinkMotorTemp{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x14C, Extended: false }:
var res = &WsrDspBoardTemp{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x14D, Extended: false }:
var res = &WsrReserved{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x14E, Extended: false }:
var res = &WsrOdometerBusAmphoursMeasurement{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x157, Extended: false }:
var res = &WsrSlipSpeedMeasurement{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x100, Extended: false }:
var res = &WslIdentification{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x101, Extended: false }:
var res = &WslStatusInformation{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x102, Extended: false }:
var res = &WslBusMeasurement{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x103, Extended: false }:
var res = &WslVelocity{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x104, Extended: false }:
var res = &WslPhaseCurrent{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x105, Extended: false }:
var res = &WslMotorVoltageVector{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x106, Extended: false }:
var res = &WslMotorCurrentVector{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x107, Extended: false }:
var res = &WslMotorBackemf{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x108, Extended: false }:
var res = &Wsl15165VoltageRail{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x109, Extended: false }:
var res = &Wsl2512VoltageRail{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x10B, Extended: false }:
var res = &WslHeatsinkMotorTemp{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x10C, Extended: false }:
var res = &WslDspBoardTemp{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x10E, Extended: false }:
var res = &WslOdometerBusAmphoursMeasurement{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x10D, Extended: false }:
var res = &WslReserved{}
res.UnmarshalPacket(f.Data)
return res, nil
case can.CanID{ Id: 0x117, Extended: false }:
var res = &WslSlipSpeedMeasurement{}
res.UnmarshalPacket(f.Data)
return res, nil
}
panic("This should never happen. CAN ID didn't match but was in ID map")
}
func FromJson (name string, raw []byte) (Packet, error) {
switch name {
case "bms_measurement":
var res = &BmsMeasurement{}
err := json.Unmarshal(raw, res)
return res, err
case "battery_status":
var res = &BatteryStatus{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_kill_reason":
var res = &BmsKillReason{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_module_min_max":
var res = &BmsModuleMinMax{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_soc":
var res = &BmsSoc{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_capacity":
var res = &BmsCapacity{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_currentlimit":
var res = &BmsCurrentlimit{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_fan_info":
var res = &BmsFanInfo{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_set_min_fan_speed":
var res = &BmsSetMinFanSpeed{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_module":
var res = &BmsModule{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_charger_response":
var res = &BmsChargerResponse{}
err := json.Unmarshal(raw, res)
return res, err
case "chassis_isolation_fault":
var res = &ChassisIsolationFault{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_imd_info":
var res = &BmsImdInfo{}
err := json.Unmarshal(raw, res)
return res, err
case "dashboard_pedal_percentages":
var res = &DashboardPedalPercentages{}
err := json.Unmarshal(raw, res)
return res, err
case "car_state":
var res = &CarState{}
err := json.Unmarshal(raw, res)
return res, err
case "dashboard_pedal_fault":
var res = &DashboardPedalFault{}
err := json.Unmarshal(raw, res)
return res, err
case "dashboard_system_timeout_test":
var res = &DashboardSystemTimeoutTest{}
err := json.Unmarshal(raw, res)
return res, err
case "car_speed":
var res = &CarSpeed{}
err := json.Unmarshal(raw, res)
return res, err
case "flight_computer_lv_board_disconnect_counts":
var res = &FlightComputerLvBoardDisconnectCounts{}
err := json.Unmarshal(raw, res)
return res, err
case "flight_computer_hv_board_disconnect_counts":
var res = &FlightComputerHvBoardDisconnectCounts{}
err := json.Unmarshal(raw, res)
return res, err
case "flight_computer_internal_state":
var res = &FlightComputerInternalState{}
err := json.Unmarshal(raw, res)
return res, err
case "power_to_drive":
var res = &PowerToDrive{}
err := json.Unmarshal(raw, res)
return res, err
case "array_power":
var res = &ArrayPower{}
err := json.Unmarshal(raw, res)
return res, err
case "array_energy":
var res = &ArrayEnergy{}
err := json.Unmarshal(raw, res)
return res, err
case "array_energy_reset":
var res = &ArrayEnergyReset{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_turn_signals_command":
var res = &VisionTurnSignalsCommand{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_brake_lights_command":
var res = &VisionBrakeLightsCommand{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_headlights_command":
var res = &VisionHeadlightsCommand{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_horn_command":
var res = &VisionHornCommand{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_array_latches_command":
var res = &VisionArrayLatchesCommand{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_rearview_command":
var res = &VisionRearviewCommand{}
err := json.Unmarshal(raw, res)
return res, err
case "tracker_enable":
var res = &TrackerEnable{}
err := json.Unmarshal(raw, res)
return res, err
case "distance_traveled":
var res = &DistanceTraveled{}
err := json.Unmarshal(raw, res)
return res, err
case "charger_state":
var res = &ChargerState{}
err := json.Unmarshal(raw, res)
return res, err
case "charger_bms_request":
var res = &ChargerBmsRequest{}
err := json.Unmarshal(raw, res)
return res, err
case "charger_current_voltage":
var res = &ChargerCurrentVoltage{}
err := json.Unmarshal(raw, res)
return res, err
case "charger_power":
var res = &ChargerPower{}
err := json.Unmarshal(raw, res)
return res, err
case "thunderstruck_control_message":
var res = &ThunderstruckControlMessage{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_status_front":
var res = &VisionStatusFront{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_status_rear":
var res = &VisionStatusRear{}
err := json.Unmarshal(raw, res)
return res, err
case "lights_front_id":
var res = &LightsFrontId{}
err := json.Unmarshal(raw, res)
return res, err
case "lights_back_id":
var res = &LightsBackId{}
err := json.Unmarshal(raw, res)
return res, err
case "vision_id":
var res = &VisionId{}
err := json.Unmarshal(raw, res)
return res, err
case "steering_press_count_1":
var res = &SteeringPressCount1{}
err := json.Unmarshal(raw, res)
return res, err
case "steering_press_count_2":
var res = &SteeringPressCount2{}
err := json.Unmarshal(raw, res)
return res, err
case "steering_button_colors_1":
var res = &SteeringButtonColors1{}
err := json.Unmarshal(raw, res)
return res, err
case "steering_button_colors_2":
var res = &SteeringButtonColors2{}
err := json.Unmarshal(raw, res)
return res, err
case "steering_horn":
var res = &SteeringHorn{}
err := json.Unmarshal(raw, res)
return res, err
case "thunderstruck_status_message":
var res = &ThunderstruckStatusMessage{}
err := json.Unmarshal(raw, res)
return res, err
case "tracker_data":
var res = &TrackerData{}
err := json.Unmarshal(raw, res)
return res, err
case "tritium_motor_drive_l":
var res = &TritiumMotorDriveL{}
err := json.Unmarshal(raw, res)
return res, err
case "tritium_motor_power_l":
var res = &TritiumMotorPowerL{}
err := json.Unmarshal(raw, res)
return res, err
case "tritium_reset_l":
var res = &TritiumResetL{}
err := json.Unmarshal(raw, res)
return res, err
case "tritium_motor_drive_r":
var res = &TritiumMotorDriveR{}
err := json.Unmarshal(raw, res)
return res, err
case "tritium_motor_power_r":
var res = &TritiumMotorPowerR{}
err := json.Unmarshal(raw, res)
return res, err
case "tritium_reset_r":
var res = &TritiumResetR{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_ah_set":
var res = &BmsAhSet{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_wh_set":
var res = &BmsWhSet{}
err := json.Unmarshal(raw, res)
return res, err
case "bms_kill":
var res = &BmsKill{}
err := json.Unmarshal(raw, res)
return res, err
case "telemetry_rtc_reset":
var res = &TelemetryRtcReset{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_identification":
var res = &WsrIdentification{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_status_information":
var res = &WsrStatusInformation{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_bus_measurement":
var res = &WsrBusMeasurement{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_velocity":
var res = &WsrVelocity{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_phase_current":
var res = &WsrPhaseCurrent{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_motor_voltage_vector":
var res = &WsrMotorVoltageVector{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_motor_current_vector":
var res = &WsrMotorCurrentVector{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_motor_backemf":
var res = &WsrMotorBackemf{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_15_165_voltage_rail":
var res = &Wsr15165VoltageRail{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_25_12_voltage_rail":
var res = &Wsr2512VoltageRail{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_heatsink_motor_temp":
var res = &WsrHeatsinkMotorTemp{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_dsp_board_temp":
var res = &WsrDspBoardTemp{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_reserved":
var res = &WsrReserved{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_odometer_bus_amphours_measurement":
var res = &WsrOdometerBusAmphoursMeasurement{}
err := json.Unmarshal(raw, res)
return res, err
case "wsr_slip_speed_measurement":
var res = &WsrSlipSpeedMeasurement{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_identification":
var res = &WslIdentification{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_status_information":
var res = &WslStatusInformation{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_bus_measurement":
var res = &WslBusMeasurement{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_velocity":
var res = &WslVelocity{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_phase_current":
var res = &WslPhaseCurrent{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_motor_voltage_vector":
var res = &WslMotorVoltageVector{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_motor_current_vector":
var res = &WslMotorCurrentVector{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_motor_backemf":
var res = &WslMotorBackemf{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_15_165_voltage_rail":
var res = &Wsl15165VoltageRail{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_25_12_voltage_rail":
var res = &Wsl2512VoltageRail{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_heatsink_motor_temp":
var res = &WslHeatsinkMotorTemp{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_dsp_board_temp":
var res = &WslDspBoardTemp{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_odometer_bus_amphours_measurement":
var res = &WslOdometerBusAmphoursMeasurement{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_reserved":
var res = &WslReserved{}
err := json.Unmarshal(raw, res)
return res, err
case "wsl_slip_speed_measurement":
var res = &WslSlipSpeedMeasurement{}
err := json.Unmarshal(raw, res)
return res, err
}
return nil, errors.New("unknown packet name")
}
// BmsMeasurement is Voltages for main battery and aux pack
type BmsMeasurement struct {
// 0.01 V
BatteryVoltage uint16 `json:"battery_voltage"`
// 0.001 V
AuxVoltage uint16 `json:"aux_voltage"`
// 1 A
Current float32 `json:"current"`
}
func (p *BmsMeasurement) CANId() (uint32, error) {
return 0x10, nil
}
func (p *BmsMeasurement) Size() uint {
return 8
}
func (p *BmsMeasurement) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint16(b[0:], p.BatteryVoltage)
binary.LittleEndian.PutUint16(b[2:], p.AuxVoltage)
float32ToBytes(b[4:], p.Current, false)
return b, nil
}
func (p *BmsMeasurement) UnmarshalPacket(b []byte) error {
p.BatteryVoltage = binary.LittleEndian.Uint16(b[0:])
p.AuxVoltage = binary.LittleEndian.Uint16(b[2:])
p.Current = float32FromBytes(b[4:], false)
return nil
}
func (p *BmsMeasurement) String() string {
return "bms_measurement"
}
type BatteryStatusBatteryState struct {
Startup bool `json:"startup"`
Precharge bool `json:"precharge"`
Discharging bool `json:"discharging"`
LvOnly bool `json:"lv_only"`
Charging bool `json:"charging"`
WallCharging bool `json:"wall_charging"`
Killed bool `json:"killed"`
}
func (p *BatteryStatusBatteryState) MarshalByte() byte {
var b byte
if p.Startup {
b |= 1 << 0
}
if p.Precharge {
b |= 1 << 1
}
if p.Discharging {
b |= 1 << 2
}
if p.LvOnly {
b |= 1 << 3
}
if p.Charging {
b |= 1 << 4
}
if p.WallCharging {
b |= 1 << 5
}
if p.Killed {
b |= 1 << 6
}
return b
}
func (p *BatteryStatusBatteryState) UnmarshalByte(b byte) {
p.Startup = (b & (1 << 0)) != 0
p.Precharge = (b & (1 << 1)) != 0
p.Discharging = (b & (1 << 2)) != 0
p.LvOnly = (b & (1 << 3)) != 0
p.Charging = (b & (1 << 4)) != 0
p.WallCharging = (b & (1 << 5)) != 0
p.Killed = (b & (1 << 6)) != 0
}
type BatteryStatusContactorState struct {
BatteryHighContactor bool `json:"battery_high_contactor"`
BatteryLowContactor bool `json:"battery_low_contactor"`
BatteryVicorContactor bool `json:"battery_vicor_contactor"`
BatteryPreContactor bool `json:"battery_pre_contactor"`
BatteryHigh2Contactor bool `json:"battery_high2_contactor"`
BatteryLow2Contactor bool `json:"battery_low2_contactor"`
ChargerHighContactor bool `json:"charger_high_contactor"`
ChargerPreContactor bool `json:"charger_pre_contactor"`
}
func (p *BatteryStatusContactorState) MarshalByte() byte {
var b byte
if p.BatteryHighContactor {
b |= 1 << 0
}
if p.BatteryLowContactor {
b |= 1 << 1
}
if p.BatteryVicorContactor {
b |= 1 << 2
}
if p.BatteryPreContactor {
b |= 1 << 3
}
if p.BatteryHigh2Contactor {
b |= 1 << 4
}
if p.BatteryLow2Contactor {
b |= 1 << 5
}
if p.ChargerHighContactor {
b |= 1 << 6
}
if p.ChargerPreContactor {
b |= 1 << 7
}
return b
}
func (p *BatteryStatusContactorState) UnmarshalByte(b byte) {
p.BatteryHighContactor = (b & (1 << 0)) != 0
p.BatteryLowContactor = (b & (1 << 1)) != 0
p.BatteryVicorContactor = (b & (1 << 2)) != 0
p.BatteryPreContactor = (b & (1 << 3)) != 0
p.BatteryHigh2Contactor = (b & (1 << 4)) != 0
p.BatteryLow2Contactor = (b & (1 << 5)) != 0
p.ChargerHighContactor = (b & (1 << 6)) != 0
p.ChargerPreContactor = (b & (1 << 7)) != 0
}
type BatteryStatusLvChannelStatus struct {
AuxFault bool `json:"aux_fault"`
MainFault bool `json:"main_fault"`
AuxPowerValid bool `json:"aux_power_valid"`
MainPowerValid bool `json:"main_power_valid"`
AuxPowerActive bool `json:"aux_power_active"`
MainPowerActive bool `json:"main_power_active"`
}
func (p *BatteryStatusLvChannelStatus) MarshalByte() byte {
var b byte
if p.AuxFault {
b |= 1 << 0
}
if p.MainFault {
b |= 1 << 1
}
if p.AuxPowerValid {
b |= 1 << 2
}
if p.MainPowerValid {
b |= 1 << 3
}
if p.AuxPowerActive {
b |= 1 << 4
}
if p.MainPowerActive {
b |= 1 << 5
}
return b
}
func (p *BatteryStatusLvChannelStatus) UnmarshalByte(b byte) {
p.AuxFault = (b & (1 << 0)) != 0
p.MainFault = (b & (1 << 1)) != 0
p.AuxPowerValid = (b & (1 << 2)) != 0
p.MainPowerValid = (b & (1 << 3)) != 0
p.AuxPowerActive = (b & (1 << 4)) != 0
p.MainPowerActive = (b & (1 << 5)) != 0
}
type BatteryStatusLvControlStatus struct {
AuxVicorEnable bool `json:"aux_vicor_enable"`
BatVicorEnable bool `json:"bat_vicor_enable"`
AuxRelayHeld bool `json:"aux_relay_held"`
AuxRefEnable bool `json:"aux_ref_enable"`
AuxChargingEnable bool `json:"aux_charging_enable"`
KillHv bool `json:"kill_hv"`
KillLv bool `json:"kill_lv"`
StartButton bool `json:"start_button"`
}
func (p *BatteryStatusLvControlStatus) MarshalByte() byte {
var b byte
if p.AuxVicorEnable {
b |= 1 << 0
}
if p.BatVicorEnable {
b |= 1 << 1
}
if p.AuxRelayHeld {
b |= 1 << 2
}
if p.AuxRefEnable {
b |= 1 << 3
}
if p.AuxChargingEnable {
b |= 1 << 4
}
if p.KillHv {
b |= 1 << 5
}
if p.KillLv {
b |= 1 << 6
}
if p.StartButton {
b |= 1 << 7
}
return b
}
func (p *BatteryStatusLvControlStatus) UnmarshalByte(b byte) {
p.AuxVicorEnable = (b & (1 << 0)) != 0
p.BatVicorEnable = (b & (1 << 1)) != 0
p.AuxRelayHeld = (b & (1 << 2)) != 0
p.AuxRefEnable = (b & (1 << 3)) != 0
p.AuxChargingEnable = (b & (1 << 4)) != 0
p.KillHv = (b & (1 << 5)) != 0
p.KillLv = (b & (1 << 6)) != 0
p.StartButton = (b & (1 << 7)) != 0
}
type BatteryStatusPackChoice struct {
LargePack bool `json:"large_pack"`
SmallPack bool `json:"small_pack"`
}
func (p *BatteryStatusPackChoice) MarshalByte() byte {
var b byte
if p.LargePack {
b |= 1 << 0
}
if p.SmallPack {
b |= 1 << 1
}
return b
}
func (p *BatteryStatusPackChoice) UnmarshalByte(b byte) {
p.LargePack = (b & (1 << 0)) != 0
p.SmallPack = (b & (1 << 1)) != 0
}
// BatteryStatus is Status bits for the battery
type BatteryStatus struct {
BatteryState BatteryStatusBatteryState `json:"battery_state"`
ContactorState BatteryStatusContactorState `json:"contactor_state"`
LvChannelStatus BatteryStatusLvChannelStatus `json:"lv_channel_status"`
LvControlStatus BatteryStatusLvControlStatus `json:"lv_control_status"`
PackChoice BatteryStatusPackChoice `json:"pack_choice"`
}
func (p *BatteryStatus) CANId() (uint32, error) {
return 0x11, nil
}
func (p *BatteryStatus) Size() uint {
return 5
}
func (p *BatteryStatus) MarshalPacket() ([]byte, error) {
b := make([]byte, 5)
b[0] = p.BatteryState.MarshalByte()
b[1] = p.ContactorState.MarshalByte()
b[2] = p.LvChannelStatus.MarshalByte()
b[3] = p.LvControlStatus.MarshalByte()
b[4] = p.PackChoice.MarshalByte()
return b, nil
}
func (p *BatteryStatus) UnmarshalPacket(b []byte) error {
p.BatteryState.UnmarshalByte(b[0])
p.ContactorState.UnmarshalByte(b[1])
p.LvChannelStatus.UnmarshalByte(b[2])
p.LvControlStatus.UnmarshalByte(b[3])
p.PackChoice.UnmarshalByte(b[4])
return nil
}
func (p *BatteryStatus) String() string {
return "battery_status"
}
type BmsKillReasonReason1 struct {
OVERVOLT bool `json:"OVERVOLT"`
UNDERVOLT bool `json:"UNDERVOLT"`
OVERTEMP bool `json:"OVERTEMP"`
TEMPDISCONNECT bool `json:"TEMP_DISCONNECT"`
COMMFAIL bool `json:"COMM_FAIL"`
}
func (p *BmsKillReasonReason1) MarshalByte() byte {
var b byte
if p.OVERVOLT {
b |= 1 << 0
}
if p.UNDERVOLT {
b |= 1 << 1
}
if p.OVERTEMP {
b |= 1 << 2
}
if p.TEMPDISCONNECT {
b |= 1 << 3
}
if p.COMMFAIL {
b |= 1 << 4
}
return b
}
func (p *BmsKillReasonReason1) UnmarshalByte(b byte) {
p.OVERVOLT = (b & (1 << 0)) != 0
p.UNDERVOLT = (b & (1 << 1)) != 0
p.OVERTEMP = (b & (1 << 2)) != 0
p.TEMPDISCONNECT = (b & (1 << 3)) != 0
p.COMMFAIL = (b & (1 << 4)) != 0
}
type BmsKillReasonReason2 struct {
HARDWARE bool `json:"HARDWARE"`
KILLPACKET bool `json:"KILL_PACKET"`
UKNOWN bool `json:"UKNOWN"`
OVERCURRENT bool `json:"OVERCURRENT"`
PRECHARGEFAIL bool `json:"PRECHARGE_FAIL"`
AUXOVERUNDER bool `json:"AUX_OVER_UNDER"`
AUXOVERTEMP bool `json:"AUX_OVERTEMP"`
}
func (p *BmsKillReasonReason2) MarshalByte() byte {
var b byte
if p.HARDWARE {
b |= 1 << 0
}
if p.KILLPACKET {
b |= 1 << 1
}
if p.UKNOWN {
b |= 1 << 2
}
if p.OVERCURRENT {
b |= 1 << 3
}
if p.PRECHARGEFAIL {
b |= 1 << 4
}
if p.AUXOVERUNDER {
b |= 1 << 5
}
if p.AUXOVERTEMP {
b |= 1 << 6
}
return b
}
func (p *BmsKillReasonReason2) UnmarshalByte(b byte) {
p.HARDWARE = (b & (1 << 0)) != 0
p.KILLPACKET = (b & (1 << 1)) != 0
p.UKNOWN = (b & (1 << 2)) != 0
p.OVERCURRENT = (b & (1 << 3)) != 0
p.PRECHARGEFAIL = (b & (1 << 4)) != 0
p.AUXOVERUNDER = (b & (1 << 5)) != 0
p.AUXOVERTEMP = (b & (1 << 6)) != 0
}
// BmsKillReason is Information for when the car kills
type BmsKillReason struct {
Reason1 BmsKillReasonReason1 `json:"reason1"`
Reason2 BmsKillReasonReason2 `json:"reason2"`
Module uint16 `json:"module"`
Value float32 `json:"value"`
}
func (p *BmsKillReason) CANId() (uint32, error) {
return 0x12, nil
}
func (p *BmsKillReason) Size() uint {
return 8
}
func (p *BmsKillReason) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
b[0] = p.Reason1.MarshalByte()
b[1] = p.Reason2.MarshalByte()
binary.LittleEndian.PutUint16(b[2:], p.Module)
float32ToBytes(b[4:], p.Value, false)
return b, nil
}
func (p *BmsKillReason) UnmarshalPacket(b []byte) error {
p.Reason1.UnmarshalByte(b[0])
p.Reason2.UnmarshalByte(b[1])
p.Module = binary.LittleEndian.Uint16(b[2:])
p.Value = float32FromBytes(b[4:], false)
return nil
}
func (p *BmsKillReason) String() string {
return "bms_kill_reason"
}
// BmsModuleMinMax is min and max cell voltages and temperatures
type BmsModuleMinMax struct {
// 0.01 C
ModuleMaxTemp int16 `json:"module_max_temp"`
// 0.01 C
ModuleMinTemp int16 `json:"module_min_temp"`
// 0.001 V
ModuleMaxVoltage uint16 `json:"module_max_voltage"`
// 0.001 V
ModuleMinVoltage uint16 `json:"module_min_voltage"`
}
func (p *BmsModuleMinMax) CANId() (uint32, error) {
return 0x13, nil
}
func (p *BmsModuleMinMax) Size() uint {
return 8
}
func (p *BmsModuleMinMax) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint16(b[0:], uint16(p.ModuleMaxTemp))
binary.LittleEndian.PutUint16(b[2:], uint16(p.ModuleMinTemp))
binary.LittleEndian.PutUint16(b[4:], p.ModuleMaxVoltage)
binary.LittleEndian.PutUint16(b[6:], p.ModuleMinVoltage)
return b, nil
}
func (p *BmsModuleMinMax) UnmarshalPacket(b []byte) error {
p.ModuleMaxTemp = int16(binary.LittleEndian.Uint16(b[0:]))
p.ModuleMinTemp = int16(binary.LittleEndian.Uint16(b[2:]))
p.ModuleMaxVoltage = binary.LittleEndian.Uint16(b[4:])
p.ModuleMinVoltage = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *BmsModuleMinMax) String() string {
return "bms_module_min_max"
}
// BmsSoc is State of charge
type BmsSoc struct {
Soc float32 `json:"soc"`
}
func (p *BmsSoc) CANId() (uint32, error) {
return 0x14, nil
}
func (p *BmsSoc) Size() uint {
return 4
}
func (p *BmsSoc) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
float32ToBytes(b[0:], p.Soc, false)
return b, nil
}
func (p *BmsSoc) UnmarshalPacket(b []byte) error {
p.Soc = float32FromBytes(b[0:], false)
return nil
}
func (p *BmsSoc) String() string {
return "bms_soc"
}
// BmsCapacity is State of charge
type BmsCapacity struct {
Ah float32 `json:"Ah"`
Wh float32 `json:"Wh"`
}
func (p *BmsCapacity) CANId() (uint32, error) {
return 0x15, nil
}
func (p *BmsCapacity) Size() uint {
return 8
}
func (p *BmsCapacity) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Ah, false)
float32ToBytes(b[4:], p.Wh, false)
return b, nil
}
func (p *BmsCapacity) UnmarshalPacket(b []byte) error {
p.Ah = float32FromBytes(b[0:], false)
p.Wh = float32FromBytes(b[4:], false)
return nil
}
func (p *BmsCapacity) String() string {
return "bms_capacity"
}
// BmsCurrentlimit is reports BP params for current
type BmsCurrentlimit struct {
// 0.01 A
CurrentMax int16 `json:"current_max"`
// 0.01 A
CurrentMin int16 `json:"current_min"`
}
func (p *BmsCurrentlimit) CANId() (uint32, error) {
return 0x18, nil
}
func (p *BmsCurrentlimit) Size() uint {
return 4
}
func (p *BmsCurrentlimit) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
binary.LittleEndian.PutUint16(b[0:], uint16(p.CurrentMax))
binary.LittleEndian.PutUint16(b[2:], uint16(p.CurrentMin))
return b, nil
}
func (p *BmsCurrentlimit) UnmarshalPacket(b []byte) error {
p.CurrentMax = int16(binary.LittleEndian.Uint16(b[0:]))
p.CurrentMin = int16(binary.LittleEndian.Uint16(b[2:]))
return nil
}
func (p *BmsCurrentlimit) String() string {
return "bms_currentlimit"
}
// BmsFanInfo is BP Fans
type BmsFanInfo struct {
// 1 RPM
Fan1 uint16 `json:"fan1"`
// 1 RPM
Fan2 uint16 `json:"fan2"`
// 1 RPM
Fan3 uint16 `json:"fan3"`
// 1 RPM
Fan4 uint16 `json:"fan4"`
}
func (p *BmsFanInfo) CANId() (uint32, error) {
return 0x19, nil
}
func (p *BmsFanInfo) Size() uint {
return 8
}
func (p *BmsFanInfo) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint16(b[0:], p.Fan1)
binary.LittleEndian.PutUint16(b[2:], p.Fan2)
binary.LittleEndian.PutUint16(b[4:], p.Fan3)
binary.LittleEndian.PutUint16(b[6:], p.Fan4)
return b, nil
}
func (p *BmsFanInfo) UnmarshalPacket(b []byte) error {
p.Fan1 = binary.LittleEndian.Uint16(b[0:])
p.Fan2 = binary.LittleEndian.Uint16(b[2:])
p.Fan3 = binary.LittleEndian.Uint16(b[4:])
p.Fan4 = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *BmsFanInfo) String() string {
return "bms_fan_info"
}
// BmsSetMinFanSpeed is packet which sets a minimum fan speed of BMS for a specific time frame in seconds
type BmsSetMinFanSpeed struct {
// 0 percent
FanPercentage float32 `json:"fan_percentage"`
// 0 s
Time uint16 `json:"time"`
}
func (p *BmsSetMinFanSpeed) CANId() (uint32, error) {
return 0x1B, nil
}
func (p *BmsSetMinFanSpeed) Size() uint {
return 6
}
func (p *BmsSetMinFanSpeed) MarshalPacket() ([]byte, error) {
b := make([]byte, 6)
float32ToBytes(b[0:], p.FanPercentage, false)
binary.LittleEndian.PutUint16(b[4:], p.Time)
return b, nil
}
func (p *BmsSetMinFanSpeed) UnmarshalPacket(b []byte) error {
p.FanPercentage = float32FromBytes(b[0:], false)
p.Time = binary.LittleEndian.Uint16(b[4:])
return nil
}
func (p *BmsSetMinFanSpeed) String() string {
return "bms_set_min_fan_speed"
}
// BmsModule is Voltage and temperature for a single module
type BmsModule struct {
// 1 V
Voltage float32 `json:"voltage"`
// 1 C
Temperature float32 `json:"temperature"`
// Idx is the packet index. The accepted range is 0-36
Idx uint32 `json:"idx"`
}
func (p *BmsModule) CANId() (uint32, error) {
if p.Idx >= 36 {
return 0, &UnknownIdError{ 0x40 }
}
return 0x40 + p.Idx, nil
}
func (p *BmsModule) Size() uint {
return 8
}
func (p *BmsModule) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Voltage, false)
float32ToBytes(b[4:], p.Temperature, false)
return b, nil
}
func (p *BmsModule) UnmarshalPacket(b []byte) error {
p.Voltage = float32FromBytes(b[0:], false)
p.Temperature = float32FromBytes(b[4:], false)
return nil
}
func (p *BmsModule) String() string {
return "bms_module"
}
type BmsChargerResponseResponseFlags struct {
ChargingReady bool `json:"charging_ready"`
}
func (p *BmsChargerResponseResponseFlags) MarshalByte() byte {
var b byte
if p.ChargingReady {
b |= 1 << 0
}
return b
}
func (p *BmsChargerResponseResponseFlags) UnmarshalByte(b byte) {
p.ChargingReady = (b & (1 << 0)) != 0
}
// BmsChargerResponse is Response packet from BMS for indicating whether BMS is ready for charging
type BmsChargerResponse struct {
ResponseFlags BmsChargerResponseResponseFlags `json:"response_flags"`
}
func (p *BmsChargerResponse) CANId() (uint32, error) {
return 0x75, nil
}
func (p *BmsChargerResponse) Size() uint {
return 1
}
func (p *BmsChargerResponse) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.ResponseFlags.MarshalByte()
return b, nil
}
func (p *BmsChargerResponse) UnmarshalPacket(b []byte) error {
p.ResponseFlags.UnmarshalByte(b[0])
return nil
}
func (p *BmsChargerResponse) String() string {
return "bms_charger_response"
}
type ChassisIsolationFaultFaultDetected struct {
IsolationFault bool `json:"isolation_fault"`
}
func (p *ChassisIsolationFaultFaultDetected) MarshalByte() byte {
var b byte
if p.IsolationFault {
b |= 1 << 0
}
return b
}
func (p *ChassisIsolationFaultFaultDetected) UnmarshalByte(b byte) {
p.IsolationFault = (b & (1 << 0)) != 0
}
// ChassisIsolationFault is chassiss is not isolated from the battery
type ChassisIsolationFault struct {
FaultDetected ChassisIsolationFaultFaultDetected `json:"fault_detected"`
}
func (p *ChassisIsolationFault) CANId() (uint32, error) {
return 0x38, nil
}
func (p *ChassisIsolationFault) Size() uint {
return 1
}
func (p *ChassisIsolationFault) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.FaultDetected.MarshalByte()
return b, nil
}
func (p *ChassisIsolationFault) UnmarshalPacket(b []byte) error {
p.FaultDetected.UnmarshalByte(b[0])
return nil
}
func (p *ChassisIsolationFault) String() string {
return "chassis_isolation_fault"
}
type BmsImdInfoDImcStatus1 struct {
IsolationFault bool `json:"isolation_fault"`
ChassisFault bool `json:"chassis_fault"`
SystemFailure bool `json:"system_failure"`
CalibrationRunning bool `json:"calibration_running"`
SelfTestRunning bool `json:"self_test_running"`
IsolationWarning bool `json:"isolation_warning"`
Reserved bool `json:"reserved"`
Reserved2 bool `json:"reserved_2"`
}
func (p *BmsImdInfoDImcStatus1) MarshalByte() byte {
var b byte
if p.IsolationFault {
b |= 1 << 0
}
if p.ChassisFault {
b |= 1 << 1
}
if p.SystemFailure {
b |= 1 << 2
}
if p.CalibrationRunning {
b |= 1 << 3
}
if p.SelfTestRunning {
b |= 1 << 4
}
if p.IsolationWarning {
b |= 1 << 5
}
if p.Reserved {
b |= 1 << 6
}
if p.Reserved2 {
b |= 1 << 7
}
return b
}
func (p *BmsImdInfoDImcStatus1) UnmarshalByte(b byte) {
p.IsolationFault = (b & (1 << 0)) != 0
p.ChassisFault = (b & (1 << 1)) != 0
p.SystemFailure = (b & (1 << 2)) != 0
p.CalibrationRunning = (b & (1 << 3)) != 0
p.SelfTestRunning = (b & (1 << 4)) != 0
p.IsolationWarning = (b & (1 << 5)) != 0
p.Reserved = (b & (1 << 6)) != 0
p.Reserved2 = (b & (1 << 7)) != 0
}
type BmsImdInfoDImcStatus2 struct {
Reserved bool `json:"reserved"`
Reserved2 bool `json:"reserved_2"`
Reserved3 bool `json:"reserved_3"`
Reserved4 bool `json:"reserved_4"`
Reserved5 bool `json:"reserved_5"`
Reserved6 bool `json:"reserved_6"`
Reserved7 bool `json:"reserved_7"`
Reserved8 bool `json:"reserved_8"`
}
func (p *BmsImdInfoDImcStatus2) MarshalByte() byte {
var b byte
if p.Reserved {
b |= 1 << 0
}
if p.Reserved2 {
b |= 1 << 1
}
if p.Reserved3 {
b |= 1 << 2
}
if p.Reserved4 {
b |= 1 << 3
}
if p.Reserved5 {
b |= 1 << 4
}
if p.Reserved6 {
b |= 1 << 5
}
if p.Reserved7 {
b |= 1 << 6
}
if p.Reserved8 {
b |= 1 << 7
}
return b
}
func (p *BmsImdInfoDImcStatus2) UnmarshalByte(b byte) {
p.Reserved = (b & (1 << 0)) != 0
p.Reserved2 = (b & (1 << 1)) != 0
p.Reserved3 = (b & (1 << 2)) != 0
p.Reserved4 = (b & (1 << 3)) != 0
p.Reserved5 = (b & (1 << 4)) != 0
p.Reserved6 = (b & (1 << 5)) != 0
p.Reserved7 = (b & (1 << 6)) != 0
p.Reserved8 = (b & (1 << 7)) != 0
}
type BmsImdInfoDVifcStatus1 struct {
InsulationMeasurment bool `json:"insulation_measurment"`
ImcConnectivityNotImplemented bool `json:"imc_connectivity_not_implemented"`
ImcAliveSatusDetection bool `json:"imc_alive_satus_detection"`
Reserved bool `json:"reserved"`
VifcCommandNotImplemented bool `json:"vifc_command_not_implemented"`
Reserved2 bool `json:"reserved_2"`
Reserved3 bool `json:"reserved_3"`
Reserved4 bool `json:"reserved_4"`
}
func (p *BmsImdInfoDVifcStatus1) MarshalByte() byte {
var b byte
if p.InsulationMeasurment {
b |= 1 << 0
}
if p.ImcConnectivityNotImplemented {
b |= 1 << 1
}
if p.ImcAliveSatusDetection {
b |= 1 << 2
}
if p.Reserved {
b |= 1 << 3
}
if p.VifcCommandNotImplemented {
b |= 1 << 4
}
if p.Reserved2 {
b |= 1 << 5
}
if p.Reserved3 {
b |= 1 << 6
}
if p.Reserved4 {
b |= 1 << 7
}
return b
}
func (p *BmsImdInfoDVifcStatus1) UnmarshalByte(b byte) {
p.InsulationMeasurment = (b & (1 << 0)) != 0
p.ImcConnectivityNotImplemented = (b & (1 << 1)) != 0
p.ImcAliveSatusDetection = (b & (1 << 2)) != 0
p.Reserved = (b & (1 << 3)) != 0
p.VifcCommandNotImplemented = (b & (1 << 4)) != 0
p.Reserved2 = (b & (1 << 5)) != 0
p.Reserved3 = (b & (1 << 6)) != 0
p.Reserved4 = (b & (1 << 7)) != 0
}
type BmsImdInfoDVifcStatus2 struct {
InsulationResistanceValue bool `json:"insulation_resistance_value"`
Reserved bool `json:"reserved"`
Reserved2 bool `json:"reserved_2"`
Reserved3 bool `json:"reserved_3"`
ImcSelfTestOverAll bool `json:"imc_self_test_overAll"`
ImcSelfTestParameterConfig bool `json:"imc_self_test_parameterConfig"`
Reserved4 bool `json:"reserved_4"`
Reserved5 bool `json:"reserved_5"`
}
func (p *BmsImdInfoDVifcStatus2) MarshalByte() byte {
var b byte
if p.InsulationResistanceValue {
b |= 1 << 0
}
if p.Reserved {
b |= 1 << 1
}
if p.Reserved2 {
b |= 1 << 2
}
if p.Reserved3 {
b |= 1 << 3
}
if p.ImcSelfTestOverAll {
b |= 1 << 4
}
if p.ImcSelfTestParameterConfig {
b |= 1 << 5
}
if p.Reserved4 {
b |= 1 << 6
}
if p.Reserved5 {
b |= 1 << 7
}
return b
}
func (p *BmsImdInfoDVifcStatus2) UnmarshalByte(b byte) {
p.InsulationResistanceValue = (b & (1 << 0)) != 0
p.Reserved = (b & (1 << 1)) != 0
p.Reserved2 = (b & (1 << 2)) != 0
p.Reserved3 = (b & (1 << 3)) != 0
p.ImcSelfTestOverAll = (b & (1 << 4)) != 0
p.ImcSelfTestParameterConfig = (b & (1 << 5)) != 0
p.Reserved4 = (b & (1 << 6)) != 0
p.Reserved5 = (b & (1 << 7)) != 0
}
// BmsImdInfo is information from chassis isolation
type BmsImdInfo struct {
DImcRIso uint16 `json:"d_imc_r_iso"`
DImcStatus1 BmsImdInfoDImcStatus1 `json:"d_imc_status_1"`
DImcStatus2 BmsImdInfoDImcStatus2 `json:"d_imc_status_2"`
DVifcStatus1 BmsImdInfoDVifcStatus1 `json:"d_vifc_status_1"`
DVifcStatus2 BmsImdInfoDVifcStatus2 `json:"d_vifc_status_2"`
}
func (p *BmsImdInfo) CANId() (uint32, error) {
return 0x37, nil
}
func (p *BmsImdInfo) Size() uint {
return 6
}
func (p *BmsImdInfo) MarshalPacket() ([]byte, error) {
b := make([]byte, 6)
binary.LittleEndian.PutUint16(b[0:], p.DImcRIso)
b[2] = p.DImcStatus1.MarshalByte()
b[3] = p.DImcStatus2.MarshalByte()
b[4] = p.DVifcStatus1.MarshalByte()
b[5] = p.DVifcStatus2.MarshalByte()
return b, nil
}
func (p *BmsImdInfo) UnmarshalPacket(b []byte) error {
p.DImcRIso = binary.LittleEndian.Uint16(b[0:])
p.DImcStatus1.UnmarshalByte(b[2])
p.DImcStatus2.UnmarshalByte(b[3])
p.DVifcStatus1.UnmarshalByte(b[4])
p.DVifcStatus2.UnmarshalByte(b[5])
return nil
}
func (p *BmsImdInfo) String() string {
return "bms_imd_info"
}
// DashboardPedalPercentages is ADC values from the brake and accelerator pedals.
type DashboardPedalPercentages struct {
AccelPedalValue uint8 `json:"accel_pedal_value"`
BrakePedalValue uint8 `json:"brake_pedal_value"`
}
func (p *DashboardPedalPercentages) CANId() (uint32, error) {
return 0x290, nil
}
func (p *DashboardPedalPercentages) Size() uint {
return 2
}
func (p *DashboardPedalPercentages) MarshalPacket() ([]byte, error) {
b := make([]byte, 2)
b[0] = p.AccelPedalValue
b[1] = p.BrakePedalValue
return b, nil
}
func (p *DashboardPedalPercentages) UnmarshalPacket(b []byte) error {
p.AccelPedalValue = b[0]
p.BrakePedalValue = b[1]
return nil
}
func (p *DashboardPedalPercentages) String() string {
return "dashboard_pedal_percentages"
}
// CarState is Car gear. Forward, neutral, reverse, etc.
type CarState struct {
State uint8 `json:"state"`
}
func (p *CarState) CANId() (uint32, error) {
return 0x291, nil
}
func (p *CarState) Size() uint {
return 1
}
func (p *CarState) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.State
return b, nil
}
func (p *CarState) UnmarshalPacket(b []byte) error {
p.State = b[0]
return nil
}
func (p *CarState) String() string {
return "car_state"
}
// DashboardPedalFault is Target speed that the driver should maintain.
type DashboardPedalFault struct {
BrakeFaultCount uint8 `json:"brake_fault_count"`
AccelFaultCount uint8 `json:"accel_fault_count"`
}
func (p *DashboardPedalFault) CANId() (uint32, error) {
return 0x292, nil
}
func (p *DashboardPedalFault) Size() uint {
return 2
}
func (p *DashboardPedalFault) MarshalPacket() ([]byte, error) {
b := make([]byte, 2)
b[0] = p.BrakeFaultCount
b[1] = p.AccelFaultCount
return b, nil
}
func (p *DashboardPedalFault) UnmarshalPacket(b []byte) error {
p.BrakeFaultCount = b[0]
p.AccelFaultCount = b[1]
return nil
}
func (p *DashboardPedalFault) String() string {
return "dashboard_pedal_fault"
}
type DashboardSystemTimeoutTestFlagSet0 struct {
SteeringDisconnected bool `json:"steering_disconnected"`
VisionFrontDisconnected bool `json:"vision_front_disconnected"`
VisionRearDisconnected bool `json:"vision_rear_disconnected"`
TelemetryDisconnected bool `json:"telemetry_disconnected"`
WslDisconnected bool `json:"wsl_disconnected"`
WsrDisconnected bool `json:"wsr_disconnected"`
FrontMpptDisconnected bool `json:"front_mppt_disconnected"`
RearMpptDisconnected bool `json:"rear_mppt_disconnected"`
}
func (p *DashboardSystemTimeoutTestFlagSet0) MarshalByte() byte {
var b byte
if p.SteeringDisconnected {
b |= 1 << 0
}
if p.VisionFrontDisconnected {
b |= 1 << 1
}
if p.VisionRearDisconnected {
b |= 1 << 2
}
if p.TelemetryDisconnected {
b |= 1 << 3
}
if p.WslDisconnected {
b |= 1 << 4
}
if p.WsrDisconnected {
b |= 1 << 5
}
if p.FrontMpptDisconnected {
b |= 1 << 6
}
if p.RearMpptDisconnected {
b |= 1 << 7
}
return b
}
func (p *DashboardSystemTimeoutTestFlagSet0) UnmarshalByte(b byte) {
p.SteeringDisconnected = (b & (1 << 0)) != 0
p.VisionFrontDisconnected = (b & (1 << 1)) != 0
p.VisionRearDisconnected = (b & (1 << 2)) != 0
p.TelemetryDisconnected = (b & (1 << 3)) != 0
p.WslDisconnected = (b & (1 << 4)) != 0
p.WsrDisconnected = (b & (1 << 5)) != 0
p.FrontMpptDisconnected = (b & (1 << 6)) != 0
p.RearMpptDisconnected = (b & (1 << 7)) != 0
}
// DashboardSystemTimeoutTest is Exposes whether each system that dashboard is supposed to listen for packets from has sent a packet. Used for testing.
type DashboardSystemTimeoutTest struct {
FlagSet0 DashboardSystemTimeoutTestFlagSet0 `json:"flag_set_0"`
}
func (p *DashboardSystemTimeoutTest) CANId() (uint32, error) {
return 0x299, nil
}
func (p *DashboardSystemTimeoutTest) Size() uint {
return 1
}
func (p *DashboardSystemTimeoutTest) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.FlagSet0.MarshalByte()
return b, nil
}
func (p *DashboardSystemTimeoutTest) UnmarshalPacket(b []byte) error {
p.FlagSet0.UnmarshalByte(b[0])
return nil
}
func (p *DashboardSystemTimeoutTest) String() string {
return "dashboard_system_timeout_test"
}
// CarSpeed is speed of car in meters per second
type CarSpeed struct {
Speed float32 `json:"speed"`
}
func (p *CarSpeed) CANId() (uint32, error) {
return 0x29A, nil
}
func (p *CarSpeed) Size() uint {
return 4
}
func (p *CarSpeed) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
float32ToBytes(b[0:], p.Speed, false)
return b, nil
}
func (p *CarSpeed) UnmarshalPacket(b []byte) error {
p.Speed = float32FromBytes(b[0:], false)
return nil
}
func (p *CarSpeed) String() string {
return "car_speed"
}
// FlightComputerLvBoardDisconnectCounts is Number of times a board hasn't been heard from within the allowed timeout.
type FlightComputerLvBoardDisconnectCounts struct {
FrontLights uint8 `json:"front_lights"`
RearLights uint8 `json:"rear_lights"`
Steering uint8 `json:"steering"`
Vision uint8 `json:"vision"`
DriverDisplay uint8 `json:"driver_display"`
CenterConsole uint8 `json:"center_console"`
}
func (p *FlightComputerLvBoardDisconnectCounts) CANId() (uint32, error) {
return 0x29B, nil
}
func (p *FlightComputerLvBoardDisconnectCounts) Size() uint {
return 6
}
func (p *FlightComputerLvBoardDisconnectCounts) MarshalPacket() ([]byte, error) {
b := make([]byte, 6)
b[0] = p.FrontLights
b[1] = p.RearLights
b[2] = p.Steering
b[3] = p.Vision
b[4] = p.DriverDisplay
b[5] = p.CenterConsole
return b, nil
}
func (p *FlightComputerLvBoardDisconnectCounts) UnmarshalPacket(b []byte) error {
p.FrontLights = b[0]
p.RearLights = b[1]
p.Steering = b[2]
p.Vision = b[3]
p.DriverDisplay = b[4]
p.CenterConsole = b[5]
return nil
}
func (p *FlightComputerLvBoardDisconnectCounts) String() string {
return "flight_computer_lv_board_disconnect_counts"
}
// FlightComputerHvBoardDisconnectCounts is Number of times a board hasn't been heard from within the allowed timeout.
type FlightComputerHvBoardDisconnectCounts struct {
Bms uint8 `json:"bms"`
Charger uint8 `json:"charger"`
Wsl uint8 `json:"wsl"`
Wsr uint8 `json:"wsr"`
MpptFront uint8 `json:"mppt_front"`
MpptRear uint8 `json:"mppt_rear"`
}
func (p *FlightComputerHvBoardDisconnectCounts) CANId() (uint32, error) {
return 0x29C, nil
}
func (p *FlightComputerHvBoardDisconnectCounts) Size() uint {
return 6
}
func (p *FlightComputerHvBoardDisconnectCounts) MarshalPacket() ([]byte, error) {
b := make([]byte, 6)
b[0] = p.Bms
b[1] = p.Charger
b[2] = p.Wsl
b[3] = p.Wsr
b[4] = p.MpptFront
b[5] = p.MpptRear
return b, nil
}
func (p *FlightComputerHvBoardDisconnectCounts) UnmarshalPacket(b []byte) error {
p.Bms = b[0]
p.Charger = b[1]
p.Wsl = b[2]
p.Wsr = b[3]
p.MpptFront = b[4]
p.MpptRear = b[5]
return nil
}
func (p *FlightComputerHvBoardDisconnectCounts) String() string {
return "flight_computer_hv_board_disconnect_counts"
}
type FlightComputerInternalStateBms struct {
BatteryKill bool `json:"battery_kill"`
CellsInChargingThreshold bool `json:"cells_in_charging_threshold"`
FirstPacketReceived bool `json:"first_packet_received"`
}
func (p *FlightComputerInternalStateBms) MarshalByte() byte {
var b byte
if p.BatteryKill {
b |= 1 << 0
}
if p.CellsInChargingThreshold {
b |= 1 << 1
}
if p.FirstPacketReceived {
b |= 1 << 2
}
return b
}
func (p *FlightComputerInternalStateBms) UnmarshalByte(b byte) {
p.BatteryKill = (b & (1 << 0)) != 0
p.CellsInChargingThreshold = (b & (1 << 1)) != 0
p.FirstPacketReceived = (b & (1 << 2)) != 0
}
type FlightComputerInternalStateCharger struct {
ProximityDetected bool `json:"proximity_detected"`
}
func (p *FlightComputerInternalStateCharger) MarshalByte() byte {
var b byte
if p.ProximityDetected {
b |= 1 << 0
}
return b
}
func (p *FlightComputerInternalStateCharger) UnmarshalByte(b byte) {
p.ProximityDetected = (b & (1 << 0)) != 0
}
type FlightComputerInternalStatePhoton3 struct {
Enable bool `json:"enable"`
}
func (p *FlightComputerInternalStatePhoton3) MarshalByte() byte {
var b byte
if p.Enable {
b |= 1 << 0
}
return b
}
func (p *FlightComputerInternalStatePhoton3) UnmarshalByte(b byte) {
p.Enable = (b & (1 << 0)) != 0
}
type FlightComputerInternalStateWavesculptor struct {
SendingReset bool `json:"sending_reset"`
RegenEnable bool `json:"regen_enable"`
}
func (p *FlightComputerInternalStateWavesculptor) MarshalByte() byte {
var b byte
if p.SendingReset {
b |= 1 << 0
}
if p.RegenEnable {
b |= 1 << 1
}
return b
}
func (p *FlightComputerInternalStateWavesculptor) UnmarshalByte(b byte) {
p.SendingReset = (b & (1 << 0)) != 0
p.RegenEnable = (b & (1 << 1)) != 0
}
type FlightComputerInternalStateInternal struct {
AccelPedalDisconnect bool `json:"accel_pedal_disconnect"`
BrakePedalDisconnect bool `json:"brake_pedal_disconnect"`
}
func (p *FlightComputerInternalStateInternal) MarshalByte() byte {
var b byte
if p.AccelPedalDisconnect {
b |= 1 << 0
}
if p.BrakePedalDisconnect {
b |= 1 << 1
}
return b
}
func (p *FlightComputerInternalStateInternal) UnmarshalByte(b byte) {
p.AccelPedalDisconnect = (b & (1 << 0)) != 0
p.BrakePedalDisconnect = (b & (1 << 1)) != 0
}
// FlightComputerInternalState is internal bools
type FlightComputerInternalState struct {
Bms FlightComputerInternalStateBms `json:"bms"`
Charger FlightComputerInternalStateCharger `json:"charger"`
Photon3 FlightComputerInternalStatePhoton3 `json:"photon3"`
Wavesculptor FlightComputerInternalStateWavesculptor `json:"wavesculptor"`
Internal FlightComputerInternalStateInternal `json:"internal"`
}
func (p *FlightComputerInternalState) CANId() (uint32, error) {
return 0x29D, nil
}
func (p *FlightComputerInternalState) Size() uint {
return 5
}
func (p *FlightComputerInternalState) MarshalPacket() ([]byte, error) {
b := make([]byte, 5)
b[0] = p.Bms.MarshalByte()
b[1] = p.Charger.MarshalByte()
b[2] = p.Photon3.MarshalByte()
b[3] = p.Wavesculptor.MarshalByte()
b[4] = p.Internal.MarshalByte()
return b, nil
}
func (p *FlightComputerInternalState) UnmarshalPacket(b []byte) error {
p.Bms.UnmarshalByte(b[0])
p.Charger.UnmarshalByte(b[1])
p.Photon3.UnmarshalByte(b[2])
p.Wavesculptor.UnmarshalByte(b[3])
p.Internal.UnmarshalByte(b[4])
return nil
}
func (p *FlightComputerInternalState) String() string {
return "flight_computer_internal_state"
}
// PowerToDrive is calculated power required to drive the vehicle
type PowerToDrive struct {
MovingAverage100 int16 `json:"moving_average_100"`
MovingAverage1K int16 `json:"moving_average_1k"`
MovingAverage10K int16 `json:"moving_average_10k"`
}
func (p *PowerToDrive) CANId() (uint32, error) {
return 0x19E, nil
}
func (p *PowerToDrive) Size() uint {
return 6
}
func (p *PowerToDrive) MarshalPacket() ([]byte, error) {
b := make([]byte, 6)
binary.LittleEndian.PutUint16(b[0:], uint16(p.MovingAverage100))
binary.LittleEndian.PutUint16(b[2:], uint16(p.MovingAverage1K))
binary.LittleEndian.PutUint16(b[4:], uint16(p.MovingAverage10K))
return b, nil
}
func (p *PowerToDrive) UnmarshalPacket(b []byte) error {
p.MovingAverage100 = int16(binary.LittleEndian.Uint16(b[0:]))
p.MovingAverage1K = int16(binary.LittleEndian.Uint16(b[2:]))
p.MovingAverage10K = int16(binary.LittleEndian.Uint16(b[4:]))
return nil
}
func (p *PowerToDrive) String() string {
return "power_to_drive"
}
// ArrayPower is array power calculated from current and voltage measurements
type ArrayPower struct {
FrontArrayChannel0 uint16 `json:"front_array_channel_0"`
FrontArrayChannel1 uint16 `json:"front_array_channel_1"`
RearArrayChannel0 uint16 `json:"rear_array_channel_0"`
RearArrayChannel1 uint16 `json:"rear_array_channel_1"`
}
func (p *ArrayPower) CANId() (uint32, error) {
return 0x19F, nil
}
func (p *ArrayPower) Size() uint {
return 8
}
func (p *ArrayPower) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint16(b[0:], p.FrontArrayChannel0)
binary.LittleEndian.PutUint16(b[2:], p.FrontArrayChannel1)
binary.LittleEndian.PutUint16(b[4:], p.RearArrayChannel0)
binary.LittleEndian.PutUint16(b[6:], p.RearArrayChannel1)
return b, nil
}
func (p *ArrayPower) UnmarshalPacket(b []byte) error {
p.FrontArrayChannel0 = binary.LittleEndian.Uint16(b[0:])
p.FrontArrayChannel1 = binary.LittleEndian.Uint16(b[2:])
p.RearArrayChannel0 = binary.LittleEndian.Uint16(b[4:])
p.RearArrayChannel1 = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *ArrayPower) String() string {
return "array_power"
}
// ArrayEnergy is cumulative energy received from the array
type ArrayEnergy struct {
// 0 Joule
Energy float32 `json:"energy"`
}
func (p *ArrayEnergy) CANId() (uint32, error) {
return 0x119, nil
}
func (p *ArrayEnergy) Size() uint {
return 4
}
func (p *ArrayEnergy) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
float32ToBytes(b[0:], p.Energy, false)
return b, nil
}
func (p *ArrayEnergy) UnmarshalPacket(b []byte) error {
p.Energy = float32FromBytes(b[0:], false)
return nil
}
func (p *ArrayEnergy) String() string {
return "array_energy"
}
// ArrayEnergyReset is resets cumulative energy received from the array
type ArrayEnergyReset struct {
// 0 Joule
Energy float32 `json:"energy"`
}
func (p *ArrayEnergyReset) CANId() (uint32, error) {
return 0x120, nil
}
func (p *ArrayEnergyReset) Size() uint {
return 4
}
func (p *ArrayEnergyReset) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
float32ToBytes(b[0:], p.Energy, false)
return b, nil
}
func (p *ArrayEnergyReset) UnmarshalPacket(b []byte) error {
p.Energy = float32FromBytes(b[0:], false)
return nil
}
func (p *ArrayEnergyReset) String() string {
return "array_energy_reset"
}
type VisionTurnSignalsCommandLights struct {
LeftTurnSignal bool `json:"left_turn_signal"`
RightTurnSignal bool `json:"right_turn_signal"`
Spare1 bool `json:"spare_1"`
Spare2 bool `json:"spare_2"`
Spare3 bool `json:"spare_3"`
}
func (p *VisionTurnSignalsCommandLights) MarshalByte() byte {
var b byte
if p.LeftTurnSignal {
b |= 1 << 0
}
if p.RightTurnSignal {
b |= 1 << 1
}
if p.Spare1 {
b |= 1 << 2
}
if p.Spare2 {
b |= 1 << 3
}
if p.Spare3 {
b |= 1 << 4
}
return b
}
func (p *VisionTurnSignalsCommandLights) UnmarshalByte(b byte) {
p.LeftTurnSignal = (b & (1 << 0)) != 0
p.RightTurnSignal = (b & (1 << 1)) != 0
p.Spare1 = (b & (1 << 2)) != 0
p.Spare2 = (b & (1 << 3)) != 0
p.Spare3 = (b & (1 << 4)) != 0
}
// VisionTurnSignalsCommand is Command to have the vision board illuminate or turn off left, right, or both turn signals
type VisionTurnSignalsCommand struct {
Lights VisionTurnSignalsCommandLights `json:"lights"`
}
func (p *VisionTurnSignalsCommand) CANId() (uint32, error) {
return 0x2B0, nil
}
func (p *VisionTurnSignalsCommand) Size() uint {
return 1
}
func (p *VisionTurnSignalsCommand) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.Lights.MarshalByte()
return b, nil
}
func (p *VisionTurnSignalsCommand) UnmarshalPacket(b []byte) error {
p.Lights.UnmarshalByte(b[0])
return nil
}
func (p *VisionTurnSignalsCommand) String() string {
return "vision_turn_signals_command"
}
type VisionBrakeLightsCommandLights struct {
BrakeLights bool `json:"brake_lights"`
Spare1 bool `json:"spare_1"`
Spare2 bool `json:"spare_2"`
Spare3 bool `json:"spare_3"`
}
func (p *VisionBrakeLightsCommandLights) MarshalByte() byte {
var b byte
if p.BrakeLights {
b |= 1 << 0
}
if p.Spare1 {
b |= 1 << 1
}
if p.Spare2 {
b |= 1 << 2
}
if p.Spare3 {
b |= 1 << 3
}
return b
}
func (p *VisionBrakeLightsCommandLights) UnmarshalByte(b byte) {
p.BrakeLights = (b & (1 << 0)) != 0
p.Spare1 = (b & (1 << 1)) != 0
p.Spare2 = (b & (1 << 2)) != 0
p.Spare3 = (b & (1 << 3)) != 0
}
// VisionBrakeLightsCommand is Command to have the vision board illuminate or turn off the brake lights
type VisionBrakeLightsCommand struct {
Lights VisionBrakeLightsCommandLights `json:"lights"`
}
func (p *VisionBrakeLightsCommand) CANId() (uint32, error) {
return 0x2B1, nil
}
func (p *VisionBrakeLightsCommand) Size() uint {
return 1
}
func (p *VisionBrakeLightsCommand) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.Lights.MarshalByte()
return b, nil
}
func (p *VisionBrakeLightsCommand) UnmarshalPacket(b []byte) error {
p.Lights.UnmarshalByte(b[0])
return nil
}
func (p *VisionBrakeLightsCommand) String() string {
return "vision_brake_lights_command"
}
type VisionHeadlightsCommandLights struct {
Headlights bool `json:"headlights"`
HighBeams bool `json:"high_beams"`
Spare1 bool `json:"spare_1"`
Spare2 bool `json:"spare_2"`
Spare3 bool `json:"spare_3"`
}
func (p *VisionHeadlightsCommandLights) MarshalByte() byte {
var b byte
if p.Headlights {
b |= 1 << 0
}
if p.HighBeams {
b |= 1 << 1
}
if p.Spare1 {
b |= 1 << 2
}
if p.Spare2 {
b |= 1 << 3
}
if p.Spare3 {
b |= 1 << 4
}
return b
}
func (p *VisionHeadlightsCommandLights) UnmarshalByte(b byte) {
p.Headlights = (b & (1 << 0)) != 0
p.HighBeams = (b & (1 << 1)) != 0
p.Spare1 = (b & (1 << 2)) != 0
p.Spare2 = (b & (1 << 3)) != 0
p.Spare3 = (b & (1 << 4)) != 0
}
// VisionHeadlightsCommand is Command to have the vision board illuminate or turn off the headlights and high beams
type VisionHeadlightsCommand struct {
Lights VisionHeadlightsCommandLights `json:"lights"`
Brightness float32 `json:"brightness"`
}
func (p *VisionHeadlightsCommand) CANId() (uint32, error) {
return 0x2B2, nil
}
func (p *VisionHeadlightsCommand) Size() uint {
return 5
}
func (p *VisionHeadlightsCommand) MarshalPacket() ([]byte, error) {
b := make([]byte, 5)
b[0] = p.Lights.MarshalByte()
float32ToBytes(b[1:], p.Brightness, false)
return b, nil
}
func (p *VisionHeadlightsCommand) UnmarshalPacket(b []byte) error {
p.Lights.UnmarshalByte(b[0])
p.Brightness = float32FromBytes(b[1:], false)
return nil
}
func (p *VisionHeadlightsCommand) String() string {
return "vision_headlights_command"
}
type VisionHornCommandHorn struct {
Horn bool `json:"horn"`
Spare bool `json:"spare"`
}
func (p *VisionHornCommandHorn) MarshalByte() byte {
var b byte
if p.Horn {
b |= 1 << 0
}
if p.Spare {
b |= 1 << 1
}
return b
}
func (p *VisionHornCommandHorn) UnmarshalByte(b byte) {
p.Horn = (b & (1 << 0)) != 0
p.Spare = (b & (1 << 1)) != 0
}
// VisionHornCommand is Command the vision board honk the horn, must be repeatedly sent otherwise the vision board will stop honking after a bit. See high_power.h for details.
type VisionHornCommand struct {
Horn VisionHornCommandHorn `json:"horn"`
}
func (p *VisionHornCommand) CANId() (uint32, error) {
return 0x2B3, nil
}
func (p *VisionHornCommand) Size() uint {
return 1
}
func (p *VisionHornCommand) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.Horn.MarshalByte()
return b, nil
}
func (p *VisionHornCommand) UnmarshalPacket(b []byte) error {
p.Horn.UnmarshalByte(b[0])
return nil
}
func (p *VisionHornCommand) String() string {
return "vision_horn_command"
}
type VisionArrayLatchesCommandArrayLatches struct {
ArrayFront bool `json:"array_front"`
ArrayRear bool `json:"array_rear"`
}
func (p *VisionArrayLatchesCommandArrayLatches) MarshalByte() byte {
var b byte
if p.ArrayFront {
b |= 1 << 0
}
if p.ArrayRear {
b |= 1 << 1
}
return b
}
func (p *VisionArrayLatchesCommandArrayLatches) UnmarshalByte(b byte) {
p.ArrayFront = (b & (1 << 0)) != 0
p.ArrayRear = (b & (1 << 1)) != 0
}
// VisionArrayLatchesCommand is Command the vision board to open the array latches
type VisionArrayLatchesCommand struct {
ArrayLatches VisionArrayLatchesCommandArrayLatches `json:"array_latches"`
}
func (p *VisionArrayLatchesCommand) CANId() (uint32, error) {
return 0x2B4, nil
}
func (p *VisionArrayLatchesCommand) Size() uint {
return 1
}
func (p *VisionArrayLatchesCommand) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.ArrayLatches.MarshalByte()
return b, nil
}
func (p *VisionArrayLatchesCommand) UnmarshalPacket(b []byte) error {
p.ArrayLatches.UnmarshalByte(b[0])
return nil
}
func (p *VisionArrayLatchesCommand) String() string {
return "vision_array_latches_command"
}
type VisionRearviewCommandCameras struct {
Left bool `json:"left"`
Right bool `json:"right"`
Rear bool `json:"rear"`
}
func (p *VisionRearviewCommandCameras) MarshalByte() byte {
var b byte
if p.Left {
b |= 1 << 0
}
if p.Right {
b |= 1 << 1
}
if p.Rear {
b |= 1 << 2
}
return b
}
func (p *VisionRearviewCommandCameras) UnmarshalByte(b byte) {
p.Left = (b & (1 << 0)) != 0
p.Right = (b & (1 << 1)) != 0
p.Rear = (b & (1 << 2)) != 0
}
// VisionRearviewCommand is Command the vision board turn on the rear view cameras
type VisionRearviewCommand struct {
Cameras VisionRearviewCommandCameras `json:"cameras"`
}
func (p *VisionRearviewCommand) CANId() (uint32, error) {
return 0x2B5, nil
}
func (p *VisionRearviewCommand) Size() uint {
return 1
}
func (p *VisionRearviewCommand) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.Cameras.MarshalByte()
return b, nil
}
func (p *VisionRearviewCommand) UnmarshalPacket(b []byte) error {
p.Cameras.UnmarshalByte(b[0])
return nil
}
func (p *VisionRearviewCommand) String() string {
return "vision_rearview_command"
}
// TrackerEnable is Enables/disables power trackers. Use 0x610 for the channel transmitting the data packet on 0x600, 0x611 for 0x601, et cetera. Sending 1 in the enable byte turns the tracker on; sending 0 turns it off.
type TrackerEnable struct {
Enable uint8 `json:"enable"`
// Idx is the packet index. The accepted range is 0-6
Idx uint32 `json:"idx"`
}
func (p *TrackerEnable) CANId() (uint32, error) {
if p.Idx >= 6 {
return 0, &UnknownIdError{ 0x610 }
}
return 0x610 + p.Idx, nil
}
func (p *TrackerEnable) Size() uint {
return 1
}
func (p *TrackerEnable) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.Enable
return b, nil
}
func (p *TrackerEnable) UnmarshalPacket(b []byte) error {
p.Enable = b[0]
return nil
}
func (p *TrackerEnable) String() string {
return "tracker_enable"
}
// DistanceTraveled is distance of wavesculptor odometer
type DistanceTraveled struct {
// 0 m
TripDistance float32 `json:"trip_distance"`
}
func (p *DistanceTraveled) CANId() (uint32, error) {
return 0x19D, nil
}
func (p *DistanceTraveled) Size() uint {
return 4
}
func (p *DistanceTraveled) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
float32ToBytes(b[0:], p.TripDistance, false)
return b, nil
}
func (p *DistanceTraveled) UnmarshalPacket(b []byte) error {
p.TripDistance = float32FromBytes(b[0:], false)
return nil
}
func (p *DistanceTraveled) String() string {
return "distance_traveled"
}
type ChargerStateStateFlags struct {
ChargerPlugged bool `json:"charger_plugged"`
}
func (p *ChargerStateStateFlags) MarshalByte() byte {
var b byte
if p.ChargerPlugged {
b |= 1 << 0
}
return b
}
func (p *ChargerStateStateFlags) UnmarshalByte(b byte) {
p.ChargerPlugged = (b & (1 << 0)) != 0
}
type ChargerStateFault struct {
CHARGEROVERVOLT bool `json:"CHARGER_OVERVOLT"`
CHARGEROVERTEMP bool `json:"CHARGER_OVERTEMP"`
CHARGERCANTIMEOUT bool `json:"CHARGER_CAN_TIMEOUT"`
BATTERYHVKILL bool `json:"BATTERY_HV_KILL"`
BATTERYUNDERVOLT bool `json:"BATTERY_UNDERVOLT"`
BATTERYOVERVOLT bool `json:"BATTERY_OVERVOLT"`
BATTERYCELLOVERTEMP bool `json:"BATTERY_CELL_OVERTEMP"`
BATTERYCANTIMEOUT bool `json:"BATTERY_CAN_TIMEOUT"`
}
func (p *ChargerStateFault) MarshalByte() byte {
var b byte
if p.CHARGEROVERVOLT {
b |= 1 << 0
}
if p.CHARGEROVERTEMP {
b |= 1 << 1
}
if p.CHARGERCANTIMEOUT {
b |= 1 << 2
}
if p.BATTERYHVKILL {
b |= 1 << 3
}
if p.BATTERYUNDERVOLT {
b |= 1 << 4
}
if p.BATTERYOVERVOLT {
b |= 1 << 5
}
if p.BATTERYCELLOVERTEMP {
b |= 1 << 6
}
if p.BATTERYCANTIMEOUT {
b |= 1 << 7
}
return b
}
func (p *ChargerStateFault) UnmarshalByte(b byte) {
p.CHARGEROVERVOLT = (b & (1 << 0)) != 0
p.CHARGEROVERTEMP = (b & (1 << 1)) != 0
p.CHARGERCANTIMEOUT = (b & (1 << 2)) != 0
p.BATTERYHVKILL = (b & (1 << 3)) != 0
p.BATTERYUNDERVOLT = (b & (1 << 4)) != 0
p.BATTERYOVERVOLT = (b & (1 << 5)) != 0
p.BATTERYCELLOVERTEMP = (b & (1 << 6)) != 0
p.BATTERYCANTIMEOUT = (b & (1 << 7)) != 0
}
// ChargerState is Notifies whether the J1772 cable is plugged.
type ChargerState struct {
StateFlags ChargerStateStateFlags `json:"state_flags"`
// 0.001 C
ChargerMaxTemp uint16 `json:"charger_max_temp"`
Fault ChargerStateFault `json:"fault"`
// 0 A
ChargingCurrent float32 `json:"charging_current"`
}
func (p *ChargerState) CANId() (uint32, error) {
return 0x573, nil
}
func (p *ChargerState) Size() uint {
return 8
}
func (p *ChargerState) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
b[0] = p.StateFlags.MarshalByte()
binary.LittleEndian.PutUint16(b[1:], p.ChargerMaxTemp)
b[3] = p.Fault.MarshalByte()
float32ToBytes(b[4:], p.ChargingCurrent, false)
return b, nil
}
func (p *ChargerState) UnmarshalPacket(b []byte) error {
p.StateFlags.UnmarshalByte(b[0])
p.ChargerMaxTemp = binary.LittleEndian.Uint16(b[1:])
p.Fault.UnmarshalByte(b[3])
p.ChargingCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *ChargerState) String() string {
return "charger_state"
}
type ChargerBmsRequestRequestFlags struct {
ChargingRequested bool `json:"charging_requested"`
}
func (p *ChargerBmsRequestRequestFlags) MarshalByte() byte {
var b byte
if p.ChargingRequested {
b |= 1 << 0
}
return b
}
func (p *ChargerBmsRequestRequestFlags) UnmarshalByte(b byte) {
p.ChargingRequested = (b & (1 << 0)) != 0
}
// ChargerBmsRequest is Request packet for sending contactor commands from the charger to BP.
type ChargerBmsRequest struct {
RequestFlags ChargerBmsRequestRequestFlags `json:"request_flags"`
}
func (p *ChargerBmsRequest) CANId() (uint32, error) {
return 0x74, nil
}
func (p *ChargerBmsRequest) Size() uint {
return 1
}
func (p *ChargerBmsRequest) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.RequestFlags.MarshalByte()
return b, nil
}
func (p *ChargerBmsRequest) UnmarshalPacket(b []byte) error {
p.RequestFlags.UnmarshalByte(b[0])
return nil
}
func (p *ChargerBmsRequest) String() string {
return "charger_bms_request"
}
// ChargerCurrentVoltage is Packet to request charging current/voltage set
type ChargerCurrentVoltage struct {
// 0 A
MaxCurrent float32 `json:"max_current"`
// 0 kWh
MaxCapacity float32 `json:"max_capacity"`
}
func (p *ChargerCurrentVoltage) CANId() (uint32, error) {
return 0x576, nil
}
func (p *ChargerCurrentVoltage) Size() uint {
return 8
}
func (p *ChargerCurrentVoltage) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.MaxCurrent, false)
float32ToBytes(b[4:], p.MaxCapacity, false)
return b, nil
}
func (p *ChargerCurrentVoltage) UnmarshalPacket(b []byte) error {
p.MaxCurrent = float32FromBytes(b[0:], false)
p.MaxCapacity = float32FromBytes(b[4:], false)
return nil
}
func (p *ChargerCurrentVoltage) String() string {
return "charger_current_voltage"
}
// ChargerPower is Outputs the amount of power that the chargers are delivering.
type ChargerPower struct {
// 0 W
Power float32 `json:"power"`
}
func (p *ChargerPower) CANId() (uint32, error) {
return 0x577, nil
}
func (p *ChargerPower) Size() uint {
return 4
}
func (p *ChargerPower) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
float32ToBytes(b[0:], p.Power, false)
return b, nil
}
func (p *ChargerPower) UnmarshalPacket(b []byte) error {
p.Power = float32FromBytes(b[0:], false)
return nil
}
func (p *ChargerPower) String() string {
return "charger_power"
}
// ThunderstruckControlMessage is Control packet for thunderstruck chargers
type ThunderstruckControlMessage struct {
// 1 V
Enable uint8 `json:"Enable"`
// 1 V
CHARGEVOLTAGE uint16 `json:"CHARGE_VOLTAGE"`
// 1 V
CHARGECURRENT uint16 `json:"CHARGE_CURRENT"`
// 1 V
LEDBLINKPATTERN uint8 `json:"LED_BLINK_PATTERN"`
// 1 V
RESERVED uint16 `json:"RESERVED"`
}
func (p *ThunderstruckControlMessage) CANId() (uint32, error) {
return 0x18E54024, nil
}
func (p *ThunderstruckControlMessage) Size() uint {
return 8
}
func (p *ThunderstruckControlMessage) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
b[0] = p.Enable
binary.LittleEndian.PutUint16(b[1:], p.CHARGEVOLTAGE)
binary.LittleEndian.PutUint16(b[3:], p.CHARGECURRENT)
b[5] = p.LEDBLINKPATTERN
binary.LittleEndian.PutUint16(b[6:], p.RESERVED)
return b, nil
}
func (p *ThunderstruckControlMessage) UnmarshalPacket(b []byte) error {
p.Enable = b[0]
p.CHARGEVOLTAGE = binary.LittleEndian.Uint16(b[1:])
p.CHARGECURRENT = binary.LittleEndian.Uint16(b[3:])
p.LEDBLINKPATTERN = b[5]
p.RESERVED = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *ThunderstruckControlMessage) String() string {
return "thunderstruck_control_message"
}
type VisionStatusFrontLights struct {
LeftTurnSignal bool `json:"left_turn_signal"`
RightTurnSignal bool `json:"right_turn_signal"`
BrakeLights bool `json:"brake_lights"`
Headlights bool `json:"headlights"`
HighBeams bool `json:"high_beams"`
Spare1 bool `json:"spare_1"`
Spare2 bool `json:"spare_2"`
Spare3 bool `json:"spare_3"`
}
func (p *VisionStatusFrontLights) MarshalByte() byte {
var b byte
if p.LeftTurnSignal {
b |= 1 << 0
}
if p.RightTurnSignal {
b |= 1 << 1
}
if p.BrakeLights {
b |= 1 << 2
}
if p.Headlights {
b |= 1 << 3
}
if p.HighBeams {
b |= 1 << 4
}
if p.Spare1 {
b |= 1 << 5
}
if p.Spare2 {
b |= 1 << 6
}
if p.Spare3 {
b |= 1 << 7
}
return b
}
func (p *VisionStatusFrontLights) UnmarshalByte(b byte) {
p.LeftTurnSignal = (b & (1 << 0)) != 0
p.RightTurnSignal = (b & (1 << 1)) != 0
p.BrakeLights = (b & (1 << 2)) != 0
p.Headlights = (b & (1 << 3)) != 0
p.HighBeams = (b & (1 << 4)) != 0
p.Spare1 = (b & (1 << 5)) != 0
p.Spare2 = (b & (1 << 6)) != 0
p.Spare3 = (b & (1 << 7)) != 0
}
type VisionStatusFrontHorn struct {
Horn bool `json:"horn"`
Spare bool `json:"spare"`
}
func (p *VisionStatusFrontHorn) MarshalByte() byte {
var b byte
if p.Horn {
b |= 1 << 0
}
if p.Spare {
b |= 1 << 1
}
return b
}
func (p *VisionStatusFrontHorn) UnmarshalByte(b byte) {
p.Horn = (b & (1 << 0)) != 0
p.Spare = (b & (1 << 1)) != 0
}
type VisionStatusFrontCameras struct {
Left bool `json:"left"`
Right bool `json:"right"`
Rear bool `json:"rear"`
}
func (p *VisionStatusFrontCameras) MarshalByte() byte {
var b byte
if p.Left {
b |= 1 << 0
}
if p.Right {
b |= 1 << 1
}
if p.Rear {
b |= 1 << 2
}
return b
}
func (p *VisionStatusFrontCameras) UnmarshalByte(b byte) {
p.Left = (b & (1 << 0)) != 0
p.Right = (b & (1 << 1)) != 0
p.Rear = (b & (1 << 2)) != 0
}
type VisionStatusFrontArrayLatches struct {
ArrayFront0 bool `json:"array_front_0"`
ArrayFront1 bool `json:"array_front_1"`
ArrayRear0 bool `json:"array_rear_0"`
ArrayRear1 bool `json:"array_rear_1"`
}
func (p *VisionStatusFrontArrayLatches) MarshalByte() byte {
var b byte
if p.ArrayFront0 {
b |= 1 << 0
}
if p.ArrayFront1 {
b |= 1 << 1
}
if p.ArrayRear0 {
b |= 1 << 2
}
if p.ArrayRear1 {
b |= 1 << 3
}
return b
}
func (p *VisionStatusFrontArrayLatches) UnmarshalByte(b byte) {
p.ArrayFront0 = (b & (1 << 0)) != 0
p.ArrayFront1 = (b & (1 << 1)) != 0
p.ArrayRear0 = (b & (1 << 2)) != 0
p.ArrayRear1 = (b & (1 << 3)) != 0
}
// VisionStatusFront is Status of the front vision board outputs
type VisionStatusFront struct {
Lights VisionStatusFrontLights `json:"lights"`
Horn VisionStatusFrontHorn `json:"horn"`
Cameras VisionStatusFrontCameras `json:"cameras"`
ArrayLatches VisionStatusFrontArrayLatches `json:"array_latches"`
}
func (p *VisionStatusFront) CANId() (uint32, error) {
return 0x2B6, nil
}
func (p *VisionStatusFront) Size() uint {
return 4
}
func (p *VisionStatusFront) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
b[0] = p.Lights.MarshalByte()
b[1] = p.Horn.MarshalByte()
b[2] = p.Cameras.MarshalByte()
b[3] = p.ArrayLatches.MarshalByte()
return b, nil
}
func (p *VisionStatusFront) UnmarshalPacket(b []byte) error {
p.Lights.UnmarshalByte(b[0])
p.Horn.UnmarshalByte(b[1])
p.Cameras.UnmarshalByte(b[2])
p.ArrayLatches.UnmarshalByte(b[3])
return nil
}
func (p *VisionStatusFront) String() string {
return "vision_status_front"
}
type VisionStatusRearLights struct {
LeftTurnSignal bool `json:"left_turn_signal"`
RightTurnSignal bool `json:"right_turn_signal"`
BrakeLights bool `json:"brake_lights"`
Headlights bool `json:"headlights"`
HighBeams bool `json:"high_beams"`
Spare1 bool `json:"spare_1"`
Spare2 bool `json:"spare_2"`
Spare3 bool `json:"spare_3"`
}
func (p *VisionStatusRearLights) MarshalByte() byte {
var b byte
if p.LeftTurnSignal {
b |= 1 << 0
}
if p.RightTurnSignal {
b |= 1 << 1
}
if p.BrakeLights {
b |= 1 << 2
}
if p.Headlights {
b |= 1 << 3
}
if p.HighBeams {
b |= 1 << 4
}
if p.Spare1 {
b |= 1 << 5
}
if p.Spare2 {
b |= 1 << 6
}
if p.Spare3 {
b |= 1 << 7
}
return b
}
func (p *VisionStatusRearLights) UnmarshalByte(b byte) {
p.LeftTurnSignal = (b & (1 << 0)) != 0
p.RightTurnSignal = (b & (1 << 1)) != 0
p.BrakeLights = (b & (1 << 2)) != 0
p.Headlights = (b & (1 << 3)) != 0
p.HighBeams = (b & (1 << 4)) != 0
p.Spare1 = (b & (1 << 5)) != 0
p.Spare2 = (b & (1 << 6)) != 0
p.Spare3 = (b & (1 << 7)) != 0
}
type VisionStatusRearHorn struct {
Horn bool `json:"horn"`
Spare bool `json:"spare"`
}
func (p *VisionStatusRearHorn) MarshalByte() byte {
var b byte
if p.Horn {
b |= 1 << 0
}
if p.Spare {
b |= 1 << 1
}
return b
}
func (p *VisionStatusRearHorn) UnmarshalByte(b byte) {
p.Horn = (b & (1 << 0)) != 0
p.Spare = (b & (1 << 1)) != 0
}
type VisionStatusRearCameras struct {
Left bool `json:"left"`
Right bool `json:"right"`
Rear bool `json:"rear"`
}
func (p *VisionStatusRearCameras) MarshalByte() byte {
var b byte
if p.Left {
b |= 1 << 0
}
if p.Right {
b |= 1 << 1
}
if p.Rear {
b |= 1 << 2
}
return b
}
func (p *VisionStatusRearCameras) UnmarshalByte(b byte) {
p.Left = (b & (1 << 0)) != 0
p.Right = (b & (1 << 1)) != 0
p.Rear = (b & (1 << 2)) != 0
}
type VisionStatusRearArrayLatches struct {
ArrayFront0 bool `json:"array_front_0"`
ArrayFront1 bool `json:"array_front_1"`
ArrayRear0 bool `json:"array_rear_0"`
ArrayRear1 bool `json:"array_rear_1"`
}
func (p *VisionStatusRearArrayLatches) MarshalByte() byte {
var b byte
if p.ArrayFront0 {
b |= 1 << 0
}
if p.ArrayFront1 {
b |= 1 << 1
}
if p.ArrayRear0 {
b |= 1 << 2
}
if p.ArrayRear1 {
b |= 1 << 3
}
return b
}
func (p *VisionStatusRearArrayLatches) UnmarshalByte(b byte) {
p.ArrayFront0 = (b & (1 << 0)) != 0
p.ArrayFront1 = (b & (1 << 1)) != 0
p.ArrayRear0 = (b & (1 << 2)) != 0
p.ArrayRear1 = (b & (1 << 3)) != 0
}
// VisionStatusRear is Status of the rear vision board outputs
type VisionStatusRear struct {
Lights VisionStatusRearLights `json:"lights"`
Horn VisionStatusRearHorn `json:"horn"`
Cameras VisionStatusRearCameras `json:"cameras"`
ArrayLatches VisionStatusRearArrayLatches `json:"array_latches"`
}
func (p *VisionStatusRear) CANId() (uint32, error) {
return 0x2B7, nil
}
func (p *VisionStatusRear) Size() uint {
return 4
}
func (p *VisionStatusRear) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
b[0] = p.Lights.MarshalByte()
b[1] = p.Horn.MarshalByte()
b[2] = p.Cameras.MarshalByte()
b[3] = p.ArrayLatches.MarshalByte()
return b, nil
}
func (p *VisionStatusRear) UnmarshalPacket(b []byte) error {
p.Lights.UnmarshalByte(b[0])
p.Horn.UnmarshalByte(b[1])
p.Cameras.UnmarshalByte(b[2])
p.ArrayLatches.UnmarshalByte(b[3])
return nil
}
func (p *VisionStatusRear) String() string {
return "vision_status_rear"
}
// LightsFrontId is Unique identification packet for front lights board
type LightsFrontId struct {
BoardId uint16 `json:"board_id"`
// 0.01 C
McuTemp int16 `json:"mcu_temp"`
// 0.001 V
BusVoltage uint16 `json:"bus_voltage"`
FaultCode uint16 `json:"fault_code"`
}
func (p *LightsFrontId) CANId() (uint32, error) {
return 0x300, nil
}
func (p *LightsFrontId) Size() uint {
return 8
}
func (p *LightsFrontId) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint16(b[0:], p.BoardId)
binary.LittleEndian.PutUint16(b[2:], uint16(p.McuTemp))
binary.LittleEndian.PutUint16(b[4:], p.BusVoltage)
binary.LittleEndian.PutUint16(b[6:], p.FaultCode)
return b, nil
}
func (p *LightsFrontId) UnmarshalPacket(b []byte) error {
p.BoardId = binary.LittleEndian.Uint16(b[0:])
p.McuTemp = int16(binary.LittleEndian.Uint16(b[2:]))
p.BusVoltage = binary.LittleEndian.Uint16(b[4:])
p.FaultCode = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *LightsFrontId) String() string {
return "lights_front_id"
}
// LightsBackId is Unique identification packet for back lights board
type LightsBackId struct {
BoardId uint16 `json:"board_id"`
// 0.01 C
McuTemp int16 `json:"mcu_temp"`
// 0.001 V
BusVoltage uint16 `json:"bus_voltage"`
FaultCode uint16 `json:"fault_code"`
}
func (p *LightsBackId) CANId() (uint32, error) {
return 0x301, nil
}
func (p *LightsBackId) Size() uint {
return 8
}
func (p *LightsBackId) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint16(b[0:], p.BoardId)
binary.LittleEndian.PutUint16(b[2:], uint16(p.McuTemp))
binary.LittleEndian.PutUint16(b[4:], p.BusVoltage)
binary.LittleEndian.PutUint16(b[6:], p.FaultCode)
return b, nil
}
func (p *LightsBackId) UnmarshalPacket(b []byte) error {
p.BoardId = binary.LittleEndian.Uint16(b[0:])
p.McuTemp = int16(binary.LittleEndian.Uint16(b[2:]))
p.BusVoltage = binary.LittleEndian.Uint16(b[4:])
p.FaultCode = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *LightsBackId) String() string {
return "lights_back_id"
}
// VisionId is Unique identification packet for vision
type VisionId struct {
BoardId uint16 `json:"board_id"`
// 0.01 C
McuTemp int16 `json:"mcu_temp"`
// 0.001 V
BusVoltage uint16 `json:"bus_voltage"`
FaultCode uint16 `json:"fault_code"`
}
func (p *VisionId) CANId() (uint32, error) {
return 0x302, nil
}
func (p *VisionId) Size() uint {
return 8
}
func (p *VisionId) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint16(b[0:], p.BoardId)
binary.LittleEndian.PutUint16(b[2:], uint16(p.McuTemp))
binary.LittleEndian.PutUint16(b[4:], p.BusVoltage)
binary.LittleEndian.PutUint16(b[6:], p.FaultCode)
return b, nil
}
func (p *VisionId) UnmarshalPacket(b []byte) error {
p.BoardId = binary.LittleEndian.Uint16(b[0:])
p.McuTemp = int16(binary.LittleEndian.Uint16(b[2:]))
p.BusVoltage = binary.LittleEndian.Uint16(b[4:])
p.FaultCode = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *VisionId) String() string {
return "vision_id"
}
// SteeringPressCount1 is Shows whether each button has been toggled an even ("on") or odd ("off") number of times.
type SteeringPressCount1 struct {
Button0 uint8 `json:"button0"`
Button1 uint8 `json:"button1"`
Button2 uint8 `json:"button2"`
Button3 uint8 `json:"button3"`
Button4 uint8 `json:"button4"`
Button5 uint8 `json:"button5"`
Button6 uint8 `json:"button6"`
}
func (p *SteeringPressCount1) CANId() (uint32, error) {
return 0x240, nil
}
func (p *SteeringPressCount1) Size() uint {
return 7
}
func (p *SteeringPressCount1) MarshalPacket() ([]byte, error) {
b := make([]byte, 7)
b[0] = p.Button0
b[1] = p.Button1
b[2] = p.Button2
b[3] = p.Button3
b[4] = p.Button4
b[5] = p.Button5
b[6] = p.Button6
return b, nil
}
func (p *SteeringPressCount1) UnmarshalPacket(b []byte) error {
p.Button0 = b[0]
p.Button1 = b[1]
p.Button2 = b[2]
p.Button3 = b[3]
p.Button4 = b[4]
p.Button5 = b[5]
p.Button6 = b[6]
return nil
}
func (p *SteeringPressCount1) String() string {
return "steering_press_count_1"
}
// SteeringPressCount2 is Shows whether each button has been toggled an even ("on") or odd ("off") number of times.
type SteeringPressCount2 struct {
Button7 uint8 `json:"button7"`
Button8 uint8 `json:"button8"`
Button9 uint8 `json:"button9"`
Button10 uint8 `json:"button10"`
}
func (p *SteeringPressCount2) CANId() (uint32, error) {
return 0x250, nil
}
func (p *SteeringPressCount2) Size() uint {
return 4
}
func (p *SteeringPressCount2) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
b[0] = p.Button7
b[1] = p.Button8
b[2] = p.Button9
b[3] = p.Button10
return b, nil
}
func (p *SteeringPressCount2) UnmarshalPacket(b []byte) error {
p.Button7 = b[0]
p.Button8 = b[1]
p.Button9 = b[2]
p.Button10 = b[3]
return nil
}
func (p *SteeringPressCount2) String() string {
return "steering_press_count_2"
}
// SteeringButtonColors1 is This packet controls each button's color. Each byte is a hex color code.
type SteeringButtonColors1 struct {
Button0 uint8 `json:"button0"`
Button1 uint8 `json:"button1"`
Button2 uint8 `json:"button2"`
Button3 uint8 `json:"button3"`
Button4 uint8 `json:"button4"`
Button5 uint8 `json:"button5"`
Button6 uint8 `json:"button6"`
}
func (p *SteeringButtonColors1) CANId() (uint32, error) {
return 0x241, nil
}
func (p *SteeringButtonColors1) Size() uint {
return 7
}
func (p *SteeringButtonColors1) MarshalPacket() ([]byte, error) {
b := make([]byte, 7)
b[0] = p.Button0
b[1] = p.Button1
b[2] = p.Button2
b[3] = p.Button3
b[4] = p.Button4
b[5] = p.Button5
b[6] = p.Button6
return b, nil
}
func (p *SteeringButtonColors1) UnmarshalPacket(b []byte) error {
p.Button0 = b[0]
p.Button1 = b[1]
p.Button2 = b[2]
p.Button3 = b[3]
p.Button4 = b[4]
p.Button5 = b[5]
p.Button6 = b[6]
return nil
}
func (p *SteeringButtonColors1) String() string {
return "steering_button_colors_1"
}
// SteeringButtonColors2 is This packet controls each button's color. Each byte is a hex color code.
type SteeringButtonColors2 struct {
Button7 uint8 `json:"button7"`
Button8 uint8 `json:"button8"`
Button9 uint8 `json:"button9"`
Button10 uint8 `json:"button10"`
}
func (p *SteeringButtonColors2) CANId() (uint32, error) {
return 0x251, nil
}
func (p *SteeringButtonColors2) Size() uint {
return 4
}
func (p *SteeringButtonColors2) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
b[0] = p.Button7
b[1] = p.Button8
b[2] = p.Button9
b[3] = p.Button10
return b, nil
}
func (p *SteeringButtonColors2) UnmarshalPacket(b []byte) error {
p.Button7 = b[0]
p.Button8 = b[1]
p.Button9 = b[2]
p.Button10 = b[3]
return nil
}
func (p *SteeringButtonColors2) String() string {
return "steering_button_colors_2"
}
// SteeringHorn is This packet controls the state of the horn.
type SteeringHorn struct {
Horn uint8 `json:"horn"`
}
func (p *SteeringHorn) CANId() (uint32, error) {
return 0x242, nil
}
func (p *SteeringHorn) Size() uint {
return 1
}
func (p *SteeringHorn) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.Horn
return b, nil
}
func (p *SteeringHorn) UnmarshalPacket(b []byte) error {
p.Horn = b[0]
return nil
}
func (p *SteeringHorn) String() string {
return "steering_horn"
}
// ThunderstruckStatusMessage is Status packet for thunderstruck chargers
type ThunderstruckStatusMessage struct {
// 1 V
STATUSFLAGS uint8 `json:"STATUS_FLAGS"`
// 1 V
CHARGEFLAGS uint8 `json:"CHARGE_FLAGS"`
// 1 V
OUTPUTVOLTAGE uint16 `json:"OUTPUT_VOLTAGE"`
// 1 V
OUTPUTCURRENT uint16 `json:"OUTPUT_CURRENT"`
// 1 V
CHARGERTEMP uint8 `json:"CHARGER_TEMP"`
// 1 V
RESERVED uint8 `json:"RESERVED"`
}
func (p *ThunderstruckStatusMessage) CANId() (uint32, error) {
return 0x18EB2440, nil
}
func (p *ThunderstruckStatusMessage) Size() uint {
return 8
}
func (p *ThunderstruckStatusMessage) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
b[0] = p.STATUSFLAGS
b[1] = p.CHARGEFLAGS
binary.LittleEndian.PutUint16(b[2:], p.OUTPUTVOLTAGE)
binary.LittleEndian.PutUint16(b[4:], p.OUTPUTCURRENT)
b[6] = p.CHARGERTEMP
b[7] = p.RESERVED
return b, nil
}
func (p *ThunderstruckStatusMessage) UnmarshalPacket(b []byte) error {
p.STATUSFLAGS = b[0]
p.CHARGEFLAGS = b[1]
p.OUTPUTVOLTAGE = binary.LittleEndian.Uint16(b[2:])
p.OUTPUTCURRENT = binary.LittleEndian.Uint16(b[4:])
p.CHARGERTEMP = b[6]
p.RESERVED = b[7]
return nil
}
func (p *ThunderstruckStatusMessage) String() string {
return "thunderstruck_status_message"
}
// TrackerData is Tracker data. Each channel transmits on a specific ID, which should be specified along with the tracker, most likely 0x600-0x603.
type TrackerData struct {
// 0.01 V
ArrayVoltage uint16 `json:"array_voltage"`
// 0.001 A
ArrayCurrent uint16 `json:"array_current"`
// 0.01 V
BatteryVoltage uint16 `json:"battery_voltage"`
// 0.01 C
Temperature uint16 `json:"temperature"`
// Idx is the packet index. The accepted range is 0-6
Idx uint32 `json:"idx"`
}
func (p *TrackerData) CANId() (uint32, error) {
if p.Idx >= 6 {
return 0, &UnknownIdError{ 0x600 }
}
return 0x600 + p.Idx, nil
}
func (p *TrackerData) Size() uint {
return 8
}
func (p *TrackerData) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint16(b[0:], p.ArrayVoltage)
binary.LittleEndian.PutUint16(b[2:], p.ArrayCurrent)
binary.LittleEndian.PutUint16(b[4:], p.BatteryVoltage)
binary.LittleEndian.PutUint16(b[6:], p.Temperature)
return b, nil
}
func (p *TrackerData) UnmarshalPacket(b []byte) error {
p.ArrayVoltage = binary.LittleEndian.Uint16(b[0:])
p.ArrayCurrent = binary.LittleEndian.Uint16(b[2:])
p.BatteryVoltage = binary.LittleEndian.Uint16(b[4:])
p.Temperature = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *TrackerData) String() string {
return "tracker_data"
}
// TritiumMotorDriveL is Tritium Motor Drive Command
type TritiumMotorDriveL struct {
MotorVelocity float32 `json:"motor_velocity"`
MotorCurrent float32 `json:"motor_current"`
}
func (p *TritiumMotorDriveL) CANId() (uint32, error) {
return 0x121, nil
}
func (p *TritiumMotorDriveL) Size() uint {
return 8
}
func (p *TritiumMotorDriveL) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.MotorVelocity, false)
float32ToBytes(b[4:], p.MotorCurrent, false)
return b, nil
}
func (p *TritiumMotorDriveL) UnmarshalPacket(b []byte) error {
p.MotorVelocity = float32FromBytes(b[0:], false)
p.MotorCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *TritiumMotorDriveL) String() string {
return "tritium_motor_drive_l"
}
// TritiumMotorPowerL is Tritium Motor Power Command
type TritiumMotorPowerL struct {
Reserved float32 `json:"reserved"`
BusCurrent float32 `json:"bus_current"`
}
func (p *TritiumMotorPowerL) CANId() (uint32, error) {
return 0x122, nil
}
func (p *TritiumMotorPowerL) Size() uint {
return 8
}
func (p *TritiumMotorPowerL) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Reserved, false)
float32ToBytes(b[4:], p.BusCurrent, false)
return b, nil
}
func (p *TritiumMotorPowerL) UnmarshalPacket(b []byte) error {
p.Reserved = float32FromBytes(b[0:], false)
p.BusCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *TritiumMotorPowerL) String() string {
return "tritium_motor_power_l"
}
// TritiumResetL is Tritium Reset Command
type TritiumResetL struct {
Unused1 float32 `json:"unused1"`
Unused2 float32 `json:"unused2"`
}
func (p *TritiumResetL) CANId() (uint32, error) {
return 0x123, nil
}
func (p *TritiumResetL) Size() uint {
return 8
}
func (p *TritiumResetL) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Unused1, false)
float32ToBytes(b[4:], p.Unused2, false)
return b, nil
}
func (p *TritiumResetL) UnmarshalPacket(b []byte) error {
p.Unused1 = float32FromBytes(b[0:], false)
p.Unused2 = float32FromBytes(b[4:], false)
return nil
}
func (p *TritiumResetL) String() string {
return "tritium_reset_l"
}
// TritiumMotorDriveR is Tritium Motor Drive Command
type TritiumMotorDriveR struct {
MotorVelocity float32 `json:"motor_velocity"`
MotorCurrent float32 `json:"motor_current"`
}
func (p *TritiumMotorDriveR) CANId() (uint32, error) {
return 0x161, nil
}
func (p *TritiumMotorDriveR) Size() uint {
return 8
}
func (p *TritiumMotorDriveR) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.MotorVelocity, false)
float32ToBytes(b[4:], p.MotorCurrent, false)
return b, nil
}
func (p *TritiumMotorDriveR) UnmarshalPacket(b []byte) error {
p.MotorVelocity = float32FromBytes(b[0:], false)
p.MotorCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *TritiumMotorDriveR) String() string {
return "tritium_motor_drive_r"
}
// TritiumMotorPowerR is Tritium Motor Power Command
type TritiumMotorPowerR struct {
Reserved float32 `json:"reserved"`
BusCurrent float32 `json:"bus_current"`
}
func (p *TritiumMotorPowerR) CANId() (uint32, error) {
return 0x162, nil
}
func (p *TritiumMotorPowerR) Size() uint {
return 8
}
func (p *TritiumMotorPowerR) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Reserved, false)
float32ToBytes(b[4:], p.BusCurrent, false)
return b, nil
}
func (p *TritiumMotorPowerR) UnmarshalPacket(b []byte) error {
p.Reserved = float32FromBytes(b[0:], false)
p.BusCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *TritiumMotorPowerR) String() string {
return "tritium_motor_power_r"
}
// TritiumResetR is Tritium Reset Command
type TritiumResetR struct {
Unused1 float32 `json:"unused1"`
Unused2 float32 `json:"unused2"`
}
func (p *TritiumResetR) CANId() (uint32, error) {
return 0x163, nil
}
func (p *TritiumResetR) Size() uint {
return 8
}
func (p *TritiumResetR) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Unused1, false)
float32ToBytes(b[4:], p.Unused2, false)
return b, nil
}
func (p *TritiumResetR) UnmarshalPacket(b []byte) error {
p.Unused1 = float32FromBytes(b[0:], false)
p.Unused2 = float32FromBytes(b[4:], false)
return nil
}
func (p *TritiumResetR) String() string {
return "tritium_reset_r"
}
// BmsAhSet is write state of charge, use with caution
type BmsAhSet struct {
Ah uint32 `json:"ah"`
}
func (p *BmsAhSet) CANId() (uint32, error) {
return 0x16, nil
}
func (p *BmsAhSet) Size() uint {
return 4
}
func (p *BmsAhSet) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
binary.LittleEndian.PutUint32(b[0:], p.Ah)
return b, nil
}
func (p *BmsAhSet) UnmarshalPacket(b []byte) error {
p.Ah = binary.LittleEndian.Uint32(b[0:])
return nil
}
func (p *BmsAhSet) String() string {
return "bms_ah_set"
}
// BmsWhSet is write state of charge, use with caution
type BmsWhSet struct {
Wh uint32 `json:"wh"`
}
func (p *BmsWhSet) CANId() (uint32, error) {
return 0x17, nil
}
func (p *BmsWhSet) Size() uint {
return 4
}
func (p *BmsWhSet) MarshalPacket() ([]byte, error) {
b := make([]byte, 4)
binary.LittleEndian.PutUint32(b[0:], p.Wh)
return b, nil
}
func (p *BmsWhSet) UnmarshalPacket(b []byte) error {
p.Wh = binary.LittleEndian.Uint32(b[0:])
return nil
}
func (p *BmsWhSet) String() string {
return "bms_wh_set"
}
type BmsKillKillType struct {
KILLHARD bool `json:"KILL_HARD"`
}
func (p *BmsKillKillType) MarshalByte() byte {
var b byte
if p.KILLHARD {
b |= 1 << 0
}
return b
}
func (p *BmsKillKillType) UnmarshalByte(b byte) {
p.KILLHARD = (b & (1 << 0)) != 0
}
// BmsKill is packet to cause BMS kill
type BmsKill struct {
KillType BmsKillKillType `json:"kill_type"`
}
func (p *BmsKill) CANId() (uint32, error) {
return 0x1A, nil
}
func (p *BmsKill) Size() uint {
return 1
}
func (p *BmsKill) MarshalPacket() ([]byte, error) {
b := make([]byte, 1)
b[0] = p.KillType.MarshalByte()
return b, nil
}
func (p *BmsKill) UnmarshalPacket(b []byte) error {
p.KillType.UnmarshalByte(b[0])
return nil
}
func (p *BmsKill) String() string {
return "bms_kill"
}
// TelemetryRtcReset is Reset telemetry's real-time clock (RTC).
type TelemetryRtcReset struct {
Year uint8 `json:"year"`
Month uint8 `json:"month"`
Day uint8 `json:"day"`
Hour uint8 `json:"hour"`
Minute uint8 `json:"minute"`
Second uint8 `json:"second"`
}
func (p *TelemetryRtcReset) CANId() (uint32, error) {
return 0x700, nil
}
func (p *TelemetryRtcReset) Size() uint {
return 6
}
func (p *TelemetryRtcReset) MarshalPacket() ([]byte, error) {
b := make([]byte, 6)
b[0] = p.Year
b[1] = p.Month
b[2] = p.Day
b[3] = p.Hour
b[4] = p.Minute
b[5] = p.Second
return b, nil
}
func (p *TelemetryRtcReset) UnmarshalPacket(b []byte) error {
p.Year = b[0]
p.Month = b[1]
p.Day = b[2]
p.Hour = b[3]
p.Minute = b[4]
p.Second = b[5]
return nil
}
func (p *TelemetryRtcReset) String() string {
return "telemetry_rtc_reset"
}
// WsrIdentification is WS RIGHT Identification Information
type WsrIdentification struct {
TritiumId uint32 `json:"tritium_id"`
SerialNumber uint32 `json:"serial_number"`
}
func (p *WsrIdentification) CANId() (uint32, error) {
return 0x140, nil
}
func (p *WsrIdentification) Size() uint {
return 8
}
func (p *WsrIdentification) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint32(b[0:], p.TritiumId)
binary.LittleEndian.PutUint32(b[4:], p.SerialNumber)
return b, nil
}
func (p *WsrIdentification) UnmarshalPacket(b []byte) error {
p.TritiumId = binary.LittleEndian.Uint32(b[0:])
p.SerialNumber = binary.LittleEndian.Uint32(b[4:])
return nil
}
func (p *WsrIdentification) String() string {
return "wsr_identification"
}
type WsrStatusInformationLimitFlags struct {
OutputVoltagePwm bool `json:"output_voltage_pwm"`
MotorCurrent bool `json:"motor_current"`
Velocity bool `json:"velocity"`
BusCurrent bool `json:"bus_current"`
BusVoltageUpperLimit bool `json:"bus_voltage_upper_limit"`
BusVoltageLowerLimit bool `json:"bus_voltage_lower_limit"`
IpmTemperatureOrMotorTemperature bool `json:"ipm_temperature_or_motor_temperature"`
Reserved bool `json:"reserved"`
}
func (p *WsrStatusInformationLimitFlags) MarshalByte() byte {
var b byte
if p.OutputVoltagePwm {
b |= 1 << 0
}
if p.MotorCurrent {
b |= 1 << 1
}
if p.Velocity {
b |= 1 << 2
}
if p.BusCurrent {
b |= 1 << 3
}
if p.BusVoltageUpperLimit {
b |= 1 << 4
}
if p.BusVoltageLowerLimit {
b |= 1 << 5
}
if p.IpmTemperatureOrMotorTemperature {
b |= 1 << 6
}
if p.Reserved {
b |= 1 << 7
}
return b
}
func (p *WsrStatusInformationLimitFlags) UnmarshalByte(b byte) {
p.OutputVoltagePwm = (b & (1 << 0)) != 0
p.MotorCurrent = (b & (1 << 1)) != 0
p.Velocity = (b & (1 << 2)) != 0
p.BusCurrent = (b & (1 << 3)) != 0
p.BusVoltageUpperLimit = (b & (1 << 4)) != 0
p.BusVoltageLowerLimit = (b & (1 << 5)) != 0
p.IpmTemperatureOrMotorTemperature = (b & (1 << 6)) != 0
p.Reserved = (b & (1 << 7)) != 0
}
type WsrStatusInformationErrorFlags0 struct {
HardwareOverCurrent bool `json:"hardware_over_current"`
SoftwareOverCurrent bool `json:"software_over_current"`
DcBusOverVoltage bool `json:"dc_bus_over_voltage"`
BadMotorPositionHallSequence bool `json:"bad_motor_position_hall_sequence"`
WatchdogCausedLastReset bool `json:"watchdog_caused_last_reset"`
ConfigReadError bool `json:"config_read_error"`
LvRailUnderVoltageLockOut bool `json:"lv_rail_under_voltage_lock_out"`
DesaturationFault bool `json:"desaturation_fault"`
}
func (p *WsrStatusInformationErrorFlags0) MarshalByte() byte {
var b byte
if p.HardwareOverCurrent {
b |= 1 << 0
}
if p.SoftwareOverCurrent {
b |= 1 << 1
}
if p.DcBusOverVoltage {
b |= 1 << 2
}
if p.BadMotorPositionHallSequence {
b |= 1 << 3
}
if p.WatchdogCausedLastReset {
b |= 1 << 4
}
if p.ConfigReadError {
b |= 1 << 5
}
if p.LvRailUnderVoltageLockOut {
b |= 1 << 6
}
if p.DesaturationFault {
b |= 1 << 7
}
return b
}
func (p *WsrStatusInformationErrorFlags0) UnmarshalByte(b byte) {
p.HardwareOverCurrent = (b & (1 << 0)) != 0
p.SoftwareOverCurrent = (b & (1 << 1)) != 0
p.DcBusOverVoltage = (b & (1 << 2)) != 0
p.BadMotorPositionHallSequence = (b & (1 << 3)) != 0
p.WatchdogCausedLastReset = (b & (1 << 4)) != 0
p.ConfigReadError = (b & (1 << 5)) != 0
p.LvRailUnderVoltageLockOut = (b & (1 << 6)) != 0
p.DesaturationFault = (b & (1 << 7)) != 0
}
type WsrStatusInformationErrorFlags1 struct {
MotorOverSpeed bool `json:"motor_over_speed"`
Reserved9 bool `json:"reserved_9"`
Reserved10 bool `json:"reserved_10"`
Reserved11 bool `json:"reserved_11"`
Reserved12 bool `json:"reserved_12"`
Reserved13 bool `json:"reserved_13"`
Reserved14 bool `json:"reserved_14"`
Reserved15 bool `json:"reserved_15"`
}
func (p *WsrStatusInformationErrorFlags1) MarshalByte() byte {
var b byte
if p.MotorOverSpeed {
b |= 1 << 0
}
if p.Reserved9 {
b |= 1 << 1
}
if p.Reserved10 {
b |= 1 << 2
}
if p.Reserved11 {
b |= 1 << 3
}
if p.Reserved12 {
b |= 1 << 4
}
if p.Reserved13 {
b |= 1 << 5
}
if p.Reserved14 {
b |= 1 << 6
}
if p.Reserved15 {
b |= 1 << 7
}
return b
}
func (p *WsrStatusInformationErrorFlags1) UnmarshalByte(b byte) {
p.MotorOverSpeed = (b & (1 << 0)) != 0
p.Reserved9 = (b & (1 << 1)) != 0
p.Reserved10 = (b & (1 << 2)) != 0
p.Reserved11 = (b & (1 << 3)) != 0
p.Reserved12 = (b & (1 << 4)) != 0
p.Reserved13 = (b & (1 << 5)) != 0
p.Reserved14 = (b & (1 << 6)) != 0
p.Reserved15 = (b & (1 << 7)) != 0
}
// WsrStatusInformation is WS RIGHT Status Information
type WsrStatusInformation struct {
LimitFlags WsrStatusInformationLimitFlags `json:"limit_flags"`
LimitFlagsReserved uint8 `json:"limit_flags_reserved"`
ErrorFlags0 WsrStatusInformationErrorFlags0 `json:"error_flags_0"`
ErrorFlags1 WsrStatusInformationErrorFlags1 `json:"error_flags_1"`
ActiveMotor uint16 `json:"active_motor"`
Reserved uint16 `json:"reserved"`
}
func (p *WsrStatusInformation) CANId() (uint32, error) {
return 0x141, nil
}
func (p *WsrStatusInformation) Size() uint {
return 8
}
func (p *WsrStatusInformation) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
b[0] = p.LimitFlags.MarshalByte()
b[1] = p.LimitFlagsReserved
b[2] = p.ErrorFlags0.MarshalByte()
b[3] = p.ErrorFlags1.MarshalByte()
binary.LittleEndian.PutUint16(b[4:], p.ActiveMotor)
binary.LittleEndian.PutUint16(b[6:], p.Reserved)
return b, nil
}
func (p *WsrStatusInformation) UnmarshalPacket(b []byte) error {
p.LimitFlags.UnmarshalByte(b[0])
p.LimitFlagsReserved = b[1]
p.ErrorFlags0.UnmarshalByte(b[2])
p.ErrorFlags1.UnmarshalByte(b[3])
p.ActiveMotor = binary.LittleEndian.Uint16(b[4:])
p.Reserved = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *WsrStatusInformation) String() string {
return "wsr_status_information"
}
// WsrBusMeasurement is WS RIGHT Bus Measurement
type WsrBusMeasurement struct {
// 0 V
BusVoltage float32 `json:"bus_voltage"`
// 0 A
BusCurrent float32 `json:"bus_current"`
}
func (p *WsrBusMeasurement) CANId() (uint32, error) {
return 0x142, nil
}
func (p *WsrBusMeasurement) Size() uint {
return 8
}
func (p *WsrBusMeasurement) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.BusVoltage, false)
float32ToBytes(b[4:], p.BusCurrent, false)
return b, nil
}
func (p *WsrBusMeasurement) UnmarshalPacket(b []byte) error {
p.BusVoltage = float32FromBytes(b[0:], false)
p.BusCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrBusMeasurement) String() string {
return "wsr_bus_measurement"
}
// WsrVelocity is WS RIGHT Velocity Measurement
type WsrVelocity struct {
// 0 rpm
MotorVelocity float32 `json:"motor_velocity"`
// 0 m/s
VehicleVelocity float32 `json:"vehicle_velocity"`
}
func (p *WsrVelocity) CANId() (uint32, error) {
return 0x143, nil
}
func (p *WsrVelocity) Size() uint {
return 8
}
func (p *WsrVelocity) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.MotorVelocity, false)
float32ToBytes(b[4:], p.VehicleVelocity, false)
return b, nil
}
func (p *WsrVelocity) UnmarshalPacket(b []byte) error {
p.MotorVelocity = float32FromBytes(b[0:], false)
p.VehicleVelocity = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrVelocity) String() string {
return "wsr_velocity"
}
// WsrPhaseCurrent is WS RIGHT Phase Current Measurement
type WsrPhaseCurrent struct {
// 0 A rms
PhaseBCurrent float32 `json:"phase_b_current"`
// 0 A rms
PhaseCCurrent float32 `json:"phase_c_current"`
}
func (p *WsrPhaseCurrent) CANId() (uint32, error) {
return 0x144, nil
}
func (p *WsrPhaseCurrent) Size() uint {
return 8
}
func (p *WsrPhaseCurrent) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.PhaseBCurrent, false)
float32ToBytes(b[4:], p.PhaseCCurrent, false)
return b, nil
}
func (p *WsrPhaseCurrent) UnmarshalPacket(b []byte) error {
p.PhaseBCurrent = float32FromBytes(b[0:], false)
p.PhaseCCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrPhaseCurrent) String() string {
return "wsr_phase_current"
}
// WsrMotorVoltageVector is WS RIGHT Motor Voltage Vector Measurement
type WsrMotorVoltageVector struct {
// 0 V
Vq float32 `json:"vq"`
// 0 V
Vd float32 `json:"vd"`
}
func (p *WsrMotorVoltageVector) CANId() (uint32, error) {
return 0x145, nil
}
func (p *WsrMotorVoltageVector) Size() uint {
return 8
}
func (p *WsrMotorVoltageVector) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Vq, false)
float32ToBytes(b[4:], p.Vd, false)
return b, nil
}
func (p *WsrMotorVoltageVector) UnmarshalPacket(b []byte) error {
p.Vq = float32FromBytes(b[0:], false)
p.Vd = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrMotorVoltageVector) String() string {
return "wsr_motor_voltage_vector"
}
// WsrMotorCurrentVector is WS RIGHT Motor Current Vector Measurement
type WsrMotorCurrentVector struct {
// 0 A
Iq float32 `json:"iq"`
// 0 A
Id float32 `json:"id"`
}
func (p *WsrMotorCurrentVector) CANId() (uint32, error) {
return 0x146, nil
}
func (p *WsrMotorCurrentVector) Size() uint {
return 8
}
func (p *WsrMotorCurrentVector) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Iq, false)
float32ToBytes(b[4:], p.Id, false)
return b, nil
}
func (p *WsrMotorCurrentVector) UnmarshalPacket(b []byte) error {
p.Iq = float32FromBytes(b[0:], false)
p.Id = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrMotorCurrentVector) String() string {
return "wsr_motor_current_vector"
}
// WsrMotorBackemf is WS RIGHT Motor BackEMF Measurement / Prediction
type WsrMotorBackemf struct {
// 0 V
Bemfq float32 `json:"bemfq"`
// 0 V
Bemfd float32 `json:"bemfd"`
}
func (p *WsrMotorBackemf) CANId() (uint32, error) {
return 0x147, nil
}
func (p *WsrMotorBackemf) Size() uint {
return 8
}
func (p *WsrMotorBackemf) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Bemfq, false)
float32ToBytes(b[4:], p.Bemfd, false)
return b, nil
}
func (p *WsrMotorBackemf) UnmarshalPacket(b []byte) error {
p.Bemfq = float32FromBytes(b[0:], false)
p.Bemfd = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrMotorBackemf) String() string {
return "wsr_motor_backemf"
}
// Wsr15165VoltageRail is WS RIGHT 15 and 1.65 Voltage Rail Measurement
type Wsr15165VoltageRail struct {
// 0 V
Reference165V float32 `json:"reference_165v"`
// 0 V
Supply15V float32 `json:"supply_15v"`
}
func (p *Wsr15165VoltageRail) CANId() (uint32, error) {
return 0x148, nil
}
func (p *Wsr15165VoltageRail) Size() uint {
return 8
}
func (p *Wsr15165VoltageRail) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Reference165V, false)
float32ToBytes(b[4:], p.Supply15V, false)
return b, nil
}
func (p *Wsr15165VoltageRail) UnmarshalPacket(b []byte) error {
p.Reference165V = float32FromBytes(b[0:], false)
p.Supply15V = float32FromBytes(b[4:], false)
return nil
}
func (p *Wsr15165VoltageRail) String() string {
return "wsr_15_165_voltage_rail"
}
// Wsr2512VoltageRail is WS RIGHT 2.5V and 1.2V Voltage Rail Measurement
type Wsr2512VoltageRail struct {
// 0 V
Supply12V float32 `json:"supply_12v"`
// 0 V
Supply25V float32 `json:"supply_25v"`
}
func (p *Wsr2512VoltageRail) CANId() (uint32, error) {
return 0x149, nil
}
func (p *Wsr2512VoltageRail) Size() uint {
return 8
}
func (p *Wsr2512VoltageRail) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Supply12V, false)
float32ToBytes(b[4:], p.Supply25V, false)
return b, nil
}
func (p *Wsr2512VoltageRail) UnmarshalPacket(b []byte) error {
p.Supply12V = float32FromBytes(b[0:], false)
p.Supply25V = float32FromBytes(b[4:], false)
return nil
}
func (p *Wsr2512VoltageRail) String() string {
return "wsr_25_12_voltage_rail"
}
// WsrHeatsinkMotorTemp is WS RIGHT Heat-sink & Motor Temperature Measurement
type WsrHeatsinkMotorTemp struct {
// 0 C
MotorTemp float32 `json:"motor_temp"`
// 0 C
HeatsinkTemp float32 `json:"heatsink_temp"`
}
func (p *WsrHeatsinkMotorTemp) CANId() (uint32, error) {
return 0x14B, nil
}
func (p *WsrHeatsinkMotorTemp) Size() uint {
return 8
}
func (p *WsrHeatsinkMotorTemp) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.MotorTemp, false)
float32ToBytes(b[4:], p.HeatsinkTemp, false)
return b, nil
}
func (p *WsrHeatsinkMotorTemp) UnmarshalPacket(b []byte) error {
p.MotorTemp = float32FromBytes(b[0:], false)
p.HeatsinkTemp = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrHeatsinkMotorTemp) String() string {
return "wsr_heatsink_motor_temp"
}
// WsrDspBoardTemp is WS RIGHT DPS Board Temperature Measurement
type WsrDspBoardTemp struct {
// 0 C
DspBoardTemp float32 `json:"dsp_board_temp"`
// 0 C
Reserved float32 `json:"reserved"`
}
func (p *WsrDspBoardTemp) CANId() (uint32, error) {
return 0x14C, nil
}
func (p *WsrDspBoardTemp) Size() uint {
return 8
}
func (p *WsrDspBoardTemp) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.DspBoardTemp, false)
float32ToBytes(b[4:], p.Reserved, false)
return b, nil
}
func (p *WsrDspBoardTemp) UnmarshalPacket(b []byte) error {
p.DspBoardTemp = float32FromBytes(b[0:], false)
p.Reserved = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrDspBoardTemp) String() string {
return "wsr_dsp_board_temp"
}
// WsrReserved is WS RIGHT Reserved
type WsrReserved struct {
Reserved0 float32 `json:"reserved0"`
Reserved1 float32 `json:"reserved1"`
}
func (p *WsrReserved) CANId() (uint32, error) {
return 0x14D, nil
}
func (p *WsrReserved) Size() uint {
return 8
}
func (p *WsrReserved) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Reserved0, false)
float32ToBytes(b[4:], p.Reserved1, false)
return b, nil
}
func (p *WsrReserved) UnmarshalPacket(b []byte) error {
p.Reserved0 = float32FromBytes(b[0:], false)
p.Reserved1 = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrReserved) String() string {
return "wsr_reserved"
}
// WsrOdometerBusAmphoursMeasurement is WS RIGHT Odometer and Bus AmpHours Measurement
type WsrOdometerBusAmphoursMeasurement struct {
// 0 m
Odometer float32 `json:"odometer"`
// 0 Ah
DcBusAmphours float32 `json:"dc_bus_amphours"`
}
func (p *WsrOdometerBusAmphoursMeasurement) CANId() (uint32, error) {
return 0x14E, nil
}
func (p *WsrOdometerBusAmphoursMeasurement) Size() uint {
return 8
}
func (p *WsrOdometerBusAmphoursMeasurement) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Odometer, false)
float32ToBytes(b[4:], p.DcBusAmphours, false)
return b, nil
}
func (p *WsrOdometerBusAmphoursMeasurement) UnmarshalPacket(b []byte) error {
p.Odometer = float32FromBytes(b[0:], false)
p.DcBusAmphours = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrOdometerBusAmphoursMeasurement) String() string {
return "wsr_odometer_bus_amphours_measurement"
}
// WsrSlipSpeedMeasurement is WS RIGHT Slip Speed Measurement
type WsrSlipSpeedMeasurement struct {
// 0 C
Reserved float32 `json:"reserved"`
// 0 Hz
SlipSpeed float32 `json:"slip_speed"`
}
func (p *WsrSlipSpeedMeasurement) CANId() (uint32, error) {
return 0x157, nil
}
func (p *WsrSlipSpeedMeasurement) Size() uint {
return 8
}
func (p *WsrSlipSpeedMeasurement) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Reserved, false)
float32ToBytes(b[4:], p.SlipSpeed, false)
return b, nil
}
func (p *WsrSlipSpeedMeasurement) UnmarshalPacket(b []byte) error {
p.Reserved = float32FromBytes(b[0:], false)
p.SlipSpeed = float32FromBytes(b[4:], false)
return nil
}
func (p *WsrSlipSpeedMeasurement) String() string {
return "wsr_slip_speed_measurement"
}
// WslIdentification is WS LEFT Identification Information
type WslIdentification struct {
TritiumId uint32 `json:"tritium_id"`
SerialNumber uint32 `json:"serial_number"`
}
func (p *WslIdentification) CANId() (uint32, error) {
return 0x100, nil
}
func (p *WslIdentification) Size() uint {
return 8
}
func (p *WslIdentification) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
binary.LittleEndian.PutUint32(b[0:], p.TritiumId)
binary.LittleEndian.PutUint32(b[4:], p.SerialNumber)
return b, nil
}
func (p *WslIdentification) UnmarshalPacket(b []byte) error {
p.TritiumId = binary.LittleEndian.Uint32(b[0:])
p.SerialNumber = binary.LittleEndian.Uint32(b[4:])
return nil
}
func (p *WslIdentification) String() string {
return "wsl_identification"
}
type WslStatusInformationLimitFlags struct {
OutputVoltagePwm bool `json:"output_voltage_pwm"`
MotorCurrent bool `json:"motor_current"`
Velocity bool `json:"velocity"`
BusCurrent bool `json:"bus_current"`
BusVoltageUpperLimit bool `json:"bus_voltage_upper_limit"`
BusVoltageLowerLimit bool `json:"bus_voltage_lower_limit"`
IpmTemperatureOrMotorTemperature bool `json:"ipm_temperature_or_motor_temperature"`
Reserved bool `json:"reserved"`
}
func (p *WslStatusInformationLimitFlags) MarshalByte() byte {
var b byte
if p.OutputVoltagePwm {
b |= 1 << 0
}
if p.MotorCurrent {
b |= 1 << 1
}
if p.Velocity {
b |= 1 << 2
}
if p.BusCurrent {
b |= 1 << 3
}
if p.BusVoltageUpperLimit {
b |= 1 << 4
}
if p.BusVoltageLowerLimit {
b |= 1 << 5
}
if p.IpmTemperatureOrMotorTemperature {
b |= 1 << 6
}
if p.Reserved {
b |= 1 << 7
}
return b
}
func (p *WslStatusInformationLimitFlags) UnmarshalByte(b byte) {
p.OutputVoltagePwm = (b & (1 << 0)) != 0
p.MotorCurrent = (b & (1 << 1)) != 0
p.Velocity = (b & (1 << 2)) != 0
p.BusCurrent = (b & (1 << 3)) != 0
p.BusVoltageUpperLimit = (b & (1 << 4)) != 0
p.BusVoltageLowerLimit = (b & (1 << 5)) != 0
p.IpmTemperatureOrMotorTemperature = (b & (1 << 6)) != 0
p.Reserved = (b & (1 << 7)) != 0
}
type WslStatusInformationErrorFlags0 struct {
HardwareOverCurrent bool `json:"hardware_over_current"`
SoftwareOverCurrent bool `json:"software_over_current"`
DcBusOverVoltage bool `json:"dc_bus_over_voltage"`
BadMotorPositionHallSequence bool `json:"bad_motor_position_hall_sequence"`
WatchdogCausedLastReset bool `json:"watchdog_caused_last_reset"`
ConfigReadError bool `json:"config_read_error"`
LvRailUnderVoltageLockOut bool `json:"lv_rail_under_voltage_lock_out"`
DesaturationFault bool `json:"desaturation_fault"`
}
func (p *WslStatusInformationErrorFlags0) MarshalByte() byte {
var b byte
if p.HardwareOverCurrent {
b |= 1 << 0
}
if p.SoftwareOverCurrent {
b |= 1 << 1
}
if p.DcBusOverVoltage {
b |= 1 << 2
}
if p.BadMotorPositionHallSequence {
b |= 1 << 3
}
if p.WatchdogCausedLastReset {
b |= 1 << 4
}
if p.ConfigReadError {
b |= 1 << 5
}
if p.LvRailUnderVoltageLockOut {
b |= 1 << 6
}
if p.DesaturationFault {
b |= 1 << 7
}
return b
}
func (p *WslStatusInformationErrorFlags0) UnmarshalByte(b byte) {
p.HardwareOverCurrent = (b & (1 << 0)) != 0
p.SoftwareOverCurrent = (b & (1 << 1)) != 0
p.DcBusOverVoltage = (b & (1 << 2)) != 0
p.BadMotorPositionHallSequence = (b & (1 << 3)) != 0
p.WatchdogCausedLastReset = (b & (1 << 4)) != 0
p.ConfigReadError = (b & (1 << 5)) != 0
p.LvRailUnderVoltageLockOut = (b & (1 << 6)) != 0
p.DesaturationFault = (b & (1 << 7)) != 0
}
type WslStatusInformationErrorFlags1 struct {
MotorOverSpeed bool `json:"motor_over_speed"`
Reserved9 bool `json:"reserved_9"`
Reserved10 bool `json:"reserved_10"`
Reserved11 bool `json:"reserved_11"`
Reserved12 bool `json:"reserved_12"`
Reserved13 bool `json:"reserved_13"`
Reserved14 bool `json:"reserved_14"`
Reserved15 bool `json:"reserved_15"`
}
func (p *WslStatusInformationErrorFlags1) MarshalByte() byte {
var b byte
if p.MotorOverSpeed {
b |= 1 << 0
}
if p.Reserved9 {
b |= 1 << 1
}
if p.Reserved10 {
b |= 1 << 2
}
if p.Reserved11 {
b |= 1 << 3
}
if p.Reserved12 {
b |= 1 << 4
}
if p.Reserved13 {
b |= 1 << 5
}
if p.Reserved14 {
b |= 1 << 6
}
if p.Reserved15 {
b |= 1 << 7
}
return b
}
func (p *WslStatusInformationErrorFlags1) UnmarshalByte(b byte) {
p.MotorOverSpeed = (b & (1 << 0)) != 0
p.Reserved9 = (b & (1 << 1)) != 0
p.Reserved10 = (b & (1 << 2)) != 0
p.Reserved11 = (b & (1 << 3)) != 0
p.Reserved12 = (b & (1 << 4)) != 0
p.Reserved13 = (b & (1 << 5)) != 0
p.Reserved14 = (b & (1 << 6)) != 0
p.Reserved15 = (b & (1 << 7)) != 0
}
// WslStatusInformation is WS LEFT Status Information
type WslStatusInformation struct {
LimitFlags WslStatusInformationLimitFlags `json:"limit_flags"`
LimitFlagsReserved uint8 `json:"limit_flags_reserved"`
ErrorFlags0 WslStatusInformationErrorFlags0 `json:"error_flags_0"`
ErrorFlags1 WslStatusInformationErrorFlags1 `json:"error_flags_1"`
ActiveMotor uint16 `json:"active_motor"`
Reserved uint16 `json:"reserved"`
}
func (p *WslStatusInformation) CANId() (uint32, error) {
return 0x101, nil
}
func (p *WslStatusInformation) Size() uint {
return 8
}
func (p *WslStatusInformation) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
b[0] = p.LimitFlags.MarshalByte()
b[1] = p.LimitFlagsReserved
b[2] = p.ErrorFlags0.MarshalByte()
b[3] = p.ErrorFlags1.MarshalByte()
binary.LittleEndian.PutUint16(b[4:], p.ActiveMotor)
binary.LittleEndian.PutUint16(b[6:], p.Reserved)
return b, nil
}
func (p *WslStatusInformation) UnmarshalPacket(b []byte) error {
p.LimitFlags.UnmarshalByte(b[0])
p.LimitFlagsReserved = b[1]
p.ErrorFlags0.UnmarshalByte(b[2])
p.ErrorFlags1.UnmarshalByte(b[3])
p.ActiveMotor = binary.LittleEndian.Uint16(b[4:])
p.Reserved = binary.LittleEndian.Uint16(b[6:])
return nil
}
func (p *WslStatusInformation) String() string {
return "wsl_status_information"
}
// WslBusMeasurement is WS LEFT Bus Measurement
type WslBusMeasurement struct {
// 0 V
BusVoltage float32 `json:"bus_voltage"`
// 0 A
BusCurrent float32 `json:"bus_current"`
}
func (p *WslBusMeasurement) CANId() (uint32, error) {
return 0x102, nil
}
func (p *WslBusMeasurement) Size() uint {
return 8
}
func (p *WslBusMeasurement) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.BusVoltage, false)
float32ToBytes(b[4:], p.BusCurrent, false)
return b, nil
}
func (p *WslBusMeasurement) UnmarshalPacket(b []byte) error {
p.BusVoltage = float32FromBytes(b[0:], false)
p.BusCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *WslBusMeasurement) String() string {
return "wsl_bus_measurement"
}
// WslVelocity is WS LEFT Velocity Measurement
type WslVelocity struct {
// 0 rpm
MotorVelocity float32 `json:"motor_velocity"`
// 0 m/s
VehicleVelocity float32 `json:"vehicle_velocity"`
}
func (p *WslVelocity) CANId() (uint32, error) {
return 0x103, nil
}
func (p *WslVelocity) Size() uint {
return 8
}
func (p *WslVelocity) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.MotorVelocity, false)
float32ToBytes(b[4:], p.VehicleVelocity, false)
return b, nil
}
func (p *WslVelocity) UnmarshalPacket(b []byte) error {
p.MotorVelocity = float32FromBytes(b[0:], false)
p.VehicleVelocity = float32FromBytes(b[4:], false)
return nil
}
func (p *WslVelocity) String() string {
return "wsl_velocity"
}
// WslPhaseCurrent is WS LEFT Phase Current Measurement
type WslPhaseCurrent struct {
// 0 A rms
PhaseBCurrent float32 `json:"phase_b_current"`
// 0 A rms
PhaseCCurrent float32 `json:"phase_c_current"`
}
func (p *WslPhaseCurrent) CANId() (uint32, error) {
return 0x104, nil
}
func (p *WslPhaseCurrent) Size() uint {
return 8
}
func (p *WslPhaseCurrent) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.PhaseBCurrent, false)
float32ToBytes(b[4:], p.PhaseCCurrent, false)
return b, nil
}
func (p *WslPhaseCurrent) UnmarshalPacket(b []byte) error {
p.PhaseBCurrent = float32FromBytes(b[0:], false)
p.PhaseCCurrent = float32FromBytes(b[4:], false)
return nil
}
func (p *WslPhaseCurrent) String() string {
return "wsl_phase_current"
}
// WslMotorVoltageVector is WS LEFT Motor Voltage Vector Measurement
type WslMotorVoltageVector struct {
// 0 V
Vq float32 `json:"vq"`
// 0 V
Vd float32 `json:"vd"`
}
func (p *WslMotorVoltageVector) CANId() (uint32, error) {
return 0x105, nil
}
func (p *WslMotorVoltageVector) Size() uint {
return 8
}
func (p *WslMotorVoltageVector) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Vq, false)
float32ToBytes(b[4:], p.Vd, false)
return b, nil
}
func (p *WslMotorVoltageVector) UnmarshalPacket(b []byte) error {
p.Vq = float32FromBytes(b[0:], false)
p.Vd = float32FromBytes(b[4:], false)
return nil
}
func (p *WslMotorVoltageVector) String() string {
return "wsl_motor_voltage_vector"
}
// WslMotorCurrentVector is WS LEFT Motor Current Vector Measurement
type WslMotorCurrentVector struct {
// 0 A
Iq float32 `json:"iq"`
// 0 A
Id float32 `json:"id"`
}
func (p *WslMotorCurrentVector) CANId() (uint32, error) {
return 0x106, nil
}
func (p *WslMotorCurrentVector) Size() uint {
return 8
}
func (p *WslMotorCurrentVector) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Iq, false)
float32ToBytes(b[4:], p.Id, false)
return b, nil
}
func (p *WslMotorCurrentVector) UnmarshalPacket(b []byte) error {
p.Iq = float32FromBytes(b[0:], false)
p.Id = float32FromBytes(b[4:], false)
return nil
}
func (p *WslMotorCurrentVector) String() string {
return "wsl_motor_current_vector"
}
// WslMotorBackemf is WS LEFT Motor BackEMF Measurement / Prediction
type WslMotorBackemf struct {
// 0 V
Bemfq float32 `json:"bemfq"`
// 0 V
Bemfd float32 `json:"bemfd"`
}
func (p *WslMotorBackemf) CANId() (uint32, error) {
return 0x107, nil
}
func (p *WslMotorBackemf) Size() uint {
return 8
}
func (p *WslMotorBackemf) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Bemfq, false)
float32ToBytes(b[4:], p.Bemfd, false)
return b, nil
}
func (p *WslMotorBackemf) UnmarshalPacket(b []byte) error {
p.Bemfq = float32FromBytes(b[0:], false)
p.Bemfd = float32FromBytes(b[4:], false)
return nil
}
func (p *WslMotorBackemf) String() string {
return "wsl_motor_backemf"
}
// Wsl15165VoltageRail is WS LEFT 15 and 1.65 Voltage Rail Measurement
type Wsl15165VoltageRail struct {
// 0 V
Reference165V float32 `json:"reference_165v"`
// 0 V
Supply15V float32 `json:"supply_15v"`
}
func (p *Wsl15165VoltageRail) CANId() (uint32, error) {
return 0x108, nil
}
func (p *Wsl15165VoltageRail) Size() uint {
return 8
}
func (p *Wsl15165VoltageRail) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Reference165V, false)
float32ToBytes(b[4:], p.Supply15V, false)
return b, nil
}
func (p *Wsl15165VoltageRail) UnmarshalPacket(b []byte) error {
p.Reference165V = float32FromBytes(b[0:], false)
p.Supply15V = float32FromBytes(b[4:], false)
return nil
}
func (p *Wsl15165VoltageRail) String() string {
return "wsl_15_165_voltage_rail"
}
// Wsl2512VoltageRail is WS LEFT 2.5V and 1.2V Voltage Rail Measurement
type Wsl2512VoltageRail struct {
// 0 V
Supply12V float32 `json:"supply_12v"`
// 0 V
Supply25V float32 `json:"supply_25v"`
}
func (p *Wsl2512VoltageRail) CANId() (uint32, error) {
return 0x109, nil
}
func (p *Wsl2512VoltageRail) Size() uint {
return 8
}
func (p *Wsl2512VoltageRail) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Supply12V, false)
float32ToBytes(b[4:], p.Supply25V, false)
return b, nil
}
func (p *Wsl2512VoltageRail) UnmarshalPacket(b []byte) error {
p.Supply12V = float32FromBytes(b[0:], false)
p.Supply25V = float32FromBytes(b[4:], false)
return nil
}
func (p *Wsl2512VoltageRail) String() string {
return "wsl_25_12_voltage_rail"
}
// WslHeatsinkMotorTemp is WS LEFT Heat-sink & Motor Temperature Measurement
type WslHeatsinkMotorTemp struct {
// 0 C
MotorTemp float32 `json:"motor_temp"`
// 0 C
HeatsinkTemp float32 `json:"heatsink_temp"`
}
func (p *WslHeatsinkMotorTemp) CANId() (uint32, error) {
return 0x10B, nil
}
func (p *WslHeatsinkMotorTemp) Size() uint {
return 8
}
func (p *WslHeatsinkMotorTemp) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.MotorTemp, false)
float32ToBytes(b[4:], p.HeatsinkTemp, false)
return b, nil
}
func (p *WslHeatsinkMotorTemp) UnmarshalPacket(b []byte) error {
p.MotorTemp = float32FromBytes(b[0:], false)
p.HeatsinkTemp = float32FromBytes(b[4:], false)
return nil
}
func (p *WslHeatsinkMotorTemp) String() string {
return "wsl_heatsink_motor_temp"
}
// WslDspBoardTemp is WS LEFT DPS Board Temperature Measurement
type WslDspBoardTemp struct {
// 0 C
DspBoardTemp float32 `json:"dsp_board_temp"`
// 0 C
Reserved float32 `json:"reserved"`
}
func (p *WslDspBoardTemp) CANId() (uint32, error) {
return 0x10C, nil
}
func (p *WslDspBoardTemp) Size() uint {
return 8
}
func (p *WslDspBoardTemp) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.DspBoardTemp, false)
float32ToBytes(b[4:], p.Reserved, false)
return b, nil
}
func (p *WslDspBoardTemp) UnmarshalPacket(b []byte) error {
p.DspBoardTemp = float32FromBytes(b[0:], false)
p.Reserved = float32FromBytes(b[4:], false)
return nil
}
func (p *WslDspBoardTemp) String() string {
return "wsl_dsp_board_temp"
}
// WslOdometerBusAmphoursMeasurement is WS LEFT Odometer and Bus AmpHours Measurement
type WslOdometerBusAmphoursMeasurement struct {
// 0 m
Odometer float32 `json:"odometer"`
// 0 Ah
DcBusAmphours float32 `json:"dc_bus_amphours"`
}
func (p *WslOdometerBusAmphoursMeasurement) CANId() (uint32, error) {
return 0x10E, nil
}
func (p *WslOdometerBusAmphoursMeasurement) Size() uint {
return 8
}
func (p *WslOdometerBusAmphoursMeasurement) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Odometer, false)
float32ToBytes(b[4:], p.DcBusAmphours, false)
return b, nil
}
func (p *WslOdometerBusAmphoursMeasurement) UnmarshalPacket(b []byte) error {
p.Odometer = float32FromBytes(b[0:], false)
p.DcBusAmphours = float32FromBytes(b[4:], false)
return nil
}
func (p *WslOdometerBusAmphoursMeasurement) String() string {
return "wsl_odometer_bus_amphours_measurement"
}
// WslReserved is WS LEFT Reserved
type WslReserved struct {
Reserved0 float32 `json:"reserved0"`
Reserved1 float32 `json:"reserved1"`
}
func (p *WslReserved) CANId() (uint32, error) {
return 0x10D, nil
}
func (p *WslReserved) Size() uint {
return 8
}
func (p *WslReserved) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Reserved0, false)
float32ToBytes(b[4:], p.Reserved1, false)
return b, nil
}
func (p *WslReserved) UnmarshalPacket(b []byte) error {
p.Reserved0 = float32FromBytes(b[0:], false)
p.Reserved1 = float32FromBytes(b[4:], false)
return nil
}
func (p *WslReserved) String() string {
return "wsl_reserved"
}
// WslSlipSpeedMeasurement is WS LEFT Slip Speed Measurement
type WslSlipSpeedMeasurement struct {
// 0 C
Reserved float32 `json:"reserved"`
// 0 Hz
SlipSpeed float32 `json:"slip_speed"`
}
func (p *WslSlipSpeedMeasurement) CANId() (uint32, error) {
return 0x117, nil
}
func (p *WslSlipSpeedMeasurement) Size() uint {
return 8
}
func (p *WslSlipSpeedMeasurement) MarshalPacket() ([]byte, error) {
b := make([]byte, 8)
float32ToBytes(b[0:], p.Reserved, false)
float32ToBytes(b[4:], p.SlipSpeed, false)
return b, nil
}
func (p *WslSlipSpeedMeasurement) UnmarshalPacket(b []byte) error {
p.Reserved = float32FromBytes(b[0:], false)
p.SlipSpeed = float32FromBytes(b[4:], false)
return nil
}
func (p *WslSlipSpeedMeasurement) String() string {
return "wsl_slip_speed_measurement"
}
// The json representation that was used to generate this data.
// can be used to share the parsing data for i.e dynamic python gui.
const SkylabDefinitions = `{"Packets":[{"Name":"bms_measurement","Description":"Voltages for main battery and aux pack","Id":16,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"battery_voltage","Type":"uint16_t","Units":"V","Conversion":0.01,"Bits":null},{"Name":"aux_voltage","Type":"uint16_t","Units":"V","Conversion":0.001,"Bits":null},{"Name":"current","Type":"float","Units":"A","Conversion":1,"Bits":null}]},{"Name":"battery_status","Description":"Status bits for the battery","Id":17,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"battery_state","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"startup"},{"Name":"precharge"},{"Name":"discharging"},{"Name":"lv_only"},{"Name":"charging"},{"Name":"wall_charging"},{"Name":"killed"}]},{"Name":"contactor_state","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"battery_high_contactor"},{"Name":"battery_low_contactor"},{"Name":"battery_vicor_contactor"},{"Name":"battery_pre_contactor"},{"Name":"battery_high2_contactor"},{"Name":"battery_low2_contactor"},{"Name":"charger_high_contactor"},{"Name":"charger_pre_contactor"}]},{"Name":"lv_channel_status","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"aux_fault"},{"Name":"main_fault"},{"Name":"aux_power_valid"},{"Name":"main_power_valid"},{"Name":"aux_power_active"},{"Name":"main_power_active"}]},{"Name":"lv_control_status","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"aux_vicor_enable"},{"Name":"bat_vicor_enable"},{"Name":"aux_relay_held"},{"Name":"aux_ref_enable"},{"Name":"aux_charging_enable"},{"Name":"kill_hv"},{"Name":"kill_lv"},{"Name":"start_button"}]},{"Name":"pack_choice","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"large_pack"},{"Name":"small_pack"}]}]},{"Name":"bms_kill_reason","Description":"Information for when the car kills","Id":18,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reason1","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"OVERVOLT"},{"Name":"UNDERVOLT"},{"Name":"OVERTEMP"},{"Name":"TEMP_DISCONNECT"},{"Name":"COMM_FAIL"}]},{"Name":"reason2","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"HARDWARE"},{"Name":"KILL_PACKET"},{"Name":"UKNOWN"},{"Name":"OVERCURRENT"},{"Name":"PRECHARGE_FAIL"},{"Name":"AUX_OVER_UNDER"},{"Name":"AUX_OVERTEMP"}]},{"Name":"module","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"value","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"bms_module_min_max","Description":"min and max cell voltages and temperatures","Id":19,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"module_max_temp","Type":"int16_t","Units":"C","Conversion":0.01,"Bits":null},{"Name":"module_min_temp","Type":"int16_t","Units":"C","Conversion":0.01,"Bits":null},{"Name":"module_max_voltage","Type":"uint16_t","Units":"V","Conversion":0.001,"Bits":null},{"Name":"module_min_voltage","Type":"uint16_t","Units":"V","Conversion":0.001,"Bits":null}]},{"Name":"bms_soc","Description":"State of charge","Id":20,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"soc","Type":"float","Units":"","Conversion":1,"Bits":null}]},{"Name":"bms_capacity","Description":"State of charge","Id":21,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"Ah","Type":"float","Units":"","Conversion":1,"Bits":null},{"Name":"Wh","Type":"float","Units":"","Conversion":1,"Bits":null}]},{"Name":"bms_currentlimit","Description":"reports BP params for current","Id":24,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"current_max","Type":"int16_t","Units":"A","Conversion":0.01,"Bits":null},{"Name":"current_min","Type":"int16_t","Units":"A","Conversion":0.01,"Bits":null}]},{"Name":"bms_fan_info","Description":"BP Fans","Id":25,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"fan1","Type":"uint16_t","Units":"RPM","Conversion":1,"Bits":null},{"Name":"fan2","Type":"uint16_t","Units":"RPM","Conversion":1,"Bits":null},{"Name":"fan3","Type":"uint16_t","Units":"RPM","Conversion":1,"Bits":null},{"Name":"fan4","Type":"uint16_t","Units":"RPM","Conversion":1,"Bits":null}]},{"Name":"bms_set_min_fan_speed","Description":"packet which sets a minimum fan speed of BMS for a specific time frame in seconds","Id":27,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"fan_percentage","Type":"float","Units":"percent","Conversion":0,"Bits":null},{"Name":"time","Type":"uint16_t","Units":"s","Conversion":0,"Bits":null}]},{"Name":"bms_module","Description":"Voltage and temperature for a single module","Id":64,"Endian":"little","Extended":false,"Repeat":36,"Offset":1,"Data":[{"Name":"voltage","Type":"float","Units":"V","Conversion":1,"Bits":null},{"Name":"temperature","Type":"float","Units":"C","Conversion":1,"Bits":null}]},{"Name":"bms_charger_response","Description":"Response packet from BMS for indicating whether BMS is ready for charging","Id":117,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"response_flags","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"charging_ready"}]}]},{"Name":"chassis_isolation_fault","Description":"chassiss is not isolated from the battery","Id":56,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"fault_detected","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"isolation_fault"}]}]},{"Name":"bms_imd_info","Description":"information from chassis isolation","Id":55,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"d_imc_r_iso","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"d_imc_status_1","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"isolation_fault"},{"Name":"chassis_fault"},{"Name":"system_failure"},{"Name":"calibration_running"},{"Name":"self_test_running"},{"Name":"isolation_warning"},{"Name":"reserved"},{"Name":"reserved_2"}]},{"Name":"d_imc_status_2","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"reserved"},{"Name":"reserved_2"},{"Name":"reserved_3"},{"Name":"reserved_4"},{"Name":"reserved_5"},{"Name":"reserved_6"},{"Name":"reserved_7"},{"Name":"reserved_8"}]},{"Name":"d_vifc_status_1","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"insulation_measurment"},{"Name":"imc_connectivity_not_implemented"},{"Name":"imc_alive_satus_detection"},{"Name":"reserved"},{"Name":"vifc_command_not_implemented"},{"Name":"reserved_2"},{"Name":"reserved_3"},{"Name":"reserved_4"}]},{"Name":"d_vifc_status_2","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"insulation_resistance_value"},{"Name":"reserved"},{"Name":"reserved_2"},{"Name":"reserved_3"},{"Name":"imc_self_test_overAll"},{"Name":"imc_self_test_parameterConfig"},{"Name":"reserved_4"},{"Name":"reserved_5"}]}]},{"Name":"dashboard_pedal_percentages","Description":"ADC values from the brake and accelerator pedals.","Id":656,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"accel_pedal_value","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"brake_pedal_value","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"car_state","Description":"Car gear. Forward, neutral, reverse, etc.","Id":657,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"state","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"dashboard_pedal_fault","Description":"Target speed that the driver should maintain.","Id":658,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"brake_fault_count","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"accel_fault_count","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"dashboard_system_timeout_test","Description":"Exposes whether each system that dashboard is supposed to listen for packets from has sent a packet. Used for testing.","Id":665,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"flag_set_0","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"steering_disconnected"},{"Name":"vision_front_disconnected"},{"Name":"vision_rear_disconnected"},{"Name":"telemetry_disconnected"},{"Name":"wsl_disconnected"},{"Name":"wsr_disconnected"},{"Name":"front_mppt_disconnected"},{"Name":"rear_mppt_disconnected"}]}]},{"Name":"car_speed","Description":"speed of car in meters per second","Id":666,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"speed","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"flight_computer_lv_board_disconnect_counts","Description":"Number of times a board hasn't been heard from within the allowed timeout.","Id":667,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"front_lights","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"rear_lights","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"steering","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"vision","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"driver_display","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"center_console","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"flight_computer_hv_board_disconnect_counts","Description":"Number of times a board hasn't been heard from within the allowed timeout.","Id":668,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"bms","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"charger","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"wsl","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"wsr","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"mppt_front","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"mppt_rear","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"flight_computer_internal_state","Description":"internal bools","Id":669,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"bms","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"battery_kill"},{"Name":"cells_in_charging_threshold"},{"Name":"first_packet_received"}]},{"Name":"charger","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"proximity_detected"}]},{"Name":"photon3","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"enable"}]},{"Name":"wavesculptor","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"sending_reset"},{"Name":"regen_enable"}]},{"Name":"internal","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"accel_pedal_disconnect"},{"Name":"brake_pedal_disconnect"}]}]},{"Name":"power_to_drive","Description":"calculated power required to drive the vehicle","Id":414,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"moving_average_100","Type":"int16_t","Units":"","Conversion":0,"Bits":null},{"Name":"moving_average_1k","Type":"int16_t","Units":"","Conversion":0,"Bits":null},{"Name":"moving_average_10k","Type":"int16_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"array_power","Description":"array power calculated from current and voltage measurements","Id":415,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"front_array_channel_0","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"front_array_channel_1","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"rear_array_channel_0","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"rear_array_channel_1","Type":"uint16_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"array_energy","Description":"cumulative energy received from the array","Id":281,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"energy","Type":"float","Units":"Joule","Conversion":0,"Bits":null}]},{"Name":"array_energy_reset","Description":"resets cumulative energy received from the array","Id":288,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"energy","Type":"float","Units":"Joule","Conversion":0,"Bits":null}]},{"Name":"vision_turn_signals_command","Description":"Command to have the vision board illuminate or turn off left, right, or both turn signals","Id":688,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"lights","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"left_turn_signal"},{"Name":"right_turn_signal"},{"Name":"spare_1"},{"Name":"spare_2"},{"Name":"spare_3"}]}]},{"Name":"vision_brake_lights_command","Description":"Command to have the vision board illuminate or turn off the brake lights","Id":689,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"lights","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"brake_lights"},{"Name":"spare_1"},{"Name":"spare_2"},{"Name":"spare_3"}]}]},{"Name":"vision_headlights_command","Description":"Command to have the vision board illuminate or turn off the headlights and high beams","Id":690,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"lights","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"headlights"},{"Name":"high_beams"},{"Name":"spare_1"},{"Name":"spare_2"},{"Name":"spare_3"}]},{"Name":"brightness","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"vision_horn_command","Description":"Command the vision board honk the horn, must be repeatedly sent otherwise the vision board will stop honking after a bit. See high_power.h for details.","Id":691,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"horn","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"horn"},{"Name":"spare"}]}]},{"Name":"vision_array_latches_command","Description":"Command the vision board to open the array latches","Id":692,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"array_latches","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"array_front"},{"Name":"array_rear"}]}]},{"Name":"vision_rearview_command","Description":"Command the vision board turn on the rear view cameras","Id":693,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"cameras","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"left"},{"Name":"right"},{"Name":"rear"}]}]},{"Name":"tracker_enable","Description":"Enables/disables power trackers. Use 0x610 for the channel transmitting the data packet on 0x600, 0x611 for 0x601, et cetera. Sending 1 in the enable byte turns the tracker on; sending 0 turns it off.","Id":1552,"Endian":"little","Extended":false,"Repeat":6,"Offset":1,"Data":[{"Name":"enable","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"distance_traveled","Description":"distance of wavesculptor odometer","Id":413,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"trip_distance","Type":"float","Units":"m","Conversion":0,"Bits":null}]},{"Name":"charger_state","Description":"Notifies whether the J1772 cable is plugged.","Id":1395,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"state_flags","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"charger_plugged"}]},{"Name":"charger_max_temp","Type":"uint16_t","Units":"C","Conversion":0.001,"Bits":null},{"Name":"fault","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"CHARGER_OVERVOLT"},{"Name":"CHARGER_OVERTEMP"},{"Name":"CHARGER_CAN_TIMEOUT"},{"Name":"BATTERY_HV_KILL"},{"Name":"BATTERY_UNDERVOLT"},{"Name":"BATTERY_OVERVOLT"},{"Name":"BATTERY_CELL_OVERTEMP"},{"Name":"BATTERY_CAN_TIMEOUT"}]},{"Name":"charging_current","Type":"float","Units":"A","Conversion":0,"Bits":null}]},{"Name":"charger_bms_request","Description":"Request packet for sending contactor commands from the charger to BP.","Id":116,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"request_flags","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"charging_requested"}]}]},{"Name":"charger_current_voltage","Description":"Packet to request charging current/voltage set","Id":1398,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"max_current","Type":"float","Units":"A","Conversion":0,"Bits":null},{"Name":"max_capacity","Type":"float","Units":"kWh","Conversion":0,"Bits":null}]},{"Name":"charger_power","Description":"Outputs the amount of power that the chargers are delivering.","Id":1399,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"power","Type":"float","Units":"W","Conversion":0,"Bits":null}]},{"Name":"thunderstruck_control_message","Description":"Control packet for thunderstruck chargers","Id":417677348,"Endian":"little","Extended":true,"Repeat":0,"Offset":0,"Data":[{"Name":"Enable","Type":"uint8_t","Units":"V","Conversion":1,"Bits":null},{"Name":"CHARGE_VOLTAGE","Type":"uint16_t","Units":"V","Conversion":1,"Bits":null},{"Name":"CHARGE_CURRENT","Type":"uint16_t","Units":"V","Conversion":1,"Bits":null},{"Name":"LED_BLINK_PATTERN","Type":"uint8_t","Units":"V","Conversion":1,"Bits":null},{"Name":"RESERVED","Type":"uint16_t","Units":"V","Conversion":1,"Bits":null}]},{"Name":"vision_status_front","Description":"Status of the front vision board outputs","Id":694,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"lights","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"left_turn_signal"},{"Name":"right_turn_signal"},{"Name":"brake_lights"},{"Name":"headlights"},{"Name":"high_beams"},{"Name":"spare_1"},{"Name":"spare_2"},{"Name":"spare_3"}]},{"Name":"horn","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"horn"},{"Name":"spare"}]},{"Name":"cameras","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"left"},{"Name":"right"},{"Name":"rear"}]},{"Name":"array_latches","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"array_front_0"},{"Name":"array_front_1"},{"Name":"array_rear_0"},{"Name":"array_rear_1"}]}]},{"Name":"vision_status_rear","Description":"Status of the rear vision board outputs","Id":695,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"lights","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"left_turn_signal"},{"Name":"right_turn_signal"},{"Name":"brake_lights"},{"Name":"headlights"},{"Name":"high_beams"},{"Name":"spare_1"},{"Name":"spare_2"},{"Name":"spare_3"}]},{"Name":"horn","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"horn"},{"Name":"spare"}]},{"Name":"cameras","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"left"},{"Name":"right"},{"Name":"rear"}]},{"Name":"array_latches","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"array_front_0"},{"Name":"array_front_1"},{"Name":"array_rear_0"},{"Name":"array_rear_1"}]}]},{"Name":"lights_front_id","Description":"Unique identification packet for front lights board","Id":768,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"board_id","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"mcu_temp","Type":"int16_t","Units":"C","Conversion":0.01,"Bits":null},{"Name":"bus_voltage","Type":"uint16_t","Units":"V","Conversion":0.001,"Bits":null},{"Name":"fault_code","Type":"uint16_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"lights_back_id","Description":"Unique identification packet for back lights board","Id":769,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"board_id","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"mcu_temp","Type":"int16_t","Units":"C","Conversion":0.01,"Bits":null},{"Name":"bus_voltage","Type":"uint16_t","Units":"V","Conversion":0.001,"Bits":null},{"Name":"fault_code","Type":"uint16_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"vision_id","Description":"Unique identification packet for vision","Id":770,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"board_id","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"mcu_temp","Type":"int16_t","Units":"C","Conversion":0.01,"Bits":null},{"Name":"bus_voltage","Type":"uint16_t","Units":"V","Conversion":0.001,"Bits":null},{"Name":"fault_code","Type":"uint16_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"steering_press_count_1","Description":"Shows whether each button has been toggled an even (\"on\") or odd (\"off\") number of times.","Id":576,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"button0","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button1","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button2","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button3","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button4","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button5","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button6","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"steering_press_count_2","Description":"Shows whether each button has been toggled an even (\"on\") or odd (\"off\") number of times.","Id":592,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"button7","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button8","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button9","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button10","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"steering_button_colors_1","Description":"This packet controls each button's color. Each byte is a hex color code.","Id":577,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"button0","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button1","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button2","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button3","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button4","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button5","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button6","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"steering_button_colors_2","Description":"This packet controls each button's color. Each byte is a hex color code.","Id":593,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"button7","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button8","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button9","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"button10","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"steering_horn","Description":"This packet controls the state of the horn.","Id":578,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"horn","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"thunderstruck_status_message","Description":"Status packet for thunderstruck chargers","Id":418063424,"Endian":"little","Extended":true,"Repeat":0,"Offset":0,"Data":[{"Name":"STATUS_FLAGS","Type":"uint8_t","Units":"V","Conversion":1,"Bits":null},{"Name":"CHARGE_FLAGS","Type":"uint8_t","Units":"V","Conversion":1,"Bits":null},{"Name":"OUTPUT_VOLTAGE","Type":"uint16_t","Units":"V","Conversion":1,"Bits":null},{"Name":"OUTPUT_CURRENT","Type":"uint16_t","Units":"V","Conversion":1,"Bits":null},{"Name":"CHARGER_TEMP","Type":"uint8_t","Units":"V","Conversion":1,"Bits":null},{"Name":"RESERVED","Type":"uint8_t","Units":"V","Conversion":1,"Bits":null}]},{"Name":"tracker_data","Description":"Tracker data. Each channel transmits on a specific ID, which should be specified along with the tracker, most likely 0x600-0x603.","Id":1536,"Endian":"little","Extended":false,"Repeat":6,"Offset":1,"Data":[{"Name":"array_voltage","Type":"uint16_t","Units":"V","Conversion":0.01,"Bits":null},{"Name":"array_current","Type":"uint16_t","Units":"A","Conversion":0.001,"Bits":null},{"Name":"battery_voltage","Type":"uint16_t","Units":"V","Conversion":0.01,"Bits":null},{"Name":"temperature","Type":"uint16_t","Units":"C","Conversion":0.01,"Bits":null}]},{"Name":"tritium_motor_drive_l","Description":"Tritium Motor Drive Command","Id":289,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"motor_velocity","Type":"float","Units":"","Conversion":0,"Bits":null},{"Name":"motor_current","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"tritium_motor_power_l","Description":"Tritium Motor Power Command","Id":290,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reserved","Type":"float","Units":"","Conversion":0,"Bits":null},{"Name":"bus_current","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"tritium_reset_l","Description":"Tritium Reset Command","Id":291,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"unused1","Type":"float","Units":"","Conversion":0,"Bits":null},{"Name":"unused2","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"tritium_motor_drive_r","Description":"Tritium Motor Drive Command","Id":353,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"motor_velocity","Type":"float","Units":"","Conversion":0,"Bits":null},{"Name":"motor_current","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"tritium_motor_power_r","Description":"Tritium Motor Power Command","Id":354,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reserved","Type":"float","Units":"","Conversion":0,"Bits":null},{"Name":"bus_current","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"tritium_reset_r","Description":"Tritium Reset Command","Id":355,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"unused1","Type":"float","Units":"","Conversion":0,"Bits":null},{"Name":"unused2","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"bms_ah_set","Description":"write state of charge, use with caution","Id":22,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"ah","Type":"uint32_t","Units":"","Conversion":0.00001,"Bits":null}]},{"Name":"bms_wh_set","Description":"write state of charge, use with caution","Id":23,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"wh","Type":"uint32_t","Units":"","Conversion":0.00001,"Bits":null}]},{"Name":"bms_kill","Description":"packet to cause BMS kill","Id":26,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"kill_type","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"KILL_HARD"}]}]},{"Name":"telemetry_rtc_reset","Description":"Reset telemetry's real-time clock (RTC).","Id":1792,"Endian":"","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"year","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"month","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"day","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"hour","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"minute","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"second","Type":"uint8_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"wsr_identification","Description":"WS RIGHT Identification Information","Id":320,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"tritium_id","Type":"uint32_t","Units":"","Conversion":0,"Bits":null},{"Name":"serial_number","Type":"uint32_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"wsr_status_information","Description":"WS RIGHT Status Information","Id":321,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"limit_flags","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"output_voltage_pwm"},{"Name":"motor_current"},{"Name":"velocity"},{"Name":"bus_current"},{"Name":"bus_voltage_upper_limit"},{"Name":"bus_voltage_lower_limit"},{"Name":"ipm_temperature_or_motor_temperature"},{"Name":"reserved"}]},{"Name":"limit_flags_reserved","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"error_flags_0","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"hardware_over_current"},{"Name":"software_over_current"},{"Name":"dc_bus_over_voltage"},{"Name":"bad_motor_position_hall_sequence"},{"Name":"watchdog_caused_last_reset"},{"Name":"config_read_error"},{"Name":"lv_rail_under_voltage_lock_out"},{"Name":"desaturation_fault"}]},{"Name":"error_flags_1","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"motor_over_speed"},{"Name":"reserved_9"},{"Name":"reserved_10"},{"Name":"reserved_11"},{"Name":"reserved_12"},{"Name":"reserved_13"},{"Name":"reserved_14"},{"Name":"reserved_15"}]},{"Name":"active_motor","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"reserved","Type":"uint16_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"wsr_bus_measurement","Description":"WS RIGHT Bus Measurement","Id":322,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"bus_voltage","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"bus_current","Type":"float","Units":"A","Conversion":0,"Bits":null}]},{"Name":"wsr_velocity","Description":"WS RIGHT Velocity Measurement","Id":323,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"motor_velocity","Type":"float","Units":"rpm","Conversion":0,"Bits":null},{"Name":"vehicle_velocity","Type":"float","Units":"m/s","Conversion":0,"Bits":null}]},{"Name":"wsr_phase_current","Description":"WS RIGHT Phase Current Measurement","Id":324,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"phase_b_current","Type":"float","Units":"A rms","Conversion":0,"Bits":null},{"Name":"phase_c_current","Type":"float","Units":"A rms","Conversion":0,"Bits":null}]},{"Name":"wsr_motor_voltage_vector","Description":"WS RIGHT Motor Voltage Vector Measurement","Id":325,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"vq","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"vd","Type":"float","Units":"V","Conversion":0,"Bits":null}]},{"Name":"wsr_motor_current_vector","Description":"WS RIGHT Motor Current Vector Measurement","Id":326,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"iq","Type":"float","Units":"A","Conversion":0,"Bits":null},{"Name":"id","Type":"float","Units":"A","Conversion":0,"Bits":null}]},{"Name":"wsr_motor_backemf","Description":"WS RIGHT Motor BackEMF Measurement / Prediction","Id":327,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"bemfq","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"bemfd","Type":"float","Units":"V","Conversion":0,"Bits":null}]},{"Name":"wsr_15_165_voltage_rail","Description":"WS RIGHT 15 and 1.65 Voltage Rail Measurement","Id":328,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reference_165v","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"supply_15v","Type":"float","Units":"V","Conversion":0,"Bits":null}]},{"Name":"wsr_25_12_voltage_rail","Description":"WS RIGHT 2.5V and 1.2V Voltage Rail Measurement","Id":329,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"supply_12v","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"supply_25v","Type":"float","Units":"V","Conversion":0,"Bits":null}]},{"Name":"wsr_heatsink_motor_temp","Description":"WS RIGHT Heat-sink \u0026 Motor Temperature Measurement","Id":331,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"motor_temp","Type":"float","Units":"C","Conversion":0,"Bits":null},{"Name":"heatsink_temp","Type":"float","Units":"C","Conversion":0,"Bits":null}]},{"Name":"wsr_dsp_board_temp","Description":"WS RIGHT DPS Board Temperature Measurement","Id":332,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"dsp_board_temp","Type":"float","Units":"C","Conversion":0,"Bits":null},{"Name":"reserved","Type":"float","Units":"C","Conversion":0,"Bits":null}]},{"Name":"wsr_reserved","Description":"WS RIGHT Reserved","Id":333,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reserved0","Type":"float","Units":"","Conversion":0,"Bits":null},{"Name":"reserved1","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"wsr_odometer_bus_amphours_measurement","Description":"WS RIGHT Odometer and Bus AmpHours Measurement","Id":334,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"odometer","Type":"float","Units":"m","Conversion":0,"Bits":null},{"Name":"dc_bus_amphours","Type":"float","Units":"Ah","Conversion":0,"Bits":null}]},{"Name":"wsr_slip_speed_measurement","Description":"WS RIGHT Slip Speed Measurement","Id":343,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reserved","Type":"float","Units":"C","Conversion":0,"Bits":null},{"Name":"slip_speed","Type":"float","Units":"Hz","Conversion":0,"Bits":null}]},{"Name":"wsl_identification","Description":"WS LEFT Identification Information","Id":256,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"tritium_id","Type":"uint32_t","Units":"","Conversion":0,"Bits":null},{"Name":"serial_number","Type":"uint32_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"wsl_status_information","Description":"WS LEFT Status Information","Id":257,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"limit_flags","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"output_voltage_pwm"},{"Name":"motor_current"},{"Name":"velocity"},{"Name":"bus_current"},{"Name":"bus_voltage_upper_limit"},{"Name":"bus_voltage_lower_limit"},{"Name":"ipm_temperature_or_motor_temperature"},{"Name":"reserved"}]},{"Name":"limit_flags_reserved","Type":"uint8_t","Units":"","Conversion":0,"Bits":null},{"Name":"error_flags_0","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"hardware_over_current"},{"Name":"software_over_current"},{"Name":"dc_bus_over_voltage"},{"Name":"bad_motor_position_hall_sequence"},{"Name":"watchdog_caused_last_reset"},{"Name":"config_read_error"},{"Name":"lv_rail_under_voltage_lock_out"},{"Name":"desaturation_fault"}]},{"Name":"error_flags_1","Type":"bitfield","Units":"","Conversion":0,"Bits":[{"Name":"motor_over_speed"},{"Name":"reserved_9"},{"Name":"reserved_10"},{"Name":"reserved_11"},{"Name":"reserved_12"},{"Name":"reserved_13"},{"Name":"reserved_14"},{"Name":"reserved_15"}]},{"Name":"active_motor","Type":"uint16_t","Units":"","Conversion":0,"Bits":null},{"Name":"reserved","Type":"uint16_t","Units":"","Conversion":0,"Bits":null}]},{"Name":"wsl_bus_measurement","Description":"WS LEFT Bus Measurement","Id":258,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"bus_voltage","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"bus_current","Type":"float","Units":"A","Conversion":0,"Bits":null}]},{"Name":"wsl_velocity","Description":"WS LEFT Velocity Measurement","Id":259,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"motor_velocity","Type":"float","Units":"rpm","Conversion":0,"Bits":null},{"Name":"vehicle_velocity","Type":"float","Units":"m/s","Conversion":0,"Bits":null}]},{"Name":"wsl_phase_current","Description":"WS LEFT Phase Current Measurement","Id":260,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"phase_b_current","Type":"float","Units":"A rms","Conversion":0,"Bits":null},{"Name":"phase_c_current","Type":"float","Units":"A rms","Conversion":0,"Bits":null}]},{"Name":"wsl_motor_voltage_vector","Description":"WS LEFT Motor Voltage Vector Measurement","Id":261,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"vq","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"vd","Type":"float","Units":"V","Conversion":0,"Bits":null}]},{"Name":"wsl_motor_current_vector","Description":"WS LEFT Motor Current Vector Measurement","Id":262,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"iq","Type":"float","Units":"A","Conversion":0,"Bits":null},{"Name":"id","Type":"float","Units":"A","Conversion":0,"Bits":null}]},{"Name":"wsl_motor_backemf","Description":"WS LEFT Motor BackEMF Measurement / Prediction","Id":263,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"bemfq","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"bemfd","Type":"float","Units":"V","Conversion":0,"Bits":null}]},{"Name":"wsl_15_165_voltage_rail","Description":"WS LEFT 15 and 1.65 Voltage Rail Measurement","Id":264,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reference_165v","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"supply_15v","Type":"float","Units":"V","Conversion":0,"Bits":null}]},{"Name":"wsl_25_12_voltage_rail","Description":"WS LEFT 2.5V and 1.2V Voltage Rail Measurement","Id":265,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"supply_12v","Type":"float","Units":"V","Conversion":0,"Bits":null},{"Name":"supply_25v","Type":"float","Units":"V","Conversion":0,"Bits":null}]},{"Name":"wsl_heatsink_motor_temp","Description":"WS LEFT Heat-sink \u0026 Motor Temperature Measurement","Id":267,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"motor_temp","Type":"float","Units":"C","Conversion":0,"Bits":null},{"Name":"heatsink_temp","Type":"float","Units":"C","Conversion":0,"Bits":null}]},{"Name":"wsl_dsp_board_temp","Description":"WS LEFT DPS Board Temperature Measurement","Id":268,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"dsp_board_temp","Type":"float","Units":"C","Conversion":0,"Bits":null},{"Name":"reserved","Type":"float","Units":"C","Conversion":0,"Bits":null}]},{"Name":"wsl_odometer_bus_amphours_measurement","Description":"WS LEFT Odometer and Bus AmpHours Measurement","Id":270,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"odometer","Type":"float","Units":"m","Conversion":0,"Bits":null},{"Name":"dc_bus_amphours","Type":"float","Units":"Ah","Conversion":0,"Bits":null}]},{"Name":"wsl_reserved","Description":"WS LEFT Reserved","Id":269,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reserved0","Type":"float","Units":"","Conversion":0,"Bits":null},{"Name":"reserved1","Type":"float","Units":"","Conversion":0,"Bits":null}]},{"Name":"wsl_slip_speed_measurement","Description":"WS LEFT Slip Speed Measurement","Id":279,"Endian":"little","Extended":false,"Repeat":0,"Offset":0,"Data":[{"Name":"reserved","Type":"float","Units":"C","Conversion":0,"Bits":null},{"Name":"slip_speed","Type":"float","Units":"Hz","Conversion":0,"Bits":null}]}],"Boards":[{"Name":"bms","Transmit":["bms_measurement","bms_capacity","bms_charger_response","battery_status","bms_kill_reason","bms_module_min_max","bms_soc","bms_currentlimit","bms_fan_info","bms_module"],"Receive":["bms_kill","bms_wh_set","bms_ah_set","bms_set_min_fan_speed","charger_bms_request","chassis_isolation_fault"]},{"Name":"bridge_board","Transmit":["chassis_isolation_fault"],"Receive":["bms_imd_info","battery_status"]},{"Name":"charger","Transmit":["charger_state","charger_bms_request","charger_power","thunderstruck_control_message"],"Receive":["bms_charger_response","battery_status","bms_module_min_max","bms_measurement","charger_current_voltage","bms_capacity","thunderstruck_status_message"]},{"Name":"flight_computer","Transmit":["tracker_enable","vision_turn_signals_command","vision_brake_lights_command","vision_headlights_command","vision_horn_command","tritium_motor_drive_l","tritium_motor_drive_r","steering_button_colors_1","steering_button_colors_2","tritium_reset_l","tritium_reset_r","dashboard_pedal_percentages","car_state","car_speed","dashboard_pedal_fault","flight_computer_hv_board_disconnect_counts","flight_computer_lv_board_disconnect_counts","flight_computer_internal_state","power_to_drive","array_power","array_energy","distance_traveled"],"Receive":["bms_module_min_max","charger_state","steering_press_count_1","steering_press_count_2","wsl_velocity","wsr_velocity","steering_horn","bms_kill_reason","bms_measurement","tracker_data","vision_status_front","vision_status_rear","wsl_odometer_bus_amphours_measurement","array_energy_reset","wsr_odometer_bus_amphours_measurement"]},{"Name":"g4_example","Transmit":["vision_status_front","vision_headlights_command","demo_packet"],"Receive":["vision_turn_signals_command","vision_brake_lights_command","vision_headlights_command","vision_horn_command","demo_packet"]},{"Name":"lights","Transmit":["vision_status_front","vision_status_rear","lights_front_id","lights_back_id"],"Receive":["vision_turn_signals_command","vision_brake_lights_command","vision_headlights_command","bms_kill_reason"]},{"Name":"skylab2_demo","Transmit":["vision_status_front","vision_headlights_command"],"Receive":["vision_turn_signals_command","vision_brake_lights_command","vision_headlights_command","vision_horn_command"]},{"Name":"steering","Transmit":["steering_press_count_1","steering_press_count_2","steering_horn"],"Receive":["steering_button_colors_1","steering_button_colors_2"]},{"Name":"vision","Transmit":["vision_status_front","vision_id"],"Receive":["vision_turn_signals_command","vision_brake_lights_command","vision_headlights_command","vision_horn_command","vision_array_latches_command","vision_rearview_command"]}]}`