From 193ca1e6bd7ed404fbacc794c5ddc23cb38aed10 Mon Sep 17 00:00:00 2001 From: Lexzach Date: Thu, 21 Apr 2022 22:40:04 -0400 Subject: [PATCH] more --- facp/src/main.cpp | 193 ++++++++++++++++++++++++++++++++++++--------- facp/src/menus.txt | 5 +- 2 files changed, 160 insertions(+), 38 deletions(-) diff --git a/facp/src/main.cpp b/facp/src/main.cpp index 88d5b36..f7af8f3 100644 --- a/facp/src/main.cpp +++ b/facp/src/main.cpp @@ -5,11 +5,20 @@ //RUNTIME VARIABLES bool fullAlarm = false; //bool to control if this is a full alarm that requres a panel reset to clear +bool silenced = false; bool keyInserted = false; //if the control panel has a key inserted bool horn = false; //bool to control if the horns are active bool strobe = false; //bool to control if the strobes are active bool trouble = false; //bool to control if the panel is in trouble bool troubleAck = false; //bool to control if the trouble is acknowledged +bool configMenu = false; //determine if the control panel is in the configuration menu +bool resetPressed = false; +bool silencePressed = false; //make sure that presses don't count more than once +bool drillPressed = false; +bool resetStillPressed = false; +bool silenceStillPressed = false; //make sure that presses don't count more than once +bool drillStillPressed = false; +bool updateScreen = false; //updating the screen in the config menu int verification = 0; //number to keep track of ms for verification int drill = 0; //number to keep track of ms for drill int codeWheelTimer = 0; //code wheel timing variable @@ -17,12 +26,20 @@ int troubleLedTimer = 0; //number to keep track of ms for trouble light int alarmLedTimer = 0; //alarm led timer int troubleType = 0; //trouble type 0 - general, 1 - eol resistor int lcdUpdateTimer = 0; //update delay -int currentScreen = 0; //update display if previous screen is not the same +int currentScreen = -1; //update display if previous screen is not the same +String configTop; //configuration menu strings for lcd +String configBottom; +String currentConfigTop; //configuration menu strings for current lcd display +String currentConfigBottom; //CONFIG VARIABLES bool keyRequired = true; //determine if key switch is required to operate buttons bool isVerification = true; //is verification turned on bool eolResistor = true; //is the EOL resistor enabled +bool preAlarm = false; //use pre-alarm? +bool smokeDetectorPreAlarm = false; //should smoke detectors activate first stage +int smokeDetectorTimeout = 5; //how long should smoke detector pre-alarm wait before cancelling the pre-alarm +int firstStageTime = 1; //time in minutes that first stage should last int codeWheel = 0; //which alarm pattern to use, code-3 default int verificationTime = 2500; int resistorLenience = 0; @@ -56,16 +73,14 @@ void setup() { Serial.println("Initializing LCD..."); lcd.init(); //initialize LCD - lcd.clear(); lcd.backlight(); - lcd.setCursor(3,0); + lcd.clear(); + lcd.setCursor(4,0); lcd.print("Booting..."); Serial.println("Configured all pins"); - - EEPROM.begin(1025); //allocate memory address 0-1024 for EEPROM Serial.println("Configured EEPROM for addresses 0-1024"); @@ -96,7 +111,7 @@ void setup() { EEPROM.write(74,0); //pre-alarm disabled by default EEPROM.write(75,1); //pre-alarm first-stage is 1 minute by default EEPROM.write(76,0); //smoke detector pre-alarm is disable by default - EEPROM.write(77,1); //smoke detector timeout + EEPROM.write(77,5); //smoke detector timeout is five minutes by default EEPROM.write(78,0); //homescreen is panel name by default @@ -131,6 +146,18 @@ void setup() { } else { eolResistor = false; } + if (EEPROM.read(74) == 1){ + preAlarm = true; + } else { + preAlarm = false; + } + if (EEPROM.read(76) == 1){ + smokeDetectorPreAlarm = true; + } else { + smokeDetectorPreAlarm = false; + } + smokeDetectorTimeout = EEPROM.read(77)*60000; + firstStageTime = EEPROM.read(75)*60000; verificationTime = EEPROM.read(10)*100; resistorLenience = EEPROM.read(72); panelHomescreen = EEPROM.read(78); @@ -138,14 +165,13 @@ void setup() { if (EEPROM.read(i) != 0){ panelName = panelName + (char)EEPROM.read(i); } - Serial.println(panelName); } Serial.println("Config loaded"); digitalWrite(27, HIGH); //power on ready LED on startup digitalWrite(26, LOW); digitalWrite(25, LOW); - digitalWrite(14, LOW); //smoke relay + digitalWrite(14, LOW); //turn on smoke relay } void tone() { @@ -159,6 +185,17 @@ void noTone() { ledcWriteTone(0, 0); // stop tone } +void activateNAC(){ + horn = true; + strobe = true; + fullAlarm = true; + silenced = false; + configMenu = false; + tone(); + digitalWrite(25, HIGH); + digitalWrite(26, LOW); +} + void checkKey(){ if (digitalRead(33) == HIGH){ keyInserted = true; @@ -169,16 +206,13 @@ void checkKey(){ void checkDevices(){ - if (analogRead(15) <= resistorLenience and horn != true){ + if (analogRead(15) <= resistorLenience and horn != true and silenced==false){ verification++; } else { verification = 0; } if (verification == verificationTime or isVerification == false){ //activate the horns and strobes after verification - horn = true; - strobe = true; - fullAlarm = true; - tone(); + activateNAC(); } else if (analogRead(15) == 4095 and eolResistor == true) { trouble = true; troubleType=1; @@ -215,7 +249,7 @@ void troubleCheck(){ void checkButtons(){ if (digitalRead(32) == HIGH){ //RESET BUTTON lcd.clear(); - lcd.setCursor(0,0); + lcd.setCursor(2,0); lcd.print("Resetting..."); tone(); digitalWrite(27, HIGH); //ready LED @@ -226,6 +260,9 @@ void checkButtons(){ digitalWrite(14, HIGH); //smoke relay delay(2500); noTone(); + digitalWrite(27, LOW); //ready LED + digitalWrite(26, LOW); //silence LED + digitalWrite(25, LOW); //alarm LED ESP.restart(); } @@ -234,25 +271,29 @@ void checkButtons(){ digitalWrite(26, HIGH); digitalWrite(25, LOW); horn = false; - } else if (horn == false and strobe == true){ //if the horns are silenced and the button is pressed again, silence the buzzer + silenced=true; noTone(); - } else if (horn == false and strobe == false and trouble == true){ + } else if (horn == false and strobe == false and trouble == true and silencePressed == false and troubleAck==false){ troubleAck = true; noTone(); + } else if (horn == false and strobe == false and fullAlarm == false and silencePressed == false and configMenu == false){ + configMenu = true; } + silencePressed = true; + } else { + silencePressed = false; } if (digitalRead(34) == HIGH and horn != true){ //DRILL BUTTON if (drill == 2000){ - horn = true; - strobe = true; - fullAlarm = true; - tone(); + activateNAC(); } else { drill++; } + drillPressed = true; } else { drill = 0; + drillPressed = false; } } @@ -347,7 +388,7 @@ void alarm(){ digitalWrite(13, LOW); } else if (codeWheelTimer == 10000){ digitalWrite(13, HIGH); - } else if (codeWheelTimer == 5000){ + } else if (codeWheelTimer == 15000){ codeWheelTimer = -1; } @@ -356,11 +397,11 @@ void alarm(){ codeWheelTimer++; alarmLedTimer++; if (alarmLedTimer >= 750){ - if (digitalRead(25) == true){ - digitalWrite(25, LOW); + if (digitalRead(25) == false){ + digitalWrite(25, HIGH); alarmLedTimer = 0; } else { - digitalWrite(25, HIGH); + digitalWrite(25, LOW); alarmLedTimer = 0; } } @@ -371,7 +412,8 @@ void alarm(){ } void lcdUpdate(){ - if (trouble==false and fullAlarm==false and horn==false and strobe==false){ + if (trouble==false and fullAlarm==false and horn==false and strobe==false and currentScreen != 0){ + lcd.noAutoscroll(); lcd.clear(); lcd.setCursor(2,0); lcd.print("System Normal"); @@ -386,39 +428,118 @@ void lcdUpdate(){ if (troubleType == 0 and currentScreen != 1){ lcd.clear(); lcd.setCursor(1,0); - lcd.print("*** Trouble ***"); + lcd.print("* Trouble *"); lcd.setCursor(2,1); lcd.print("Unknown Trouble"); currentScreen = 1; } else if (troubleType == 1 and currentScreen != 2){ lcd.clear(); lcd.setCursor(1,0); - lcd.print("*** Trouble ***"); + lcd.print("* Trouble *"); lcd.setCursor(2,0); lcd.print("Device removed or EOL resistor not installed"); + lcd.autoscroll(); currentScreen = 2; - } else if (fullAlarm == true and currentScreen != 3){ - lcd.clear(); - lcd.setCursor(0,0); - lcd.print("*** FIRE ALARM ***"); - lcd.setCursor(2,1); - lcd.print("Zone 1"); - currentScreen = 3; } + } else if (fullAlarm == true and silenced == false and currentScreen != 3){ + lcd.clear(); + lcd.setCursor(1,0); + lcd.print("* FIRE ALARM *"); + // lcd.setCursor(2,1); + // lcd.print("Zone 1"); + currentScreen = 3; + } else if (silenced == true and currentScreen != 4){ + lcd.clear(); + lcd.setCursor(1,0); + lcd.print("* FIRE ALARM *"); + lcd.setCursor(1,1); + lcd.print("-- SILENCED --"); + // lcd.setCursor(2,1); + // lcd.print("Zone 1"); + currentScreen = 4; + } +} +void config(){ + char *main[] = {"Testing","Settings"}; + char *mainTesting[] = {"Walk Test","Silent Walk Test","Strobe Test","Automatic System Test"}; + char *mainSettings[] = {"Fire Alarm Settings","Panel Settings"}; + char *mainSettingsFireAlarmSettings[] = {"Coding: ","Verification Settings","Pre-Alarm Settings","Audible Silence: "}; + char *mainSettingsVerificationSettings[] = {"Verification: ","Verification Time: "}; + char *mainSettingsFireAlarmSettingsCoding[] = {"Temporal Three","Marchtime","4-4","Continuous","California","Slower Marchtime"}; + char *mainSettingsFireAlarmSettingsPreAlarmSettings[] = {"Pre-Alarm: ","First Stage Time: ","Smoke Detector Pre-Alarm Settings"}; + char *mainSettingsFireAlarmSettingsPreAlarmSettingsSmokeDetectorPreAlarmSettings[] = {"Smoke Detector Pre-Alarm: ","Smoke Detector Starts First Stage: ","Smoke Detector Timeout: "}; + char *mainPanelSettings[] = {"Panel Name","Panel Security: ","Homescreen","LCD Timeout: "}; + char *mainPanelSettingsPanelSecurity[] = {"None","Keyswitch","Passcode"}; + char *mainPanelSettingsHomescreen[] = {"Panel Name", "Stats for Nerds"}; + char *mainPanelSettingsHomescreenStatsForNerds[] = {"Zone Input Voltages"}; + if (digitalRead(32) == HIGH){ //RESET BUTTON + resetPressed = true; + } else { + resetPressed = false; + resetStillPressed = false; + } + if (digitalRead(35) == HIGH){ //SILENCE BUTTON + silencePressed = true; + } else { + silencePressed = false; + silenceStillPressed = false; + } + if (digitalRead(34) == HIGH){ //DRILL BUTTON + drillPressed = true; + } else { + drillPressed = false; + drillStillPressed = false; + } + + + configTop = (String)main[0]; + configBottom = (String)main[1]; + + // char buffer1[configTop.length()]; + // char buffer2[configBottom.length()]; + // configTop.toCharArray(buffer1,configTop.length()); + // configBottom.toCharArray(buffer2,configBottom.length()); + + + if (configTop != currentConfigTop or configBottom != currentConfigBottom){ + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("> " + configTop); + lcd.setCursor(0,1); + lcd.print(configBottom); + currentConfigTop = configTop; + currentConfigBottom = configBottom; + + } + + + + if (digitalRead(32) == HIGH){ //RESET BUTTON + resetStillPressed = true; + } + if (digitalRead(35) == HIGH){ //SILENCE BUTTON + silenceStillPressed = true; + } + if (digitalRead(34) == HIGH){ //DRILL BUTTON + drillStillPressed = true; } } void loop() { delay(1); checkKey(); //check to see if the key is inserted checkDevices(); //check pull stations and smoke detectors - if (keyInserted == true or keyRequired == false){ + if ((keyInserted == true or keyRequired == false) and configMenu == false){ checkButtons(); //check if certain buttons are pressed } troubleCheck(); //trouble check alarm(); //alarm codewheel - if (lcdUpdateTimer == 1000){ + if (configMenu==false){ lcdUpdate(); lcdUpdateTimer=0; + } else if (configMenu==true) { + if (keyInserted == true or keyRequired == false){ + config(); + } } else { lcdUpdateTimer++; } diff --git a/facp/src/menus.txt b/facp/src/menus.txt index d233c22..dc799be 100644 --- a/facp/src/menus.txt +++ b/facp/src/menus.txt @@ -1,7 +1,8 @@ [testing] - walk test +- silent walk test - strobe test -- full system test +- automatic system test [settings] - [fire alarm settings] - - [coding] @@ -23,7 +24,7 @@ - - - [smoke detector pre-alarm] - - - - enable/disable smoke detector pre-alarm - - - - [smoke detector timeout] -- - - - - 1-5 minutes +- - - - - 1-20 minutes - - enable/disable audible silence - [panel settings] - - [panel name]