Level 2 Project Range Device

Dependencies:   N5110 SDFileSystem SRF02 TMP102 mbed

main.cpp

Committer:
el15pjt
Date:
2016-04-25
Revision:
7:14cfb0df30e6
Parent:
6:b464a8a94d91
Child:
8:fe6ebe807b9d

File content as of revision 7:14cfb0df30e6:


/**
@file main.cpp
@brief Program implementation
*/

#include "main.h"
#include "SDFileSystem.h"
Serial serial(USBTX, USBRX);  // for PC debug


int main()
{
    setup();
    lcd.init(); // Initiate LCD
    /*
        sprintf(buffer,"ELEC 2645");
        sprintf(buffer1,"Project Ranger");
        sprintf(buffer2,"Phil Thompson");
        sprintf(buffer3,"SID 200971914 ");
        lcd.printString(buffer,0,0);
        lcd.printString(buffer1,0,1);
        lcd.printString(buffer2,0,2);
        lcd.printString(buffer3,0,3);
        wait (3);
        */
    /*
    serial.baud(115200);  // full-speed!
    serial.printf("#### SD Card Example #####\n");
    FILE *fp; // this is our file pointer
    wait(1);
    {
       /////////////////////// Reading from file example ////////////////////////

       // now open file for reading...note the 'r'
       fp = fopen("/sd/settings.txt", "r");
       if (fp == NULL) {  // if it can't open the file then print error message
           serial.printf("Error! Unable to open file!\n");
       } else {
           serial.printf("Reading file....\n");
           int r1;
           int r2;
           int r3;
           int r4;
           int r5;
           int r6;
           int r7;
           int offset; // create suitable variables to store the data in the file
           float bright;
           float value;
           int i;

           // in this example, we keep reading (using fscanf) until we reach
           // the 'end of file'. Note we use the address operator & to write
           // to the variables. Also the format of the string must match what
           // is in the file
           while (fscanf(fp, "%d,%f", &i, &value) != EOF) {
               serial.printf("%d,%f\n",i,value);
           }
           serial.printf("Done.\n");
           fclose(fp);  // ensure you close the file after reading
       }
    }
    */
    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();
                distance = distance-(offset*c);
            } else {
                distance = srf02.getDistannceInch();
                distance = distance -(offset*c);
            }








            if (d == 9) {
                d = 0;
            } else {
                d++;
            }
            myarray[d] = distance;
            totaldistance = 0;
            for (i = 0; i < 10; i++) {
                totaldistance = totaldistance+myarray[i];
            }
            avgdistance = totaldistance;
        }








        setalert();
        lcdoutput();
        setbuzzer();
        setleds();
        sleep();
    }
}

void lcdoutput()
{
    /**
    Function called to print to the LCD display
    @param i used to scale the max distaance to the width of the screen
    @param distance Distance read from sensor to be dispayed
    @param distbar used to adjust how far along the screen the bar is to go acorrding to distance
    */

    // if alert == 0 no need to display range path is clear
    if (alert == 0) {
        if (g_timer_flag_standby) {
            g_timer_flag_standby = 0;
            T = tmp102.get_temperature();
            standby++;
            if (standby >3) {
                standby = 3;
            }
        }

        switch (standby) {
            case 1:
                lcd.clear();
                sprintf(buffer,"**PATH CLEAR**");
                lcd.printString(buffer,0,0);
                lcd.refresh();
                break;
            case 2:
                lcd.clear();
                sprintf(buffer3,"TEMP = %.2f",T);
                sprintf(buffer2,"TEMPERATER");
                lcd.printString(buffer3,4,3);
                lcd.printString(buffer2,12,2);
                break;
            case 3:
                lcd.clear();
                sprintf(buffer3,"TEMP = %.2f",T);
                sprintf(buffer2,"TEMPERATER");
                lcd.refresh();
                lcd.printString(buffer3,4,3);
                lcd.printString(buffer2,12,2);
                lcd.setBrightness(0);
                break;
        }
    }

    //If alert isn't 0 then the distance is to be dispayed alonng with the the distance bar
    else {
        lcd.setBrightness(bright);
        standby =0;
        lcd.clear();

        if (units == METRIC) {
            sprintf(buffer,"%i Cm",distance);
            sprintf(buffer1,"****RANGE!****");
            sprintf(buffer2,"DISTANCE");
            sprintf(buffer3,"%0.2f",avgdistance);
            sprintf(buffer4,"Menu");

        } else {
            sprintf(buffer,"%i Inches",distance);
            sprintf(buffer1,"****RANGE!****");
            sprintf(buffer2,"***DISTANCE***");
            sprintf(buffer2,"Menu");
        }
        lcd.printString(buffer,25,2);
        lcd.printString(buffer1,0,0);
        lcd.printString(buffer2,16,1);
        lcd.printString(buffer4,0,5);
        lcd.printString(buffer3,0,3);

        float i = (r7/84);
        float distbar = (distance*i);
        //drawRect(int x0,int y0,int width,int height,int fill);
        lcd.drawRect(0,29,distbar,7,1); //    MOVE BAR UP!!!!!!!!!!!!!!!!!!!!!!!!!
        lcd.refresh();

    }

}

