#define ARM_1_INDICATOR 2
#define ARM_1_SWITCH 3
#define FIRE_1_RELAY 4
#define ARM_2_INDICATOR 5
#define ARM_2_SWITCH 6
#define FIRE_2_RELAY 7
#define FIRE_INDICATOR 12
#define FIRE_SWITCH 11
#define STATUS_INDICATOR 10
#define STATUS_NO_ARM_FIRE 3
int relayDelayPeriodMillis = 5000;
boolean is1Armed = false;
boolean is2Armed = false;
boolean isFire = false;
void setup() {
pinMode(ARM_1_INDICATOR, OUTPUT);
pinMode(ARM_1_SWITCH, INPUT_PULLUP);
pinMode(FIRE_1_RELAY, OUTPUT);
pinMode(ARM_2_INDICATOR, OUTPUT);
pinMode(ARM_2_SWITCH, INPUT_PULLUP);
pinMode(FIRE_2_RELAY, OUTPUT);
pinMode(FIRE_INDICATOR, OUTPUT);
pinMode(FIRE_SWITCH, INPUT_PULLUP);
pinMode(STATUS_INDICATOR, OUTPUT);
}
void loop() {
digitalWrite(STATUS_INDICATOR, HIGH);
is1Armed = digitalReadBooleanAfterPullup(ARM_1_SWITCH);
is2Armed = digitalReadBooleanAfterPullup(ARM_2_SWITCH);
isFire = digitalReadBooleanAfterPullup(FIRE_SWITCH);
if (is1Armed) {
digitalWrite(ARM_1_INDICATOR, HIGH);
} else {
digitalWrite(ARM_1_INDICATOR, LOW);
}
if (is2Armed) {
digitalWrite(ARM_2_INDICATOR, HIGH);
} else {
digitalWrite(ARM_2_INDICATOR, LOW);
}
if (isFire) {
fire(is1Armed, is2Armed);
} else {
haltFire();
}
}
void fire(boolean isFire1, boolean isFire2) {
if(!isFire1 && !isFire2){
displayStatus(STATUS_NO_ARM_FIRE);
return;
}
digitalWrite(FIRE_INDICATOR, HIGH);
if(isFire1){
digitalWrite(FIRE_1_RELAY, LOW);
}
if(isFire2){
digitalWrite(FIRE_2_RELAY, LOW);
}
delay(relayDelayPeriodMillis);
}
void haltFire(){
digitalWrite(FIRE_INDICATOR, LOW);
digitalWrite(FIRE_1_RELAY, HIGH);
digitalWrite(FIRE_2_RELAY, HIGH);
}
/*
* For some reason dealing with switch inputs as 'LOW'
* (due to needing to account for float inputs with INPUT_PULLUP)
* just breaks my brain. This flips and and returns a bool because this
* int stuff is for losers
*/
boolean digitalReadBooleanAfterPullup(int inputPin){
int rawVal = digitalRead(inputPin);
if(rawVal == LOW){
return true;
}
return false;
}
void displayStatus(int status){
for (int i=0; i < status; i++){
digitalWrite(STATUS_INDICATOR, HIGH);
delay(500);
digitalWrite(STATUS_INDICATOR, LOW);
delay(500);
}
}