Level 2 Project Range Device
Dependencies: N5110 SDFileSystem SRF02 TMP102 mbed
Fork of Ranger by
Diff: main.cpp
- Revision:
- 5:083d484e95a1
- Parent:
- 4:673930f04866
- Child:
- 6:b464a8a94d91
--- a/main.cpp Thu Apr 14 14:23:37 2016 +0000 +++ b/main.cpp Fri Apr 15 13:25:32 2016 +0000 @@ -11,7 +11,8 @@ #define LOW 0 #define HIGH 1 - +#define METRIC 1 +#define IMPERIAL 0 DigitalOut rr_led (PTA1); DigitalOut a_led (PTC2); @@ -29,26 +30,36 @@ 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 sw1(SW2); InterruptIn sw2(SW3); -volatile int g_timer_flag = 0; +volatile int g_timer_flag_led = 0; volatile int g_timer_flag_srf02 = 0; -volatile int g_sw2_flag = 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 = 90; +int r6 = 120; +int r7 = 150; + +int subpage; +int page; +int offset = 0; int alert; int distance; float bright = 1; +char units = METRIC; // struct for state struct Alertlevel { @@ -74,44 +85,51 @@ {LOW,LOW,LOW,HIGH,HIGH,HIGH,1,0.05} // all flash }; void lcdoutput(); -void timer_isr(); // timed interuprt +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 sw1_isr(); void setalert(); void setleds(); void setbuzzer(); -void flip(); +void nobuzz(); +void menu(); +void submenu(); int main() { lcd.init(); init_K64F(); - ticker.attach(&timer_isr,0.35); + 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); + sw1.fall(&sw1_isr); sw2.fall(&sw2_isr); while(1) { - if (g_sw2_flag) { - g_sw2_flag = 0; // if it has, clear the flag - backlight(); + if (g_sw1_flag) { + g_sw1_flag = 0; + page = 0; + subpage = 0; + menu(); } + if (g_timer_flag_srf02) { g_timer_flag_srf02 = 0; // if it has, clear the flag - distance = srf02.getDistanceCm(); + if (units == METRIC) { + distance = srf02.getDistanceCm(); + } else { + distance = srf02.getDistannceInch(); + } + distance = distance-offset; } - - + setalert(); lcdoutput(); - setalert(); - - setbuzzer(); + // setbuzzer(); setleds(); sleep(); } @@ -124,12 +142,12 @@ 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); + sw1.mode(PullNone); } + void lcdoutput() { int length; @@ -137,13 +155,24 @@ 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) + if (alert == 0) { + length1 = sprintf(buffer1,"**PATH CLEAR**",bright); + lcd.printString(buffer1,0,0); + } - length = sprintf(buffer,"D = %i Cm",distance); - length1 = sprintf(buffer1,"Bright = %f Cm",bright); + else { + if (units == METRIC) { + length = sprintf(buffer,"D = %i Cm",distance); + length1 = sprintf(buffer1,"****RANGE!****"); + } else { + length = sprintf(buffer,"%i Inches",distance); + length1 = sprintf(buffer1,"****RANGE!****"); + } + } if (length <= 14) { - lcd.printString(buffer,0,0); - lcd.printString(buffer1,0,1); + lcd.printString(buffer,0,1); + lcd.printString(buffer1,0,0); } // draw a line across the display at y = 40 pixels (origin top-left) @@ -156,17 +185,17 @@ void setalert() { - if (distance >= 200 && distance < 250) { + if (distance >= r6 && distance < r7) { // r6 150 and r7 200 alert = 1; //flash green - } else if (distance >= 150 && distance < 200) { + } else if (distance >= r5 && distance < r6) { // r5 90 and r6 150 alert = 2; //steady green - } else if (distance >= 100 && distance < 150) { + } else if (distance >= r4 && distance < r5) { // r4 60 and r5 90 alert = 3; //flashing amber - } else if (distance >= 50 && distance < 100) { + } else if (distance >= r3 && distance < r4) { // r3 40 and r4 60 alert = 4; //steady amber - } else if ( distance > 10 && distance < 50) { + } else if ( distance > r2 && distance < r3) { // r2 20 and r3 40 alert = 5; //flashing red - } else if (distance > 1 && distance <= 10) { + } else if (distance > 1 && distance <= r2) { //r1 3 and r2 20 alert = 6; //steady red } else if (distance <=1) { alert = 7; //all flashing @@ -178,33 +207,49 @@ void setleds() { // If statments to determin the output of each LED - - if (Alertlevel[alert].frr_led == HIGH) { - if (g_timer_flag) { - g_timer_flag = 0; // if it has, clear the flag + 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; } - if (Alertlevel[alert].fa_led == HIGH) { - if (g_timer_flag) { - g_timer_flag = 0; // if it has, clear the flag - a_led = !a_led; - } - } else { - a_led = Alertlevel[alert].sa_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); } +}*/ - if (Alertlevel[alert].fgg_led == HIGH) { - if (g_timer_flag) { - g_timer_flag = 0; // if it has, clear the flag - gg_led = !gg_led; - } - } else { - gg_led = Alertlevel[alert].sgg_led; - } +void nobuzz() +{ + buzzer = 0.0; } void backlight () @@ -218,19 +263,22 @@ lcd.setBrightness(bright); } + + + void sw2_isr() { g_sw2_flag = 1; // set flag in ISR } -/*void sw1_isr() +void sw1_isr() { g_sw1_flag = 1; // set flag in ISR -}*/ +} -void timer_isr() +void timer_isr_led() { - g_timer_flag = 1; // set flag in ISR + g_timer_flag_led = 1; // set flag in ISR } void timer_isr_srf02() @@ -243,17 +291,251 @@ g_timer_flag_tone = 1; } -void setbuzzer() +void menu() { - if (g_timer_flag_tone) { - g_timer_flag_tone = 0; - buzzer.period (1/1000); - buzzer=0.5; - buzzoff.attach(&flip,Alertlevel[alert].toneon); - } - } - - void flip() { - buzzer = 0.0; + 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++; + } + + switch (page) { + case 0: + if (g_sw2_flag) { + g_sw2_flag = 0; // if it has, clear the flag + backlight(); + } + lcd.clear(); + + length2 = sprintf(buffer2,"*****MENU*****"); + length1 = sprintf(buffer1,"BACKLIGHT"); + length3 = sprintf(buffer3,"%f.0",bright); + if (length2 <= 14) { + lcd.printString(buffer2,0,0); + lcd.printString(buffer1,0,1); + lcd.printString(buffer3,0,2); + } + lcd.refresh(); // need to refresh display after setting pixels + 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; + } + } + lcd.clear(); + length2 = sprintf(buffer2,"*****MENU*****"); + length1 = sprintf(buffer1,"OFFSET"); + length3 = sprintf(buffer3,"%i",offset); + if (length2 <= 14) { + lcd.printString(buffer2,0,0); + lcd.printString(buffer1,0,1); + lcd.printString(buffer3,0,2); + } + lcd.refresh(); // need to refresh display after setting pixel + 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; + } + } + lcd.clear(); + if (units == METRIC) { + length3 = sprintf(buffer3,"METRIC"); + } else { + length3 = sprintf(buffer3,"IMPERIAL"); + } + + length2 = sprintf(buffer2,"*****MENU*****"); + length1 = sprintf(buffer1,"UNITS"); + //length3 = sprintf(buffer3,"%i",units); + if (length2 <= 14) { + lcd.printString(buffer2,0,0); + lcd.printString(buffer1,0,1); + lcd.printString(buffer3,0,2); + } + lcd.refresh(); // need to refresh display after setting pixel + 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; + } } +} +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; + } + } +} \ No newline at end of file