void setalert()
{
    /** A fuction used to determin the alert level given a range with the use of IF statments
    @param distance The distance read from sensor
    @param alert The level that distance falls with in 0 -7
    @returns alert
    */

    if (distance >= (r6*c) && distance < (r7*c)) {  // r6 150 and r7 200
        alert = 1; /// alert 1 distance between preset 150Cm to 200Cm
    } else if (distance >= (r5*c) && distance  < (r6*c)) {
        alert = 2; /// alert 2 when between preset 90Cm to 150Cm
    } else if (distance >= (r4*c) && distance < (r5*c)) {
        alert = 3; /// alert 3 when distance between 60Cm to 90Cm
    } else if (distance >= (r3*c) && distance < (r4*c)) {
        alert = 4; /// alert 4 when distance between 40Cm and 60Cm
    } else if (distance >= (r2*c) && distance < (r3*c)) {
        alert = 5; ///alert 5 when distance between 20Cm and 40m
    } else if (distance >= (r1*c) && distance <= (r2*c)) { //r1 3 and r2 20
        alert = 6; ///alert 6 when distance between 1 and 20
    } else if (distance <=(r1*c)) {
        alert = 7; ///alert 7 when distance below 1Cm
    } else {
        alert = 0; /// alert 0 all else
    }
}

