JNP3 SmartAlarm / Mbed 2 deprecated budzik

Dependencies:   TextLCD nRF24L01P mbed

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?

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