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.
Dependencies: TextLCD nRF24L01P mbed
main.cpp@10:3417715786be, 2017-01-22 (annotated)
- Committer:
- jackmax
- Date:
- Sun Jan 22 20:03:32 2017 +0000
- Revision:
- 10:3417715786be
- Parent:
- 9:53da36425601
- Child:
- 11:c94b9db597e9
Usun??em obs?ug? w?tk?w, bo k??ci?a si? z callbackami do wi-fi. Zdebugowanie tego zaj??o mi 3 godziny. Przepisa?em wszystko bez w?tk?w, ale chyba nie b?dzie dzia?a? tak dobrze. Debugowanie tego b?dzie ciekawe.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| jackmax | 6:19012a85ce35 | 1 | #include "mbed.h" |
| jackmax | 10:3417715786be | 2 | //#include "rtos.h" |
| jackmax | 6:19012a85ce35 | 3 | #include "TextLCD.h" |
| jackmax | 6:19012a85ce35 | 4 | #include "custom-chars.h" |
| jackmax | 9:53da36425601 | 5 | #include "melodies.h" |
| jackmax | 8:0de75e0480aa | 6 | #include "nRF24L01P.h" |
| jackmax | 9:53da36425601 | 7 | #include <string> |
| jackmax | 10:3417715786be | 8 | #include <vector> |
| jackmax | 10:3417715786be | 9 | |
| jackmax | 10:3417715786be | 10 | time_t next_alarm = 0; |
| jackmax | 8:0de75e0480aa | 11 | |
| jackmax | 6:19012a85ce35 | 12 | // Host PC Communication channels |
| jackmax | 6:19012a85ce35 | 13 | Serial pc(USBTX, USBRX); // tx, rx |
| jackmax | 6:19012a85ce35 | 14 | |
| jackmax | 6:19012a85ce35 | 15 | I2C i2c_lcd(D5,D7); // SDA, SCL pins. Change if necessary |
| jackmax | 6:19012a85ce35 | 16 | TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD16x2); // I2C exp: I2C bus, PCF8574 Slaveaddress, LCD Type |
| jackmax | 6:19012a85ce35 | 17 | |
| jackmax | 6:19012a85ce35 | 18 | //Light sensor |
| jackmax | 10:3417715786be | 19 | #define LIGHT_INTERVAL 2 |
| jackmax | 6:19012a85ce35 | 20 | AnalogIn light_sensor(A1); |
| jackmax | 10:3417715786be | 21 | double light_sum; |
| jackmax | 10:3417715786be | 22 | int light_samples; |
| jackmax | 10:3417715786be | 23 | time_t next_light = 0; |
| jackmax | 10:3417715786be | 24 | //Mutex light_mutex; |
| jackmax | 10:3417715786be | 25 | |
| jackmax | 10:3417715786be | 26 | void lightSensor(){ |
| jackmax | 10:3417715786be | 27 | light_sum += light_sensor; |
| jackmax | 10:3417715786be | 28 | light_samples++; |
| jackmax | 10:3417715786be | 29 | next_light = time(NULL) + LIGHT_INTERVAL; |
| jackmax | 10:3417715786be | 30 | } |
| jackmax | 6:19012a85ce35 | 31 | |
| jackmax | 8:0de75e0480aa | 32 | //2.4 GHz radio |
| jackmax | 8:0de75e0480aa | 33 | #define RX_ADDRESS ((unsigned long long) 0xABCDEF00) |
| jackmax | 8:0de75e0480aa | 34 | #define TX_ADDRESS ((unsigned long long) 0xABCDEF01) |
| jackmax | 8:0de75e0480aa | 35 | #define TRANSFER_SIZE 32 |
| jackmax | 8:0de75e0480aa | 36 | |
| jackmax | 8:0de75e0480aa | 37 | nRF24L01P radio(PB_15, PB_14, PB_13, PB_12, PB_1, PB_2); |
| jackmax | 8:0de75e0480aa | 38 | |
| jackmax | 8:0de75e0480aa | 39 | void initRadio(int channel, int power, int datarate){ |
| jackmax | 8:0de75e0480aa | 40 | radio.powerDown(); |
| jackmax | 8:0de75e0480aa | 41 | radio.powerUp(); |
| jackmax | 8:0de75e0480aa | 42 | |
| jackmax | 8:0de75e0480aa | 43 | radio.setAirDataRate(datarate); |
| jackmax | 8:0de75e0480aa | 44 | radio.setRfOutputPower(power); |
| jackmax | 8:0de75e0480aa | 45 | radio.setRfFrequency(NRF24L01P_MIN_RF_FREQUENCY + 4 * channel); |
| jackmax | 8:0de75e0480aa | 46 | |
| jackmax | 8:0de75e0480aa | 47 | radio.setCrcWidth(NRF24L01P_CRC_8_BIT); |
| jackmax | 8:0de75e0480aa | 48 | radio.enableAutoAcknowledge(NRF24L01P_PIPE_P0); |
| jackmax | 8:0de75e0480aa | 49 | radio.enableAutoAcknowledge(NRF24L01P_PIPE_P1); |
| jackmax | 8:0de75e0480aa | 50 | radio.enableAutoRetransmit(0x0F, 0x0F); |
| jackmax | 8:0de75e0480aa | 51 | |
| jackmax | 8:0de75e0480aa | 52 | radio.setTxAddress(TX_ADDRESS, 4); |
| jackmax | 8:0de75e0480aa | 53 | radio.setRxAddress(TX_ADDRESS, 4, NRF24L01P_PIPE_P0); |
| jackmax | 8:0de75e0480aa | 54 | |
| jackmax | 8:0de75e0480aa | 55 | radio.setRxAddress(RX_ADDRESS, 4, NRF24L01P_PIPE_P1); |
| jackmax | 8:0de75e0480aa | 56 | |
| jackmax | 8:0de75e0480aa | 57 | // Display the (default) setup of the nRF24L01+ chip |
| jackmax | 8:0de75e0480aa | 58 | pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", radio.getRfFrequency() ); |
| jackmax | 8:0de75e0480aa | 59 | pc.printf( "nRF24L01+ Output power : %d dBm\r\n", radio.getRfOutputPower() ); |
| jackmax | 8:0de75e0480aa | 60 | pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", radio.getAirDataRate() ); |
| jackmax | 8:0de75e0480aa | 61 | pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", radio.getTxAddress() ); |
| jackmax | 8:0de75e0480aa | 62 | pc.printf( "nRF24L01+ RX0 Address : 0x%010llX\r\n", radio.getRxAddress(NRF24L01P_PIPE_P0) ); |
| jackmax | 8:0de75e0480aa | 63 | pc.printf( "nRF24L01+ RX1 Address : 0x%010llX\r\n", radio.getRxAddress(NRF24L01P_PIPE_P1) ); |
| jackmax | 8:0de75e0480aa | 64 | |
| jackmax | 8:0de75e0480aa | 65 | |
| jackmax | 8:0de75e0480aa | 66 | radio.setTransferSize(TRANSFER_SIZE, NRF24L01P_PIPE_P0); |
| jackmax | 8:0de75e0480aa | 67 | radio.setTransferSize(TRANSFER_SIZE, NRF24L01P_PIPE_P1); |
| jackmax | 8:0de75e0480aa | 68 | |
| jackmax | 8:0de75e0480aa | 69 | radio.setReceiveMode(); |
| jackmax | 8:0de75e0480aa | 70 | radio.enable(); |
| jackmax | 8:0de75e0480aa | 71 | }; |
| jackmax | 8:0de75e0480aa | 72 | |
| jackmax | 10:3417715786be | 73 | bool movement_detected = false; |
| jackmax | 10:3417715786be | 74 | |
| jackmax | 10:3417715786be | 75 | std::vector<std::string> last_wireless_data; |
| jackmax | 10:3417715786be | 76 | time_t last_wireless_time; |
| jackmax | 9:53da36425601 | 77 | |
| jackmax | 10:3417715786be | 78 | void processWirelessData(char* data_string){ |
| jackmax | 10:3417715786be | 79 | std::string s = data_string; |
| jackmax | 10:3417715786be | 80 | std::vector<std::string> data; |
| jackmax | 10:3417715786be | 81 | size_t pos = 0; |
| jackmax | 10:3417715786be | 82 | std::string token; |
| jackmax | 10:3417715786be | 83 | std::string delimiter = "&"; |
| jackmax | 10:3417715786be | 84 | |
| jackmax | 10:3417715786be | 85 | while ((pos = s.find(delimiter)) != std::string::npos) { |
| jackmax | 10:3417715786be | 86 | token = s.substr(0, pos); |
| jackmax | 10:3417715786be | 87 | data.push_back(token); |
| jackmax | 10:3417715786be | 88 | s.erase(0, pos + delimiter.length()); |
| jackmax | 10:3417715786be | 89 | } |
| jackmax | 10:3417715786be | 90 | |
| jackmax | 10:3417715786be | 91 | last_wireless_data = data; |
| jackmax | 10:3417715786be | 92 | last_wireless_time = time(NULL); |
| jackmax | 10:3417715786be | 93 | |
| jackmax | 10:3417715786be | 94 | if (data.size() >= 3){ |
| jackmax | 10:3417715786be | 95 | double min = atof(data[0].c_str()); |
| jackmax | 10:3417715786be | 96 | double max = atof(data[1].c_str()); |
| jackmax | 10:3417715786be | 97 | double avg = atof(data[2].c_str()); |
| jackmax | 9:53da36425601 | 98 | |
| jackmax | 10:3417715786be | 99 | if (max > 0.3 && avg > 0.1) |
| jackmax | 10:3417715786be | 100 | movement_detected = true; |
| jackmax | 10:3417715786be | 101 | else |
| jackmax | 10:3417715786be | 102 | movement_detected = false; |
| jackmax | 9:53da36425601 | 103 | } |
| jackmax | 9:53da36425601 | 104 | } |
| jackmax | 9:53da36425601 | 105 | |
| jackmax | 10:3417715786be | 106 | void radio_recv(){ |
| jackmax | 10:3417715786be | 107 | char rxData[TRANSFER_SIZE+1]; |
| jackmax | 10:3417715786be | 108 | int rx_bytes=0; |
| jackmax | 10:3417715786be | 109 | |
| jackmax | 10:3417715786be | 110 | if(radio.readable(NRF24L01P_PIPE_P1)){ |
| jackmax | 10:3417715786be | 111 | rx_bytes = radio.read(NRF24L01P_PIPE_P1, rxData, TRANSFER_SIZE); |
| jackmax | 10:3417715786be | 112 | rxData[TRANSFER_SIZE] = '\0'; |
| jackmax | 10:3417715786be | 113 | pc.printf("Received %d >>%s<<\r\n",rx_bytes, rxData); |
| jackmax | 10:3417715786be | 114 | processWirelessData(rxData); |
| jackmax | 10:3417715786be | 115 | } |
| jackmax | 10:3417715786be | 116 | } |
| jackmax | 10:3417715786be | 117 | |
| jackmax | 10:3417715786be | 118 | //Handling display |
| jackmax | 10:3417715786be | 119 | void backlightTimeout(); |
| jackmax | 10:3417715786be | 120 | //RtosTimer backlightTimer(&backlightTimeout, osTimerPeriodic, (void*)0); |
| jackmax | 10:3417715786be | 121 | Timeout backlightTimer; |
| jackmax | 6:19012a85ce35 | 122 | |
| jackmax | 6:19012a85ce35 | 123 | class Display{ |
| jackmax | 6:19012a85ce35 | 124 | public: |
| jackmax | 6:19012a85ce35 | 125 | int wifi_on; |
| jackmax | 6:19012a85ce35 | 126 | int alarm_on; |
| jackmax | 6:19012a85ce35 | 127 | int sync_in_progress; |
| jackmax | 6:19012a85ce35 | 128 | int wireless_in_progress; |
| jackmax | 6:19012a85ce35 | 129 | int frame; |
| jackmax | 6:19012a85ce35 | 130 | |
| jackmax | 6:19012a85ce35 | 131 | time_t seconds; |
| jackmax | 6:19012a85ce35 | 132 | char time_str[9]; |
| jackmax | 6:19012a85ce35 | 133 | char date_str[9]; |
| jackmax | 6:19012a85ce35 | 134 | |
| jackmax | 10:3417715786be | 135 | static const float backlightTime = 5.000; |
| jackmax | 6:19012a85ce35 | 136 | int backlightState; |
| jackmax | 6:19012a85ce35 | 137 | Display() |
| jackmax | 6:19012a85ce35 | 138 | { |
| jackmax | 6:19012a85ce35 | 139 | wifi_on = 0; |
| jackmax | 6:19012a85ce35 | 140 | alarm_on = 0; |
| jackmax | 6:19012a85ce35 | 141 | sync_in_progress = 0; |
| jackmax | 6:19012a85ce35 | 142 | wireless_in_progress = 0; |
| jackmax | 6:19012a85ce35 | 143 | frame = 0; |
| jackmax | 6:19012a85ce35 | 144 | backlightState = 0; |
| jackmax | 6:19012a85ce35 | 145 | |
| jackmax | 6:19012a85ce35 | 146 | lcd.setCursor(TextLCD::CurOff_BlkOff); |
| jackmax | 6:19012a85ce35 | 147 | lcd.setUDC(C_ALRM, cc_dzwonek); |
| jackmax | 6:19012a85ce35 | 148 | lcd.setUDC(C_WIFI, cc_wifi); |
| jackmax | 6:19012a85ce35 | 149 | lcd.setUDC(C_WLC , cc_wireless); |
| jackmax | 6:19012a85ce35 | 150 | } |
| jackmax | 6:19012a85ce35 | 151 | |
| jackmax | 6:19012a85ce35 | 152 | void backlightOff(){ |
| jackmax | 6:19012a85ce35 | 153 | lcd.setBacklight(TextLCD::LightOff); |
| jackmax | 6:19012a85ce35 | 154 | backlightState = 0; |
| jackmax | 6:19012a85ce35 | 155 | } |
| jackmax | 6:19012a85ce35 | 156 | |
| jackmax | 6:19012a85ce35 | 157 | void backlightOn(){ |
| jackmax | 6:19012a85ce35 | 158 | lcd.setBacklight(TextLCD::LightOn); |
| jackmax | 6:19012a85ce35 | 159 | backlightState = 1; |
| jackmax | 10:3417715786be | 160 | backlightTimer.attach(&backlightTimeout, backlightTime); |
| jackmax | 10:3417715786be | 161 | |
| jackmax | 6:19012a85ce35 | 162 | } |
| jackmax | 6:19012a85ce35 | 163 | |
| jackmax | 6:19012a85ce35 | 164 | void update(){ |
| jackmax | 6:19012a85ce35 | 165 | //Top row of display |
| jackmax | 6:19012a85ce35 | 166 | char ico1 = ' '; |
| jackmax | 10:3417715786be | 167 | char ico2 = sync_in_progress ? (frame % 2 ? C_WIFI : ' ' ) : ' '; |
| jackmax | 10:3417715786be | 168 | char ico3 = ' '; |
| jackmax | 10:3417715786be | 169 | char alarm_time[6]; |
| jackmax | 10:3417715786be | 170 | if (next_alarm != 0){ |
| jackmax | 10:3417715786be | 171 | ico3 = C_ALRM; |
| jackmax | 10:3417715786be | 172 | strftime(alarm_time, 6, "%H:%M", localtime(&next_alarm)); |
| jackmax | 10:3417715786be | 173 | } |
| jackmax | 10:3417715786be | 174 | else { |
| jackmax | 10:3417715786be | 175 | strcpy(alarm_time, " "); |
| jackmax | 10:3417715786be | 176 | } |
| jackmax | 6:19012a85ce35 | 177 | |
| jackmax | 6:19012a85ce35 | 178 | time_t seconds_now = time(NULL); |
| jackmax | 6:19012a85ce35 | 179 | if (seconds_now != seconds) { |
| jackmax | 6:19012a85ce35 | 180 | seconds = seconds_now; |
| jackmax | 6:19012a85ce35 | 181 | strftime(time_str, 9, "%X", localtime(&seconds)); |
| jackmax | 6:19012a85ce35 | 182 | strftime(date_str, 9, "%x", localtime(&seconds)); |
| jackmax | 6:19012a85ce35 | 183 | } |
| jackmax | 6:19012a85ce35 | 184 | |
| jackmax | 6:19012a85ce35 | 185 | lcd.locate(0,0); //Put in top row |
| jackmax | 10:3417715786be | 186 | lcd.printf("%s%c%c%c%s",time_str,ico1,ico2,ico3,alarm_time); |
| jackmax | 6:19012a85ce35 | 187 | |
| jackmax | 6:19012a85ce35 | 188 | lcd.locate(0,1); //Put in bottom row |
| jackmax | 6:19012a85ce35 | 189 | if (sync_in_progress) { |
| jackmax | 6:19012a85ce35 | 190 | lcd.printf("Synchronizacja.."); |
| jackmax | 6:19012a85ce35 | 191 | } |
| jackmax | 10:3417715786be | 192 | if (alarm_on){ |
| jackmax | 10:3417715786be | 193 | lcd.printf("Wstawaj! "); |
| jackmax | 10:3417715786be | 194 | } |
| jackmax | 6:19012a85ce35 | 195 | else { |
| jackmax | 6:19012a85ce35 | 196 | if (frame % 60 < 30) { |
| jackmax | 6:19012a85ce35 | 197 | lcd.printf("SmartAlarm+ Pro "); |
| jackmax | 6:19012a85ce35 | 198 | } |
| jackmax | 6:19012a85ce35 | 199 | else { |
| jackmax | 6:19012a85ce35 | 200 | lcd.printf(" %08s ", date_str); |
| jackmax | 6:19012a85ce35 | 201 | } |
| jackmax | 6:19012a85ce35 | 202 | } |
| jackmax | 6:19012a85ce35 | 203 | frame++; |
| jackmax | 6:19012a85ce35 | 204 | } |
| jackmax | 6:19012a85ce35 | 205 | }; |
| jackmax | 6:19012a85ce35 | 206 | |
| jackmax | 6:19012a85ce35 | 207 | Display disp; |
| jackmax | 6:19012a85ce35 | 208 | |
| jackmax | 6:19012a85ce35 | 209 | //Handling user button presses |
| jackmax | 6:19012a85ce35 | 210 | InterruptIn button(D6); |
| jackmax | 6:19012a85ce35 | 211 | int userButtonLongPress = 300; //Time in ms; threshold for long press |
| jackmax | 6:19012a85ce35 | 212 | Timer userButtonTimer; |
| jackmax | 6:19012a85ce35 | 213 | |
| jackmax | 6:19012a85ce35 | 214 | int userButtonPressed = 0, userButtonReleased = 0, backlightTimedOut = 0; |
| jackmax | 6:19012a85ce35 | 215 | |
| jackmax | 6:19012a85ce35 | 216 | void userButtonPress(){ |
| jackmax | 6:19012a85ce35 | 217 | userButtonPressed = 1; |
| jackmax | 6:19012a85ce35 | 218 | } |
| jackmax | 6:19012a85ce35 | 219 | |
| jackmax | 6:19012a85ce35 | 220 | void userButtonRelease(){ |
| jackmax | 6:19012a85ce35 | 221 | userButtonReleased = 1; |
| jackmax | 6:19012a85ce35 | 222 | } |
| jackmax | 6:19012a85ce35 | 223 | |
| jackmax | 10:3417715786be | 224 | void backlightTimeout(){ |
| jackmax | 6:19012a85ce35 | 225 | backlightTimedOut = 1; |
| jackmax | 6:19012a85ce35 | 226 | } |
| jackmax | 6:19012a85ce35 | 227 | |
| jackmax | 9:53da36425601 | 228 | //Wi-Fi communication |
| jackmax | 9:53da36425601 | 229 | #define WIFI_SIZE 1000 |
| jackmax | 9:53da36425601 | 230 | Serial wifi(PA_9, PA_10); |
| jackmax | 9:53da36425601 | 231 | char wifiData[WIFI_SIZE]; |
| jackmax | 9:53da36425601 | 232 | bool wifiDataReady = false; |
| jackmax | 9:53da36425601 | 233 | bool readInProgress = false; |
| jackmax | 9:53da36425601 | 234 | int currentReadIndex = 0; |
| jackmax | 9:53da36425601 | 235 | |
| jackmax | 10:3417715786be | 236 | void wifiCallback() { |
| jackmax | 9:53da36425601 | 237 | char c = wifi.getc(); |
| jackmax | 10:3417715786be | 238 | |
| jackmax | 9:53da36425601 | 239 | if (c == '*') { |
| jackmax | 9:53da36425601 | 240 | readInProgress = !readInProgress; |
| jackmax | 9:53da36425601 | 241 | wifiData[currentReadIndex] = '\0'; |
| jackmax | 9:53da36425601 | 242 | currentReadIndex = 0; |
| jackmax | 10:3417715786be | 243 | if (readInProgress == false) |
| jackmax | 10:3417715786be | 244 | wifiDataReady = true; |
| jackmax | 9:53da36425601 | 245 | } else if (readInProgress) { |
| jackmax | 9:53da36425601 | 246 | wifiData[currentReadIndex++] = c; |
| jackmax | 9:53da36425601 | 247 | } |
| jackmax | 9:53da36425601 | 248 | } |
| jackmax | 9:53da36425601 | 249 | |
| jackmax | 9:53da36425601 | 250 | std::string wifiGetData(){ |
| jackmax | 9:53da36425601 | 251 | if (!wifiDataReady) |
| jackmax | 9:53da36425601 | 252 | return ""; |
| jackmax | 9:53da36425601 | 253 | |
| jackmax | 9:53da36425601 | 254 | std::string result = wifiData; |
| jackmax | 9:53da36425601 | 255 | wifiDataReady = false; |
| jackmax | 9:53da36425601 | 256 | return result; |
| jackmax | 9:53da36425601 | 257 | } |
| jackmax | 9:53da36425601 | 258 | |
| jackmax | 9:53da36425601 | 259 | std::string httpGETWithRetry(const char* query, float timeout, int retries){ |
| jackmax | 9:53da36425601 | 260 | Timer t; |
| jackmax | 9:53da36425601 | 261 | for (int retry = 0; retry<retries; retry++){ |
| jackmax | 9:53da36425601 | 262 | wifi.printf(query); |
| jackmax | 9:53da36425601 | 263 | t.reset(); |
| jackmax | 9:53da36425601 | 264 | t.start(); |
| jackmax | 9:53da36425601 | 265 | while (!wifiDataReady && t <= timeout){ |
| jackmax | 9:53da36425601 | 266 | wait(0.01f); |
| jackmax | 9:53da36425601 | 267 | } |
| jackmax | 10:3417715786be | 268 | |
| jackmax | 9:53da36425601 | 269 | pc.printf("http GET trying #%d\r\n", retry); |
| jackmax | 9:53da36425601 | 270 | if (wifiDataReady) |
| jackmax | 9:53da36425601 | 271 | break; |
| jackmax | 9:53da36425601 | 272 | } |
| jackmax | 9:53da36425601 | 273 | return wifiGetData(); |
| jackmax | 9:53da36425601 | 274 | } |
| jackmax | 9:53da36425601 | 275 | |
| jackmax | 9:53da36425601 | 276 | //Synchronization |
| jackmax | 9:53da36425601 | 277 | time_t next_sync = 0; |
| jackmax | 10:3417715786be | 278 | time_t last_sync = 0; |
| jackmax | 9:53da36425601 | 279 | bool sync_in_progress = false; |
| jackmax | 9:53da36425601 | 280 | |
| jackmax | 9:53da36425601 | 281 | time_t getNextSync(){ |
| jackmax | 9:53da36425601 | 282 | //TODO: zmiennej czasu nie powinno sie chyba tak modyfikowac |
| jackmax | 10:3417715786be | 283 | return time (NULL) + 23; |
| jackmax | 9:53da36425601 | 284 | } |
| jackmax | 8:0de75e0480aa | 285 | |
| jackmax | 10:3417715786be | 286 | int syncFunction(){ |
| jackmax | 10:3417715786be | 287 | disp.sync_in_progress = 1; |
| jackmax | 10:3417715786be | 288 | last_sync = time(NULL); |
| jackmax | 9:53da36425601 | 289 | std::string time_string = httpGETWithRetry("GET " |
| jackmax | 9:53da36425601 | 290 | "/time/current/ " |
| jackmax | 9:53da36425601 | 291 | "HTTP/1.1\r\n" |
| jackmax | 10:3417715786be | 292 | "Host: 10.1.8.202:8080\r\n\r\n", 2.0, 5); |
| jackmax | 9:53da36425601 | 293 | if (time_string == ""){ |
| jackmax | 10:3417715786be | 294 | //TODO: błąd synchronizacji |
| jackmax | 9:53da36425601 | 295 | } |
| jackmax | 9:53da36425601 | 296 | else { |
| jackmax | 9:53da36425601 | 297 | set_time(atoi(time_string.c_str())); |
| jackmax | 9:53da36425601 | 298 | } |
| jackmax | 9:53da36425601 | 299 | |
| jackmax | 9:53da36425601 | 300 | time_string = httpGETWithRetry("GET " |
| jackmax | 10:3417715786be | 301 | "/alarm/get/nearest/id/5881e409e93a2218d42fe888 " |
| jackmax | 9:53da36425601 | 302 | "HTTP/1.1\r\n" |
| jackmax | 10:3417715786be | 303 | "Host: 10.1.8.202:8080\r\n\r\n", 2.0, 5); |
| jackmax | 9:53da36425601 | 304 | if (time_string == ""){ |
| jackmax | 9:53da36425601 | 305 | } |
| jackmax | 9:53da36425601 | 306 | else { |
| jackmax | 9:53da36425601 | 307 | next_alarm = atoi(time_string.c_str()); |
| jackmax | 9:53da36425601 | 308 | } |
| jackmax | 9:53da36425601 | 309 | |
| jackmax | 10:3417715786be | 310 | time_t now; |
| jackmax | 10:3417715786be | 311 | time(&now); |
| jackmax | 10:3417715786be | 312 | char time_str[50]; |
| jackmax | 10:3417715786be | 313 | strftime(time_str, 50, "%FT%TZ", gmtime(&now)); |
| jackmax | 10:3417715786be | 314 | |
| jackmax | 10:3417715786be | 315 | //Get light sensor data |
| jackmax | 10:3417715786be | 316 | double light_sensor_avg; |
| jackmax | 10:3417715786be | 317 | light_sensor_avg = light_samples == 0 ? 0 : light_sum / light_samples ; |
| jackmax | 10:3417715786be | 318 | light_sum = 0; |
| jackmax | 10:3417715786be | 319 | light_samples = 0; |
| jackmax | 10:3417715786be | 320 | |
| jackmax | 10:3417715786be | 321 | wifi.printf("POST " |
| jackmax | 10:3417715786be | 322 | "/alarm/get/nearest/id/5881e409e93a2218d42fe888 " |
| jackmax | 10:3417715786be | 323 | "HTTP/1.1\r\n" |
| jackmax | 10:3417715786be | 324 | "Host: 10.1.8.202:8080\r\n\r\n" |
| jackmax | 10:3417715786be | 325 | "{" |
| jackmax | 10:3417715786be | 326 | "\"date\":\"%s\"" |
| jackmax | 10:3417715786be | 327 | "\"value\":%f" |
| jackmax | 10:3417715786be | 328 | "\"device_id\":\"5881e409e93a2218d42fe888\"" |
| jackmax | 10:3417715786be | 329 | "\"type\":\"light\"" |
| jackmax | 10:3417715786be | 330 | "}\r\n\r\n", time_str, light_sensor_avg); |
| jackmax | 9:53da36425601 | 331 | next_sync = getNextSync(); |
| jackmax | 10:3417715786be | 332 | return 0; |
| jackmax | 9:53da36425601 | 333 | } |
| jackmax | 9:53da36425601 | 334 | |
| jackmax | 9:53da36425601 | 335 | //Alarm |
| jackmax | 10:3417715786be | 336 | PwmOut sound(D13); |
| jackmax | 9:53da36425601 | 337 | bool alarm_playing = false; |
| jackmax | 9:53da36425601 | 338 | bool alarm_stopped = false; |
| jackmax | 9:53da36425601 | 339 | |
| jackmax | 10:3417715786be | 340 | const int* freq = axelf_freq; |
| jackmax | 10:3417715786be | 341 | const int* per = axelf_per; |
| jackmax | 10:3417715786be | 342 | int next_note = 0; |
| jackmax | 10:3417715786be | 343 | |
| jackmax | 10:3417715786be | 344 | void play_next_note(); |
| jackmax | 10:3417715786be | 345 | Timeout next_note_timeout; |
| jackmax | 10:3417715786be | 346 | |
| jackmax | 10:3417715786be | 347 | void start_alarm(){ |
| jackmax | 10:3417715786be | 348 | disp.alarm_on = 1; |
| jackmax | 10:3417715786be | 349 | alarm_playing = true; |
| jackmax | 10:3417715786be | 350 | next_note = 0; |
| jackmax | 10:3417715786be | 351 | next_note_timeout.attach(&play_next_note, 0.01); |
| jackmax | 10:3417715786be | 352 | } |
| jackmax | 10:3417715786be | 353 | |
| jackmax | 10:3417715786be | 354 | void stop_alarm(){ |
| jackmax | 10:3417715786be | 355 | next_alarm = 0; |
| jackmax | 10:3417715786be | 356 | alarm_playing = false; |
| jackmax | 10:3417715786be | 357 | disp.alarm_on = 0; |
| jackmax | 10:3417715786be | 358 | sound = 0.0f; |
| jackmax | 10:3417715786be | 359 | } |
| jackmax | 10:3417715786be | 360 | |
| jackmax | 10:3417715786be | 361 | //TODO: won't work if melody contains -1 per at the beginning, has to have at least one note |
| jackmax | 10:3417715786be | 362 | void play_next_note(){ |
| jackmax | 10:3417715786be | 363 | if (!alarm_playing) |
| jackmax | 10:3417715786be | 364 | return; |
| jackmax | 10:3417715786be | 365 | |
| jackmax | 10:3417715786be | 366 | const float bpm = 100.0f; //tempo |
| jackmax | 10:3417715786be | 367 | const float base_period = 0.5f; |
| jackmax | 10:3417715786be | 368 | const float base_time = bpm / 60.0f; |
| jackmax | 10:3417715786be | 369 | |
| jackmax | 10:3417715786be | 370 | if (per[next_note] <= 0) |
| jackmax | 10:3417715786be | 371 | next_note = 0; |
| jackmax | 10:3417715786be | 372 | |
| jackmax | 10:3417715786be | 373 | if (freq[next_note] != 0) { |
| jackmax | 10:3417715786be | 374 | sound.period(base_period/freq[next_note]); |
| jackmax | 10:3417715786be | 375 | sound = 0.5f; |
| jackmax | 10:3417715786be | 376 | } |
| jackmax | 10:3417715786be | 377 | else { |
| jackmax | 9:53da36425601 | 378 | sound = 0.0f; |
| jackmax | 8:0de75e0480aa | 379 | } |
| jackmax | 10:3417715786be | 380 | |
| jackmax | 10:3417715786be | 381 | next_note++; |
| jackmax | 10:3417715786be | 382 | next_note_timeout.attach(&play_next_note, base_time/per[next_note]); |
| jackmax | 8:0de75e0480aa | 383 | } |
| jackmax | 8:0de75e0480aa | 384 | |
| jackmax | 6:19012a85ce35 | 385 | int main() { |
| jackmax | 10:3417715786be | 386 | wifi.baud(115200); |
| jackmax | 10:3417715786be | 387 | wifi.attach(&wifiCallback); |
| jackmax | 6:19012a85ce35 | 388 | //Initialization |
| jackmax | 6:19012a85ce35 | 389 | disp.backlightOn(); |
| jackmax | 6:19012a85ce35 | 390 | button.rise(&userButtonPress); |
| jackmax | 6:19012a85ce35 | 391 | button.fall(&userButtonRelease); |
| jackmax | 6:19012a85ce35 | 392 | |
| jackmax | 9:53da36425601 | 393 | pc.printf("Waiting for time\r\n"); |
| jackmax | 9:53da36425601 | 394 | |
| jackmax | 9:53da36425601 | 395 | std::string time_string = httpGETWithRetry("GET " |
| jackmax | 9:53da36425601 | 396 | "/time/current/ " |
| jackmax | 9:53da36425601 | 397 | "HTTP/1.1\r\n" |
| jackmax | 10:3417715786be | 398 | "Host: 10.4.8.136:8080\r\n\r\n", 5.0, 5); |
| jackmax | 9:53da36425601 | 399 | |
| jackmax | 10:3417715786be | 400 | pc.printf("Get time returned >>%s<< %d\r\n", time_string.c_str()); |
| jackmax | 9:53da36425601 | 401 | |
| jackmax | 9:53da36425601 | 402 | if (time_string == ""){ |
| jackmax | 9:53da36425601 | 403 | lcd.locate(0,1); //Put in top row |
| jackmax | 9:53da36425601 | 404 | lcd.printf("Blad synchroniz."); |
| jackmax | 9:53da36425601 | 405 | wait(1); |
| jackmax | 10:3417715786be | 406 | set_time(1256729737); //DEBUG: Set RTC time to Wed, 28 Oct 2009 11:35:37 |
| jackmax | 9:53da36425601 | 407 | } |
| jackmax | 9:53da36425601 | 408 | else { |
| jackmax | 9:53da36425601 | 409 | set_time(atoi(time_string.c_str())); |
| jackmax | 9:53da36425601 | 410 | } |
| jackmax | 8:0de75e0480aa | 411 | |
| jackmax | 8:0de75e0480aa | 412 | initRadio(6, NRF24L01P_TX_PWR_ZERO_DB, NRF24L01P_DATARATE_250_KBPS); |
| jackmax | 8:0de75e0480aa | 413 | |
| jackmax | 6:19012a85ce35 | 414 | while (1){ |
| jackmax | 6:19012a85ce35 | 415 | pc.printf("ok\r\n"); |
| jackmax | 6:19012a85ce35 | 416 | |
| jackmax | 8:0de75e0480aa | 417 | //Handling button presses |
| jackmax | 6:19012a85ce35 | 418 | if (userButtonPressed) { |
| jackmax | 6:19012a85ce35 | 419 | userButtonPressed = 0; |
| jackmax | 6:19012a85ce35 | 420 | userButtonTimer.reset(); |
| jackmax | 6:19012a85ce35 | 421 | userButtonTimer.start(); |
| jackmax | 6:19012a85ce35 | 422 | } |
| jackmax | 6:19012a85ce35 | 423 | |
| jackmax | 6:19012a85ce35 | 424 | if (userButtonReleased) { |
| jackmax | 6:19012a85ce35 | 425 | userButtonReleased = 0; |
| jackmax | 6:19012a85ce35 | 426 | userButtonTimer.stop(); |
| jackmax | 6:19012a85ce35 | 427 | if (userButtonTimer.read_ms() > userButtonLongPress){ |
| jackmax | 6:19012a85ce35 | 428 | pc.printf("User button long pressed"); |
| jackmax | 10:3417715786be | 429 | disp.backlightOff(); //that was just debug code anyway |
| jackmax | 9:53da36425601 | 430 | if (alarm_playing){ |
| jackmax | 10:3417715786be | 431 | stop_alarm(); |
| jackmax | 10:3417715786be | 432 | } |
| jackmax | 10:3417715786be | 433 | else { |
| jackmax | 10:3417715786be | 434 | //Force synchronization |
| jackmax | 10:3417715786be | 435 | next_sync = time(NULL); |
| jackmax | 9:53da36425601 | 436 | } |
| jackmax | 6:19012a85ce35 | 437 | } |
| jackmax | 6:19012a85ce35 | 438 | else { |
| jackmax | 6:19012a85ce35 | 439 | pc.printf("User button short pressed"); |
| jackmax | 6:19012a85ce35 | 440 | disp.backlightOn(); |
| jackmax | 6:19012a85ce35 | 441 | } |
| jackmax | 6:19012a85ce35 | 442 | } |
| jackmax | 6:19012a85ce35 | 443 | |
| jackmax | 8:0de75e0480aa | 444 | //Handling backlight |
| jackmax | 6:19012a85ce35 | 445 | if (backlightTimedOut){ |
| jackmax | 6:19012a85ce35 | 446 | backlightTimedOut = 0; |
| jackmax | 6:19012a85ce35 | 447 | disp.backlightOff(); |
| jackmax | 6:19012a85ce35 | 448 | } |
| jackmax | 6:19012a85ce35 | 449 | |
| jackmax | 10:3417715786be | 450 | if (time(NULL) >= next_light){ |
| jackmax | 10:3417715786be | 451 | lightSensor(); |
| jackmax | 10:3417715786be | 452 | } |
| jackmax | 10:3417715786be | 453 | |
| jackmax | 9:53da36425601 | 454 | //Synchronize with server |
| jackmax | 10:3417715786be | 455 | if (time(NULL) >= next_sync){ |
| jackmax | 10:3417715786be | 456 | disp.sync_in_progress = 1; |
| jackmax | 10:3417715786be | 457 | disp.update(); |
| jackmax | 10:3417715786be | 458 | syncFunction(); |
| jackmax | 10:3417715786be | 459 | disp.sync_in_progress = 0; |
| jackmax | 10:3417715786be | 460 | disp.update(); |
| jackmax | 9:53da36425601 | 461 | } |
| jackmax | 9:53da36425601 | 462 | |
| jackmax | 9:53da36425601 | 463 | //Check if alarm should be played |
| jackmax | 10:3417715786be | 464 | if (next_alarm != 0 && !alarm_playing){ |
| jackmax | 10:3417715786be | 465 | if (time(NULL) >= next_alarm-(15*60) ){ //Hardcoded to 15 minutes before set time |
| jackmax | 10:3417715786be | 466 | if (movement_detected || time(NULL) >= next_alarm){ |
| jackmax | 10:3417715786be | 467 | start_alarm(); |
| jackmax | 10:3417715786be | 468 | } |
| jackmax | 10:3417715786be | 469 | } |
| jackmax | 9:53da36425601 | 470 | } |
| jackmax | 9:53da36425601 | 471 | |
| jackmax | 10:3417715786be | 472 | //Try to receive from radio |
| jackmax | 10:3417715786be | 473 | radio_recv(); |
| jackmax | 10:3417715786be | 474 | |
| jackmax | 8:0de75e0480aa | 475 | //Updating display |
| jackmax | 6:19012a85ce35 | 476 | disp.update(); |
| jackmax | 8:0de75e0480aa | 477 | |
| jackmax | 10:3417715786be | 478 | wait_ms(100); |
| jackmax | 6:19012a85ce35 | 479 | }; |
| jackmax | 6:19012a85ce35 | 480 | } |
| jackmax | 6:19012a85ce35 | 481 | |
| jackmax | 6:19012a85ce35 | 482 | |
| jackmax | 6:19012a85ce35 | 483 |

