Level 2 Project Range Device

Dependencies:   N5110 SDFileSystem SRF02 TMP102 mbed

Fork of Ranger by Philip Thompson

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