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:
Tue Oct 21 23:44:15 2014 +0000
Revision:
12:e0adb697fcdb
Parent:
7:5f6e31faa08e
Child:
13:fbd9b3f5a07c
Added Error update thread, changed CAN message IDs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
martydd3 6:6a04210a3f4f 1 #include "mbed.h"
martydd3 6:6a04210a3f4f 2 #include "FanPump.h"
martydd3 6:6a04210a3f4f 3
martydd3 6:6a04210a3f4f 4 PwmOut pwmPins[PIN_NUM] = {
martydd3 12:e0adb697fcdb 5 PwmOut(P2_0), // pump 1
martydd3 12:e0adb697fcdb 6 PwmOut(P2_1), // pump 2
martydd3 12:e0adb697fcdb 7 PwmOut(P2_2), // fan 1
martydd3 12:e0adb697fcdb 8 PwmOut(P2_3), // fan 2
martydd3 6:6a04210a3f4f 9 };
martydd3 6:6a04210a3f4f 10
martydd3 6:6a04210a3f4f 11 PinStatus pin_status[PIN_NUM];
martydd3 7:5f6e31faa08e 12 CANBuffer *tx_Fan_Buffer;
martydd3 6:6a04210a3f4f 13
martydd3 6:6a04210a3f4f 14 FanPump::FanPump(CANBuffer *can){
martydd3 6:6a04210a3f4f 15 for(int i = 0; i < PIN_NUM; i++){
martydd3 12:e0adb697fcdb 16 pin_status[i].cur_duty = 0.0;
martydd3 12:e0adb697fcdb 17 pin_status[i].new_duty = 0.0;
martydd3 6:6a04210a3f4f 18
martydd3 6:6a04210a3f4f 19 pin_status[i].pin = &pwmPins[i];
martydd3 6:6a04210a3f4f 20 pin_status[i].pin->period_ms(10);
martydd3 6:6a04210a3f4f 21 pin_status[i].pin->write(0.0);
martydd3 6:6a04210a3f4f 22
martydd3 6:6a04210a3f4f 23 pin_threads[i] = NULL;
martydd3 6:6a04210a3f4f 24 }
martydd3 6:6a04210a3f4f 25
martydd3 7:5f6e31faa08e 26 tx_Fan_Buffer = can;
martydd3 6:6a04210a3f4f 27 }
martydd3 6:6a04210a3f4f 28
martydd3 6:6a04210a3f4f 29 // this is not a member function. For some reason, thread does weird things
martydd3 6:6a04210a3f4f 30 // with functions in classes. Apparently pointers get messed up when pointing to
martydd3 6:6a04210a3f4f 31 // a function in a class
martydd3 12:e0adb697fcdb 32 void ramp_pin(void const *arg)
martydd3 6:6a04210a3f4f 33 {
martydd3 6:6a04210a3f4f 34 PinStatus *pin_stat = (PinStatus *)arg;
martydd3 12:e0adb697fcdb 35 float *cur_duty = &(pin_stat->cur_duty);
martydd3 12:e0adb697fcdb 36 float *new_duty = &(pin_stat->new_duty);
martydd3 6:6a04210a3f4f 37
martydd3 6:6a04210a3f4f 38 while(*cur_duty != *new_duty)
martydd3 6:6a04210a3f4f 39 {
martydd3 6:6a04210a3f4f 40 if(*new_duty > *cur_duty){
martydd3 12:e0adb697fcdb 41 *cur_duty += 1.0;
martydd3 6:6a04210a3f4f 42
martydd3 6:6a04210a3f4f 43 if(*cur_duty > *new_duty)
martydd3 6:6a04210a3f4f 44 *cur_duty = *new_duty;
martydd3 6:6a04210a3f4f 45 } else if(*new_duty < *cur_duty){
martydd3 12:e0adb697fcdb 46 *cur_duty -= 1.0;
martydd3 6:6a04210a3f4f 47
martydd3 6:6a04210a3f4f 48 if(*cur_duty < *new_duty)
martydd3 6:6a04210a3f4f 49 *cur_duty = *new_duty;
martydd3 6:6a04210a3f4f 50 }
martydd3 6:6a04210a3f4f 51
martydd3 12:e0adb697fcdb 52 pin_stat->pin->write((*cur_duty));
martydd3 6:6a04210a3f4f 53
martydd3 6:6a04210a3f4f 54 Thread::wait(5); //1% duty cycle per 0.005 s
martydd3 6:6a04210a3f4f 55 }
martydd3 6:6a04210a3f4f 56 }
martydd3 6:6a04210a3f4f 57
martydd3 12:e0adb697fcdb 58 void FanPump::set_fan_pump(FanPumpSelect fan_pump, float duty){
martydd3 12:e0adb697fcdb 59 if((int)fan_pump >= PIN_NUM || duty > 100.0)
martydd3 6:6a04210a3f4f 60 return;
martydd3 6:6a04210a3f4f 61
martydd3 12:e0adb697fcdb 62 free_pin(fan_pump);
martydd3 6:6a04210a3f4f 63
martydd3 12:e0adb697fcdb 64 pin_status[fan_pump].new_duty = duty;
martydd3 12:e0adb697fcdb 65 pin_threads[fan_pump] = new Thread(ramp_pin, &pin_status[fan_pump]);
martydd3 6:6a04210a3f4f 66 }
martydd3 6:6a04210a3f4f 67
martydd3 12:e0adb697fcdb 68 void FanPump::shutdown(FanPumpSelect fan_pump){
martydd3 12:e0adb697fcdb 69 free_pin(fan_pump);
martydd3 6:6a04210a3f4f 70
martydd3 12:e0adb697fcdb 71 pin_status[fan_pump].cur_duty = 0;
martydd3 12:e0adb697fcdb 72 pin_status[fan_pump].new_duty = 0;
martydd3 12:e0adb697fcdb 73 pin_status[fan_pump].pin->write(0);
martydd3 6:6a04210a3f4f 74 }
martydd3 6:6a04210a3f4f 75
martydd3 6:6a04210a3f4f 76 void FanPump::shutdown_all(){
martydd3 6:6a04210a3f4f 77 for(int i = 0; i < PIN_NUM; i++)
martydd3 12:e0adb697fcdb 78 FanPump::shutdown((FanPumpSelect)i);
martydd3 6:6a04210a3f4f 79 }
martydd3 6:6a04210a3f4f 80
martydd3 12:e0adb697fcdb 81 void FanPump::free_pin(FanPumpSelect fan_pump){
martydd3 12:e0adb697fcdb 82 if(pin_threads[fan_pump] != NULL){
martydd3 12:e0adb697fcdb 83 pin_threads[fan_pump]->terminate();
martydd3 12:e0adb697fcdb 84 free(pin_threads[fan_pump]);
martydd3 6:6a04210a3f4f 85 }
martydd3 6:6a04210a3f4f 86 }
martydd3 6:6a04210a3f4f 87
martydd3 12:e0adb697fcdb 88 void update_fans_pumps(void const *arg){
martydd3 12:e0adb697fcdb 89 char data[8] = {0};
martydd3 6:6a04210a3f4f 90 while(1){
martydd3 12:e0adb697fcdb 91 memcpy(&pin_status[0].cur_duty, data, sizeof(float));
martydd3 12:e0adb697fcdb 92 memcpy(&pin_status[1].cur_duty, data+4, sizeof(float));
martydd3 12:e0adb697fcdb 93
martydd3 12:e0adb697fcdb 94 CANMessage txPumpMessage(TX_PUMP_ID, data, 8);
martydd3 12:e0adb697fcdb 95 tx_Fan_Buffer->txWrite(txPumpMessage);
martydd3 6:6a04210a3f4f 96
martydd3 12:e0adb697fcdb 97 memcpy(&pin_status[2].cur_duty, data, sizeof(float));
martydd3 12:e0adb697fcdb 98 memcpy(&pin_status[3].cur_duty, data+4, sizeof(float));
martydd3 12:e0adb697fcdb 99
martydd3 12:e0adb697fcdb 100 CANMessage txFanMessage(TX_FAN_ID, data, 8);
martydd3 12:e0adb697fcdb 101 tx_Fan_Buffer->txWrite(txFanMessage);
martydd3 6:6a04210a3f4f 102
martydd3 6:6a04210a3f4f 103 Thread::wait(100); // 10 Hz update
martydd3 6:6a04210a3f4f 104 }
martydd3 6:6a04210a3f4f 105 }
martydd3 6:6a04210a3f4f 106
martydd3 6:6a04210a3f4f 107 void FanPump::start_update()
martydd3 6:6a04210a3f4f 108 {
martydd3 12:e0adb697fcdb 109 Thread update_thread(update_fans_pumps);
martydd3 6:6a04210a3f4f 110 }