#include <util/delay.h>
#define UP false
#define CLOSE false
#define REVERSE false
#define DOWN true
#define OPEN true
#define FORWARD true
#define RESET 2 //
//Define Control Panel LED Pins
#define MOVEBOATLED 4 //
#define DRAINWATERLED 5 //
#define GATE1LED 6 //
#define GATE2LED 7 //
#define RETURNBACKLED 8 //
//Define Water LED panel
#define SECTION1 9 // pmw pins for fadeing panel
#define SECTION2 10 // pmw pins for fadeing panel
#define SECTION3 11 // pmw pins for fadeing panel
//Define Control Panel Button Pins
#define MOVEBOAT 22 //
#define DRAINWATER 23 //
#define GATE1 24 //
#define GATE2 25 //
#define RETURNBACK 26 //
//Define Limit Switch Pins
#define GATE1UP 27 //
#define GATE1DOWN 28 //
#define WATERUP 29 //
#define WATERDOWN 30 //
#define CATSTART 31 //
#define CATEND 32 //
#define BOATPOS1 33 //
#define BOATPOS2 34 //
#define BOATPOS3 35 //
#define BOATPOS4 36 //
#define GATE2AOPEN 37 //
#define GATE2ACLOSE 38 //
#define GATE2BOPEN 39 //
#define GATE2BCLOSE 40 //
#define REDLIGHT 45 //
#define GREENLIGHT 46 //
#define SIREN 47 //
//Define Control Pins
#define BOATPWR 48 //
#define BOATDIR 49 //
#define GATE1PWR 50 //
#define GATE1DIR 51 //
#define WATERPWR 52 //
#define WATERDIR 53 //
#define GATE2APWR 43 //
#define GATE2ADIR 44 //
#define GATE2BPWR 41 //
#define GATE2BDIR 3 //
unsigned long buttonPress = 0, loopStart = 0, temp = 0, temp2 = 0; //
int modelState = 0, i, state;
void setup(){
//Serial.begin(9600);
//Set up Control Panel LEDs
pinMode(MOVEBOATLED, OUTPUT);
digitalWrite(MOVEBOATLED, LOW);
pinMode(DRAINWATERLED, OUTPUT);
digitalWrite(DRAINWATERLED, LOW);
pinMode(GATE1LED, OUTPUT);
digitalWrite(GATE1LED, LOW);
pinMode(GATE2LED, OUTPUT);
digitalWrite(GATE2LED, LOW);
pinMode(RETURNBACKLED, OUTPUT);
digitalWrite(RETURNBACKLED, LOW);
//Set up Input pins for buttons on panels
pinMode(MOVEBOAT, INPUT);
digitalWrite(MOVEBOAT, HIGH);
pinMode(DRAINWATER, INPUT);
digitalWrite(DRAINWATER, HIGH);
pinMode(GATE1, INPUT);
digitalWrite(GATE1, HIGH);
pinMode(GATE2, INPUT);
digitalWrite(GATE2, HIGH);
pinMode(RETURNBACK, INPUT);
digitalWrite(RETURNBACK, HIGH);
//Set up Input pins for buttons on panels
pinMode(GATE1UP, INPUT);
digitalWrite(GATE1UP, HIGH);
pinMode(GATE1DOWN, INPUT);
digitalWrite(GATE1DOWN, HIGH);
pinMode(WATERUP, INPUT);
digitalWrite(WATERUP, HIGH);
pinMode(WATERDOWN, INPUT);
digitalWrite(WATERDOWN, HIGH);
pinMode(CATSTART, INPUT);
digitalWrite(CATSTART, HIGH);
pinMode(CATEND, INPUT);
digitalWrite(CATEND, HIGH);
pinMode(BOATPOS1, INPUT);
digitalWrite(BOATPOS1, HIGH);
pinMode(BOATPOS2, INPUT);
digitalWrite(BOATPOS2, HIGH);
pinMode(BOATPOS3, INPUT);
digitalWrite(BOATPOS3, HIGH);
pinMode(BOATPOS4, INPUT);
digitalWrite(BOATPOS4, HIGH);
pinMode(GATE2AOPEN, INPUT);
digitalWrite(GATE2AOPEN, HIGH);
pinMode(GATE2ACLOSE, INPUT);
digitalWrite(GATE2ACLOSE, HIGH);
pinMode(GATE2BOPEN, INPUT);
digitalWrite(GATE2BOPEN, HIGH);
pinMode(GATE2BCLOSE, INPUT);
digitalWrite(GATE2BCLOSE, HIGH);
//Set up LED Panels
pinMode(SECTION1, OUTPUT);
digitalWrite(SECTION1, LOW);
pinMode(SECTION2, OUTPUT);
digitalWrite(SECTION2, LOW);
pinMode(SECTION3, OUTPUT);
digitalWrite(SECTION3, LOW);
//Set up Siren and Lights
pinMode(REDLIGHT, OUTPUT);
digitalWrite(REDLIGHT, LOW);
pinMode(GREENLIGHT, OUTPUT);
digitalWrite(GREENLIGHT, LOW);
pinMode(SIREN, OUTPUT);
digitalWrite(SIREN, LOW);
//Set up Motor Control pins
pinMode(BOATPWR, OUTPUT);
digitalWrite(BOATPWR, LOW);
pinMode(BOATDIR, OUTPUT);
digitalWrite(BOATDIR, LOW);
pinMode(GATE1PWR, OUTPUT);
digitalWrite(GATE1PWR, LOW);
pinMode(GATE1DIR, OUTPUT);
digitalWrite(GATE1DIR, LOW);
pinMode(WATERPWR, OUTPUT);
digitalWrite(WATERPWR, LOW);
pinMode(WATERDIR, OUTPUT);
digitalWrite(WATERDIR, LOW);
pinMode(GATE2APWR, OUTPUT);
digitalWrite(GATE2APWR, LOW);
pinMode(GATE2ADIR, OUTPUT);
digitalWrite(GATE2ADIR, LOW);
pinMode(GATE2BPWR, OUTPUT);
digitalWrite(GATE2BPWR, LOW);
pinMode(GATE2BDIR, OUTPUT);
digitalWrite(GATE2BDIR, LOW);
digitalWrite(BOATPWR, LOW);
digitalWrite(GATE1PWR, LOW);
digitalWrite(WATERPWR, LOW);
digitalWrite(GATE2APWR, LOW);
digitalWrite(GATE2BPWR, LOW);
pinMode(RESET, OUTPUT);
digitalWrite(RESET, LOW);
setup_model();
buttonPress = millis();
}
void loop(){
modelState = modelStateFn();
setButtons();
_delay_ms(10);
if(digitalReadDebounce(MOVEBOAT)==LOW && (modelState == 0 || modelState == 3 || modelState == 7)){
MoveBoat(FORWARD);
buttonPress = millis();
}else if(digitalReadDebounce(DRAINWATER)==LOW && (modelState == 1 || modelState == 5)){
if(modelState == 1){
MoveWater(UP);
}else if(modelState == 5){
MoveWater(DOWN);
}
buttonPress = millis();
}else if(digitalReadDebounce(GATE1)==LOW && (modelState == 2 || modelState == 4)){
if(modelState == 2){
MoveGate1(DOWN);
}else if(modelState == 4){
MoveGate1(UP);
}
buttonPress = millis();
}else if(digitalReadDebounce(GATE2)==LOW && (modelState == 6 || modelState == 8)){
if(modelState == 6){
MoveGate2(OPEN);
}else if(modelState == 8){
MoveGate2(CLOSE);
}
buttonPress = millis();
}else if(digitalReadDebounce(RETURNBACK)==LOW){
buttons_off();
temp = millis();
while(digitalReadDebounce(RETURNBACK)==LOW){
_delay_us(1);
if((millis() - temp) >= 3000){
resetModel();
break;
}
}
Back();
}else{
if((millis() - buttonPress) > 30000){
if(modelState != 0){
digitalWrite(RESET, HIGH);
}
buttonPress = millis();
}
}
}
void MoveBoat(boolean forward_reverse){
loopStart = millis();
if(forward_reverse){
//Serial.print("BOAT FORWARD TO: ");
if(modelState == 0 && digitalReadDebounce(GATE1UP) == LOW){
//Serial.println("BOATPOS2");
digitalWrite(GREENLIGHT, HIGH);
while(digitalReadDebounce(BOATPOS2) == HIGH){
_delay_us(1);
digitalWrite(BOATDIR, HIGH);
digitalWrite(BOATPWR, HIGH);
digitalWrite(GATE1PWR, LOW);
digitalWrite(WATERPWR, LOW);
digitalWrite(GATE2APWR, LOW);
digitalWrite(GATE2BPWR, LOW);
if((millis() - loopStart || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW) > 60000){
digitalWrite(RESET, HIGH);
}
}
digitalWrite(BOATPWR, LOW);
digitalWrite(GREENLIGHT, LOW);
return;
}else if(modelState == 3 && digitalReadDebounce(WATERUP) == LOW){
//Serial.println("BOATPOS3");
siren();
digitalWrite(GREENLIGHT, HIGH);
while(digitalReadDebounce(BOATPOS3) == HIGH){
_delay_us(1);
digitalWrite(BOATDIR, HIGH);
digitalWrite(BOATPWR, HIGH);
digitalWrite(GATE1PWR, LOW);
digitalWrite(WATERPWR, LOW);
digitalWrite(GATE2APWR, LOW);
digitalWrite(GATE2BPWR, LOW);
if((millis() - loopStart) > 60000 || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW){
digitalWrite(RESET, HIGH);
}
}
digitalWrite(BOATPWR, LOW);
digitalWrite(GREENLIGHT, LOW);
return;
}else if(modelState == 7 && digitalReadDebounce(GATE2AOPEN) == LOW && digitalReadDebounce(GATE2BOPEN) == LOW){
//Serial.println("BOATPOS4 ");
digitalWrite(GREENLIGHT, HIGH);
while(digitalReadDebounce(BOATPOS4) == HIGH){
_delay_us(1);
digitalWrite(BOATDIR, HIGH);
digitalWrite(BOATPWR, HIGH);
digitalWrite(GATE1PWR, LOW);
digitalWrite(WATERPWR, LOW);
digitalWrite(GATE2APWR, LOW);
digitalWrite(GATE2BPWR, LOW);
if((millis() - loopStart) > 60000 || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW){
digitalWrite(RESET, HIGH);
}
}
digitalWrite(BOATPWR, LOW);
digitalWrite(GREENLIGHT, LOW);
return;
}
}else{
//Serial.print("BOAT BACK TO: ");
if(modelState == 1){
//Serial.println("BOATPOS1");
digitalWrite(GREENLIGHT, HIGH);
while(digitalReadDebounce(BOATPOS1) == HIGH){
_delay_us(1);
digitalWrite(BOATDIR, LOW);
digitalWrite(BOATPWR, HIGH);
digitalWrite(GATE1PWR, LOW);
digitalWrite(WATERPWR, LOW);
digitalWrite(GATE2APWR, LOW);
digitalWrite(GATE2BPWR, LOW);
if((millis() - loopStart) > 60000 || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW){
digitalWrite(RESET, HIGH);
}
}
digitalWrite(BOATPWR, LOW);
digitalWrite(GREENLIGHT, LOW);
return;
}else if(modelState == 4 && digitalReadDebounce(WATERUP) == LOW && digitalReadDebounce(GATE1DOWN) == LOW){
//Serial.println("BOATPOS2");
digitalWrite(GREENLIGHT, HIGH);
while(digitalReadDebounce(BOATPOS2) == HIGH){
_delay_us(1);
digitalWrite(BOATDIR, LOW);
digitalWrite(BOATPWR, HIGH);
digitalWrite(GATE1PWR, LOW);
digitalWrite(WATERPWR, LOW);
digitalWrite(GATE2APWR, LOW);
digitalWrite(GATE2BPWR, LOW);