System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Files at this revision

API Documentation at this revision

Comitter:
martydd3
Date:
Sun Oct 05 17:35:20 2014 +0000
Parent:
1:e02eb179aed3
Child:
3:1345f882d8f3
Commit message:
Add preliminary code to control fans and pumps using PWM; To do: Decide CANMessage format for controlling fans and pumps; Debug and test code; Add to toggle DC-DC converter via CAN;

Changed in this revision

CANBuffer.lib Show annotated file Show diff for this revision Revisions of this file
CAN_Filter_LUT.h Show annotated file Show diff for this revision Revisions of this file
LPCDigitalOut.lib Show diff for this revision Revisions of this file
SysManagement_kiran_full.lib Show annotated file Show diff for this revision Revisions of this file
SysMngmt.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed_error.h Show annotated file Show diff for this revision Revisions of this file
--- a/CANBuffer.lib	Sat Oct 04 16:19:45 2014 +0000
+++ b/CANBuffer.lib	Sun Oct 05 17:35:20 2014 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/teams/Penn-Electric-Racing/code/CANBuffer/#6fc28f58f16e
+http://developer.mbed.org/teams/Penn-Electric-Racing/code/CANBuffer/#36e62c1f7039
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CAN_Filter_LUT.h	Sun Oct 05 17:35:20 2014 +0000
@@ -0,0 +1,65 @@
+/*
+Code by Parth Patel, Penn Electric Racing 2014, 9/23/2014
+ 
+This library provides an easy to use, buffered, hardware-filtered CAN interface for
+high performance CAN applications.  Provides automatic reception of messages via CAN RX interrupt
+into a rx ring buffer.  Provides automatic transmission of messages via CAN TX interrupt.
+ 
+@File CAN_Filter_LUT.h: Contains the formatted lookup tables to program the onboard CAN acceptance filters
+ 
+*/
+#ifndef _FILE_CAN_FILTER_LUT_H
+#define _FILE_CAN_FILTER_LUT_H
+ 
+#define STDMASK 0x7FF
+#define EXTMASK 0x1FFFFFFF
+ 
+// These arrays defines the CAN Controller Acceptance Filter Lookup Table.
+// Follow notes below or else the chip's behaviour will be undefined
+// MAX SIZE PERMITTED = 512 32bit ints total across all tables
+// Note that AF_LUT_SEI is 16bit, divide #entries by 2 for this one
+// Note that AF_LUT_EIR is 64bit, multipy #entries by 2 for this one
+ 
+const uint16_t AF_LUT_SEI[] = {
+// !! ID's MUST BE IN ASCENDING ORDER (starting at 0x00) !!
+ 
+// STANDARD EXPLICIT IDs - CAN CONTROLLER 1
+//( 0xID                              & STDMASK),
+ 
+// STANDARD EXPLICIT IDs - CAN CONTROLLER 2
+//( 0xID                              & STDMASK) | 1<<13,
+};
+ 
+const uint32_t AF_LUT_SIR[] = {
+// !! ID's MUST BE IN ASCENDING ORDER (starting at 0x00), NO OVERLAPPING RANGES !!
+ 
+// STANDARD ID RANGES - CAN CONTROLLER 1
+//( 0xLOWERBOUND & STDMASK) << 16         | ( 0xUPPERBOUND & STDMASK),          lower/upperbounds are inclusive
+ 
+// STANDARD ID RANGES - CAN CONTROLLER 2
+//( 0xLOWERBOUND & STDMASK | 1<<13) << 16 | ( 0xUPPERBOUND & STDMASK | 1<<13),  lower/upperbounds are inclusive
+  ( 0x400        & STDMASK | 1<<13) << 16 | ( 0x4FF        & STDMASK | 1<<13),  // Index1
+};
+ 
+const uint32_t AF_LUT_EEI[] = {
+// !! ID's MUST BE IN ASCENDING ORDER (starting at 0x00) !!
+ 
+// EXTENDED EXPLICIT IDs - CAN CONTROLLER 1
+//( 0xID                              & EXTMASK),
+ 
+// EXTENDED EXPLICIT IDs - CAN CONTROLLER 2
+//( 0xID                              & EXTMASK) | 1<<29,
+};
+ 
+const uint64_t AF_LUT_EIR[] = {
+// !! ID's MUST BE IN ASCENDING ORDER (starting at 0x00), NO OVERLAPPING RANGES !!
+ 
+// EXTENDED ID RANGES - CAN CONTROLLER 1
+//( 0xLOWERBOUND & EXTMASK) << 32         | ( 0xUPPERBOUND & EXTMASK), lower/upperbounds are inclusive
+ 
+// EXTENDED ID RANGES - CAN CONTROLLER 2
+//( 0xLOWERBOUND & EXTMASK | 1<<29) << 32 | ( 0xUPPERBOUND & EXTMASK | 1<<29), lower/upperbounds are inclusive
+ 
+};
+ 
+#endif
\ No newline at end of file
--- a/LPCDigitalOut.lib	Sat Oct 04 16:19:45 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://developer.mbed.org/teams/Penn-Electric-Racing/code/LPCDigitalOut/#88059ca2c2d9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SysManagement_kiran_full.lib	Sun Oct 05 17:35:20 2014 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/martydd3/code/SystemManagement/#e02eb179aed3
--- a/SysMngmt.cpp	Sat Oct 04 16:19:45 2014 +0000
+++ b/SysMngmt.cpp	Sun Oct 05 17:35:20 2014 +0000
@@ -12,10 +12,8 @@
 #include"XBee_Lib.h"
 #include"CANBuffer.h"
 
