The Code Repository for the REV0 Steering Wheel.

Dependencies:   CANBuffer KS0108_fork mbed-rtos mbed CAN Addresses

Fork of REVO_Updated_Steering by Penn Electric

Revision:
37:c9b9057079d9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OldVersion.h	Thu Jan 29 04:33:10 2015 +0000
@@ -0,0 +1,505 @@
+/*
+Steering.cpp
+#include "Steering.h"
+
+bool NOT_biSWBL_HELD;
+bool NOT_biSWTR_HELD;
+
+void update_display(void const *args){
+    
+    while(true){
+        
+        if(screen_flags[curr_screen] || should_redraw){
+        screen_flags[curr_screen] = 0;
+        should_redraw = false;
+        switch(curr_screen){
+    
+            case HOME_SCREEN:{
+                
+                display.ClearScreen();
+                display.SelectFont(Arial10,BLACK,ReadData);
+                display.GotoXY(37,0);
+                display.PrintString(" Home Screen");
+                
+                printf("Battery Voltage: %d\n\r", vars_list->get_value(PCM_STATE_ID));
+              
+                display.GotoXY(16,16);
+                if(vars_list->get_value(PCM_STATE_ID) == 0){
+                    display.PutString(3, 30, "Drive Status: OFF");
+                }
+                else{
+                    display.PrintString("Drive Status: ON");
+                }
+                break;
+                }
+            
+            case BATTERY_SCREEN:
+            
+                display.ClearScreen();
+                display.SelectF ont(Arial10,BLACK,ReadData);
+                display.GotoXY(33,0);
+                display.PrintString(" Battery Screen");
+                break;
+        
+            default:
+                break;    
+        
+            }
+        }
+        wait(2);   
+    }
+}
+
+void toggle_screen(){
+    should_redraw = true;
+    curr_screen = (curr_screen+1) % NUM_SCREEN; 
+}
+
+void request_status_change(){
+    
+    char drive_status_request;
+    ds_mutex.lock();
+    drive_status_request = !(vars_list->get_value(PCM_STATE_ID));
+
+    ds_mutex.unlock();
+    char * status_string;
+
+    if(drive_status_request){
+        status_string = "ON";
+    }
+    else{
+        status_string = "OFF";
+    }
+
+    CANMessage Txmsg_drive_status_request(0x501,&drive_status_request,1);//Encode Tx messages
+    for(int i = 0; i < 10; i++){
+        CAN_Steering_Buffer.txWrite(Txmsg_drive_status_request);
+    }
+
+    printf("%s\n\r", status_string);
+    return;
+}
+
+void reset()
+{
+    reset_body = 1;
+    CANMessage Txmsg_reset(0x502,&reset_body,1);                        //Encode Tx messages
+    for(int i = 0; i < 10; i++){
+        CAN_Steering_Buffer.txWriteDirect(Txmsg_reset);
+    }
+    NVIC_SystemReset();
+    display.ClearScreen();
+    display.SelectFont(Arial12,BLACK,ReadData);
+    display.GotoXY(16,16);
+    printf("Reset Initiated\n\r");
+
+    return;
+}    
+
+void Init()
+{
+    should_redraw = true;
+    pc.baud(921600);
+    curr_screen = HOME_SCREEN;
+    drive_status = 0;
+    drive_status_request = 1;
+    reset_body = 0;
+    ledstream.write(0);
+    NOT_biSWBL_HELD = true;
+    NOT_biSWTR_HELD = true;
+    
+    vars_list = new variables();//Avoid Heap
+    
+    vars_list->add(PCM_STATE_ID, HOME_SCREEN);
+    vars_list->add(BATTERY_VOLTAGE_ID, BATTERY_SCREEN);
+    vars_list->add(BATTERY_POWER_ID, BATTERY_SCREEN);
+    vars_list->add(BATTERY_CURRENT_ID, BATTERY_SCREEN);
+    
+}
+
+void read_messages(void const *args) {
+    
+    while (true) {
+        
+        CANMessage Rxmsg;
+        if(CAN_Steering_Buffer.rxRead(Rxmsg)){
+            id_node = vars_list->get_node(Rxmsg.id);
+            if(id_node != NULL){
+                if(id_node->value != Rxmsg.data[0]){
+                    screen_flags[id_node->screen] = 1;  
+                }
+                id_node->value = Rxmsg.data[0];
+            }
+        }
+    }
+}
+
+int main(){
+    // Initialize, set all variables.
+    Init();
+    wait(0.1);
+    
+    //Init Display
+    display.GotoXY(10,16);
+    display.SelectFont(Arial_14,BLACK,ReadData);
+    display.PrintString("Penn Electric Racing");
+    CAN_Steering_Buffer.mode(NoAck);
+    
+    wait(0.5);
+     
+     //New thread to read messages.
+    Thread update_thread(read_messages);                                //Prioritise
+        
+    // display the screen.
+    Thread display_thread(update_display);                              //Prioritise
+      
+
+    // Start to read buttons on main thread
+    while(1)
+    {
+       // Thread::wait(100);
+        if(biSWBL.read() && NOT_biSWBL_HELD){
+            request_status_change();
+            NOT_biSWBL_HELD = false;
+        }
+        
+        else if(!biSWBL.read()){
+            NOT_biSWBL_HELD = true;
+        }
+        
+        else{
+            // ignore BiSWBL.read()
+        }
+        
+        if(biSWTR.read() && NOT_biSWTR_HELD){
+            toggle_screen();
+            NOT_biSWTR_HELD = false;
+        }
+        
+        else if(!biSWTR.read()){
+            NOT_biSWTR_HELD = true;
+        }
+        
+        else{
+            // ignore BiSWTR.read()
+        }
+        
+        if(biSWBR.read()){ 
+            reset();
+        }
+    }        
+}
+
+--------------------------------------------------------------------------------------------------------------
+Steering.h
+#ifndef _STEERING_H
+#define _STEERING_H
+
+#include "mbed.h"
+#include "rtos.h"
+#include "KS0108.h"
+
+#include "Arial10.h"
+#include "Arial12.h"
+#include "Arial14.h"
+#include "Comic24.h"
+#include "vivaldi16.h"
+#include "CANBuffer.h"
+#include "variables.h"
+
+
+#include "LPCDigitalIn.h"
+
+#define SWITCH_ID 410
+
+#define BATTERY_VOLTAGE_ID 0x304
+#define BATTERY_POWER_ID 0x306
+#define BATTERY_CURRENT_ID 0x305
+
+#define PCM_STATE_ID 0x201
+
+#define BATTERY_MIN_CELLVOLTAGE_ID 0x301
+#define BATTERY_MAX_CELLVOLTAGE_ID 0x300
+#define BATTERY_AVG_CELLVOLTAGE_ID 0x302
+
+#define BATTERY_MIN_CELLTEMPERATURE_ID 0x30A
+#define BATTERY_MAX_CELLTEMPERATURE_ID 0x309
+#define BATTERY_AVG_CELLTEMPERATURE_ID 0x30B
+#define AMS_BATTERY_STATE 0x30E          // AIRS 7 and 6 // Precharge 3
+
+#define NUM_SCREEN 2
+
+#define HOME_SCREEN 0
+#define BATTERY_SCREEN 1
+
+Serial pc(USBTX,USBRX);
+CANBuffer CAN_Steering_Buffer(CAN1, MEDIUM, p3_26);
+
+
+KS0108 display(p26, p21, p22, p23, p25, p24, p8, p7, p6, p5, p13, p14, p12, p11); 
+//Ticker call_ledstream;
+
+LPCDigitalOut l1(p1_28,1);//    SW2
+LPCDigitalOut l2(p1_26,1);//    SW4
+    
+LPCDigitalOut l3(p1_24,1);//    SW6
+LPCDigitalOut l4(p0_24,1);//    SW8
+
+LPCDigitalOut u1(p1_14,0);//    SW9 
+LPCDigitalOut u2(p1_9,0);//     SW11
+
+LPCDigitalOut u3(p1_4,0);//     SW13
+LPCDigitalOut u4(p1_0,0);//     SW15
+
+AnalogOut ledstream(p18);  // This appears to iniialize the pin as an analog out, and probably defaults to low.  Without this, the LED bar would have a few lights on.
+
+//SW1 - SW3
+LPCDigitalOut boSW1(p1_29,1);
+LPCDigitalIn biSWBR(p1_27, PullDown);     //BRight
+
+LPCDigitalOut boSW5(p1_25,1);
+LPCDigitalIn biSWBL(p1_22, PullDown);     //BLeft
+
+LPCDigitalOut boSW10(p1_10,1);
+LPCDigitalIn biSWTR(p1_8, PullDown);     //TRight
+
+LPCDigitalOut boSW14(p1_1,1);
+LPCDigitalIn biSWTL(p0_25, PullDown);    //TLeft
+
+typedef union convert{
+        float FLOAT;
+        char C_FLOAT[4];
+        }ftc;
+
+char SwitchName[15][13]={
+    "fuse",
+    "ams",
+    "imd",
+    "pcm",
+    "brkp",
+    "lft",
+    "intl",
+    "brko",
+    "ckpt",
+    "rgt",
+    "hvd",
+    "tsms"
+};
+
+int SwitchPosition[13][2]={
+    {0,16},     //fuse
+    {25,16},    //ams
+    {50,16},    //imd
+    {70,16},    //pcm
+    {93,16},    //brkp
+    {117,16},   //lft
+    {0,32},     //intl
+    {17,32},    //brko
+    {42,32},    //ckpt
+    {65,32},    //rgt
+    {81,32},    //hvd
+    {102,32},   //tsm
+    };
+    
+int curr_screen;
+int screen_flags[NUM_SCREEN]; 
+bool should_redraw;
+
+char drive_status;
+char drive_status_request;
+char reset_body;
+
+node * id_node = NULL;
+variables * vars_list;
+
+
+Mutex ds_mutex;
+
+/*
+void read_messages(void const *args) {
+    
+    while (true) {
+        CANMessage Rxmsg;
+     
+        if(CAN_Steering_Buffer.rxRead(Rxmsg))
+            if(Rxmsg.id == PCM_STATE_ID){
+              
+                // Mutex to protex shared variables
+                ds_mutex.lock();
+                drive_status = Rxmsg.data[0];
+                ds_mutex.unlock();
+            }
+            
+            if(Rxmsg.id == BATTERY_POWER_ID)
+            {
+                float power_ratio;
+                ftc rcv;
+                rcv.FLOAT=0.0;
+                
+                for(int i=0; i<4; i++){
+                    rcv.C_FLOAT[i] = Rxmsg.data[i];
+                }
+                power_ratio=rcv.FLOAT/80000;
+                ledstream.write(power_ratio);
+            }
+        }
+    }
+*/
+
+#endif /* STEERING_H */    
+-----------------------------------------------------------------------------------------------------------------------------
+Variables.h
+#include "node.h"
+
+class variables{
+    
+    public:
+    
+        variables();
+        ~variables();
+        void add(int i, int s);
+        int get_screen(int i);
+        char get_value(int i);
+        int set_value(int i, char v);
+        node * get_node(int i);
+        
+    
+        int size;
+        node * head;
+        node * tail;
+
+};
+
+variables::variables(){
+    size = 0;
+    head = NULL;
+    tail = NULL;
+}
+
+variables::~variables(){
+
+    node * curr = head;
+    node * next = head;
+    
+    while(curr != NULL){
+        next = curr->next;
+        delete(curr);
+        curr = next;
+    }
+    
+    head =  NULL;
+    tail = NULL;
+    size = 0;
+}
+
+void variables::add(int i, int s){
+    
+    if(head == NULL){
+        head = new node(i, s);
+        tail = head;
+    }
+    
+    else{
+        tail->next = new node(i,s);
+        tail = tail->next;
+    }
+    size++;
+}
+
+node * variables::get_node(int i){
+
+    node * curr = head;
+    
+    while(curr != NULL){
+        if(curr->id == i){
+            return curr;
+        }
+        else{
+            curr = curr->next;
+        }
+    }
+    return NULL;
+}    
+
+int variables::get_screen(int i){
+
+    node * curr = head;
+    
+    while(curr != NULL){
+        if(curr->id == i){
+            return curr->screen;
+        }
+        else{
+            curr = curr->next;
+        }
+    }
+    return -1;
+}
+
+int variables::set_value(int i, char v){
+
+    node * curr = head;
+    
+    while(curr != NULL){
+        if(curr->id == i){
+            curr->set_val(v);
+            return 0;
+        }
+        else{
+            curr = curr->next;
+        }
+    }
+    return -1;
+}
+
+char variables::get_value(int i){
+
+    node * curr = head;
+    
+    while(curr != NULL){
+        if(curr->id == i){
+            return curr->value;
+        }
+        else{
+            curr = curr->next;
+        }
+    }
+    return 0;
+}
+--------------------------------------------------------------------------------------------------------------
+Node.h
+class node{
+    
+    public:
+    
+        node();
+        node(int id, int screen);
+        void set_val(char v);
+        ~node();
+        
+        int screen;
+        int id;
+        char value;
+        node * next;
+        
+};
+
+node::node(){
+    screen = 0;
+    id = 0;
+    next = NULL;
+}
+
+node::node(int i, int s){
+    id = i;
+    screen = s;
+    next = NULL;
+}
+
+void node::set_val(char v){
+    value = v;
+}
+
+node::~node(){
+}
+*/
\ No newline at end of file