Level 2 Project Range Device

Dependencies:   N5110 SDFileSystem SRF02 TMP102 mbed

Fork of Ranger by Philip Thompson

main.cpp

Committer:
el15pjt
Date:
2016-04-15
Revision:
6:b464a8a94d91
Parent:
5:083d484e95a1
Child:
7:14cfb0df30e6

File content as of revision 6:b464a8a94d91:

/*
Philip Thompsonn
EL15PJT
Embedded System Project
EL2645
*/

#include "mbed.h"
#include "SRF02.h"
#include "N5110.h"

#define LOW 0
#define HIGH 1
#define METRIC 1
#define IMPERIAL 0

DigitalOut rr_led (PTA1);
DigitalOut a_led (PTC2);
DigitalOut gg_led(PTB23);
PwmOut buzzer(PTA2);

// Ranger object
SRF02 srf02(I2C_SDA,I2C_SCL);

//N5110 Object  VCC, SCE,RST, D/C, MOSI,SCLK, LED
N5110           lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3);

Ticker ticker;
Ticker ticker_srf02;
Ticker ticker_tone;
Timeout buzzoff;

// K64F on-board LEDs
DigitalOut r_led(LED_RED);
DigitalOut g_led(LED_GREEN);
DigitalOut b_led(LED_BLUE);

// K64F on-board switches
InterruptIn sw1(SW2);
InterruptIn sw2(SW3);

volatile int g_timer_flag_led = 0;
volatile int g_timer_flag_srf02 = 0;
volatile int g_timer_flag_tone = 0;
volatile int g_sw1_flag = 0;
volatile int g_sw2_flag = 0;

int r1 = 3;
int r2 = 20;
int r3 = 40;
int r4 = 60;
int r5 = 80;
int r6 = 100;
int r7 = 120;

int subpage;
int page;
int offset = 0;
int alert;
int distance;
float bright = 1;
char units = METRIC;

// struct for state
struct Alertlevel {
    char srr_led;  // output value
    char sa_led;    // time in state
    char sgg_led;  // array of next states
    char frr_led;
    char fa_led;
    char fgg_led;
    float toneon;
    float toneoff;
};
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.05,1}, //flash green
    {LOW,LOW,HIGH,LOW,LOW,LOW,0.1,1}, //steady green
    {LOW,LOW,HIGH,LOW,HIGH,LOW,0.2,0.5}, //flash amber
    {LOW,HIGH,HIGH,LOW,LOW,LOW,0.55,0.25}, //steady amber
    {LOW,HIGH,HIGH,HIGH,LOW,LOW,0.8,0.1}, //flash red
    {HIGH,HIGH,HIGH,LOW,LOW,LOW,1,1.05},// steady red
    {LOW,LOW,LOW,HIGH,HIGH,HIGH,1,0.05} // all flash
};
void lcdoutput();
void timer_isr_led(); // timed interuprt
void timer_isr_srf02();
void timer_isr_tone();
void backlight();
void init_K64F(); // set up board
void sw2_isr();
void sw1_isr();
void setalert();
void setleds();
void setbuzzer();
void nobuzz();
void menu();
void submenu();


int main()
{
    lcd.init();
    init_K64F();
    ticker.attach(&timer_isr_led,0.35);
    ticker_srf02.attach(&timer_isr_srf02,0.02);
    ticker_tone.attach(&timer_isr_tone,Alertlevel[alert].toneoff);
    sw1.fall(&sw1_isr);
    sw2.fall(&sw2_isr);
    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();
            } else {
                distance = srf02.getDistannceInch();
            }
            distance = distance-offset;
        }
        setalert();
        lcdoutput();
        //     setbuzzer();
        setleds();
        sleep();
    }
}

//Set up board switches and LEDS
void init_K64F()
{
//on-board LEDs are active-low, so set pin high to turn them off.
    r_led = 1;
    g_led = 1;
    b_led = 1;
// since the on-board switches have external pull-ups, we should disable the internal pull-down
// resistors that are enabled by default using InterruptIn
    sw2.mode(PullNone);
    sw1.mode(PullNone);
}

