Fitbit code using RTOS
Dependencies: mbed PulseSensor2 SCP1000 mbed-rtos 4DGL-uLCD-SE LSM9DS1_Library_cal PinDetect FatFileSystemCpp GP-20U7
Revision 4:158ea0c5531c, committed 2020-04-22
- Comitter:
- dyu2021
- Date:
- Wed Apr 22 17:22:42 2020 +0000
- Parent:
- 3:f3e1ee4aa5ec
- Commit message:
- Updated GPS distance calculation and fixed saving dates
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r f3e1ee4aa5ec -r 158ea0c5531c main.cpp --- a/main.cpp Wed Apr 22 15:59:19 2020 +0000 +++ b/main.cpp Wed Apr 22 17:22:42 2020 +0000 @@ -23,13 +23,6 @@ #define FSNAME "msc" MSCFileSystem msc(FSNAME); - -Ticker display; -Ticker LCD_clock; -Ticker Barometer; -Ticker GPS; -Ticker HR; -Ticker setup; int bpm; int steps = 0; @@ -68,8 +61,7 @@ Thread thread3; Thread thread4; Thread thread5; -Mutex lcd_mtx; -Mutex gps_mtx; +Mutex serial_mtx; Mutex usb_mtx; // when the pushbotton is pressed the run flag is set to false and the main @@ -115,7 +107,7 @@ //Display the time on the top void display_time() { while(1) { - lcd_mtx.lock(); + serial_mtx.lock(); uLCD.locate(1, 1); uLCD.color(WHITE); uLCD.text_width(2); @@ -124,14 +116,14 @@ char timeBuffer[32]; strftime(timeBuffer, 32, "%I:%M %p\r\n", localtime(&seconds)); uLCD.printf("%s", timeBuffer); - lcd_mtx.unlock(); + serial_mtx.unlock(); Thread::wait(700); } } void setup_screen(void) { while(1) { - lcd_mtx.lock(); + serial_mtx.lock(); if (oldScreen != screen) { uLCD.filled_rectangle(0,0, 128, 128, BLACK); oldScreen++; @@ -202,7 +194,7 @@ uLCD.line(40, 100, 90, 100, WHITE); break; } - lcd_mtx.unlock(); + serial_mtx.unlock(); Thread::wait(100); } } @@ -210,7 +202,7 @@ void update_screen(void) { while(1) { read_pot(); - lcd_mtx.lock(); + serial_mtx.lock(); if (oldMode != mode) { uLCD.filled_rectangle(0,0, 128, 128, BLACK); } @@ -274,7 +266,7 @@ uLCD.printf("%2d floors", flights); break; } - lcd_mtx.unlock(); + serial_mtx.unlock(); Thread::wait(100); } } @@ -319,7 +311,7 @@ void readGPS(){ while(1) { - gps_mtx.lock(); + serial_mtx.lock(); if(gps.connected()) { if(gps.sample()) { if(gps.ns == 'S') { @@ -333,14 +325,16 @@ latitude = -gps.latitude*PI/180; } if(latitude != 0 && longitude != 0 && old_lat != 0 && old_lon != 0) { - distance = distance + (3963*acosf(sinf(old_lat)*sinf(latitude)+cosf(old_lat)*cosf(latitude)*cosf(longitude-old_lon))); + float a = sinf(old_lat)*sinf(latitude)+cosf(old_lat)*cosf(latitude)*cosf(longitude-old_lon); + if(a > 1) a = 1; + distance = distance + (.75*acosf(a)); } old_lat = latitude; old_lon = longitude; //pc.printf("%f, %f, %f\r\n", latitude, longitude, distance); } } - gps_mtx.unlock(); + serial_mtx.unlock(); Thread::wait(10000); } } @@ -353,9 +347,9 @@ } time_t seconds = time(NULL); char date[32]; - strftime(date, 32, "%m %d %y", localtime(&seconds)); - fprintf(fp, "%c\t%d\t%d\t%0.2f\t%0.2f\n\r", date, steps, flights, calories, distance); - pc.printf("%c\t%d\t%d\t%0.2f\t%0.2f\n\r", date, steps, flights, calories, distance); + strftime(date, 32, "%m/%d/%y", localtime(&seconds)); + fprintf(fp, "%s\t%d\t%d\t%0.2f\t%0.2f\n\r", date, steps, flights, calories, distance); + pc.printf("%s\t%d\t%d\t%0.2f\t%0.2f\n\r", date, steps, flights, calories, distance); fclose(fp); } @@ -374,7 +368,6 @@ uLCD.background_color(BLACK); uLCD.cls(); thread1.start(setup_screen); - //setup.attach(&setup_screen, 0.3); while(setup_state) { pc.printf("%d\r\n", screen); @@ -385,12 +378,9 @@ pb.attach_deasserted(&button); // set up the display - //setup.detach(); uLCD.cls(); thread1.start(update_screen); thread2.start(display_time); - //display.attach(&update_screen, 0.5); - //LCD_clock.attach(&display_time, 0.7); // LED indicates whether or not data is being collected one = 0; @@ -412,20 +402,24 @@ // Initialize data file on usb flash drive usb_mtx.lock(); - FILE *fp = fopen( "/msc/data.txt", "w"); + FILE *fp = fopen( "/msc/data.txt", "r+"); if(fp == NULL) { error("Could not open file for write\n"); } - fprintf(fp, "Date\tSteps\tFloors\tCalories\tDistance (ft)\r\n"); + //Check to see if file is empty, not working right now + fseek (fp, 0, SEEK_END); + int size = ftell(fp); + if (0 == size) { + fprintf(fp, "Date\tSteps\tFloors\tCalories\tDistance (ft)\r\n"); + pc.printf("Data.txt rewritten\r\n"); + } fclose(fp); usb_mtx.unlock(); thread3.start(readBarometer); thread4.start(readGPS); thread5.start(readHR); - //Barometer.attach(&readBarometer, 2); - //GPS.attach(&readGPS, 10); - //HR.attach(&readHR, 0.5); + usb_timer.start(); while(run) { @@ -458,7 +452,7 @@ one = !one; // Sampling rate of ~200 Hz if(usb_timer.read() >= 30) { - pc.printf("Starting USB Write\r\n"); + //pc.printf("Starting USB Write\r\n"); usb_mtx.lock(); saveData(); usb_mtx.unlock(); @@ -468,6 +462,5 @@ } Thread::wait(200); } - //fclose(fp); one = 0; } \ No newline at end of file