44#include < FlexCAN_T4.h>
55#include < hytech.h>
66#include < etl/delegate.h>
7+ #include < stdint.h>
8+ #include < InverterInterface.h>
9+ #include < MessageQueueDefine.h>
10+
11+ /* Recieve Buffers */
12+ extern CANBufferType CAN1_rxBuffer;
13+ extern CANBufferType CAN2_rxBuffer;
14+ extern CANBufferType CAN3_rxBuffer;
15+
16+ /* Transfer Buffers */
17+ extern CANBufferType CAN1_txBuffer;
18+ extern CANBufferType CAN2_txBuffer;
19+ extern CANBufferType CAN3_txBuffer;
20+
21+ /* *
22+ * Struct holding the interfaces processed by the ring buffer
23+ */
24+
25+ struct CANInterfaces
26+ {
27+ InverterInterface front_left_inv;
28+ InverterInterface front_right_inv;
29+ InverterInterface back_left_inv;
30+ InverterInterface back_right_inv;
31+ };
732
8- template <uint32_t ... can_ids>
9- class HytechCANInterface {
10- public:
11-
12- HytechCANInterface () { }
13-
14- /* *
15- * Registers CAN id to the handlers delegate
16- */
17- template <uint32_t can_id>
18- void register_handler (void (callback)(CAN_message_t &msg))
19- {
20- if constexpr (((can_id == can_ids) || ...)) {
21- handlers[can_id] = callback;
22- } else {
23- static_assert (((can_id == can_ids) || ...), " CAN id not registered." );
24- }
25- }
26-
27- /* *
28- * Dispatches CAN messages from the specified buffer
29- * (Should be called in a loop)
30- */
31- template <typename bufferType>
32- void dispatch_buffer (bufferType &rx_buffer)
33- {
34- while (rx_buffer.available ())
35- {
36- CAN_message_t recvd_msg;
37- uint8_t buf[sizeof (CAN_message_t)];
38- rx_buffer.pop_front (buf, sizeof (CAN_message_t));
39- memmove (&recvd_msg, buf, sizeof (recvd_msg));
40- dispatch_msg (recvd_msg.id );
41- }
42- }
43-
44- /* *
45- * Sending CAN messages
46- * (needs to be called in loop)
47- * */
48- template <typename bufferType>
49- void send_all_CAN_msgs (bufferType &buffer, FlexCAN_T4_Base *can_interface)
33+ /* * Methods called on can recieve */
34+ void on_can1_recieve (const CAN_message_t &msg);
35+
36+ void on_can2_recieve (const CAN_message_t &msg);
37+
38+ void on_can3_recieve (const CAN_message_t &msg);
39+
40+ /* *
41+ * Recieving CAN messages
42+ * (needs to be called in a loop)
43+ */
44+ template <typename BufferType>
45+ void process_ring_buffer (BufferType &rx_buffer, CANInterfaces interfaces) {
46+ while (rx_buffer.available ())
47+ {
48+ CAN_message_t recvd_msg;
49+ uint8_t buf[sizeof (CAN_message_t)];
50+ rx_buffer.pop_front (buf, sizeof (CAN_message_t));
51+ memmove (&recvd_msg, buf, sizeof (recvd_msg));
52+ switch (recvd_msg.id )
5053 {
51- CAN_message_t msg;
52- while (buffer.available ())
53- {
54- CAN_message_t msg;
55- uint8_t buf[sizeof (CAN_message_t)];
56- buffer.pop_front (buf, sizeof (CAN_message_t));
57- memmove (&msg, buf, sizeof (msg));
58- can_interface->write (msg);
59- }
60- }
61-
62- /* *
63- * Recieve Buffers
64- */
54+ // FL Inverter
55+ case (MCI1_STATUS_CANID):
56+ interfaces.front_left_inv .recieve_MCI_STATUS (recvd_msg);
57+ break ;
58+
59+ case (MCI1_TEMPS_CANID):
60+ interfaces.front_left_inv .recieve_MCI_TEMPS (recvd_msg);
61+ break ;
62+
63+ case (MCI1_DYNAMICS_CANID):
64+ interfaces.front_left_inv .recieve_MCI_DYNAMICS (recvd_msg);
65+ break ;
66+
67+ case (MCI1_POWER_CANID):
68+ interfaces.front_left_inv .recieve_MCI_POWER (recvd_msg);
69+ break ;
70+
71+ case (MCI1_FEEDBACK_CANID):
72+ interfaces.front_left_inv .recieve_MCI_FEEDBACK (recvd_msg);
73+
74+ // FR inverter
75+ case (MCI2_STATUS_CANID):
76+ interfaces.front_right_inv .recieve_MCI_STATUS (recvd_msg);
77+ break ;
78+
79+ case (MCI2_TEMPS_CANID):
80+ interfaces.front_right_inv .recieve_MCI_TEMPS (recvd_msg);
81+ break ;
82+
83+ case (MCI2_DYNAMICS_CANID):
84+ interfaces.front_right_inv .recieve_MCI_DYNAMICS (recvd_msg);
85+ break ;
86+
87+ case (MCI2_POWER_CANID):
88+ interfaces.front_right_inv .recieve_MCI_POWER (recvd_msg);
89+ break ;
90+
91+ case (MCI2_FEEDBACK_CANID):
92+ interfaces.front_right_inv .recieve_MCI_FEEDBACK (recvd_msg);
93+
94+ // RL Inverter
95+ case (MCI3_STATUS_CANID):
96+ interfaces.back_left_inv .recieve_MCI_STATUS (recvd_msg);
97+ break ;
98+
99+ case (MCI3_TEMPS_CANID):
100+ interfaces.back_left_inv .recieve_MCI_TEMPS (recvd_msg);
101+ break ;
102+
103+ case (MCI3_DYNAMICS_CANID):
104+ interfaces.back_left_inv .recieve_MCI_DYNAMICS (recvd_msg);
105+ break ;
106+
107+ case (MCI3_POWER_CANID):
108+ interfaces.back_left_inv .recieve_MCI_POWER (recvd_msg);
109+ break ;
110+
111+ case (MCI3_FEEDBACK_CANID):
112+ interfaces.back_left_inv .recieve_MCI_FEEDBACK (recvd_msg);
113+
114+ // RR Inverter
115+ case (MCI4_STATUS_CANID):
116+ interfaces.back_right_inv .recieve_MCI_STATUS (recvd_msg);
117+ break ;
118+
119+ case (MCI4_TEMPS_CANID):
120+ interfaces.back_right_inv .recieve_MCI_TEMPS (recvd_msg);
121+ break ;
122+
123+ case (MCI4_DYNAMICS_CANID):
124+ interfaces.back_right_inv .recieve_MCI_DYNAMICS (recvd_msg);
125+ break ;
126+
127+ case (MCI4_POWER_CANID):
128+ interfaces.back_right_inv .recieve_MCI_POWER (recvd_msg);
129+ break ;
130+
131+ case (MCI4_FEEDBACK_CANID):
132+ interfaces.back_right_inv .recieve_MCI_FEEDBACK (recvd_msg);
65133
66- /* Recieve buffer for CAN 1 */
67- Circular_Buffer<uint8_t , (uint32_t )16 , sizeof (CAN_message_t)> CAN1_rxBuffer;
68-
69- /* Recieve buffer for CAN 2 */
70- Circular_Buffer<uint8_t , (uint32_t )16 , sizeof (CAN_message_t)> CAN2_rxBuffer;
71-
72- /* Recieve buffer for CAN 3 */
73- Circular_Buffer<uint8_t , (uint32_t )16 , sizeof (CAN_message_t)> CAN3_rxBuffer;
74-
75- /* *
76- * Transfer buffers
77- */
78-
79- /* Transfer buffer for CAN 1 */
80- Circular_Buffer<uint8_t , (uint32_t )16 , sizeof (CAN_message_t)> CAN1_txBuffer;
81-
82- /* Transfer buffer for CAN 2 */
83- Circular_Buffer<uint8_t , (uint32_t )16 , sizeof (CAN_message_t)> CAN2_txBuffer;
84-
85- /* Transfer buffer for CAN 3 */
86- Circular_Buffer<uint8_t , (uint32_t )16 , sizeof (CAN_message_t)> CAN3_txBuffer;
87-
88- private:
89-
90- /* *
91- * Tries to dispatch CAN message out to the correct handler
92- * if there are more than 0 CAN ids
93- */
94- void dispatch_msg (CAN_message_t &msg)
95- {
96- if constexpr (sizeof ...(can_ids) > 0 ) {
97- (void )((msg.id == can_ids && handlers[msg.id ](msg)) || ...);
98- }
99134 }
100-
101- /* *
102- * Stores recieve callbacks
103- */
104- etl::delegate<void (CAN_message_t &msg)> handlers[sizeof ...(can_ids)] = {};
105-
106- };
135+
136+ }
137+ }
138+
139+ /* *
140+ * Sending CAN messages
141+ * (needs to be called in loop)
142+ * */
143+ template <typename bufferType>
144+ void send_all_CAN_msgs (bufferType &tx_buffer, FlexCAN_T4_Base *can_interface)
145+ {
146+ CAN_message_t msg;
147+ while (tx_buffer.available ())
148+ {
149+ CAN_message_t msg;
150+ uint8_t buf[sizeof (CAN_message_t)];
151+ tx_buffer.pop_front (buf, sizeof (CAN_message_t));
152+ memmove (&msg, buf, sizeof (msg));
153+ can_interface->write (msg);
154+ }
155+ }
107156
108157#endif /* HYTECHCANINTERFACE */
0 commit comments