Benjamin Leverett / Mbed 2 deprecated Final_Project

Dependencies:   mbed mbed-rtos 4DGL-uLCD-SE SDFileSystem ATParser

Committer:
bleverett3
Date:
Sun Apr 26 01:42:51 2020 +0000
Revision:
6:57e646faac4d
Parent:
5:c25fe08829a4
Ben, did the stupid BITCH ASS MOTHAFUCKING SD CARD!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chenchen2020 0:bedc25613430 1 #include "mbed.h"
chenchen2020 0:bedc25613430 2 #include "rtos.h"
chenchen2020 0:bedc25613430 3 #include "ATParser.h"
chenchen2020 0:bedc25613430 4 #include "uLCD_4DGL.h"
chenchen2020 0:bedc25613430 5 #include "SDFileSystem.h"
chenchen2020 2:f65d4206b47b 6 #include "Speaker.h"
chenchen2020 0:bedc25613430 7 //#include "wave_player.h"
chenchen2020 0:bedc25613430 8 #include <string>
chenchen2020 2:f65d4206b47b 9 #include <iostream>
chenchen2020 0:bedc25613430 10 using namespace std;
chenchen2020 0:bedc25613430 11
bleverett3 3:f0f6530b145f 12 //Hardware setup
chenchen2020 0:bedc25613430 13 DigitalOut cmdMode(p18);
chenchen2020 0:bedc25613430 14 Serial pc(USBTX, USBRX);
chenchen2020 0:bedc25613430 15 BufferedSerial ble(p13,p14);
chenchen2020 0:bedc25613430 16 DigitalOut cmdstuff(p18);
chenchen2020 2:f65d4206b47b 17 DigitalOut greenLED(p24);
chenchen2020 2:f65d4206b47b 18 DigitalOut yellowLED(p25);
chenchen2020 2:f65d4206b47b 19 DigitalOut redLED(p26);
chenchen2020 0:bedc25613430 20 uLCD_4DGL uLCD(p28,p27,p30);
chenchen2020 0:bedc25613430 21 SDFileSystem sd(p5, p6, p7, p8, "sd");
chenchen2020 2:f65d4206b47b 22 //Speaker mySpeaker(p21);
chenchen2020 0:bedc25613430 23
bleverett3 5:c25fe08829a4 24 //AT command data structures
chenchen2020 0:bedc25613430 25 char delimiter[] = "\r\n";
chenchen2020 0:bedc25613430 26 int buffer_size = 256;
chenchen2020 0:bedc25613430 27 int timeout = 100;
chenchen2020 0:bedc25613430 28 bool debug = false;
chenchen2020 0:bedc25613430 29 ATParser at(ble, delimiter, buffer_size, timeout, debug);
chenchen2020 0:bedc25613430 30 char buffer[10];
bleverett3 3:f0f6530b145f 31
bleverett3 3:f0f6530b145f 32 //RSSI data
bleverett3 3:f0f6530b145f 33 int averageCount = 0;
bleverett3 5:c25fe08829a4 34 volatile int RSSI_array[15];
chenchen2020 0:bedc25613430 35 volatile int risk_level = 0;
bleverett3 3:f0f6530b145f 36 volatile int changed = 0;
chenchen2020 0:bedc25613430 37
chenchen2020 2:f65d4206b47b 38 //RTOS Mutex Lock
bleverett3 5:c25fe08829a4 39 Mutex serial_lock;
chenchen2020 0:bedc25613430 40
bleverett3 5:c25fe08829a4 41 //Time variable
bleverett3 5:c25fe08829a4 42 time_t seconds;
chenchen2020 0:bedc25613430 43
bleverett3 6:57e646faac4d 44 //Function to store data to sd card
bleverett3 6:57e646faac4d 45 void log_sd_card()
bleverett3 6:57e646faac4d 46 {
bleverett3 6:57e646faac4d 47 serial_lock.lock();
bleverett3 6:57e646faac4d 48 FILE *fp = fopen("/sd/mydir/sdtest.txt", "w");
bleverett3 6:57e646faac4d 49 if(fp == NULL) {
bleverett3 6:57e646faac4d 50 error("Could not open file for write\n");
bleverett3 6:57e646faac4d 51 }
bleverett3 6:57e646faac4d 52 int curr_time = (int)ctime(&seconds) % 86400;
bleverett3 6:57e646faac4d 53 int curr_hour = curr_time / 3600;
bleverett3 6:57e646faac4d 54 int curr_min = curr_time / 60;
bleverett3 6:57e646faac4d 55 int curr_sec = curr_time % 60;
bleverett3 6:57e646faac4d 56
bleverett3 6:57e646faac4d 57
bleverett3 6:57e646faac4d 58 fprintf(fp, "Date & time: Tuesday 28, April 2020 ");
bleverett3 6:57e646faac4d 59 fprintf(fp, "%i", curr_hour);
bleverett3 6:57e646faac4d 60 fprintf(fp, ":");
bleverett3 6:57e646faac4d 61 fprintf(fp, "%i", curr_min);
bleverett3 6:57e646faac4d 62 fprintf(fp, ":");
bleverett3 6:57e646faac4d 63 fprintf(fp, "%i", curr_sec);
bleverett3 6:57e646faac4d 64 fprintf(fp, "\n");
bleverett3 6:57e646faac4d 65 fprintf(fp, "Risk Level: ");
bleverett3 6:57e646faac4d 66 fprintf(fp, "%i", risk_level);
bleverett3 6:57e646faac4d 67 fprintf(fp, "\n");
bleverett3 6:57e646faac4d 68 for (int i = 0; i < 15; i++) {
bleverett3 6:57e646faac4d 69 fprintf(fp, "%i", RSSI_array[i]);
bleverett3 6:57e646faac4d 70 if (i < 14) {
bleverett3 6:57e646faac4d 71 fprintf(fp, ", ");
bleverett3 6:57e646faac4d 72 }
bleverett3 6:57e646faac4d 73 }
bleverett3 6:57e646faac4d 74 fprintf(fp, "\n\n");
bleverett3 6:57e646faac4d 75 fclose(fp);
bleverett3 6:57e646faac4d 76 serial_lock.unlock();
bleverett3 6:57e646faac4d 77 }
bleverett3 6:57e646faac4d 78
bleverett3 5:c25fe08829a4 79 //Helper function for parse_RSSI
chenchen2020 2:f65d4206b47b 80 int calculate_average(volatile int *input, int size)
chenchen2020 2:f65d4206b47b 81 {
chenchen2020 0:bedc25613430 82 int average;
chenchen2020 2:f65d4206b47b 83 for(int i = 0; i< size; i++) {
chenchen2020 0:bedc25613430 84 average = average + input[i];
chenchen2020 0:bedc25613430 85 }
chenchen2020 0:bedc25613430 86 average = average/size;
chenchen2020 0:bedc25613430 87 return average;
chenchen2020 0:bedc25613430 88 }
chenchen2020 0:bedc25613430 89
bleverett3 5:c25fe08829a4 90 //This portion of the code handles RSSI readings
chenchen2020 2:f65d4206b47b 91 void parse_RSSI()
chenchen2020 2:f65d4206b47b 92 {
bleverett3 5:c25fe08829a4 93 serial_lock.lock();
chenchen2020 1:8eb0ee57df9f 94 at.send("AT+BLEGETRSSI") && at.read(buffer, 10);
chenchen2020 2:f65d4206b47b 95 if(buffer[0] == '-') {
bleverett3 5:c25fe08829a4 96 //Getting RSSI number
bleverett3 5:c25fe08829a4 97 int digit = 1;
bleverett3 5:c25fe08829a4 98 int total = 0;
bleverett3 5:c25fe08829a4 99 for (int i = 0; i < 10; i++) {
bleverett3 5:c25fe08829a4 100 if (buffer[i] > 47 || buffer[i] < 58) {
bleverett3 5:c25fe08829a4 101 total += (buffer[i] * digit);
bleverett3 5:c25fe08829a4 102 digit = digit*10;
bleverett3 5:c25fe08829a4 103 } else if (buffer[i] == 92) {
bleverett3 5:c25fe08829a4 104 break;
bleverett3 5:c25fe08829a4 105 }
bleverett3 5:c25fe08829a4 106 }
bleverett3 5:c25fe08829a4 107
bleverett3 5:c25fe08829a4 108 //Printing for confirmation
chenchen2020 0:bedc25613430 109 pc.printf("RSSI: ");
bleverett3 5:c25fe08829a4 110 pc.printf("%s", buffer);
chenchen2020 0:bedc25613430 111 pc.printf("\n");
bleverett3 5:c25fe08829a4 112
bleverett3 5:c25fe08829a4 113 //Store for average
chenchen2020 2:f65d4206b47b 114 if (averageCount <= 15) {
chenchen2020 0:bedc25613430 115 RSSI_array[averageCount] = total;
chenchen2020 0:bedc25613430 116 }
chenchen2020 2:f65d4206b47b 117 averageCount++;
bleverett3 5:c25fe08829a4 118
bleverett3 5:c25fe08829a4 119 //Calculate average and update risk level
bleverett3 5:c25fe08829a4 120 if(averageCount > 15) {
chenchen2020 0:bedc25613430 121 averageCount = 0;
bleverett3 5:c25fe08829a4 122 int average = calculate_average(RSSI_array, 16);
bleverett3 3:f0f6530b145f 123 int temp_risk_level;
chenchen2020 2:f65d4206b47b 124 if(average < 55) {
bleverett3 3:f0f6530b145f 125 temp_risk_level = 3;
chenchen2020 2:f65d4206b47b 126 } else if(average > 55 && average < 70) {
bleverett3 3:f0f6530b145f 127 temp_risk_level = 2;
chenchen2020 2:f65d4206b47b 128 } else if(average > 70 && average < 90) {
bleverett3 3:f0f6530b145f 129 temp_risk_level = 1;
chenchen2020 2:f65d4206b47b 130 } else {
bleverett3 3:f0f6530b145f 131 temp_risk_level = 0;
chenchen2020 0:bedc25613430 132 }
bleverett3 3:f0f6530b145f 133 if(temp_risk_level != risk_level){
bleverett3 3:f0f6530b145f 134 changed = 1;
bleverett3 3:f0f6530b145f 135 }
bleverett3 3:f0f6530b145f 136 risk_level = temp_risk_level;
bleverett3 6:57e646faac4d 137 serial_lock.unlock();
bleverett3 6:57e646faac4d 138 log_sd_card();
chenchen2020 0:bedc25613430 139 }
chenchen2020 2:f65d4206b47b 140 }
bleverett3 5:c25fe08829a4 141 serial_lock.unlock();
chenchen2020 2:f65d4206b47b 142 }
chenchen2020 2:f65d4206b47b 143
chenchen2020 2:f65d4206b47b 144 //This portion of the code handles peripherals
chenchen2020 2:f65d4206b47b 145 /*
chenchen2020 2:f65d4206b47b 146 void speaker_alarm()
chenchen2020 2:f65d4206b47b 147 {
chenchen2020 2:f65d4206b47b 148 while(1){
chenchen2020 2:f65d4206b47b 149 if(risk_level >= 2 && datalogged){
chenchen2020 2:f65d4206b47b 150 mySpeaker.PlayNote(969.0, 0.5, 1.0);
chenchen2020 2:f65d4206b47b 151 mySpeaker.PlayNote(800.0, 0.5, 1.0);
chenchen2020 2:f65d4206b47b 152 }else{
chenchen2020 2:f65d4206b47b 153 mySpeaker.PlayNote(0.0, 0.0, 0.0);
chenchen2020 2:f65d4206b47b 154 }
chenchen2020 2:f65d4206b47b 155 }
chenchen2020 2:f65d4206b47b 156 }
chenchen2020 2:f65d4206b47b 157 */
chenchen2020 2:f65d4206b47b 158
chenchen2020 2:f65d4206b47b 159 void blink_leds()
chenchen2020 2:f65d4206b47b 160 {
chenchen2020 2:f65d4206b47b 161 while(1){
bleverett3 5:c25fe08829a4 162 if(risk_level <= 1){
chenchen2020 2:f65d4206b47b 163 greenLED = 1;
chenchen2020 2:f65d4206b47b 164 redLED = 0;
chenchen2020 2:f65d4206b47b 165 yellowLED = 0;
bleverett3 5:c25fe08829a4 166 }else if(risk_level == 2){
chenchen2020 2:f65d4206b47b 167 yellowLED = 1;
chenchen2020 2:f65d4206b47b 168 greenLED = 0;
chenchen2020 2:f65d4206b47b 169 redLED = 0;
bleverett3 5:c25fe08829a4 170 }else if(risk_level == 3){
chenchen2020 2:f65d4206b47b 171 redLED = 1;
chenchen2020 2:f65d4206b47b 172 yellowLED = 0;
chenchen2020 2:f65d4206b47b 173 greenLED = 0;
chenchen2020 2:f65d4206b47b 174 }else{
chenchen2020 2:f65d4206b47b 175 redLED = 0;
chenchen2020 2:f65d4206b47b 176 yellowLED = 0;
chenchen2020 2:f65d4206b47b 177 greenLED = 0;
chenchen2020 2:f65d4206b47b 178 }
chenchen2020 0:bedc25613430 179 }
chenchen2020 0:bedc25613430 180 }
chenchen2020 0:bedc25613430 181
chenchen2020 2:f65d4206b47b 182 void display_ulcd()
chenchen2020 2:f65d4206b47b 183 {
bleverett3 5:c25fe08829a4 184 serial_lock.lock();
bleverett3 3:f0f6530b145f 185 uLCD.color(WHITE);
bleverett3 5:c25fe08829a4 186 serial_lock.unlock();
chenchen2020 2:f65d4206b47b 187 while(1){
bleverett3 3:f0f6530b145f 188 if (changed) {
bleverett3 5:c25fe08829a4 189 serial_lock.lock();
bleverett3 3:f0f6530b145f 190 if(risk_level <= 1){
bleverett3 3:f0f6530b145f 191 uLCD.cls();
bleverett3 3:f0f6530b145f 192 uLCD.locate(5, 7);
bleverett3 3:f0f6530b145f 193 uLCD.text_width(2);
bleverett3 3:f0f6530b145f 194 uLCD.text_height(2);
bleverett3 3:f0f6530b145f 195 uLCD.background_color(GREEN);
bleverett3 3:f0f6530b145f 196 uLCD.textbackground_color(GREEN);
bleverett3 3:f0f6530b145f 197 uLCD.printf("Safe");
bleverett3 5:c25fe08829a4 198 } else if(risk_level == 2){
bleverett3 3:f0f6530b145f 199 uLCD.cls();
bleverett3 3:f0f6530b145f 200 uLCD.locate(1, 7);
bleverett3 3:f0f6530b145f 201 uLCD.text_width(2);
bleverett3 3:f0f6530b145f 202 uLCD.text_height(2);
bleverett3 3:f0f6530b145f 203 uLCD.background_color(0xFFFF00);
bleverett3 3:f0f6530b145f 204 uLCD.textbackground_color(0xFFFF00);
bleverett3 3:f0f6530b145f 205 uLCD.printf("Cautious");
bleverett3 5:c25fe08829a4 206 } else if(risk_level == 3){
bleverett3 3:f0f6530b145f 207 uLCD.cls();
bleverett3 3:f0f6530b145f 208 uLCD.locate(3, 7);
bleverett3 3:f0f6530b145f 209 uLCD.text_width(2);
bleverett3 3:f0f6530b145f 210 uLCD.text_height(2);
bleverett3 3:f0f6530b145f 211 uLCD.background_color(RED);
bleverett3 3:f0f6530b145f 212 uLCD.textbackground_color(RED);
bleverett3 3:f0f6530b145f 213 uLCD.printf("Hazard");
bleverett3 3:f0f6530b145f 214 }
bleverett3 3:f0f6530b145f 215 changed = 0;
bleverett3 5:c25fe08829a4 216 serial_lock.unlock();
chenchen2020 2:f65d4206b47b 217 }
chenchen2020 2:f65d4206b47b 218 }
chenchen2020 0:bedc25613430 219 }
chenchen2020 0:bedc25613430 220
chenchen2020 0:bedc25613430 221 int main()
chenchen2020 0:bedc25613430 222 {
bleverett3 5:c25fe08829a4 223 //Bluetooth initialization
chenchen2020 0:bedc25613430 224 cmdstuff = 1;
chenchen2020 0:bedc25613430 225 at.send("AT") && at.recv("OK");
chenchen2020 0:bedc25613430 226 at.send("AT+AB ChangeDefaultBaud [9600]", 3) && at.recv("OK");
chenchen2020 0:bedc25613430 227 pc.baud(9600);
bleverett3 5:c25fe08829a4 228 ble.baud(9600);\
bleverett3 5:c25fe08829a4 229
bleverett3 5:c25fe08829a4 230 //Time initialization
bleverett3 6:57e646faac4d 231 set_time(1588089600); // Set RTC time to Tuesday 28, April 2020 16:00:00
bleverett3 5:c25fe08829a4 232 seconds = time(NULL);
bleverett3 5:c25fe08829a4 233
bleverett3 5:c25fe08829a4 234 //SD card initialization
bleverett3 5:c25fe08829a4 235 mkdir("/sd/mydir", 0777);
chenchen2020 2:f65d4206b47b 236
bleverett3 5:c25fe08829a4 237 //Starting threads
chenchen2020 2:f65d4206b47b 238 //Thread SD_Thread();
chenchen2020 2:f65d4206b47b 239 Thread ULCD_Thread(display_ulcd);
chenchen2020 2:f65d4206b47b 240 Thread LED_Thread(blink_leds);
chenchen2020 2:f65d4206b47b 241 //Thread Speaker_Thread(speaker_alarm);
bleverett3 5:c25fe08829a4 242
chenchen2020 0:bedc25613430 243 while(1) {
chenchen2020 0:bedc25613430 244 parse_RSSI();
chenchen2020 0:bedc25613430 245 }
chenchen2020 0:bedc25613430 246 }