Aaron Stevenson / Mbed 2 deprecated Assignment3

Dependencies:   mbed MCP23017 mbed-rtos WattBob_TextLCD

main.cpp

Committer:
Steaar
Date:
2018-03-26
Revision:
3:d888509e77b8
Parent:
2:51a06b9a52d1
Child:
4:72c487215487

File content as of revision 3:d888509e77b8:

#include "mbed.h"
#include "rtos.h"

#include "MCP23017.h"
#include "WattBob_TextLCD.h"

#define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT)
#define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT)

MCP23017 *par_port;     // pointer to 16-bit parallel I/O object
WattBob_TextLCD *lcd;   // pointer to 2*16 chacater LCD object

AnalogIn accel(p15);       // Analog
AnalogIn brake(p16);
float speed = 0;
float aveSpeed;
float acc = 0;
float br = 0;
float dif;
float distance = 0;

Timer tim;
long int t;

DigitalOut sideLights(LED1);// mbed out
DigitalOut lIndicator(LED2);
DigitalOut rIndicator(LED3);
DigitalOut engLight(LED4);

DigitalOut brakeLights(p6);// redbox out
DigitalOut fluxCapacitor(p7);

DigitalIn  lightSwitch(p8);// switches
DigitalIn  lIndicate(p9);
DigitalIn  rIndicate(p10);
DigitalIn  engine(p5);

Serial pc(USBTX, USBRX);// serial tx, rx

Thread sp;
Thread task1;
Thread task2;
Thread task3;
Thread task4;
Thread task5;
Thread task6;
Thread task7;
Thread task8;
Thread task9;
Thread task10;

/* Mail */
typedef struct {
    float m_speed;
    float m_acc;
    float m_br;
    uint32_t counter; /* A counter value               */
} mail_t;

Mail<mail_t, 100> mail_box;

void send_thread (void)
{
    uint32_t i = 0;
    while (true) {
        i++; // fake data update
        mail_t *mail = mail_box.alloc();
        mail->m_speed = speed;
        mail->m_acc = acc;
        mail->m_br = br;
        mail->counter = i;
        mail_box.put(mail);

        osEvent evt = mail_box.get();
        if (evt.status == osEventMail) {
            mail_t *mail = (mail_t*)evt.value.p;
            printf("\nSpeed: %.2f \n\r"   , mail->m_speed);
            printf("Acceleration: %.2f \n\r"     , mail->m_acc);
            printf("Braking: %.2f \n\r", mail->m_br);

            mail_box.free(mail);
        }
        Thread::wait(5000);
    }
}


void acceleration()  //run at 20hz                  //  1  read brake and accelerator       10
{
    while (1) {
        acc = accel.read()*3.3;
        br = brake.read()*3.3;
        Thread::wait(500);
    }
}
void getSpeed()                                     // 20Hz
{
    while (1) {
        dif = acc - br;
        t = tim.read();
        speed = speed + (dif*t*3.6);
        if (speed < 0) {
            speed = 0;
        }
        distance = distance + (speed*t + (0.5*dif*(t*t)))/1000;
        tim.reset();

        Thread::wait(100);
    }
}
void ignition()                                     //  2   Read engine on/off show LED     2
{
    while (1) {
        if (engine == 1) {
            engLight = 1;
        }

        Thread::wait(500);
    }
}
void speedo()                                       //  3   Average last n speed readings   2
{
    while (1) {
        for (int i = 0; i<3; i++) {
            aveSpeed = speed + aveSpeed;
        }
        speed = speed/4;

        Thread::wait(200);
    }
}
void braking()                                      //  4   Brake indicated by LED          2
{
    while (1) {
        if ( br>0) {
            brakeLights = 1;
        }

        Thread::wait(500);
    }
}
void greatScott()                                   //  5   if speed > 88 LED on            1
{
    while (1) {
        if (speed > 88) {
            fluxCapacitor = 1;
        }

        Thread::wait(1000);
    }
}
void LCD()                                          //  6   display odometer and speed      2
{
    while (1) {
        t = tim.read();
        distance = speed * (t/3600);

        lcd->locate(0,0);
        lcd->printf("KM:%0.1f",distance);
        lcd->locate(1,0);
        lcd->printf("KMPH:%0.1f",speed);

        Thread::wait(500);
    }
}
//    7       Send speed, acc, brake to 100       0.2
//           element MAIL q MBED RTOS
//    8       MAIL q to serial PC                 0.05
void lights()                                       //  9   side light switch, set lights   1
{
    while (1) {
        if (lightSwitch == 1) {
            sideLights = 1;
        } else {
            sideLights = 0;
        }

        Thread::wait(1000);
    }
}
void indicators()                                   //    10.     Read indicator switches, flash
{
    while (1) {
        if ((lIndicate == 1) && (rIndicate == 1)) {     //      both LED at 2Hz If both switch on
            lIndicator = !lIndicator;
            rIndicator = !rIndicator;
            //   Thread::wait(2000);
        }
        if ((lIndicate == 1) && (rIndicate == 0)) {     //        if left switch on
            lIndicator = !lIndicator;               //          left LED at 1Hz
            // Thread::wait(1000);
        }
        if ((lIndicate == 0) && (rIndicate == 1)) {     //        if right switch on
            rIndicator = !rIndicator;               //          right LED at 1Hz
            // Thread::wait(1000);
        }

        Thread::wait(2000);
    }
}
void toSerial()//7
{
    while (1) {
        osEvent evt = mail_box.get();
        mail_t *mail = (mail_t*)evt.value.p;
        pc.printf("\nSpeed: %.2f \n\r", mail->m_speed);                      
        pc.printf("Acceleration: %.2f \n\r", mail->m_acc);                            
        pc.printf("Braking: %.2f \n\r", mail->m_br);
        
        Thread::wait(20000);
    }
}

int main()
{
    par_port = new MCP23017(p9, p10, 0x40);             // initialise 16-bit I/O chip
    lcd = new WattBob_TextLCD(par_port);                // initialise 2*26 char display
    par_port->write_bit(1,BL_BIT);                      // turn LCD backlight ON

    sp.start(getSpeed);                 //20
    task1.start(acceleration);          //10
    task2.start(ignition);              //2
    task3.start(speedo);                //5
    task4.start(braking);               //2
    task5.start(greatScott);            //1
    task6.start(LCD);                   //2
    task7.start(callback(send_thread)); //0.2
    task8.start(toSerial);              //0.05
    task9.start(lights);                //1
    task10.start(indicators);           //0.5
}