JNP3 SmartAlarm / Mbed 2 deprecated budzik

Dependencies:   TextLCD nRF24L01P mbed

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?

UserRevisionLine numberNew 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