hi all,
i am developing a project which consist of one MEGA2560 which acts as a master. it r(currently) receives four inputs : blinkr (pin 15), blinkl (pin 16), hazard (pin 19) and park (pin 17) - all are internally pulled up, set as digital inputs.
i drew a state machine chart for all possible states and poured it into code, however i cannot seem to understand how i tie the inputs to the machine...
i'd appreciate any guidance or help...
// define the events
enum class Event : int {
BLINKR_ON = 1,
BLINKR_OFF = 2,
BLINKL_ON = 3,
BLINKL_OFF = 4,
HAZARD_ON = 5,
HAZARD_OFF = 6,
PARK_ON = 7,
PARK_OFF = 8
};
// Define the states
enum class State : int {
idle = 1,
blinkr = 2,
blinkl = 3,
hazard = 4,
hazard_br = 5,
hazard_bl = 6,
park = 7,
park_br = 8,
park_bl = 9,
hazard_park = 10,
hazard_park_br = 11,
hazard_park_bl = 12
};
Event rd;
State currentState = State::idle;
const int pin_blinkR = 15; //set blink right LIGHT
int blinkR = 1;
const int pin_blinkL = 16; //set blink left LIGHT
int blinkL = 1;
const int pin_park = 17; //set blink left LIGHT
int Park = 1;
const int pin_hazard = 19; //set hazard LIGHT
int hazardPin = 1;
State machine(State state, Event evt) {
switch(state) {
case State::idle:
switch(evt) {
case Event::BLINKR_ON: return State::blinkr;
case Event::HAZARD_ON: return State::hazard;
case Event::BLINKL_ON: return State::blinkl;
case Event::PARK_ON: return State::park;
default: return state;
};
break;
case State::blinkr:
switch(evt) {
case Event::BLINKR_OFF: return State::idle;
case Event::HAZARD_ON: return State::hazard_br;
case Event::PARK_ON: return State::park_br;
default: return state;
};
break;
case State::blinkl:
switch(evt) {
case Event::BLINKL_OFF: return State::idle;
case Event::HAZARD_ON: return State::hazard_bl;
case Event::PARK_ON: return State::park_bl;
default: return state;
};
break;
case State::hazard:
switch(evt) {
case Event::HAZARD_OFF: return State::idle;
case Event::BLINKR_ON: return State::hazard_br;
case Event::BLINKL_ON: return State::hazard_bl;
case Event::PARK_ON: return State::hazard_park;
default: return state;
};
break;
case State::hazard_br:
switch(evt) {
case Event::BLINKR_OFF: return State::hazard;
case Event::HAZARD_OFF: return State::blinkr;
case Event::PARK_ON: return State::hazard_park_br;
default: return state;
};
break;
case State::hazard_bl:
switch(evt) {
case Event::BLINKL_OFF: return State::hazard;
case Event::HAZARD_OFF: return State::blinkl;
case Event::PARK_ON: return State::hazard_park_bl;
default: return state;
};
break;
case State::park:
switch(evt) {
case Event::HAZARD_ON: return State::hazard_park;
case Event::BLINKR_ON: return State::park_br;
case Event::BLINKL_ON: return State::park_bl;
case Event::PARK_OFF: return State::idle;
default: return state;
};
break;
case State::park_br:
switch(evt) {
case Event::BLINKR_OFF: return State::park;
case Event::HAZARD_ON: return State::hazard_park_br;
case Event::PARK_OFF: return State::blinkr;
default: return state;
};
break;
case State::park_bl:
switch(evt) {
case Event::BLINKL_OFF: return State::park;
case Event::HAZARD_ON: return State::hazard_park_bl;
case Event::PARK_OFF: return State::blinkl;
default: return state;
};
break;
case State::hazard_park:
switch(evt) {
case Event::HAZARD_OFF: return State::park;
case Event::BLINKR_ON: return State::hazard_park_br;
case Event::BLINKL_ON: return State::hazard_park_bl;
case Event::PARK_OFF: return State::hazard;
default: return state;
};
break;
case State::hazard_park_br:
switch(evt) {
case Event::HAZARD_OFF: return State::park_br;
case Event::BLINKR_OFF: return State::hazard_park;
case Event::PARK_OFF: return State::hazard_br;
default: return state;
};
break;
case State::hazard_park_bl:
switch(evt) {
case Event::HAZARD_OFF: return State::park_bl;
case Event::BLINKL_OFF: return State::hazard_park;
case Event::PARK_OFF: return State::hazard_bl;
default: return state;
};
break;
}
}
void receiveEvent() {
currentState = machine(currentState, rd);
// Print value of incoming data
//Serial.println(static_cast<int>(rd));
//Serial.println(hazardPin);
//Serial.println("-------");
//Serial.println(static_cast<int>(currentState));
}
void setup() {
Wire.begin();
pinMode(pin_blinkR, INPUT_PULLUP);
digitalWrite(pin_blinkR, HIGH); //set internal pull up resistor
pinMode(pin_blinkL, INPUT_PULLUP);
digitalWrite(pin_blinkL, HIGH); //set internal pull up resistor
pinMode(pin_park, INPUT_PULLUP);
digitalWrite(pin_park, HIGH); //set internal pull up resistor
pinMode(pin_hazard, INPUT_PULLUP);
digitalWrite(pin_hazard, HIGH); //set internal pull up resistor
currentState == State::idle;
Serial.begin(9600);
}
void loop() {
blinkR = digitalRead(pin_blinkR);
blinkL = digitalRead(pin_blinkL);
Park = digitalRead(pin_park);
hazardPin = digitalRead(pin_hazard);
Serial.println(static_cast<int>(currentState));
if (currentState == State::idle) { //idle = do nothig
}
if (currentState == State::blinkr) { //blink F+R right blinkers
}
if (currentState == State::blinkl){ //blink F+R left blinkers
}
if (currentState == State::hazard){ //blink F+R hazard mode
}
if (currentState == State::hazard_br){ //disable blink right and remember it, then blink all hazard
}
if (currentState == State::hazard_bl){ //disable blink left and remember it, then blink all hazard
}
if (currentState == State::park){ //turn on F+R parking lights
}
if (currentState == State::park_br){ //blink front right while park light is on, for rears send both blink right and turn on park light
}
if (currentState == State::park_bl){ //blink front left while park light is on, for rears send both blink left and turn on park light
}
if (currentState == State::hazard_park){ //for front blink hazard with park, for rears send both hazard and turn on park lights
}
if (currentState == State::hazard_park_br){ //for front blink hazard with park, for rears send send both hazard and turn on park lights
}
if (currentState == State::hazard_park_bl){ //for front blink hazard with park, for rears send send both hazard and turn on park lights
}
}