-
-RTCStore store;
-CANBuffer RecieveBuffer(CAN1, MEDIUM);
-XBee250x XbeeTx;
+#include"mbed.h"
+#include"rtos.h"
 
 //Possible problems in IMD coz change of counter
 //Possible problems in BatteryStatus coz change in library
@@ -32,25 +30,21 @@
 CAN interrupt Rx Interrupt
 Recieve CAN message into a buffer. Return
 Buffer values(as long as !empty) -> SD Card, Xbee -> remove element
-*/
 
-/*
 extern "C" void CAN_IRQHandler(void)
 {
     CANMessage Rxmsg;
     CAN_SysM.read(Rxmsg);
     RecieveBuffer.add(Rxmsg);
 }
-*/
 
-/*
     http://developer.mbed.org/users/AjK/notebook/getting-closer-to-the-hardware/
     
     extern "C" means this is linked assuming it's C code
     C++ linker appearently adds extra crap with the function arguments keeping functions of this kind from linking properly
     
     Interrupt handler, This is probably linked to the Timer 2 interrupt request somewhere by the libraries
-*/
+
 extern "C" void TIMER2_IRQHandler(void)
 {
     if((LPC_TIM2->IR & 0x01) == 0x01) // if MR0 interrupt
@@ -79,10 +73,9 @@
     }
 }    
 
-/*
     Appears to read a whole bunch of DigitalOut pins in void PollSwitch(), store the value in uint16_t Rxpoll,
     and write the result to the CAN bus
-*/
+
 void Poll()
 {
     uint16_t Rxpoll;
@@ -200,15 +193,14 @@
     CAN_SysM.write(Txmsg_DCA_msec);
 }    
 
-/*
     Activates a whole crapload of functions and pins on the chip
-*/
+
 void Init()
 {   
-    /* 
+    
         Timers to call various functions at different intervals
         These things behave weirdly when wait(ms) is involved. Probably have to rewrite
-    */
+
     
     //ReadIMD.attach(&IMD,0.1);
     //PollSDSwitch.attach(&Poll,0.1);
@@ -216,7 +208,7 @@
     //ReadTemperature.attach(&Temp,0.1);
     //ReadBatteryState.attach(&Battery,0.1);
     
-    /*
+
         Initialize Timer2 for Battery State
         
         LPC_SC                      0x400F C000 (System Control)
@@ -235,14 +227,13 @@
         ->MCR                       0x4009 0014 (Match Control Register) What to do when Match Register matches the Timer Counter
         |= (1<<0);                  0 Bit (Interrupt on MR0, interrupt generated when MR0 matches the value in TC)
         
-    */
+
     LPC_SC->PCONP       |= (1<<22);                     //PoewerOn Timer/Counter2
     LPC_SC->PCLKSEL1    |= ((1<<12) | (1<<13));         //Prescale Timer2 CCLK/8  
     LPC_TIM2->TCR       |=  (1<<0);                     //Enable Timer2
     LPC_TIM2->MR0       =   11999;                      // 1msec
     LPC_TIM2->MCR       |=  (1<<0);
-    
-    /*
+
         Nested Vectored Interrupt Controller (NVIC)
         
         NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
@@ -256,7 +247,7 @@
             Enable external interrupt (in this case, the TIMER2_IRQHandler(void) function above gets called every time
             Timer2 generates an interrupt signal)
             
-    */
+
     NVIC_SetPriority(TIMER0_IRQn,200);                  //IMD Capture Interrupt
     NVIC_SetPriority(TIMER1_IRQn,200);                  //IMD 1msec sampling Interrupt
     NVIC_SetPriority(TIMER2_IRQn,1);                    //Battery 1msec sampling Interrupt
@@ -266,34 +257,112 @@
     NVIC_EnableIRQ(TIMER2_IRQn);                        //Enable TIMER2 IRQ 
     
     CAN_SysM.mode(CAN::GlobalTest);
+    
+
     //NVIC_EnableIRQ(CAN_IRQn);
     //NVIC_EnableIRQ(CANActivity_IRQn);
 }    
 
