Added alarm functionality

This commit is contained in:
Christoffer Martinsson 2018-02-21 16:34:21 +01:00
parent 58a57dceef
commit 0af39c6eb5

View File

@ -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;