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