Level 2 Project Range Device

Dependencies:   N5110 SDFileSystem SRF02 TMP102 mbed

Fork of Ranger by Philip Thompson

Committer:
el15pjt
Date:
Wed Apr 27 09:09:55 2016 +0000
Revision:
8:fe6ebe807b9d
Parent:
7:14cfb0df30e6
Child:
9:bc259fc22fa2
Prior to tidying;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el15pjt 7:14cfb0df30e6 1
el15pjt 7:14cfb0df30e6 2 /**
el15pjt 7:14cfb0df30e6 3 @file main.cpp
el15pjt 7:14cfb0df30e6 4 @brief Program implementation
el15pjt 0:0b180348c7e4 5 */
el15pjt 0:0b180348c7e4 6
el15pjt 7:14cfb0df30e6 7 #include "main.h"
el15pjt 7:14cfb0df30e6 8 #include "SDFileSystem.h"
el15pjt 8:fe6ebe807b9d 9 //Serial serial(USBTX, USBRX); // for PC debug
el15pjt 4:673930f04866 10
el15pjt 0:0b180348c7e4 11
el15pjt 0:0b180348c7e4 12 int main()
el15pjt 0:0b180348c7e4 13 {
el15pjt 8:fe6ebe807b9d 14 int d = 0;
el15pjt 8:fe6ebe807b9d 15 int myarray[9];
el15pjt 7:14cfb0df30e6 16 setup();
el15pjt 7:14cfb0df30e6 17 lcd.init(); // Initiate LCD
el15pjt 7:14cfb0df30e6 18 /*
el15pjt 7:14cfb0df30e6 19 sprintf(buffer,"ELEC 2645");
el15pjt 7:14cfb0df30e6 20 sprintf(buffer1,"Project Ranger");
el15pjt 7:14cfb0df30e6 21 sprintf(buffer2,"Phil Thompson");
el15pjt 7:14cfb0df30e6 22 sprintf(buffer3,"SID 200971914 ");
el15pjt 7:14cfb0df30e6 23 lcd.printString(buffer,0,0);
el15pjt 7:14cfb0df30e6 24 lcd.printString(buffer1,0,1);
el15pjt 7:14cfb0df30e6 25 lcd.printString(buffer2,0,2);
el15pjt 7:14cfb0df30e6 26 lcd.printString(buffer3,0,3);
el15pjt 7:14cfb0df30e6 27 wait (3);
el15pjt 7:14cfb0df30e6 28 */
el15pjt 7:14cfb0df30e6 29 /*
el15pjt 7:14cfb0df30e6 30 serial.baud(115200); // full-speed!
el15pjt 7:14cfb0df30e6 31 serial.printf("#### SD Card Example #####\n");
el15pjt 7:14cfb0df30e6 32 FILE *fp; // this is our file pointer
el15pjt 7:14cfb0df30e6 33 wait(1);
el15pjt 7:14cfb0df30e6 34 {
el15pjt 7:14cfb0df30e6 35 /////////////////////// Reading from file example ////////////////////////
el15pjt 7:14cfb0df30e6 36
el15pjt 7:14cfb0df30e6 37 // now open file for reading...note the 'r'
el15pjt 7:14cfb0df30e6 38 fp = fopen("/sd/settings.txt", "r");
el15pjt 7:14cfb0df30e6 39 if (fp == NULL) { // if it can't open the file then print error message
el15pjt 7:14cfb0df30e6 40 serial.printf("Error! Unable to open file!\n");
el15pjt 7:14cfb0df30e6 41 } else {
el15pjt 7:14cfb0df30e6 42 serial.printf("Reading file....\n");
el15pjt 7:14cfb0df30e6 43 int r1;
el15pjt 7:14cfb0df30e6 44 int r2;
el15pjt 7:14cfb0df30e6 45 int r3;
el15pjt 7:14cfb0df30e6 46 int r4;
el15pjt 7:14cfb0df30e6 47 int r5;
el15pjt 7:14cfb0df30e6 48 int r6;
el15pjt 7:14cfb0df30e6 49 int r7;
el15pjt 8:fe6ebe807b9d 50 int offset;
el15pjt 8:fe6ebe807b9d 51 float bright;
el15pjt 8:fe6ebe807b9d 52 float value;
el15pjt 7:14cfb0df30e6 53 int i;
el15pjt 7:14cfb0df30e6 54
el15pjt 7:14cfb0df30e6 55 // in this example, we keep reading (using fscanf) until we reach
el15pjt 7:14cfb0df30e6 56 // the 'end of file'. Note we use the address operator & to write
el15pjt 7:14cfb0df30e6 57 // to the variables. Also the format of the string must match what
el15pjt 7:14cfb0df30e6 58 // is in the file
el15pjt 7:14cfb0df30e6 59 while (fscanf(fp, "%d,%f", &i, &value) != EOF) {
el15pjt 7:14cfb0df30e6 60 serial.printf("%d,%f\n",i,value);
el15pjt 7:14cfb0df30e6 61 }
el15pjt 7:14cfb0df30e6 62 serial.printf("Done.\n");
el15pjt 7:14cfb0df30e6 63 fclose(fp); // ensure you close the file after reading
el15pjt 7:14cfb0df30e6 64 }
el15pjt 7:14cfb0df30e6 65 }
el15pjt 7:14cfb0df30e6 66 */
el15pjt 8:fe6ebe807b9d 67
el15pjt 0:0b180348c7e4 68 while(1) {
el15pjt 4:673930f04866 69
el15pjt 8:fe6ebe807b9d 70 if (g_sw1_flag) { /// Event triggered inturupt to call the menu and reset page numbers
el15pjt 5:083d484e95a1 71 g_sw1_flag = 0;
el15pjt 5:083d484e95a1 72 page = 0;
el15pjt 5:083d484e95a1 73 subpage = 0;
el15pjt 6:b464a8a94d91 74 lcd.clear();
el15pjt 5:083d484e95a1 75 menu();
el15pjt 2:329597081c06 76 }
el15pjt 5:083d484e95a1 77
el15pjt 3:8782b8b8658b 78 if (g_timer_flag_srf02) {
el15pjt 8:fe6ebe807b9d 79
el15pjt 3:8782b8b8658b 80 g_timer_flag_srf02 = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 81 if (units == METRIC) {
el15pjt 5:083d484e95a1 82 distance = srf02.getDistanceCm();
el15pjt 7:14cfb0df30e6 83 distance = distance-(offset*c);
el15pjt 5:083d484e95a1 84 } else {
el15pjt 5:083d484e95a1 85 distance = srf02.getDistannceInch();
el15pjt 7:14cfb0df30e6 86 distance = distance -(offset*c);
el15pjt 5:083d484e95a1 87 }
el15pjt 7:14cfb0df30e6 88
el15pjt 8:fe6ebe807b9d 89 if (d == 10) {
el15pjt 7:14cfb0df30e6 90 d = 0;
el15pjt 7:14cfb0df30e6 91 } else {
el15pjt 7:14cfb0df30e6 92 d++;
el15pjt 7:14cfb0df30e6 93 }
el15pjt 7:14cfb0df30e6 94 myarray[d] = distance;
el15pjt 8:fe6ebe807b9d 95 int totaldistance = 0;
el15pjt 8:fe6ebe807b9d 96 for (int i = 0; i < 9; i++) {
el15pjt 8:fe6ebe807b9d 97 int totaldistance = totaldistance+myarray[i];
el15pjt 7:14cfb0df30e6 98 }
el15pjt 8:fe6ebe807b9d 99 avgdistance = totaldistance/9;
el15pjt 0:0b180348c7e4 100 }
el15pjt 7:14cfb0df30e6 101
el15pjt 5:083d484e95a1 102 setalert();
el15pjt 3:8782b8b8658b 103 lcdoutput();
el15pjt 8:fe6ebe807b9d 104 if (!alert == 0) {
el15pjt 8:fe6ebe807b9d 105 if (buzz_flag == 0) {
el15pjt 8:fe6ebe807b9d 106 setbuzzer();
el15pjt 8:fe6ebe807b9d 107 }
el15pjt 8:fe6ebe807b9d 108 }
el15pjt 3:8782b8b8658b 109 setleds();
el15pjt 4:673930f04866 110 sleep();
el15pjt 0:0b180348c7e4 111 }
el15pjt 0:0b180348c7e4 112 }
el15pjt 0:0b180348c7e4 113
el15pjt 8:fe6ebe807b9d 114
el15pjt 3:8782b8b8658b 115 void lcdoutput()
el15pjt 3:8782b8b8658b 116 {
el15pjt 7:14cfb0df30e6 117 /**
el15pjt 7:14cfb0df30e6 118 Function called to print to the LCD display
el15pjt 7:14cfb0df30e6 119 @param i used to scale the max distaance to the width of the screen
el15pjt 7:14cfb0df30e6 120 @param distance Distance read from sensor to be dispayed
el15pjt 7:14cfb0df30e6 121 @param distbar used to adjust how far along the screen the bar is to go acorrding to distance
el15pjt 7:14cfb0df30e6 122 */
el15pjt 7:14cfb0df30e6 123
el15pjt 7:14cfb0df30e6 124 // if alert == 0 no need to display range path is clear
el15pjt 6:b464a8a94d91 125 if (alert == 0) {
el15pjt 7:14cfb0df30e6 126 if (g_timer_flag_standby) {
el15pjt 7:14cfb0df30e6 127 g_timer_flag_standby = 0;
el15pjt 7:14cfb0df30e6 128 T = tmp102.get_temperature();
el15pjt 7:14cfb0df30e6 129 standby++;
el15pjt 7:14cfb0df30e6 130 if (standby >3) {
el15pjt 7:14cfb0df30e6 131 standby = 3;
el15pjt 7:14cfb0df30e6 132 }
el15pjt 7:14cfb0df30e6 133 }
el15pjt 7:14cfb0df30e6 134
el15pjt 7:14cfb0df30e6 135 switch (standby) {
el15pjt 7:14cfb0df30e6 136 case 1:
el15pjt 8:fe6ebe807b9d 137 if (check_flag == 1) {
el15pjt 8:fe6ebe807b9d 138 sprintf(buffer4,"COLLISIONCHECK");
el15pjt 8:fe6ebe807b9d 139 }
el15pjt 7:14cfb0df30e6 140 lcd.clear();
el15pjt 7:14cfb0df30e6 141 sprintf(buffer,"**PATH CLEAR**");
el15pjt 7:14cfb0df30e6 142 lcd.printString(buffer,0,0);
el15pjt 8:fe6ebe807b9d 143 lcd.printString(buffer4,0,5);
el15pjt 7:14cfb0df30e6 144 lcd.refresh();
el15pjt 7:14cfb0df30e6 145 break;
el15pjt 7:14cfb0df30e6 146 case 2:
el15pjt 8:fe6ebe807b9d 147 if (check_flag == 1) {
el15pjt 8:fe6ebe807b9d 148 sprintf(buffer4,"COLLISIONCHECK");
el15pjt 8:fe6ebe807b9d 149 }
el15pjt 7:14cfb0df30e6 150 lcd.clear();
el15pjt 7:14cfb0df30e6 151 sprintf(buffer3,"TEMP = %.2f",T);
el15pjt 7:14cfb0df30e6 152 sprintf(buffer2,"TEMPERATER");
el15pjt 8:fe6ebe807b9d 153 lcd.printString(buffer3,4,2);
el15pjt 8:fe6ebe807b9d 154 lcd.printString(buffer2,12,1);
el15pjt 8:fe6ebe807b9d 155 lcd.printString(buffer4,0,5);
el15pjt 8:fe6ebe807b9d 156
el15pjt 7:14cfb0df30e6 157 break;
el15pjt 7:14cfb0df30e6 158 case 3:
el15pjt 8:fe6ebe807b9d 159 if (check_flag == 1) {
el15pjt 8:fe6ebe807b9d 160 sprintf(buffer4,"COLLISIONCHECK");
el15pjt 8:fe6ebe807b9d 161 }
el15pjt 7:14cfb0df30e6 162 lcd.clear();
el15pjt 7:14cfb0df30e6 163 sprintf(buffer3,"TEMP = %.2f",T);
el15pjt 7:14cfb0df30e6 164 sprintf(buffer2,"TEMPERATER");
el15pjt 7:14cfb0df30e6 165 lcd.refresh();
el15pjt 8:fe6ebe807b9d 166 lcd.printString(buffer3,4,2);
el15pjt 8:fe6ebe807b9d 167 lcd.printString(buffer2,12,1);
el15pjt 8:fe6ebe807b9d 168 lcd.printString(buffer4,0,5);
el15pjt 7:14cfb0df30e6 169 lcd.setBrightness(0);
el15pjt 7:14cfb0df30e6 170 break;
el15pjt 7:14cfb0df30e6 171 }
el15pjt 7:14cfb0df30e6 172 }
el15pjt 7:14cfb0df30e6 173
el15pjt 7:14cfb0df30e6 174 //If alert isn't 0 then the distance is to be dispayed alonng with the the distance bar
el15pjt 7:14cfb0df30e6 175 else {
el15pjt 7:14cfb0df30e6 176 lcd.setBrightness(bright);
el15pjt 7:14cfb0df30e6 177 standby =0;
el15pjt 6:b464a8a94d91 178 lcd.clear();
el15pjt 3:8782b8b8658b 179
el15pjt 7:14cfb0df30e6 180 if (units == METRIC) {
el15pjt 8:fe6ebe807b9d 181 sprintf(buffer,"%0.2f Cm",avgdistance);
el15pjt 7:14cfb0df30e6 182 sprintf(buffer1,"****RANGE!****");
el15pjt 7:14cfb0df30e6 183 sprintf(buffer2,"DISTANCE");
el15pjt 8:fe6ebe807b9d 184
el15pjt 7:14cfb0df30e6 185 sprintf(buffer4,"Menu");
el15pjt 3:8782b8b8658b 186
el15pjt 5:083d484e95a1 187 } else {
el15pjt 8:fe6ebe807b9d 188 sprintf(buffer,"%0.2f Inches",avgdistance);
el15pjt 7:14cfb0df30e6 189 sprintf(buffer1,"****RANGE!****");
el15pjt 7:14cfb0df30e6 190 sprintf(buffer2,"***DISTANCE***");
el15pjt 8:fe6ebe807b9d 191 sprintf(buffer4,"Menu");
el15pjt 5:083d484e95a1 192 }
el15pjt 7:14cfb0df30e6 193 lcd.printString(buffer,25,2);
el15pjt 6:b464a8a94d91 194 lcd.printString(buffer1,0,0);
el15pjt 7:14cfb0df30e6 195 lcd.printString(buffer2,16,1);
el15pjt 7:14cfb0df30e6 196 lcd.printString(buffer4,0,5);
el15pjt 8:fe6ebe807b9d 197
el15pjt 7:14cfb0df30e6 198
el15pjt 8:fe6ebe807b9d 199 float h = (r7/84);
el15pjt 8:fe6ebe807b9d 200 float distbar = (avgdistance*h);
el15pjt 6:b464a8a94d91 201 //drawRect(int x0,int y0,int width,int height,int fill);
el15pjt 8:fe6ebe807b9d 202 lcd.drawRect(0,29,distbar,7,1); //
el15pjt 6:b464a8a94d91 203 lcd.refresh();
el15pjt 6:b464a8a94d91 204
el15pjt 5:083d484e95a1 205 }
el15pjt 3:8782b8b8658b 206
el15pjt 3:8782b8b8658b 207 }
el15pjt 3:8782b8b8658b 208
el15pjt 8:fe6ebe807b9d 209
el15pjt 3:8782b8b8658b 210 void setalert()
el15pjt 3:8782b8b8658b 211 {
el15pjt 7:14cfb0df30e6 212 /** A fuction used to determin the alert level given a range with the use of IF statments
el15pjt 7:14cfb0df30e6 213 @param distance The distance read from sensor
el15pjt 7:14cfb0df30e6 214 @param alert The level that distance falls with in 0 -7
el15pjt 7:14cfb0df30e6 215 @returns alert
el15pjt 7:14cfb0df30e6 216 */
el15pjt 7:14cfb0df30e6 217
el15pjt 8:fe6ebe807b9d 218 if (avgdistance >= (r6*c) && avgdistance < (r7*c)) { // r6 150 and r7 200
el15pjt 8:fe6ebe807b9d 219 alert = 1; /// alert 1 avgdistance between preset 150Cm to 200Cm
el15pjt 8:fe6ebe807b9d 220 } else if (avgdistance >= (r5*c) && avgdistance < (r6*c)) {
el15pjt 7:14cfb0df30e6 221 alert = 2; /// alert 2 when between preset 90Cm to 150Cm
el15pjt 8:fe6ebe807b9d 222 } else if (avgdistance >= (r4*c) && avgdistance < (r5*c)) {
el15pjt 8:fe6ebe807b9d 223 alert = 3; /// alert 3 when avgdistance between 60Cm to 90Cm
el15pjt 8:fe6ebe807b9d 224 } else if (avgdistance >= (r3*c) && avgdistance < (r4*c)) {
el15pjt 8:fe6ebe807b9d 225 alert = 4; /// alert 4 when avgdistance between 40Cm and 60Cm
el15pjt 8:fe6ebe807b9d 226 } else if (avgdistance >= (r2*c) && avgdistance < (r3*c)) {
el15pjt 8:fe6ebe807b9d 227 alert = 5; ///alert 5 when avgdistance between 20Cm and 40m
el15pjt 8:fe6ebe807b9d 228 } else if (avgdistance >= (r1*c) && avgdistance <= (r2*c)) { //r1 3 and r2 20
el15pjt 8:fe6ebe807b9d 229 alert = 6; ///alert 6 when avgdistance between 1 and 20
el15pjt 8:fe6ebe807b9d 230 } else if (avgdistance <=(r1*c)) {
el15pjt 8:fe6ebe807b9d 231 alert = 7; ///alert 7 when avgdistance below 1Cm
el15pjt 8:fe6ebe807b9d 232 check_flag = 1;
el15pjt 3:8782b8b8658b 233 } else {
el15pjt 7:14cfb0df30e6 234 alert = 0; /// alert 0 all else
el15pjt 3:8782b8b8658b 235 }
el15pjt 2:329597081c06 236 }
el15pjt 2:329597081c06 237
el15pjt 3:8782b8b8658b 238 void setleds()
el15pjt 3:8782b8b8658b 239 {
el15pjt 7:14cfb0df30e6 240 if (alert ==7) {
el15pjt 5:083d484e95a1 241 if (g_timer_flag_led) {
el15pjt 5:083d484e95a1 242 g_timer_flag_led = 0; // if it has, clear the flag
el15pjt 3:8782b8b8658b 243 rr_led = !rr_led;
el15pjt 5:083d484e95a1 244 gg_led = !gg_led;
el15pjt 5:083d484e95a1 245 a_led = !a_led;
el15pjt 5:083d484e95a1 246 }
el15pjt 5:083d484e95a1 247 } else if(Alertlevel[alert].fa_led == HIGH) {
el15pjt 5:083d484e95a1 248 if (g_timer_flag_led) {
el15pjt 5:083d484e95a1 249 g_timer_flag_led = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 250 a_led = !a_led;
el15pjt 5:083d484e95a1 251 }
el15pjt 5:083d484e95a1 252 } else if (Alertlevel[alert].frr_led == HIGH) {
el15pjt 5:083d484e95a1 253 if (g_timer_flag_led) {
el15pjt 5:083d484e95a1 254 g_timer_flag_led = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 255 rr_led = !rr_led;
el15pjt 5:083d484e95a1 256 }
el15pjt 5:083d484e95a1 257 } else if(Alertlevel[alert].fgg_led == HIGH) {
el15pjt 5:083d484e95a1 258 if (g_timer_flag_led) {
el15pjt 5:083d484e95a1 259 g_timer_flag_led = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 260 gg_led = !gg_led;
el15pjt 3:8782b8b8658b 261 }
el15pjt 3:8782b8b8658b 262 } else {
el15pjt 3:8782b8b8658b 263 rr_led = Alertlevel[alert].srr_led;
el15pjt 5:083d484e95a1 264 a_led = Alertlevel[alert].sa_led;
el15pjt 5:083d484e95a1 265 gg_led = Alertlevel[alert].sgg_led;
el15pjt 3:8782b8b8658b 266 }
el15pjt 3:8782b8b8658b 267
el15pjt 5:083d484e95a1 268 }
el15pjt 7:14cfb0df30e6 269
el15pjt 5:083d484e95a1 270 void setbuzzer()
el15pjt 5:083d484e95a1 271 {
el15pjt 7:14cfb0df30e6 272 /**
el15pjt 7:14cfb0df30e6 273 control the PWM to drive the buzzer
el15pjt 7:14cfb0df30e6 274 @param buzzer.period frequncy 1KHz
el15pjt 7:14cfb0df30e6 275 @param buzzer duty cycle equal on/off max volume
el15pjt 7:14cfb0df30e6 276 @param Alertlevel[alert].toneon controls how long the tone will last depending on alert
el15pjt 7:14cfb0df30e6 277 */
el15pjt 8:fe6ebe807b9d 278 buzzer.period (1.0/1000.0);
el15pjt 8:fe6ebe807b9d 279 buzzer = 0.5;
el15pjt 8:fe6ebe807b9d 280 buzzoff.attach(&flip, Alertlevel[alert].toneon);
el15pjt 8:fe6ebe807b9d 281 }
el15pjt 7:14cfb0df30e6 282
el15pjt 8:fe6ebe807b9d 283 void flip()
el15pjt 8:fe6ebe807b9d 284 {
el15pjt 8:fe6ebe807b9d 285 buzz_flag = 1;
el15pjt 8:fe6ebe807b9d 286 buzzer = 0.0;
el15pjt 8:fe6ebe807b9d 287 buzzon.attach(&buzzflag,Alertlevel[alert].toneoff);
el15pjt 8:fe6ebe807b9d 288 }
el15pjt 7:14cfb0df30e6 289
el15pjt 8:fe6ebe807b9d 290 void buzzflag()
el15pjt 8:fe6ebe807b9d 291 {
el15pjt 8:fe6ebe807b9d 292 buzz_flag = 0;
el15pjt 8:fe6ebe807b9d 293 return;
el15pjt 3:8782b8b8658b 294 }
el15pjt 3:8782b8b8658b 295
el15pjt 3:8782b8b8658b 296 void backlight ()
el15pjt 3:8782b8b8658b 297 {
el15pjt 3:8782b8b8658b 298 if (bright == 1.0) {
el15pjt 3:8782b8b8658b 299 bright = 0;
el15pjt 3:8782b8b8658b 300 } else {
el15pjt 3:8782b8b8658b 301 bright += 0.2;
el15pjt 3:8782b8b8658b 302 }
el15pjt 3:8782b8b8658b 303 lcd.setBrightness(bright);
el15pjt 3:8782b8b8658b 304 }
el15pjt 3:8782b8b8658b 305
el15pjt 3:8782b8b8658b 306 void sw2_isr()
el15pjt 3:8782b8b8658b 307 {
el15pjt 7:14cfb0df30e6 308 g_sw2_flag = 1; /** set flag in ISR by button 2 @param g_sw2_flag 0 or 1*/
el15pjt 3:8782b8b8658b 309 }
el15pjt 3:8782b8b8658b 310
el15pjt 5:083d484e95a1 311 void sw1_isr()
el15pjt 3:8782b8b8658b 312 {
el15pjt 7:14cfb0df30e6 313 g_sw1_flag = 1; /** set flag in ISR by button 2 @param g_sw1_flag 0 or 1*/
el15pjt 5:083d484e95a1 314 }
el15pjt 3:8782b8b8658b 315
el15pjt 5:083d484e95a1 316 void timer_isr_led()
el15pjt 2:329597081c06 317 {
el15pjt 7:14cfb0df30e6 318 g_timer_flag_led = 1; /** set flag in ISR by timer_isr_led @param g_timer_flag_led 0 or 1 */
el15pjt 3:8782b8b8658b 319 }
el15pjt 3:8782b8b8658b 320
el15pjt 3:8782b8b8658b 321 void timer_isr_srf02()
el15pjt 3:8782b8b8658b 322 {
el15pjt 7:14cfb0df30e6 323 g_timer_flag_srf02 = 1; /** set flag in ISR by ticker_srf02 @param g_timer_flag_srf02 0 or 1 */
el15pjt 4:673930f04866 324 }
el15pjt 4:673930f04866 325
el15pjt 4:673930f04866 326 void timer_isr_tone()
el15pjt 4:673930f04866 327 {
el15pjt 7:14cfb0df30e6 328 g_timer_flag_tone = 1; /** set flag in ISR by ticker_tone @param g_timer_flag_tone 0 or 1 */
el15pjt 7:14cfb0df30e6 329 }
el15pjt 7:14cfb0df30e6 330 void timer_isr_standby()
el15pjt 7:14cfb0df30e6 331 {
el15pjt 7:14cfb0df30e6 332 g_timer_flag_standby = 1; /** set flag in ISR by ticker_tone @param g_timer_flag_tone 0 or 1 */
el15pjt 4:673930f04866 333 }
el15pjt 4:673930f04866 334
el15pjt 5:083d484e95a1 335 void menu()
el15pjt 4:673930f04866 336 {
el15pjt 5:083d484e95a1 337 while(1) {
el15pjt 6:b464a8a94d91 338
el15pjt 6:b464a8a94d91 339
el15pjt 5:083d484e95a1 340 if (g_sw1_flag) {
el15pjt 5:083d484e95a1 341 g_sw1_flag = 0;
el15pjt 7:14cfb0df30e6 342 page++; /// Moves page
el15pjt 6:b464a8a94d91 343 lcd.clear();
el15pjt 5:083d484e95a1 344 }
el15pjt 5:083d484e95a1 345 switch (page) {
el15pjt 5:083d484e95a1 346 case 0:
el15pjt 5:083d484e95a1 347 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 348 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 349 backlight();
el15pjt 6:b464a8a94d91 350 lcd.clear();
el15pjt 6:b464a8a94d91 351 } else {
el15pjt 6:b464a8a94d91 352 int lightbar = bright*84;
el15pjt 7:14cfb0df30e6 353 sprintf(buffer2,"*****MENU*****");
el15pjt 7:14cfb0df30e6 354 sprintf(buffer1,"BACKLIGHT");
el15pjt 7:14cfb0df30e6 355 sprintf(buffer3,"%.0f%%",bright*100);
el15pjt 8:fe6ebe807b9d 356 sprintf(buffer4,"NEXT ADJ");
el15pjt 5:083d484e95a1 357 lcd.printString(buffer2,0,0);
el15pjt 5:083d484e95a1 358 lcd.printString(buffer1,0,1);
el15pjt 5:083d484e95a1 359 lcd.printString(buffer3,0,2);
el15pjt 7:14cfb0df30e6 360 lcd.printString(buffer4,0,5);
el15pjt 7:14cfb0df30e6 361 lcd.drawRect(0,26,lightbar,7,1); // move bar up!!!!!!!!!!!!!!!!
el15pjt 6:b464a8a94d91 362 lcd.refresh();
el15pjt 6:b464a8a94d91 363
el15pjt 5:083d484e95a1 364 }
el15pjt 5:083d484e95a1 365 break;
el15pjt 5:083d484e95a1 366
el15pjt 5:083d484e95a1 367 case 1:
el15pjt 5:083d484e95a1 368 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 369 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 370 if (offset == 20) {
el15pjt 5:083d484e95a1 371 offset = 0;
el15pjt 5:083d484e95a1 372 } else {
el15pjt 5:083d484e95a1 373 offset += 1;
el15pjt 5:083d484e95a1 374 }
el15pjt 6:b464a8a94d91 375 } else {
el15pjt 6:b464a8a94d91 376 length2 = sprintf(buffer2,"*****MENU*****");
el15pjt 6:b464a8a94d91 377 length1 = sprintf(buffer1,"OFFSET");
el15pjt 6:b464a8a94d91 378 length3 = sprintf(buffer3,"%i",offset);
el15pjt 8:fe6ebe807b9d 379 sprintf(buffer4,"NEXT ADJ");
el15pjt 5:083d484e95a1 380 lcd.printString(buffer2,0,0);
el15pjt 5:083d484e95a1 381 lcd.printString(buffer1,0,1);
el15pjt 5:083d484e95a1 382 lcd.printString(buffer3,0,2);
el15pjt 7:14cfb0df30e6 383 lcd.printString(buffer4,0,5);
el15pjt 6:b464a8a94d91 384 lcd.refresh();
el15pjt 5:083d484e95a1 385 }
el15pjt 6:b464a8a94d91 386
el15pjt 5:083d484e95a1 387 break;
el15pjt 5:083d484e95a1 388
el15pjt 5:083d484e95a1 389 case 2:
el15pjt 5:083d484e95a1 390 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 391 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 392 if (units == METRIC) {
el15pjt 5:083d484e95a1 393 units = IMPERIAL;
el15pjt 7:14cfb0df30e6 394 c= 0.3937;
el15pjt 5:083d484e95a1 395 } else {
el15pjt 5:083d484e95a1 396 units = METRIC;
el15pjt 7:14cfb0df30e6 397 c = 1;
el15pjt 5:083d484e95a1 398 }
el15pjt 5:083d484e95a1 399 }
el15pjt 5:083d484e95a1 400 if (units == METRIC) {
el15pjt 7:14cfb0df30e6 401 sprintf(buffer3,"METRIC");
el15pjt 7:14cfb0df30e6 402 lcd.printString(buffer3,0,2);
el15pjt 5:083d484e95a1 403 } else {
el15pjt 7:14cfb0df30e6 404 sprintf(buffer3,"IMPERIAL");
el15pjt 7:14cfb0df30e6 405 lcd.printString(buffer3,0,2);
el15pjt 5:083d484e95a1 406 }
el15pjt 7:14cfb0df30e6 407 sprintf(buffer2,"*****MENU*****");
el15pjt 7:14cfb0df30e6 408 sprintf(buffer1,"UNITS");
el15pjt 8:fe6ebe807b9d 409 sprintf(buffer4,"NEXT ADJ");
el15pjt 6:b464a8a94d91 410 lcd.printString(buffer2,0,0);
el15pjt 6:b464a8a94d91 411 lcd.printString(buffer1,0,1);
el15pjt 7:14cfb0df30e6 412 lcd.printString(buffer4,0,5);
el15pjt 7:14cfb0df30e6 413 lcd.refresh();
el15pjt 6:b464a8a94d91 414
el15pjt 5:083d484e95a1 415 break;
el15pjt 8:fe6ebe807b9d 416 case 3:
el15pjt 8:fe6ebe807b9d 417 if (g_sw2_flag) {
el15pjt 8:fe6ebe807b9d 418 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 8:fe6ebe807b9d 419 check_flag =0;
el15pjt 8:fe6ebe807b9d 420 }
el15pjt 8:fe6ebe807b9d 421 length2 = sprintf(buffer3,"*****MENU*****");
el15pjt 8:fe6ebe807b9d 422 length3 = sprintf(buffer1,"CLEAR");
el15pjt 8:fe6ebe807b9d 423 length3 = sprintf(buffer2,"COLLISION");
el15pjt 8:fe6ebe807b9d 424 sprintf(buffer4,"NEXT YES");
el15pjt 8:fe6ebe807b9d 425 lcd.printString(buffer3,0,0);
el15pjt 8:fe6ebe807b9d 426 lcd.printString(buffer1,0,1);
el15pjt 8:fe6ebe807b9d 427 lcd.printString(buffer2,0,2);
el15pjt 8:fe6ebe807b9d 428 lcd.printString(buffer4,0,5);
el15pjt 5:083d484e95a1 429
el15pjt 8:fe6ebe807b9d 430 break;
el15pjt 8:fe6ebe807b9d 431 case 4:
el15pjt 5:083d484e95a1 432
el15pjt 5:083d484e95a1 433 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 434 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 435 submenu();
el15pjt 5:083d484e95a1 436 }
el15pjt 5:083d484e95a1 437 length2 = sprintf(buffer3,"*****MENU*****");
el15pjt 5:083d484e95a1 438 length3 = sprintf(buffer1,"RANGE");
el15pjt 5:083d484e95a1 439 length3 = sprintf(buffer2,"PARAMETERS");
el15pjt 8:fe6ebe807b9d 440 sprintf(buffer4,"NEXT ADJ");
el15pjt 5:083d484e95a1 441 lcd.printString(buffer3,0,0);
el15pjt 5:083d484e95a1 442 lcd.printString(buffer1,0,1);
el15pjt 5:083d484e95a1 443 lcd.printString(buffer2,0,2);
el15pjt 7:14cfb0df30e6 444 lcd.printString(buffer4,0,5);
el15pjt 6:b464a8a94d91 445
el15pjt 5:083d484e95a1 446 break;
el15pjt 5:083d484e95a1 447
el15pjt 5:083d484e95a1 448 default:
el15pjt 5:083d484e95a1 449 lcd.clear();
el15pjt 7:14cfb0df30e6 450 /* //save();
el15pjt 7:14cfb0df30e6 451
el15pjt 7:14cfb0df30e6 452 ///////////////////// Writing list to file example //////////////////////
el15pjt 7:14cfb0df30e6 453
el15pjt 7:14cfb0df30e6 454 // for this example, I'll create some numbers to write to file in a big list
el15pjt 7:14cfb0df30e6 455 // a data logger for example will usually append to a file - at a reading
el15pjt 7:14cfb0df30e6 456 // at the end rather than creating a new file
el15pjt 7:14cfb0df30e6 457 fp = fopen("/sd/settinngs.txt", "a");
el15pjt 7:14cfb0df30e6 458
el15pjt 7:14cfb0df30e6 459 if (fp == NULL) { // if it can't open the file then print error message
el15pjt 7:14cfb0df30e6 460 serial.printf("Error! Unable to open file!\n");
el15pjt 7:14cfb0df30e6 461 } else { // opened file so can write
el15pjt 7:14cfb0df30e6 462 serial.printf("Writing to file....");
el15pjt 7:14cfb0df30e6 463 for(int i = 1; i <= 50; i++) {
el15pjt 7:14cfb0df30e6 464 int r1;
el15pjt 7:14cfb0df30e6 465 int r2;
el15pjt 7:14cfb0df30e6 466 int r3;
el15pjt 7:14cfb0df30e6 467 int r4;
el15pjt 7:14cfb0df30e6 468 int r5;
el15pjt 7:14cfb0df30e6 469 int r6;
el15pjt 7:14cfb0df30e6 470 int r7;
el15pjt 7:14cfb0df30e6 471 int offset; // create suitable variables to store the data in the file
el15pjt 7:14cfb0df30e6 472 float bright;
el15pjt 7:14cfb0df30e6 473 float dummy = 1000.0F/i; // dummy variable
el15pjt 7:14cfb0df30e6 474 fprintf(fp, "%d,%f\n",i,dummy); // print formatted string to file (CSV)
el15pjt 7:14cfb0df30e6 475 }
el15pjt 7:14cfb0df30e6 476 serial.printf("Done.\n");
el15pjt 7:14cfb0df30e6 477 fclose(fp); // ensure you close the file after writing
el15pjt 7:14cfb0df30e6 478 }
el15pjt 7:14cfb0df30e6 479
el15pjt 7:14cfb0df30e6 480 // you can comment out the writing example to check that the writing has
el15pjt 7:14cfb0df30e6 481 // worked - when you run it after commenting, it should still open the
el15pjt 7:14cfb0df30e6 482 // file that exists on the SD card - assuming you didn't delete it!
el15pjt 7:14cfb0df30e6 483 */
el15pjt 5:083d484e95a1 484 return;
el15pjt 5:083d484e95a1 485 }
el15pjt 4:673930f04866 486 }
el15pjt 5:083d484e95a1 487 }
el15pjt 5:083d484e95a1 488 void submenu()
el15pjt 5:083d484e95a1 489 {
el15pjt 7:14cfb0df30e6 490
el15pjt 5:083d484e95a1 491 while(1) {
el15pjt 7:14cfb0df30e6 492 /// innterupt used to shift page
el15pjt 5:083d484e95a1 493 if (g_sw1_flag) {
el15pjt 5:083d484e95a1 494 g_sw1_flag = 0;
el15pjt 5:083d484e95a1 495 subpage++;
el15pjt 5:083d484e95a1 496 }
el15pjt 5:083d484e95a1 497 switch (subpage) {
el15pjt 7:14cfb0df30e6 498 ///interupt used to adjust range
el15pjt 5:083d484e95a1 499 case 0:
el15pjt 5:083d484e95a1 500 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 501 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 502 if (r2 == r3) {
el15pjt 5:083d484e95a1 503 r2 = 1;
el15pjt 5:083d484e95a1 504 } else {
el15pjt 5:083d484e95a1 505 r2 = r2+1;
el15pjt 5:083d484e95a1 506 }
el15pjt 5:083d484e95a1 507 }
el15pjt 5:083d484e95a1 508 length2 = sprintf(buffer1,"*****MENU*****");
el15pjt 5:083d484e95a1 509 length3 = sprintf(buffer2,"RANGE");
el15pjt 5:083d484e95a1 510 length3 = sprintf(buffer3,"PARAMETERS");
el15pjt 5:083d484e95a1 511 length4 = sprintf(buffer4,"1Cm to %iCm",r2);
el15pjt 8:fe6ebe807b9d 512 sprintf(buffer,"NEXT ADJ");
el15pjt 5:083d484e95a1 513 lcd.printString(buffer1,0,0);
el15pjt 5:083d484e95a1 514 lcd.printString(buffer2,0,1);
el15pjt 5:083d484e95a1 515 lcd.printString(buffer3,0,2);
el15pjt 5:083d484e95a1 516 lcd.printString(buffer4,0,3);
el15pjt 7:14cfb0df30e6 517 lcd.printString(buffer,0,5);
el15pjt 5:083d484e95a1 518 break;
el15pjt 5:083d484e95a1 519
el15pjt 5:083d484e95a1 520 case 1:
el15pjt 5:083d484e95a1 521
el15pjt 5:083d484e95a1 522 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 523 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 524 if (r3 == r4) {
el15pjt 5:083d484e95a1 525 r3 = r2;
el15pjt 5:083d484e95a1 526 } else {
el15pjt 5:083d484e95a1 527 r3 += 1;
el15pjt 5:083d484e95a1 528 }
el15pjt 5:083d484e95a1 529 }
el15pjt 5:083d484e95a1 530
el15pjt 7:14cfb0df30e6 531 sprintf(buffer1,"*****MENU*****");
el15pjt 7:14cfb0df30e6 532 sprintf(buffer2,"RANGE");
el15pjt 7:14cfb0df30e6 533 sprintf(buffer3,"PARAMETERS");
el15pjt 7:14cfb0df30e6 534 sprintf(buffer4,"%iCm to %iCm",r2,r3);
el15pjt 8:fe6ebe807b9d 535 sprintf(buffer,"NEXT ADJ");
el15pjt 5:083d484e95a1 536 lcd.printString(buffer1,0,0);
el15pjt 5:083d484e95a1 537 lcd.printString(buffer2,0,1);
el15pjt 5:083d484e95a1 538 lcd.printString(buffer3,0,2);
el15pjt 5:083d484e95a1 539 lcd.printString(buffer4,0,3);
el15pjt 7:14cfb0df30e6 540 lcd.printString(buffer,0,5);
el15pjt 5:083d484e95a1 541 break;
el15pjt 5:083d484e95a1 542
el15pjt 5:083d484e95a1 543 case 2:
el15pjt 5:083d484e95a1 544
el15pjt 5:083d484e95a1 545 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 546 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 547 if (r4 == r5) {
el15pjt 5:083d484e95a1 548 r4 = r3;
el15pjt 5:083d484e95a1 549 } else {
el15pjt 5:083d484e95a1 550 r4 += 1;
el15pjt 5:083d484e95a1 551 }
el15pjt 5:083d484e95a1 552 }
el15pjt 5:083d484e95a1 553
el15pjt 7:14cfb0df30e6 554 sprintf(buffer1,"*****MENU*****");
el15pjt 7:14cfb0df30e6 555 sprintf(buffer2,"RANGE");
el15pjt 7:14cfb0df30e6 556 sprintf(buffer3,"PARAMETERS");
el15pjt 7:14cfb0df30e6 557 sprintf(buffer4,"%iCm to %iCm",r3,r4);
el15pjt 8:fe6ebe807b9d 558 sprintf(buffer,"NEXT ADJ");
el15pjt 5:083d484e95a1 559 lcd.printString(buffer1,0,0);
el15pjt 5:083d484e95a1 560 lcd.printString(buffer2,0,1);
el15pjt 5:083d484e95a1 561 lcd.printString(buffer3,0,2);
el15pjt 5:083d484e95a1 562 lcd.printString(buffer4,0,3);
el15pjt 7:14cfb0df30e6 563 lcd.printString(buffer,0,5);
el15pjt 5:083d484e95a1 564 break;
el15pjt 5:083d484e95a1 565
el15pjt 5:083d484e95a1 566 case 3:
el15pjt 5:083d484e95a1 567
el15pjt 5:083d484e95a1 568 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 569 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 570 if (r5 == r6) {
el15pjt 5:083d484e95a1 571 r5 = r4;
el15pjt 5:083d484e95a1 572 } else {
el15pjt 5:083d484e95a1 573 r5 += 1;
el15pjt 5:083d484e95a1 574 }
el15pjt 5:083d484e95a1 575 }
el15pjt 5:083d484e95a1 576
el15pjt 7:14cfb0df30e6 577 sprintf(buffer1,"*****MENU*****");
el15pjt 7:14cfb0df30e6 578 sprintf(buffer2,"RANGE");
el15pjt 7:14cfb0df30e6 579 sprintf(buffer3,"PARAMETERS");
el15pjt 7:14cfb0df30e6 580 sprintf(buffer4,"%iCm to %iCm",r4,r5);
el15pjt 8:fe6ebe807b9d 581 sprintf(buffer,"NEXT ADJ");
el15pjt 5:083d484e95a1 582 lcd.printString(buffer1,0,0);
el15pjt 5:083d484e95a1 583 lcd.printString(buffer2,0,1);
el15pjt 5:083d484e95a1 584 lcd.printString(buffer3,0,2);
el15pjt 5:083d484e95a1 585 lcd.printString(buffer4,0,3);
el15pjt 7:14cfb0df30e6 586 lcd.printString(buffer,0,5);
el15pjt 5:083d484e95a1 587 break;
el15pjt 5:083d484e95a1 588 case 4:
el15pjt 5:083d484e95a1 589
el15pjt 5:083d484e95a1 590 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 591 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 592 if (r6 == r7) {
el15pjt 5:083d484e95a1 593 r6 = r5;
el15pjt 5:083d484e95a1 594 } else {
el15pjt 5:083d484e95a1 595 r6 += 1;
el15pjt 5:083d484e95a1 596 }
el15pjt 5:083d484e95a1 597 }
el15pjt 5:083d484e95a1 598
el15pjt 5:083d484e95a1 599 length2 = sprintf(buffer1,"*****MENU*****");
el15pjt 5:083d484e95a1 600 length3 = sprintf(buffer2,"RANGE");
el15pjt 5:083d484e95a1 601 length3 = sprintf(buffer3,"PARAMETERS");
el15pjt 6:b464a8a94d91 602 length3 = sprintf(buffer4,"%iCm to %iCm",r5,r6);
el15pjt 8:fe6ebe807b9d 603 sprintf(buffer,"NEXT ADJ");
el15pjt 5:083d484e95a1 604 lcd.printString(buffer1,0,0);
el15pjt 5:083d484e95a1 605 lcd.printString(buffer2,0,1);
el15pjt 5:083d484e95a1 606 lcd.printString(buffer3,0,2);
el15pjt 5:083d484e95a1 607 lcd.printString(buffer4,0,3);
el15pjt 7:14cfb0df30e6 608 lcd.printString(buffer,0,5);
el15pjt 5:083d484e95a1 609 break;
el15pjt 5:083d484e95a1 610 case 5:
el15pjt 5:083d484e95a1 611
el15pjt 5:083d484e95a1 612 if (g_sw2_flag) {
el15pjt 5:083d484e95a1 613 g_sw2_flag = 0; // if it has, clear the flag
el15pjt 5:083d484e95a1 614 if (r7 == 300) {
el15pjt 5:083d484e95a1 615 r7 = r6;
el15pjt 5:083d484e95a1 616 } else {
el15pjt 5:083d484e95a1 617 r7 += 1;
el15pjt 5:083d484e95a1 618 }
el15pjt 5:083d484e95a1 619 }
el15pjt 5:083d484e95a1 620
el15pjt 5:083d484e95a1 621 length2 = sprintf(buffer1,"*****MENU*****");
el15pjt 5:083d484e95a1 622 length3 = sprintf(buffer2,"RANGE");
el15pjt 5:083d484e95a1 623 length3 = sprintf(buffer3,"PARAMETERS");
el15pjt 8:fe6ebe807b9d 624 sprintf(buffer,"NEXT ADJ");
el15pjt 6:b464a8a94d91 625 length3 = sprintf(buffer4,"%iCm to %iCm",r6,r7);
el15pjt 5:083d484e95a1 626 lcd.printString(buffer1,0,0);
el15pjt 5:083d484e95a1 627 lcd.printString(buffer2,0,1);
el15pjt 5:083d484e95a1 628 lcd.printString(buffer3,0,2);
el15pjt 5:083d484e95a1 629 lcd.printString(buffer4,0,3);
el15pjt 7:14cfb0df30e6 630 lcd.printString(buffer,0,5);
el15pjt 5:083d484e95a1 631 break;
el15pjt 5:083d484e95a1 632
el15pjt 5:083d484e95a1 633 default:
el15pjt 5:083d484e95a1 634 lcd.clear();
el15pjt 7:14cfb0df30e6 635 // save();
el15pjt 5:083d484e95a1 636 return;
el15pjt 5:083d484e95a1 637 }
el15pjt 5:083d484e95a1 638 }
el15pjt 7:14cfb0df30e6 639 }
el15pjt 7:14cfb0df30e6 640 void setup()
el15pjt 7:14cfb0df30e6 641 {
el15pjt 7:14cfb0df30e6 642 ticker.attach(&timer_isr_led,0.35); /// Attach the ticker for the flashig LEDs
el15pjt 7:14cfb0df30e6 643 ticker_srf02.attach(&timer_isr_srf02,0.1); /// Attach the ticker for collecting a range reading
el15pjt 8:fe6ebe807b9d 644 // ticker_tone.attach(&timer_isr_tone,0.1); /// Attach the ticker which controls the off time of the buzzer 0.1 = 10 beats per second
el15pjt 7:14cfb0df30e6 645 ticker_standby.attach(&timer_isr_standby,3.0);
el15pjt 7:14cfb0df30e6 646 sw1.rise(&sw1_isr); /// sw1_isr called when button presed on the rising edge
el15pjt 7:14cfb0df30e6 647 sw2.rise(&sw2_isr); /// sw2_isr called when button presed on the rising edge
el15pjt 7:14cfb0df30e6 648
el15pjt 8:fe6ebe807b9d 649
el15pjt 8:fe6ebe807b9d 650 r_led = 1;
el15pjt 8:fe6ebe807b9d 651 b_led = 1;
el15pjt 8:fe6ebe807b9d 652 g_led = 1;
el15pjt 7:14cfb0df30e6 653 rr_led = 0;
el15pjt 7:14cfb0df30e6 654 a_led = 0;
el15pjt 7:14cfb0df30e6 655 gg_led = 0;
el15pjt 7:14cfb0df30e6 656 sw2.mode(PullDown);
el15pjt 7:14cfb0df30e6 657 sw1.mode(PullDown);
el15pjt 5:083d484e95a1 658 }