diff --git a/firmware/core/common.h b/firmware/core/common.h new file mode 100644 index 0000000..7f6cd83 --- /dev/null +++ b/firmware/core/common.h @@ -0,0 +1 @@ +void sendEventPacket(uint8_t eventType); diff --git a/firmware/core/core.ino b/firmware/core/core.ino index cffda0c..ecf8361 100644 --- a/firmware/core/core.ino +++ b/firmware/core/core.ino @@ -14,6 +14,7 @@ EthernetClient client; Door door; Alarm alarm; +Button button; void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers { @@ -44,6 +45,7 @@ pinMode(led, OUTPUT); door.Init(); alarm.Init(); + button.Init(); // Open serial communications and wait for port to open: Serial.begin(9600); @@ -131,7 +133,7 @@ { static unsigned long previousMillis = 0; unsigned long currentMillis = millis(); - if(currentMillis - previousMillis > 30){ + if(currentMillis - previousMillis > 30000){ previousMillis = currentMillis; Ethernet.maintain(); } @@ -140,9 +142,18 @@ void loop() { static uint8_t connect_retries = 0; + button.Check(); + if(door.UpdateState()){ alarm.On(); } + Button::Action a = button.LatestAction(); + if(a == Button::ActionPressed){ + sendEventPacket(DoorReleaseDidTriggered); + door.Open(); + }else if(a == Button::ActionLongPressed){ + alarm.Off(); + } if (!client.connected()) { digitalWrite(led, LOW); diff --git a/firmware/core/peripheral.cpp b/firmware/core/peripheral.cpp index cfa9fe7..12ac46b 100644 --- a/firmware/core/peripheral.cpp +++ b/firmware/core/peripheral.cpp @@ -79,3 +79,35 @@ sendEventPacket(_on ? AlarmDidOn : AlarmDidOff); } } + +void Button::Init() +{ + pinMode(buttonPin, INPUT); + digitalWrite(buttonPin, HIGH);//enable pull-up + lastState = digitalRead(buttonPin); + lastChanged = millis(); + latestAction = ActionNone; +} + +void Button::Check() +{ + unsigned long now = millis(); + uint8_t val = digitalRead(buttonPin); + if((val^lastState) && now > lastChanged){ + lastChanged = now; + lastState = val; + if(val == LOW){ //key down + pressTime = now; + Serial.println("Button down"); + }else{ //key up + if(now - pressTime > LongPressThreshold){ + latestAction = ActionLongPressed; + }else{ + latestAction = ActionPressed; + } + Serial.println("Button up"); + } + } +} + + diff --git a/firmware/core/peripheral.h b/firmware/core/peripheral.h index e589777..30f6ad4 100644 --- a/firmware/core/peripheral.h +++ b/firmware/core/peripheral.h @@ -8,6 +8,7 @@ #define alarmPin 6 #define DetectorSwitchDelay 80 +#define LongPressThreshold 3000 class Door { @@ -44,4 +45,25 @@ } }; +class Button +{ +public: + enum Action + { + ActionNone, ActionPressed, ActionLongPressed + }; +private: + unsigned long lastChanged, pressTime; + unsigned char lastState; + Action latestAction; +public: + void Init(); + Action LatestAction(){ + Action t = latestAction; + latestAction = ActionNone; + return t; + } + void Check(); +}; + #endif