Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define MAX_NAME_LENGTH 20
- #define STIMULI_AMOUNT 4
- enum Stimuli {
- TurnOn,
- TurnOff,
- SpeedUp,
- SpeedDown
- };
- enum State {
- Off,
- Stopped,
- Walking,
- Running,
- Error
- };
- struct Transition {
- enum State prev_state;
- enum Stimuli stimulus;
- enum State next_state;
- };
- typedef struct Transition transition;
- struct FSM {
- enum State curr_state;
- transition * transition_logic;
- const char* printable_stimuli[4];
- const char* printable_states[5];
- };
- void stimulate (struct FSM* fsm, enum Stimuli stimulus);
- void print_transition (const transition trans, const char** printable_stimuli, const char** printable_states);
- void initialize (struct FSM* fsm);
- int main (void) {
- int input;
- struct FSM the_machine;
- initialize (&the_machine);
- input = 0;
- while (input != 4) {
- printf("Input stimulus: 0_On, 1_Off, 2_SpUp, 3_SpDn, 4_Exit \n");
- scanf("%i", &input);
- if ((0 <= input) && (input < 4)){
- stimulate (&the_machine, input);
- }
- }
- return EXIT_SUCCESS;
- }
- void stimulate(struct FSM* fsm, enum Stimuli stimulus) {
- enum State previous;
- int index;
- previous = (*fsm).curr_state;
- index = previous*STIMULI_AMOUNT + stimulus;
- (*fsm).curr_state = (((*fsm).transition_logic)[index]).next_state;
- print_transition (((*fsm).transition_logic)[index], (*fsm).printable_stimuli, (*fsm).printable_states);
- }
- void print_transition (const transition trans, const char** printable_stimuli, const char** printable_states) {
- char prev_state[MAX_NAME_LENGTH];
- char stimulus[MAX_NAME_LENGTH];
- char next_state[MAX_NAME_LENGTH];
- strncpy (prev_state, printable_states[trans.prev_state], MAX_NAME_LENGTH);
- strncpy (stimulus, printable_stimuli[trans.stimulus], MAX_NAME_LENGTH);
- strncpy (next_state, printable_states[trans.next_state], MAX_NAME_LENGTH);
- printf("[%s]---[%s]--->[%s]\n", prev_state, stimulus, next_state);
- }
- void initialize (struct FSM* fsm) {
- (*fsm).curr_state = Off;
- (*fsm).printable_stimuli[0] = "TurnOn";
- (*fsm).printable_stimuli[1] = "TurnOff";
- (*fsm).printable_stimuli[2] = "SpeedUp";
- (*fsm).printable_stimuli[3] = "SpeedDown";
- (*fsm).printable_states[0] = "Off";
- (*fsm).printable_states[1] = "Stopped";
- (*fsm).printable_states[2] = "Walking";
- (*fsm).printable_states[3] = "Running";
- (*fsm).printable_states[4] = "Error";
- (*fsm).transition_logic = (transition *) calloc (20 ,sizeof(transition));
- /** OFF STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[0]).prev_state = Off;
- (((*fsm).transition_logic)[0]).stimulus = TurnOn;
- (((*fsm).transition_logic)[0]).next_state = Stopped;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[1]).prev_state = Off;
- (((*fsm).transition_logic)[1]).stimulus = TurnOff;
- (((*fsm).transition_logic)[1]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[2]).prev_state = Off;
- (((*fsm).transition_logic)[2]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[2]).next_state = Off;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[3]).prev_state = Off;
- (((*fsm).transition_logic)[3]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[3]).next_state = Off;
- /** STOPPED STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[4]).prev_state = Stopped;
- (((*fsm).transition_logic)[4]).stimulus = TurnOn;
- (((*fsm).transition_logic)[4]).next_state = Stopped;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[5]).prev_state = Stopped;
- (((*fsm).transition_logic)[5]).stimulus = TurnOff;
- (((*fsm).transition_logic)[5]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[6]).prev_state = Stopped;
- (((*fsm).transition_logic)[6]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[6]).next_state = Walking;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[7]).prev_state = Stopped;
- (((*fsm).transition_logic)[7]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[7]).next_state = Error;
- /** WALKING STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[8]).prev_state = Walking;
- (((*fsm).transition_logic)[8]).stimulus = TurnOn;
- (((*fsm).transition_logic)[8]).next_state = Walking;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[9]).prev_state = Walking;
- (((*fsm).transition_logic)[9]).stimulus = TurnOff;
- (((*fsm).transition_logic)[9]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[10]).prev_state = Walking;
- (((*fsm).transition_logic)[10]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[10]).next_state = Running;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[11]).prev_state = Walking;
- (((*fsm).transition_logic)[11]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[11]).next_state = Stopped;
- /** RUNNING STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[12]).prev_state = Running;
- (((*fsm).transition_logic)[12]).stimulus = TurnOn;
- (((*fsm).transition_logic)[12]).next_state = Running;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[13]).prev_state = Running;
- (((*fsm).transition_logic)[13]).stimulus = TurnOff;
- (((*fsm).transition_logic)[13]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[14]).prev_state = Running;
- (((*fsm).transition_logic)[14]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[14]).next_state = Error;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[15]).prev_state = Running;
- (((*fsm).transition_logic)[15]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[15]).next_state = Walking;
- /** ERROR STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[16]).prev_state = Error;
- (((*fsm).transition_logic)[16]).stimulus = TurnOn;
- (((*fsm).transition_logic)[16]).next_state = Error;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[17]).prev_state = Error;
- (((*fsm).transition_logic)[17]).stimulus = TurnOff;
- (((*fsm).transition_logic)[17]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[18]).prev_state = Error;
- (((*fsm).transition_logic)[18]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[18]).next_state = Error;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[19]).prev_state = Error;
- (((*fsm).transition_logic)[19]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[19]).next_state = Error;
- }
Add Comment
Please, Sign In to add comment