Skip to content

Commit af1eba6

Browse files
authored
Fix/rotor temp msgs (#61)
* created new interface for brake rotor temp sensors * added brake temp to CAN interface * added brake rotor temps to debug prints * updated max and avg temp calcs * added brake rotor temps to ethernet msg * updated CI check stuff * updated hashes * updated CAN lib
1 parent 0300fc9 commit af1eba6

9 files changed

Lines changed: 302 additions & 16 deletions
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#ifndef BRAKEROTORTEMP_H
2+
#define BRAKEROTORTEMP_H
3+
4+
/* External libraries */
5+
#include "FlexCAN_T4.h"
6+
#include "etl/singleton.h"
7+
8+
9+
namespace BrakeRotorTempDefaultParams {
10+
constexpr size_t channels_within_brake_temp_sensor = 16; // TODO: check if our sensors are actually 16 channel
11+
}
12+
13+
struct BrakeTempSensorData_s {
14+
float max_temp;
15+
float avg_temp;
16+
17+
std::array<float, BrakeRotorTempDefaultParams::channels_within_brake_temp_sensor> channel_data;
18+
};
19+
20+
struct BrakeTempData_s {
21+
BrakeTempSensorData_s fl_sensor;
22+
BrakeTempSensorData_s fr_sensor;
23+
};
24+
25+
/**
26+
* Interface to receive messages from the Izze Racing IRTS-60deg-v3 sensor
27+
*/
28+
class BrakeRotorTemp
29+
{
30+
public:
31+
// default empty constructor will init state to zeros
32+
BrakeRotorTemp() {}
33+
34+
/**
35+
* Retrieves the latest data that has been sent from the sensors
36+
* @return the latest temp data
37+
*/
38+
BrakeTempData_s getBrakeRotorTempData() const;
39+
40+
/**
41+
* CAN receive function to parse the new CAN msg and update internal state
42+
* Called by VCF's recv switch
43+
* @param msg the CAN msg to parse
44+
*/
45+
void receiveBrakeRotorTempData(const CAN_message_t &msg);
46+
47+
private:
48+
BrakeTempData_s _temp_data;
49+
50+
void _updateCalculatedValues(bool FR);
51+
};
52+
53+
using BrakeRotorTempInstance = etl::singleton<BrakeRotorTemp>;
54+
55+
#endif // BRAKEROTORTEMP_H

lib/interfaces/include/DashboardInterface.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@ class DashboardInterface
5252
DashInputState_s get_dashboard_outputs();
5353

5454
// Stores outputs
55-
DashInputState_s DashboardInterface::get_dashboard_stored_state();
55+
DashInputState_s get_dashboard_stored_state();
5656

5757
/**
5858
* Syncs stored outputs with last read outputs.
5959
* Used to store previous state of buttons to determine if they are clicked or not.
6060
* In other words, to find the falling edge.
6161
*/
62-
void DashboardInterface::sync_dashboard_stored_state();
62+
void sync_dashboard_stored_state();
6363

6464
// Receiving
6565
void receive_ACU_OK(const CAN_message_t &can_msg);

lib/interfaces/include/VCFCANInterfaceImpl.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "DashboardInterface.h"
1313
#include "ACUInterface.h"
1414
#include "VCRInterface.h"
15+
#include "BrakeRotorTemp.h"
1516

1617
#include "SharedFirmwareTypes.h"
1718

@@ -27,14 +28,16 @@ using FrontAuxCAN_t = FlexCAN_T4<CAN2, RX_SIZE_256, TX_SIZE_16>;
2728

2829
/* Interfaces accessible to this one */
2930
struct CANInterfaces {
30-
explicit CANInterfaces(DashboardInterface &dash_int, ACUInterface &acu_int, VCRInterface &vcr_int)
31+
explicit CANInterfaces(DashboardInterface &dash_int, ACUInterface &acu_int, VCRInterface &vcr_int, BrakeRotorTemp &brake_rotor_temp_int)
3132
: dash_interface(dash_int),
3233
acu_interface(acu_int),
33-
vcr_interface(vcr_int) {}
34+
vcr_interface(vcr_int),
35+
brake_rotor_temp_interface(brake_rotor_temp_int) {}
3436

3537
DashboardInterface &dash_interface;
3638
ACUInterface &acu_interface;
3739
VCRInterface &vcr_interface;
40+
BrakeRotorTemp &brake_rotor_temp_interface;
3841
};
3942
using CANInterfacesInstance = etl::singleton<CANInterfaces>;
4043

lib/interfaces/include/VCFEthernetInterface.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "ADCInterface.h"
88
#include "DashboardInterface.h"
99
#include "PedalsSystem.h"
10+
#include "BrakeRotorTemp.h"
1011
#include "SteeringSystem.h"
1112

1213
namespace VCFEthernetInterface
@@ -18,7 +19,11 @@ namespace VCFEthernetInterface
1819
* @return A populated instance of the outgoing protoc struct.
1920
*/
2021
// hytech_msgs_VCFData_s make_vcf_data_msg(VCFData_s &shared_state);
21-
hytech_msgs_VCFData_s make_vcf_data_msg(ADCInterface &ADCInterfaceInstance, DashboardInterface &dashInstance, PedalsSystem &pedalsInstance, SteeringSystem &steeringInstance);
22+
hytech_msgs_VCFData_s make_vcf_data_msg(ADCInterface &ADCInterfaceInstance,
23+
DashboardInterface &dashInstance,
24+
PedalsSystem &pedalsInstance,
25+
SteeringSystem &steeringInstance,
26+
BrakeRotorTemp &brakeRotorTempInstance);
2227

2328
/**
2429
* Function to take a populated protoc struct from VCR and update the VCF state. This is ONLY critical
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
#include "BrakeRotorTemp.h"
2+
3+
#include "hytech.h"
4+
5+
BrakeTempData_s BrakeRotorTemp::getBrakeRotorTempData() const {
6+
return _temp_data;
7+
}
8+
9+
void BrakeRotorTemp::receiveBrakeRotorTempData(const CAN_message_t &msg) {
10+
switch (msg.id) {
11+
case FL_BRAKE_ROTOR_TEMP_CH1_CH4_CANID:
12+
{
13+
// unpack the msg
14+
FL_BRAKE_ROTOR_TEMP_CH1_CH4_t unpacked_msg;
15+
Unpack_FL_BRAKE_ROTOR_TEMP_CH1_CH4_hytech(&unpacked_msg, msg.buf, msg.len); // NOLINT array decay to pointer
16+
17+
// copy data over to interface data
18+
std::get<0>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_1_ro_fromS(unpacked_msg.brake_temp_channel_1_ro);
19+
std::get<1>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_2_ro_fromS(unpacked_msg.brake_temp_channel_2_ro);
20+
std::get<2>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_3_ro_fromS(unpacked_msg.brake_temp_channel_3_ro);
21+
std::get<3>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_4_ro_fromS(unpacked_msg.brake_temp_channel_4_ro);
22+
23+
// update FL outputs
24+
_updateCalculatedValues(false);
25+
break;
26+
}
27+
28+
case FL_BRAKE_ROTOR_TEMP_CH5_CH8_CANID:
29+
{
30+
// unpack the msg
31+
FL_BRAKE_ROTOR_TEMP_CH5_CH8_t unpacked_msg;
32+
Unpack_FL_BRAKE_ROTOR_TEMP_CH5_CH8_hytech(&unpacked_msg, msg.buf, msg.len); // NOLINT array decay to pointer
33+
34+
// copy data over to interface data
35+
std::get<4>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_5_ro_fromS(unpacked_msg.brake_temp_channel_5_ro);
36+
std::get<5>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_6_ro_fromS(unpacked_msg.brake_temp_channel_6_ro);
37+
std::get<6>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_7_ro_fromS(unpacked_msg.brake_temp_channel_7_ro);
38+
std::get<7>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_8_ro_fromS(unpacked_msg.brake_temp_channel_8_ro);
39+
40+
// update FL outputs
41+
_updateCalculatedValues(false);
42+
break;
43+
}
44+
45+
case FL_BRAKE_ROTOR_TEMP_CH9_CH12_CANID:
46+
{
47+
// unpack the msg
48+
FL_BRAKE_ROTOR_TEMP_CH9_CH12_t unpacked_msg;
49+
Unpack_FL_BRAKE_ROTOR_TEMP_CH9_CH12_hytech(&unpacked_msg, msg.buf, msg.len); // NOLINT array decay to pointer
50+
51+
// copy data over to interface data
52+
std::get<8>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_9_ro_fromS(unpacked_msg.brake_temp_channel_9_ro);
53+
std::get<9>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_10_ro_fromS(unpacked_msg.brake_temp_channel_10_ro);
54+
std::get<10>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_11_ro_fromS(unpacked_msg.brake_temp_channel_11_ro);
55+
std::get<11>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_12_ro_fromS(unpacked_msg.brake_temp_channel_12_ro);
56+
57+
// update FL outputs
58+
_updateCalculatedValues(false);
59+
break;
60+
}
61+
62+
case FL_BRAKE_ROTOR_TEMP_CH13_CH16_CANID:
63+
{
64+
// unpack the msg
65+
FL_BRAKE_ROTOR_TEMP_CH13_CH16_t unpacked_msg;
66+
Unpack_FL_BRAKE_ROTOR_TEMP_CH13_CH16_hytech(&unpacked_msg, msg.buf, msg.len); // NOLINT array decay to pointer
67+
68+
// copy data over to interface data
69+
std::get<12>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_13_ro_fromS(unpacked_msg.brake_temp_channel_13_ro);
70+
std::get<13>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_14_ro_fromS(unpacked_msg.brake_temp_channel_14_ro);
71+
std::get<14>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_15_ro_fromS(unpacked_msg.brake_temp_channel_15_ro);
72+
std::get<15>(_temp_data.fl_sensor.channel_data) = HYTECH_brake_temp_channel_16_ro_fromS(unpacked_msg.brake_temp_channel_16_ro);
73+
74+
// update FL outputs
75+
_updateCalculatedValues(false);
76+
break;
77+
}
78+
79+
case FR_BRAKE_ROTOR_TEMP_CH1_CH4_CANID:
80+
{
81+
// unpack the msg
82+
FR_BRAKE_ROTOR_TEMP_CH1_CH4_t unpacked_msg;
83+
Unpack_FR_BRAKE_ROTOR_TEMP_CH1_CH4_hytech(&unpacked_msg, msg.buf, msg.len); // NOLINT array decay to pointer
84+
85+
// copy data over to interface data
86+
std::get<0>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_1_ro_fromS(unpacked_msg.brake_temp_channel_1_ro);
87+
std::get<1>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_2_ro_fromS(unpacked_msg.brake_temp_channel_2_ro);
88+
std::get<2>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_3_ro_fromS(unpacked_msg.brake_temp_channel_3_ro);
89+
std::get<3>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_4_ro_fromS(unpacked_msg.brake_temp_channel_4_ro);
90+
91+
// update FR outputs
92+
_updateCalculatedValues(true);
93+
break;
94+
}
95+
96+
case FR_BRAKE_ROTOR_TEMP_CH5_CH8_CANID:
97+
{
98+
// unpack the msg
99+
FR_BRAKE_ROTOR_TEMP_CH5_CH8_t unpacked_msg;
100+
Unpack_FR_BRAKE_ROTOR_TEMP_CH5_CH8_hytech(&unpacked_msg, msg.buf, msg.len); // NOLINT array decay to pointer
101+
102+
// copy data over to interface data
103+
std::get<4>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_5_ro_fromS(unpacked_msg.brake_temp_channel_5_ro);
104+
std::get<5>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_6_ro_fromS(unpacked_msg.brake_temp_channel_6_ro);
105+
std::get<6>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_7_ro_fromS(unpacked_msg.brake_temp_channel_7_ro);
106+
std::get<7>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_8_ro_fromS(unpacked_msg.brake_temp_channel_8_ro);
107+
108+
// update FR outputs
109+
_updateCalculatedValues(true);
110+
break;
111+
}
112+
113+
case FR_BRAKE_ROTOR_TEMP_CH9_CH12_CANID:
114+
{
115+
// unpack the msg
116+
FR_BRAKE_ROTOR_TEMP_CH9_CH12_t unpacked_msg;
117+
Unpack_FR_BRAKE_ROTOR_TEMP_CH9_CH12_hytech(&unpacked_msg, msg.buf, msg.len); // NOLINT array decay to pointer
118+
119+
// copy data over to interface data
120+
std::get<8>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_9_ro_fromS(unpacked_msg.brake_temp_channel_9_ro);
121+
std::get<9>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_10_ro_fromS(unpacked_msg.brake_temp_channel_10_ro);
122+
std::get<10>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_11_ro_fromS(unpacked_msg.brake_temp_channel_11_ro);
123+
std::get<11>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_12_ro_fromS(unpacked_msg.brake_temp_channel_12_ro);
124+
125+
// update FR outputs
126+
_updateCalculatedValues(true);
127+
break;
128+
}
129+
130+
case FR_BRAKE_ROTOR_TEMP_CH13_CH16_CANID:
131+
{
132+
// unpack the msg
133+
FR_BRAKE_ROTOR_TEMP_CH13_CH16_t unpacked_msg;
134+
Unpack_FR_BRAKE_ROTOR_TEMP_CH13_CH16_hytech(&unpacked_msg, msg.buf, msg.len); // NOLINT array decay to pointer
135+
136+
// copy data over to interface data
137+
std::get<12>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_13_ro_fromS(unpacked_msg.brake_temp_channel_13_ro);
138+
std::get<13>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_14_ro_fromS(unpacked_msg.brake_temp_channel_14_ro);
139+
std::get<14>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_15_ro_fromS(unpacked_msg.brake_temp_channel_15_ro);
140+
std::get<15>(_temp_data.fr_sensor.channel_data) = HYTECH_brake_temp_channel_16_ro_fromS(unpacked_msg.brake_temp_channel_16_ro);
141+
142+
// update FR outputs
143+
_updateCalculatedValues(true);
144+
break;
145+
}
146+
147+
default:
148+
break;
149+
}
150+
}
151+
152+
/**
153+
* Helper method to update the calculated values of max and avg temps for each sensor after new data is
154+
* received. Will only update for the specified sensor.
155+
* @param sensor corresponds to which sensor was updated. FL = 0, FR = 1
156+
*/
157+
void BrakeRotorTemp::_updateCalculatedValues(bool FR) {
158+
if (FR) { // check if FR needs to be updated
159+
auto begin_iterator = _temp_data.fr_sensor.channel_data.begin();
160+
auto end_iterator = _temp_data.fr_sensor.channel_data.end();
161+
162+
// update maximum value
163+
_temp_data.fr_sensor.max_temp = *std::max_element(begin_iterator, end_iterator);
164+
165+
// update avg value
166+
float sum = std::accumulate(begin_iterator, end_iterator, 0.0f); // find sum
167+
_temp_data.fr_sensor.avg_temp = sum / static_cast<float>(BrakeRotorTempDefaultParams::channels_within_brake_temp_sensor);
168+
} else { // otherwise update FL
169+
auto begin_iterator = _temp_data.fl_sensor.channel_data.begin();
170+
auto end_iterator = _temp_data.fl_sensor.channel_data.end();
171+
172+
// update maximum value
173+
_temp_data.fl_sensor.max_temp = *std::max_element(begin_iterator, end_iterator);
174+
175+
// update avg value
176+
float sum = std::accumulate(begin_iterator, end_iterator, 0.0f); // find sum
177+
_temp_data.fl_sensor.avg_temp = sum / static_cast<float>(BrakeRotorTempDefaultParams::channels_within_brake_temp_sensor);
178+
}
179+
}

lib/interfaces/src/VCFCANInterfaceImpl.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace VCFCANInterfaceImpl {
1111

1212
void on_faux_can_recv(const CAN_message_t &msg)
1313
{
14-
VCFCANInterfaceInstance::instance().TELEM_CAN.write(msg); //immediately forward onto telem can to view data
14+
// VCFCANInterfaceInstance::instance().TELEM_CAN.write(msg); //immediately forward onto telem can to view data
1515
uint8_t buf[sizeof(CAN_message_t)];
1616
memmove(buf, &msg, sizeof(msg)); // NOLINT (memory operations are fine)
1717
VCFCANInterfaceInstance::instance().front_aux_can_rx_buffer.push_back(buf, sizeof(CAN_message_t));
@@ -61,6 +61,18 @@ namespace VCFCANInterfaceImpl {
6161
interfaces.vcr_interface.receive_inverter_status_4(msg);
6262
break;
6363
}
64+
case FL_BRAKE_ROTOR_SENSOR_TEMP_CANID:
65+
case FL_BRAKE_ROTOR_TEMP_CH1_CH4_CANID:
66+
case FL_BRAKE_ROTOR_TEMP_CH5_CH8_CANID:
67+
case FL_BRAKE_ROTOR_TEMP_CH9_CH12_CANID:
68+
case FL_BRAKE_ROTOR_TEMP_CH13_CH16_CANID:
69+
case FR_BRAKE_ROTOR_SENSOR_TEMP_CANID:
70+
case FR_BRAKE_ROTOR_TEMP_CH1_CH4_CANID:
71+
case FR_BRAKE_ROTOR_TEMP_CH5_CH8_CANID:
72+
case FR_BRAKE_ROTOR_TEMP_CH9_CH12_CANID:
73+
case FR_BRAKE_ROTOR_TEMP_CH13_CH16_CANID:
74+
interfaces.brake_rotor_temp_interface.receiveBrakeRotorTempData(msg);
75+
break;
6476
default:
6577
break;
6678
}

lib/interfaces/src/VCFEthernetInterface.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include "hytech_msgs_version.h"
55
#include "device_fw_version.h"
66

7-
hytech_msgs_VCFData_s VCFEthernetInterface::make_vcf_data_msg(ADCInterface &ADCInterfaceInstance, DashboardInterface &dashInstance, PedalsSystem &pedalsInstance, SteeringSystem &steeringInstance)
7+
hytech_msgs_VCFData_s VCFEthernetInterface::make_vcf_data_msg(ADCInterface &ADCInterfaceInstance, DashboardInterface &dashInstance, PedalsSystem &pedalsInstance, SteeringSystem &steeringInstance, BrakeRotorTemp &brakeRotorTempInstance)
88
{
99
hytech_msgs_VCFData_s out;
1010

@@ -18,6 +18,7 @@ hytech_msgs_VCFData_s VCFEthernetInterface::make_vcf_data_msg(ADCInterface &ADCI
1818
out.has_vcf_ethernet_link_data = true;
1919
out.has_vcf_shutdown_data = true;
2020
out.has_brake_pressure_data = true;
21+
out.has_brake_rotor_temp_data = true;
2122

2223
// Load cells
2324
out.front_loadcell_data.FL_loadcell_analog = static_cast<uint32_t>(ADCInterfaceInstance.get_filtered_FL_load_cell());
@@ -81,6 +82,12 @@ hytech_msgs_VCFData_s VCFEthernetInterface::make_vcf_data_msg(ADCInterface &ADCI
8182
out.brake_pressure_data.front_brake_pressure = ADCInterfaceInstance.get_brake_pressure_front().conversion;
8283
out.brake_pressure_data.rear_brake_pressure = ADCInterfaceInstance.get_brake_pressure_rear().conversion;
8384

85+
// Brake rotor temps
86+
out.brake_rotor_temp_data.fl_max_brake_rotor_temp = brakeRotorTempInstance.getBrakeRotorTempData().fl_sensor.max_temp;
87+
out.brake_rotor_temp_data.fl_avg_brake_rotor_temp = brakeRotorTempInstance.getBrakeRotorTempData().fl_sensor.avg_temp;
88+
out.brake_rotor_temp_data.fr_max_brake_rotor_temp = brakeRotorTempInstance.getBrakeRotorTempData().fr_sensor.max_temp;
89+
out.brake_rotor_temp_data.fr_avg_brake_rotor_temp = brakeRotorTempInstance.getBrakeRotorTempData().fr_sensor.avg_temp;
90+
8491
// Shutdown Senses
8592
out.vcf_shutdown_data.d_inertia_switch_out_read = ADCInterfaceInstance.shdn_d().conversion;
8693
out.vcf_shutdown_data.d_inertia_switch = ADCInterfaceInstance.shdn_d().conversion > SHDN_HIGH_THRESHOLD ? true : false;

platformio.ini

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
[common]
77
lib_deps_shared =
88
nanopb/Nanopb@0.4.91
9-
https://github.com/hytech-racing/shared_firmware_systems.git
10-
https://github.com/hytech-racing/shared_firmware_types.git#d9818df40287f21524de7e4b8558ced2023bd705
9+
https://github.com/hytech-racing/shared_firmware_systems.git#af96a631bd76ac4da2084c6fa4faa62ca1bac9d1
10+
https://github.com/hytech-racing/shared_firmware_types.git#956ce41b93d93975a56d33aa3abd7efac7706533
1111
https://github.com/hytech-racing/HT_SCHED#c13cff762c59dd82a8c273e3e98fd1a80622656d
12-
https://github.com/hytech-racing/HT_proto/releases/download/2026-04-19T22_02_36/hytech_msgs_pb_lib.tar.gz
13-
https://github.com/hytech-racing/HT_CAN/releases/download/251/can_lib.tar.gz
14-
12+
https://github.com/hytech-racing/HT_proto/releases/download/2026-05-07T16_36_28/hytech_msgs_pb_lib.tar.gz
13+
https://github.com/hytech-racing/HT_CAN/releases/download/254/can_lib.tar.gz
1514
etlcpp/Embedded Template Library
1615

1716
; Teensy41 Environment. This environment is the primary environment for uploading code to the car.
@@ -52,7 +51,7 @@ lib_deps =
5251
${common.lib_deps_shared}
5352
arkhipenko/TaskScheduler@^3.8.5
5453
https://github.com/ssilverman/QNEthernet#v0.26.0
55-
https://github.com/hytech-racing/shared_firmware_interfaces.git
54+
https://github.com/hytech-racing/shared_firmware_interfaces.git#d9f195a0e5640cd99411deb97c960edb7b455659
5655
blemasle/MCP23017@^2.0.0
5756
https://github.com/adafruit/Adafruit_NeoPixel.git
5857
https://github.com/KSU-MS/pio-git-hash-gen#7998b5b3f8a2464209b0e73338717998bcf511ee

0 commit comments

Comments
 (0)