ELEC2645 (2015/16) / Mbed 2 deprecated EL15PJT_Ranger

Dependencies:   N5110 SDFileSystem SRF02 TMP102 mbed

Fork of Ranger by Philip Thompson

main.h

Committer:
el15pjt
Date:
2016-04-27
Revision:
8:fe6ebe807b9d
Parent:
7:14cfb0df30e6
Child:
9:bc259fc22fa2

File content as of revision 8:fe6ebe807b9d:

/**
@file main.h
@brief Header file containing functions prototypes, defines and global variables.
@brief Ranger Project
@brief Revision 1.0.
@author Philip Thompson
@date   March 2016
@brief The following code has been writen for the University of Leeds ELEC264501 embedded system project and is intended to
create a programe that can read a distance from an SRF02 sensor and then based aponn the reading disply the distance on the screen
 and increment the LEDs and buzzer according the provision of a temperature sensor is also provied as a secondary function when no
 object is detected with in range.
*/

#ifndef MAIN_H
#define MAIN_H
#include "mbed.h"
#include "mbed.h"
#include "SRF02.h"
#include "N5110.h"
#include "TMP102.h"
#include "SDFileSystem.h"

#define LOW 0 /// No output
#define HIGH 1 /// High output
#define METRIC 1
#define IMPERIAL 0



/**
@namespace LEDs
@brief Output for Alert LEDs
*/
DigitalOut rr_led (PTA1);
DigitalOut a_led (PTC2);
DigitalOut gg_led(PTB23);

/**
@namespace BOARDLEDs
@brief On board LEDs
*/
DigitalOut r_led(LED_RED);
DigitalOut g_led(LED_GREEN);
DigitalOut b_led(LED_BLUE);

/**
@namespace  Buzzer
@brief PWM output for Buzzer
*/
PwmOut buzzer(PTA2);

/**
@namespace  Buttons
@brief Button triggered Interrupts
*/
InterruptIn sw1(PTB19);
InterruptIn sw2(PTB18);

/**
@namespace  Timers
@brief Tickers and Timeouts
*/
Ticker ticker;
Ticker ticker_srf02;
//Ticker ticker_tone;
Ticker ticker_standby;
Timeout buzzoff;
Timeout buzzon;

// Create TMP102 object
TMP102 tmp102(I2C_SDA,I2C_SCL);

/**
@namespace  Ranger
@brief Creat the Ranger object
*/
SRF02 srf02(I2C_SDA,I2C_SCL);

/**
@namespace  LCD
@brief Creats the LCD object
*/
N5110           lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3);

/// Connections to SD card holder on K64F (SPI interface)
SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
FILE *fp;
/**
@namespace  TimerFlags
@brief Flags for use with timed interupts
*/
volatile int g_timer_flag_led = 0, g_timer_flag_srf02 = 0,  g_timer_flag_tone = 0; /** Flag rised by interupts*/
volatile int g_timer_flag_standby = 0;
volatile int buzz_flag = 0;
/**
@namespace  ButtonFlages
@brief Flags for use with button interupts
*/
volatile int g_sw1_flag = 0, g_sw2_flag = 0;

