From 772d87b3db59ad3c10e1f945f69d66270dd0fcb4 Mon Sep 17 00:00:00 2001 From: Stefano Calabretti Date: Tue, 31 May 2022 10:04:05 +0200 Subject: [PATCH] WIP --- Inc/mmr_can.h | 12 +++++++++ Inc/mmr_can_ecu_messages.h | 40 +++++++++++++++++++++++++++ Src/mmr_can_ecu_messages.c | 55 ++++++++++++++++++++++++++++++++++++++ Src/mmr_can_receive.c | 21 +++++++++++++++ Src/mmr_can_send.c | 25 +++++++++++------ 5 files changed, 145 insertions(+), 8 deletions(-) create mode 100644 Inc/mmr_can_ecu_messages.h create mode 100644 Src/mmr_can_ecu_messages.c diff --git a/Inc/mmr_can.h b/Inc/mmr_can.h index f29ef81..769ba55 100644 --- a/Inc/mmr_can.h +++ b/Inc/mmr_can.h @@ -194,6 +194,10 @@ HalStatus MMR_CAN_SendRaw(MmrCan *can, MmrCanMessageId msgId, void *data, uint8_ HalStatus MMR_CAN_SendPacket(MmrCan *can, MmrCanPacket packet); +#define MMR_CAN_SendStruct(pcan, messageId, pdata) \ + MMR_CAN_SendRaw(pcan, messageId, pdata, sizeof(*pdata)) + + /** * @brief * Sets the tick provider. @@ -230,6 +234,14 @@ HalStatus MMR_CAN_FilterConfig(CanHandle *hcan, MmrCanFilterSettings settings); */ MmrCanFilterSettings MMR_CAN_GetDefaultFilterSettings(); + +HalStatus MMR_CAN_SendString(MmrCan *can, MmrCanMessageId msgId, const char *data); +HalStatus MMR_CAN_SendInt(MmrCan *can, MmrCanMessageId msgId, int data); +HalStatus MMR_CAN_SendFloat(MmrCan *can, MmrCanMessageId msgId, float data); +HalStatus MMR_CAN_SendRaw(MmrCan *can, MmrCanMessageId msgId, void *data, uint8_t length); +HalStatus MMR_CAN_SendPacket(MmrCan *can, MmrCanPacket packet); + + /** * @brief * Sends a can packet over the network. diff --git a/Inc/mmr_can_ecu_messages.h b/Inc/mmr_can_ecu_messages.h new file mode 100644 index 0000000..f5d069e --- /dev/null +++ b/Inc/mmr_can_ecu_messages.h @@ -0,0 +1,40 @@ +#ifndef MMR_CAN_ECU_MESSAGES_H_ +#define MMR_CAN_ECU_MESSAGES_H_ + +#include + +typedef struct EcuPedalThrottle { + float apsAVoltage; + float apsBVoltage; + float throttleAVoltage; + float throttleBVoltage; +} EcuPedalThrottle; + +typedef struct EcuTemperatures { + int16_t oil; + int16_t engine; + int16_t intake; + int16_t ambient; +} EcuTemperatures; + +typedef struct EcuEngineFn1 { + float engineRpm; + float gear; + uint16_t vehicleSpeed; + uint16_t throttle; +} EcuEngineFn1; + +typedef struct EcuPressures { + float oil; + float fuel; + float intake; + float ambient; +} EcuPressures; + +typedef struct EcuEngineFn2 { + float batteryVoltage; + float acceleratorPedal; + float fanControl; +} EcuEngineFn2; + +#endif // !MMR_CAN_ECU_MESSAGES_H_ \ No newline at end of file diff --git a/Src/mmr_can_ecu_messages.c b/Src/mmr_can_ecu_messages.c new file mode 100644 index 0000000..117d107 --- /dev/null +++ b/Src/mmr_can_ecu_messages.c @@ -0,0 +1,55 @@ +#include "mmr_can_ecu_messages.h" +#include "mmr_can.h" + +#define ecuToHost(byteA, byteB) ((byteA << 8) | (byteB)) + + +EcuPedalThrottle MMR_CAN_GetEcuPedalThrottle(MmrCanMessage *message) { + uint8_t *buffer = message->store + return (EcuPedalThrottle) { + .apsAVoltage = ecuToHost(buffer[0], buffer[1]) / 1000, + .apsBVoltage = ecuToHost(buffer[2], buffer[3]) / 1000, + .throttleAVoltage = ecuToHost(buffer[4], buffer[5]) / 1000, + .throttleBVoltage = ecuToHost(buffer[6], buffer[7]) / 1000, + }; +} + +EcuTemperatures MMR_CAN_GetEcuTemperatures(MmrCanMessage *message) { + uint8_t *buffer = message->store + return (EcuTemperatures) { + .oil = ecuToHost(buffer[0], buffer[1]) - 40, + .engine = ecuToHost(buffer[2], buffer[3]) - 40, + .intake = ecuToHost(buffer[4], buffer[5]) - 40, + .ambient = ecuToHost(buffer[6], buffer[7]) - 40, + }; +} + +EcuEngineFn1 MMR_CAN_GetEcuEngineFn1(MmrCanMessage *message) { + uint8_t *buffer = message->store + return (EcuEngineFn1) { + .engineRpm = ecuToHost(buffer[0], buffer[1]), + .gear = ecuToHost(buffer[2], buffer[3]) + .vehicleSpeed = ecuToHost(buffer[4], buffer[5]) / 100, + .throttle = ecuToHost(buffer[6], buffer[7]) / 100, + }; +} + +EcuPressures MMR_CAN_GetEcuPressures(MmrCanMessage *message) { + uint8_t *buffer = message->store + return (EcuPressures) { + .oil = ecuToHost(buffer[0], buffer[1]) / 100, + .fuel = ecuToHost(buffer[2], buffer[3]) / 100, + .intake = ecuToHost(buffer[4], buffer[5]) / 10, + .ambient = ecuToHost(buffer[6], buffer[7]) / 10, + }; +} + +EcuEngineFn2 MMR_CAN_GetEcuEngineFn2(MmrCanMessage *message) { + uint8_t *buffer = message->store + return (EcuEngineFn2) { + .batteryVoltage = ecuToHost(buffer[0], buffer[1]) / 1000, + .acceleratorPedal = ecuToHost(buffer[2], buffer[3]) / 100, + .fanControl = ecuToHost(buffer[4], buffer[5]) / 100, + }; +} + diff --git a/Src/mmr_can_receive.c b/Src/mmr_can_receive.c index 428cc39..97481ed 100644 --- a/Src/mmr_can_receive.c +++ b/Src/mmr_can_receive.c @@ -1,7 +1,28 @@ #include +#include #include "mmr_can.h" +#define cast(pmsg, to) (*(to*)(pmsg->store)) + + +uint16_t MMR_CAN_GetUInt16(MmrCanMessage *message) { + return cast(message, uint16_t); +} + +uint32_t MMR_CAN_GetUInt32(MmrCanMessage *message) { + return cast(message, uint32_t); +} + +uint64_t MMR_CAN_GetUInt64(MmrCanMessage *message) { + return cast(message, uint64_t); +} + +float MMR_CAN_GetFloat(MmrCanMessage *message) { + return cast(message, float); +} + + MmrResult MMR_CAN_TryReceive(MmrCan *can, MmrCanMessage *result) { size_t pendingMessages = HAL_CAN_GetRxFifoFillLevel(hcan, MMR_CAN_RX_FIFO); diff --git a/Src/mmr_can_send.c b/Src/mmr_can_send.c index 41f2356..2d45903 100644 --- a/Src/mmr_can_send.c +++ b/Src/mmr_can_send.c @@ -5,6 +5,7 @@ #define MAILBOXES_COUNT 3 static MmrCanHeader buildDefaultHeader(MmrCan *can, MmrCanMessageId msgId); +static CanTxHeader buildTxHeader(MmrCan *can, MmrCanPacket *packet); static CanMailbox *getNextMailbox(MmrCan *can); @@ -15,10 +16,12 @@ HalStatus MMR_CAN_SendString(MmrCan *can, MmrCanMessageId msgId, const char *dat return MMR_CAN_SendRaw(can, msgId, &data, len); } + HalStatus MMR_CAN_SendInt(MmrCan *can, MmrCanMessageId msgId, int data) { return MMR_CAN_SendRaw(can, msgId, &data, sizeof(data)) } + HalStatus MMR_CAN_SendFloat(MmrCan *can, MmrCanMessageId msgId, float data) { return MMR_CAN_SendRaw(can, msgId, &data, sizeof(data)); } @@ -39,13 +42,8 @@ HalStatus MMR_CAN_SendRaw( HalStatus MMR_CAN_SendPacket(MmrCan *can, MmrCanPacket packet) { - CanTxHeader txHeader = { - .ExtId = MMR_CAN_HeaderToBits(packet.header), - .IDE = CAN_ID_EXT, - .RTR = CAN_RTR_DATA, - .DLC = packet->length, - .TransmitGlobalTime = DISABLE, - }; + CanTxHeader txHeader = + buildTxHeader(can, &packet); return HAL_CAN_AddTxMessage( can->handle, @@ -56,7 +54,7 @@ HalStatus MMR_CAN_SendPacket(MmrCan *can, MmrCanPacket packet) { } -MmrCanHeader buildDefaultHeader(MmrCan *can, MmrCanMessageId msgId) { +static MmrCanHeader buildDefaultHeader(MmrCan *can, MmrCanMessageId msgId) { return (MmrCanHeader){ .messageId = msgId, .senderId = can->id, @@ -66,6 +64,17 @@ MmrCanHeader buildDefaultHeader(MmrCan *can, MmrCanMessageId msgId) { } +static CanTxHeader buildTxHeader(MmrCan *can, MmrCanPacket *packet) { + return (CanTxHeader){ + .ExtId = MMR_CAN_HeaderToBits(packet->header), + .IDE = CAN_ID_EXT, + .RTR = CAN_RTR_DATA, + .DLC = packet->length, + .TransmitGlobalTime = DISABLE, + }; +} + + static CanMailbox *getNextMailbox(MmrCan *can) { can->currentMailbox++; can->currentMailbox %= MAILBOXES_COUNT;