Skip to content

Commit 6bba319

Browse files
committed
Changed CAN interface and updated inverter inverter interface with new signals
1 parent 3f91ea0 commit 6bba319

File tree

6 files changed

+391
-157
lines changed

6 files changed

+391
-157
lines changed

lib/interfaces/include/HytechCANInterface.h

Lines changed: 145 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -4,105 +4,154 @@
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 */

lib/interfaces/include/InverterInterface.h

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ namespace HTUnits
2222
*/
2323
struct InverterIds_s
2424
{
25-
uint32_t mc_energy_id;
26-
uint32_t mc_status_id;
27-
uint32_t mc_temps_id;
2825
uint32_t mc_setpoint_commands_id;
2926
uint32_t mc_torque_command_id;
3027
};
@@ -55,6 +52,7 @@ struct InverterTorqueCommand_s
5552
**/
5653
struct InverterStatus_s
5754
{
55+
bool new_data : 1;
5856
bool system_ready : 1;
5957
bool error : 1;
6058
bool warning : 1;
@@ -69,26 +67,30 @@ struct InverterStatus_s
6967

7068
struct InverterTemps_s
7169
{
70+
bool new_data : 1;
7271
HTUnits::celcius motor_temp;
7372
HTUnits::celcius inverter_temp;
7473
HTUnits::celcius igbt_temp;
7574
};
7675

7776
struct InverterPower_s
7877
{
78+
bool new_data : 1;
7979
HTUnits::watts active_power;
8080
HTUnits::var reactive_power;
8181
};
8282

8383
struct MotorMechanics_s
8484
{
85+
bool new_data : 1;
8586
HTUnits::watts actual_power;
8687
HTUnits::torque_nm actual_torque;
8788
HTUnits::speed_rpm actual_speed;
8889
};
8990

9091
struct InverterControlParams_s
9192
{
93+
bool new_data : 1;
9294
uint16_t speed_control_kp;
9395
uint16_t speed_control_ki;
9496
uint16_t speed_control_kd;
@@ -103,22 +105,19 @@ struct InverterFeedbackData_s
103105
InverterControlParams_s control_params;
104106
};
105107

108+
/**
109+
* Inverter interface
110+
*/
106111
class InverterInterface
107112
{
108113

109114
public:
110115

111116
InverterInterface(
112117
CANBufferType *msg_output_queue,
113-
uint32_t mc_energy_id,
114-
uint32_t mc_status_id,
115-
uint32_t mc_temps_id,
116118
uint32_t mc_setpoint_commands_id,
117119
uint32_t mc_torque_command_id) : msg_queue_(msg_output_queue)
118120
{
119-
inverter_ids.mc_energy_id = mc_energy_id;
120-
inverter_ids.mc_status_id = mc_status_id;
121-
inverter_ids.mc_temps_id = mc_temps_id;
122121
inverter_ids.mc_setpoint_commands_id = mc_setpoint_commands_id;
123122
inverter_ids.mc_torque_command_id = mc_torque_command_id;
124123
}
@@ -138,6 +137,19 @@ class InverterInterface
138137
uint16_t torque_command
139138
);
140139

140+
// TODO un-public these (they are public for testing)
141+
142+
/* Recieving callbacks */
143+
void recieve_MCI_STATUS(CAN_message_t &can_msg);
144+
145+
void recieve_MCI_TEMPS(CAN_message_t &can_msg);
146+
147+
void recieve_MCI_DYNAMICS(CAN_message_t &can_msg);
148+
149+
void recieve_MCI_POWER(CAN_message_t &can_msg);
150+
151+
void recieve_MCI_FEEDBACK(CAN_message_t &can_msg);
152+
141153

142154
private:
143155

@@ -146,18 +158,18 @@ class InverterInterface
146158
InverterSetpoints_s _inverter_setpoints;
147159
InverterTorqueCommand_s _inverter_torque_command;
148160

149-
InverterStatus_s _inverter_status;
150-
InverterTemps_s _inverter_temps;
151-
InverterPower_s _inverter_power;
152-
InverterControlParams_s _control_params;
161+
// InverterStatus_s _inverter_status;
162+
// InverterTemps_s _inverter_temps;
163+
// InverterPower_s _inverter_power;
164+
// InverterControlParams_s _control_params;
153165
InverterFeedbackData_s _feedback_data;
154166

155-
/* Recieving callbacks */
156-
void recieve_MC_ENERGY(CAN_message_t &can_msg);
157-
158-
void recieve_MC_STATUS(CAN_message_t &can_msg);
159-
160-
void recieve_MC_TEMPS(CAN_message_t &can_msg);
167+
/* Getters */
168+
InverterStatus_s get_status();
169+
InverterTemps_s get_temps();
170+
InverterPower_s get_power();
171+
MotorMechanics_s get_motor_mechanics();
172+
InverterControlParams_s get_control_params();
161173

162174
/* Sending */
163175
template <typename U>

0 commit comments

Comments
 (0)