/**
@namespace  RangePresets
@brief Preset range of the differant alert levels
*/
int r1 = 3,/*!< Upper limit of alert 1 */r2 = 10,/*!< Upper limit of alert 2 */r3 = 20,/*!< Upper limit of alert 3 */r4 = 30,/*!< Upper limit of alert 4 */r5 = 40,/*!< Upper limit of alert 5 */r6 = 50,/*!< Upper limit of alert 6 */r7 = 60; /*!< Upper limit of alert 7 */
float avgdistance;
int subpage; /*!< veriable to hold the page being viewed with in the submenu  */
int page;/*!< veriable to hold the page being viewed with in the menu */
int offset = 0;/*!< veriable to hold the offset and adjust the 0 Range point */
int alert;/*!< veriable to hold the current alert level */
int distance;/*!< veriable to hold the distance read from the srf02 sensor */
float bright = 1;/*!< veriable to hold the current LED backlight of the 5110 LCD */
char units = METRIC;/*!< veriable to hold the current unit type set to METRIC as default */
int length, length1, length2, length3, length4;
char buffer[14], buffer1[14], buffer2[14], buffer3[14], buffer4[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
float T;
int standby = 1;
float c =1; /// convertion factor from Cm to inch
int check_flag = 0;


struct Alertlevel {
    char srr_led;  /// stead RED LED state
    char sa_led;    /// stead AMBER LED state
    char sgg_led;  /// stead GREEN LED state
    char frr_led;///FLASHING RED LED state
    char fa_led; ///FLASHING AMBER LED state
    char fgg_led; ///FLASHING GREEN LED state
    float toneon;
    float toneoff;
}; /*!< Stucture to hold all outputs. Steady LEDs, Flashing LEDs, Tone on, Tonne off*/
typedef const struct Alertlevel STyp;

STyp Alertlevel[8] = {
    {LOW,LOW,LOW,LOW,LOW,LOW,0,1}, // no output
    {LOW,LOW,LOW,LOW,LOW,HIGH,0.1,0.9}, //flash green
    {LOW,LOW,HIGH,LOW,LOW,LOW,0.1,0.5}, //steady green
    {LOW,LOW,HIGH,LOW,HIGH,LOW,0.1,0.3}, //flash amber
    {LOW,HIGH,HIGH,LOW,LOW,LOW,0.2,0.2}, //steady amber
    {LOW,HIGH,HIGH,HIGH,LOW,LOW,0.2,0.1}, //flash red
    {HIGH,HIGH,HIGH,LOW,LOW,LOW,0.1,0.1},// steady red
    {LOW,LOW,LOW,HIGH,HIGH,HIGH,1,0} // all flash
};/*!< Array contaning structures for diffent outputs */

void flip();
void buzzflag();


/** Controls the LCD while not in a Menu  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
@code
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:
                if (check_flag == 1) {
                    sprintf(buffer4,"COLLISIONCHECK");
                }
                lcd.clear();
                sprintf(buffer,"**PATH CLEAR**");
                lcd.printString(buffer,0,0);
                lcd.printString(buffer4,0,5);
                lcd.refresh();
                break;
            case 2:
                if (check_flag == 1) {
                    sprintf(buffer4,"COLLISIONCHECK");
                    lcd.clear();
                    sprintf(buffer3,"TEMP = %.2f",T);
                    sprintf(buffer2,"TEMPERATER");
                    lcd.printString(buffer3,4,2);
                    lcd.printString(buffer2,12,1);
                    lcd.printString(buffer4,0,5);

                    break;
                case 3:
                    if (check_flag == 1) {
                        sprintf(buffer4,"COLLISIONCHECK");
                        lcd.clear();
                        sprintf(buffer3,"TEMP = %.2f",T);
                        sprintf(buffer2,"TEMPERATER");
                        lcd.refresh();
                        lcd.printString(buffer3,4,2);
                        lcd.printString(buffer2,12,1);
                        lcd.printString(buffer4,0,5);
                        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,"%0.2f Cm",avgdistance);
                        sprintf(buffer1,"****RANGE!****");
                        sprintf(buffer2,"DISTANCE");

                        sprintf(buffer4,"Menu");

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


                    float h = (r7/84);
                    float distbar = (avgdistance*h);
                    //drawRect(int x0,int y0,int width,int height,int fill);
                    lcd.drawRect(0,29,distbar,7,1); //
                    lcd.refresh();
@endcode
*/
void lcdoutput();

void timer_isr_led();
void timer_isr_srf02();
void timer_isr_tone();
void timer_isr_standby();

/** Called to increment to brightness by 0.2 each time when at 1 resets back to 0.0
@param bright 0.0-1
@returns lcd.setbrightness
@code
if (bright == 1.0) {
    bright = 0;
} else {
    bright += 0.2;
}
lcd.setBrightness(bright);
@endcode
*/
void backlight();
void Getdistance();
void init_K64F();
void sw2_isr();
void sw1_isr();
void setup();

/** 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
@code
if (distance >= r6 && distance < r7) {  // r6 150 and r7 200
    alert = 1; /// alert 1 distance between preset 150Cm to 200Cm
} else if (distance >= r5 && distance  < r6) {
    alert = 2; /// alert 2 when between preset 90Cm to 150Cm
} else if (distance >= r4 && distance < r5) {
    alert = 3; /// alert 3 when distance between 60Cm to 90Cm
} else if (distance >= r3 && distance < r4) {
    alert = 4; /// alert 4 when distance between 40Cm and 60Cm
} else if ( distance > r2 && distance < r3) {
    alert = 5; ///alert 5 when distance between 20Cm and 40m
} else if (distance > r1 && distance <= r2) { //r1 3 and r2 20
    alert = 6; ///alert 6 when distance between 1 and 20
} else if (distance <=r1) {
    alert = 7; ///alert 7 when distance below 1Cm
} else {
    alert = 0; /// alert 0 all else
}
}
@endcode
*/
void setalert();
/** If statments to determine the output of each LED by inspecting the struct in the relevent element of the alertlevel array

@code
   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;
   }

}
@endcode*/
void setleds();
void setbuzzer();


void menu();
/**
{
     Function called to invoke a menu within a while loop with button interupts used to move pages and adjust within a switch statment
    @param g_sw1_flag 0 or 1 used to advance page
    @param g_sw2_flag 0 or 1 used to adjust current item
    @code
    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);
                    lcd.printString(buffer2,0,0);
                    lcd.printString(buffer1,0,1);
                    lcd.printString(buffer3,0,2);
                    lcd.drawRect(0,38,lightbar,7,1);
                    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);
                    lcd.printString(buffer2,0,0);
                    lcd.printString(buffer1,0,1);
                    lcd.printString(buffer3,0,2);
                    lcd.refresh();
                }

                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;
                    }
                }
                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");
                lcd.printString(buffer2,0,0);
                lcd.printString(buffer1,0,1);
                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");
                lcd.printString(buffer3,0,0);
                lcd.printString(buffer1,0,1);
                lcd.printString(buffer2,0,2);


                break;

            default:
                lcd.clear();
                return;
        }
    }
    @endcode
    */
void menu();
/**
@code
   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);
            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;
                }
            }

            sprintf(buffer1,"*****MENU*****");
            sprintf(buffer2,"RANGE");
            sprintf(buffer3,"PARAMETERS");
            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;
                }
            }

            sprintf(buffer1,"*****MENU*****");
            sprintf(buffer2,"RANGE");
            sprintf(buffer3,"PARAMETERS");
            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;
                }
            }

            sprintf(buffer1,"*****MENU*****");
            sprintf(buffer2,"RANGE");
            sprintf(buffer3,"PARAMETERS");
            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();
            //  save();
            return;
    }
}
}
@endcode
*/
void submenu();
void save();
void load();
void GetDistance();

#endif