Penn Electric Racing / Mbed 2 deprecated SystemManagement

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Committer:
martydd3
Date:
Thu Oct 16 15:13:49 2014 +0000
Revision:
9:ada056631cac
Parent:
8:ecf68db484af
Child:
10:db13782f05d9
Imported team watchdog timer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
martydd3 0:e516fcccccda 1 /*
martydd3 0:e516fcccccda 2 Reads CAN Messages and various data inputs, outputs using Xbee radio modules
martydd3 0:e516fcccccda 3
martydd3 0:e516fcccccda 4 Revised Sept 30, 2014: Began analyzing and commenting program, trying to figure out what the hell it does (Martin Deng)
martydd3 0:e516fcccccda 5 */
martydd3 0:e516fcccccda 6
martydd3 6:6a04210a3f4f 7 #include "SysMngmt.h"
martydd3 6:6a04210a3f4f 8 #include "Get_IMD.h"
martydd3 6:6a04210a3f4f 9 #include "PollSwitch.h"
martydd3 6:6a04210a3f4f 10 #include "TemperatureRead.h"
martydd3 6:6a04210a3f4f 11 #include "Store_RTC.h"
martydd3 6:6a04210a3f4f 12 #include "XBee_Lib.h"
martydd3 6:6a04210a3f4f 13 #include "CANBuffer.h"
martydd3 0:e516fcccccda 14
martydd3 6:6a04210a3f4f 15 #include "mbed.h"
martydd3 6:6a04210a3f4f 16 #include "rtos.h"
martydd3 6:6a04210a3f4f 17
martydd3 9:ada056631cac 18 #include "Watchdog.h"
martydd3 6:6a04210a3f4f 19 #include "FanPump.h"
martydd3 6:6a04210a3f4f 20 #include "DC_DC.h"
martydd3 7:5f6e31faa08e 21 #include "PollSwitch.h"
martydd3 8:ecf68db484af 22 #include "IMD.h"
martydd3 0:e516fcccccda 23
martydd3 0:e516fcccccda 24 //Possible problems in IMD coz change of counter
martydd3 0:e516fcccccda 25 //Possible problems in BatteryStatus coz change in library
martydd3 0:e516fcccccda 26
martydd3 0:e516fcccccda 27 /*
martydd3 0:e516fcccccda 28
martydd3 0:e516fcccccda 29 Attach Ticker every 10msec to
martydd3 0:e516fcccccda 30 Get IMD
martydd3 0:e516fcccccda 31 Poll Switches
martydd3 0:e516fcccccda 32 Temperature Read
martydd3 0:e516fcccccda 33 Get Battery State
martydd3 0:e516fcccccda 34 End Ticker Send message through CAN
martydd3 0:e516fcccccda 35
martydd3 0:e516fcccccda 36 CAN interrupt Rx Interrupt
martydd3 0:e516fcccccda 37 Recieve CAN message into a buffer. Return
martydd3 0:e516fcccccda 38 Buffer values(as long as !empty) -> SD Card, Xbee -> remove element
martydd3 0:e516fcccccda 39
martydd3 0:e516fcccccda 40 extern "C" void CAN_IRQHandler(void)
martydd3 0:e516fcccccda 41 {
martydd3 0:e516fcccccda 42 CANMessage Rxmsg;
martydd3 0:e516fcccccda 43 CAN_SysM.read(Rxmsg);
martydd3 0:e516fcccccda 44 RecieveBuffer.add(Rxmsg);
martydd3 0:e516fcccccda 45 }
martydd3 0:e516fcccccda 46
martydd3 1:e02eb179aed3 47 http://developer.mbed.org/users/AjK/notebook/getting-closer-to-the-hardware/
martydd3 1:e02eb179aed3 48
martydd3 1:e02eb179aed3 49 extern "C" means this is linked assuming it's C code
martydd3 1:e02eb179aed3 50 C++ linker appearently adds extra crap with the function arguments keeping functions of this kind from linking properly
martydd3 1:e02eb179aed3 51
martydd3 1:e02eb179aed3 52 Interrupt handler, This is probably linked to the Timer 2 interrupt request somewhere by the libraries
martydd3 2:baeb80c778f7 53
martydd3 0:e516fcccccda 54 extern "C" void TIMER2_IRQHandler(void)
martydd3 0:e516fcccccda 55 {
martydd3 0:e516fcccccda 56 if((LPC_TIM2->IR & 0x01) == 0x01) // if MR0 interrupt
martydd3 0:e516fcccccda 57 {
martydd3 1:e02eb179aed3 58 // This probably shouldn't be here, never have a printf() in an interrupt, locks up the main thread
martydd3 1:e02eb179aed3 59 // printf("Every 1ms\n\r");
martydd3 1:e02eb179aed3 60
martydd3 0:e516fcccccda 61 LPC_TIM2->IR |= 1 << 0; // Clear MR0 interrupt flag
martydd3 0:e516fcccccda 62
martydd3 1:e02eb179aed3 63 // gonna hope all these calculations are correct
martydd3 1:e02eb179aed3 64 // writes to RTC store, but there's no read code here
martydd3 1:e02eb179aed3 65 // 2 misleading things. First, RTC store writes to a general purpose register
martydd3 1:e02eb179aed3 66 // secondly, no code reads from this register in this .cpp, but maybe some other code does
martydd3 1:e02eb179aed3 67
martydd3 0:e516fcccccda 68 Bat_I_Ratio=BatISense.read();
martydd3 0:e516fcccccda 69 BATA_msec=(((Bat_I_Ratio*3.3) - BAT_ISENSE_OFFSET_V)/BAT_ISENSE_INCREMENT);
martydd3 0:e516fcccccda 70 BATmA_Hr+=(BATA_msec*MSEC_HRS);
martydd3 0:e516fcccccda 71 store.write(BATmA_Hr,0);
martydd3 0:e516fcccccda 72
martydd3 0:e516fcccccda 73 DC_I_Ratio=DCSense.read();
martydd3 0:e516fcccccda 74 DCA_msec=(((DC_I_Ratio*3.3) - DC_DC_ISENSE_OFFSET_V)/DC_DC_ISENSE_INCREMENT);
martydd3 0:e516fcccccda 75 store.write(DCA_msec,1);
martydd3 0:e516fcccccda 76
martydd3 0:e516fcccccda 77 LPC_TIM2->TCR |= (1<<1); //Reset Timer1
martydd3 1:e02eb179aed3 78 LPC_TIM2->TCR &= ~(1<<1); //Re Enable Timer1
martydd3 0:e516fcccccda 79 }
martydd3 0:e516fcccccda 80 }
martydd3 0:e516fcccccda 81
martydd3 1:e02eb179aed3 82 Appears to read a whole bunch of DigitalOut pins in void PollSwitch(), store the value in uint16_t Rxpoll,
martydd3 1:e02eb179aed3 83 and write the result to the CAN bus
martydd3 2:baeb80c778f7 84
martydd3 0:e516fcccccda 85 void Poll()
martydd3 0:e516fcccccda 86 {
martydd3 0:e516fcccccda 87 uint16_t Rxpoll;
martydd3 0:e516fcccccda 88 uint16_t recv,temp,i=0; //Test
martydd3 0:e516fcccccda 89 char Result[4]={0};
martydd3 0:e516fcccccda 90 Rxpoll=PollSwitch();
martydd3 0:e516fcccccda 91
martydd3 0:e516fcccccda 92 Result[0]=(char)(Rxpoll&0x00ff);
martydd3 0:e516fcccccda 93 Result[1]=(char)((Rxpoll&0xff00)>>8);
martydd3 0:e516fcccccda 94 CANMessage Txmsg(410,Result,sizeof(Result));
martydd3 0:e516fcccccda 95 CAN_SysM.write(Txmsg);
martydd3 0:e516fcccccda 96
martydd3 0:e516fcccccda 97 //Test
martydd3 0:e516fcccccda 98 recv=(((uint16_t)Txmsg.data[1]<<8) | (0x00ff&(uint16_t)Txmsg.data[0]));
martydd3 0:e516fcccccda 99 printf("Recv:%d\n\r",recv);
martydd3 0:e516fcccccda 100
martydd3 0:e516fcccccda 101 while(i <= 12)
martydd3 0:e516fcccccda 102 {
martydd3 0:e516fcccccda 103 temp=recv;
martydd3 0:e516fcccccda 104 if(((temp & (1 << i))>>i)==1)
martydd3 0:e516fcccccda 105 pc.printf("Switch OFF:%d\n\r",i);
martydd3 0:e516fcccccda 106 ++i;
martydd3 0:e516fcccccda 107 }
martydd3 0:e516fcccccda 108 }
martydd3 0:e516fcccccda 109
martydd3 0:e516fcccccda 110
martydd3 0:e516fcccccda 111 void Temp()
martydd3 0:e516fcccccda 112 {
martydd3 0:e516fcccccda 113 float DC_DC_Temperature, Coolant1_Temperature, Coolant2_Temperature, ChargerFET_Temperature;
martydd3 0:e516fcccccda 114 float Resistance;
martydd3 0:e516fcccccda 115 float Vadc;
martydd3 0:e516fcccccda 116 int i;
martydd3 0:e516fcccccda 117 ftc send, recv;
martydd3 0:e516fcccccda 118 recv.FLOAT=0.0;
martydd3 0:e516fcccccda 119 send.FLOAT=0.0;
martydd3 0:e516fcccccda 120
martydd3 0:e516fcccccda 121 Vadc=DC_DC.read()*VDD;
martydd3 0:e516fcccccda 122 Resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
martydd3 0:e516fcccccda 123 DC_DC_Temperature=ReadTemp(TR_NXFT15XH103FA_Map, Resistance, TABLE_SIZE_NXFT15XH103FA);
martydd3 0:e516fcccccda 124 send.FLOAT=DC_DC_Temperature;
martydd3 0:e516fcccccda 125 CANMessage Txmsg_DC_DC(450,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 126 CAN_SysM.write(Txmsg_DC_DC);
martydd3 0:e516fcccccda 127
martydd3 0:e516fcccccda 128 for(i=0; i<4;i++)
martydd3 0:e516fcccccda 129 recv.C_FLOAT[i]=Txmsg_DC_DC.data[i];
martydd3 0:e516fcccccda 130 pc.printf("DC_DC:%f\n\r",recv.FLOAT);
martydd3 0:e516fcccccda 131
martydd3 0:e516fcccccda 132 Vadc=ChargerFET.read()*VDD;
martydd3 0:e516fcccccda 133 Resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
martydd3 0:e516fcccccda 134 ChargerFET_Temperature=ReadTemp(TR_NXFT15XH103FA_Map, Resistance, TABLE_SIZE_NXFT15XH103FA);
martydd3 0:e516fcccccda 135 send.FLOAT=ChargerFET_Temperature;
martydd3 0:e516fcccccda 136 CANMessage Txmsg_ChargerFET(451,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 137 CAN_SysM.write(Txmsg_ChargerFET);
martydd3 0:e516fcccccda 138
martydd3 0:e516fcccccda 139 for(i=0; i<4;i++)
martydd3 0:e516fcccccda 140 recv.C_FLOAT[i]=Txmsg_ChargerFET.data[i];
martydd3 0:e516fcccccda 141 pc.printf("ChargerFET:%f\n\r",recv.FLOAT);
martydd3 0:e516fcccccda 142
martydd3 0:e516fcccccda 143 Vadc=Coolant1.read()*VDD;
martydd3 0:e516fcccccda 144 Resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
martydd3 0:e516fcccccda 145 Coolant1_Temperature=ReadTemp(TR_NTCLP00E3103H_Map, Resistance, TABLE_SIZE_NTCLP00E3103H);
martydd3 0:e516fcccccda 146 send.FLOAT=Coolant1_Temperature;
martydd3 0:e516fcccccda 147 CANMessage Txmsg_Coolant1(452,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 148 CAN_SysM.write(Txmsg_Coolant1);
martydd3 0:e516fcccccda 149 //Control Fans
martydd3 0:e516fcccccda 150
martydd3 0:e516fcccccda 151 for(i=0; i<4;i++)
martydd3 0:e516fcccccda 152 recv.C_FLOAT[i]=Txmsg_Coolant1.data[i];
martydd3 0:e516fcccccda 153 pc.printf("Coolant1:%f\n\r",recv.FLOAT);
martydd3 0:e516fcccccda 154
martydd3 0:e516fcccccda 155 Vadc=Coolant2.read()*VDD;
martydd3 0:e516fcccccda 156 Resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
martydd3 0:e516fcccccda 157 Coolant2_Temperature=ReadTemp(TR_NTCLP00E3103H_Map, Resistance, TABLE_SIZE_NTCLP00E3103H);
martydd3 0:e516fcccccda 158 send.FLOAT=Coolant2_Temperature;
martydd3 0:e516fcccccda 159 CANMessage Txmsg_Coolant2(453,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 160 CAN_SysM.write(Txmsg_Coolant2);
martydd3 0:e516fcccccda 161 //Control Fans
martydd3 0:e516fcccccda 162
martydd3 0:e516fcccccda 163 for(i=0; i<4;i++)
martydd3 0:e516fcccccda 164 recv.C_FLOAT[i]=Txmsg_Coolant2.data[i];
martydd3 0:e516fcccccda 165 pc.printf("Coolant2:%f\n\r",recv.FLOAT);
martydd3 0:e516fcccccda 166 }
martydd3 0:e516fcccccda 167
martydd3 0:e516fcccccda 168 void IMD()
martydd3 0:e516fcccccda 169 {
martydd3 0:e516fcccccda 170 IMD_Measurement_Output IMD_Signal;
martydd3 0:e516fcccccda 171 char status[4];
martydd3 0:e516fcccccda 172 ftc send;
martydd3 0:e516fcccccda 173
martydd3 0:e516fcccccda 174 IMD_Signal=Get_Measurement();
martydd3 0:e516fcccccda 175 send.FLOAT=IMD_Signal.Frequency;
martydd3 0:e516fcccccda 176 CANMessage Txmsg_Frequency(421,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 177 CAN_SysM.write(Txmsg_Frequency);
martydd3 0:e516fcccccda 178
martydd3 0:e516fcccccda 179 send.FLOAT=IMD_Signal.Duty_Cycle;
martydd3 0:e516fcccccda 180 CANMessage Txmsg_DutyCycle(422,send.C_FLOAT,sizeof(send.C_FLOAT));
martydd3 0:e516fcccccda 181 CAN_SysM.write(Txmsg_DutyCycle);
martydd3 0:e516fcccccda 182
martydd3 0:e516fcccccda 183 status[0]=Result.Encoded_Status;
martydd3 0:e516fcccccda 184 CANMessage Txmsg_Status(423,status,sizeof(status));
martydd3 0:e516fcccccda 185 CAN_SysM.write(Txmsg_Status);
martydd3 0:e516fcccccda 186 }
martydd3 5:9258b685fea6 187 */
martydd3 0:e516fcccccda 188
martydd3 5:9258b685fea6 189 /*
martydd3 0:e516fcccccda 190 Activates a whole crapload of functions and pins on the chip
martydd3 2:baeb80c778f7 191
martydd3 0:e516fcccccda 192 void Init()
martydd3 0:e516fcccccda 193 {
martydd3 2:baeb80c778f7 194
martydd3 0:e516fcccccda 195 Timers to call various functions at different intervals
martydd3 0:e516fcccccda 196 These things behave weirdly when wait(ms) is involved. Probably have to rewrite
martydd3 2:baeb80c778f7 197
martydd3 0:e516fcccccda 198
martydd3 0:e516fcccccda 199 //ReadIMD.attach(&IMD,0.1);
martydd3 0:e516fcccccda 200 //PollSDSwitch.attach(&Poll,0.1);
martydd3 0:e516fcccccda 201
martydd3 0:e516fcccccda 202 //ReadTemperature.attach(&Temp,0.1);
martydd3 0:e516fcccccda 203 //ReadBatteryState.attach(&Battery,0.1);
martydd3 0:e516fcccccda 204
martydd3 2:baeb80c778f7 205
martydd3 0:e516fcccccda 206 Initialize Timer2 for Battery State
martydd3 0:e516fcccccda 207
martydd3 0:e516fcccccda 208 LPC_SC 0x400F C000 (System Control)
martydd3 0:e516fcccccda 209 ->PCONP 0x400F C0C4 (Power Control for Peripherals Register)
martydd3 0:e516fcccccda 210 |= (1<<22) 22 Bit (Timer 2 power/clock control bit)
martydd3 0:e516fcccccda 211
martydd3 0:e516fcccccda 212 ->PCLKSEL1 Peripheral Clock Selection register 1 (controls rate of clock signal supplied to peripheral)
martydd3 0:e516fcccccda 213 |= ((1<<12) | (1<<13)); 12:13 Bits (Peripheral Clock Selection for TIMER2)
martydd3 0:e516fcccccda 214
martydd3 0:e516fcccccda 215 LPC_TIM2 0x4009 0000 (Timer 2)
martydd3 0:e516fcccccda 216 ->TCR 0x4009 0004 (Timer Control Register)
martydd3 0:e516fcccccda 217 |= (1<<0); 0 Bit (Counter Enable)
martydd3 0:e516fcccccda 218
martydd3 0:e516fcccccda 219 ->MR0 0x4009 0018 (Match Register)
martydd3 0:e516fcccccda 220
martydd3 1:e02eb179aed3 221 ->MCR 0x4009 0014 (Match Control Register) What to do when Match Register matches the Timer Counter
martydd3 1:e02eb179aed3 222 |= (1<<0); 0 Bit (Interrupt on MR0, interrupt generated when MR0 matches the value in TC)
martydd3 0:e516fcccccda 223
martydd3 2:baeb80c778f7 224
martydd3 0:e516fcccccda 225 LPC_SC->PCONP |= (1<<22); //PoewerOn Timer/Counter2
martydd3 0:e516fcccccda 226 LPC_SC->PCLKSEL1 |= ((1<<12) | (1<<13)); //Prescale Timer2 CCLK/8
martydd3 0:e516fcccccda 227 LPC_TIM2->TCR |= (1<<0); //Enable Timer2
martydd3 0:e516fcccccda 228 LPC_TIM2->MR0 = 11999; // 1msec
martydd3 0:e516fcccccda 229 LPC_TIM2->MCR |= (1<<0);
martydd3 2:baeb80c778f7 230
martydd3 1:e02eb179aed3 231 Nested Vectored Interrupt Controller (NVIC)
martydd3 1:e02eb179aed3 232
martydd3 1:e02eb179aed3 233 NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
martydd3 1:e02eb179aed3 234 sets priority of an interrupt
martydd3 1:e02eb179aed3 235
martydd3 1:e02eb179aed3 236 IRQn_Type
martydd3 1:e02eb179aed3 237 Interrupt number definitions
martydd3 1:e02eb179aed3 238 Interrupt Request (IRQ)
martydd3 1:e02eb179aed3 239
martydd3 1:e02eb179aed3 240 NVIC_EnableIRQ(IRQn_Type IRQn)
martydd3 1:e02eb179aed3 241 Enable external interrupt (in this case, the TIMER2_IRQHandler(void) function above gets called every time
martydd3 1:e02eb179aed3 242 Timer2 generates an interrupt signal)
martydd3 1:e02eb179aed3 243
martydd3 2:baeb80c778f7 244
martydd3 0:e516fcccccda 245 NVIC_SetPriority(TIMER0_IRQn,200); //IMD Capture Interrupt
martydd3 0:e516fcccccda 246 NVIC_SetPriority(TIMER1_IRQn,200); //IMD 1msec sampling Interrupt
martydd3 0:e516fcccccda 247 NVIC_SetPriority(TIMER2_IRQn,1); //Battery 1msec sampling Interrupt
martydd3 0:e516fcccccda 248 NVIC_SetPriority(TIMER3_IRQn,255); //mbed Timer/Ticker/Wait Interrupt
martydd3 0:e516fcccccda 249 NVIC_SetPriority(CAN_IRQn,2);
martydd3 0:e516fcccccda 250
martydd3 0:e516fcccccda 251 NVIC_EnableIRQ(TIMER2_IRQn); //Enable TIMER2 IRQ
martydd3 0:e516fcccccda 252
martydd3 0:e516fcccccda 253 CAN_SysM.mode(CAN::GlobalTest);
martydd3 2:baeb80c778f7 254
martydd3 2:baeb80c778f7 255
martydd3 0:e516fcccccda 256 //NVIC_EnableIRQ(CAN_IRQn);
martydd3 0:e516fcccccda 257 //NVIC_EnableIRQ(CANActivity_IRQn);
martydd3 0:e516fcccccda 258 }
martydd3 0:e516fcccccda 259
martydd3 2:baeb80c778f7 260
martydd3 0:e516fcccccda 261 Main Loop: Currently reads CANMessages from Can interface (Pins: rd = p30, td = p29)
martydd3 0:e516fcccccda 262 Send CANMessage data through XBee radio transmitters
martydd3 2:baeb80c778f7 263 */
martydd3 2:baeb80c778f7 264
martydd3 2:baeb80c778f7 265
martydd3 2:baeb80c778f7 266 CANBuffer rxBuffer(CAN1, MEDIUM);
martydd3 2:baeb80c778f7 267 XBee250x XbeeTx;
martydd3 6:6a04210a3f4f 268 Serial pc1(USBTX,USBRX);
martydd3 2:baeb80c778f7 269
martydd3 4:e31528929150 270 char sys_src_id = 4; // source address of system management
martydd3 2:baeb80c778f7 271
martydd3 0:e516fcccccda 272 int main() {
martydd3 7:5f6e31faa08e 273 CANMessage rx_msg;
martydd3 7:5f6e31faa08e 274 Watchdog wdt;
martydd3 7:5f6e31faa08e 275
martydd3 6:6a04210a3f4f 276 wdt.kick(10.0);
martydd3 6:6a04210a3f4f 277 pc1.baud(115200);
martydd3 3:1345f882d8f3 278
martydd3 6:6a04210a3f4f 279 FanPump fanPump(&rxBuffer);
martydd3 6:6a04210a3f4f 280 DC dc_dc(&fanPump, &rxBuffer);
martydd3 7:5f6e31faa08e 281 PollSwitch pollSwitch(&rxBuffer);
martydd3 8:ecf68db484af 282 IMD imdMonitor(&rxBuffer);
martydd3 6:6a04210a3f4f 283
martydd3 6:6a04210a3f4f 284 fanPump.start_update();
martydd3 7:5f6e31faa08e 285 dc_dc.start_update();
martydd3 7:5f6e31faa08e 286 pollSwitch.start_update();
martydd3 8:ecf68db484af 287 imdMonitor.start_update();
martydd3 5:9258b685fea6 288
martydd3 0:e516fcccccda 289 while(1)
martydd3 0:e516fcccccda 290 {
martydd3 4:e31528929150 291 if(rxBuffer.rxRead(rx_msg)){
martydd3 4:e31528929150 292 char src_addr = (rx_msg.id & 0x0700) >> 8; // get bits 10:8
martydd3 4:e31528929150 293
martydd3 4:e31528929150 294 if(src_addr == sys_src_id){
martydd3 4:e31528929150 295 char cont_id = (rx_msg.id & 0x00FF); // get bits 7:0
martydd3 2:baeb80c778f7 296
martydd3 4:e31528929150 297 // only control fans of dc_dc converter is on
martydd3 6:6a04210a3f4f 298 if(cont_id == RX_FAN_ID && dc_dc.is_on())
martydd3 4:e31528929150 299 {
martydd3 6:6a04210a3f4f 300 fanPump.set_fan((FanSelect)rx_msg.data[0], rx_msg.data[1]);
martydd3 2:baeb80c778f7 301 }
martydd3 2:baeb80c778f7 302
martydd3 6:6a04210a3f4f 303 if(cont_id == RX_DC_DC_ID){
martydd3 6:6a04210a3f4f 304 dc_dc.set(rx_msg.data[0]);
martydd3 4:e31528929150 305 }
martydd3 4:e31528929150 306 } // check for correct src_addr
martydd3 4:e31528929150 307 } // check CANBuffer
martydd3 6:6a04210a3f4f 308
martydd3 6:6a04210a3f4f 309 wdt.kick();
martydd3 4:e31528929150 310 } // main while loop
martydd3 0:e516fcccccda 311 }