-/*
+
     Main Loop: Currently reads CANMessages from Can interface (Pins: rd = p30, td = p29)
     Send CANMessage data through XBee radio transmitters
+*/
+
+
+CANBuffer rxBuffer(CAN1, MEDIUM);
+XBee250x XbeeTx;
+
+int sysCANId = 0;                   // change this later
+
+char fanId = 0;                     // first byte of CANData, last byte states the duty cycle, second-last states which fan to control
+
+Thread *fan_Threads[4] = {NULL, NULL, NULL, NULL};     // Threads currently running on the 4 output pins
+
+/*
+    Pins for Fans and Pumps
+    PUMP_PWM = p2.0
+    FAN1_PWM = p2.1
+    FAN2_PWM = p2.2
+    FAN3_PWM = p2.3
+*/
+
+PwmOut pump_pwm(P2_0);
+PwmOut fan1_pwm(P2_1);
+PwmOut fan2_pwm(P2_2);
+PwmOut fan3_pwm(P2_3);
+
+// duty goes from 0 to 100
+void rampFans(void const *arg){
     
-*/
+    static int fan1_duty = 0;
+    static int fan2_duty = 0;
+    static int fan3_duty = 0;
+    static int pump_duty = 0;
+    
+    int *data = (int *)arg;
+    
+    int duty = data[7];
+    if(duty < 0 || duty > 100)
+        return;
+    
+    int pin_ID = data[6];
+    int *cur_duty;
+    PwmOut *out_pin;
+    
+    switch(pin_ID){
+        case 0: cur_duty = &pump_duty;
+            out_pin = &pump_pwm;
+            break;
+        case 1: cur_duty = &fan1_duty;
+            out_pin = &fan1_pwm;
+            break;
+        case 2: cur_duty = &fan2_duty;
+            out_pin = &fan2_pwm;
+            break;
+        case 3: cur_duty = &fan3_duty;
+            out_pin = &fan3_pwm;
+            break;
+        default:
+            return;
+    }
+    
+    while(*cur_duty != duty){
+        
+        if(duty > *cur_duty){
+            *cur_duty += 10;
+            
+            if(*cur_duty > duty)
+                *cur_duty = duty;   
+        } else if(duty < *cur_duty){
+            *cur_duty -= 10;
+            
+            if(*cur_duty < duty)
+                *cur_duty = duty;   
+        }
+        
+        out_pin->write((*cur_duty)*0.01);
+        
+        Thread::wait(10);
+    }
+}
+
 int main() {
-    CANMessage Rxmsg;    
-    
-    Init();
-    
+    CANMessage rx_msg;    
+
     while(1)
     {
-        if(CAN_SysM.read(Rxmsg))
-            RecieveBuffer.txWrite(Rxmsg);
-        while(RecieveBuffer.rxRead(Rxmsg))
-        {
-           XbeeTx.send(Rxmsg);
-        }    
-        
-        //Poll();
-        //Temp();
-        //Battery();
+        if(rxBuffer.rxRead(rx_msg) && rx_msg.id == sysCANId){
+            if(rx_msg.data[0] == fanId){
+                
+                int pin_id = (int)rx_msg.data[6];
+                
+                if(pin_id < 4 && pin_id >= 0 && fan_Threads[pin_id] != NULL){
+                    fan_Threads[pin_id]->terminate();
+                    free(fan_Threads[pin_id]);
+                }
+                
+                fan_Threads[pin_id] = new Thread(rampFans, rx_msg.data);
+            }
+        }
     }
-    //Temp();
-    //IMD();
-    //Battery();
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Sun Oct 05 17:35:20 2014 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/mbed_official/code/mbed-rtos/#631c0f1008c3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_error.h	Sun Oct 05 17:35:20 2014 +0000
@@ -0,0 +1,70 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef MBED_ERROR_H
+#define MBED_ERROR_H
+
+/** To generate a fatal compile-time error, you can use the pre-processor #error directive.
+ *
+ * @code
+ * #error "That shouldn't have happened!"
+ * @endcode
+ *
+ * If the compiler evaluates this line, it will report the error and stop the compile.
+ *
+ * For example, you could use this to check some user-defined compile-time variables:
+ *
+ * @code
+ * #define NUM_PORTS 7
+ * #if (NUM_PORTS > 4)
+ *     #error "NUM_PORTS must be less than 4"
+ * #endif
+ * @endcode
+ *
+ * Reporting Run-Time Errors:
+ * To generate a fatal run-time error, you can use the mbed error() function.
+ *
+ * @code
+ * error("That shouldn't have happened!");
+ * @endcode
+ *
+ * If the mbed running the program executes this function, it will print the
+ * message via the USB serial port, and then die with the blue lights of death!
+ *
+ * The message can use printf-style formatting, so you can report variables in the
+ * message too. For example, you could use this to check a run-time condition:
+ *
+ * @code
+ * if(x >= 5) {
+ *     error("expected x to be less than 5, but got %d", x);
+ * }
+ * #endcode
+ */
+
+// for some reason, the rtos library can't access mbed_error.h from the mbed library
+// This is a pretty recent bug as of Oct 5, 2014
+// If they fix the bug, remove this file
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void error(const char* format, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file