Files
bobbycar-controller-firmware/can_feedc0de.cpp

101 lines
1.9 KiB
C++
Raw Permalink Normal View History

2020-10-25 01:22:08 +02:00
#include <cstdint>
#include <cstddef>
#include <cstring>
2021-03-28 01:37:14 +01:00
#include "config.h"
2020-10-25 01:22:08 +02:00
#include "protocol.h"
#include "can_fc.h"
#include "can_feedc0de.h"
static_assert((sizeof(Command) + FC_CHUNK_SIZE - 1) / FC_CHUNK_SIZE < 15);
2021-03-28 01:37:14 +01:00
template <class Sent, class Received>
void CANFeedc0de<Sent, Received>::poll()
2020-10-25 01:22:08 +02:00
{
2021-03-28 01:37:14 +01:00
feedc0de_fcs.tx();
feedc0de_fcr.ack();
2020-10-25 01:22:08 +02:00
}
2021-03-28 01:37:14 +01:00
template <class Sent, class Received>
void CANFeedc0de<Sent, Received>::send(const Sent& in)
2020-10-25 01:22:08 +02:00
{
2021-03-28 01:37:14 +01:00
sent = in;
feedc0de_fcs.reset(((uint8_t*)&sent) + 2, sizeof(sent) - 4);
2020-10-25 01:22:08 +02:00
}
2021-03-28 01:37:14 +01:00
template <class Sent, class Received>
bool CANFeedc0de<Sent, Received>::get(Received& out)
2020-10-25 01:22:08 +02:00
{
if (!feedc0de_fcr.transfer_finished())
return false;
2021-03-28 01:37:14 +01:00
out = received;
feedc0de_fcr.reset(((uint8_t*)&received) + 2, sizeof(received) - 4);
2020-10-25 01:22:08 +02:00
return true;
}
2021-03-28 01:37:14 +01:00
template <class Sent, class Received>
bool CANFeedc0de<Sent, Received>::handle_frame(uint16_t id, uint8_t* frame, uint8_t len)
2020-10-25 01:22:08 +02:00
{
2021-03-28 01:37:14 +01:00
if (id == fcs_rx_can_id)
2020-10-25 01:22:08 +02:00
{
feedc0de_fcs.handle_frame(frame, len);
2021-03-28 01:37:14 +01:00
return true;
}
else if (id == fcr_rx_can_id)
{
2020-10-25 01:22:08 +02:00
feedc0de_fcr.handle_frame(frame, len);
2021-03-28 01:37:14 +01:00
return true;
}
return false;
}
#ifdef CAN_FEEDCODE_STW
template class CANFeedc0de<Command, Feedback>;
extern "C"
{
void can_feedc0de_handle_frame(uint16_t id, uint8_t* frame, uint8_t len)
{
extern CANFeedc0de<Command, Feedback> can_instances[NUM_BOARDS_MAX];
bool handled = false;
for (size_t i = 0; i < NUM_BOARDS_MAX; i++)
{
if (can_instances[i].handle_frame(id, frame, len))
handled = true;
2020-10-25 01:22:08 +02:00
}
2021-03-28 01:37:14 +01:00
if (!handled)
Error_Handler();
}
2020-10-25 01:22:08 +02:00
}
2021-03-28 01:37:14 +01:00
#else
template class CANFeedc0de<Feedback, Command>;
2020-10-25 01:22:08 +02:00
extern "C"
{
void can_feedc0de_handle_frame(uint16_t id, uint8_t* frame, uint8_t len)
{
2021-03-28 01:37:14 +01:00
extern CANFeedc0de<Feedback, Command> can_feedc0de;
if (!can_feedc0de.handle_frame(id, frame, len))
Error_Handler();
2020-10-25 01:22:08 +02:00
}
void can_feedc0de_poll()
{
2021-03-28 01:37:14 +01:00
extern CANFeedc0de<Feedback, Command> can_feedc0de;
2020-10-25 01:22:08 +02:00
can_feedc0de.poll();
}
}
2021-03-28 01:37:14 +01:00
#endif