void lcdoutput()
{
    int length;
    int length1;
    char buffer[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    char buffer1[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    int length2;
    char buffer2[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    int length3;
    char buffer3[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    if (alert == 0) {
        lcd.clear();

        length1 = sprintf(buffer1,"**PATH CLEAR**",bright);
        lcd.printString(buffer1,0,0);
        lcd.refresh();

    }

    else {
        lcd.clear();
        if (units == METRIC) {
            length = sprintf(buffer,"%i Cm",distance);
            length1 = sprintf(buffer1,"****RANGE!****");
            length2 = sprintf(buffer2,"***DISTANCE***");
            length3 = sprintf(buffer3,"Alert = %i",alert);
        } else {
            length = sprintf(buffer,"%i Inches",distance);
            length1 = sprintf(buffer1,"****RANGE!****");
            length2 = sprintf(buffer2,"***DISTANCE***");
        }
        lcd.printString(buffer,20,3);
        lcd.printString(buffer1,0,0);
        lcd.printString(buffer2,0,1);
        lcd.printString(buffer3,0,2);
        float i = r7/84;
        float distbar = distance*i;
        //drawRect(int x0,int y0,int width,int height,int fill);
        lcd.drawRect(0,38,distbar,7,1);
        lcd.refresh();

    }

}

void setalert()
{
    if (distance >= r6 && distance < r7) {  // r6 150 and r7 200
        alert = 1; //flash green
    } else if (distance >= r5 && distance  < r6) {  // r5 90 and r6 150
        alert = 2; //steady green
    } else if (distance >= r4 && distance < r5) {  // r4 60 and r5 90
        alert = 3; //flashing amber
    } else if (distance >= r3 && distance < r4) {  // r3 40 and r4 60
        alert = 4; //steady amber
    } else if ( distance > r2 && distance < r3) {  // r2 20 and r3 40
        alert = 5; //flashing red
    } else if (distance > 1 && distance <= r2) { //r1 3 and r2 20
        alert = 6; //steady red
    } else if (distance <=1) {
        alert = 7; //all flashing
    } else {
        alert = 0; //no output
    }
}

void setleds()
{
    // If statments to determin the output of each LED
    if (Alertlevel[alert].frr_led and Alertlevel[alert].fgg_led and Alertlevel[alert].fa_led == HIGH) {
        if (g_timer_flag_led) {
            g_timer_flag_led = 0;  // if it has, clear the flag
            rr_led = !rr_led;
            gg_led = !gg_led;
            a_led = !a_led;
        }
    } else if(Alertlevel[alert].fa_led == HIGH) {
        if (g_timer_flag_led) {
            g_timer_flag_led = 0;  // if it has, clear the flag
            a_led = !a_led;
        }
    } else if (Alertlevel[alert].frr_led == HIGH) {
        if (g_timer_flag_led) {
            g_timer_flag_led = 0;  // if it has, clear the flag
            rr_led = !rr_led;
        }
    } else if(Alertlevel[alert].fgg_led == HIGH) {
        if (g_timer_flag_led) {
            g_timer_flag_led = 0;  // if it has, clear the flag
            gg_led = !gg_led;
        }
    } else {
        rr_led = Alertlevel[alert].srr_led;
        a_led = Alertlevel[alert].sa_led;
        gg_led = Alertlevel[alert].sgg_led;
    }

}
/*
void setbuzzer()
{
    if (g_timer_flag_tone) {
        g_timer_flag_tone = 0;
        buzzer.period (1/1000);
        buzzer=0.5;
        buzzoff.attach(&nobuzz,Alertlevel[alert].toneon);
    }
}*/

void nobuzz()
{
    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
}

void sw1_isr()
{
    g_sw1_flag = 1;   // set flag in ISR
}

void timer_isr_led()
{
    g_timer_flag_led = 1;   // set flag in ISR
}

void timer_isr_srf02()
{
    g_timer_flag_srf02 = 1;   // set flag in ISR
}

void timer_isr_tone()
{
    g_timer_flag_tone = 1;
}

void menu()
{
    int length2;
    int length1;
    int length3;
    int length4;
    char buffer2[14];
    char buffer3[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    char buffer1[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    char buffer4[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14

    while(1) {


        if (g_sw1_flag) {
            g_sw1_flag = 0;
            page++;
            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;
                    length2 = sprintf(buffer2,"*****MENU*****");
                    length1 = sprintf(buffer1,"BACKLIGHT");
                    length3 = 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) {
                    length3 = sprintf(buffer3,"METRIC");
                } else {
                    length3 = sprintf(buffer3,"IMPERIAL");
                }

                length2 = sprintf(buffer2,"*****MENU*****");
                length1 = sprintf(buffer1,"UNITS");
                lcd.printString(buffer2,0,0);
                lcd.printString(buffer1,0,1);
                lcd.printString(buffer3,0,2);


                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;
        }
    }
    lcd.refresh();
}
void submenu()
{
    int length2;
    int length1;
    int length3;
    int length4;
    char buffer2[14];
    char buffer3[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    char buffer1[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
    char buffer4[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14
    while(1) {
        if (g_sw1_flag) {
            g_sw1_flag = 0;
            subpage++;
        }
        switch (subpage) {
            case 0:
                if (g_sw2_flag) {
                    g_sw2_flag = 0;           // if it has, clear the flag
                    if (r2 == r3) {
                        r2 = 1;
                    } else {
                        r2 = r2+1;
                    }
                }
                length2 = sprintf(buffer1,"*****MENU*****");
                length3 = sprintf(buffer2,"RANGE");
                length3 = sprintf(buffer3,"PARAMETERS");
                length4 = sprintf(buffer4,"1Cm  to  %iCm",r2);
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                break;

            case 1:

                if (g_sw2_flag) {
                    g_sw2_flag = 0;           // if it has, clear the flag
                    if (r3 == r4) {
                        r3 = r2;
                    } else {
                        r3 += 1;
                    }
                }

                length2 = sprintf(buffer1,"*****MENU*****");
                length3 = sprintf(buffer2,"RANGE");
                length3 = sprintf(buffer3,"PARAMETERS");
                length3 = sprintf(buffer4,"%iCm  to  %iCm",r2,r3);
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                break;

            case 2:

                if (g_sw2_flag) {
                    g_sw2_flag = 0;           // if it has, clear the flag
                    if (r4 == r5) {
                        r4 = r3;
                    } else {
                        r4 += 1;
                    }
                }

                length2 = sprintf(buffer1,"*****MENU*****");
                length3 = sprintf(buffer2,"RANGE");
                length3 = sprintf(buffer3,"PARAMETERS");
                length3 = sprintf(buffer4,"%iCm  to  %iCm",r3,r4);
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                break;

            case 3:

                if (g_sw2_flag) {
                    g_sw2_flag = 0;           // if it has, clear the flag
                    if (r5 == r6) {
                        r5 = r4;
                    } else {
                        r5 += 1;
                    }
                }

                length2 = sprintf(buffer1,"*****MENU*****");
                length3 = sprintf(buffer2,"RANGE");
                length3 = sprintf(buffer3,"PARAMETERS");
                length3 = sprintf(buffer4,"%iCm to %iCm",r4,r5);
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                break;
            case 4:

                if (g_sw2_flag) {
                    g_sw2_flag = 0;           // if it has, clear the flag
                    if (r6 == r7) {
                        r6 = r5;
                    } else {
                        r6 += 1;
                    }
                }

                length2 = sprintf(buffer1,"*****MENU*****");
                length3 = sprintf(buffer2,"RANGE");
                length3 = sprintf(buffer3,"PARAMETERS");
                length3 = sprintf(buffer4,"%iCm to %iCm",r5,r6);
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                break;
            case 5:

                if (g_sw2_flag) {
                    g_sw2_flag = 0;           // if it has, clear the flag
                    if (r7 == 300) {
                        r7 = r6;
                    } else {
                        r7 += 1;
                    }
                }

                length2 = sprintf(buffer1,"*****MENU*****");
                length3 = sprintf(buffer2,"RANGE");
                length3 = sprintf(buffer3,"PARAMETERS");
                length3 = sprintf(buffer4,"%iCm to %iCm",r6,r7);
                lcd.printString(buffer1,0,0);
                lcd.printString(buffer2,0,1);
                lcd.printString(buffer3,0,2);
                lcd.printString(buffer4,0,3);
                break;

            default:
                lcd.clear();
                return;
        }
    }
}