Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
}