void setleds()
{
    if (alert ==7) {
        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()
{
    int beat;
    /**
    control the PWM to drive the buzzer
    @param buzzer.period frequncy 1KHz
    @param buzzer duty cycle equal on/off max volume
    @param Alertlevel[alert].toneon controls how long the tone will last depending on alert
    */
    if (g_timer_flag_tone) {
        g_timer_flag_tone = 1;
        if (beat == 10) {
            beat = 0;
        } else {
            beat++;
        }



        if (Alertlevel[alert].toneon < beat) {
            buzzer.period (1/10000);
            buzzer = 0.5;
        } else {
            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 by button 2 @param g_sw2_flag 0 or 1*/
}

void sw1_isr()
{
    g_sw1_flag = 1;   /** set flag in ISR by button 2 @param g_sw1_flag 0 or 1*/
}

void timer_isr_led()
{
    g_timer_flag_led = 1;   /** set flag in ISR by timer_isr_led @param g_timer_flag_led 0 or 1 */
}

void timer_isr_srf02()
{
    g_timer_flag_srf02 = 1;   /** set flag in ISR by ticker_srf02 @param g_timer_flag_srf02 0 or 1 */
}

void timer_isr_tone()
{
    g_timer_flag_tone = 1; /** set flag in ISR by ticker_tone @param g_timer_flag_tone 0 or 1 */
}
void timer_isr_standby()
{
    g_timer_flag_standby = 1; /** set flag in ISR by ticker_tone @param g_timer_flag_tone 0 or 1 */
}

void menu()
{
    while(1) {


        if (g_sw1_flag) {
            g_sw1_flag = 0;
            page++; /// Moves 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;
                    sprintf(buffer2,"*****MENU*****");
                    sprintf(buffer1,"BACKLIGHT");
                    sprintf(buffer3,"%.0f%%",bright*100);
                    sprintf(buffer4,"Next       Adj");
                    lcd.printString(buffer2,0,0);
                    lcd.printString(buffer1,0,1);
                    lcd.printString(buffer3,0,2);
                    lcd.printString(buffer4,0,5);
                    lcd.drawRect(0,26,lightbar,7,1);  // move bar up!!!!!!!!!!!!!!!!
                    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);
                    sprintf(buffer4,"Next       Adj");
                    lcd.printString(buffer2,0,0);
                    lcd.printString(buffer1,0,1);
                    lcd.printString(buffer3,0,2);
                    lcd.printString(buffer4,0,5);
                    lcd.refresh();
                }

                break;

            case 2:
                if (g_sw2_flag) {
                    g_sw2_flag = 0;  // if it has, clear the flag
                    if (units == METRIC) {
                        units = IMPERIAL;
                        c= 0.3937;
                    } else {
                        units = METRIC;
                        c = 1;
                    }
                }
                if (units == METRIC) {
                    sprintf(buffer3,"METRIC");
                    lcd.printString(buffer3,0,2);
                } else {
                    sprintf(buffer3,"IMPERIAL");
                    lcd.printString(buffer3,0,2);
                }
                sprintf(buffer2,"*****MENU*****");
                sprintf(buffer1,"UNITS");
                sprintf(buffer4,"Next       Adj");
                lcd.printString(buffer2,0,0);
                lcd.printString(buffer1,0,1);
                lcd.printString(buffer4,0,5);
                lcd.refresh();

                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");
                sprintf(buffer4,"Next       Adj");
                lcd.printString(buffer3,0,0);
                lcd.printString(buffer1,0,1);
                lcd.printString(buffer2,0,2);
                lcd.printString(buffer4,0,5);

                break;

            default:
                lcd.clear();
                /*   //save();

                ///////////////////// Writing list to file example //////////////////////

                   // for this example, I'll create some numbers to write to file in a big list
                   // a data logger for example will usually append to a file - at a reading
                   // at the end rather than creating a new file
                   fp = fopen("/sd/settinngs.txt", "a");

                   if (fp == NULL) {  // if it can't open the file then print error message
                       serial.printf("Error! Unable to open file!\n");
                   } else {  // opened file so can write
                       serial.printf("Writing to file....");
                       for(int i = 1; i <= 50; i++) {
                           int r1;
                           int r2;
                           int r3;
                           int r4;
                           int r5;
                           int r6;
                           int r7;
                           int offset; // create suitable variables to store the data in the file
                           float bright;
                           float dummy = 1000.0F/i;  // dummy variable
                           fprintf(fp, "%d,%f\n",i,dummy);  // print formatted string to file (CSV)
                       }
                       serial.printf("Done.\n");
                       fclose(fp);  // ensure you close the file after writing
                   }

                   // you can comment out the writing example to check that the writing has
                   // worked - when you run it after commenting, it should still open the
                   // file that exists on the SD card - assuming you didn't delete it!
                */
                return;
        }
    }
    // lcd.refresh();

}
void submenu()
{

    while(1) {
        /// innterupt used to shift page
        if (g_sw1_flag) {
            g_sw1_flag = 0;
            subpage++;
        }
        switch (subpage) {
                ///interupt used to adjust range
            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);
                sprintf(buffer,"Next       Adj");
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                lcd.printString(buffer,0,5);
                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;
                    }
                }

                sprintf(buffer1,"*****MENU*****");
                sprintf(buffer2,"RANGE");
                sprintf(buffer3,"PARAMETERS");
                sprintf(buffer4,"%iCm  to  %iCm",r2,r3);
                sprintf(buffer,"Next       Adj");
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                lcd.printString(buffer,0,5);
                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;
                    }
                }

                sprintf(buffer1,"*****MENU*****");
                sprintf(buffer2,"RANGE");
                sprintf(buffer3,"PARAMETERS");
                sprintf(buffer4,"%iCm  to  %iCm",r3,r4);
                sprintf(buffer,"Next       Adj");
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                lcd.printString(buffer,0,5);
                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;
                    }
                }

                sprintf(buffer1,"*****MENU*****");
                sprintf(buffer2,"RANGE");
                sprintf(buffer3,"PARAMETERS");
                sprintf(buffer4,"%iCm to %iCm",r4,r5);
                sprintf(buffer,"Next       Adj");
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                lcd.printString(buffer,0,5);
                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);
                sprintf(buffer,"Next       Adj");
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                lcd.printString(buffer,0,5);
                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");
                sprintf(buffer,"Next       Adj");
                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);
                lcd.printString(buffer,0,5);
                break;

            default:
                lcd.clear();
                //  save();
                return;
        }
    }
}
void setup()
{
    ticker.attach(&timer_isr_led,0.35); /// Attach the ticker for the flashig LEDs
    ticker_srf02.attach(&timer_isr_srf02,0.1); /// Attach the ticker for collecting a range reading
    ticker_tone.attach(&timer_isr_tone,1); /// Attach the ticker which controls the off time of the buzzer 0.1 = 10 beats per second
    ticker_standby.attach(&timer_isr_standby,3.0);
    sw1.rise(&sw1_isr); /// sw1_isr called when button presed on the rising edge
    sw2.rise(&sw2_isr); /// sw2_isr called when button presed on the rising edge

    /**Set up LEDs switches and LEDS
    @param r_led 1 or 0
    @param g_led 1 or 0
    @param b_led 1 or 0
    */
    rr_led = 0;
    a_led = 0;
    gg_led = 0;
    sw2.mode(PullDown);
    sw1.mode(PullDown);
}