![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Level 2 Project Range Device
Dependencies: N5110 SDFileSystem SRF02 TMP102 mbed
Fork of Ranger by
main.cpp
- Committer:
- el15pjt
- Date:
- 2016-04-15
- Revision:
- 6:b464a8a94d91
- Parent:
- 5:083d484e95a1
- Child:
- 7:14cfb0df30e6
File content as of revision 6:b464a8a94d91:
/* Philip Thompsonn EL15PJT Embedded System Project EL2645 */ #include "mbed.h" #include "SRF02.h" #include "N5110.h" #define LOW 0 #define HIGH 1 #define METRIC 1 #define IMPERIAL 0 DigitalOut rr_led (PTA1); DigitalOut a_led (PTC2); DigitalOut gg_led(PTB23); PwmOut buzzer(PTA2); // Ranger object SRF02 srf02(I2C_SDA,I2C_SCL); //N5110 Object VCC, SCE,RST, D/C, MOSI,SCLK, LED N5110 lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3); Ticker ticker; Ticker ticker_srf02; Ticker ticker_tone; Timeout buzzoff; // K64F on-board LEDs DigitalOut r_led(LED_RED); DigitalOut g_led(LED_GREEN); DigitalOut b_led(LED_BLUE); // K64F on-board switches InterruptIn sw1(SW2); InterruptIn sw2(SW3); volatile int g_timer_flag_led = 0; volatile int g_timer_flag_srf02 = 0; volatile int g_timer_flag_tone = 0; volatile int g_sw1_flag = 0; volatile int g_sw2_flag = 0; int r1 = 3; int r2 = 20; int r3 = 40; int r4 = 60; int r5 = 80; int r6 = 100; int r7 = 120; int subpage; int page; int offset = 0; int alert; int distance; float bright = 1; char units = METRIC; // struct for state struct Alertlevel { char srr_led; // output value char sa_led; // time in state char sgg_led; // array of next states char frr_led; char fa_led; char fgg_led; float toneon; float toneoff; }; typedef const struct Alertlevel STyp; STyp Alertlevel[8] = { {LOW,LOW,LOW,LOW,LOW,LOW,0,1}, // no output {LOW,LOW,LOW,LOW,LOW,HIGH,0.05,1}, //flash green {LOW,LOW,HIGH,LOW,LOW,LOW,0.1,1}, //steady green {LOW,LOW,HIGH,LOW,HIGH,LOW,0.2,0.5}, //flash amber {LOW,HIGH,HIGH,LOW,LOW,LOW,0.55,0.25}, //steady amber {LOW,HIGH,HIGH,HIGH,LOW,LOW,0.8,0.1}, //flash red {HIGH,HIGH,HIGH,LOW,LOW,LOW,1,1.05},// steady red {LOW,LOW,LOW,HIGH,HIGH,HIGH,1,0.05} // all flash }; void lcdoutput(); void timer_isr_led(); // timed interuprt void timer_isr_srf02(); void timer_isr_tone(); void backlight(); void init_K64F(); // set up board void sw2_isr(); void sw1_isr(); void setalert(); void setleds(); void setbuzzer(); void nobuzz(); void menu(); void submenu(); int main() { lcd.init(); init_K64F(); ticker.attach(&timer_isr_led,0.35); ticker_srf02.attach(&timer_isr_srf02,0.02); ticker_tone.attach(&timer_isr_tone,Alertlevel[alert].toneoff); sw1.fall(&sw1_isr); sw2.fall(&sw2_isr); while(1) { if (g_sw1_flag) { g_sw1_flag = 0; page = 0; subpage = 0; lcd.clear(); menu(); } if (g_timer_flag_srf02) { g_timer_flag_srf02 = 0; // if it has, clear the flag if (units == METRIC) { distance = srf02.getDistanceCm(); } else { distance = srf02.getDistannceInch(); } distance = distance-offset; } setalert(); lcdoutput(); // setbuzzer(); setleds(); sleep(); } } //Set up board switches and LEDS void init_K64F() { //on-board LEDs are active-low, so set pin high to turn them off. r_led = 1; g_led = 1; b_led = 1; // since the on-board switches have external pull-ups, we should disable the internal pull-down // resistors that are enabled by default using InterruptIn sw2.mode(PullNone); sw1.mode(PullNone); } void lcdoutput() { int length; int length1; char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) char buffer1[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) int length2; char buffer2[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) int length3; char buffer3[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) if (alert == 0) { lcd.clear(); length1 = sprintf(buffer1,"**PATH CLEAR**",bright); lcd.printString(buffer1,0,0); lcd.refresh(); } else { lcd.clear(); if (units == METRIC) { length = sprintf(buffer,"%i Cm",distance); length1 = sprintf(buffer1,"****RANGE!****"); length2 = sprintf(buffer2,"***DISTANCE***"); length3 = sprintf(buffer3,"Alert = %i",alert); } else { length = sprintf(buffer,"%i Inches",distance); length1 = sprintf(buffer1,"****RANGE!****"); length2 = sprintf(buffer2,"***DISTANCE***"); } lcd.printString(buffer,20,3); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); float i = r7/84; float distbar = distance*i; //drawRect(int x0,int y0,int width,int height,int fill); lcd.drawRect(0,38,distbar,7,1); lcd.refresh(); } } void setalert() { if (distance >= r6 && distance < r7) { // r6 150 and r7 200 alert = 1; //flash green } else if (distance >= r5 && distance < r6) { // r5 90 and r6 150 alert = 2; //steady green } else if (distance >= r4 && distance < r5) { // r4 60 and r5 90 alert = 3; //flashing amber } else if (distance >= r3 && distance < r4) { // r3 40 and r4 60 alert = 4; //steady amber } else if ( distance > r2 && distance < r3) { // r2 20 and r3 40 alert = 5; //flashing red } else if (distance > 1 && distance <= r2) { //r1 3 and r2 20 alert = 6; //steady red } else if (distance <=1) { alert = 7; //all flashing } else { alert = 0; //no output } } void setleds() { // If statments to determin the output of each LED if (Alertlevel[alert].frr_led and Alertlevel[alert].fgg_led and Alertlevel[alert].fa_led == HIGH) { if (g_timer_flag_led) { g_timer_flag_led = 0; // if it has, clear the flag rr_led = !rr_led; gg_led = !gg_led; a_led = !a_led; } } else if(Alertlevel[alert].fa_led == HIGH) { if (g_timer_flag_led) { g_timer_flag_led = 0; // if it has, clear the flag a_led = !a_led; } } else if (Alertlevel[alert].frr_led == HIGH) { if (g_timer_flag_led) { g_timer_flag_led = 0; // if it has, clear the flag rr_led = !rr_led; } } else if(Alertlevel[alert].fgg_led == HIGH) { if (g_timer_flag_led) { g_timer_flag_led = 0; // if it has, clear the flag gg_led = !gg_led; } } else { rr_led = Alertlevel[alert].srr_led; a_led = Alertlevel[alert].sa_led; gg_led = Alertlevel[alert].sgg_led; } } /* void setbuzzer() { if (g_timer_flag_tone) { g_timer_flag_tone = 0; buzzer.period (1/1000); buzzer=0.5; buzzoff.attach(&nobuzz,Alertlevel[alert].toneon); } }*/ void nobuzz() { buzzer = 0.0; } void backlight () { if (bright == 1.0) { bright = 0; } else { bright += 0.2; } lcd.setBrightness(bright); } void sw2_isr() { g_sw2_flag = 1; // set flag in ISR } void sw1_isr() { g_sw1_flag = 1; // set flag in ISR } void timer_isr_led() { g_timer_flag_led = 1; // set flag in ISR } void timer_isr_srf02() { g_timer_flag_srf02 = 1; // set flag in ISR } void timer_isr_tone() { g_timer_flag_tone = 1; } void menu() { int length2; int length1; int length3; int length4; char buffer2[14]; char buffer3[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) char buffer1[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) char buffer4[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14 while(1) { if (g_sw1_flag) { g_sw1_flag = 0; page++; lcd.clear(); } switch (page) { case 0: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag backlight(); lcd.clear(); } else { int lightbar = bright*84; length2 = sprintf(buffer2,"*****MENU*****"); length1 = sprintf(buffer1,"BACKLIGHT"); length3 = sprintf(buffer3,"%.0f%%",bright*100); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer3,0,2); lcd.drawRect(0,38,lightbar,7,1); lcd.refresh(); } break; case 1: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (offset == 20) { offset = 0; } else { offset += 1; } } else { length2 = sprintf(buffer2,"*****MENU*****"); length1 = sprintf(buffer1,"OFFSET"); length3 = sprintf(buffer3,"%i",offset); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer3,0,2); lcd.refresh(); } break; case 2: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (units == METRIC) { units = IMPERIAL; } else { units = METRIC; } } if (units == METRIC) { length3 = sprintf(buffer3,"METRIC"); } else { length3 = sprintf(buffer3,"IMPERIAL"); } length2 = sprintf(buffer2,"*****MENU*****"); length1 = sprintf(buffer1,"UNITS"); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer3,0,2); break; case 3: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag submenu(); } length2 = sprintf(buffer3,"*****MENU*****"); length3 = sprintf(buffer1,"RANGE"); length3 = sprintf(buffer2,"PARAMETERS"); lcd.printString(buffer3,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer2,0,2); break; default: lcd.clear(); return; } } lcd.refresh(); } void submenu() { int length2; int length1; int length3; int length4; char buffer2[14]; char buffer3[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) char buffer1[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) char buffer4[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14 while(1) { if (g_sw1_flag) { g_sw1_flag = 0; subpage++; } switch (subpage) { case 0: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r2 == r3) { r2 = 1; } else { r2 = r2+1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); length4 = sprintf(buffer4,"1Cm to %iCm",r2); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); break; case 1: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r3 == r4) { r3 = r2; } else { r3 += 1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); length3 = sprintf(buffer4,"%iCm to %iCm",r2,r3); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); break; case 2: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r4 == r5) { r4 = r3; } else { r4 += 1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); length3 = sprintf(buffer4,"%iCm to %iCm",r3,r4); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); break; case 3: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r5 == r6) { r5 = r4; } else { r5 += 1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); length3 = sprintf(buffer4,"%iCm to %iCm",r4,r5); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); break; case 4: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r6 == r7) { r6 = r5; } else { r6 += 1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); length3 = sprintf(buffer4,"%iCm to %iCm",r5,r6); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); break; case 5: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r7 == 300) { r7 = r6; } else { r7 += 1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); length3 = sprintf(buffer4,"%iCm to %iCm",r6,r7); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); break; default: lcd.clear(); return; } } }