diff --git a/zuno/zuno.ino b/zuno/zuno.ino index 983fb8e..1740510 100644 --- a/zuno/zuno.ino +++ b/zuno/zuno.ino @@ -76,6 +76,7 @@ unsigned long current_timestamp = 0; unsigned long activity_timestamp = 0; unsigned long servo_timestamp = 0; unsigned long rfid_timeout_timestamp = 0; +unsigned long alarm_timestamp = 0; bool lock_disable = false; @@ -92,6 +93,15 @@ int rfid_tags[RFID_TAGS][RFID_TAG_BYTES]; int rfid_store_tag_nbr = 0; bool rfid_store_tag = false; +#define ALARM_PRE_STAGE_DISABLED 0 +#define ALARM_PRE_STAGE_WAITING 1 +#define ALARM_PRE_STAGE_ENABLED 2 + +int alarm_pre_activate = 0; +bool alarm_activate = false; +bool alarm_confirmed = false; +bool alarm_waiting_for_confirmation = false; + ServoController servo(12); ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_ALWAYS_AWAKE); @@ -100,8 +110,10 @@ ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_ALWAYS_AWAKE); ZUNO_SETUP_CHANNELS( ZUNO_SWITCH_BINARY(getterLock, setterLock), ZUNO_SWITCH_BINARY(getterLockDisable, setterLockDisable), + ZUNO_SWITCH_BINARY(getterAlarmActivate, setterAlarmActivate), + ZUNO_SWITCH_BINARY(getterAlarmConfirm, setterAlarmConfirm), ZUNO_SWITCH_MULTILEVEL(getterStoreRFID, setterStoreRFID), - ZUNO_SENSOR_BINARY_DOOR_WINDOW(getterDoor) + ZUNO_SENSOR_BINARY_DOOR_WINDOW(getterDoor), ); void set_servo(int mode, int source){ @@ -177,7 +189,7 @@ void update_rfid() { CONSOLE_SERIAL.println("RFID tag stored"); rfid_store_tag = false; rfid_store_tag_nbr = 0; - zunoSendReport(3); + zunoSendReport(5); } else { // Check for match of RFID tag @@ -192,9 +204,20 @@ void update_rfid() { CONSOLE_SERIAL.println("RFID tag verified"); if (sensor_door_locked){ set_servo(SERVO_UNLOCK, SOURCE_RFID); + if (alarm_activate == true){ + alarm_activate = false; + alarm_waiting_for_confirmation = true; + zunoSendReport(3); + } } else{ set_servo(SERVO_LOCK, SOURCE_RFID); + if (alarm_pre_activate == ALARM_PRE_STAGE_ENABLED){ + alarm_pre_activate = ALARM_PRE_STAGE_DISABLED; + alarm_activate = true; + alarm_waiting_for_confirmation = true; + zunoSendReport(3); + } } break; } @@ -349,7 +372,7 @@ void loop() { rfid_eeprom_pos++; } rfid_store_tag_nbr = 0; - zunoSendReport(3); + zunoSendReport(5); } else{ set_servo(SERVO_LOCK, SOURCE_BUTTONS); @@ -363,6 +386,10 @@ void loop() { } else{ set_servo(SERVO_UNLOCK, SOURCE_BUTTONS); + if (sensor_door_locked == false){ + alarm_pre_activate = ALARM_PRE_STAGE_WAITING; + alarm_timestamp = current_timestamp + 2000; + } } btn_lock = false; btn_unlock = false; @@ -383,7 +410,7 @@ void loop() { // Check if sensor changed and report to Z-Wave if (sensor_door_closed_changed){ sensor_door_closed_changed = false; - zunoSendReport(4); + zunoSendReport(6); } // Check if servo needs to be centered or turned off @@ -397,12 +424,24 @@ void loop() { } } + // Check if pre Alarm should be enablede + if (alarm_pre_activate == ALARM_PRE_STAGE_WAITING) { + if (current_timestamp >= alarm_timestamp) { + if (sensor_door_locked_current_state == LOW){ + alarm_pre_activate = ALARM_PRE_STAGE_ENABLED; + } + else { + alarm_pre_activate = ALARM_PRE_STAGE_DISABLED; + } + } + } + // Check if store RFID has timed out if (rfid_store_tag_nbr > 0) { if (current_timestamp >= rfid_timeout_timestamp) { rfid_store_tag = false; rfid_store_tag_nbr = 0; - zunoSendReport(3); + zunoSendReport(6); } } @@ -444,6 +483,22 @@ void loop() { digitalWrite(LED_LOCK_PIN, HIGH); digitalWrite(LED_UNLOCK_PIN, HIGH); } + // Indicate that pre Alarm activation has been enabled + else if (alarm_pre_activate == 2){ + if (current_timestamp >= activity_timestamp) { + if (activity_flash == 0){ + digitalWrite(LED_LOCK_PIN, HIGH); + digitalWrite(LED_UNLOCK_PIN, HIGH); + activity_flash = 1; + } + else{ + digitalWrite(LED_LOCK_PIN, LOW); + digitalWrite(LED_UNLOCK_PIN, HIGH); + activity_flash = 0; + } + activity_timestamp = current_timestamp + 250; + } + } // Indicate that the lock/unlock is disabled else if (sensor_not_home_activated == true || lock_disable == true){ if (current_timestamp >= activity_timestamp) { @@ -515,6 +570,38 @@ byte getterLockDisable(void) { return lock_disable; } +void setterAlarmActivate(byte value) { + if (value == 0){ + alarm_activate = false; + } + else{ + alarm_activate = true; + } +} + +byte getterAlarmActivate(void) { + return alarm_activate; +} + +void setterAlarmConfirm(byte value) { + if (value == 0){ + alarm_confirmed = false; + if (alarm_activate == false){ + alarm_waiting_for_confirmation == false; + } + } + else{ + alarm_confirmed = true; + if (alarm_activate == true){ + alarm_waiting_for_confirmation == false; + } + } +} + +byte getterAlarmConfirm(void) { + return alarm_confirmed; +} + void setterStoreRFID(byte value) { if (rfid_store_tag_nbr == 0 && value > 0 && value < RFID_TAGS + 1){ rfid_store_tag_nbr = value;