A system to help you ride your bike better than you do right now.

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed LSM9DS1_Library_cal

main.cpp

Committer:
fkhan39
Date:
2016-12-05
Revision:
7:0d5396762696
Parent:
6:45a5043acc7e
Child:
8:8c073046821d

File content as of revision 7:0d5396762696:

#include "mbed.h"
#include "SDFileSystem.h"
#include "uLCD_4DGL.h"
#include "LSM9DS1.h"
#include <fstream>
#include <iomanip>
using namespace std;

#define START_S 1480719111

#define LEFT  0xA
#define RIGHT 0xB
#define STOP  0xC
#define GO    0xD

int lightState;

DigitalOut leftBlinker(p22);
DigitalOut rightBlinker(p23);
DigitalOut brakeLight(p21);
Timer blinkT;
AnalogIn flex(p15);
LSM9DS1 imu(p9, p10, 0xD6, 0x3C);

SDFileSystem sd(p11, p12, p13, p14, "sd");  //mosi -> DI, miso <- DO, slck -> sclck, CS -> CS
uLCD_4DGL lcd(p28, p27, p29);

// speed sensor
InterruptIn hallSensor(p8);
Timer hallT;
int stopped;

float miles = 0;
float speed = 0;
float maxSpeed = 0;
time_t seconds;

void store_trip();
void recall_trips();
int get_state();
void pass();

int main() {    
    // open the file for reading and appending records
    // recall last trip
    recall_trips();
    wait(10);
    lcd.cls();
    /*
    imu.begin();
    if (!imu.begin()) {
        lcd.printf("Failed to communicate with LSM9DS1.\n");
    }
    imu.calibrate();
    */
    // normal operation loop here
    int going = 1; // cyclist is moving
    set_time(START_S);  // Set RTC time
    
    hallSensor.fall(&pass);
    hallT.start();     // start the hall sensor timer
    
    int blinks;

    while(going) {
        
        seconds = time(NULL) - START_S; // return the seconds passed since start
        
        if (hallT.read() > 6.0 && !stopped) {
            speed = 0;
            stopped = 1;
        }

        going = (hallT.read() > 20.0 && stopped) ? 0 : 1;
        maxSpeed = (speed > maxSpeed) ? speed : maxSpeed;
        
        lcd.locate(0, 1);
        lcd.color(GREEN);
        lcd.printf("Distance : %3.1f mi\n\n", miles);
        lcd.color(BLUE);
        lcd.printf("Speed : %2.1f mph\n\n", speed);
        lcd.color(LGREY);
        lcd.printf("Time : %3.1f min\n\n", (float)seconds / 60);
        
        // light states code
        // lightState = get_state();
        
        if (lightState == STOP) {
            brakeLight = 1;
        } else if (lightState == GO) {
            brakeLight = 0;
        } else {
            blinkT.start();
        }
        
        if (blinks > 10) {
            rightBlinker = 0; leftBlinker = 0;
            blinks = 0;
        } else {
            blinkT.stop();
            rightBlinker = ((0.5 - blinkT.read() == 0) && lightState == RIGHT) ? ~rightBlinker : rightBlinker;
            leftBlinker = ((0.5 - blinkT.read() == 0) && lightState == LEFT) ? ~leftBlinker : leftBlinker;
            blinkT.reset();
            blinkT.start();
            blinks++;
        }
        
        
    }
    
    // store this trip
    lcd.cls();
    store_trip();
    
    // end everything
}

void recall_trips(void) {
    // display the most recent trip made on the screen
    // display the most impressive trip (longest distance, best speed, least time)
    
    float f_miles;
    float f_maxSpeed;
    float f_minutes;
    ifstream file;
    
    // read out the most recent trip
    file.open("/sd/records/recent.txt");
    
    if (!file.is_open()) {
        lcd.locate(0, 1);
        lcd.printf("Could not open file\n");
    } else {
        file >> f_miles >> f_maxSpeed >> f_minutes;
        lcd.locate(0, 1);
        lcd.printf("Your last trip\n\n");
        lcd.printf("Distance : %3.1f mi\n\n", f_miles);
        lcd.printf("Top speed : %2.1f mph\n\n", f_maxSpeed);
        lcd.printf("Time : %3.1f min\n\n", f_minutes);
    }
    
    file.close();
    wait(0.5);
    
    // display the best trip
    
    file.open("/sd/records/best-of.txt");

    lcd.color(WHITE);
    if(!file.is_open()) {
        lcd.printf("Could not open file\n");
    } else {
        // show the best trip
        file >> f_miles >> f_maxSpeed >> f_minutes;
        lcd.printf("Your best trip\n\n");
        lcd.printf("Distance : %3.1f mi\n\n", f_miles);
        lcd.printf("Top speed : %2.1f mph\n\n", f_maxSpeed);
        lcd.printf("Time : %3.1f min\n\n", f_minutes);
    }

    file.close();
    wait(0.5);
}

void store_trip(void) {
    // store the most recent trip completed
    // determine whether this trip was a record, and indicate if so
    
    float minutes;
    fstream file;
    
    file.open("/sd/records/recent.txt");
    
    lcd.color(WHITE);
    if (!file.is_open()) {
        lcd.locate(0, 1);
        lcd.printf("Could not open file\n");
    } else {
        minutes = (float)seconds / 60;
        lcd.locate(0, 1);
        lcd.printf("This trip\n\n");
        lcd.printf("Distance : %3.1f mi\n\n", miles);
        lcd.printf("Top speed : %2.1f mph\n\n", maxSpeed);
        lcd.printf("Time : %3.1f min\n\n", minutes);
        // overwrite most recent
        file << fixed << setprecision(1) << miles << " " << maxSpeed << " " << minutes << endl;
    }
    
    file.close();
    wait(0.5);
    
    file.open("/sd/records/best-of.txt");
    
    if (!file.is_open()) {
        lcd.locate(0, 1);
        lcd.printf("Could not open file\n");
    } else {
        lcd.locate(0, 1);
        // check if you beat your best
    }
    
    file.close();
    wait(0.5);
}

int get_state(void) {
    imu.readAccel();
    float f = flex.read();
    int x = imu.ax, y = imu.ay, z = imu.az;
    if (z > 0 && z > abs(y) && z > abs(x) && y < 0 && f >= 0.92)
        return STOP;
    if (x < 0 && abs(x) > abs(z) && abs(x) > abs(y) && f <= 0.87)
        return LEFT;
    if (y > 0 && y > abs(z) && y > abs(x) && f >= 0.87)
        return RIGHT;
    return GO;
}

void pass(void) {
    // interrupt, performed when the hallsensor passes the magnet
    stopped = 0; // reset the global
    hallT.stop();
    speed = 0.00136364 / (hallT.read() / 3600); // current speed
    miles += 0.00136364; // circumference of the tire in miles
    hallT.reset();
    hallT.start();
}