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
- #define STATE_AMOUNT 5
- 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;
- previous = (*fsm).curr_state;
- (*fsm).curr_state = (((*fsm).transition_logic)[previous][stimulus]).next_state;
- print_transition (((*fsm).transition_logic)[previous][stimulus], (*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) {
- int i;
- (*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 (STATE_AMOUNT ,sizeof(transition*));
- for (i=0; i<STATE_AMOUNT; i++) {
- (*fsm).transition_logic[i] = (transition *) calloc (STIMULI_AMOUNT ,sizeof(transition));
- }
- /** OFF STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[0][0]).prev_state = Off;
- (((*fsm).transition_logic)[0][0]).stimulus = TurnOn;
- (((*fsm).transition_logic)[0][0]).next_state = Stopped;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[0][1]).prev_state = Off;
- (((*fsm).transition_logic)[0][1]).stimulus = TurnOff;
- (((*fsm).transition_logic)[0][1]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[0][2]).prev_state = Off;
- (((*fsm).transition_logic)[0][2]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[0][2]).next_state = Off;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[0][3]).prev_state = Off;
- (((*fsm).transition_logic)[0][3]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[0][3]).next_state = Off;
- /** STOPPED STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[1][0]).prev_state = Stopped;
- (((*fsm).transition_logic)[1][0]).stimulus = TurnOn;
- (((*fsm).transition_logic)[1][0]).next_state = Stopped;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[1][1]).prev_state = Stopped;
- (((*fsm).transition_logic)[1][1]).stimulus = TurnOff;
- (((*fsm).transition_logic)[1][1]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[1][2]).prev_state = Stopped;
- (((*fsm).transition_logic)[1][2]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[1][2]).next_state = Walking;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[1][3]).prev_state = Stopped;
- (((*fsm).transition_logic)[1][3]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[1][3]).next_state = Error;
- /** WALKING STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[2][0]).prev_state = Walking;
- (((*fsm).transition_logic)[2][0]).stimulus = TurnOn;
- (((*fsm).transition_logic)[2][0]).next_state = Walking;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[2][1]).prev_state = Walking;
- (((*fsm).transition_logic)[2][1]).stimulus = TurnOff;
- (((*fsm).transition_logic)[2][1]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[2][2]).prev_state = Walking;
- (((*fsm).transition_logic)[2][2]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[2][2]).next_state = Running;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[2][3]).prev_state = Walking;
- (((*fsm).transition_logic)[2][3]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[2][3]).next_state = Stopped;
- /** RUNNING STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[3][0]).prev_state = Running;
- (((*fsm).transition_logic)[3][0]).stimulus = TurnOn;
- (((*fsm).transition_logic)[3][0]).next_state = Running;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[3][1]).prev_state = Running;
- (((*fsm).transition_logic)[3][1]).stimulus = TurnOff;
- (((*fsm).transition_logic)[3][1]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[3][2]).prev_state = Running;
- (((*fsm).transition_logic)[3][2]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[3][2]).next_state = Error;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[3][3]).prev_state = Running;
- (((*fsm).transition_logic)[3][3]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[3][3]).next_state = Walking;
- /** ERROR STATE */
- /* TURNON STIMULUS */
- (((*fsm).transition_logic)[4][0]).prev_state = Error;
- (((*fsm).transition_logic)[4][0]).stimulus = TurnOn;
- (((*fsm).transition_logic)[4][0]).next_state = Error;
- /* TURNOFF STIMULUS */
- (((*fsm).transition_logic)[4][1]).prev_state = Error;
- (((*fsm).transition_logic)[4][1]).stimulus = TurnOff;
- (((*fsm).transition_logic)[4][1]).next_state = Off;
- /* SPEEDUP STIMULUS */
- (((*fsm).transition_logic)[4][2]).prev_state = Error;
- (((*fsm).transition_logic)[4][2]).stimulus = SpeedUp;
- (((*fsm).transition_logic)[4][2]).next_state = Error;
- /* SPEEDDOWN STIMULUS */
- (((*fsm).transition_logic)[4][3]).prev_state = Error;
- (((*fsm).transition_logic)[4][3]).stimulus = SpeedDown;
- (((*fsm).transition_logic)[4][3]).next_state = Error;
- }
Add Comment
Please, Sign In to add comment