mirror of https://github.com/rusefi/wideband.git
can
This commit is contained in:
parent
746bcefef7
commit
72c2c271fb
|
@ -0,0 +1,32 @@
|
||||||
|
#include "can.h"
|
||||||
|
#include "hal.h"
|
||||||
|
|
||||||
|
#include "can_helper.h"
|
||||||
|
|
||||||
|
static const CANConfig canConfig500 =
|
||||||
|
{
|
||||||
|
CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP,
|
||||||
|
CAN_BTR_SJW(0) | CAN_BTR_BRP(5) | CAN_BTR_TS1(12) | CAN_BTR_TS2(1),
|
||||||
|
};
|
||||||
|
|
||||||
|
void InitCan()
|
||||||
|
{
|
||||||
|
canStart(&CAND1, &canConfig500);
|
||||||
|
|
||||||
|
CanTxMessage::setDevice(CAND1);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct StandardDataFrame
|
||||||
|
{
|
||||||
|
uint16_t lambda;
|
||||||
|
uint16_t measuredResistance;
|
||||||
|
uint8_t pad[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
void SendCanData(float lambda, uint16_t measuredResistance)
|
||||||
|
{
|
||||||
|
CanTxTyped<StandardDataFrame> frame(0x130);
|
||||||
|
|
||||||
|
frame.get().lambda = lambda / 1000.0f;
|
||||||
|
frame.get().measuredResistance = measuredResistance;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
void InitCan();
|
||||||
|
void SendCanData(float lambda, uint16_t measuredResistance);
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include "can_helper.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
/*static*/ CANDriver* CanTxMessage::s_device = nullptr;
|
||||||
|
|
||||||
|
/*static*/ void CanTxMessage::setDevice(CANDriver& device) {
|
||||||
|
s_device = &device;
|
||||||
|
}
|
||||||
|
|
||||||
|
CanTxMessage::CanTxMessage(uint32_t eid, uint8_t dlc) {
|
||||||
|
m_frame.IDE = CAN_IDE_STD;
|
||||||
|
m_frame.EID = eid;
|
||||||
|
m_frame.RTR = CAN_RTR_DATA;
|
||||||
|
m_frame.DLC = dlc;
|
||||||
|
memset(m_frame.data8, 0, sizeof(m_frame.data8));
|
||||||
|
}
|
||||||
|
|
||||||
|
CanTxMessage::~CanTxMessage() {
|
||||||
|
auto device = s_device;
|
||||||
|
|
||||||
|
// 100 ms timeout
|
||||||
|
canTransmit(device, CAN_ANY_MAILBOX, &m_frame, TIME_MS2I(100));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t& CanTxMessage::operator[](size_t index) {
|
||||||
|
return m_frame.data8[index];
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstddef>
|
||||||
|
#include "hal.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represent a message to be transmitted over CAN.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* * Create an instance of CanTxMessage
|
||||||
|
* * Set any data you'd like to transmit either using the subscript operator to directly access bytes, or any of the helper functions.
|
||||||
|
* * Upon destruction, the message is transmitted.
|
||||||
|
*/
|
||||||
|
class CanTxMessage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Create a new CAN message, with the specified extended ID.
|
||||||
|
*/
|
||||||
|
explicit CanTxMessage(uint32_t eid, uint8_t dlc = 8);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destruction of an instance of CanTxMessage will transmit the message over the wire.
|
||||||
|
*/
|
||||||
|
~CanTxMessage();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the device for all messages to transmit from.
|
||||||
|
*/
|
||||||
|
static void setDevice(CANDriver& device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read & write the raw underlying 8-byte buffer.
|
||||||
|
*/
|
||||||
|
uint8_t& operator[](size_t);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CANTxFrame m_frame;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static CANDriver* s_device;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A CAN message based on a type, removing the need for manually flipping bits/bytes.
|
||||||
|
*/
|
||||||
|
template <typename TData>
|
||||||
|
class CanTxTyped final : public CanTxMessage
|
||||||
|
{
|
||||||
|
static_assert(sizeof(TData) == sizeof(CANTxFrame::data8));
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CanTxTyped(uint32_t eid) : CanTxMessage(eid) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Access members of the templated type.
|
||||||
|
*
|
||||||
|
* So you can do:
|
||||||
|
* CanTxTyped<MyType> d;
|
||||||
|
* d->memberOfMyType = 23;
|
||||||
|
*/
|
||||||
|
TData* operator->()
|
||||||
|
{
|
||||||
|
return reinterpret_cast<TData*>(&m_frame.data8);
|
||||||
|
}
|
||||||
|
|
||||||
|
TData& get()
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<TData*>(&m_frame.data8);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename TData>
|
||||||
|
void transmitStruct(uint32_t eid)
|
||||||
|
{
|
||||||
|
CanTxTyped<TData> frame(eid);
|
||||||
|
// Destruction of an instance of CanTxMessage will transmit the message over the wire.
|
||||||
|
// see CanTxMessage::~CanTxMessage()
|
||||||
|
populateFrame(frame.get());
|
||||||
|
}
|
Loading…
Reference in New Issue