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

