const int SA = 12;
const int SB = 14;
const int SC = 27;
const int SD = 26;
const int Rele = 19;
enum State
{
PosicionA,
PosicionB,
PosicionC,
PosicionD
};
enum Input
{
Unknown,
Reset,
Forward,
Backward,
PushButton
};
// Variables globales
State currentState;
Input currentInput;
// Acciones de los estados y condiciones de transiciones
void stateA()
{
///esto es MOORE
digitalWrite(SA, LOW);
if (currentInput == Input::PushButton){
changeState(State::PosicionB);
digitalWrite(Rele, HIGH);
}//END IF
}
void stateB()
{
digitalWrite(SB, LOW);
if (currentInput == Input::Backward){
changeState(State::PosicionA);
//salida MEALY
digitalWrite(Rele, LOW);
}
if (currentInput == Input::Forward)
changeState(State::PosicionC);
if (currentInput == Input::Reset)
changeState(State::PosicionA);
}
void stateC()
{
digitalWrite(SC, LOW);
if (currentInput == Input::Backward)
changeState(State::PosicionB);
if (currentInput == Input::Forward)
changeState(State::PosicionD);
if (currentInput == Input::Reset)
changeState(State::PosicionA);
}
void stateD()
{
digitalWrite(SD, LOW);
if (currentInput == Input::Backward)
changeState(State::PosicionC);
if (currentInput == Input::Reset)
changeState(State::PosicionA);
}
// Salidas asociadas a las transiciones
void outputA()
{
//MEALY
Serial.println("A B C D");
Serial.println("X ");
Serial.println();
}
void outputB()
{
Serial.println("A B C D");
Serial.println(" X ");
Serial.println();
}
void outputC()
{
Serial.println("A B C D");
Serial.println(" X ");
Serial.println();
}
void outputD()
{
Serial.println("A B C D");
Serial.println(" X");
Serial.println();
}
void setup()
{
Serial.begin(115200);
currentState = PosicionA;
outputA();
pinMode(SA, OUTPUT);
pinMode(SB, OUTPUT);
pinMode(SC, OUTPUT);
pinMode(SD, OUTPUT);
pinMode(Rele, OUTPUT);
digitalWrite(SA, HIGH);
digitalWrite(SB, HIGH);
digitalWrite(SC, HIGH);
digitalWrite(SD, HIGH);
digitalWrite(Rele, LOW);
}
void loop()
{
readInput();
updateStateMachine();
}
// Actualiza el estado de la maquina
void updateStateMachine()
{
switch (currentState)
{
case PosicionA: stateA(); break;
case PosicionB: stateB(); break;
case PosicionC: stateC(); break;
case PosicionD: stateD(); break;
}
}
// Lee la entrada por puerto serie
void readInput()
{
digitalWrite(SA, HIGH);
digitalWrite(SB, HIGH);
digitalWrite(SC, HIGH);
digitalWrite(SD, HIGH);
currentInput = Input::Unknown;
if (Serial.available())
{
char incomingChar = Serial.read();
switch (incomingChar)
{
case 'R': currentInput = Input::Reset; break;
case 'B': currentInput = Input::Backward; break;
case 'F': currentInput = Input::Forward; break;
case 'P': currentInput = Input::PushButton; break;
default: break;
}
}
}
// Funcion que cambia el estado y dispara las transiciones
void changeState(State newState)
{
currentState = newState;
switch (currentState)
{
case State::PosicionA: outputA(); break;
case State::PosicionB: outputB(); break;
case State::PosicionC: outputC(); break;
case State::PosicionD: outputD(); break;
default: break;
}
}