// generated by gen_skylab.go at 2024-03-07 13:28:08.045194699 -0600 CST m=+0.003043646 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
)

// list of every packet ID. Can be used for O(1) checks.
var idMap = map[can.CanID]bool{
	
	{ Id: 0x10, Extended: false }: true,
	{ Id: 0x11, Extended: false }: true,
	{ Id: 0x12, Extended: false }: true,
	{ Id: 0x13, Extended: false }: true,
	{ Id: 0x14, Extended: false }: true,
	{ Id: 0x15, Extended: false }: true,
	{ Id: 0x18, Extended: false }: true,
	{ Id: 0x19, Extended: false }: true,
	{ Id: 0x1B, Extended: false }: true, 
	{ Id: 0x40, Extended: false }: true,
	{ Id: 0x41, Extended: false }: true,
	{ Id: 0x42, Extended: false }: true,
	{ Id: 0x43, Extended: false }: true,
	{ Id: 0x44, Extended: false }: true,
	{ Id: 0x45, Extended: false }: true,
	{ Id: 0x46, Extended: false }: true,
	{ Id: 0x47, Extended: false }: true,
	{ Id: 0x48, Extended: false }: true,
	{ Id: 0x49, Extended: false }: true,
	{ Id: 0x4A, Extended: false }: true,
	{ Id: 0x4B, Extended: false }: true,
	{ Id: 0x4C, Extended: false }: true,
	{ Id: 0x4D, Extended: false }: true,
	{ Id: 0x4E, Extended: false }: true,
	{ Id: 0x4F, Extended: false }: true,
	{ Id: 0x50, Extended: false }: true,
	{ Id: 0x51, Extended: false }: true,
	{ Id: 0x52, Extended: false }: true,
	{ Id: 0x53, Extended: false }: true,
	{ Id: 0x54, Extended: false }: true,
	{ Id: 0x55, Extended: false }: true,
	{ Id: 0x56, Extended: false }: true,
	{ Id: 0x57, Extended: false }: true,
	{ Id: 0x58, Extended: false }: true,
	{ Id: 0x59, Extended: false }: true,
	{ Id: 0x5A, Extended: false }: true,
	{ Id: 0x5B, Extended: false }: true,
	{ Id: 0x5C, Extended: false }: true,
	{ Id: 0x5D, Extended: false }: true,
	{ Id: 0x5E, Extended: false }: true,
	{ Id: 0x5F, Extended: false }: true,
	{ Id: 0x60, Extended: false }: true,
	{ Id: 0x61, Extended: false }: true,
	{ Id: 0x62, Extended: false }: true,
	{ Id: 0x63, Extended: false }: true,
	
	{ Id: 0x75, Extended: false }: true,
	{ Id: 0x38, Extended: false }: true,
	{ Id: 0x37, Extended: false }: true,
	{ Id: 0x290, Extended: false }: true,
	{ Id: 0x291, Extended: false }: true,
	{ Id: 0x292, Extended: false }: true,
	{ Id: 0x299, Extended: false }: true,
	{ Id: 0x29A, Extended: false }: true,
	{ Id: 0x29B, Extended: false }: true,
	{ Id: 0x29C, Extended: false }: true,
	{ Id: 0x29D, Extended: false }: true,
	{ Id: 0x19E, Extended: false }: true,
	{ Id: 0x19F, Extended: false }: true,
	{ Id: 0x119, Extended: false }: true,
	{ Id: 0x120, Extended: false }: true,
	{ Id: 0x2B0, Extended: false }: true,
	{ Id: 0x2B1, Extended: false }: true,
	{ Id: 0x2B2, Extended: false }: true,
	{ Id: 0x2B3, Extended: false }: true,
	{ Id: 0x2B4, Extended: false }: true,
	{ Id: 0x2B5, Extended: false }: true, 
	{ Id: 0x610, Extended: false }: true,
	{ Id: 0x611, Extended: false }: true,
	{ Id: 0x612, Extended: false }: true,
	{ Id: 0x613, Extended: false }: true,
	{ Id: 0x614, Extended: false }: true,
	{ Id: 0x615, Extended: false }: true,
	
	{ Id: 0x19D, Extended: false }: true,
	{ Id: 0x573, Extended: false }: true,
	{ Id: 0x74, Extended: false }: true,
	{ Id: 0x576, Extended: false }: true,
	{ Id: 0x577, Extended: false }: true,
	{ Id: 0x18E54024, Extended: true }: true,
	{ Id: 0x2B6, Extended: false }: true,
	{ Id: 0x2B7, Extended: false }: true,
	{ Id: 0x300, Extended: false }: true,
	{ Id: 0x301, Extended: false }: true,
	{ Id: 0x302, Extended: false }: true,
	{ Id: 0x240, Extended: false }: true,
	{ Id: 0x250, Extended: false }: true,
	{ Id: 0x241, Extended: false }: true,
	{ Id: 0x251, Extended: false }: true,
	{ Id: 0x242, Extended: false }: true,
	{ Id: 0x18EB2440, Extended: false }: true, 
	{ Id: 0x600, Extended: false }: true,
	{ Id: 0x601, Extended: false }: true,
	{ Id: 0x602, Extended: false }: true,
	{ Id: 0x603, Extended: false }: true,
	{ Id: 0x604, Extended: false }: true,
	{ Id: 0x605, Extended: false }: true,
	
	{ Id: 0x121, Extended: false }: true,
	{ Id: 0x122, Extended: false }: true,
	{ Id: 0x123, Extended: false }: true,
	{ Id: 0x161, Extended: false }: true,
	{ Id: 0x162, Extended: false }: true,
	{ Id: 0x163, Extended: false }: true,
	{ Id: 0x16, Extended: false }: true,
	{ Id: 0x17, Extended: false }: true,
	{ Id: 0x1A, Extended: false }: true,
	{ Id: 0x700, Extended: false }: true,
	{ Id: 0x140, Extended: false }: true,
	{ Id: 0x141, Extended: false }: true,
	{ Id: 0x142, Extended: false }: true,
	{ Id: 0x143, Extended: false }: true,
	{ Id: 0x144, Extended: false }: true,
	{ Id: 0x145, Extended: false }: true,
	{ Id: 0x146, Extended: false }: true,
	{ Id: 0x147, Extended: false }: true,
	{ Id: 0x148, Extended: false }: true,
	{ Id: 0x149, Extended: false }: true,
	{ Id: 0x14B, Extended: false }: true,
	{ Id: 0x14C, Extended: false }: true,
	{ Id: 0x14D, Extended: false }: true,
	{ Id: 0x14E, Extended: false }: true,
	{ Id: 0x157, Extended: false }: true,
	{ Id: 0x100, Extended: false }: true,
	{ Id: 0x101, Extended: false }: true,
	{ Id: 0x102, Extended: false }: true,
	{ Id: 0x103, Extended: false }: true,
	{ Id: 0x104, Extended: false }: true,
	{ Id: 0x105, Extended: false }: true,
	{ Id: 0x106, Extended: false }: true,
	{ Id: 0x107, Extended: false }: true,
	{ Id: 0x108, Extended: false }: true,
	{ Id: 0x109, Extended: false }: true,
	{ Id: 0x10B, Extended: false }: true,
	{ Id: 0x10C, Extended: false }: true,
	{ Id: 0x10E, Extended: false }: true,
	{ Id: 0x10D, Extended: false }: true,
	{ 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: false }:
		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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x10
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x11
	return c, 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 {
	if len(b) != 5 {
		return &BadLengthError{expected: 5, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x12
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x13
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x14
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x15
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x18
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x19
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x1B
	return c, 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 {
	if len(b) != 6 {
		return &BadLengthError{expected: 6, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	if p.Idx >= 36 {
		return c, &UnknownIdError{ 0x40 }
	}
	c.Id = 0x40 + p.Idx
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x75
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x38
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x37
	return c, 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 {
	if len(b) != 6 {
		return &BadLengthError{expected: 6, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x290
	return c, 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 {
	if len(b) != 2 {
		return &BadLengthError{expected: 2, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x291
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x292
	return c, 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 {
	if len(b) != 2 {
		return &BadLengthError{expected: 2, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x299
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x29A
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x29B
	return c, 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 {
	if len(b) != 6 {
		return &BadLengthError{expected: 6, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x29C
	return c, 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 {
	if len(b) != 6 {
		return &BadLengthError{expected: 6, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x29D
	return c, 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 {
	if len(b) != 5 {
		return &BadLengthError{expected: 5, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x19E
	return c, 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 {
	if len(b) != 6 {
		return &BadLengthError{expected: 6, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x19F
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x119
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x120
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x2B0
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x2B1
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x2B2
	return c, 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 {
	if len(b) != 5 {
		return &BadLengthError{expected: 5, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x2B3
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x2B4
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x2B5
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	if p.Idx >= 6 {
		return c, &UnknownIdError{ 0x610 }
	}
	c.Id = 0x610 + p.Idx
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x19D
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x573
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x74
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x576
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x577
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: true}
	c.Id = 0x18E54024
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x2B6
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x2B7
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x300
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x301
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x302
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x240
	return c, 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 {
	if len(b) != 7 {
		return &BadLengthError{expected: 7, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x250
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x241
	return c, 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 {
	if len(b) != 7 {
		return &BadLengthError{expected: 7, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x251
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x242
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x18EB2440
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	if p.Idx >= 6 {
		return c, &UnknownIdError{ 0x600 }
	}
	c.Id = 0x600 + p.Idx
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x121
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x122
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x123
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x161
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x162
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x163
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x16
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x17
	return c, 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 {
	if len(b) != 4 {
		return &BadLengthError{expected: 4, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x1A
	return c, 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 {
	if len(b) != 1 {
		return &BadLengthError{expected: 1, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x700
	return c, 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 {
	if len(b) != 6 {
		return &BadLengthError{expected: 6, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x140
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x141
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x142
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x143
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x144
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x145
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x146
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x147
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x148
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x149
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x14B
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x14C
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x14D
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x14E
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x157
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x100
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x101
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x102
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x103
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x104
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x105
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x106
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x107
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x108
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x109
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x10B
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x10C
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x10E
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x10D
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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() (can.CanID, error) {
	c := can.CanID{Extended: false}
	c.Id = 0x117
	return c, 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 {
	if len(b) != 8 {
		return &BadLengthError{expected: 8, actual: uint32(len(b))}
	}
	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","data":[{"name":"battery_voltage","type":"uint16_t","units":"V","conversion":0.01},{"name":"aux_voltage","type":"uint16_t","units":"V","conversion":0.001},{"name":"current","type":"float","units":"A","conversion":1}]},{"name":"battery_status","description":"Status bits for the battery","id":17,"endian":"little","data":[{"name":"battery_state","type":"bitfield","bits":[{"name":"startup"},{"name":"precharge"},{"name":"discharging"},{"name":"lv_only"},{"name":"charging"},{"name":"wall_charging"},{"name":"killed"}]},{"name":"contactor_state","type":"bitfield","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","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","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","bits":[{"name":"large_pack"},{"name":"small_pack"}]}]},{"name":"bms_kill_reason","description":"Information for when the car kills","id":18,"endian":"little","data":[{"name":"reason1","type":"bitfield","bits":[{"name":"OVERVOLT"},{"name":"UNDERVOLT"},{"name":"OVERTEMP"},{"name":"TEMP_DISCONNECT"},{"name":"COMM_FAIL"}]},{"name":"reason2","type":"bitfield","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"},{"name":"value","type":"float"}]},{"name":"bms_module_min_max","description":"min and max cell voltages and temperatures","id":19,"endian":"little","data":[{"name":"module_max_temp","type":"int16_t","units":"C","conversion":0.01},{"name":"module_min_temp","type":"int16_t","units":"C","conversion":0.01},{"name":"module_max_voltage","type":"uint16_t","units":"V","conversion":0.001},{"name":"module_min_voltage","type":"uint16_t","units":"V","conversion":0.001}]},{"name":"bms_soc","description":"State of charge","id":20,"endian":"little","data":[{"name":"soc","type":"float","conversion":1}]},{"name":"bms_capacity","description":"State of charge","id":21,"endian":"little","data":[{"name":"Ah","type":"float","conversion":1},{"name":"Wh","type":"float","conversion":1}]},{"name":"bms_currentlimit","description":"reports BP params for current","id":24,"endian":"little","data":[{"name":"current_max","type":"int16_t","units":"A","conversion":0.01},{"name":"current_min","type":"int16_t","units":"A","conversion":0.01}]},{"name":"bms_fan_info","description":"BP Fans","id":25,"endian":"little","data":[{"name":"fan1","type":"uint16_t","units":"RPM","conversion":1},{"name":"fan2","type":"uint16_t","units":"RPM","conversion":1},{"name":"fan3","type":"uint16_t","units":"RPM","conversion":1},{"name":"fan4","type":"uint16_t","units":"RPM","conversion":1}]},{"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","data":[{"name":"fan_percentage","type":"float","units":"percent"},{"name":"time","type":"uint16_t","units":"s"}]},{"name":"bms_module","description":"Voltage and temperature for a single module","id":64,"endian":"little","repeat":36,"offset":1,"data":[{"name":"voltage","type":"float","units":"V","conversion":1},{"name":"temperature","type":"float","units":"C","conversion":1}]},{"name":"bms_charger_response","description":"Response packet from BMS for indicating whether BMS is ready for charging","id":117,"endian":"little","data":[{"name":"response_flags","type":"bitfield","bits":[{"name":"charging_ready"}]}]},{"name":"chassis_isolation_fault","description":"chassiss is not isolated from the battery","id":56,"data":[{"name":"fault_detected","type":"bitfield","bits":[{"name":"isolation_fault"}]}]},{"name":"bms_imd_info","description":"information from chassis isolation","id":55,"data":[{"name":"d_imc_r_iso","type":"uint16_t"},{"name":"d_imc_status_1","type":"bitfield","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","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","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","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","data":[{"name":"accel_pedal_value","type":"uint8_t"},{"name":"brake_pedal_value","type":"uint8_t"}]},{"name":"car_state","description":"Car gear. Forward, neutral, reverse, etc.","id":657,"endian":"little","data":[{"name":"state","type":"uint8_t"}]},{"name":"dashboard_pedal_fault","description":"Target speed that the driver should maintain.","id":658,"endian":"little","data":[{"name":"brake_fault_count","type":"uint8_t"},{"name":"accel_fault_count","type":"uint8_t"}]},{"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","data":[{"name":"flag_set_0","type":"bitfield","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","data":[{"name":"speed","type":"float"}]},{"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","data":[{"name":"front_lights","type":"uint8_t"},{"name":"rear_lights","type":"uint8_t"},{"name":"steering","type":"uint8_t"},{"name":"vision","type":"uint8_t"},{"name":"driver_display","type":"uint8_t"},{"name":"center_console","type":"uint8_t"}]},{"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","data":[{"name":"bms","type":"uint8_t"},{"name":"charger","type":"uint8_t"},{"name":"wsl","type":"uint8_t"},{"name":"wsr","type":"uint8_t"},{"name":"mppt_front","type":"uint8_t"},{"name":"mppt_rear","type":"uint8_t"}]},{"name":"flight_computer_internal_state","description":"internal bools","id":669,"endian":"little","data":[{"name":"bms","type":"bitfield","bits":[{"name":"battery_kill"},{"name":"cells_in_charging_threshold"},{"name":"first_packet_received"}]},{"name":"charger","type":"bitfield","bits":[{"name":"proximity_detected"}]},{"name":"photon3","type":"bitfield","bits":[{"name":"enable"}]},{"name":"wavesculptor","type":"bitfield","bits":[{"name":"sending_reset"},{"name":"regen_enable"}]},{"name":"internal","type":"bitfield","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","data":[{"name":"moving_average_100","type":"int16_t"},{"name":"moving_average_1k","type":"int16_t"},{"name":"moving_average_10k","type":"int16_t"}]},{"name":"array_power","description":"array power calculated from current and voltage measurements","id":415,"endian":"little","data":[{"name":"front_array_channel_0","type":"uint16_t"},{"name":"front_array_channel_1","type":"uint16_t"},{"name":"rear_array_channel_0","type":"uint16_t"},{"name":"rear_array_channel_1","type":"uint16_t"}]},{"name":"array_energy","description":"cumulative energy received from the array","id":281,"endian":"little","data":[{"name":"energy","type":"float","units":"Joule"}]},{"name":"array_energy_reset","description":"resets cumulative energy received from the array","id":288,"endian":"little","data":[{"name":"energy","type":"float","units":"Joule"}]},{"name":"vision_turn_signals_command","description":"Command to have the vision board illuminate or turn off left, right, or both turn signals","id":688,"data":[{"name":"lights","type":"bitfield","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,"data":[{"name":"lights","type":"bitfield","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,"data":[{"name":"lights","type":"bitfield","bits":[{"name":"headlights"},{"name":"high_beams"},{"name":"spare_1"},{"name":"spare_2"},{"name":"spare_3"}]},{"name":"brightness","type":"float"}]},{"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,"data":[{"name":"horn","type":"bitfield","bits":[{"name":"horn"},{"name":"spare"}]}]},{"name":"vision_array_latches_command","description":"Command the vision board to open the array latches","id":692,"data":[{"name":"array_latches","type":"bitfield","bits":[{"name":"array_front"},{"name":"array_rear"}]}]},{"name":"vision_rearview_command","description":"Command the vision board turn on the rear view cameras","id":693,"data":[{"name":"cameras","type":"bitfield","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","repeat":6,"offset":1,"data":[{"name":"enable","type":"uint8_t"}]},{"name":"distance_traveled","description":"distance of wavesculptor odometer","id":413,"endian":"little","data":[{"name":"trip_distance","type":"float","units":"m"}]},{"name":"charger_state","description":"Notifies whether the J1772 cable is plugged.","id":1395,"data":[{"name":"state_flags","type":"bitfield","bits":[{"name":"charger_plugged"}]},{"name":"charger_max_temp","type":"uint16_t","units":"C","conversion":0.001},{"name":"fault","type":"bitfield","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"}]},{"name":"charger_bms_request","description":"Request packet for sending contactor commands from the charger to BP.","id":116,"data":[{"name":"request_flags","type":"bitfield","bits":[{"name":"charging_requested"}]}]},{"name":"charger_current_voltage","description":"Packet to request charging current/voltage set","id":1398,"data":[{"name":"max_current","type":"float","units":"A"},{"name":"max_capacity","type":"float","units":"kWh"}]},{"name":"charger_power","description":"Outputs the amount of power that the chargers are delivering.","id":1399,"data":[{"name":"power","type":"float","units":"W"}]},{"name":"thunderstruck_control_message","description":"Control packet for thunderstruck chargers","id":417677348,"endian":"little","is_extended":true,"data":[{"name":"Enable","type":"uint8_t","units":"V","conversion":1},{"name":"CHARGE_VOLTAGE","type":"uint16_t","units":"V","conversion":1},{"name":"CHARGE_CURRENT","type":"uint16_t","units":"V","conversion":1},{"name":"LED_BLINK_PATTERN","type":"uint8_t","units":"V","conversion":1},{"name":"RESERVED","type":"uint16_t","units":"V","conversion":1}]},{"name":"vision_status_front","description":"Status of the front vision board outputs","id":694,"data":[{"name":"lights","type":"bitfield","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","bits":[{"name":"horn"},{"name":"spare"}]},{"name":"cameras","type":"bitfield","bits":[{"name":"left"},{"name":"right"},{"name":"rear"}]},{"name":"array_latches","type":"bitfield","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,"data":[{"name":"lights","type":"bitfield","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","bits":[{"name":"horn"},{"name":"spare"}]},{"name":"cameras","type":"bitfield","bits":[{"name":"left"},{"name":"right"},{"name":"rear"}]},{"name":"array_latches","type":"bitfield","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,"data":[{"name":"board_id","type":"uint16_t"},{"name":"mcu_temp","type":"int16_t","units":"C","conversion":0.01},{"name":"bus_voltage","type":"uint16_t","units":"V","conversion":0.001},{"name":"fault_code","type":"uint16_t"}]},{"name":"lights_back_id","description":"Unique identification packet for back lights board","id":769,"data":[{"name":"board_id","type":"uint16_t"},{"name":"mcu_temp","type":"int16_t","units":"C","conversion":0.01},{"name":"bus_voltage","type":"uint16_t","units":"V","conversion":0.001},{"name":"fault_code","type":"uint16_t"}]},{"name":"vision_id","description":"Unique identification packet for vision","id":770,"data":[{"name":"board_id","type":"uint16_t"},{"name":"mcu_temp","type":"int16_t","units":"C","conversion":0.01},{"name":"bus_voltage","type":"uint16_t","units":"V","conversion":0.001},{"name":"fault_code","type":"uint16_t"}]},{"name":"steering_press_count_1","description":"Shows whether each button has been toggled an even (\"on\") or odd (\"off\") number of times.","id":576,"data":[{"name":"button0","type":"uint8_t"},{"name":"button1","type":"uint8_t"},{"name":"button2","type":"uint8_t"},{"name":"button3","type":"uint8_t"},{"name":"button4","type":"uint8_t"},{"name":"button5","type":"uint8_t"},{"name":"button6","type":"uint8_t"}]},{"name":"steering_press_count_2","description":"Shows whether each button has been toggled an even (\"on\") or odd (\"off\") number of times.","id":592,"data":[{"name":"button7","type":"uint8_t"},{"name":"button8","type":"uint8_t"},{"name":"button9","type":"uint8_t"},{"name":"button10","type":"uint8_t"}]},{"name":"steering_button_colors_1","description":"This packet controls each button's color. Each byte is a hex color code.","id":577,"data":[{"name":"button0","type":"uint8_t"},{"name":"button1","type":"uint8_t"},{"name":"button2","type":"uint8_t"},{"name":"button3","type":"uint8_t"},{"name":"button4","type":"uint8_t"},{"name":"button5","type":"uint8_t"},{"name":"button6","type":"uint8_t"}]},{"name":"steering_button_colors_2","description":"This packet controls each button's color. Each byte is a hex color code.","id":593,"data":[{"name":"button7","type":"uint8_t"},{"name":"button8","type":"uint8_t"},{"name":"button9","type":"uint8_t"},{"name":"button10","type":"uint8_t"}]},{"name":"steering_horn","description":"This packet controls the state of the horn.","id":578,"data":[{"name":"horn","type":"uint8_t"}]},{"name":"thunderstruck_status_message","description":"Status packet for thunderstruck chargers","id":418063424,"endian":"little","data":[{"name":"STATUS_FLAGS","type":"uint8_t","units":"V","conversion":1},{"name":"CHARGE_FLAGS","type":"uint8_t","units":"V","conversion":1},{"name":"OUTPUT_VOLTAGE","type":"uint16_t","units":"V","conversion":1},{"name":"OUTPUT_CURRENT","type":"uint16_t","units":"V","conversion":1},{"name":"CHARGER_TEMP","type":"uint8_t","units":"V","conversion":1},{"name":"RESERVED","type":"uint8_t","units":"V","conversion":1}]},{"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","repeat":6,"offset":1,"data":[{"name":"array_voltage","type":"uint16_t","units":"V","conversion":0.01},{"name":"array_current","type":"uint16_t","units":"A","conversion":0.001},{"name":"battery_voltage","type":"uint16_t","units":"V","conversion":0.01},{"name":"temperature","type":"uint16_t","units":"C","conversion":0.01}]},{"name":"tritium_motor_drive_l","description":"Tritium Motor Drive Command","id":289,"endian":"little","data":[{"name":"motor_velocity","type":"float"},{"name":"motor_current","type":"float"}]},{"name":"tritium_motor_power_l","description":"Tritium Motor Power Command","id":290,"endian":"little","data":[{"name":"reserved","type":"float"},{"name":"bus_current","type":"float"}]},{"name":"tritium_reset_l","description":"Tritium Reset Command","id":291,"endian":"little","data":[{"name":"unused1","type":"float"},{"name":"unused2","type":"float"}]},{"name":"tritium_motor_drive_r","description":"Tritium Motor Drive Command","id":353,"endian":"little","data":[{"name":"motor_velocity","type":"float"},{"name":"motor_current","type":"float"}]},{"name":"tritium_motor_power_r","description":"Tritium Motor Power Command","id":354,"endian":"little","data":[{"name":"reserved","type":"float"},{"name":"bus_current","type":"float"}]},{"name":"tritium_reset_r","description":"Tritium Reset Command","id":355,"endian":"little","data":[{"name":"unused1","type":"float"},{"name":"unused2","type":"float"}]},{"name":"bms_ah_set","description":"write state of charge, use with caution","id":22,"endian":"little","data":[{"name":"ah","type":"uint32_t","conversion":0.00001}]},{"name":"bms_wh_set","description":"write state of charge, use with caution","id":23,"endian":"little","data":[{"name":"wh","type":"uint32_t","conversion":0.00001}]},{"name":"bms_kill","description":"packet to cause BMS kill","id":26,"endian":"little","data":[{"name":"kill_type","type":"bitfield","bits":[{"name":"KILL_HARD"}]}]},{"name":"telemetry_rtc_reset","description":"Reset telemetry's real-time clock (RTC).","id":1792,"data":[{"name":"year","type":"uint8_t"},{"name":"month","type":"uint8_t"},{"name":"day","type":"uint8_t"},{"name":"hour","type":"uint8_t"},{"name":"minute","type":"uint8_t"},{"name":"second","type":"uint8_t"}]},{"name":"wsr_identification","description":"WS RIGHT Identification Information","id":320,"endian":"little","data":[{"name":"tritium_id","type":"uint32_t"},{"name":"serial_number","type":"uint32_t"}]},{"name":"wsr_status_information","description":"WS RIGHT Status Information","id":321,"endian":"little","data":[{"name":"limit_flags","type":"bitfield","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"},{"name":"error_flags_0","type":"bitfield","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","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"},{"name":"reserved","type":"uint16_t"}]},{"name":"wsr_bus_measurement","description":"WS RIGHT Bus Measurement","id":322,"endian":"little","data":[{"name":"bus_voltage","type":"float","units":"V"},{"name":"bus_current","type":"float","units":"A"}]},{"name":"wsr_velocity","description":"WS RIGHT Velocity Measurement","id":323,"endian":"little","data":[{"name":"motor_velocity","type":"float","units":"rpm"},{"name":"vehicle_velocity","type":"float","units":"m/s"}]},{"name":"wsr_phase_current","description":"WS RIGHT Phase Current Measurement","id":324,"endian":"little","data":[{"name":"phase_b_current","type":"float","units":"A rms"},{"name":"phase_c_current","type":"float","units":"A rms"}]},{"name":"wsr_motor_voltage_vector","description":"WS RIGHT Motor Voltage Vector Measurement","id":325,"endian":"little","data":[{"name":"vq","type":"float","units":"V"},{"name":"vd","type":"float","units":"V"}]},{"name":"wsr_motor_current_vector","description":"WS RIGHT Motor Current Vector Measurement","id":326,"endian":"little","data":[{"name":"iq","type":"float","units":"A"},{"name":"id","type":"float","units":"A"}]},{"name":"wsr_motor_backemf","description":"WS RIGHT Motor BackEMF Measurement / Prediction","id":327,"endian":"little","data":[{"name":"bemfq","type":"float","units":"V"},{"name":"bemfd","type":"float","units":"V"}]},{"name":"wsr_15_165_voltage_rail","description":"WS RIGHT 15 and 1.65 Voltage Rail Measurement","id":328,"endian":"little","data":[{"name":"reference_165v","type":"float","units":"V"},{"name":"supply_15v","type":"float","units":"V"}]},{"name":"wsr_25_12_voltage_rail","description":"WS RIGHT 2.5V and 1.2V Voltage Rail Measurement","id":329,"endian":"little","data":[{"name":"supply_12v","type":"float","units":"V"},{"name":"supply_25v","type":"float","units":"V"}]},{"name":"wsr_heatsink_motor_temp","description":"WS RIGHT Heat-sink \u0026 Motor Temperature Measurement","id":331,"endian":"little","data":[{"name":"motor_temp","type":"float","units":"C"},{"name":"heatsink_temp","type":"float","units":"C"}]},{"name":"wsr_dsp_board_temp","description":"WS RIGHT DPS Board Temperature Measurement","id":332,"endian":"little","data":[{"name":"dsp_board_temp","type":"float","units":"C"},{"name":"reserved","type":"float","units":"C"}]},{"name":"wsr_reserved","description":"WS RIGHT Reserved","id":333,"endian":"little","data":[{"name":"reserved0","type":"float"},{"name":"reserved1","type":"float"}]},{"name":"wsr_odometer_bus_amphours_measurement","description":"WS RIGHT Odometer and Bus AmpHours Measurement","id":334,"endian":"little","data":[{"name":"odometer","type":"float","units":"m"},{"name":"dc_bus_amphours","type":"float","units":"Ah"}]},{"name":"wsr_slip_speed_measurement","description":"WS RIGHT Slip Speed Measurement","id":343,"endian":"little","data":[{"name":"reserved","type":"float","units":"C"},{"name":"slip_speed","type":"float","units":"Hz"}]},{"name":"wsl_identification","description":"WS LEFT Identification Information","id":256,"endian":"little","data":[{"name":"tritium_id","type":"uint32_t"},{"name":"serial_number","type":"uint32_t"}]},{"name":"wsl_status_information","description":"WS LEFT Status Information","id":257,"endian":"little","data":[{"name":"limit_flags","type":"bitfield","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"},{"name":"error_flags_0","type":"bitfield","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","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"},{"name":"reserved","type":"uint16_t"}]},{"name":"wsl_bus_measurement","description":"WS LEFT Bus Measurement","id":258,"endian":"little","data":[{"name":"bus_voltage","type":"float","units":"V"},{"name":"bus_current","type":"float","units":"A"}]},{"name":"wsl_velocity","description":"WS LEFT Velocity Measurement","id":259,"endian":"little","data":[{"name":"motor_velocity","type":"float","units":"rpm"},{"name":"vehicle_velocity","type":"float","units":"m/s"}]},{"name":"wsl_phase_current","description":"WS LEFT Phase Current Measurement","id":260,"endian":"little","data":[{"name":"phase_b_current","type":"float","units":"A rms"},{"name":"phase_c_current","type":"float","units":"A rms"}]},{"name":"wsl_motor_voltage_vector","description":"WS LEFT Motor Voltage Vector Measurement","id":261,"endian":"little","data":[{"name":"vq","type":"float","units":"V"},{"name":"vd","type":"float","units":"V"}]},{"name":"wsl_motor_current_vector","description":"WS LEFT Motor Current Vector Measurement","id":262,"endian":"little","data":[{"name":"iq","type":"float","units":"A"},{"name":"id","type":"float","units":"A"}]},{"name":"wsl_motor_backemf","description":"WS LEFT Motor BackEMF Measurement / Prediction","id":263,"endian":"little","data":[{"name":"bemfq","type":"float","units":"V"},{"name":"bemfd","type":"float","units":"V"}]},{"name":"wsl_15_165_voltage_rail","description":"WS LEFT 15 and 1.65 Voltage Rail Measurement","id":264,"endian":"little","data":[{"name":"reference_165v","type":"float","units":"V"},{"name":"supply_15v","type":"float","units":"V"}]},{"name":"wsl_25_12_voltage_rail","description":"WS LEFT 2.5V and 1.2V Voltage Rail Measurement","id":265,"endian":"little","data":[{"name":"supply_12v","type":"float","units":"V"},{"name":"supply_25v","type":"float","units":"V"}]},{"name":"wsl_heatsink_motor_temp","description":"WS LEFT Heat-sink \u0026 Motor Temperature Measurement","id":267,"endian":"little","data":[{"name":"motor_temp","type":"float","units":"C"},{"name":"heatsink_temp","type":"float","units":"C"}]},{"name":"wsl_dsp_board_temp","description":"WS LEFT DPS Board Temperature Measurement","id":268,"endian":"little","data":[{"name":"dsp_board_temp","type":"float","units":"C"},{"name":"reserved","type":"float","units":"C"}]},{"name":"wsl_odometer_bus_amphours_measurement","description":"WS LEFT Odometer and Bus AmpHours Measurement","id":270,"endian":"little","data":[{"name":"odometer","type":"float","units":"m"},{"name":"dc_bus_amphours","type":"float","units":"Ah"}]},{"name":"wsl_reserved","description":"WS LEFT Reserved","id":269,"endian":"little","data":[{"name":"reserved0","type":"float"},{"name":"reserved1","type":"float"}]},{"name":"wsl_slip_speed_measurement","description":"WS LEFT Slip Speed Measurement","id":279,"endian":"little","data":[{"name":"reserved","type":"float","units":"C"},{"name":"slip_speed","type":"float","units":"Hz"}]}],"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"]}]}`