Semaphore attempt ben

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

Committer:
bleverett3
Date:
Wed Apr 29 01:24:34 2020 +0000
Revision:
5:dc2f1a9c92a2
Parent:
4:57e7983c861c
Semaphore

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
chenchen2020 0:bedc25613430 12 //General setups
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 4:57e7983c861c 22 PwmOut speaker(p21);
chenchen2020 4:57e7983c861c 23 DigitalOut speaker_on(p23);
chenchen2020 0:bedc25613430 24
chenchen2020 0:bedc25613430 25 //AT command data handlers
chenchen2020 2:f65d4206b47b 26 bool datalogged = 0;
chenchen2020 4:57e7983c861c 27 //bool changed = 0;
chenchen2020 0:bedc25613430 28 char delimiter[] = "\r\n";
chenchen2020 0:bedc25613430 29 int buffer_size = 256;
chenchen2020 0:bedc25613430 30 int timeout = 100;
chenchen2020 0:bedc25613430 31 bool debug = false;
chenchen2020 0:bedc25613430 32 ATParser at(ble, delimiter, buffer_size, timeout, debug);
chenchen2020 0:bedc25613430 33 char buffer[10];
chenchen2020 0:bedc25613430 34 volatile int risk_level = 0;
chenchen2020 4:57e7983c861c 35 //speaker_on = 0;
chenchen2020 0:bedc25613430 36
chenchen2020 2:f65d4206b47b 37 //RTOS Mutex Lock
chenchen2020 0:bedc25613430 38 Mutex mutex_lock;
bleverett3 5:dc2f1a9c92a2 39 uint16_t max_count = 1;
bleverett3 5:dc2f1a9c92a2 40 Semaphore lcd_sem(1);
chenchen2020 0:bedc25613430 41
chenchen2020 4:57e7983c861c 42 time_t seconds;
chenchen2020 4:57e7983c861c 43
chenchen2020 0:bedc25613430 44 //Global Data points and arrays
chenchen2020 0:bedc25613430 45 int averageCount = 0;
chenchen2020 0:bedc25613430 46 volatile int RSSI_array[15];
chenchen2020 0:bedc25613430 47
chenchen2020 2:f65d4206b47b 48 //This portion of the code handles RSSI readings
chenchen2020 0:bedc25613430 49
chenchen2020 2:f65d4206b47b 50 int calculate_average(volatile int *input, int size)
chenchen2020 2:f65d4206b47b 51 {
chenchen2020 0:bedc25613430 52 int average;
chenchen2020 2:f65d4206b47b 53 for(int i = 0; i< size; i++) {
chenchen2020 0:bedc25613430 54 average = average + input[i];
chenchen2020 0:bedc25613430 55 }
chenchen2020 0:bedc25613430 56 average = average/size;
chenchen2020 0:bedc25613430 57 return average;
chenchen2020 0:bedc25613430 58 }
chenchen2020 0:bedc25613430 59
chenchen2020 2:f65d4206b47b 60 void parse_RSSI()
chenchen2020 2:f65d4206b47b 61 {
chenchen2020 2:f65d4206b47b 62 mutex_lock.lock();
bleverett3 5:dc2f1a9c92a2 63 lcd_sem.wait();
chenchen2020 1:8eb0ee57df9f 64 at.send("AT+BLEGETRSSI") && at.read(buffer, 10);
chenchen2020 2:f65d4206b47b 65 if(buffer[0] == '-') {
chenchen2020 2:f65d4206b47b 66 datalogged = 1;
chenchen2020 0:bedc25613430 67 pc.printf("RSSI: ");
chenchen2020 0:bedc25613430 68 pc.putc(buffer[1]);
chenchen2020 0:bedc25613430 69 pc.putc(buffer[2]);
chenchen2020 0:bedc25613430 70 pc.printf("\n");
chenchen2020 4:57e7983c861c 71 int digit1 = buffer[1] - 48; //Converts char to int
chenchen2020 0:bedc25613430 72 int digit2 = buffer[2] - 48;
chenchen2020 0:bedc25613430 73 int total = 10*digit1 + digit2;
chenchen2020 2:f65d4206b47b 74 if (averageCount <= 15) {
chenchen2020 0:bedc25613430 75 RSSI_array[averageCount] = total;
chenchen2020 0:bedc25613430 76 }
chenchen2020 2:f65d4206b47b 77 averageCount++;
bleverett3 5:dc2f1a9c92a2 78 int temp_risk = risk_level;
chenchen2020 2:f65d4206b47b 79 if(averageCount > 15 && buffer[0] == '-') {
chenchen2020 0:bedc25613430 80 averageCount = 0;
chenchen2020 0:bedc25613430 81 int average = calculate_average(RSSI_array, 15);
chenchen2020 2:f65d4206b47b 82 if(average < 55) {
chenchen2020 0:bedc25613430 83 risk_level = 3;
chenchen2020 2:f65d4206b47b 84 } else if(average > 55 && average < 70) {
chenchen2020 0:bedc25613430 85 risk_level = 2;
chenchen2020 2:f65d4206b47b 86 } else if(average > 70 && average < 90) {
chenchen2020 0:bedc25613430 87 risk_level = 1;
chenchen2020 2:f65d4206b47b 88 } else {
chenchen2020 2:f65d4206b47b 89 risk_level = 0;
chenchen2020 0:bedc25613430 90 }
chenchen2020 0:bedc25613430 91 }
bleverett3 5:dc2f1a9c92a2 92 if (temp_risk != risk_level) {
bleverett3 5:dc2f1a9c92a2 93 lcd_sem.release();
bleverett3 5:dc2f1a9c92a2 94 }
chenchen2020 0:bedc25613430 95 pc.printf("Risk level: ");
chenchen2020 0:bedc25613430 96 pc.printf("%i\n", risk_level);
chenchen2020 2:f65d4206b47b 97 } else {
chenchen2020 0:bedc25613430 98 pc.printf("Disconnected\n");
chenchen2020 2:f65d4206b47b 99 datalogged = 0;
chenchen2020 2:f65d4206b47b 100 }
chenchen2020 2:f65d4206b47b 101 mutex_lock.unlock();
chenchen2020 2:f65d4206b47b 102 }
chenchen2020 2:f65d4206b47b 103
chenchen2020 4:57e7983c861c 104
chenchen2020 2:f65d4206b47b 105 void speaker_alarm()
chenchen2020 2:f65d4206b47b 106 {
chenchen2020 4:57e7983c861c 107 while(1) {
chenchen2020 4:57e7983c861c 108 if(risk_level == 2 && datalogged) {
chenchen2020 4:57e7983c861c 109 speaker_on = 1;
chenchen2020 4:57e7983c861c 110 for (int i=0; i<10; i=i+2) {
chenchen2020 4:57e7983c861c 111 speaker.period(1.0/969.0);
chenchen2020 4:57e7983c861c 112 speaker = float(i)/50.0;
chenchen2020 4:57e7983c861c 113 wait(.8);
chenchen2020 4:57e7983c861c 114 speaker.period(1.0/800.0);
chenchen2020 4:57e7983c861c 115 wait(.8);
chenchen2020 4:57e7983c861c 116 }
chenchen2020 4:57e7983c861c 117 } else if(risk_level == 3 && datalogged) {
chenchen2020 4:57e7983c861c 118 speaker_on = 1;
chenchen2020 4:57e7983c861c 119 for (int i=0; i<26; i=i+2) {
chenchen2020 4:57e7983c861c 120 speaker.period(1.0/969.0);
chenchen2020 4:57e7983c861c 121 speaker = float(i)/50.0;
chenchen2020 4:57e7983c861c 122 wait(.25);
chenchen2020 4:57e7983c861c 123 speaker.period(1.0/800.0);
chenchen2020 4:57e7983c861c 124 wait(.25);
chenchen2020 4:57e7983c861c 125 }
chenchen2020 4:57e7983c861c 126 } else {
chenchen2020 4:57e7983c861c 127 speaker_on = 0;
chenchen2020 2:f65d4206b47b 128 }
chenchen2020 2:f65d4206b47b 129 }
chenchen2020 2:f65d4206b47b 130 }
chenchen2020 4:57e7983c861c 131
chenchen2020 2:f65d4206b47b 132
chenchen2020 2:f65d4206b47b 133 void logging_SD_card()
chenchen2020 2:f65d4206b47b 134 {
chenchen2020 4:57e7983c861c 135 while(1) {
chenchen2020 4:57e7983c861c 136 mutex_lock.lock();
chenchen2020 4:57e7983c861c 137 FILE *fp = fopen("/sd/mydir/sdtest.txt", "w");
chenchen2020 4:57e7983c861c 138 if(fp == NULL) {
chenchen2020 4:57e7983c861c 139 error("Could not open file for write\n");
chenchen2020 4:57e7983c861c 140 }
chenchen2020 2:f65d4206b47b 141
chenchen2020 4:57e7983c861c 142 if(risk_level <= 1) {
chenchen2020 4:57e7983c861c 143 fprintf(fp, "Risk level 1");
chenchen2020 4:57e7983c861c 144 fprintf(fp, "Time", ctime(&seconds));
chenchen2020 4:57e7983c861c 145 } else if(risk_level == 2) {
chenchen2020 4:57e7983c861c 146 fprintf(fp, "Risk level 2");
chenchen2020 4:57e7983c861c 147 fprintf(fp, "Time", ctime(&seconds));
chenchen2020 4:57e7983c861c 148 } else if(risk_level == 3) {
chenchen2020 4:57e7983c861c 149 fprintf(fp, "Risk level 3");
chenchen2020 4:57e7983c861c 150 fprintf(fp, "Time", ctime(&seconds));
chenchen2020 4:57e7983c861c 151 }
chenchen2020 4:57e7983c861c 152 fclose(fp);
chenchen2020 4:57e7983c861c 153 mutex_lock.unlock();
chenchen2020 4:57e7983c861c 154 }
chenchen2020 2:f65d4206b47b 155 }
chenchen2020 2:f65d4206b47b 156
chenchen2020 4:57e7983c861c 157
chenchen2020 4:57e7983c861c 158
chenchen2020 2:f65d4206b47b 159 void blink_leds()
chenchen2020 2:f65d4206b47b 160 {
chenchen2020 4:57e7983c861c 161 while(1) {
chenchen2020 4:57e7983c861c 162 if(risk_level <= 1 && datalogged) {
chenchen2020 2:f65d4206b47b 163 greenLED = 1;
chenchen2020 2:f65d4206b47b 164 redLED = 0;
chenchen2020 2:f65d4206b47b 165 yellowLED = 0;
chenchen2020 4:57e7983c861c 166 } else if(risk_level == 2 && datalogged) {
chenchen2020 2:f65d4206b47b 167 yellowLED = 1;
chenchen2020 2:f65d4206b47b 168 greenLED = 0;
chenchen2020 2:f65d4206b47b 169 redLED = 0;
chenchen2020 4:57e7983c861c 170 } else if(risk_level == 3 && datalogged) {
chenchen2020 2:f65d4206b47b 171 redLED = 1;
chenchen2020 2:f65d4206b47b 172 yellowLED = 0;
chenchen2020 2:f65d4206b47b 173 greenLED = 0;
chenchen2020 4:57e7983c861c 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 {
chenchen2020 3:2a4bee05d0c1 184 mutex_lock.lock();
chenchen2020 3:2a4bee05d0c1 185 uLCD.color(WHITE);
chenchen2020 3:2a4bee05d0c1 186 mutex_lock.unlock();
chenchen2020 4:57e7983c861c 187 while(1) {
chenchen2020 2:f65d4206b47b 188 mutex_lock.lock();
bleverett3 5:dc2f1a9c92a2 189 lcd_sem.wait();
chenchen2020 4:57e7983c861c 190 if(risk_level <= 1 && datalogged) {
chenchen2020 4:57e7983c861c 191 mutex_lock.lock();
chenchen2020 3:2a4bee05d0c1 192 uLCD.cls();
chenchen2020 3:2a4bee05d0c1 193 uLCD.locate(5, 7);
chenchen2020 3:2a4bee05d0c1 194 uLCD.text_width(2);
chenchen2020 3:2a4bee05d0c1 195 uLCD.text_height(2);
chenchen2020 3:2a4bee05d0c1 196 uLCD.background_color(GREEN);
chenchen2020 3:2a4bee05d0c1 197 uLCD.textbackground_color(GREEN);
chenchen2020 3:2a4bee05d0c1 198 uLCD.printf("Safe");
chenchen2020 4:57e7983c861c 199 mutex_lock.unlock();
chenchen2020 4:57e7983c861c 200 } else if(risk_level == 2 && datalogged) {
chenchen2020 4:57e7983c861c 201 mutex_lock.lock();
chenchen2020 3:2a4bee05d0c1 202 uLCD.cls();
chenchen2020 3:2a4bee05d0c1 203 uLCD.locate(1, 7);
chenchen2020 3:2a4bee05d0c1 204 uLCD.text_width(2);
chenchen2020 3:2a4bee05d0c1 205 uLCD.text_height(2);
chenchen2020 3:2a4bee05d0c1 206 uLCD.background_color(0xFFFF00);
chenchen2020 3:2a4bee05d0c1 207 uLCD.textbackground_color(0xFFFF00);
chenchen2020 3:2a4bee05d0c1 208 uLCD.printf("Cautious");
chenchen2020 4:57e7983c861c 209 mutex_lock.unlock();
chenchen2020 4:57e7983c861c 210 } else if(risk_level == 3 && datalogged) {
chenchen2020 4:57e7983c861c 211 mutex_lock.lock();
chenchen2020 3:2a4bee05d0c1 212 uLCD.cls();
chenchen2020 3:2a4bee05d0c1 213 uLCD.locate(3, 7);
chenchen2020 3:2a4bee05d0c1 214 uLCD.text_width(2);
chenchen2020 3:2a4bee05d0c1 215 uLCD.text_height(2);
chenchen2020 3:2a4bee05d0c1 216 uLCD.background_color(RED);
chenchen2020 3:2a4bee05d0c1 217 uLCD.textbackground_color(RED);
chenchen2020 3:2a4bee05d0c1 218 uLCD.printf("Hazard");
chenchen2020 4:57e7983c861c 219 mutex_lock.unlock();
chenchen2020 2:f65d4206b47b 220 }
bleverett3 5:dc2f1a9c92a2 221 lcd_sem.release();
chenchen2020 2:f65d4206b47b 222 mutex_lock.unlock();
chenchen2020 2:f65d4206b47b 223 }
chenchen2020 0:bedc25613430 224 }
chenchen2020 0:bedc25613430 225
chenchen2020 0:bedc25613430 226 int main()
chenchen2020 0:bedc25613430 227 {
chenchen2020 4:57e7983c861c 228 speaker_on = 0;
chenchen2020 0:bedc25613430 229 cmdstuff = 1;
chenchen2020 0:bedc25613430 230 at.send("AT") && at.recv("OK");
chenchen2020 0:bedc25613430 231 at.send("AT+AB ChangeDefaultBaud [9600]", 3) && at.recv("OK");
chenchen2020 0:bedc25613430 232 pc.baud(9600);
chenchen2020 0:bedc25613430 233 ble.baud(9600);
chenchen2020 2:f65d4206b47b 234
chenchen2020 4:57e7983c861c 235 Thread SD_Thread();
chenchen2020 2:f65d4206b47b 236 Thread ULCD_Thread(display_ulcd);
chenchen2020 2:f65d4206b47b 237 Thread LED_Thread(blink_leds);
chenchen2020 4:57e7983c861c 238 Thread Speaker_Thread(speaker_alarm);
chenchen2020 4:57e7983c861c 239
chenchen2020 0:bedc25613430 240 while(1) {
chenchen2020 0:bedc25613430 241 parse_RSSI();
chenchen2020 0:bedc25613430 242 }
chenchen2020 0:bedc25613430 243 }