Buffer working with LCD, Serial and SD Card

Dependencies:   BMP280

Fork of Thread_Communication by BDG

Committer:
dnonoo
Date:
Fri Dec 29 17:50:30 2017 +0000
Revision:
8:ab6322afa341
Parent:
7:f017a37bcf1b
Buffer(Mutex) with LCD (Mail Queue), Serial and SD Card (Mutex Locks)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benparkes 0:cb3a5c15b01e 1 #include "mbed.h"
benparkes 0:cb3a5c15b01e 2 #include "main.h"
dnonoo 7:f017a37bcf1b 3 #include "stdio.h"
GeorgeJourneaux 4:93d6d13d4de3 4
dnonoo 8:ab6322afa341 5 #define FallingEdge 0
dnonoo 8:ab6322afa341 6 #define RisingEdge 1
dnonoo 8:ab6322afa341 7 #define USER_BUTTON_PRESSED 1
dnonoo 8:ab6322afa341 8
GeorgeJourneaux 3:73497379c0cb 9 LCD lcd(PD_15, PF_12, PF_13, PE_9, PF_14, PF_15);
GeorgeJourneaux 3:73497379c0cb 10 BMP280 Sensor(D14, D15);
benparkes 0:cb3a5c15b01e 11
GeorgeJourneaux 5:ea3ec65cbf5f 12 //Define Functions
benparkes 0:cb3a5c15b01e 13 void PrintLCD ();
GeorgeJourneaux 2:28d12a3db239 14 void Rx_interrupt();
dnonoo 7:f017a37bcf1b 15 void serialCMD();
dnonoo 7:f017a37bcf1b 16 void sensorRead();
dnonoo 7:f017a37bcf1b 17 void readISR();
dnonoo 7:f017a37bcf1b 18 void circBuff();
dnonoo 8:ab6322afa341 19 void writeRemove_SD();
dnonoo 8:ab6322afa341 20
dnonoo 8:ab6322afa341 21
dnonoo 8:ab6322afa341 22 // USER_BUTTON ISRs (Debounce)
dnonoo 8:ab6322afa341 23
dnonoo 8:ab6322afa341 24 void userButtonRise();
dnonoo 8:ab6322afa341 25 void userButtonFall();
dnonoo 8:ab6322afa341 26 void userButtonTimeoutHandler();
dnonoo 8:ab6322afa341 27
dnonoo 8:ab6322afa341 28 // Tickers & Timeouts
dnonoo 8:ab6322afa341 29 Timeout userButtonTimeout; // FOR debouncing User Switch
dnonoo 8:ab6322afa341 30 Ticker read; // ***Sets sampling period!*** (ISR Signals sampling Thread)
GeorgeJourneaux 2:28d12a3db239 31
dnonoo 7:f017a37bcf1b 32 /* LOCKS */
GeorgeJourneaux 6:64d346936f0e 33 Mutex DataBuffer;
dnonoo 8:ab6322afa341 34 Mutex dataLock;
GeorgeJourneaux 5:ea3ec65cbf5f 35
dnonoo 7:f017a37bcf1b 36 /* THREADS */
dnonoo 7:f017a37bcf1b 37 Thread _PrintLCD, _serialCMD, _circBuff;
dnonoo 8:ab6322afa341 38 Thread _sensorRead (osPriorityRealtime); //dataLock Thread
dnonoo 8:ab6322afa341 39 Thread _writeRemove_SD;
GeorgeJourneaux 3:73497379c0cb 40
dnonoo 7:f017a37bcf1b 41 /* GLOBAL DATA */
dnonoo 7:f017a37bcf1b 42 volatile float LDR = 0;
dnonoo 7:f017a37bcf1b 43 volatile double PRES = 0;
dnonoo 7:f017a37bcf1b 44 volatile double TEMP = 0;
benparkes 1:bca9993a0df3 45
dnonoo 8:ab6322afa341 46 // int to hold current switch state
dnonoo 8:ab6322afa341 47 int userButtonState = FallingEdge;
dnonoo 8:ab6322afa341 48
dnonoo 8:ab6322afa341 49 /* DEBOUNCER INTERRUPTS */
dnonoo 8:ab6322afa341 50 InterruptIn userButton(USER_BUTTON);
dnonoo 8:ab6322afa341 51
dnonoo 8:ab6322afa341 52 void userButtonRise () {
dnonoo 8:ab6322afa341 53 userButton.rise(NULL);
dnonoo 8:ab6322afa341 54 userButtonState = RisingEdge;
dnonoo 8:ab6322afa341 55 userButtonTimeout.attach(&userButtonTimeoutHandler, 0.1);
dnonoo 8:ab6322afa341 56 }
benparkes 0:cb3a5c15b01e 57
dnonoo 8:ab6322afa341 58 void userButtonFall () {
dnonoo 8:ab6322afa341 59 userButton.fall(NULL);
dnonoo 8:ab6322afa341 60 _writeRemove_SD.signal_set(USER_BUTTON_PRESSED);
dnonoo 8:ab6322afa341 61 userButtonState = FallingEdge;
dnonoo 8:ab6322afa341 62 userButtonTimeout.attach(&userButtonTimeoutHandler, 0.1);
dnonoo 8:ab6322afa341 63 }
dnonoo 7:f017a37bcf1b 64
dnonoo 8:ab6322afa341 65 void userButtonTimeoutHandler() {
dnonoo 8:ab6322afa341 66 userButtonTimeout.detach();
dnonoo 8:ab6322afa341 67
dnonoo 8:ab6322afa341 68 switch (userButtonState) {
dnonoo 8:ab6322afa341 69 case RisingEdge:
dnonoo 8:ab6322afa341 70 userButton.fall(&userButtonFall);
dnonoo 8:ab6322afa341 71 break;
dnonoo 8:ab6322afa341 72 case FallingEdge:
dnonoo 8:ab6322afa341 73 userButton.rise(userButtonRise);
dnonoo 8:ab6322afa341 74 break;
dnonoo 8:ab6322afa341 75 }// End Switch
dnonoo 8:ab6322afa341 76 } //End ISR
GeorgeJourneaux 3:73497379c0cb 77 /*--------------------------------MAIN--------------------------------*/
GeorgeJourneaux 3:73497379c0cb 78 int main() {
GeorgeJourneaux 3:73497379c0cb 79
GeorgeJourneaux 3:73497379c0cb 80 pc.baud(9600);
GeorgeJourneaux 3:73497379c0cb 81 pc.attach(&Rx_interrupt, Serial::RxIrq);
dnonoo 7:f017a37bcf1b 82 POST();
dnonoo 7:f017a37bcf1b 83
dnonoo 7:f017a37bcf1b 84 _serialCMD.start(serialCMD);
dnonoo 7:f017a37bcf1b 85 _PrintLCD.start(PrintLCD);
dnonoo 7:f017a37bcf1b 86 _sensorRead.start(sensorRead);
dnonoo 7:f017a37bcf1b 87 _circBuff.start(circBuff);
dnonoo 8:ab6322afa341 88 _writeRemove_SD.start(writeRemove_SD);
dnonoo 7:f017a37bcf1b 89
dnonoo 8:ab6322afa341 90 userButton.rise(&userButtonRise);
dnonoo 7:f017a37bcf1b 91 read.attach(readISR, SAMPLING_PERIOD);
GeorgeJourneaux 5:ea3ec65cbf5f 92
dnonoo 7:f017a37bcf1b 93
dnonoo 8:ab6322afa341 94 while (1) {
dnonoo 8:ab6322afa341 95 Yellow_ext = ON;
dnonoo 8:ab6322afa341 96 Thread::wait (200);
dnonoo 8:ab6322afa341 97 Yellow_ext = OFF;
dnonoo 8:ab6322afa341 98 Thread::wait(200);
dnonoo 8:ab6322afa341 99 }// End While
dnonoo 8:ab6322afa341 100 } // End Main
dnonoo 7:f017a37bcf1b 101 /*--------------------------------------------------------------------*/
dnonoo 7:f017a37bcf1b 102 void circBuff () {
dnonoo 7:f017a37bcf1b 103
dnonoo 7:f017a37bcf1b 104 while(1) {
dnonoo 7:f017a37bcf1b 105 Thread::signal_wait(DATA_READY); // wait for signal from sensorRead
GeorgeJourneaux 5:ea3ec65cbf5f 106
dnonoo 7:f017a37bcf1b 107 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 108 DataBuffer.lock();
GeorgeJourneaux 5:ea3ec65cbf5f 109
dnonoo 7:f017a37bcf1b 110 //Format samples, send to FIFO buffer head
GeorgeJourneaux 6:64d346936f0e 111 memset(data_buffer[sample_h],NULL,64);
GeorgeJourneaux 5:ea3ec65cbf5f 112 time( &raw_time );
GeorgeJourneaux 5:ea3ec65cbf5f 113 sample_epoch = localtime( &raw_time );
GeorgeJourneaux 6:64d346936f0e 114 char sample_time[20];
GeorgeJourneaux 5:ea3ec65cbf5f 115 strftime(sample_time,20,"%d/%m/%Y %X",sample_epoch);
dnonoo 7:f017a37bcf1b 116
dnonoo 8:ab6322afa341 117 dataLock.lock(); //lock critical section
dnonoo 7:f017a37bcf1b 118 sprintf(data_buffer[sample_h],"%s, %2.2f, %4.2f, %.4f\n\r", sample_time, TEMP, PRES, LDR);
dnonoo 8:ab6322afa341 119 dataLock.unlock(); //unlock critical section
dnonoo 7:f017a37bcf1b 120
GeorgeJourneaux 5:ea3ec65cbf5f 121 memset(sample_time,NULL,20);
GeorgeJourneaux 5:ea3ec65cbf5f 122
dnonoo 7:f017a37bcf1b 123 //Set seperate FIFO head and tail for printing data
GeorgeJourneaux 6:64d346936f0e 124 data_h = sample_h;
GeorgeJourneaux 6:64d346936f0e 125 data_t = sample_t;
GeorgeJourneaux 6:64d346936f0e 126
dnonoo 7:f017a37bcf1b 127 //Move sample FIFO buffer head to next row in buffer
GeorgeJourneaux 6:64d346936f0e 128 sample_h++;
dnonoo 7:f017a37bcf1b 129 //Check sample FIFO buffer head
GeorgeJourneaux 6:64d346936f0e 130 if(sample_h >= MAX_SAMPLES){
GeorgeJourneaux 6:64d346936f0e 131 sample_h = 0;
GeorgeJourneaux 5:ea3ec65cbf5f 132 }
dnonoo 7:f017a37bcf1b 133 //Check sample FIFO buffer tail
GeorgeJourneaux 6:64d346936f0e 134 if(sample_t == sample_h){
GeorgeJourneaux 6:64d346936f0e 135 sample_t++;
GeorgeJourneaux 6:64d346936f0e 136 if(sample_t >= (MAX_SAMPLES)){
GeorgeJourneaux 6:64d346936f0e 137 sample_t = 0;
GeorgeJourneaux 5:ea3ec65cbf5f 138 }
GeorgeJourneaux 5:ea3ec65cbf5f 139 }
dnonoo 7:f017a37bcf1b 140 //Unlock data buffer
GeorgeJourneaux 6:64d346936f0e 141 DataBuffer.unlock();
dnonoo 7:f017a37bcf1b 142 }
dnonoo 7:f017a37bcf1b 143 }
dnonoo 7:f017a37bcf1b 144
dnonoo 7:f017a37bcf1b 145 /*---------------------Read Sensors ---------------------------*/
dnonoo 7:f017a37bcf1b 146
dnonoo 7:f017a37bcf1b 147 void readISR () { // Ticker interrupt defined in main
dnonoo 7:f017a37bcf1b 148
dnonoo 7:f017a37bcf1b 149 _sensorRead.signal_set(SENSOR_UPDATE);
dnonoo 7:f017a37bcf1b 150 }
dnonoo 8:ab6322afa341 151 // Keep short
dnonoo 7:f017a37bcf1b 152 void sensorRead () {
dnonoo 7:f017a37bcf1b 153
dnonoo 7:f017a37bcf1b 154 while (1) {
dnonoo 7:f017a37bcf1b 155
dnonoo 8:ab6322afa341 156 dataLock.lock(); // Entering Critial Section
dnonoo 7:f017a37bcf1b 157
dnonoo 7:f017a37bcf1b 158 // Store Data in global Variables
dnonoo 7:f017a37bcf1b 159 LDR = LDR_In.read();
dnonoo 7:f017a37bcf1b 160 TEMP = Sensor.getTemperature();
dnonoo 7:f017a37bcf1b 161 PRES = Sensor.getPressure();
dnonoo 7:f017a37bcf1b 162
dnonoo 8:ab6322afa341 163 dataLock.unlock(); // Exiting Critical Section
dnonoo 7:f017a37bcf1b 164
dnonoo 7:f017a37bcf1b 165 Green_int = !Green_int; // debugging
GeorgeJourneaux 5:ea3ec65cbf5f 166
dnonoo 7:f017a37bcf1b 167 //Read sensors, send to mail-queue
dnonoo 7:f017a37bcf1b 168 mail_t *mail = mail_box.alloc();
dnonoo 7:f017a37bcf1b 169 mail->LDR_Value = LDR;
dnonoo 7:f017a37bcf1b 170 mail->temp_Value = TEMP;
dnonoo 7:f017a37bcf1b 171 mail->press_Value = PRES;
dnonoo 7:f017a37bcf1b 172 mail_box.put(mail);
dnonoo 7:f017a37bcf1b 173
dnonoo 7:f017a37bcf1b 174 _circBuff.signal_set(DATA_READY); // Set signal to buffer to store updated values
dnonoo 7:f017a37bcf1b 175 Thread::signal_wait(SENSOR_UPDATE); // Wait for the Timer interrupt
dnonoo 7:f017a37bcf1b 176 }
GeorgeJourneaux 3:73497379c0cb 177 }
dnonoo 7:f017a37bcf1b 178
GeorgeJourneaux 3:73497379c0cb 179
GeorgeJourneaux 3:73497379c0cb 180 /*--------------------------------LCD---------------------------------*/
benparkes 0:cb3a5c15b01e 181 void PrintLCD () {
benparkes 0:cb3a5c15b01e 182
benparkes 0:cb3a5c15b01e 183 int i = 0;
benparkes 0:cb3a5c15b01e 184 while(1){
benparkes 1:bca9993a0df3 185 char lightString[16];
benparkes 1:bca9993a0df3 186 char tempString[16];
benparkes 1:bca9993a0df3 187 char pressString[16];
benparkes 1:bca9993a0df3 188
benparkes 0:cb3a5c15b01e 189 lcd.Clear();
benparkes 0:cb3a5c15b01e 190 lcd.RowSelect(0);
benparkes 1:bca9993a0df3 191
benparkes 0:cb3a5c15b01e 192 switch (i){
GeorgeJourneaux 5:ea3ec65cbf5f 193 case 0:{
GeorgeJourneaux 2:28d12a3db239 194 osEvent evt = mail_box.get();
benparkes 1:bca9993a0df3 195
GeorgeJourneaux 2:28d12a3db239 196 if (evt.status == osEventMail) {
GeorgeJourneaux 2:28d12a3db239 197 mail_t *mail = (mail_t*)evt.value.p;
benparkes 0:cb3a5c15b01e 198
GeorgeJourneaux 2:28d12a3db239 199 sprintf(lightString,"%.4f", mail->LDR_Value);
GeorgeJourneaux 2:28d12a3db239 200 sprintf(tempString,"%2.2f", mail->temp_Value);
GeorgeJourneaux 2:28d12a3db239 201 sprintf(pressString,"%4.2f", mail->press_Value);
benparkes 1:bca9993a0df3 202
GeorgeJourneaux 2:28d12a3db239 203 mail_box.free(mail);
GeorgeJourneaux 2:28d12a3db239 204 }
benparkes 1:bca9993a0df3 205
GeorgeJourneaux 2:28d12a3db239 206 lcd.Write("Light Level:");
GeorgeJourneaux 2:28d12a3db239 207 lcd.RowSelect(1);
GeorgeJourneaux 2:28d12a3db239 208 lcd.Write(lightString);
GeorgeJourneaux 5:ea3ec65cbf5f 209 i++;
benparkes 0:cb3a5c15b01e 210 break;
GeorgeJourneaux 5:ea3ec65cbf5f 211 }
GeorgeJourneaux 2:28d12a3db239 212 case 1:
GeorgeJourneaux 2:28d12a3db239 213 lcd.Write("Temperature:");
GeorgeJourneaux 2:28d12a3db239 214 lcd.RowSelect(1);
GeorgeJourneaux 2:28d12a3db239 215 lcd.Write(tempString);
GeorgeJourneaux 2:28d12a3db239 216 i++;
benparkes 0:cb3a5c15b01e 217 break;
benparkes 0:cb3a5c15b01e 218
GeorgeJourneaux 2:28d12a3db239 219 case 2:
GeorgeJourneaux 2:28d12a3db239 220 lcd.Write("Pressure:");
GeorgeJourneaux 2:28d12a3db239 221 lcd.RowSelect(1);
GeorgeJourneaux 2:28d12a3db239 222 lcd.Write(pressString);
GeorgeJourneaux 5:ea3ec65cbf5f 223 i =0;
benparkes 0:cb3a5c15b01e 224 break;
GeorgeJourneaux 2:28d12a3db239 225
GeorgeJourneaux 5:ea3ec65cbf5f 226 default:
GeorgeJourneaux 5:ea3ec65cbf5f 227 i = 0;
benparkes 0:cb3a5c15b01e 228 break;
benparkes 0:cb3a5c15b01e 229 }
benparkes 0:cb3a5c15b01e 230
GeorgeJourneaux 2:28d12a3db239 231 Red_int = !Red_int;
benparkes 1:bca9993a0df3 232
benparkes 0:cb3a5c15b01e 233 Thread::wait (5000);
GeorgeJourneaux 2:28d12a3db239 234 }
benparkes 0:cb3a5c15b01e 235 }
GeorgeJourneaux 3:73497379c0cb 236 /*--------------------------------------------------------------------*/
benparkes 1:bca9993a0df3 237
GeorgeJourneaux 3:73497379c0cb 238 /*------------------------------SERIAL_CMD----------------------------*/
GeorgeJourneaux 4:93d6d13d4de3 239 //Interrupt when recieving from serial port
GeorgeJourneaux 2:28d12a3db239 240 void Rx_interrupt() {
GeorgeJourneaux 2:28d12a3db239 241
dnonoo 7:f017a37bcf1b 242 //Wait for serial input
GeorgeJourneaux 2:28d12a3db239 243 while (pc.readable()) {
GeorgeJourneaux 6:64d346936f0e 244
dnonoo 7:f017a37bcf1b 245 //Return input to serial
GeorgeJourneaux 5:ea3ec65cbf5f 246 rx_buffer[rx_in] = pc.getc();
GeorgeJourneaux 5:ea3ec65cbf5f 247 pc.putc(rx_buffer[rx_in]);
GeorgeJourneaux 6:64d346936f0e 248
dnonoo 7:f017a37bcf1b 249 //If enter key is pressed, set serial thread signal
GeorgeJourneaux 5:ea3ec65cbf5f 250 if(rx_buffer[rx_in] == 0xD){
dnonoo 7:f017a37bcf1b 251 _serialCMD.signal_set(ENTER_KEY);
GeorgeJourneaux 2:28d12a3db239 252 }
GeorgeJourneaux 6:64d346936f0e 253
dnonoo 7:f017a37bcf1b 254 //Increment buffer head
GeorgeJourneaux 2:28d12a3db239 255 else{
GeorgeJourneaux 2:28d12a3db239 256 rx_in = (rx_in + 1);
GeorgeJourneaux 2:28d12a3db239 257 }
GeorgeJourneaux 2:28d12a3db239 258 }
GeorgeJourneaux 2:28d12a3db239 259 }
benparkes 0:cb3a5c15b01e 260
GeorgeJourneaux 4:93d6d13d4de3 261 //Check what command what recieved and execute
dnonoo 7:f017a37bcf1b 262 void serialCMD(){
GeorgeJourneaux 2:28d12a3db239 263
GeorgeJourneaux 2:28d12a3db239 264 while(1){
dnonoo 7:f017a37bcf1b 265 //Wait for thread signal
GeorgeJourneaux 4:93d6d13d4de3 266 Thread::signal_wait(ENTER_KEY);
GeorgeJourneaux 6:64d346936f0e 267
dnonoo 7:f017a37bcf1b 268 //Detach serial interrupt
GeorgeJourneaux 2:28d12a3db239 269 pc.attach(NULL, Serial::RxIrq);
GeorgeJourneaux 6:64d346936f0e 270
GeorgeJourneaux 3:73497379c0cb 271 struct tm * s_time;
GeorgeJourneaux 3:73497379c0cb 272 char tm_n[4];
GeorgeJourneaux 3:73497379c0cb 273
GeorgeJourneaux 6:64d346936f0e 274 /*----CARRAGE RETURN-------------*/
GeorgeJourneaux 6:64d346936f0e 275 if(rx_buffer[0] == 0xD){
GeorgeJourneaux 6:64d346936f0e 276 pc.puts("\n\r");
GeorgeJourneaux 6:64d346936f0e 277 }
GeorgeJourneaux 6:64d346936f0e 278 /*----READ ALL----------------------------------*/
GeorgeJourneaux 6:64d346936f0e 279 else if(strstr(rx_buffer, "READ ALL")){
GeorgeJourneaux 6:64d346936f0e 280 pc.puts(" READ ALL\n\r");
GeorgeJourneaux 6:64d346936f0e 281
dnonoo 7:f017a37bcf1b 282 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 283 DataBuffer.lock();
GeorgeJourneaux 6:64d346936f0e 284
dnonoo 7:f017a37bcf1b 285 //Print all samples to serial
GeorgeJourneaux 6:64d346936f0e 286 for(int n=data_t; n<=MAX_SAMPLES; n++){
GeorgeJourneaux 6:64d346936f0e 287 pc.puts(data_buffer[n]);
GeorgeJourneaux 6:64d346936f0e 288 }
GeorgeJourneaux 6:64d346936f0e 289 if(data_t>data_h){
GeorgeJourneaux 6:64d346936f0e 290 for(int n=0; n<=(data_t-1); n++){
GeorgeJourneaux 6:64d346936f0e 291 pc.puts(data_buffer[n]);
GeorgeJourneaux 6:64d346936f0e 292 }
GeorgeJourneaux 6:64d346936f0e 293 }
GeorgeJourneaux 5:ea3ec65cbf5f 294
dnonoo 7:f017a37bcf1b 295 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 296 DataBuffer.unlock();
GeorgeJourneaux 2:28d12a3db239 297 }
GeorgeJourneaux 6:64d346936f0e 298 /*----DELETE ALL----------------------------------*/
GeorgeJourneaux 5:ea3ec65cbf5f 299 else if(strstr(rx_buffer, "DELETE ALL")){
GeorgeJourneaux 6:64d346936f0e 300 pc.puts(" DELETE ALL\n\r");
GeorgeJourneaux 6:64d346936f0e 301
GeorgeJourneaux 6:64d346936f0e 302 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 303 DataBuffer.lock();
GeorgeJourneaux 6:64d346936f0e 304
GeorgeJourneaux 6:64d346936f0e 305 //Delete all sampled data
GeorgeJourneaux 6:64d346936f0e 306 for(int n=0; n<=MAX_SAMPLES; n++){
GeorgeJourneaux 6:64d346936f0e 307 memset(data_buffer[n], NULL, 64);
GeorgeJourneaux 6:64d346936f0e 308 }
GeorgeJourneaux 6:64d346936f0e 309 data_h = data_t;
GeorgeJourneaux 6:64d346936f0e 310 sample_h = sample_t;
GeorgeJourneaux 6:64d346936f0e 311
GeorgeJourneaux 6:64d346936f0e 312 //Unlock data buffer
GeorgeJourneaux 6:64d346936f0e 313 DataBuffer.unlock();
GeorgeJourneaux 2:28d12a3db239 314 }
GeorgeJourneaux 6:64d346936f0e 315 /*----READ----------------------------------*/
GeorgeJourneaux 5:ea3ec65cbf5f 316 else if(strstr(rx_buffer, "READ")){
GeorgeJourneaux 6:64d346936f0e 317 pc.puts(" READ \n\r");
GeorgeJourneaux 6:64d346936f0e 318 int N = atoi(strncpy(tm_n,&rx_buffer[5],4));
GeorgeJourneaux 6:64d346936f0e 319 int S = 0;
GeorgeJourneaux 6:64d346936f0e 320 pc.printf("N = %d\n\r",N);
GeorgeJourneaux 6:64d346936f0e 321
GeorgeJourneaux 6:64d346936f0e 322 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 323 DataBuffer.lock();
GeorgeJourneaux 6:64d346936f0e 324
GeorgeJourneaux 6:64d346936f0e 325 //Check if N is greater than buffer size
GeorgeJourneaux 6:64d346936f0e 326 if(N >= MAX_SAMPLES){
GeorgeJourneaux 6:64d346936f0e 327 N = MAX_SAMPLES;
GeorgeJourneaux 6:64d346936f0e 328 }
GeorgeJourneaux 6:64d346936f0e 329
GeorgeJourneaux 6:64d346936f0e 330 //Read N samples from FIFO buffer
GeorgeJourneaux 6:64d346936f0e 331 if(N <= 0){
GeorgeJourneaux 6:64d346936f0e 332 pc.puts("####ERROR####\n\r");
GeorgeJourneaux 6:64d346936f0e 333 }
GeorgeJourneaux 6:64d346936f0e 334 else{
GeorgeJourneaux 6:64d346936f0e 335 for(int n=data_t; n<=MAX_SAMPLES-1; n++){
GeorgeJourneaux 6:64d346936f0e 336 if(S>=N){}
GeorgeJourneaux 6:64d346936f0e 337 else{
GeorgeJourneaux 6:64d346936f0e 338 pc.puts(data_buffer[n]);
GeorgeJourneaux 6:64d346936f0e 339 S++;
GeorgeJourneaux 6:64d346936f0e 340 }
GeorgeJourneaux 6:64d346936f0e 341 }
GeorgeJourneaux 6:64d346936f0e 342 for(int n=0; n<=data_t; n++){
GeorgeJourneaux 6:64d346936f0e 343 if(S>=N){}
GeorgeJourneaux 6:64d346936f0e 344 else{
GeorgeJourneaux 6:64d346936f0e 345 pc.puts(data_buffer[n]);
GeorgeJourneaux 6:64d346936f0e 346 S++;
GeorgeJourneaux 6:64d346936f0e 347 }
GeorgeJourneaux 6:64d346936f0e 348 }
GeorgeJourneaux 6:64d346936f0e 349 }
GeorgeJourneaux 6:64d346936f0e 350
GeorgeJourneaux 6:64d346936f0e 351 //Unlock data buffer
GeorgeJourneaux 6:64d346936f0e 352 DataBuffer.unlock();
GeorgeJourneaux 2:28d12a3db239 353 }
GeorgeJourneaux 6:64d346936f0e 354 /*----DELETE----------------------------------*/
GeorgeJourneaux 5:ea3ec65cbf5f 355 else if(strstr(rx_buffer, "DELETE")){
GeorgeJourneaux 6:64d346936f0e 356 pc.puts(" DELETE \n\r");
GeorgeJourneaux 3:73497379c0cb 357 }
GeorgeJourneaux 6:64d346936f0e 358 /*----SETDATE----------------------------------*/
GeorgeJourneaux 5:ea3ec65cbf5f 359 else if(strstr(rx_buffer, "SETDATE")){
GeorgeJourneaux 5:ea3ec65cbf5f 360 time(&raw_time);
GeorgeJourneaux 5:ea3ec65cbf5f 361 s_time = localtime(&raw_time);
GeorgeJourneaux 3:73497379c0cb 362
GeorgeJourneaux 6:64d346936f0e 363 //Update day in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 364 int dd = atoi(strncpy(tm_n,&rx_buffer[8],2));
GeorgeJourneaux 3:73497379c0cb 365 s_time->tm_mday = dd;
GeorgeJourneaux 3:73497379c0cb 366 memset(tm_n, NULL, 4);
GeorgeJourneaux 3:73497379c0cb 367
GeorgeJourneaux 6:64d346936f0e 368 //Update month in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 369 int mm = atoi(strncpy(tm_n,&rx_buffer[11],2));
GeorgeJourneaux 3:73497379c0cb 370 s_time->tm_mon = mm-1;
GeorgeJourneaux 3:73497379c0cb 371 memset(tm_n, NULL, 4);
GeorgeJourneaux 3:73497379c0cb 372
GeorgeJourneaux 6:64d346936f0e 373 //Update year in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 374 int yyyy = atoi(strncpy(tm_n,&rx_buffer[14],4));
GeorgeJourneaux 3:73497379c0cb 375 s_time->tm_year = yyyy-1900;
GeorgeJourneaux 3:73497379c0cb 376 memset(tm_n, NULL, 4);
GeorgeJourneaux 3:73497379c0cb 377
GeorgeJourneaux 6:64d346936f0e 378 //Set date from updated time structure
GeorgeJourneaux 3:73497379c0cb 379 set_time(mktime(s_time));
GeorgeJourneaux 6:64d346936f0e 380 strftime(serial_buffer, 80, "\n\r Set Date: %d/%m/%Y\n\r", s_time);
GeorgeJourneaux 5:ea3ec65cbf5f 381 pc.puts(serial_buffer);
GeorgeJourneaux 2:28d12a3db239 382 }
GeorgeJourneaux 6:64d346936f0e 383 /*----SETTIME---------------------------------*/
GeorgeJourneaux 5:ea3ec65cbf5f 384 else if(strstr(rx_buffer, "SETTIME")){
GeorgeJourneaux 5:ea3ec65cbf5f 385 time(&raw_time);
GeorgeJourneaux 5:ea3ec65cbf5f 386 s_time = localtime(&raw_time);
GeorgeJourneaux 3:73497379c0cb 387
GeorgeJourneaux 6:64d346936f0e 388 //Update seconds in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 389 int ss = atoi(strncpy(tm_n,&rx_buffer[14],2));
GeorgeJourneaux 3:73497379c0cb 390 s_time->tm_sec = ss;
GeorgeJourneaux 3:73497379c0cb 391 memset(tm_n, NULL, 4);
GeorgeJourneaux 6:64d346936f0e 392
GeorgeJourneaux 6:64d346936f0e 393 //Update minutes in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 394 int mm = atoi(strncpy(tm_n,&rx_buffer[11],2));
GeorgeJourneaux 3:73497379c0cb 395 s_time->tm_min = mm;
GeorgeJourneaux 3:73497379c0cb 396 memset(tm_n, NULL, 4);
GeorgeJourneaux 3:73497379c0cb 397
GeorgeJourneaux 6:64d346936f0e 398 //Update hour in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 399 int hh = atoi(strncpy(tm_n,&rx_buffer[8],2));
GeorgeJourneaux 3:73497379c0cb 400 s_time->tm_hour = hh;
GeorgeJourneaux 3:73497379c0cb 401 memset(tm_n, NULL, 4);
GeorgeJourneaux 6:64d346936f0e 402
GeorgeJourneaux 6:64d346936f0e 403 //Set time from updated time structure
GeorgeJourneaux 3:73497379c0cb 404 set_time(mktime(s_time));
GeorgeJourneaux 6:64d346936f0e 405 strftime(serial_buffer, 80, "\n\r Set Time: %X\n\r", s_time);
GeorgeJourneaux 5:ea3ec65cbf5f 406 pc.puts(serial_buffer);
GeorgeJourneaux 2:28d12a3db239 407 }
GeorgeJourneaux 6:64d346936f0e 408 /*----SETT----------------------------------*/
GeorgeJourneaux 5:ea3ec65cbf5f 409 else if(strstr(rx_buffer, "SETT")){
GeorgeJourneaux 6:64d346936f0e 410 pc.puts(" SETT\n\r");
GeorgeJourneaux 2:28d12a3db239 411 }
GeorgeJourneaux 6:64d346936f0e 412 /*----STATE----------------------------------*/
GeorgeJourneaux 5:ea3ec65cbf5f 413 else if(strstr(rx_buffer, "STATE")){
GeorgeJourneaux 6:64d346936f0e 414 pc.puts(" STATE\n\r");
GeorgeJourneaux 2:28d12a3db239 415 }
GeorgeJourneaux 6:64d346936f0e 416 /*----LOGGING----------------------------------*/
GeorgeJourneaux 5:ea3ec65cbf5f 417 else if(strstr(rx_buffer, "LOGGING")){
GeorgeJourneaux 6:64d346936f0e 418 pc.puts(" LOGGING\n\r");
GeorgeJourneaux 2:28d12a3db239 419 }
GeorgeJourneaux 6:64d346936f0e 420 /*----ERROR---*/
GeorgeJourneaux 2:28d12a3db239 421 else{
GeorgeJourneaux 6:64d346936f0e 422 pc.puts("####ERROR####\n\r");
GeorgeJourneaux 2:28d12a3db239 423 }
GeorgeJourneaux 6:64d346936f0e 424 /*----------------------------------------------*/
GeorgeJourneaux 6:64d346936f0e 425
GeorgeJourneaux 6:64d346936f0e 426 //Clear serial buffers
GeorgeJourneaux 5:ea3ec65cbf5f 427 memset(serial_buffer, NULL, 80);
GeorgeJourneaux 5:ea3ec65cbf5f 428 memset(rx_buffer, NULL, 32);
GeorgeJourneaux 2:28d12a3db239 429 rx_in = 0;
GeorgeJourneaux 2:28d12a3db239 430
GeorgeJourneaux 6:64d346936f0e 431 //Attach serial interrupt
GeorgeJourneaux 2:28d12a3db239 432 pc.attach(&Rx_interrupt, Serial::RxIrq);
GeorgeJourneaux 2:28d12a3db239 433 }
GeorgeJourneaux 2:28d12a3db239 434 }
dnonoo 7:f017a37bcf1b 435 /*------------------------------------------------*/
dnonoo 7:f017a37bcf1b 436
dnonoo 7:f017a37bcf1b 437 void POST () {
dnonoo 7:f017a37bcf1b 438
dnonoo 7:f017a37bcf1b 439 pc.printf(" ALL Leds should be flashing\n\r");
dnonoo 7:f017a37bcf1b 440
dnonoo 7:f017a37bcf1b 441 for(unsigned int n = 0; n<10; n++) {
dnonoo 7:f017a37bcf1b 442 Green_int = ON;
dnonoo 7:f017a37bcf1b 443 Blue_int = ON;
dnonoo 7:f017a37bcf1b 444 Red_int = ON;
dnonoo 7:f017a37bcf1b 445 Green_ext = ON;
dnonoo 7:f017a37bcf1b 446 Yellow_ext = ON;
dnonoo 7:f017a37bcf1b 447 Red_ext = ON;
dnonoo 7:f017a37bcf1b 448
dnonoo 7:f017a37bcf1b 449 wait (0.2);
dnonoo 7:f017a37bcf1b 450 Green_int = OFF;
dnonoo 7:f017a37bcf1b 451 Blue_int = OFF;
dnonoo 7:f017a37bcf1b 452 Red_int = OFF;
dnonoo 7:f017a37bcf1b 453 Green_ext = OFF;
dnonoo 7:f017a37bcf1b 454 Yellow_ext = OFF;
dnonoo 7:f017a37bcf1b 455 Red_ext = OFF;
dnonoo 7:f017a37bcf1b 456 wait (0.2);
dnonoo 7:f017a37bcf1b 457 }
dnonoo 7:f017a37bcf1b 458
dnonoo 7:f017a37bcf1b 459 pc.printf("Switch states:\n\r");
dnonoo 7:f017a37bcf1b 460 pc.printf("\tSW_L: %d\n\r\tSW_R %d\n\r", SW_L.read(), SW_R.read());
dnonoo 7:f017a37bcf1b 461
dnonoo 7:f017a37bcf1b 462 float Temp = Sensor.getTemperature();
dnonoo 7:f017a37bcf1b 463 float Pres = Sensor.getPressure();
dnonoo 7:f017a37bcf1b 464 float ldrs = LDR_In.read();
dnonoo 7:f017a37bcf1b 465
dnonoo 7:f017a37bcf1b 466 pc.printf("Sensor test:\n\r");
dnonoo 7:f017a37bcf1b 467 pc.printf("T: %f\tP: %f\tL: %f\n\r",Temp,Pres,ldrs);
dnonoo 7:f017a37bcf1b 468
dnonoo 7:f017a37bcf1b 469 pc.printf("LCD Test\n\r");
dnonoo 7:f017a37bcf1b 470
dnonoo 7:f017a37bcf1b 471 lcd.Clear();
dnonoo 7:f017a37bcf1b 472 lcd.RowSelect(1);
dnonoo 7:f017a37bcf1b 473 lcd.Write("*******LCD******");
dnonoo 7:f017a37bcf1b 474 lcd.RowSelect(2);
dnonoo 7:f017a37bcf1b 475 lcd.Write("******TEST******");
dnonoo 7:f017a37bcf1b 476 wait(1);
dnonoo 7:f017a37bcf1b 477 lcd.Clear();
dnonoo 7:f017a37bcf1b 478 }
dnonoo 8:ab6322afa341 479
dnonoo 8:ab6322afa341 480 void writeRemove_SD() {
dnonoo 7:f017a37bcf1b 481
dnonoo 8:ab6322afa341 482 while(1) {
dnonoo 8:ab6322afa341 483 Thread::signal_wait(USER_BUTTON_PRESSED); //wait for debounce signal
dnonoo 8:ab6322afa341 484 pc.printf("Initalising SD Card\n\r");
dnonoo 8:ab6322afa341 485
dnonoo 8:ab6322afa341 486 //check init
dnonoo 8:ab6322afa341 487 if (sd.init() != 0) {
dnonoo 8:ab6322afa341 488 pc.printf("******SD Initialise FAIL*******\n\r");
dnonoo 8:ab6322afa341 489 }
dnonoo 8:ab6322afa341 490
dnonoo 8:ab6322afa341 491 // Create Filing system for SD Card
dnonoo 8:ab6322afa341 492 FATFileSystem fs("sd", &sd);
dnonoo 8:ab6322afa341 493
dnonoo 8:ab6322afa341 494 //OpenFiles to write/append to
dnonoo 8:ab6322afa341 495 pc.printf("Writing to SDC\n\r");
dnonoo 8:ab6322afa341 496
dnonoo 8:ab6322afa341 497 FILE* fp = fopen("/sd/TheChamberOfSecrets.txt", "w"); //"w" to overwrite file ftb
dnonoo 8:ab6322afa341 498
dnonoo 8:ab6322afa341 499 // Check for error in opening file
dnonoo 8:ab6322afa341 500 if (fp == NULL) {
dnonoo 8:ab6322afa341 501 pc.printf("*****ERROR - Could not open file for write*****\n\r");
dnonoo 8:ab6322afa341 502 }
dnonoo 8:ab6322afa341 503 //HERE IS WHERE TO PRINT DATA TO SD CARD FROM BUFFER (REMEMBER TO EMPTY BUFFER???)
dnonoo 8:ab6322afa341 504 //Lock data buffer
dnonoo 8:ab6322afa341 505 DataBuffer.lock();
dnonoo 8:ab6322afa341 506 dataLock.lock();
dnonoo 8:ab6322afa341 507 //Print all samples to SD
dnonoo 8:ab6322afa341 508 for(int n=data_t; n<=MAX_SAMPLES; n++){
dnonoo 8:ab6322afa341 509 fputs(data_buffer[n], fp);
dnonoo 8:ab6322afa341 510 fprintf(fp, "\n\r");
dnonoo 8:ab6322afa341 511 }
dnonoo 8:ab6322afa341 512 if(data_t>data_h){
dnonoo 8:ab6322afa341 513 for(int n=0; n<=(data_t-1); n++){
dnonoo 8:ab6322afa341 514 fputs(data_buffer[n], fp);
dnonoo 8:ab6322afa341 515
dnonoo 8:ab6322afa341 516 }
dnonoo 8:ab6322afa341 517 }
dnonoo 8:ab6322afa341 518
dnonoo 8:ab6322afa341 519 //Lock data buffer
dnonoo 8:ab6322afa341 520 DataBuffer.unlock();
dnonoo 8:ab6322afa341 521 dataLock.unlock();
dnonoo 8:ab6322afa341 522 //fprintf(fp, "dd/mm/yy hh:mm:ss, TEMPERATURE, PRESSURE, LIGHT\n\r");
dnonoo 8:ab6322afa341 523
dnonoo 8:ab6322afa341 524 fclose(fp);
dnonoo 8:ab6322afa341 525
dnonoo 8:ab6322afa341 526 pc.printf("Write Sucessful!\n\r");
dnonoo 8:ab6322afa341 527
dnonoo 8:ab6322afa341 528 sd.deinit();
dnonoo 8:ab6322afa341 529 pc.printf("SD Card Ready to Remove\n\r");
dnonoo 8:ab6322afa341 530 Green_ext = 1;
dnonoo 8:ab6322afa341 531 Thread::wait(500);
dnonoo 8:ab6322afa341 532 Green_ext = 0;
dnonoo 8:ab6322afa341 533 Thread::wait(500);
dnonoo 8:ab6322afa341 534 Green_ext = 1;
dnonoo 8:ab6322afa341 535 Thread::wait(500);
dnonoo 8:ab6322afa341 536 Green_ext = 0;
dnonoo 8:ab6322afa341 537 Thread::wait(500);
dnonoo 8:ab6322afa341 538 Green_ext = 1;
dnonoo 8:ab6322afa341 539 Thread::wait(500);
dnonoo 8:ab6322afa341 540 Green_ext = 0;
dnonoo 8:ab6322afa341 541 Thread::wait(500);
dnonoo 8:ab6322afa341 542 Green_ext = 1;
dnonoo 8:ab6322afa341 543 Thread::wait(500);
dnonoo 8:ab6322afa341 544 Green_ext = 0;
dnonoo 8:ab6322afa341 545 Thread::wait(500);
dnonoo 8:ab6322afa341 546 }// End While
dnonoo 8:ab6322afa341 547 }// End Thread
dnonoo 8:ab6322afa341 548