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:
kswanson31
Date:
2016-12-05
Revision:
5:436b39863099
Parent:
4:1928bf053958
Child:
6:45a5043acc7e

File content as of revision 5:436b39863099:

#include "mbed.h"
#include "SDFileSystem.h"
#include "uLCD_4DGL.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 led(LED1);

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();
    
    // 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

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

        going = (hallT.read() > 20.0 && stopped) ? 0 : 1;
        maxSpeed = (speed > maxSpeed) ? speed : maxSpeed;
        
        lcd.locate(0, 1);
        lcd.printf("Distance : %3.1f\n\n", miles);
        lcd.printf("Top speed : %2.1f\n\n", speed);
        lcd.printf("Time : %1.1f\n\n", (float)seconds / 3600);
        
        // light states code
        // lightstates = get_state();
    }
    
    // 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_hours;
    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_hours;
        lcd.locate(0, 1);
        lcd.printf("Your last trip\n\n");
        lcd.printf("Distance : %3.1f\n\n", f_miles);
        lcd.printf("Top speed : %2.1f\n\n", f_maxSpeed);
        lcd.printf("Time : %1.1f\n\n", f_hours);
    }
    
    file.close();
    wait(0.5);
    
    // display the best trip
    
    file.open("/sd/records/best-of.txt");

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

    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 hours;
    fstream file;
    
    file.open("/sd/records/recent.txt");
    
    if (!file.is_open()) {
        lcd.locate(0, 1);
        lcd.printf("Could not open file\n");
    } else {
        hours = (float)seconds / 3600;
        lcd.locate(0, 1);
        lcd.printf("This trip\n\n");
        lcd.printf("Distance : %3.1f\n\n", miles);
        lcd.printf("Top speed : %2.1f\n\n", maxSpeed);
        lcd.printf("Time : %1.1f\n\n", hours);
        // overwrite most recent
        file << fixed << setprecision(1) << miles << " " << maxSpeed << " " << hours << 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();
}

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();
}