WIP
This commit is contained in:
@@ -194,6 +194,10 @@ HalStatus MMR_CAN_SendRaw(MmrCan *can, MmrCanMessageId msgId, void *data, uint8_
|
|||||||
HalStatus MMR_CAN_SendPacket(MmrCan *can, MmrCanPacket packet);
|
HalStatus MMR_CAN_SendPacket(MmrCan *can, MmrCanPacket packet);
|
||||||
|
|
||||||
|
|
||||||
|
#define MMR_CAN_SendStruct(pcan, messageId, pdata) \
|
||||||
|
MMR_CAN_SendRaw(pcan, messageId, pdata, sizeof(*pdata))
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief
|
* @brief
|
||||||
* Sets the tick provider.
|
* Sets the tick provider.
|
||||||
@@ -230,6 +234,14 @@ HalStatus MMR_CAN_FilterConfig(CanHandle *hcan, MmrCanFilterSettings settings);
|
|||||||
*/
|
*/
|
||||||
MmrCanFilterSettings MMR_CAN_GetDefaultFilterSettings();
|
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
|
* @brief
|
||||||
* Sends a can packet over the network.
|
* Sends a can packet over the network.
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#ifndef MMR_CAN_ECU_MESSAGES_H_
|
||||||
|
#define MMR_CAN_ECU_MESSAGES_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
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_
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,7 +1,28 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include "mmr_can.h"
|
#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) {
|
MmrResult MMR_CAN_TryReceive(MmrCan *can, MmrCanMessage *result) {
|
||||||
size_t pendingMessages =
|
size_t pendingMessages =
|
||||||
HAL_CAN_GetRxFifoFillLevel(hcan, MMR_CAN_RX_FIFO);
|
HAL_CAN_GetRxFifoFillLevel(hcan, MMR_CAN_RX_FIFO);
|
||||||
|
|||||||
+17
-8
@@ -5,6 +5,7 @@
|
|||||||
#define MAILBOXES_COUNT 3
|
#define MAILBOXES_COUNT 3
|
||||||
|
|
||||||
static MmrCanHeader buildDefaultHeader(MmrCan *can, MmrCanMessageId msgId);
|
static MmrCanHeader buildDefaultHeader(MmrCan *can, MmrCanMessageId msgId);
|
||||||
|
static CanTxHeader buildTxHeader(MmrCan *can, MmrCanPacket *packet);
|
||||||
static CanMailbox *getNextMailbox(MmrCan *can);
|
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);
|
return MMR_CAN_SendRaw(can, msgId, &data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HalStatus MMR_CAN_SendInt(MmrCan *can, MmrCanMessageId msgId, int data) {
|
HalStatus MMR_CAN_SendInt(MmrCan *can, MmrCanMessageId msgId, int data) {
|
||||||
return MMR_CAN_SendRaw(can, msgId, &data, sizeof(data))
|
return MMR_CAN_SendRaw(can, msgId, &data, sizeof(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HalStatus MMR_CAN_SendFloat(MmrCan *can, MmrCanMessageId msgId, float data) {
|
HalStatus MMR_CAN_SendFloat(MmrCan *can, MmrCanMessageId msgId, float data) {
|
||||||
return MMR_CAN_SendRaw(can, msgId, &data, sizeof(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) {
|
HalStatus MMR_CAN_SendPacket(MmrCan *can, MmrCanPacket packet) {
|
||||||
CanTxHeader txHeader = {
|
CanTxHeader txHeader =
|
||||||
.ExtId = MMR_CAN_HeaderToBits(packet.header),
|
buildTxHeader(can, &packet);
|
||||||
.IDE = CAN_ID_EXT,
|
|
||||||
.RTR = CAN_RTR_DATA,
|
|
||||||
.DLC = packet->length,
|
|
||||||
.TransmitGlobalTime = DISABLE,
|
|
||||||
};
|
|
||||||
|
|
||||||
return HAL_CAN_AddTxMessage(
|
return HAL_CAN_AddTxMessage(
|
||||||
can->handle,
|
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){
|
return (MmrCanHeader){
|
||||||
.messageId = msgId,
|
.messageId = msgId,
|
||||||
.senderId = can->id,
|
.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) {
|
static CanMailbox *getNextMailbox(MmrCan *can) {
|
||||||
can->currentMailbox++;
|
can->currentMailbox++;
|
||||||
can->currentMailbox %= MAILBOXES_COUNT;
|
can->currentMailbox %= MAILBOXES_COUNT;
|
||||||
|
|||||||
Reference in New Issue
Block a user