Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
FanPump/FanPump.cpp@12:e0adb697fcdb, 2014-10-21 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
