System Management code
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
Revision 12:e0adb697fcdb, committed 2014-10-21
- Comitter:
- martydd3
- Date:
- Tue Oct 21 23:44:15 2014 +0000
- Parent:
- 11:1d086618dd18
- Child:
- 13:fbd9b3f5a07c
- Commit message:
- Added Error update thread, changed CAN message IDs
Changed in this revision
--- a/DC_DC/DC_DC.cpp Sun Oct 19 22:50:30 2014 +0000 +++ b/DC_DC/DC_DC.cpp Tue Oct 21 23:44:15 2014 +0000 @@ -28,10 +28,10 @@ } void update_dcdc(const void *arg){ - char data[4] = {0}; + char data[1] = {0}; while(1){ data[0] = status; - CANMessage txMessage(TX_DC_DC_ID, data, 4); + CANMessage txMessage(TX_DC_DC_ID, data, 1); tx_DC_Buffer->txWrite(txMessage); Thread::wait(100); //10 Hz update
--- a/DC_DC/DC_DC.h Sun Oct 19 22:50:30 2014 +0000 +++ b/DC_DC/DC_DC.h Tue Oct 21 23:44:15 2014 +0000 @@ -5,8 +5,8 @@ #include "FanPump.h" #include "rtos.h" -const int TX_DC_DC_ID = ((4 << 8) | 5); -const int RX_DC_DC_ID = ((4 << 8) | 14); +const int TX_DC_DC_ID = ((0x4 << 8) | 0x01); +const int RX_DC_DC_ID = ((0x4 << 8) | 0x90); class DC{ public:
--- a/FanPump/FanPump.cpp Sun Oct 19 22:50:30 2014 +0000 +++ b/FanPump/FanPump.cpp Tue Oct 21 23:44:15 2014 +0000 @@ -2,10 +2,10 @@ #include "FanPump.h" PwmOut pwmPins[PIN_NUM] = { - PwmOut(P2_0), // pump - PwmOut(P2_1), // fan 1 - PwmOut(P2_2), // fan 2 - PwmOut(P2_3), // fan 3 + PwmOut(P2_0), // pump 1 + PwmOut(P2_1), // pump 2 + PwmOut(P2_2), // fan 1 + PwmOut(P2_3), // fan 2 }; PinStatus pin_status[PIN_NUM]; @@ -13,8 +13,8 @@ FanPump::FanPump(CANBuffer *can){ for(int i = 0; i < PIN_NUM; i++){ - pin_status[i].cur_duty = 0; - pin_status[i].new_duty = 0; + pin_status[i].cur_duty = 0.0; + pin_status[i].new_duty = 0.0; pin_status[i].pin = &pwmPins[i]; pin_status[i].pin->period_ms(10); @@ -29,72 +29,76 @@ // this is not a member function. For some reason, thread does weird things // with functions in classes. Apparently pointers get messed up when pointing to // a function in a class -void ramp_fan(void const *arg) +void ramp_pin(void const *arg) { PinStatus *pin_stat = (PinStatus *)arg; - unsigned char *cur_duty = &(pin_stat->cur_duty); - unsigned char *new_duty = &(pin_stat->new_duty); + float *cur_duty = &(pin_stat->cur_duty); + float *new_duty = &(pin_stat->new_duty); while(*cur_duty != *new_duty) { if(*new_duty > *cur_duty){ - *cur_duty += 1; + *cur_duty += 1.0; if(*cur_duty > *new_duty) *cur_duty = *new_duty; } else if(*new_duty < *cur_duty){ - *cur_duty -= 1; + *cur_duty -= 1.0; if(*cur_duty < *new_duty) *cur_duty = *new_duty; } - pin_stat->pin->write((*cur_duty)*0.01); + pin_stat->pin->write((*cur_duty)); Thread::wait(5); //1% duty cycle per 0.005 s } } -void FanPump::set_fan(FanSelect fan, unsigned char duty){ - if((int)fan >= PIN_NUM || duty > 100) +void FanPump::set_fan_pump(FanPumpSelect fan_pump, float duty){ + if((int)fan_pump >= PIN_NUM || duty > 100.0) return; - free_pin(fan); + free_pin(fan_pump); - pin_status[fan].new_duty = duty; - pin_threads[fan] = new Thread(ramp_fan, &pin_status[fan]); + pin_status[fan_pump].new_duty = duty; + pin_threads[fan_pump] = new Thread(ramp_pin, &pin_status[fan_pump]); } -void FanPump::shutdown(FanSelect fan){ - free_pin(fan); +void FanPump::shutdown(FanPumpSelect fan_pump){ + free_pin(fan_pump); - pin_status[fan].cur_duty = 0; - pin_status[fan].new_duty = 0; - pin_status[fan].pin->write(0); + pin_status[fan_pump].cur_duty = 0; + pin_status[fan_pump].new_duty = 0; + pin_status[fan_pump].pin->write(0); } void FanPump::shutdown_all(){ for(int i = 0; i < PIN_NUM; i++) - FanPump::shutdown((FanSelect)i); + FanPump::shutdown((FanPumpSelect)i); } -void FanPump::free_pin(FanSelect fan){ - if(pin_threads[fan] != NULL){ - pin_threads[fan]->terminate(); - free(pin_threads[fan]); +void FanPump::free_pin(FanPumpSelect fan_pump){ + if(pin_threads[fan_pump] != NULL){ + pin_threads[fan_pump]->terminate(); + free(pin_threads[fan_pump]); } } -void update_fans(void const *arg){ - char data[4] = {0}; +void update_fans_pumps(void const *arg){ + char data[8] = {0}; while(1){ - for(int i = 0; i < PIN_NUM; i++) - { - data[i] = pin_status[i].cur_duty; - } + memcpy(&pin_status[0].cur_duty, data, sizeof(float)); + memcpy(&pin_status[1].cur_duty, data+4, sizeof(float)); + + CANMessage txPumpMessage(TX_PUMP_ID, data, 8); + tx_Fan_Buffer->txWrite(txPumpMessage); - CANMessage txMessage(TX_FAN_ID, data, 4); - tx_Fan_Buffer->txWrite(txMessage); + memcpy(&pin_status[2].cur_duty, data, sizeof(float)); + memcpy(&pin_status[3].cur_duty, data+4, sizeof(float)); + + CANMessage txFanMessage(TX_FAN_ID, data, 8); + tx_Fan_Buffer->txWrite(txFanMessage); Thread::wait(100); // 10 Hz update } @@ -102,5 +106,5 @@ void FanPump::start_update() { - Thread update_thread(update_fans); + Thread update_thread(update_fans_pumps); } \ No newline at end of file
--- a/FanPump/FanPump.h Sun Oct 19 22:50:30 2014 +0000 +++ b/FanPump/FanPump.h Tue Oct 21 23:44:15 2014 +0000 @@ -6,32 +6,34 @@ #include "CANBuffer.h" typedef enum { - Pump = 0, - Fan1 = 1, - Fan2 = 2, - Fan3 = 3, -} FanSelect; + Pump1 = 0, + Pump2 = 1, + Fan1 = 2, + Fan2 = 3, +} FanPumpSelect; typedef struct{ - unsigned char cur_duty; - unsigned char new_duty; + float cur_duty; + float new_duty; PwmOut *pin; } PinStatus; const int PIN_NUM = 4; -const int TX_FAN_ID = ((4 << 8) | 4); -const int RX_FAN_ID = ((4 << 8) | 12); +const int TX_FAN_ID = ((0x4 << 8) | 0x11); +const int RX_FAN_ID = ((0x4 << 8) | 0x81); +const int TX_PUMP_ID = ((0x4 << 8) | 0x10); +const int RX_PUMP_ID = ((0x4 << 8) | 0x80); class FanPump{ public: FanPump(CANBuffer *can); - void set_fan(FanSelect fan, unsigned char duty); - void shutdown(FanSelect fan); + void set_fan_pump(FanPumpSelect fan, float duty); + void shutdown(FanPumpSelect fan); void shutdown_all(); void start_update(); private: Thread *pin_threads[PIN_NUM]; - void free_pin(FanSelect fan); + void free_pin(FanPumpSelect fan); }; #endif \ No newline at end of file
--- a/Get_IMD/IMD.cpp Sun Oct 19 22:50:30 2014 +0000 +++ b/Get_IMD/IMD.cpp Tue Oct 21 23:44:15 2014 +0000 @@ -35,7 +35,7 @@ */ void update_IMD(void const *arg){ IMD *instance = (IMD *)arg; - char data[4] = {0}; + char data[1] = {0}; while(1){ float freq = instance->frequency(); float duty = instance->duty(); @@ -56,7 +56,7 @@ data[0] = 6; } - CANMessage txMessage(TX_IMD_ID, data, 4); + CANMessage txMessage(TX_IMD_ID, data, 1); tx_IMD_Buffer->txWrite(txMessage); Thread::wait(100); //10 Hz update
--- a/Get_IMD/IMD.h Sun Oct 19 22:50:30 2014 +0000 +++ b/Get_IMD/IMD.h Tue Oct 21 23:44:15 2014 +0000 @@ -7,7 +7,7 @@ #include "CANBuffer.h" #include "rtos.h" -const int TX_IMD_ID = ((4 << 8) | 7); +const int TX_IMD_ID = ((0x4 << 8) | 0x20); class IMD{ public:
--- a/PollSwitch/PollSwitch.cpp Sun Oct 19 22:50:30 2014 +0000 +++ b/PollSwitch/PollSwitch.cpp Tue Oct 21 23:44:15 2014 +0000 @@ -47,12 +47,12 @@ } void update_poll(const void *arg){ - char data[4] = {0}; + char data[2] = {0}; while(1){ converter.i = poll_switches(); data[0] = converter.ch[0]; data[1] = converter.ch[1]; - CANMessage txMessage(TX_POLL_ID, data, 4); + CANMessage txMessage(TX_POLL_ID, data, 2); tx_Poll_Buffer->txWrite(txMessage); Thread::wait(100); //10 Hz update
--- a/PollSwitch/PollSwitch.h Sun Oct 19 22:50:30 2014 +0000 +++ b/PollSwitch/PollSwitch.h Tue Oct 21 23:44:15 2014 +0000 @@ -6,7 +6,7 @@ #include "CANBuffer.h" #include "rtos.h" -const int TX_POLL_ID = ((4 << 8) | 6); +const int TX_POLL_ID = ((4 << 8) | 0x02); class PollSwitch{ public:
--- a/SysMngmt.cpp Sun Oct 19 22:50:30 2014 +0000 +++ b/SysMngmt.cpp Tue Oct 21 23:44:15 2014 +0000 @@ -19,12 +19,15 @@ #include "CurrentMonitor.h" CANBuffer rxBuffer(CAN1, MEDIUM); +Watchdog wdt; XBee250x XbeeTx; Serial pc1(USBTX,USBRX); -char sys_src_id = 4; // source address of system management +char sys_src_id = 0x4; // source address of system management char reset_id = 0x010; +int SYSMGMT_ERROR_ID = 0x400; + extern "C" void mbed_reset(); void soft_reset(){ @@ -32,9 +35,22 @@ mbed_reset(); } +void error_update(void const *arg){ + char data[1] = {0}; + while(1){ + data[0] = 0; + if(wdt.checkFlag()) + { + data[0] |= 0x2; + } + CANMessage txErrorMessage(SYSMGMT_ERROR_ID, data, 1); + rxBuffer.txWrite(txErrorMessage); + Thread::wait(10); + } +} + int main() { CANMessage rx_msg; - Watchdog wdt; wdt.kick(10.0); pc1.baud(115200); @@ -51,6 +67,8 @@ imdMonitor.start_update(); curMonitor.start_update(); + Thread error_thread(error_update); + while(1) { if(rxBuffer.rxRead(rx_msg)){ @@ -63,9 +81,26 @@ char cont_id = (rx_msg.id & 0x00FF); // get bits 7:0 // only control fans of dc_dc converter is on + if(cont_id == RX_PUMP_ID && dc_dc.is_on()) + { + float temp_float; + + memcpy(&rx_msg.data[0], &temp_float, sizeof(float)); + fanPump.set_fan_pump(Pump1, temp_float); + + memcpy(&rx_msg.data[4], &temp_float, sizeof(float)); + fanPump.set_fan_pump(Pump2, temp_float); + } + if(cont_id == RX_FAN_ID && dc_dc.is_on()) { - fanPump.set_fan((FanSelect)rx_msg.data[0], rx_msg.data[1]); + float temp_float; + + memcpy(&rx_msg.data[0], &temp_float, sizeof(float)); + fanPump.set_fan_pump(Fan1, temp_float); + + memcpy(&rx_msg.data[4], &temp_float, sizeof(float)); + fanPump.set_fan_pump(Fan2, temp_float); } if(cont_id == RX_DC_DC_ID){