15 #define PRINT_PERIOD 1000 // period for status output 16 #define LIN_PERIOD 10 // LIN frame every N ms 22 void printStatus(
void);
26 uint8_t CoolFan_RPM = 0;
27 uint8_t CoolFan_RPM_Ack = 0;
28 uint8_t CoolFan_EmAct_Stat = 0;
29 uint8_t CoolFan_RPM_Avg = 0;
30 uint8_t CoolFan_OvrVolt_Stat = 0;
31 uint8_t CoolFan_Voltage_Avg = 0;
32 uint8_t CoolFan_UnderVolt_Stat = 0;
33 uint8_t CoolFan_Current_Avg = 0;
34 uint8_t CoolFan_VoltDerat_Stat = 0;
35 uint8_t CoolFan_cur_Temp = 0;
36 uint8_t CoolFan_TempDerat_Stat = 0;
37 uint8_t CoolFan_Stiff_Stat = 0;
38 uint8_t CoolFan_Blocking_Stat = 0;
39 uint8_t CoolFan_Electr_Err = 0;
40 uint8_t CoolFan_Mech_Err = 0;
41 uint8_t CoolFan_OvrTemp_Err = 0;
42 uint8_t CoolFan_Err_Group_ERR_Stat = 0;
43 uint8_t CoolFan_Err_Group_SNA_Stat = 0;
44 uint8_t CoolFan_Type = 0;
46 uint8_t WakeupStat_CF = 0;
53 pinMode(PIN_TOGGLE, OUTPUT);
56 Serial.begin(115200);
while(!Serial);
63 Tasks_Add((Task) LIN_scheduler, LIN_PERIOD, 0);
64 Tasks_Add((Task) printStatus, PRINT_PERIOD, PRINT_PERIOD);
74 digitalWrite(PIN_TOGGLE, !digitalRead(PIN_TOGGLE));
77 if (Serial.available())
79 uint8_t c = Serial.read();
84 CoolFan_RPM = (uint8_t) max(0, (
int) CoolFan_RPM - 10);
89 CoolFan_RPM = (uint8_t) min(127, (
int) CoolFan_RPM + 10);
100 Serial.print(
"new speed = ");
101 Serial.print(CoolFan_RPM*25);
102 Serial.println(
"rpm");
111 void LIN_scheduler(
void)
113 static uint8_t count = 0;
128 data[0] = CoolFan_RPM & 0x7f;
157 void statusDecode(uint8_t numData, uint8_t *data)
160 CoolFan_RPM_Ack = data[0] & 0x7F;
161 CoolFan_EmAct_Stat = bitRead(data[0],7);
162 CoolFan_RPM_Avg = data[1] & 0x7F;
163 CoolFan_OvrVolt_Stat = bitRead(data[1],7);
164 CoolFan_Voltage_Avg = data[2] & 0x7F;
165 CoolFan_UnderVolt_Stat = bitRead(data[2],7);
166 CoolFan_Current_Avg = data[3] & 0x7F;
167 CoolFan_VoltDerat_Stat = bitRead(data[3],7);
168 CoolFan_cur_Temp = data[4];
169 CoolFan_TempDerat_Stat = bitRead(data[5],0);
170 CoolFan_Stiff_Stat = bitRead(data[5],1);
171 CoolFan_Blocking_Stat = bitRead(data[5],2);
172 CoolFan_Electr_Err = bitRead(data[5],3);
173 CoolFan_Mech_Err = bitRead(data[5],4);
174 CoolFan_OvrTemp_Err = bitRead(data[5],5);
175 CoolFan_Err_Group_ERR_Stat = bitRead(data[5],6);
176 CoolFan_Err_Group_SNA_Stat = bitRead(data[5],7);
177 CoolFan_Type = data[6] & 0x0F;
178 RsErr_CF = bitRead(data[7],5);
179 WakeupStat_CF = (data[7] & 0xC0) >> 6;
186 void printStatus(
void)
191 Serial.print(
"set speed: "); Serial.print(CoolFan_RPM_Ack*25); Serial.println(
"rpm");
192 Serial.print(
"act speed: "); Serial.print(CoolFan_RPM_Avg*25); Serial.println(
"rpm");
193 Serial.print(
"voltage: "); Serial.print(CoolFan_Voltage_Avg*0.2); Serial.println(
"V");
194 Serial.print(
"voltage: "); Serial.print(CoolFan_Current_Avg); Serial.println(
"A");
195 Serial.print(
"voltage: "); Serial.print((
int)CoolFan_cur_Temp-0); Serial.println(
"C");
196 Serial.print(
"blocking: "); Serial.print((
int)CoolFan_Blocking_Stat-0); Serial.println();
202 Serial.print(
"LIN error (0x");
207 Serial.print(
"statemachine ");
210 Serial.print(
"echo ");
213 Serial.print(
"timeout ");
216 Serial.print(
"checksum ");
219 Serial.print(
"misc ");
bool flagRxComplete
flag to indicate that data reception is complete. Must be cleared manually
void begin(uint16_t Baudrate, LIN_version_t Version, bool Background)
setup UART and LIN framework
LIN master emulation library for Serial3.
error in LIN state machine
misc error, should not occur
LIN_error_t receiveSlaveResponse(uint8_t id, uint8_t numData, void(*Rx_handler)(uint8_t, uint8_t *))
receive a slave response frame with callback function
LIN_error_t error
error state. Is latched until cleared
LIN_error_t sendMasterRequest(uint8_t id, uint8_t numData, uint8_t *data)
send a master request frame
LIN_Master_3 LIN_master3
instance of LIN master via Serial3