diff --git a/bobbycar-can.h b/bobbycar-can.h index 13b31df..cb55eef 100644 --- a/bobbycar-can.h +++ b/bobbycar-can.h @@ -6,17 +6,18 @@ namespace bobbycar { namespace protocol { namespace can { +enum : uint16_t { // vvv + DeviceTypeMotorController = 0b00000000000, + DeviceTypeBoardcomputer = 0b00100000000 +}; + template class MotorController { private: - enum : uint16_t { // vvv - DeviceTypeMotorController = 0b00000000000 - }; - enum : uint16_t { // ...v - MotorControllerCommand = 0b00000000000, - MotorControllerFeedback = 0b00010000000, + MotorControllerCommand = 0b00000000000, // send only TO the motor controller + MotorControllerFeedback = 0b00010000000, // send only FROM the motor controller }; enum : uint16_t { // .........v @@ -40,7 +41,9 @@ public: MotorController() = delete; ~MotorController() = delete; - class Command { + // send only TO the motor controller + class Command + { private: enum : uint16_t { MotorControllerCommandMask = @@ -71,7 +74,9 @@ public: }; }; - class Feedback { + // send only FROM the motor controller + class Feedback + { private: enum : uint16_t { MotorControllerFeedbackMask = @@ -99,106 +104,174 @@ public: }; }; +class Boardcomputer +{ +private: + enum : uint16_t { // ...v + BoardcomputerCommand = 0b00000000000, // send only TO the boardcomputer + BoardcomputerFeedback = 0b00010000000, // send only FROM the boardcomputer + }; + +public: + Boardcomputer() = delete; + ~Boardcomputer() = delete; + + enum { + ButtonUp = 1, + ButtonDown = 2, + ButtonConfirm = 4, + ButtonBack = 8, + ButtonProfile0 = 16, + ButtonProfile1 = 32, + ButtonProfile2 = 64, + ButtonProfile3 = 128, + }; + + // send only TO the boardcomputer + class Command + { + private: + enum : uint16_t { + BoardcomputerCommandMask = + uint16_t(DeviceTypeBoardcomputer) | + uint16_t(BoardcomputerCommand) + }; + + public: + Command() = delete; + ~Command() = delete; + + enum : uint16_t { // ....vvvvvvv + ButtonPress = 0b00000000000 | BoardcomputerCommandMask, + RawGas = 0b00000000001 | BoardcomputerCommandMask, + RawBrems = 0b00000000010 | BoardcomputerCommandMask + }; + }; + + // send only FROM the boardcomputer + class Feedback + { + private: + enum : uint16_t { + BoardcomputerFeedbackMask = + uint16_t(DeviceTypeBoardcomputer) | + uint16_t(BoardcomputerFeedback) + }; + + public: + Feedback() = delete; + ~Feedback() = delete; + + enum : uint16_t { // ....vvvvvvv + ButtonLeds = 0b00000000000 | BoardcomputerFeedbackMask, + }; + }; +}; + inline const char *bobbycarCanIdDesc(uint16_t id) { switch (id) { - case MotorController::Command::Enable: return "Enable (Command, Front, Left)"; - case MotorController::Command::Enable: return "Enable (Command, Front, Right)"; - case MotorController::Command::Enable: return "Enable (Command, Back, Left)"; - case MotorController::Command::Enable: return "Enable (Command, Back, Right)"; - case MotorController::Command::InpTgt: return "InpTgt (Command, Front, Left)"; - case MotorController::Command::InpTgt: return "InpTgt (Command, Front, Right)"; - case MotorController::Command::InpTgt: return "InpTgt (Command, Back, Left)"; - case MotorController::Command::InpTgt: return "InpTgt (Command, Back, Right)"; - case MotorController::Command::CtrlTyp: return "CtrlTyp (Command, Front, Left)"; - case MotorController::Command::CtrlTyp: return "CtrlTyp (Command, Front, Right)"; - case MotorController::Command::CtrlTyp: return "CtrlTyp (Command, Back, Left)"; - case MotorController::Command::CtrlTyp: return "CtrlTyp (Command, Back, Right)"; - case MotorController::Command::CtrlMod: return "CtrlMod (Command, Front, Left)"; - case MotorController::Command::CtrlMod: return "CtrlMod (Command, Front, Right)"; - case MotorController::Command::CtrlMod: return "CtrlMod (Command, Back, Left)"; - case MotorController::Command::CtrlMod: return "CtrlMod (Command, Back, Right)"; - case MotorController::Command::IMotMax: return "IMotMax (Command, Front, Left)"; - case MotorController::Command::IMotMax: return "IMotMax (Command, Front, Right)"; - case MotorController::Command::IMotMax: return "IMotMax (Command, Back, Left)"; - case MotorController::Command::IMotMax: return "IMotMax (Command, Back, Right)"; - case MotorController::Command::IDcMax: return "IDcMax (Command, Front, Left)"; - case MotorController::Command::IDcMax: return "IDcMax (Command, Front, Right)"; - case MotorController::Command::IDcMax: return "IDcMax (Command, Back, Left)"; - case MotorController::Command::IDcMax: return "IDcMax (Command, Back, Right)"; - case MotorController::Command::NMotMax: return "NMotMax (Command, Front, Left)"; - case MotorController::Command::NMotMax: return "NMotMax (Command, Front, Right)"; - case MotorController::Command::NMotMax: return "NMotMax (Command, Back, Left)"; - case MotorController::Command::NMotMax: return "NMotMax (Command, Back, Right)"; - case MotorController::Command::FieldWeakMax: return "FieldWeakMax (Command, Front, Left)"; - case MotorController::Command::FieldWeakMax: return "FieldWeakMax (Command, Front, Right)"; - case MotorController::Command::FieldWeakMax: return "FieldWeakMax (Command, Back, Left)"; - case MotorController::Command::FieldWeakMax: return "FieldWeakMax (Command, Back, Right)"; - case MotorController::Command::PhaseAdvMax: return "PhaseAdvMax (Command, Front, Left)"; - case MotorController::Command::PhaseAdvMax: return "PhaseAdvMax (Command, Front, Right)"; - case MotorController::Command::PhaseAdvMax: return "PhaseAdvMax (Command, Back, Left)"; - case MotorController::Command::PhaseAdvMax: return "PhaseAdvMax (Command, Back, Right)"; - case MotorController::Command::BuzzerFreq: return "BuzzerFreq (Command, Front, Left)"; - case MotorController::Command::BuzzerFreq: return "BuzzerFreq (Command, Front, Right)"; - case MotorController::Command::BuzzerFreq: return "BuzzerFreq (Command, Back, Left)"; - case MotorController::Command::BuzzerFreq: return "BuzzerFreq (Command, Back, Right)"; - case MotorController::Command::BuzzerPattern: return "BuzzerPattern (Command, Front, Left)"; - case MotorController::Command::BuzzerPattern: return "BuzzerPattern (Command, Front, Right)"; - case MotorController::Command::BuzzerPattern: return "BuzzerPattern (Command, Back, Left)"; - case MotorController::Command::BuzzerPattern: return "BuzzerPattern (Command, Back, Right)"; - case MotorController::Command::Led: return "Led (Command, Front, Left)"; - case MotorController::Command::Led: return "Led (Command, Front, Right)"; - case MotorController::Command::Led: return "Led (Command, Back, Left)"; - case MotorController::Command::Led: return "Led (Command, Back, Right)"; - case MotorController::Command::Poweroff: return "Poweroff (Command, Front, Left)"; - case MotorController::Command::Poweroff: return "Poweroff (Command, Front, Right)"; - case MotorController::Command::Poweroff: return "Poweroff (Command, Back, Left)"; - case MotorController::Command::Poweroff: return "Poweroff (Command, Back, Right)"; - case MotorController::Feedback::DcLink: return "DcLink (Feedback, Front, Left)"; - case MotorController::Feedback::DcLink: return "DcLink (Feedback, Front, Right)"; - case MotorController::Feedback::DcLink: return "DcLink (Feedback, Back, Left)"; - case MotorController::Feedback::DcLink: return "DcLink (Feedback, Back, Right)"; - case MotorController::Feedback::Speed: return "Speed (Feedback, Front, Left)"; - case MotorController::Feedback::Speed: return "Speed (Feedback, Front, Right)"; - case MotorController::Feedback::Speed: return "Speed (Feedback, Back, Left)"; - case MotorController::Feedback::Speed: return "Speed (Feedback, Back, Right)"; - case MotorController::Feedback::Error: return "Error (Feedback, Front, Left)"; - case MotorController::Feedback::Error: return "Error (Feedback, Front, Right)"; - case MotorController::Feedback::Error: return "Error (Feedback, Back, Left)"; - case MotorController::Feedback::Error: return "Error (Feedback, Back, Right)"; - case MotorController::Feedback::Angle: return "Angle (Feedback, Front, Left)"; - case MotorController::Feedback::Angle: return "Angle (Feedback, Front, Right)"; - case MotorController::Feedback::Angle: return "Angle (Feedback, Back, Left)"; - case MotorController::Feedback::Angle: return "Angle (Feedback, Back, Right)"; - case MotorController::Feedback::DcPhaA: return "DcPhaA (Feedback, Front, Left)"; - case MotorController::Feedback::DcPhaA: return "DcPhaA (Feedback, Front, Right)"; - case MotorController::Feedback::DcPhaA: return "DcPhaA (Feedback, Back, Left)"; - case MotorController::Feedback::DcPhaA: return "DcPhaA (Feedback, Back, Right)"; - case MotorController::Feedback::DcPhaB: return "DcPhaB (Feedback, Front, Left)"; - case MotorController::Feedback::DcPhaB: return "DcPhaB (Feedback, Front, Right)"; - case MotorController::Feedback::DcPhaB: return "DcPhaB (Feedback, Back, Left)"; - case MotorController::Feedback::DcPhaB: return "DcPhaB (Feedback, Back, Right)"; - case MotorController::Feedback::DcPhaC: return "DcPhaC (Feedback, Front, Left)"; - case MotorController::Feedback::DcPhaC: return "DcPhaC (Feedback, Front, Right)"; - case MotorController::Feedback::DcPhaC: return "DcPhaC (Feedback, Back, Left)"; - case MotorController::Feedback::DcPhaC: return "DcPhaC (Feedback, Back, Right)"; - case MotorController::Feedback::Chops: return "Chops (Feedback, Front, Left)"; - case MotorController::Feedback::Chops: return "Chops (Feedback, Front, Right)"; - case MotorController::Feedback::Chops: return "Chops (Feedback, Back, Left)"; - case MotorController::Feedback::Chops: return "Chops (Feedback, Back, Right)"; - case MotorController::Feedback::Hall: return "Hall (Feedback, Front, Left)"; - case MotorController::Feedback::Hall: return "Hall (Feedback, Front, Right)"; - case MotorController::Feedback::Hall: return "Hall (Feedback, Back, Left)"; - case MotorController::Feedback::Hall: return "Hall (Feedback, Back, Right)"; - case MotorController::Feedback::Voltage: return "Voltage (Feedback, Front, Left)"; - case MotorController::Feedback::Voltage: return "Voltage (Feedback, Front, Right)"; - case MotorController::Feedback::Voltage: return "Voltage (Feedback, Back, Left)"; - case MotorController::Feedback::Voltage: return "Voltage (Feedback, Back, Right)"; - case MotorController::Feedback::Temp: return "Temp (Feedback, Front, Left)"; - case MotorController::Feedback::Temp: return "Temp (Feedback, Front, Right)"; - case MotorController::Feedback::Temp: return "Temp (Feedback, Back, Left)"; - case MotorController::Feedback::Temp: return "Temp (Feedback, Back, Right)"; + case MotorController::Command::Enable: return "Enable (MotorController, Command, Front, Left)"; + case MotorController::Command::Enable: return "Enable (MotorController, Command, Front, Right)"; + case MotorController::Command::Enable: return "Enable (MotorController, Command, Back, Left)"; + case MotorController::Command::Enable: return "Enable (MotorController, Command, Back, Right)"; + case MotorController::Command::InpTgt: return "InpTgt (MotorController, Command, Front, Left)"; + case MotorController::Command::InpTgt: return "InpTgt (MotorController, Command, Front, Right)"; + case MotorController::Command::InpTgt: return "InpTgt (MotorController, Command, Back, Left)"; + case MotorController::Command::InpTgt: return "InpTgt (MotorController, Command, Back, Right)"; + case MotorController::Command::CtrlTyp: return "CtrlTyp (MotorController, Command, Front, Left)"; + case MotorController::Command::CtrlTyp: return "CtrlTyp (MotorController, Command, Front, Right)"; + case MotorController::Command::CtrlTyp: return "CtrlTyp (MotorController, Command, Back, Left)"; + case MotorController::Command::CtrlTyp: return "CtrlTyp (MotorController, Command, Back, Right)"; + case MotorController::Command::CtrlMod: return "CtrlMod (MotorController, Command, Front, Left)"; + case MotorController::Command::CtrlMod: return "CtrlMod (MotorController, Command, Front, Right)"; + case MotorController::Command::CtrlMod: return "CtrlMod (MotorController, Command, Back, Left)"; + case MotorController::Command::CtrlMod: return "CtrlMod (MotorController, Command, Back, Right)"; + case MotorController::Command::IMotMax: return "IMotMax (MotorController, Command, Front, Left)"; + case MotorController::Command::IMotMax: return "IMotMax (MotorController, Command, Front, Right)"; + case MotorController::Command::IMotMax: return "IMotMax (MotorController, Command, Back, Left)"; + case MotorController::Command::IMotMax: return "IMotMax (MotorController, Command, Back, Right)"; + case MotorController::Command::IDcMax: return "IDcMax (MotorController, Command, Front, Left)"; + case MotorController::Command::IDcMax: return "IDcMax (MotorController, Command, Front, Right)"; + case MotorController::Command::IDcMax: return "IDcMax (MotorController, Command, Back, Left)"; + case MotorController::Command::IDcMax: return "IDcMax (MotorController, Command, Back, Right)"; + case MotorController::Command::NMotMax: return "NMotMax (MotorController, Command, Front, Left)"; + case MotorController::Command::NMotMax: return "NMotMax (MotorController, Command, Front, Right)"; + case MotorController::Command::NMotMax: return "NMotMax (MotorController, Command, Back, Left)"; + case MotorController::Command::NMotMax: return "NMotMax (MotorController, Command, Back, Right)"; + case MotorController::Command::FieldWeakMax: return "FieldWeakMax (MotorController, Command, Front, Left)"; + case MotorController::Command::FieldWeakMax: return "FieldWeakMax (MotorController, Command, Front, Right)"; + case MotorController::Command::FieldWeakMax: return "FieldWeakMax (MotorController, Command, Back, Left)"; + case MotorController::Command::FieldWeakMax: return "FieldWeakMax (MotorController, Command, Back, Right)"; + case MotorController::Command::PhaseAdvMax: return "PhaseAdvMax (MotorController, Command, Front, Left)"; + case MotorController::Command::PhaseAdvMax: return "PhaseAdvMax (MotorController, Command, Front, Right)"; + case MotorController::Command::PhaseAdvMax: return "PhaseAdvMax (MotorController, Command, Back, Left)"; + case MotorController::Command::PhaseAdvMax: return "PhaseAdvMax (MotorController, Command, Back, Right)"; + case MotorController::Command::BuzzerFreq: return "BuzzerFreq (MotorController, Command, Front, Left)"; + case MotorController::Command::BuzzerFreq: return "BuzzerFreq (MotorController, Command, Front, Right)"; + case MotorController::Command::BuzzerFreq: return "BuzzerFreq (MotorController, Command, Back, Left)"; + case MotorController::Command::BuzzerFreq: return "BuzzerFreq (MotorController, Command, Back, Right)"; + case MotorController::Command::BuzzerPattern: return "BuzzerPattern (MotorController, Command, Front, Left)"; + case MotorController::Command::BuzzerPattern: return "BuzzerPattern (MotorController, Command, Front, Right)"; + case MotorController::Command::BuzzerPattern: return "BuzzerPattern (MotorController, Command, Back, Left)"; + case MotorController::Command::BuzzerPattern: return "BuzzerPattern (MotorController, Command, Back, Right)"; + case MotorController::Command::Led: return "Led (MotorController, Command, Front, Left)"; + case MotorController::Command::Led: return "Led (MotorController, Command, Front, Right)"; + case MotorController::Command::Led: return "Led (MotorController, Command, Back, Left)"; + case MotorController::Command::Led: return "Led (MotorController, Command, Back, Right)"; + case MotorController::Command::Poweroff: return "Poweroff (MotorController, Command, Front, Left)"; + case MotorController::Command::Poweroff: return "Poweroff (MotorController, Command, Front, Right)"; + case MotorController::Command::Poweroff: return "Poweroff (MotorController, Command, Back, Left)"; + case MotorController::Command::Poweroff: return "Poweroff (MotorController, Command, Back, Right)"; + case MotorController::Feedback::DcLink: return "DcLink (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::DcLink: return "DcLink (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::DcLink: return "DcLink (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::DcLink: return "DcLink (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::Speed: return "Speed (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::Speed: return "Speed (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::Speed: return "Speed (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::Speed: return "Speed (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::Error: return "Error (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::Error: return "Error (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::Error: return "Error (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::Error: return "Error (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::Angle: return "Angle (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::Angle: return "Angle (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::Angle: return "Angle (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::Angle: return "Angle (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::DcPhaA: return "DcPhaA (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::DcPhaA: return "DcPhaA (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::DcPhaA: return "DcPhaA (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::DcPhaA: return "DcPhaA (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::DcPhaB: return "DcPhaB (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::DcPhaB: return "DcPhaB (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::DcPhaB: return "DcPhaB (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::DcPhaB: return "DcPhaB (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::DcPhaC: return "DcPhaC (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::DcPhaC: return "DcPhaC (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::DcPhaC: return "DcPhaC (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::DcPhaC: return "DcPhaC (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::Chops: return "Chops (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::Chops: return "Chops (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::Chops: return "Chops (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::Chops: return "Chops (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::Hall: return "Hall (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::Hall: return "Hall (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::Hall: return "Hall (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::Hall: return "Hall (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::Voltage: return "Voltage (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::Voltage: return "Voltage (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::Voltage: return "Voltage (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::Voltage: return "Voltage (MotorController, Feedback, Back, Right)"; + case MotorController::Feedback::Temp: return "Temp (MotorController, Feedback, Front, Left)"; + case MotorController::Feedback::Temp: return "Temp (MotorController, Feedback, Front, Right)"; + case MotorController::Feedback::Temp: return "Temp (MotorController, Feedback, Back, Left)"; + case MotorController::Feedback::Temp: return "Temp (MotorController, Feedback, Back, Right)"; + case Boardcomputer::Command::ButtonPress: return "ButtonPress (Boardcomputer, Command)"; + case Boardcomputer::Command::RawGas: return "RawGas (Boardcomputer, Command)"; + case Boardcomputer::Command::RawBrems: return "RawBrems (Boardcomputer, Command)"; + case Boardcomputer::Feedback::ButtonLeds: return "ButtonLeds (Boardcomputer, Feedback)"; } return "Unknown"; }