From 747ebb3d10f6dccf8e21cd1d13c8853d62153cb7 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Mon, 17 May 2021 22:39:36 +0200 Subject: [PATCH] can related implementations --- bobbycar-can.h | 91 +++++++++++++++++++++++++++++++++ bobbycar-common.h | 16 ++++++ protocol.h => bobbycar-serial.h | 35 ++++--------- 3 files changed, 116 insertions(+), 26 deletions(-) create mode 100644 bobbycar-can.h create mode 100644 bobbycar-common.h rename protocol.h => bobbycar-serial.h (87%) diff --git a/bobbycar-can.h b/bobbycar-can.h new file mode 100644 index 0000000..893b810 --- /dev/null +++ b/bobbycar-can.h @@ -0,0 +1,91 @@ +#pragma once + +enum { // vv + DeviceTypeMotorController = 0b00000000000 +}; + +enum { // ..vv + MotorControllerRec = 0b00000000000, + MotorControllerSend = 0b00010000000, +}; + +enum { // ....vvvvv + MotorControllerDcLink = 0b00000000000, + MotorControllerSpeed = 0b00000000100, + MotorControllerError = 0b00000001000, + MotorControllerAngle = 0b00000001100, + MotorControllerDcPhaA = 0b00000010000, + MotorControllerDcPhaB = 0b00000010100, + MotorControllerDcPhaC = 0b00000011000, + MotorControllerChops = 0b00000011100, + MotorControllerHall = 0b00000100000, + MotorControllerVoltage = 0b00000100100, + MotorControllerTemp = 0b00000101000 +}; + +enum { // .........v + MotorControllerFront = 0b00000000000, + MotorControllerBack = 0b00000000010, +}; + +enum { // ..........v + MotorControllerLeft = 0b00000000000, + MotorControllerRight = 0b00000000001, +}; + +enum { + MotorControllerFrontLeftDcLink = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcLink | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightDcLink = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcLink | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftDcLink = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcLink | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightDcLink = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcLink | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftSpeed = DeviceTypeMotorController | MotorControllerSend | MotorControllerSpeed | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightSpeed = DeviceTypeMotorController | MotorControllerSend | MotorControllerSpeed | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftSpeed = DeviceTypeMotorController | MotorControllerSend | MotorControllerSpeed | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightSpeed = DeviceTypeMotorController | MotorControllerSend | MotorControllerSpeed | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftError = DeviceTypeMotorController | MotorControllerSend | MotorControllerError | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightError = DeviceTypeMotorController | MotorControllerSend | MotorControllerError | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftError = DeviceTypeMotorController | MotorControllerSend | MotorControllerError | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightError = DeviceTypeMotorController | MotorControllerSend | MotorControllerError | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftAngle = DeviceTypeMotorController | MotorControllerSend | MotorControllerAngle | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightAngle = DeviceTypeMotorController | MotorControllerSend | MotorControllerAngle | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftAngle = DeviceTypeMotorController | MotorControllerSend | MotorControllerAngle | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightAngle = DeviceTypeMotorController | MotorControllerSend | MotorControllerAngle | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftDcPhaA = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaA | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightDcPhaA = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaA | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftDcPhaA = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaA | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightDcPhaA = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaA | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftDcPhaB = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaB | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightDcPhaB = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaB | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftDcPhaB = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaB | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightDcPhaB = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaB | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftDcPhaC = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaC | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightDcPhaC = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaC | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftDcPhaC = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaC | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightDcPhaC = DeviceTypeMotorController | MotorControllerSend | MotorControllerDcPhaC | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftChops = DeviceTypeMotorController | MotorControllerSend | MotorControllerChops | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightChops = DeviceTypeMotorController | MotorControllerSend | MotorControllerChops | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftChops = DeviceTypeMotorController | MotorControllerSend | MotorControllerChops | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightChops = DeviceTypeMotorController | MotorControllerSend | MotorControllerChops | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftHall = DeviceTypeMotorController | MotorControllerSend | MotorControllerHall | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightHall = DeviceTypeMotorController | MotorControllerSend | MotorControllerHall | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftHall = DeviceTypeMotorController | MotorControllerSend | MotorControllerHall | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightHall = DeviceTypeMotorController | MotorControllerSend | MotorControllerHall | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftVoltage = DeviceTypeMotorController | MotorControllerSend | MotorControllerVoltage | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightVoltage = DeviceTypeMotorController | MotorControllerSend | MotorControllerVoltage | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftVoltage = DeviceTypeMotorController | MotorControllerSend | MotorControllerVoltage | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightVoltage = DeviceTypeMotorController | MotorControllerSend | MotorControllerVoltage | MotorControllerBack | MotorControllerRight, + + MotorControllerFrontLeftTemp = DeviceTypeMotorController | MotorControllerSend | MotorControllerTemp | MotorControllerFront | MotorControllerLeft, + MotorControllerFrontRightTemp = DeviceTypeMotorController | MotorControllerSend | MotorControllerTemp | MotorControllerFront | MotorControllerRight, + MotorControllerBackLeftTemp = DeviceTypeMotorController | MotorControllerSend | MotorControllerTemp | MotorControllerBack | MotorControllerLeft, + MotorControllerBackRightTemp = DeviceTypeMotorController | MotorControllerSend | MotorControllerTemp | MotorControllerBack | MotorControllerRight, +}; diff --git a/bobbycar-common.h b/bobbycar-common.h new file mode 100644 index 0000000..b62bfd7 --- /dev/null +++ b/bobbycar-common.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +enum class ControlType : uint8_t { + Commutation, + Sinusoidal, + FieldOrientedControl +}; + +enum class ControlMode : uint8_t { + OpenMode, + Voltage, + Speed, // Only with FieldOrientedControl + Torque // Only with FieldOrientedControl +}; diff --git a/protocol.h b/bobbycar-serial.h similarity index 87% rename from protocol.h rename to bobbycar-serial.h index bd918a0..58e7a91 100644 --- a/protocol.h +++ b/bobbycar-serial.h @@ -1,21 +1,6 @@ #pragma once -#include - -namespace { - -enum class ControlType : uint8_t { - Commutation, - Sinusoidal, - FieldOrientedControl -}; - -enum class ControlMode : uint8_t { - OpenMode, - Voltage, - Speed, // Only with FieldOrientedControl - Torque // Only with FieldOrientedControl -}; +#include "bobbycar-serial.h" struct MotorState { bool enable = false; @@ -29,7 +14,7 @@ struct MotorState { uint8_t phaseAdvMax = 40; // [deg] Maximum Phase Advance angle (only for SIN). Higher angle results in higher maximum speed. }; -uint16_t calculateChecksum(MotorState state) { +inline uint16_t calculateChecksum(MotorState state) { return uint16_t(state.enable) ^ state.pwm ^ @@ -47,7 +32,7 @@ struct BuzzerState { uint8_t pattern = 0; }; -uint16_t calculateChecksum(BuzzerState state) { +inline uint16_t calculateChecksum(BuzzerState state) { return state.freq ^ state.pattern; } @@ -67,7 +52,7 @@ struct Command { uint16_t checksum; }; -uint16_t calculateChecksum(Command command) { +inline uint16_t calculateChecksum(Command command) { return command.start ^ calculateChecksum(command.left) ^ calculateChecksum(command.right) ^ @@ -83,11 +68,11 @@ struct MotorFeedback { int16_t current = 0; uint16_t chops = 0; bool hallA = false, - hallB = false, - hallC = false; + hallB = false, + hallC = false; }; -uint16_t calculateChecksum(MotorFeedback feedback) { +inline uint16_t calculateChecksum(MotorFeedback feedback) { return feedback.angle ^ feedback.speed ^ feedback.error ^ feedback.current ^ feedback.chops ^ @@ -110,7 +95,7 @@ struct Feedback { uint16_t checksum; }; -uint16_t calculateChecksum(Feedback feedback) { +inline uint16_t calculateChecksum(Feedback feedback) { return feedback.start ^ calculateChecksum(feedback.left) ^ calculateChecksum(feedback.right) ^ @@ -121,7 +106,7 @@ uint16_t calculateChecksum(Feedback feedback) { #define ASSERT_LAYOUT(st, memb, off) \ - static_assert(offsetof(st, memb) == off, "struct layout wrong"); +static_assert(offsetof(st, memb) == off, "struct layout wrong"); ASSERT_LAYOUT(Feedback, start, 0); ASSERT_LAYOUT(Feedback, left, 2); @@ -181,5 +166,3 @@ ASSERT_LAYOUT(Command, buzzer.pattern, 27); ASSERT_LAYOUT(Command, poweroff, 28); ASSERT_LAYOUT(Command, led, 29); ASSERT_LAYOUT(Command, checksum, 30); - -}