The Code Repository for the REV0 Steering Wheel.
Dependencies: CANBuffer KS0108_fork mbed-rtos mbed CAN Addresses
Fork of REVO_Updated_Steering by
OldVersion.h
- Committer:
- jayf
- Date:
- 2015-05-30
- Revision:
- 47:5d3c6f85fa29
- Parent:
- 37:c9b9057079d9
File content as of revision 47:5d3c6f85fa29:
/* 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(){ } */