Ben: change on lcd and sd card draft

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

Committer:
bleverett3
Date:
Sun Apr 26 01:03:34 2020 +0000
Revision:
5:c25fe08829a4
Parent:
3:f0f6530b145f
Child:
6:57e646faac4d
Ben, did a lot a shit

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 5:c25fe08829a4 44 //Helper function for parse_RSSI
chenchen2020 2:f65d4206b47b 45 int calculate_average(volatile int *input, int size)
chenchen2020 2:f65d4206b47b 46 {
chenchen2020 0:bedc25613430 47 int average;
chenchen2020 2:f65d4206b47b 48 for(int i = 0; i< size; i++) {
chenchen2020 0:bedc25613430 49 average = average + input[i];
chenchen2020 0:bedc25613430 50 }
chenchen2020 0:bedc25613430 51 average = average/size;
chenchen2020 0:bedc25613430 52 return average;
chenchen2020 0:bedc25613430 53 }
chenchen2020 0:bedc25613430 54
bleverett3 5:c25fe08829a4 55 //This portion of the code handles RSSI readings
chenchen2020 2:f65d4206b47b 56 void parse_RSSI()
chenchen2020 2:f65d4206b47b 57 {
bleverett3 5:c25fe08829a4 58 serial_lock.lock();
chenchen2020 1:8eb0ee57df9f 59 at.send("AT+BLEGETRSSI") && at.read(buffer, 10);
chenchen2020 2:f65d4206b47b 60 if(buffer[0] == '-') {
bleverett3 5:c25fe08829a4 61 //Getting RSSI number
bleverett3 5:c25fe08829a4 62 int digit = 1;
bleverett3 5:c25fe08829a4 63 int total = 0;
bleverett3 5:c25fe08829a4 64 for (int i = 0; i < 10; i++) {
bleverett3 5:c25fe08829a4 65 if (buffer[i] > 47 || buffer[i] < 58) {
bleverett3 5:c25fe08829a4 66 total += (buffer[i] * digit);
bleverett3 5:c25fe08829a4 67 digit = digit*10;
bleverett3 5:c25fe08829a4 68 } else if (buffer[i] == 92) {
bleverett3 5:c25fe08829a4 69 break;
bleverett3 5:c25fe08829a4 70 }
bleverett3 5:c25fe08829a4 71 }
bleverett3 5:c25fe08829a4 72
bleverett3 5:c25fe08829a4 73 //Printing for confirmation
chenchen2020 0:bedc25613430 74 pc.printf("RSSI: ");
bleverett3 5:c25fe08829a4 75 pc.printf("%s", buffer);
chenchen2020 0:bedc25613430 76 pc.printf("\n");
bleverett3 5:c25fe08829a4 77
bleverett3 5:c25fe08829a4 78 //Store for average
chenchen2020 2:f65d4206b47b 79 if (averageCount <= 15) {
chenchen2020 0:bedc25613430 80 RSSI_array[averageCount] = total;
chenchen2020 0:bedc25613430 81 }
chenchen2020 2:f65d4206b47b 82 averageCount++;
bleverett3 5:c25fe08829a4 83
bleverett3 5:c25fe08829a4 84 //Calculate average and update risk level
bleverett3 5:c25fe08829a4 85 if(averageCount > 15) {
chenchen2020 0:bedc25613430 86 averageCount = 0;
bleverett3 5:c25fe08829a4 87 int average = calculate_average(RSSI_array, 16);
bleverett3 3:f0f6530b145f 88 int temp_risk_level;
chenchen2020 2:f65d4206b47b 89 if(average < 55) {
bleverett3 3:f0f6530b145f 90 temp_risk_level = 3;
chenchen2020 2:f65d4206b47b 91 } else if(average > 55 && average < 70) {
bleverett3 3:f0f6530b145f 92 temp_risk_level = 2;
chenchen2020 2:f65d4206b47b 93 } else if(average > 70 && average < 90) {
bleverett3 3:f0f6530b145f 94 temp_risk_level = 1;
chenchen2020 2:f65d4206b47b 95 } else {
bleverett3 3:f0f6530b145f 96 temp_risk_level = 0;
chenchen2020 0:bedc25613430 97 }
bleverett3 3:f0f6530b145f 98 if(temp_risk_level != risk_level){
bleverett3 3:f0f6530b145f 99 changed = 1;
bleverett3 3:f0f6530b145f 100 }
bleverett3 3:f0f6530b145f 101 risk_level = temp_risk_level;
chenchen2020 0:bedc25613430 102 }
chenchen2020 2:f65d4206b47b 103 }
bleverett3 5:c25fe08829a4 104 serial_lock.unlock();
chenchen2020 2:f65d4206b47b 105 }
chenchen2020 2:f65d4206b47b 106
chenchen2020 2:f65d4206b47b 107 //This portion of the code handles peripherals
chenchen2020 2:f65d4206b47b 108 /*
chenchen2020 2:f65d4206b47b 109 void speaker_alarm()
chenchen2020 2:f65d4206b47b 110 {
chenchen2020 2:f65d4206b47b 111 while(1){
chenchen2020 2:f65d4206b47b 112 if(risk_level >= 2 && datalogged){
chenchen2020 2:f65d4206b47b 113 mySpeaker.PlayNote(969.0, 0.5, 1.0);
chenchen2020 2:f65d4206b47b 114 mySpeaker.PlayNote(800.0, 0.5, 1.0);
chenchen2020 2:f65d4206b47b 115 }else{
chenchen2020 2:f65d4206b47b 116 mySpeaker.PlayNote(0.0, 0.0, 0.0);
chenchen2020 2:f65d4206b47b 117 }
chenchen2020 2:f65d4206b47b 118 }
chenchen2020 2:f65d4206b47b 119 }
chenchen2020 2:f65d4206b47b 120 */
chenchen2020 2:f65d4206b47b 121
chenchen2020 2:f65d4206b47b 122 void logging_SD_card()
bleverett3 5:c25fe08829a4 123 {
bleverett3 5:c25fe08829a4 124 serial_lock.lock();
bleverett3 3:f0f6530b145f 125 FILE *fp = fopen("/sd/mydir/sdtest.txt", "w");
bleverett3 3:f0f6530b145f 126 if(fp == NULL) {
bleverett3 3:f0f6530b145f 127 error("Could not open file for write\n");
bleverett3 3:f0f6530b145f 128 }
bleverett3 3:f0f6530b145f 129
bleverett3 5:c25fe08829a4 130 if(risk_level <= 1){
bleverett3 3:f0f6530b145f 131 fprintf(fp, "Risk level 1");
bleverett3 3:f0f6530b145f 132 fprintf(fp, "Time" , ctime(&seconds));
bleverett3 5:c25fe08829a4 133 } else if(risk_level == 2){
bleverett3 3:f0f6530b145f 134 fprintf(fp, "Risk level 2");
bleverett3 3:f0f6530b145f 135 fprintf(fp, "Time" , ctime(&seconds));
bleverett3 5:c25fe08829a4 136 } else if(risk_level == 3) {
bleverett3 5:c25fe08829a4 137 fprintf(fp, "Risk level 3");
bleverett3 3:f0f6530b145f 138 fprintf(fp, "Time" , ctime(&seconds));
bleverett3 5:c25fe08829a4 139 }
bleverett3 5:c25fe08829a4 140 fclose(fp);
chenchen2020 2:f65d4206b47b 141 }
chenchen2020 2:f65d4206b47b 142
chenchen2020 2:f65d4206b47b 143 void blink_leds()
chenchen2020 2:f65d4206b47b 144 {
chenchen2020 2:f65d4206b47b 145 while(1){
bleverett3 5:c25fe08829a4 146 if(risk_level <= 1){
chenchen2020 2:f65d4206b47b 147 greenLED = 1;
chenchen2020 2:f65d4206b47b 148 redLED = 0;
chenchen2020 2:f65d4206b47b 149 yellowLED = 0;
bleverett3 5:c25fe08829a4 150 }else if(risk_level == 2){
chenchen2020 2:f65d4206b47b 151 yellowLED = 1;
chenchen2020 2:f65d4206b47b 152 greenLED = 0;
chenchen2020 2:f65d4206b47b 153 redLED = 0;
bleverett3 5:c25fe08829a4 154 }else if(risk_level == 3){
chenchen2020 2:f65d4206b47b 155 redLED = 1;
chenchen2020 2:f65d4206b47b 156 yellowLED = 0;
chenchen2020 2:f65d4206b47b 157 greenLED = 0;
chenchen2020 2:f65d4206b47b 158 }else{
chenchen2020 2:f65d4206b47b 159 redLED = 0;
chenchen2020 2:f65d4206b47b 160 yellowLED = 0;
chenchen2020 2:f65d4206b47b 161 greenLED = 0;
chenchen2020 2:f65d4206b47b 162 }
chenchen2020 0:bedc25613430 163 }
chenchen2020 0:bedc25613430 164 }
chenchen2020 0:bedc25613430 165
chenchen2020 2:f65d4206b47b 166 void display_ulcd()
chenchen2020 2:f65d4206b47b 167 {
bleverett3 5:c25fe08829a4 168 serial_lock.lock();
bleverett3 3:f0f6530b145f 169 uLCD.color(WHITE);
bleverett3 5:c25fe08829a4 170 serial_lock.unlock();
chenchen2020 2:f65d4206b47b 171 while(1){
bleverett3 3:f0f6530b145f 172 if (changed) {
bleverett3 5:c25fe08829a4 173 serial_lock.lock();
bleverett3 3:f0f6530b145f 174 if(risk_level <= 1){
bleverett3 3:f0f6530b145f 175 uLCD.cls();
bleverett3 3:f0f6530b145f 176 uLCD.locate(5, 7);
bleverett3 3:f0f6530b145f 177 uLCD.text_width(2);
bleverett3 3:f0f6530b145f 178 uLCD.text_height(2);
bleverett3 3:f0f6530b145f 179 uLCD.background_color(GREEN);
bleverett3 3:f0f6530b145f 180 uLCD.textbackground_color(GREEN);
bleverett3 3:f0f6530b145f 181 uLCD.printf("Safe");
bleverett3 5:c25fe08829a4 182 } else if(risk_level == 2){
bleverett3 3:f0f6530b145f 183 uLCD.cls();
bleverett3 3:f0f6530b145f 184 uLCD.locate(1, 7);
bleverett3 3:f0f6530b145f 185 uLCD.text_width(2);
bleverett3 3:f0f6530b145f 186 uLCD.text_height(2);
bleverett3 3:f0f6530b145f 187 uLCD.background_color(0xFFFF00);
bleverett3 3:f0f6530b145f 188 uLCD.textbackground_color(0xFFFF00);
bleverett3 3:f0f6530b145f 189 uLCD.printf("Cautious");
bleverett3 5:c25fe08829a4 190 } else if(risk_level == 3){
bleverett3 3:f0f6530b145f 191 uLCD.cls();
bleverett3 3:f0f6530b145f 192 uLCD.locate(3, 7);
bleverett3 3:f0f6530b145f 193 uLCD.text_width(2);
bleverett3 3:f0f6530b145f 194 uLCD.text_height(2);
bleverett3 3:f0f6530b145f 195 uLCD.background_color(RED);
bleverett3 3:f0f6530b145f 196 uLCD.textbackground_color(RED);
bleverett3 3:f0f6530b145f 197 uLCD.printf("Hazard");
bleverett3 3:f0f6530b145f 198 }
bleverett3 3:f0f6530b145f 199 changed = 0;
bleverett3 5:c25fe08829a4 200 serial_lock.unlock();
chenchen2020 2:f65d4206b47b 201 }
chenchen2020 2:f65d4206b47b 202 }
chenchen2020 0:bedc25613430 203 }
chenchen2020 0:bedc25613430 204
chenchen2020 0:bedc25613430 205 int main()
chenchen2020 0:bedc25613430 206 {
bleverett3 5:c25fe08829a4 207 //Bluetooth initialization
chenchen2020 0:bedc25613430 208 cmdstuff = 1;
chenchen2020 0:bedc25613430 209 at.send("AT") && at.recv("OK");
chenchen2020 0:bedc25613430 210 at.send("AT+AB ChangeDefaultBaud [9600]", 3) && at.recv("OK");
chenchen2020 0:bedc25613430 211 pc.baud(9600);
bleverett3 5:c25fe08829a4 212 ble.baud(9600);\
bleverett3 5:c25fe08829a4 213
bleverett3 5:c25fe08829a4 214 //Time initialization
bleverett3 5:c25fe08829a4 215 set_time(1256729737); // Set RTC time to Wed, 28 Oct 2009 11:35:37
bleverett3 5:c25fe08829a4 216 seconds = time(NULL);
bleverett3 5:c25fe08829a4 217
bleverett3 5:c25fe08829a4 218 //SD card initialization
bleverett3 5:c25fe08829a4 219 mkdir("/sd/mydir", 0777);
chenchen2020 2:f65d4206b47b 220
bleverett3 5:c25fe08829a4 221 //Starting threads
chenchen2020 2:f65d4206b47b 222 //Thread SD_Thread();
chenchen2020 2:f65d4206b47b 223 Thread ULCD_Thread(display_ulcd);
chenchen2020 2:f65d4206b47b 224 Thread LED_Thread(blink_leds);
chenchen2020 2:f65d4206b47b 225 //Thread Speaker_Thread(speaker_alarm);
bleverett3 5:c25fe08829a4 226
chenchen2020 0:bedc25613430 227 while(1) {
chenchen2020 0:bedc25613430 228 parse_RSSI();
chenchen2020 0:bedc25613430 229 }
chenchen2020 0:bedc25613430 230 }