V4

Dependencies:   BMP280

Fork of Thread_Communication_V4_fortest by BDG

Committer:
benparkes
Date:
Sat Jan 06 21:18:06 2018 +0000
Revision:
18:728fddea6d9c
Parent:
17:aa585f901750
time with mail;

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
benparkes 16:f30928e622a2 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 9:b838c5787ed7 20 void Network1();
dnonoo 14:7c4d87dfc388 21 void LCD_timerISR();
dnonoo 8:ab6322afa341 22
dnonoo 8:ab6322afa341 23 // USER_BUTTON ISRs (Debounce)
dnonoo 8:ab6322afa341 24
dnonoo 8:ab6322afa341 25 void userButtonRise();
dnonoo 8:ab6322afa341 26 void userButtonFall();
dnonoo 8:ab6322afa341 27 void userButtonTimeoutHandler();
dnonoo 8:ab6322afa341 28
dnonoo 8:ab6322afa341 29 // Tickers & Timeouts
dnonoo 8:ab6322afa341 30 Timeout userButtonTimeout; // FOR debouncing User Switch
dnonoo 8:ab6322afa341 31 Ticker read; // ***Sets sampling period!*** (ISR Signals sampling Thread)
dnonoo 14:7c4d87dfc388 32 Ticker refresh;
benparkes 16:f30928e622a2 33 /* LOCKS */
GeorgeJourneaux 6:64d346936f0e 34 Mutex DataBuffer;
dnonoo 8:ab6322afa341 35 Mutex dataLock;
GeorgeJourneaux 5:ea3ec65cbf5f 36
dnonoo 7:f017a37bcf1b 37 /* THREADS */
dnonoo 7:f017a37bcf1b 38 Thread _PrintLCD, _serialCMD, _circBuff;
dnonoo 8:ab6322afa341 39 Thread _sensorRead (osPriorityRealtime); //dataLock Thread
dnonoo 8:ab6322afa341 40 Thread _writeRemove_SD;
dnonoo 9:b838c5787ed7 41 Thread _Network1;
GeorgeJourneaux 3:73497379c0cb 42
dnonoo 7:f017a37bcf1b 43 /* GLOBAL DATA */
dnonoo 7:f017a37bcf1b 44 volatile float LDR = 0;
dnonoo 7:f017a37bcf1b 45 volatile double PRES = 0;
dnonoo 7:f017a37bcf1b 46 volatile double TEMP = 0;
dnonoo 13:089f3adb3813 47 volatile char TIME[21];
benparkes 1:bca9993a0df3 48
dnonoo 13:089f3adb3813 49 volatile double sampleTime = 15.0;
dnonoo 14:7c4d87dfc388 50 //int LCD_refresh = 1;
dnonoo 8:ab6322afa341 51 // int to hold current switch state
dnonoo 8:ab6322afa341 52 int userButtonState = FallingEdge;
dnonoo 8:ab6322afa341 53
dnonoo 8:ab6322afa341 54 /* DEBOUNCER INTERRUPTS */
dnonoo 8:ab6322afa341 55 InterruptIn userButton(USER_BUTTON);
dnonoo 8:ab6322afa341 56
benparkes 16:f30928e622a2 57 void userButtonRise ()
benparkes 16:f30928e622a2 58 {
dnonoo 8:ab6322afa341 59 userButton.rise(NULL);
dnonoo 8:ab6322afa341 60 userButtonState = RisingEdge;
dnonoo 8:ab6322afa341 61 userButtonTimeout.attach(&userButtonTimeoutHandler, 0.1);
dnonoo 8:ab6322afa341 62 }
benparkes 0:cb3a5c15b01e 63
benparkes 16:f30928e622a2 64 void userButtonFall ()
benparkes 16:f30928e622a2 65 {
dnonoo 8:ab6322afa341 66 userButton.fall(NULL);
dnonoo 8:ab6322afa341 67 _writeRemove_SD.signal_set(USER_BUTTON_PRESSED);
dnonoo 8:ab6322afa341 68 userButtonState = FallingEdge;
dnonoo 8:ab6322afa341 69 userButtonTimeout.attach(&userButtonTimeoutHandler, 0.1);
dnonoo 8:ab6322afa341 70 }
dnonoo 7:f017a37bcf1b 71
benparkes 16:f30928e622a2 72 void userButtonTimeoutHandler()
benparkes 16:f30928e622a2 73 {
dnonoo 8:ab6322afa341 74 userButtonTimeout.detach();
benparkes 16:f30928e622a2 75
dnonoo 8:ab6322afa341 76 switch (userButtonState) {
dnonoo 8:ab6322afa341 77 case RisingEdge:
dnonoo 8:ab6322afa341 78 userButton.fall(&userButtonFall);
dnonoo 8:ab6322afa341 79 break;
dnonoo 8:ab6322afa341 80 case FallingEdge:
dnonoo 8:ab6322afa341 81 userButton.rise(userButtonRise);
dnonoo 8:ab6322afa341 82 break;
benparkes 16:f30928e622a2 83 }// End Switch
benparkes 16:f30928e622a2 84 } //End ISR
GeorgeJourneaux 3:73497379c0cb 85 /*--------------------------------MAIN--------------------------------*/
benparkes 16:f30928e622a2 86 int main()
benparkes 16:f30928e622a2 87 {
benparkes 16:f30928e622a2 88
dnonoo 13:089f3adb3813 89 pc.baud(57600);
GeorgeJourneaux 3:73497379c0cb 90 pc.attach(&Rx_interrupt, Serial::RxIrq);
dnonoo 7:f017a37bcf1b 91 POST();
benparkes 16:f30928e622a2 92
dnonoo 10:c10d1337d754 93 pc.printf("\n\n\nType HELP for list of available Commands\n\n\n\r");
dnonoo 7:f017a37bcf1b 94 _serialCMD.start(serialCMD);
dnonoo 11:19135c83c208 95 _sensorRead.start(sensorRead);
dnonoo 7:f017a37bcf1b 96 _PrintLCD.start(PrintLCD);
dnonoo 7:f017a37bcf1b 97 _circBuff.start(circBuff);
dnonoo 8:ab6322afa341 98 _writeRemove_SD.start(writeRemove_SD);
dnonoo 9:b838c5787ed7 99 _Network1.start(Network1);
benparkes 16:f30928e622a2 100
dnonoo 8:ab6322afa341 101 userButton.rise(&userButtonRise);
dnonoo 10:c10d1337d754 102 read.attach(&readISR, sampleTime);
dnonoo 14:7c4d87dfc388 103 refresh.attach(&LCD_timerISR, LCD_REFRESH);
benparkes 16:f30928e622a2 104
dnonoo 8:ab6322afa341 105 while (1) {
dnonoo 8:ab6322afa341 106 Yellow_ext = ON;
dnonoo 8:ab6322afa341 107 Thread::wait (200);
dnonoo 8:ab6322afa341 108 Yellow_ext = OFF;
dnonoo 8:ab6322afa341 109 Thread::wait(200);
benparkes 16:f30928e622a2 110 }// End While
dnonoo 8:ab6322afa341 111 } // End Main
dnonoo 7:f017a37bcf1b 112 /*--------------------------------------------------------------------*/
dnonoo 10:c10d1337d754 113 /*-----------------Circular Buffer------------------------------------*/
benparkes 16:f30928e622a2 114 void circBuff ()
benparkes 16:f30928e622a2 115 {
benparkes 16:f30928e622a2 116
benparkes 16:f30928e622a2 117 while(1) {
benparkes 16:f30928e622a2 118 Thread::signal_wait(DATA_READY); // wait for signal from sensorRead
benparkes 16:f30928e622a2 119
benparkes 16:f30928e622a2 120 //Lock data buffer
benparkes 16:f30928e622a2 121 DataBuffer.lock();
benparkes 16:f30928e622a2 122
benparkes 16:f30928e622a2 123 //Format samples, send to FIFO buffer head
benparkes 16:f30928e622a2 124 memset(data_buffer[sample_h],NULL,64);
benparkes 16:f30928e622a2 125
benparkes 16:f30928e622a2 126 osEvent evt = mail_FIFO.get();
benparkes 16:f30928e622a2 127
benparkes 16:f30928e622a2 128 if (evt.status == osEventMail) {
benparkes 16:f30928e622a2 129 mail_t *mail = (mail_t*)evt.value.p;
benparkes 17:aa585f901750 130 char sample_time[21];
benparkes 17:aa585f901750 131 int rTime = mail->Time_Date;
benparkes 17:aa585f901750 132 time((time_t*)rTime);
benparkes 17:aa585f901750 133 sample_epoch = localtime((time_t*)rTime);
benparkes 17:aa585f901750 134 strftime(sample_time, 21,"%d/%m/%Y, %X", sample_epoch);
benparkes 17:aa585f901750 135 sprintf(data_buffer[sample_h],"%s, %2.2f, %4.2f, %.4f\n\r", sample_time, mail->temp_Value, mail->press_Value, mail->LDR_Value);
benparkes 16:f30928e622a2 136
benparkes 16:f30928e622a2 137 mail_FIFO.free(mail);
benparkes 16:f30928e622a2 138 }
benparkes 16:f30928e622a2 139
benparkes 16:f30928e622a2 140
benparkes 16:f30928e622a2 141
benparkes 16:f30928e622a2 142
benparkes 16:f30928e622a2 143 //Set seperate FIFO head and tail for printing data
benparkes 16:f30928e622a2 144 data_h = sample_h;
benparkes 16:f30928e622a2 145 data_t = sample_t;
benparkes 16:f30928e622a2 146
benparkes 16:f30928e622a2 147 //Move sample FIFO buffer head to next row in buffer
benparkes 16:f30928e622a2 148 sample_h++;
benparkes 16:f30928e622a2 149 //Check sample FIFO buffer head
benparkes 16:f30928e622a2 150 if(sample_h >= MAX_SAMPLES) {
benparkes 16:f30928e622a2 151 sample_h = 0;
benparkes 16:f30928e622a2 152 }
benparkes 16:f30928e622a2 153 //Check sample FIFO buffer tail
benparkes 16:f30928e622a2 154 if(sample_t == sample_h) {
benparkes 16:f30928e622a2 155 sample_t++;
benparkes 16:f30928e622a2 156 if(sample_t >= (MAX_SAMPLES)) {
benparkes 16:f30928e622a2 157 sample_t = 0;
GeorgeJourneaux 5:ea3ec65cbf5f 158 }
benparkes 16:f30928e622a2 159 }
benparkes 16:f30928e622a2 160 //Unlock data buffer
benparkes 16:f30928e622a2 161 DataBuffer.unlock();
dnonoo 10:c10d1337d754 162 }// End While
dnonoo 10:c10d1337d754 163 }// End Circular buffer
dnonoo 10:c10d1337d754 164 /*-------------------------------------------------------------*/
dnonoo 7:f017a37bcf1b 165 /*---------------------Read Sensors ---------------------------*/
dnonoo 7:f017a37bcf1b 166
benparkes 16:f30928e622a2 167 void readISR () // Ticker interrupt defined in main
benparkes 16:f30928e622a2 168 {
benparkes 16:f30928e622a2 169
dnonoo 7:f017a37bcf1b 170 _sensorRead.signal_set(SENSOR_UPDATE);
dnonoo 7:f017a37bcf1b 171 }
dnonoo 8:ab6322afa341 172 // Keep short
benparkes 16:f30928e622a2 173 void sensorRead ()
benparkes 16:f30928e622a2 174 {
benparkes 18:728fddea6d9c 175 volatile float LDR = 0;
benparkes 18:728fddea6d9c 176 volatile double PRES = 0;
benparkes 18:728fddea6d9c 177 volatile double TEMP = 0;
benparkes 18:728fddea6d9c 178
dnonoo 7:f017a37bcf1b 179 while (1) {
benparkes 16:f30928e622a2 180
dnonoo 8:ab6322afa341 181 dataLock.lock(); // Entering Critial Section
benparkes 16:f30928e622a2 182
dnonoo 7:f017a37bcf1b 183 // Store Data in global Variables
dnonoo 7:f017a37bcf1b 184 LDR = LDR_In.read();
dnonoo 7:f017a37bcf1b 185 TEMP = Sensor.getTemperature();
dnonoo 7:f017a37bcf1b 186 PRES = Sensor.getPressure();
benparkes 16:f30928e622a2 187
dnonoo 8:ab6322afa341 188 dataLock.unlock(); // Exiting Critical Section
benparkes 16:f30928e622a2 189
dnonoo 7:f017a37bcf1b 190 Green_int = !Green_int; // debugging
benparkes 16:f30928e622a2 191
dnonoo 7:f017a37bcf1b 192 //Read sensors, send to mail-queue
benparkes 16:f30928e622a2 193 mail_t *mail = mail_LCD.alloc();
benparkes 16:f30928e622a2 194 mail->LDR_Value = LDR;
dnonoo 7:f017a37bcf1b 195 mail->temp_Value = TEMP;
dnonoo 7:f017a37bcf1b 196 mail->press_Value = PRES;
benparkes 16:f30928e622a2 197 mail_LCD.put(mail);
benparkes 16:f30928e622a2 198
benparkes 16:f30928e622a2 199 mail_t *mail1 = mail_FIFO.alloc();
benparkes 17:aa585f901750 200 mail1->Time_Date = raw_time;
benparkes 16:f30928e622a2 201 mail1->LDR_Value = LDR;
benparkes 16:f30928e622a2 202 mail1->temp_Value = TEMP;
benparkes 16:f30928e622a2 203 mail1->press_Value = PRES;
benparkes 16:f30928e622a2 204 mail_FIFO.put(mail);
benparkes 16:f30928e622a2 205
benparkes 16:f30928e622a2 206 mail_t *mail2 = mail_Network.alloc();
benparkes 17:aa585f901750 207 mail1->Time_Date = raw_time;
benparkes 16:f30928e622a2 208 mail2->LDR_Value = LDR;
benparkes 16:f30928e622a2 209 mail2->temp_Value = TEMP;
benparkes 16:f30928e622a2 210 mail2->press_Value = PRES;
benparkes 16:f30928e622a2 211 mail_Network.put(mail);
benparkes 16:f30928e622a2 212
benparkes 16:f30928e622a2 213
benparkes 16:f30928e622a2 214
dnonoo 7:f017a37bcf1b 215 _circBuff.signal_set(DATA_READY); // Set signal to buffer to store updated values
dnonoo 7:f017a37bcf1b 216 Thread::signal_wait(SENSOR_UPDATE); // Wait for the Timer interrupt
dnonoo 7:f017a37bcf1b 217 }
GeorgeJourneaux 3:73497379c0cb 218 }
benparkes 16:f30928e622a2 219 /*--------------------------------------------------------------------*/
GeorgeJourneaux 3:73497379c0cb 220
GeorgeJourneaux 3:73497379c0cb 221 /*--------------------------------LCD---------------------------------*/
benparkes 16:f30928e622a2 222 void LCD_timerISR ()
benparkes 16:f30928e622a2 223 {
dnonoo 14:7c4d87dfc388 224 _PrintLCD.signal_set(LCD_READY);
benparkes 16:f30928e622a2 225 }
dnonoo 14:7c4d87dfc388 226
benparkes 16:f30928e622a2 227 void PrintLCD ()
benparkes 16:f30928e622a2 228 {
benparkes 16:f30928e622a2 229
benparkes 0:cb3a5c15b01e 230 int i = 0;
dnonoo 14:7c4d87dfc388 231 int j = 4;
dnonoo 14:7c4d87dfc388 232 char lightString[16];
dnonoo 14:7c4d87dfc388 233 char tempString[16];
dnonoo 14:7c4d87dfc388 234 char pressString[16];
dnonoo 14:7c4d87dfc388 235 char lcd_TIME[21];
benparkes 16:f30928e622a2 236
benparkes 16:f30928e622a2 237 while(1) {
benparkes 16:f30928e622a2 238
dnonoo 14:7c4d87dfc388 239 lcd.RowSelect(3);
benparkes 16:f30928e622a2 240
dnonoo 14:7c4d87dfc388 241
dnonoo 14:7c4d87dfc388 242 if (j == 4) {
benparkes 1:bca9993a0df3 243
dnonoo 14:7c4d87dfc388 244 lcd.Clear();
dnonoo 14:7c4d87dfc388 245 lcd.RowSelect(0);
dnonoo 14:7c4d87dfc388 246 switch (i) {
dnonoo 14:7c4d87dfc388 247 case 0: {
benparkes 16:f30928e622a2 248 osEvent evt = mail_LCD.get();
dnonoo 14:7c4d87dfc388 249
dnonoo 14:7c4d87dfc388 250 if (evt.status == osEventMail) {
dnonoo 14:7c4d87dfc388 251 mail_t *mail = (mail_t*)evt.value.p;
dnonoo 14:7c4d87dfc388 252
dnonoo 14:7c4d87dfc388 253 sprintf(lightString,"%.4f", mail->LDR_Value);
dnonoo 14:7c4d87dfc388 254 sprintf(tempString,"%2.2f", mail->temp_Value);
dnonoo 14:7c4d87dfc388 255 sprintf(pressString,"%4.2f", mail->press_Value);
dnonoo 14:7c4d87dfc388 256
benparkes 16:f30928e622a2 257 mail_LCD.free(mail);
dnonoo 14:7c4d87dfc388 258 }
dnonoo 14:7c4d87dfc388 259
dnonoo 14:7c4d87dfc388 260 lcd.Write("Light:");
dnonoo 14:7c4d87dfc388 261 lcd.RowSelect(1);
dnonoo 14:7c4d87dfc388 262 lcd.Write(lightString);
dnonoo 14:7c4d87dfc388 263 i++;
dnonoo 14:7c4d87dfc388 264 j = 0;
dnonoo 14:7c4d87dfc388 265 break;
GeorgeJourneaux 2:28d12a3db239 266 }
dnonoo 14:7c4d87dfc388 267 case 1:
dnonoo 14:7c4d87dfc388 268 lcd.Write("Temperature(C):");
dnonoo 14:7c4d87dfc388 269 lcd.RowSelect(1);
dnonoo 14:7c4d87dfc388 270 lcd.Write(tempString);
dnonoo 14:7c4d87dfc388 271 i++;
dnonoo 14:7c4d87dfc388 272 j = 0;
dnonoo 14:7c4d87dfc388 273 break;
dnonoo 14:7c4d87dfc388 274
dnonoo 14:7c4d87dfc388 275 case 2:
dnonoo 14:7c4d87dfc388 276 lcd.Write("Pressure(mBar):");
dnonoo 14:7c4d87dfc388 277 lcd.RowSelect(1);
dnonoo 14:7c4d87dfc388 278 lcd.Write(pressString);
dnonoo 14:7c4d87dfc388 279 i =0;
dnonoo 14:7c4d87dfc388 280 j = 0;
dnonoo 14:7c4d87dfc388 281 break;
dnonoo 14:7c4d87dfc388 282
dnonoo 14:7c4d87dfc388 283 default:
dnonoo 14:7c4d87dfc388 284 i = 0;
dnonoo 14:7c4d87dfc388 285 j = 0;
dnonoo 14:7c4d87dfc388 286 break;
dnonoo 14:7c4d87dfc388 287 }//end switch
dnonoo 14:7c4d87dfc388 288 }// end if
benparkes 16:f30928e622a2 289 else {
dnonoo 14:7c4d87dfc388 290 j++;
benparkes 0:cb3a5c15b01e 291 }
dnonoo 14:7c4d87dfc388 292 lcd.RowSelect(3);
benparkes 1:bca9993a0df3 293
dnonoo 14:7c4d87dfc388 294 dataLock.lock();
dnonoo 14:7c4d87dfc388 295 memset(lcd_TIME, NULL, 21);
dnonoo 14:7c4d87dfc388 296 time(&raw_time);
dnonoo 14:7c4d87dfc388 297 sample_epoch = localtime(&raw_time);
dnonoo 14:7c4d87dfc388 298 strftime( lcd_TIME,21,"%d/%m/%Y %X", sample_epoch);
dnonoo 14:7c4d87dfc388 299 dataLock.unlock();
dnonoo 14:7c4d87dfc388 300
dnonoo 14:7c4d87dfc388 301 lcd.Write(lcd_TIME);
dnonoo 14:7c4d87dfc388 302 Thread::signal_wait(LCD_READY);
dnonoo 14:7c4d87dfc388 303 Red_int = !Red_int;
dnonoo 14:7c4d87dfc388 304 }//end while
dnonoo 14:7c4d87dfc388 305 }// end thread
GeorgeJourneaux 3:73497379c0cb 306 /*--------------------------------------------------------------------*/
benparkes 1:bca9993a0df3 307
GeorgeJourneaux 3:73497379c0cb 308 /*------------------------------SERIAL_CMD----------------------------*/
GeorgeJourneaux 4:93d6d13d4de3 309 //Interrupt when recieving from serial port
benparkes 16:f30928e622a2 310 void Rx_interrupt()
benparkes 16:f30928e622a2 311 {
benparkes 16:f30928e622a2 312
dnonoo 7:f017a37bcf1b 313 //Wait for serial input
GeorgeJourneaux 2:28d12a3db239 314 while (pc.readable()) {
benparkes 16:f30928e622a2 315
dnonoo 7:f017a37bcf1b 316 //Return input to serial
GeorgeJourneaux 5:ea3ec65cbf5f 317 rx_buffer[rx_in] = pc.getc();
GeorgeJourneaux 5:ea3ec65cbf5f 318 pc.putc(rx_buffer[rx_in]);
benparkes 16:f30928e622a2 319
dnonoo 7:f017a37bcf1b 320 //If enter key is pressed, set serial thread signal
benparkes 16:f30928e622a2 321 if(rx_buffer[rx_in] == 0xD) {
dnonoo 7:f017a37bcf1b 322 _serialCMD.signal_set(ENTER_KEY);
GeorgeJourneaux 2:28d12a3db239 323 }
benparkes 16:f30928e622a2 324
dnonoo 7:f017a37bcf1b 325 //Increment buffer head
benparkes 16:f30928e622a2 326 else {
benparkes 16:f30928e622a2 327 if(rx_in>=32) {
dnonoo 13:089f3adb3813 328 puts("\n\rERROR - Stop typing so much!\n\r");
dnonoo 13:089f3adb3813 329 rx_in = 0;
dnonoo 13:089f3adb3813 330 memset(rx_buffer, NULL, 32);
benparkes 16:f30928e622a2 331 } else {
benparkes 16:f30928e622a2 332 rx_in = (rx_in + 1);
dnonoo 13:089f3adb3813 333 }
GeorgeJourneaux 2:28d12a3db239 334 }
GeorgeJourneaux 2:28d12a3db239 335 }
GeorgeJourneaux 2:28d12a3db239 336 }
benparkes 0:cb3a5c15b01e 337
GeorgeJourneaux 4:93d6d13d4de3 338 //Check what command what recieved and execute
benparkes 16:f30928e622a2 339 void serialCMD()
benparkes 16:f30928e622a2 340 {
dnonoo 11:19135c83c208 341 bool xx = 1; // State for CMD STATE
benparkes 16:f30928e622a2 342 while(1) {
dnonoo 7:f017a37bcf1b 343 //Wait for thread signal
GeorgeJourneaux 4:93d6d13d4de3 344 Thread::signal_wait(ENTER_KEY);
benparkes 16:f30928e622a2 345
dnonoo 7:f017a37bcf1b 346 //Detach serial interrupt
GeorgeJourneaux 2:28d12a3db239 347 pc.attach(NULL, Serial::RxIrq);
GeorgeJourneaux 6:64d346936f0e 348
GeorgeJourneaux 3:73497379c0cb 349 struct tm * s_time;
GeorgeJourneaux 3:73497379c0cb 350 char tm_n[4];
benparkes 16:f30928e622a2 351
benparkes 16:f30928e622a2 352 /*----CARRAGE RETURN-------------*/
benparkes 16:f30928e622a2 353 if(rx_buffer[0] == 0xD) {
GeorgeJourneaux 6:64d346936f0e 354 pc.puts("\n\r");
benparkes 16:f30928e622a2 355 }
benparkes 16:f30928e622a2 356 /*----READ ALL----------------------------------*/
benparkes 16:f30928e622a2 357 else if(strstr(rx_buffer, "READ ALL")) {
dnonoo 13:089f3adb3813 358 pc.puts("\n\r Reading all samples...\n\r");
benparkes 16:f30928e622a2 359
dnonoo 7:f017a37bcf1b 360 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 361 DataBuffer.lock();
benparkes 16:f30928e622a2 362
dnonoo 7:f017a37bcf1b 363 //Print all samples to serial
benparkes 16:f30928e622a2 364 for(int n=data_t; n<=MAX_SAMPLES; n++) {
GeorgeJourneaux 6:64d346936f0e 365 pc.puts(data_buffer[n]);
GeorgeJourneaux 6:64d346936f0e 366 }
benparkes 16:f30928e622a2 367 if(data_t>data_h) {
benparkes 16:f30928e622a2 368 for(int n=0; n<=(data_t-1); n++) {
GeorgeJourneaux 6:64d346936f0e 369 pc.puts(data_buffer[n]);
GeorgeJourneaux 6:64d346936f0e 370 }
GeorgeJourneaux 6:64d346936f0e 371 }
benparkes 16:f30928e622a2 372
dnonoo 7:f017a37bcf1b 373 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 374 DataBuffer.unlock();
dnonoo 13:089f3adb3813 375 pc.puts(" All Samples read!\n\r");
GeorgeJourneaux 2:28d12a3db239 376 }
benparkes 16:f30928e622a2 377 /*----DELETE ALL----------------------------------*/
benparkes 16:f30928e622a2 378 else if(strstr(rx_buffer, "DELETE ALL")) {
dnonoo 13:089f3adb3813 379 pc.puts("\n\r Deleting all samples...\n\r");
benparkes 16:f30928e622a2 380
benparkes 16:f30928e622a2 381 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 382 DataBuffer.lock();
benparkes 16:f30928e622a2 383
benparkes 16:f30928e622a2 384 //Delete all sampled data
benparkes 16:f30928e622a2 385 for(int n=0; n<=MAX_SAMPLES; n++) {
GeorgeJourneaux 6:64d346936f0e 386 memset(data_buffer[n], NULL, 64);
GeorgeJourneaux 6:64d346936f0e 387 }
GeorgeJourneaux 6:64d346936f0e 388 data_h = data_t;
GeorgeJourneaux 6:64d346936f0e 389 sample_h = sample_t;
benparkes 16:f30928e622a2 390
benparkes 16:f30928e622a2 391 //Unlock data buffer
GeorgeJourneaux 6:64d346936f0e 392 DataBuffer.unlock();
dnonoo 13:089f3adb3813 393 pc.puts(" All previous samples deleted!\n\r");
GeorgeJourneaux 2:28d12a3db239 394 }
benparkes 16:f30928e622a2 395 /*----READ----------------------------------*/
benparkes 16:f30928e622a2 396 else if(strstr(rx_buffer, "READ")) {
dnonoo 13:089f3adb3813 397 pc.puts("\n\r Reading N samples...\n\r");
GeorgeJourneaux 6:64d346936f0e 398 int N = atoi(strncpy(tm_n,&rx_buffer[5],4));
GeorgeJourneaux 6:64d346936f0e 399 int S = 0;
benparkes 16:f30928e622a2 400
benparkes 16:f30928e622a2 401 //Lock data buffer
GeorgeJourneaux 6:64d346936f0e 402 DataBuffer.lock();
benparkes 16:f30928e622a2 403
benparkes 16:f30928e622a2 404 //Check if N is greater than buffer size
benparkes 16:f30928e622a2 405 if(N >= MAX_SAMPLES) {
GeorgeJourneaux 6:64d346936f0e 406 N = MAX_SAMPLES;
GeorgeJourneaux 6:64d346936f0e 407 }
benparkes 16:f30928e622a2 408
benparkes 16:f30928e622a2 409 //Read N samples from FIFO buffer
benparkes 16:f30928e622a2 410 if(N <= 0) {
dnonoo 13:089f3adb3813 411 pc.puts("ERROR - N must be greater than 0\n\r");
dnonoo 13:089f3adb3813 412 N = 0;
benparkes 16:f30928e622a2 413 } else {
benparkes 16:f30928e622a2 414 for(int n=data_h; n>=0; n--) {
benparkes 16:f30928e622a2 415 if(S>=N) {}
benparkes 16:f30928e622a2 416 else {
GeorgeJourneaux 6:64d346936f0e 417 pc.puts(data_buffer[n]);
GeorgeJourneaux 6:64d346936f0e 418 S++;
GeorgeJourneaux 6:64d346936f0e 419 }
GeorgeJourneaux 6:64d346936f0e 420 }
benparkes 16:f30928e622a2 421 for(int n=MAX_SAMPLES-1; n<=data_t; n--) {
benparkes 16:f30928e622a2 422 if(S>=N) {}
benparkes 16:f30928e622a2 423 else {
GeorgeJourneaux 6:64d346936f0e 424 pc.puts(data_buffer[n]);
GeorgeJourneaux 6:64d346936f0e 425 S++;
GeorgeJourneaux 6:64d346936f0e 426 }
GeorgeJourneaux 6:64d346936f0e 427 }
GeorgeJourneaux 6:64d346936f0e 428 }
benparkes 16:f30928e622a2 429 pc.printf(" Read %d samples\n\r",N);
benparkes 16:f30928e622a2 430 //Unlock data buffer
GeorgeJourneaux 6:64d346936f0e 431 DataBuffer.unlock();
GeorgeJourneaux 2:28d12a3db239 432 }
benparkes 16:f30928e622a2 433 /*----DELETE----------------------------------*/
benparkes 16:f30928e622a2 434 else if(strstr(rx_buffer, "DELETE")) {
dnonoo 13:089f3adb3813 435 pc.puts("\n\r Deleting N samples...\n\r");
dnonoo 13:089f3adb3813 436 int N = atoi(strncpy(tm_n,&rx_buffer[6],4));
dnonoo 13:089f3adb3813 437 int S = 0;
dnonoo 13:089f3adb3813 438
benparkes 16:f30928e622a2 439 //Lock data buffer
dnonoo 13:089f3adb3813 440 DataBuffer.lock();
benparkes 16:f30928e622a2 441
benparkes 16:f30928e622a2 442 //Check if N is greater than buffer size
benparkes 16:f30928e622a2 443 if(N >= MAX_SAMPLES) {
dnonoo 13:089f3adb3813 444 N = MAX_SAMPLES;
dnonoo 13:089f3adb3813 445 }
dnonoo 13:089f3adb3813 446
benparkes 16:f30928e622a2 447 //Read N samples from FIFO buffer
benparkes 16:f30928e622a2 448 if(N <= 0) {
dnonoo 13:089f3adb3813 449 pc.puts("ERROR - N must be greater than 0\n\r");
dnonoo 13:089f3adb3813 450 N = 0;
benparkes 16:f30928e622a2 451 } else {
benparkes 16:f30928e622a2 452 for(int n=data_t; n<=MAX_SAMPLES; n++) {
benparkes 16:f30928e622a2 453 if(S>=N) {}
benparkes 16:f30928e622a2 454 else {
dnonoo 13:089f3adb3813 455 memset(data_buffer[n], NULL, 64);
dnonoo 13:089f3adb3813 456 S++;
dnonoo 13:089f3adb3813 457 data_t = n;
dnonoo 13:089f3adb3813 458 sample_t = n;
dnonoo 13:089f3adb3813 459 }
dnonoo 13:089f3adb3813 460 }
benparkes 16:f30928e622a2 461 for(int n=MAX_SAMPLES-1; n<=data_t; n--) {
benparkes 16:f30928e622a2 462 if(S>=N) {}
benparkes 16:f30928e622a2 463 else {
dnonoo 13:089f3adb3813 464 memset(data_buffer[n], NULL, 64);
dnonoo 13:089f3adb3813 465 S++;
dnonoo 13:089f3adb3813 466 data_t = n;
dnonoo 13:089f3adb3813 467 sample_t = n;
dnonoo 13:089f3adb3813 468 }
dnonoo 13:089f3adb3813 469 }
dnonoo 13:089f3adb3813 470 }
benparkes 16:f30928e622a2 471 pc.printf(" Deleted %d samples\n\r",N);
benparkes 16:f30928e622a2 472 //Unlock data buffer
benparkes 16:f30928e622a2 473 DataBuffer.unlock();
GeorgeJourneaux 3:73497379c0cb 474 }
benparkes 16:f30928e622a2 475 /*----SETDATE----------------------------------*/
benparkes 16:f30928e622a2 476 else if(strstr(rx_buffer, "SETDATE")) {
GeorgeJourneaux 5:ea3ec65cbf5f 477 time(&raw_time);
GeorgeJourneaux 5:ea3ec65cbf5f 478 s_time = localtime(&raw_time);
benparkes 16:f30928e622a2 479
benparkes 16:f30928e622a2 480 //Update day in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 481 int dd = atoi(strncpy(tm_n,&rx_buffer[8],2));
GeorgeJourneaux 3:73497379c0cb 482 s_time->tm_mday = dd;
GeorgeJourneaux 3:73497379c0cb 483 memset(tm_n, NULL, 4);
benparkes 16:f30928e622a2 484
benparkes 16:f30928e622a2 485 //Update month in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 486 int mm = atoi(strncpy(tm_n,&rx_buffer[11],2));
GeorgeJourneaux 3:73497379c0cb 487 s_time->tm_mon = mm-1;
GeorgeJourneaux 3:73497379c0cb 488 memset(tm_n, NULL, 4);
benparkes 16:f30928e622a2 489
benparkes 16:f30928e622a2 490 //Update year in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 491 int yyyy = atoi(strncpy(tm_n,&rx_buffer[14],4));
GeorgeJourneaux 3:73497379c0cb 492 s_time->tm_year = yyyy-1900;
GeorgeJourneaux 3:73497379c0cb 493 memset(tm_n, NULL, 4);
benparkes 16:f30928e622a2 494
benparkes 16:f30928e622a2 495 //Set date from updated time structure
GeorgeJourneaux 3:73497379c0cb 496 set_time(mktime(s_time));
dnonoo 13:089f3adb3813 497 strftime(serial_buffer, 80, "\n\r Date updated to: %d/%m/%Y\n\r", s_time);
GeorgeJourneaux 5:ea3ec65cbf5f 498 pc.puts(serial_buffer);
GeorgeJourneaux 2:28d12a3db239 499 }
benparkes 16:f30928e622a2 500 /*----SETTIME---------------------------------*/
benparkes 16:f30928e622a2 501 else if(strstr(rx_buffer, "SETTIME")) {
GeorgeJourneaux 5:ea3ec65cbf5f 502 time(&raw_time);
GeorgeJourneaux 5:ea3ec65cbf5f 503 s_time = localtime(&raw_time);
benparkes 16:f30928e622a2 504
benparkes 16:f30928e622a2 505 //Update seconds in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 506 int ss = atoi(strncpy(tm_n,&rx_buffer[14],2));
GeorgeJourneaux 3:73497379c0cb 507 s_time->tm_sec = ss;
GeorgeJourneaux 3:73497379c0cb 508 memset(tm_n, NULL, 4);
benparkes 16:f30928e622a2 509
benparkes 16:f30928e622a2 510 //Update minutes in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 511 int mm = atoi(strncpy(tm_n,&rx_buffer[11],2));
GeorgeJourneaux 3:73497379c0cb 512 s_time->tm_min = mm;
GeorgeJourneaux 3:73497379c0cb 513 memset(tm_n, NULL, 4);
benparkes 16:f30928e622a2 514
benparkes 16:f30928e622a2 515 //Update hour in time structure
GeorgeJourneaux 5:ea3ec65cbf5f 516 int hh = atoi(strncpy(tm_n,&rx_buffer[8],2));
GeorgeJourneaux 3:73497379c0cb 517 s_time->tm_hour = hh;
GeorgeJourneaux 3:73497379c0cb 518 memset(tm_n, NULL, 4);
benparkes 16:f30928e622a2 519
benparkes 16:f30928e622a2 520 //Set time from updated time structure
GeorgeJourneaux 3:73497379c0cb 521 set_time(mktime(s_time));
dnonoo 13:089f3adb3813 522 strftime(serial_buffer, 80, "\n\r Time updated to: %X\n\r", s_time);
GeorgeJourneaux 5:ea3ec65cbf5f 523 pc.puts(serial_buffer);
GeorgeJourneaux 2:28d12a3db239 524 }
benparkes 16:f30928e622a2 525 /*----SETT----------------------------------*/
benparkes 16:f30928e622a2 526 else if(strstr(rx_buffer, "SETT")) {
dnonoo 11:19135c83c208 527 read.detach();
dnonoo 13:089f3adb3813 528 double AA = atof(strncpy(tm_n,&rx_buffer[5],4));
benparkes 16:f30928e622a2 529
dnonoo 13:089f3adb3813 530 if (AA < 0.1 || AA > 60) {
dnonoo 11:19135c83c208 531 AA = 15;
dnonoo 13:089f3adb3813 532 pc.puts("ERROR - Sample Time out of range (0.1<=T<=60)\n\r");
dnonoo 11:19135c83c208 533 }
dnonoo 11:19135c83c208 534 sampleTime = AA;
dnonoo 13:089f3adb3813 535 pc.printf("\n\r Sample Time updated to: %2.1f seconds\n\r", sampleTime);
dnonoo 11:19135c83c208 536 read.attach(readISR, sampleTime);
dnonoo 11:19135c83c208 537 memset(tm_n, NULL, 4);
GeorgeJourneaux 2:28d12a3db239 538 }
benparkes 16:f30928e622a2 539 /*----STATE----------------------------------*/
benparkes 16:f30928e622a2 540 else if(strstr(rx_buffer, "STATE")) {
benparkes 16:f30928e622a2 541
dnonoo 11:19135c83c208 542 strncpy(tm_n,&rx_buffer[6],3);
dnonoo 11:19135c83c208 543 if (strstr(tm_n, "ON")) {
dnonoo 11:19135c83c208 544 if (xx == 1) {
dnonoo 13:089f3adb3813 545 pc.puts("\n\r Already Sampling\n\r");
benparkes 16:f30928e622a2 546 } else {
dnonoo 11:19135c83c208 547 read.attach(&readISR, sampleTime);
dnonoo 13:089f3adb3813 548 pc.puts("\n\r Sampling ON\n\r");
dnonoo 11:19135c83c208 549 xx = 1;
dnonoo 11:19135c83c208 550 }
benparkes 16:f30928e622a2 551 } else if (strstr(tm_n, "OFF")) {
dnonoo 11:19135c83c208 552 if ( xx == 0 ) {
dnonoo 13:089f3adb3813 553 pc.puts("\n\r Already not Sampling\n\r");
benparkes 16:f30928e622a2 554 } else {
dnonoo 11:19135c83c208 555 read.detach();
dnonoo 13:089f3adb3813 556 pc.puts("\n\r Sampling OFF\n\r");
dnonoo 11:19135c83c208 557 xx = 0;
dnonoo 11:19135c83c208 558 }
benparkes 16:f30928e622a2 559 } else {
benparkes 16:f30928e622a2 560 pc.puts("Error - STATE can only be ON or OFF\n\r");
dnonoo 11:19135c83c208 561 }
dnonoo 11:19135c83c208 562 //pc.puts(" STATE\n\r");
GeorgeJourneaux 2:28d12a3db239 563 }
benparkes 16:f30928e622a2 564 /*----LOGGING----------------------------------*/
benparkes 16:f30928e622a2 565 else if(strstr(rx_buffer, "LOGGING")) {
GeorgeJourneaux 6:64d346936f0e 566 pc.puts(" LOGGING\n\r");
GeorgeJourneaux 2:28d12a3db239 567 }
benparkes 16:f30928e622a2 568 /*----HELP--------------------------------------*/
dnonoo 10:c10d1337d754 569 else if (strstr(rx_buffer, "HELP")) {
dnonoo 13:089f3adb3813 570 pc.puts("\n\n\r Currently Available Commands:\n\r");
dnonoo 10:c10d1337d754 571 pc.puts("\tREAD n - Read n previous samples\n\r");
dnonoo 10:c10d1337d754 572 pc.puts("\tREAD ALL - Read All previous samples held in memory\n\r");
dnonoo 10:c10d1337d754 573 pc.puts("\tSETTIME hh:mm::ss - Set time in 24hr format\n\r");
dnonoo 10:c10d1337d754 574 pc.puts("\tSETDATE dd/mm/yyyy - Set time in specified format\n\r");
dnonoo 12:a244f6f9d2fe 575 pc.puts("\tDELETE ALL - Delete all sampled held in internal memory\n\r");
dnonoo 11:19135c83c208 576 pc.puts("\tSETT - Set sample period. must be an integer in range 0 < T < 61\n\r");
benparkes 16:f30928e622a2 577 } else if (strstr(rx_buffer,"tell me a joke")) {
dnonoo 13:089f3adb3813 578 pc.puts("\n\r Why do programmers always get Halloween and Christmas mixed up...?\n\r");
dnonoo 13:089f3adb3813 579 Thread::wait(5000);
dnonoo 13:089f3adb3813 580 pc.puts(" Because Oct 31 == Dec 25! LOL");
dnonoo 11:19135c83c208 581 }
benparkes 16:f30928e622a2 582 /*----ERROR---*/
benparkes 16:f30928e622a2 583 else {
benparkes 16:f30928e622a2 584 pc.puts("Error - Command not recognised. Type HELP for a list of available commands\n\r");
GeorgeJourneaux 2:28d12a3db239 585 }
benparkes 16:f30928e622a2 586 /*----------------------------------------------*/
benparkes 16:f30928e622a2 587
benparkes 16:f30928e622a2 588 //Clear serial buffers
GeorgeJourneaux 5:ea3ec65cbf5f 589 memset(serial_buffer, NULL, 80);
GeorgeJourneaux 5:ea3ec65cbf5f 590 memset(rx_buffer, NULL, 32);
GeorgeJourneaux 2:28d12a3db239 591 rx_in = 0;
benparkes 16:f30928e622a2 592
benparkes 16:f30928e622a2 593 //Attach serial interrupt
GeorgeJourneaux 2:28d12a3db239 594 pc.attach(&Rx_interrupt, Serial::RxIrq);
GeorgeJourneaux 2:28d12a3db239 595 }
GeorgeJourneaux 2:28d12a3db239 596 }
dnonoo 7:f017a37bcf1b 597 /*------------------------------------------------*/
dnonoo 10:c10d1337d754 598 /*---------------SD THread------------------------*/
dnonoo 13:089f3adb3813 599 void writeRemove_SD()
dnonoo 13:089f3adb3813 600 {
dnonoo 13:089f3adb3813 601
dnonoo 10:c10d1337d754 602 while(1) {
dnonoo 10:c10d1337d754 603 Thread::signal_wait(USER_BUTTON_PRESSED); //wait for debounce signal
dnonoo 10:c10d1337d754 604 int sd_state = sdIn;
benparkes 16:f30928e622a2 605
dnonoo 10:c10d1337d754 606 switch (sd_state) {
dnonoo 10:c10d1337d754 607 case 1:
dnonoo 10:c10d1337d754 608 pc.printf("SD Card not inserted!\n\r");
dnonoo 10:c10d1337d754 609 pc.printf("Insert SD Card and press User button again\n\r");
dnonoo 10:c10d1337d754 610 break;
dnonoo 13:089f3adb3813 611 default:
dnonoo 10:c10d1337d754 612 pc.printf("This should never happen\n\r");
dnonoo 10:c10d1337d754 613 break;
dnonoo 10:c10d1337d754 614 case 0:
dnonoo 10:c10d1337d754 615 pc.printf("Initalising SD Card\n\r");
dnonoo 7:f017a37bcf1b 616
dnonoo 10:c10d1337d754 617 //check init
dnonoo 10:c10d1337d754 618 if (sd.init() != 0) {
dnonoo 13:089f3adb3813 619 pc.printf(" ERROR - SD card failed to initialise.\n\rRestart board\n\r PROBABLY wires come out\n\r");
benparkes 16:f30928e622a2 620 } else {
dnonoo 13:089f3adb3813 621 // Create Filing system for SD Card
dnonoo 13:089f3adb3813 622 FATFileSystem fs("sd", &sd);
dnonoo 10:c10d1337d754 623
dnonoo 13:089f3adb3813 624 //OpenFiles to write/append to
dnonoo 13:089f3adb3813 625 pc.printf("Writing to SDC\n\r");
dnonoo 10:c10d1337d754 626
dnonoo 13:089f3adb3813 627 FILE* fp = fopen("/sd/TheChamberOfSecrets.txt", "a"); //"w" to overwrite file ftb
dnonoo 10:c10d1337d754 628
dnonoo 13:089f3adb3813 629 // Check for error in opening file
dnonoo 13:089f3adb3813 630 if (fp == NULL) {
dnonoo 13:089f3adb3813 631 pc.printf("*****ERROR - Could not open file for write*****\n\r");
dnonoo 13:089f3adb3813 632 }
dnonoo 13:089f3adb3813 633 //HERE IS WHERE TO PRINT DATA TO SD CARD FROM BUFFER (REMEMBER TO EMPTY BUFFER???)
dnonoo 13:089f3adb3813 634 //Lock data buffer
dnonoo 13:089f3adb3813 635 DataBuffer.lock();
dnonoo 13:089f3adb3813 636 dataLock.lock();
dnonoo 13:089f3adb3813 637 //Print all samples to SD
dnonoo 13:089f3adb3813 638 for(int n=data_t; n<=MAX_SAMPLES; n++) {
dnonoo 10:c10d1337d754 639 fputs(data_buffer[n], fp);
dnonoo 13:089f3adb3813 640 fprintf(fp, "\n\r");
dnonoo 13:089f3adb3813 641 }
dnonoo 13:089f3adb3813 642 if(data_t>data_h) {
dnonoo 13:089f3adb3813 643 for(int n=0; n<=(data_t-1); n++) {
dnonoo 13:089f3adb3813 644 fputs(data_buffer[n], fp);
dnonoo 10:c10d1337d754 645
dnonoo 13:089f3adb3813 646 }
dnonoo 10:c10d1337d754 647 }
dnonoo 10:c10d1337d754 648
dnonoo 13:089f3adb3813 649 //Lock data buffer
dnonoo 13:089f3adb3813 650 DataBuffer.unlock();
dnonoo 13:089f3adb3813 651 dataLock.unlock();
dnonoo 13:089f3adb3813 652 //fprintf(fp, "dd/mm/yy hh:mm:ss, TEMPERATURE, PRESSURE, LIGHT\n\r");
dnonoo 10:c10d1337d754 653
dnonoo 13:089f3adb3813 654 fclose(fp);
dnonoo 10:c10d1337d754 655
dnonoo 13:089f3adb3813 656 pc.printf("Write Sucessful!\n\r");
dnonoo 10:c10d1337d754 657
dnonoo 13:089f3adb3813 658 sd.deinit();
dnonoo 13:089f3adb3813 659 pc.printf("SD Card Ready to Remove\n\r");
dnonoo 13:089f3adb3813 660 Green_ext = 1;
dnonoo 13:089f3adb3813 661 Thread::wait(500);
dnonoo 13:089f3adb3813 662 Green_ext = 0;
dnonoo 13:089f3adb3813 663 Thread::wait(500);
dnonoo 13:089f3adb3813 664 Green_ext = 1;
dnonoo 13:089f3adb3813 665 Thread::wait(500);
dnonoo 13:089f3adb3813 666 Green_ext = 0;
dnonoo 13:089f3adb3813 667 Thread::wait(500);
dnonoo 13:089f3adb3813 668 Green_ext = 1;
dnonoo 13:089f3adb3813 669 Thread::wait(500);
dnonoo 13:089f3adb3813 670 Green_ext = 0;
dnonoo 13:089f3adb3813 671 Thread::wait(500);
dnonoo 13:089f3adb3813 672 Green_ext = 1;
dnonoo 13:089f3adb3813 673 Thread::wait(500);
dnonoo 13:089f3adb3813 674 Green_ext = 0;
dnonoo 13:089f3adb3813 675 Thread::wait(500);
dnonoo 13:089f3adb3813 676 }// end if
dnonoo 10:c10d1337d754 677 }//End Switch
dnonoo 10:c10d1337d754 678 }// End While
dnonoo 10:c10d1337d754 679 }// End Thread
dnonoo 10:c10d1337d754 680 /*--------------------------------------------------------------------------*/
dnonoo 10:c10d1337d754 681
dnonoo 10:c10d1337d754 682 /*---------------------------Networking Thread------------------------------*/
dnonoo 12:a244f6f9d2fe 683 void Network1 ()
dnonoo 12:a244f6f9d2fe 684 {
dnonoo 12:a244f6f9d2fe 685
dnonoo 10:c10d1337d754 686 printf("Setting up server\n\r");
dnonoo 12:a244f6f9d2fe 687
dnonoo 10:c10d1337d754 688 //Configure an ethernet connection
dnonoo 10:c10d1337d754 689 EthernetInterface eth;
dnonoo 10:c10d1337d754 690 eth.set_network(IP, NETMASK, GATEWAY);
dnonoo 10:c10d1337d754 691 eth.connect();
dnonoo 11:19135c83c208 692 if (eth.get_ip_address() == NULL) {
dnonoo 11:19135c83c208 693 pc.printf("Error - Can't get IP. Network not setup\n\r");
dnonoo 11:19135c83c208 694 pc.printf("Reset Required. Make sure network cables are plugged in\n\r");
benparkes 16:f30928e622a2 695 } else {
dnonoo 12:a244f6f9d2fe 696 printf("The target IP address is '%s'\n\r", eth.get_ip_address());
dnonoo 12:a244f6f9d2fe 697
dnonoo 12:a244f6f9d2fe 698 //Now setup a web server
dnonoo 12:a244f6f9d2fe 699 TCPServer srv; //TCP/IP Server
dnonoo 12:a244f6f9d2fe 700
dnonoo 12:a244f6f9d2fe 701 SocketAddress clt_addr; //Address of incoming connection
dnonoo 12:a244f6f9d2fe 702
dnonoo 12:a244f6f9d2fe 703 /* Open the server on ethernet stack */
dnonoo 12:a244f6f9d2fe 704 srv.open(&eth);
dnonoo 12:a244f6f9d2fe 705
dnonoo 12:a244f6f9d2fe 706 /* Bind the HTTP port (TCP 80) to the server */
dnonoo 12:a244f6f9d2fe 707 srv.bind(eth.get_ip_address(), 80);
dnonoo 12:a244f6f9d2fe 708
dnonoo 12:a244f6f9d2fe 709 /* Can handle 5 simultaneous connections */
dnonoo 12:a244f6f9d2fe 710 srv.listen(5);
benparkes 16:f30928e622a2 711
dnonoo 12:a244f6f9d2fe 712 TCPSocket clt_sock; //Socket for communication
benparkes 16:f30928e622a2 713
dnonoo 15:864d936b51cf 714 pc.printf("\rServer Ready\n\r");
benparkes 16:f30928e622a2 715
dnonoo 12:a244f6f9d2fe 716 while (true) {
benparkes 16:f30928e622a2 717
dnonoo 12:a244f6f9d2fe 718 using namespace std;
dnonoo 12:a244f6f9d2fe 719 //Block and wait on an incoming connection
dnonoo 12:a244f6f9d2fe 720 srv.accept(&clt_sock, &clt_addr);
dnonoo 12:a244f6f9d2fe 721 //printf("accept %s:%d\n\r", clt_addr.get_ip_address(), clt_addr.get_port());
dnonoo 12:a244f6f9d2fe 722
dnonoo 12:a244f6f9d2fe 723 //Uses a C++ string to make it easier to concatinate
dnonoo 12:a244f6f9d2fe 724 string response;
dnonoo 12:a244f6f9d2fe 725 string strL = "LDR:";
dnonoo 12:a244f6f9d2fe 726 string strP = ", Pressure(mBar): ";
dnonoo 12:a244f6f9d2fe 727 string strT = ", Temp(C): ";
benparkes 16:f30928e622a2 728 string strDT ="Date/Time: ,";
dnonoo 12:a244f6f9d2fe 729
dnonoo 12:a244f6f9d2fe 730 //This is a C string
benparkes 16:f30928e622a2 731
dnonoo 13:089f3adb3813 732 char X_str[128];
dnonoo 12:a244f6f9d2fe 733
dnonoo 13:089f3adb3813 734 /*//Read the LDR value
dnonoo 12:a244f6f9d2fe 735 dataLock.lock(); // add watchdog?
dnonoo 12:a244f6f9d2fe 736 float L = LDR ;
dnonoo 12:a244f6f9d2fe 737 float T = TEMP;
dnonoo 12:a244f6f9d2fe 738 float P = PRES;
dnonoo 13:089f3adb3813 739 char DT[21];
dnonoo 13:089f3adb3813 740 strcpy((char*)TIME,DT);
dnonoo 12:a244f6f9d2fe 741 dataLock.unlock();
dnonoo 12:a244f6f9d2fe 742
dnonoo 12:a244f6f9d2fe 743 //Convert to a C String
dnonoo 13:089f3adb3813 744 //sprintf(l_str, "%1.3f", L ); // try \n\r??
dnonoo 13:089f3adb3813 745 //sprintf(t_str, "%2.2f", T);
dnonoo 13:089f3adb3813 746 //sprintf(p_str, "%4.2f", P);*/
benparkes 16:f30928e622a2 747 osEvent evt = mail_Network.get();
benparkes 16:f30928e622a2 748
benparkes 16:f30928e622a2 749 if (evt.status == osEventMail) {
benparkes 16:f30928e622a2 750 mail_t *mail = (mail_t*)evt.value.p;
benparkes 18:728fddea6d9c 751 char sample_time[21];
benparkes 18:728fddea6d9c 752 int rTime = mail->Time_Date;
benparkes 18:728fddea6d9c 753 time((time_t*)rTime);
benparkes 18:728fddea6d9c 754 sample_epoch = localtime((time_t*)rTime);
benparkes 18:728fddea6d9c 755 strftime(sample_time, 21,"%d/%m/%Y, %X", sample_epoch);
benparkes 18:728fddea6d9c 756 sprintf(X_str,"%s, \n\rTemperature: %2.2f, \n\rPressure: %4.2f, \n\rLight: %.4f", sample_time, mail->temp_Value, mail->press_Value, mail->LDR_Value);
benparkes 16:f30928e622a2 757
benparkes 16:f30928e622a2 758 mail_Network.free(mail);
benparkes 16:f30928e622a2 759 }
benparkes 16:f30928e622a2 760
dnonoo 12:a244f6f9d2fe 761
dnonoo 12:a244f6f9d2fe 762
dnonoo 12:a244f6f9d2fe 763 //Build the C++ string response
dnonoo 12:a244f6f9d2fe 764 response = HTTP_MESSAGE_BODY1;
dnonoo 13:089f3adb3813 765 response += X_str;
dnonoo 13:089f3adb3813 766 /* response += strL;
dnonoo 13:089f3adb3813 767 response += strDT;
dnonoo 13:089f3adb3813 768 response += strL;
dnonoo 12:a244f6f9d2fe 769 response += l_str;
dnonoo 12:a244f6f9d2fe 770 response += strT;
dnonoo 12:a244f6f9d2fe 771 response += t_str;
dnonoo 12:a244f6f9d2fe 772 response += strP;
dnonoo 13:089f3adb3813 773 response += p_str;*/
dnonoo 12:a244f6f9d2fe 774 response += HTTP_MESSAGE_BODY2;
dnonoo 12:a244f6f9d2fe 775
dnonoo 12:a244f6f9d2fe 776 //Send static HTML response (as a C string)
dnonoo 12:a244f6f9d2fe 777 clt_sock.send(response.c_str(), response.size()+6);
dnonoo 12:a244f6f9d2fe 778
dnonoo 12:a244f6f9d2fe 779 }// end While
dnonoo 12:a244f6f9d2fe 780 }//end if
dnonoo 12:a244f6f9d2fe 781 }// end thread
dnonoo 10:c10d1337d754 782 /*---------------------------POST--------------------------------------------*/
benparkes 16:f30928e622a2 783 void POST ()
benparkes 16:f30928e622a2 784 {
benparkes 16:f30928e622a2 785 pc.printf(" Basic POST\n\r");
dnonoo 7:f017a37bcf1b 786 pc.printf(" ALL Leds should be flashing\n\r");
benparkes 16:f30928e622a2 787
dnonoo 7:f017a37bcf1b 788 for(unsigned int n = 0; n<10; n++) {
dnonoo 7:f017a37bcf1b 789 Green_int = ON;
dnonoo 7:f017a37bcf1b 790 Blue_int = ON;
dnonoo 7:f017a37bcf1b 791 Red_int = ON;
dnonoo 7:f017a37bcf1b 792 Green_ext = ON;
dnonoo 7:f017a37bcf1b 793 Yellow_ext = ON;
dnonoo 7:f017a37bcf1b 794 Red_ext = ON;
benparkes 16:f30928e622a2 795
dnonoo 7:f017a37bcf1b 796 wait (0.2);
dnonoo 7:f017a37bcf1b 797 Green_int = OFF;
dnonoo 7:f017a37bcf1b 798 Blue_int = OFF;
dnonoo 7:f017a37bcf1b 799 Red_int = OFF;
dnonoo 7:f017a37bcf1b 800 Green_ext = OFF;
dnonoo 7:f017a37bcf1b 801 Yellow_ext = OFF;
dnonoo 7:f017a37bcf1b 802 Red_ext = OFF;
dnonoo 7:f017a37bcf1b 803 wait (0.2);
dnonoo 7:f017a37bcf1b 804 }
benparkes 16:f30928e622a2 805
dnonoo 7:f017a37bcf1b 806 pc.printf("Switch states:\n\r");
dnonoo 7:f017a37bcf1b 807 pc.printf("\tSW_L: %d\n\r\tSW_R %d\n\r", SW_L.read(), SW_R.read());
benparkes 16:f30928e622a2 808
dnonoo 7:f017a37bcf1b 809 float Temp = Sensor.getTemperature();
dnonoo 7:f017a37bcf1b 810 float Pres = Sensor.getPressure();
dnonoo 7:f017a37bcf1b 811 float ldrs = LDR_In.read();
benparkes 16:f30928e622a2 812
dnonoo 7:f017a37bcf1b 813 pc.printf("Sensor test:\n\r");
dnonoo 7:f017a37bcf1b 814 pc.printf("T: %f\tP: %f\tL: %f\n\r",Temp,Pres,ldrs);
benparkes 16:f30928e622a2 815
dnonoo 7:f017a37bcf1b 816 pc.printf("LCD Test\n\r");
benparkes 16:f30928e622a2 817
dnonoo 7:f017a37bcf1b 818 lcd.Clear();
dnonoo 14:7c4d87dfc388 819 lcd.RowSelect(0);
dnonoo 14:7c4d87dfc388 820 lcd.Write("1******LCD*********1");
dnonoo 7:f017a37bcf1b 821 lcd.RowSelect(1);
dnonoo 14:7c4d87dfc388 822 lcd.Write("2******TEST********2");
dnonoo 7:f017a37bcf1b 823 lcd.RowSelect(2);
dnonoo 14:7c4d87dfc388 824 lcd.Write("3******LCD*********3");
dnonoo 14:7c4d87dfc388 825 lcd.RowSelect(3);
dnonoo 14:7c4d87dfc388 826 lcd.Write("4******TEST********4");
benparkes 16:f30928e622a2 827
dnonoo 7:f017a37bcf1b 828 wait(1);
dnonoo 10:c10d1337d754 829 lcd.Clear();
benparkes 16:f30928e622a2 830 pc.printf("Basic POST end\n\r");
dnonoo 7:f017a37bcf1b 831 }