Level 2 Project Range Device

Dependencies:   N5110 SDFileSystem SRF02 TMP102 mbed

Fork of Ranger by Philip Thompson

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

Go to the documentation of this file.
00001 
00002 /**
00003 @file main.cpp
00004 @brief Program implementation
00005 */
00006 
00007 #include "main.h"
00008 
00009 int main ()
00010 {
00011     setup();
00012     lcd.init(); // Initiate LCD
00013     int d = 0;
00014     int myarray[5] {999,999,999,999,999}; /// initilised to any possitive integer to prevent random values at start up triggering an alert
00015 
00016     // Load settings from SD Card\\\\\\\\\\
00017     FILE *fp; // file pointer
00018     fp = fopen("/sd/settings.txt", "r");
00019     if (fp == NULL) {  // if it can't open the file then print error message
00020         serial.printf("Error! Unable to open file!\n");
00021     } else {
00022         serial.printf("Reading file....\n");
00023 
00024         while (fscanf(fp, "%f,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,",&bright,&units,&offset,&check_flag,&r1,&r2,&r3,&r4,&r5,&r6,&r7) != EOF) {
00025             serial.printf("%f,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i, \n",bright,units,offset,check_flag,r1,r2,r3,r4,r5,r6,r7);
00026         }
00027         serial.printf("Done.\n");
00028         fclose(fp);  // ensure you close the file after reading
00029     }
00030 
00031     //Startup Screen
00032 
00033     lcd.printString("ELEC 2645",0,0);
00034     lcd.printString("Project Ranger",0,1);
00035     lcd.printString("Phil Thompson",0,2);
00036     lcd.printString("SID 200971914 ",0,3);
00037     wait (3);
00038 
00039 
00040     lcd.setBrightness(bright); //Set brightness of screen on startup from loaded value from SD Card
00041 
00042     // Main while loop of the Ranger
00043     while(1) {
00044         if (g_sw1_flag) { /// Event triggered inturupt to call the menu and reset page numbers
00045             g_sw1_flag = 0;
00046             page = 0;
00047             subpage = 0;
00048             lcd.clear();
00049             menu();
00050         }
00051         if (g_timer_flag_srf02) {
00052             g_timer_flag_srf02 = 0;  // if it has, clear the flag
00053             if (units == 1) { // if units = 1 metric measurment are retrived from SFR02
00054                 distance = srf02.getDistanceCm();
00055                 distance = distance-(offset*c);
00056             } else { //If units = 0 imperial measurments retrived from SFR02
00057                 distance = srf02.getDistannceInch();
00058                 distance = distance -(offset*c);
00059             } // close else breaket
00060         } // close if inteurrupt bracket
00061 
00062 
00063         //Function to average last 5 readings
00064         if (d == 4) {
00065             d = 0;
00066         } else {
00067             d++;
00068         }
00069         myarray[d] = distance;
00070         totaldistance =0;
00071         for (int i = 0; i < 5; i++) {
00072             totaldistance = totaldistance + myarray[i];
00073         }
00074         avgdistance = (totaldistance/5);
00075 
00076 
00077         /*Debugging\\
00078         Uncomment to use button 2 to toggle thru alert levels for debugging and comment out setalert();
00079         serial.printf("TOATAL DISTANCE %i\n", totaldistance);
00080         serial.printf("DISTANCE %i\n", distance);
00081         serial.printf("AVERAGE DISTANCE %f\n", avgdistance);
00082         serial.printf("ARRAY ELEMENT = %i\n", d);
00083         serial.printf("myarray %i\n", myarray[d]);
00084         if (g_sw2_flag) { /// Event triggered inturupt to call the menu and reset page numbers
00085             g_sw2_flag = 0;
00086             if (alert ==8) {
00087                 alert =0;
00088             } else {
00089                 alert++;
00090             }
00091             serial.printf("ALERT LEVEL %i\n", alert);
00092         }*/
00093 
00094 
00095 
00096         setalert();
00097         //serial.printf("ALERT LEVEL %i\n", alert);
00098         lcdoutput();
00099 
00100         if (alert !=0) { // no buzzer needed at alert == 0 path clear
00101             if (buzz_flag == 0) {// flag keeps buzz from being called durig it's off period
00102                 setbuzzer ();
00103             }
00104         }
00105         setleds(); // Function called to set LED outputs
00106         sleep(); // Sleep till nest interupt
00107     }
00108 }
00109 
00110 void setalert()
00111 {
00112     if (avgdistance >= (r6*c) && avgdistance < (r7*c)) {  // r6 150 and r7 200
00113         alert = 1; /// alert 1 avgdistance between preset 150Cm to 200Cm
00114     } else if (avgdistance >= (r5*c) && avgdistance  < (r6*c)) {
00115         alert = 2; /// alert 2 when between preset 90Cm to 150Cm
00116     } else if (avgdistance >= (r4*c) && avgdistance < (r5*c)) {
00117         alert = 3; /// alert 3 when avgdistance between 60Cm to 90Cm
00118     } else if (avgdistance >= (r3*c) && avgdistance < (r4*c)) {
00119         alert = 4; /// alert 4 when avgdistance between 40Cm and 60Cm
00120     } else if (avgdistance >= (r2*c) && avgdistance < (r3*c)) {
00121         alert = 5; ///alert 5 when avgdistance between 20Cm and 40m
00122     } else if (avgdistance >= (r1*c) && avgdistance <= (r2*c)) { //r1 3 and r2 20
00123         alert = 6; ///alert 6 when avgdistance between 1 and 20
00124     } else if (avgdistance <=(r1*c)) {
00125         alert = 7; ///alert 7 when avgdistance below 1Cm
00126         if (check_flag ==0) {
00127             save();
00128         }
00129         check_flag = 1;
00130     } else {
00131         alert = 0; /// alert 0 all else
00132     }
00133 }
00134 void lcdoutput()
00135 {
00136     // if alert == 0 no need to display range path is clear
00137     if (alert == 0) {
00138         lcd.clear();
00139         if (g_timer_flag_standby) {
00140             g_timer_flag_standby = 0;
00141             Traw = tmp102.get_temperature();
00142             standby++;
00143             if (standby >2) {
00144                 standby = 2;
00145             }
00146         }
00147         switch (standby) {
00148             case 0:
00149                 if (check_flag == 1) {
00150                     lcd.printString("COLLISIONCHECK",0,5);
00151                 }
00152                 lcd.printString("**PATH CLEAR**",0,0);
00153                 lcd.refresh();
00154                 break;
00155             case 1:
00156                 if (check_flag == 1) {
00157                     lcd.printString("COLLISIONCHECK",0,5);
00158                 }
00159                 if (units == 0) {
00160                     T = (Traw*1.8000)+32.00;
00161                     sprintf(buffer3,"TEMP = %.2fF",T);
00162                     sprintf(buffer2,"TEMPERATER");
00163                 } else {
00164                     T=Traw;
00165                     sprintf(buffer3,"TEMP = %.2fC",T);
00166                     sprintf(buffer2,"TEMPERATER");
00167                 }
00168                 lcd.printString(buffer3,4,3);
00169                 lcd.printString(buffer2,12,2);
00170                 lcd.refresh();
00171                 break;
00172             case 2:
00173                 if (check_flag == 1) {
00174                     lcd.printString("COLLISIONCHECK",0,5);
00175                 }
00176                 if (units == 0) {
00177                     T = (Traw*1.8000)+32.00;
00178                     sprintf(buffer3,"TEMP = %.2fF",T);
00179                     sprintf(buffer2,"TEMPERATER");
00180                 } else {
00181                     T=Traw;
00182                     sprintf(buffer3,"TEMP = %.2fC",T);
00183                     sprintf(buffer2,"TEMPERATER");
00184                 }
00185                 lcd.printString(buffer3,4,3);
00186                 lcd.printString(buffer2,12,2);
00187                 lcd.refresh();
00188                 lcd.setBrightness(0);
00189                 break;
00190         } //close switch
00191     } else {
00192         //If alert isn't 0 then the distance is to be dispayed alonng with the the distance bar
00193         lcd.setBrightness(bright);
00194         standby = 0;
00195         lcd.clear();
00196         if (units == 1) {
00197             sprintf(buffer2,"%0.2f Cm",avgdistance);
00198         } else {
00199             sprintf(buffer2,"%0.2f In",avgdistance);
00200         }
00201         lcd.printString(buffer2,22,2);
00202         lcd.printString("****RANGE!****",0,0);
00203         lcd.printString("DISTANCE",18,1);
00204         lcd.printString("Menu",0,5);
00205         float h;
00206         h = (r7*c)/84; ///Maps length of bar to largest set range r7
00207         distbar = (avgdistance*h)-2;
00208         //drawRect(int x0,int y0,int width,int height,int fill);
00209         lcd.drawRect(0,29,distbar,7,1); //
00210 //  serial.printf("H = %f, r7 = %i",h,r7);
00211 // serial.printf("distbar %f",distbar);
00212         lcd.refresh();
00213     }
00214 }//close function
00215 
00216 
00217 void setleds()
00218 {
00219     int flash = 0; ///Variable to toggle LEDs high low
00220     if (g_timer_flag_led) {
00221         g_timer_flag_led = 0;
00222         flash = !flash; // if it has, clear the flag
00223     }
00224     if(Alertlevel [alert].fa_led == HIGH) {
00225         a_led = flash;
00226     } else {
00227         a_led = Alertlevel [alert].sa_led;
00228     }
00229     if (Alertlevel [alert].frr_led == HIGH) {
00230         rr_led = flash;
00231     } else {
00232         rr_led = Alertlevel [alert].srr_led;
00233     }
00234     if(Alertlevel [alert].fgg_led == HIGH) {
00235         gg_led = flash;
00236     } else {
00237         gg_led = Alertlevel [alert].sgg_led;
00238     }
00239 }
00240 
00241 void setbuzzer ()
00242 {
00243     /**
00244     control the PWM to drive the buzzer
00245     @param buzzer.period frequncy 1KHz
00246     @param buzzer duty cycle equal on/off max volume
00247     @param Alertlevel[alert].toneon controls how long the tone will last depending on alert
00248     */
00249     buzzer.period (1.0/1000.0);
00250     buzzer = 0.5;
00251     buzzoff.attach(&flip, Alertlevel [alert].toneon);
00252 }
00253 
00254 void flip()
00255 {
00256     buzz_flag = 1;
00257     buzzer = 0.0;
00258     buzzon.attach(&buzzflag, Alertlevel [alert].toneoff);
00259 }
00260 
00261 void buzzflag()
00262 {
00263     buzz_flag = 0;
00264     return;
00265 }
00266 
00267 void backlight ()
00268 {
00269     if (bright == 1.0) {
00270         bright = 0;
00271     } else {
00272         bright += 0.2;
00273     }
00274     lcd.setBrightness(bright);
00275 }
00276 
00277 void menu()
00278 {
00279     while(1) {
00280         if (g_sw1_flag) {
00281             g_sw1_flag = 0;
00282             page++; // Moves page
00283             lcd.clear();
00284         }
00285         switch (page) {
00286             case 0:
00287                 if (g_sw2_flag) {
00288                     g_sw2_flag = 0;  // if it has, clear the flag
00289                     backlight();
00290                     lcd.clear();
00291                 }
00292                 int lightbar = bright*84;
00293                 sprintf(buffer2,"%.0f%%",bright*100);
00294                 lcd.drawRect(0,26,lightbar,7,1);  // move bar up!!!!!!!!!!!!!!!!
00295                 lcd.printString("BACKLIGHT",0,1);
00296                 lcd.printString(buffer2,0,2);
00297                 lcd.printString("NEXT       ADJ",0,5);
00298                 lcd.refresh();
00299                 break;
00300             case 1:
00301                 if (g_sw2_flag) {
00302                     g_sw2_flag = 0;  // if it has, clear the flag
00303                     if (offset == 20) {
00304                         offset = 0;
00305                         lcd.clear();
00306                     } else {
00307                         offset += 1;
00308                     }
00309                 }
00310                 sprintf(buffer2,"%i",offset);
00311                 lcd.printString("OFFSET",0,1);
00312                 sprintf(buffer4,"NEXT       ADJ");
00313                 lcd.printString(buffer4,0,5);
00314                 break;
00315             case 2:
00316                 if (g_sw2_flag) {
00317                     g_sw2_flag = 0;  // if it has, clear the flag
00318                     if (units == 1) {
00319                         units = 0;
00320                         c = 0.3937;
00321                     } else {
00322                         units = 1;
00323                         c = 1;
00324                         lcd.clear();
00325                     }
00326                 }
00327                 if (units == 0) {
00328                     sprintf(buffer2,"IMPERIAL");
00329                 } else {
00330                     sprintf(buffer2,"METRIC");
00331                 }
00332                 lcd.printString("NEXT       ADJ",0,5);
00333                 lcd.printString("UNITS",0,1);
00334                 break;
00335             case 3:
00336                 if (g_sw2_flag) {
00337                     g_sw2_flag = 0;  // if it has, clear the flag
00338                     check_flag =0;
00339                     lcd.clear();
00340                 }
00341                 if (check_flag == 0) {
00342                     sprintf(buffer2,"COLLISION");
00343                     lcd.printString("NO",0,1);
00344                     sprintf(buffer4,"NEXT     ");
00345                 } else {
00346                     sprintf(buffer2,"COLLISION");
00347                     lcd.printString("CLEAR",0,1);
00348                     sprintf(buffer4,"NEXT     CLEAR");
00349                 }
00350 
00351                 lcd.printString(buffer4,0,5);
00352                 break;
00353             case 4:
00354                 if (g_sw2_flag) {
00355                     g_sw2_flag = 0;  // if it has, clear the flag
00356                     bright = 1.0;
00357                     offset = 0;
00358                     units = 1;
00359                     r1 = 03;// Upper limit of alert 1
00360                     r2 = 10;// Upper limit of alert 2
00361                     r3 = 20;// Upper limit of alert 3
00362                     r4 = 30;// Upper limit of alert 4
00363                     r5 = 50;// Upper limit of alert 5
00364                     r6 = 60;// Upper limit of alert 6
00365                     r7 = 80;// Upper limit of alert 7
00366                     lcd.clear();
00367                     lcd.printString("SETTINGS",0,1);
00368                     lcd.printString("RESET",0,2);
00369                     wait(1);
00370                     return;
00371                 }
00372                 sprintf(buffer2,"SETTINGS");
00373                 lcd.printString("RESET",0,1);
00374                 lcd.printString("NEXT     RESET",0,5);
00375                 break;
00376             case 5:
00377                 if (g_sw2_flag) {
00378                     g_sw2_flag = 0;  // if it has, clear the flag
00379                     submenu();
00380                 }
00381                 sprintf(buffer2,"PARAMETERS");
00382                 lcd.printString("RANGE",0,1);
00383                 lcd.printString("EXIT       ADJ",0,5);
00384                 break;
00385             default:
00386                 lcd.clear();
00387                 save ();
00388                 lcd.printString("    SAVING    ",0,2);
00389                 lcd.printString("   SETTINGS   ",0,3);
00390                 wait (1);
00391                 return;
00392         }// switch bracket
00393         lcd.printString(buffer2,0,2);
00394         lcd.printString("*****MENU*****",0,0);
00395         lcd.refresh();
00396     }//while braket
00397 }//functon bracket
00398 
00399 void submenu()
00400 {
00401     while(1) {
00402         /// interupt used to shift page
00403         if (g_sw1_flag) {
00404             g_sw1_flag = 0;
00405             subpage++;
00406         }
00407         switch (subpage) {  ///interupt used to adjust range
00408             case 0:
00409                 if (g_sw2_flag) {
00410                     g_sw2_flag = 0;           // if it has, clear the flag
00411                     if (r2 == r3) {
00412                         r2 = 3;
00413                     } else {
00414                         r2 = r2+1;
00415                     }
00416                 }
00417                 sprintf(buffer4,"1Cm to %iCm",r2);
00418                 lcd.printString("*****MENU*****",0,0);
00419                 lcd.printString("RANGE",0,1);
00420                 lcd.printString("PARAMETERS",0,2);
00421                 lcd.printString(buffer4,0,3);
00422                 lcd.printString("NEXT       ADJ",0,5);
00423                 break;
00424             case 1:
00425                 if (g_sw2_flag) {
00426                     g_sw2_flag = 0;           // if it has, clear the flag
00427                     if (r3 == r4) {
00428                         r3 = r2;
00429                     } else {
00430                         r3 += 1;
00431                     }
00432                 }
00433                 sprintf(buffer4,"%iCm to %iCm",r2,r3);
00434                 lcd.printString("*****MENU*****",0,0);
00435                 lcd.printString("RANGE",0,1);
00436                 lcd.printString("PARAMETERS",0,2);
00437                 lcd.printString(buffer4,0,3);
00438                 lcd.printString("NEXT       ADJ",0,5);
00439                 break;
00440             case 2:
00441                 if (g_sw2_flag) {
00442                     g_sw2_flag = 0;           // if it has, clear the flag
00443                     if (r4 == r5) {
00444                         r4 = r3;
00445                     } else {
00446                         r4 += 1;
00447                     }
00448                 }
00449                 sprintf(buffer4,"%iCm to %iCm",r3,r4);
00450                 lcd.printString("*****MENU*****",0,0);
00451                 lcd.printString("RANGE",0,1);
00452                 lcd.printString("PARAMETERS",0,2);
00453                 lcd.printString(buffer4,0,3);
00454                 lcd.printString("NEXT       ADJ",0,5);
00455                 break;
00456             case 3:
00457                 if (g_sw2_flag) {
00458                     g_sw2_flag = 0;           // if it has, clear the flag
00459                     if (r5 == r6) {
00460                         r5 = r4;
00461                     } else {
00462                         r5 += 1;
00463                     }
00464                 }
00465                 sprintf(buffer4,"%iCm to %iCm",r4,r5);
00466                 lcd.printString("*****MENU*****",0,0);
00467                 lcd.printString("RANGE",0,1);
00468                 lcd.printString("PARAMETERS",0,2);
00469                 lcd.printString(buffer4,0,3);
00470                 lcd.printString("NEXT       ADJ",0,5);
00471                 break;
00472             case 4:
00473                 if (g_sw2_flag) {
00474                     g_sw2_flag = 0;           // if it has, clear the flag
00475                     if (r6 == r7) {
00476                         r6 = r5;
00477                     } else {
00478                         r6 += 1;
00479                     }
00480                 }
00481                 sprintf(buffer4,"%iCm to %iCm",r5,r6);
00482                 lcd.printString("*****MENU*****",0,0);
00483                 lcd.printString("RANGE",0,1);
00484                 lcd.printString("PARAMETERS",0,2);
00485                 lcd.printString(buffer4,0,3);
00486                 lcd.printString("NEXT       ADJ",0,5);
00487                 break;
00488             case 5:
00489                 if (g_sw2_flag) {
00490                     g_sw2_flag = 0;           // if it has, clear the flag
00491                     if (r7 == 300) {
00492                         r7 = r6;
00493                     } else {
00494                         r7 += 1;
00495                     }
00496                 }
00497                 sprintf(buffer4,"%iCm to %iCm",r6,r7);
00498                 lcd.printString("*****MENU*****",0,0);
00499                 lcd.printString("RANGE",0,1);
00500                 lcd.printString("PARAMETERS",0,2);
00501                 lcd.printString(buffer4,0,3);
00502                 lcd.printString("EXIT       ADJ",0,5);
00503                 break;
00504             default:
00505                 lcd.clear();
00506                 return;
00507         }//switch breaket
00508     }//while bracket
00509 }//function bracket
00510 
00511 void save()
00512 {
00513     fp = fopen("/sd/settings.txt", "w");
00514     if (fp == NULL) {  // if it can't open the file then print error message
00515         serial.printf("Error! Unable to open file!\n");
00516     } else {  // opened file so can write
00517         serial.printf("Writing to file....");
00518         fprintf(fp, "%f,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i",bright,units,offset,check_flag,r1,r2,r3,r4,r5,r6,r7); // ensure data type matches
00519         serial.printf("Done.\n");
00520         fclose(fp);  // ensure you close the file after writing
00521     }
00522 }
00523 
00524 void setup()
00525 {
00526     serial.baud(115200);  // full-speed!
00527     ticker.attach(&timer_isr_led,0.35); /// Attach the ticker for the flashig LEDs
00528     ticker_srf02.attach(&timer_isr_srf02,0.2);/// Attach the ticker for collecting a range reading
00529     ticker_standby.attach(&timer_isr_standby,5.0);
00530     sw1.rise(&sw1_isr); /// sw1_isr called when button presed on the rising edge
00531     sw2.rise(&sw2_isr); /// sw2_isr called when button presed on the rising edge
00532     r_led = 1; //Onboard leds
00533     b_led = 1; //Onboard leds
00534     g_led = 1; //Onboard leds
00535     rr_led = 0; //PCB LEDS
00536     a_led = 0; //PCB LEDS
00537     gg_led = 0; //PCB LEDS
00538     sw2.mode(PullDown); //Turns on use of the pulldown resistors for use with the PCB buttons
00539     sw1.mode(PullDown); //Turns on use of the pulldown resistors for use with the PCB buttons
00540 }
00541 
00542 void sw2_isr()
00543 {
00544     g_sw2_flag = 1;   /** set flag in ISR by button 2 @param g_sw2_flag 0 or 1*/
00545 }
00546 
00547 void sw1_isr()
00548 {
00549     g_sw1_flag = 1;   /** set flag in ISR by button 2 @param g_sw1_flag 0 or 1*/
00550 }
00551 
00552 void timer_isr_led()
00553 {
00554     g_timer_flag_led = 1;   /** set flag in ISR by timer_isr_led @param g_timer_flag_led 0 or 1 */
00555 }
00556 
00557 void timer_isr_srf02()
00558 {
00559     g_timer_flag_srf02 = 1;   /** set flag in ISR by ticker_srf02 @param g_timer_flag_srf02 0 or 1 */
00560 }
00561 
00562 void timer_isr_standby()
00563 {
00564     g_timer_flag_standby = 1; /** set flag in ISR by ticker_tone @param g_timer_flag_tone 0 or 1 */
00565 }