Penn Electric Racing / Mbed 2 deprecated SystemManagement

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Revision:
6:6a04210a3f4f
Child:
7:5f6e31faa08e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FanPump/FanPump.cpp	Fri Oct 10 20:24:22 2014 +0000
@@ -0,0 +1,106 @@
+#include "mbed.h"
+#include "FanPump.h"
+
+PwmOut pwmPins[PIN_NUM] = { 
+    (P2_0),         // pump
+    (P2_1),         // fan 1
+    (P2_2),         // fan 2
+    (P2_3),         // fan 3
+};
+
+PinStatus pin_status[PIN_NUM];
+CANBuffer *txBuffer;
+
+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].pin = &pwmPins[i];
+        pin_status[i].pin->period_ms(10);
+        pin_status[i].pin->write(0.0);
+        
+        pin_threads[i] = NULL;
+    }  
+
+    txBuffer = can;
+}
+
+// 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)
+{
+    PinStatus *pin_stat = (PinStatus *)arg;
+    unsigned char *cur_duty = &(pin_stat->cur_duty);
+    unsigned char *new_duty = &(pin_stat->new_duty);
+    
+    while(*cur_duty != *new_duty)
+    {
+        if(*new_duty > *cur_duty){
+            *cur_duty += 1;
+            
+            if(*cur_duty > *new_duty)
+                *cur_duty = *new_duty;   
+        } else if(*new_duty < *cur_duty){
+            *cur_duty -= 1;
+            
+            if(*cur_duty < *new_duty)
+                *cur_duty = *new_duty;   
+        }
+        
+        pin_stat->pin->write((*cur_duty)*0.01);
+        
+        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)
+        return;
+    
+    free_pin(fan);
+
+    pin_status[fan].new_duty = duty;
+    pin_threads[fan] = new Thread(ramp_fan, &pin_status[fan]);
+}
+
+void FanPump::shutdown(FanSelect fan){
+    free_pin(fan);
+    
+    pin_status[fan].cur_duty = 0;
+    pin_status[fan].new_duty = 0;
+    pin_status[fan].pin->write(0);
+}
+
+void FanPump::shutdown_all(){
+    for(int i = 0; i < PIN_NUM; i++)
+        FanPump::shutdown((FanSelect)i);    
+}
+
+void FanPump::free_pin(FanSelect fan){
+    if(pin_threads[fan] != NULL){
+        pin_threads[fan]->terminate();
+        free(pin_threads[fan]);    
+    }    
+}
+
+void update_fans(void const *arg){
+    char data[4] = {0};
+    while(1){
+        for(int i = 0; i < PIN_NUM; i++)
+        {
+            data[i] = pin_status[i].cur_duty;
+        }
+        
+        CANMessage txMessage(TX_FAN_ID, data, 4);
+        txBuffer->txWrite(txMessage);
+        
+        Thread::wait(100);  // 10 Hz update    
+    }    
+}
+
+void FanPump::start_update()
+{
+    Thread update_thread(update_fans);
+}
\ No newline at end of file