pabloliva87

Ej6C

Feb 1st, 2012
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.25 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define MAX_NAME_LENGTH 20
  6. #define STIMULI_AMOUNT 4
  7.  
  8. enum Stimuli {
  9.     TurnOn,
  10.     TurnOff,
  11.     SpeedUp,
  12.     SpeedDown
  13. };
  14.  
  15. enum State {
  16.     Off,
  17.     Stopped,
  18.     Walking,
  19.     Running,
  20.     Error
  21. };
  22.  
  23. struct Transition {
  24.     enum State prev_state;
  25.     enum Stimuli stimulus;
  26.     enum State next_state;
  27. };
  28.  
  29. typedef struct Transition transition;
  30.  
  31. struct FSM {
  32.     enum State curr_state;
  33.     transition * transition_logic;
  34.     const char* printable_stimuli[4];
  35.     const char* printable_states[5];
  36. };
  37.  
  38. void stimulate (struct FSM* fsm, enum Stimuli stimulus);
  39. void print_transition (const transition trans, const char** printable_stimuli, const char** printable_states);
  40. void initialize (struct FSM* fsm);
  41.  
  42. int main (void) {
  43.    
  44.     int input;
  45.     struct FSM the_machine;
  46.    
  47.     initialize (&the_machine);
  48.     input = 0;
  49.    
  50.     while (input != 4) {
  51.         printf("Input stimulus: 0_On, 1_Off, 2_SpUp, 3_SpDn, 4_Exit \n");
  52.         scanf("%i", &input);
  53.  
  54.         if ((0 <= input) && (input < 4)){
  55.             stimulate (&the_machine, input);
  56.         }
  57.     }
  58.    
  59.     return EXIT_SUCCESS;
  60.    
  61. }
  62.  
  63. void stimulate(struct FSM* fsm, enum Stimuli stimulus) {
  64.  
  65.     enum State previous;
  66.     int index;
  67.  
  68.     previous = (*fsm).curr_state;
  69.     index = previous*STIMULI_AMOUNT + stimulus;
  70.  
  71.     (*fsm).curr_state = (((*fsm).transition_logic)[index]).next_state;
  72.  
  73.     print_transition (((*fsm).transition_logic)[index], (*fsm).printable_stimuli, (*fsm).printable_states);
  74.  
  75. }
  76.  
  77. void print_transition (const transition trans, const char** printable_stimuli, const char** printable_states) {
  78.  
  79.     char prev_state[MAX_NAME_LENGTH];
  80.     char stimulus[MAX_NAME_LENGTH];
  81.     char next_state[MAX_NAME_LENGTH];
  82.  
  83.     strncpy (prev_state, printable_states[trans.prev_state], MAX_NAME_LENGTH);
  84.     strncpy (stimulus, printable_stimuli[trans.stimulus], MAX_NAME_LENGTH);
  85.     strncpy (next_state, printable_states[trans.next_state], MAX_NAME_LENGTH);
  86.  
  87.     printf("[%s]---[%s]--->[%s]\n", prev_state, stimulus, next_state);
  88. }
  89.  
  90. void initialize (struct FSM* fsm) {
  91.  
  92.     (*fsm).curr_state = Off;
  93.  
  94.     (*fsm).printable_stimuli[0] = "TurnOn";
  95.     (*fsm).printable_stimuli[1] = "TurnOff";
  96.     (*fsm).printable_stimuli[2] = "SpeedUp";
  97.     (*fsm).printable_stimuli[3] = "SpeedDown";
  98.  
  99.     (*fsm).printable_states[0] = "Off";
  100.     (*fsm).printable_states[1] = "Stopped";
  101.     (*fsm).printable_states[2] = "Walking";
  102.     (*fsm).printable_states[3] = "Running";
  103.     (*fsm).printable_states[4] = "Error";
  104.    
  105.     (*fsm).transition_logic = (transition *) calloc (20 ,sizeof(transition));
  106.  
  107.     /** OFF STATE */
  108.     /* TURNON STIMULUS */
  109.     (((*fsm).transition_logic)[0]).prev_state = Off;
  110.     (((*fsm).transition_logic)[0]).stimulus = TurnOn;
  111.     (((*fsm).transition_logic)[0]).next_state = Stopped;
  112.  
  113.     /* TURNOFF STIMULUS */
  114.     (((*fsm).transition_logic)[1]).prev_state = Off;
  115.     (((*fsm).transition_logic)[1]).stimulus = TurnOff;
  116.     (((*fsm).transition_logic)[1]).next_state = Off;
  117.  
  118.     /* SPEEDUP STIMULUS */
  119.     (((*fsm).transition_logic)[2]).prev_state = Off;
  120.     (((*fsm).transition_logic)[2]).stimulus = SpeedUp;
  121.     (((*fsm).transition_logic)[2]).next_state = Off;
  122.  
  123.     /* SPEEDDOWN STIMULUS */
  124.     (((*fsm).transition_logic)[3]).prev_state = Off;
  125.     (((*fsm).transition_logic)[3]).stimulus = SpeedDown;
  126.     (((*fsm).transition_logic)[3]).next_state = Off;
  127.  
  128.     /** STOPPED STATE */
  129.     /* TURNON STIMULUS */
  130.     (((*fsm).transition_logic)[4]).prev_state = Stopped;
  131.     (((*fsm).transition_logic)[4]).stimulus = TurnOn;
  132.     (((*fsm).transition_logic)[4]).next_state = Stopped;
  133.  
  134.     /* TURNOFF STIMULUS */
  135.     (((*fsm).transition_logic)[5]).prev_state = Stopped;
  136.     (((*fsm).transition_logic)[5]).stimulus = TurnOff;
  137.     (((*fsm).transition_logic)[5]).next_state = Off;
  138.  
  139.     /* SPEEDUP STIMULUS */
  140.     (((*fsm).transition_logic)[6]).prev_state = Stopped;
  141.     (((*fsm).transition_logic)[6]).stimulus = SpeedUp;
  142.     (((*fsm).transition_logic)[6]).next_state = Walking;
  143.  
  144.     /* SPEEDDOWN STIMULUS */
  145.     (((*fsm).transition_logic)[7]).prev_state = Stopped;
  146.     (((*fsm).transition_logic)[7]).stimulus = SpeedDown;
  147.     (((*fsm).transition_logic)[7]).next_state = Error;
  148.  
  149.     /** WALKING STATE */
  150.     /* TURNON STIMULUS */
  151.     (((*fsm).transition_logic)[8]).prev_state = Walking;
  152.     (((*fsm).transition_logic)[8]).stimulus = TurnOn;
  153.     (((*fsm).transition_logic)[8]).next_state = Walking;
  154.  
  155.     /* TURNOFF STIMULUS */
  156.     (((*fsm).transition_logic)[9]).prev_state = Walking;
  157.     (((*fsm).transition_logic)[9]).stimulus = TurnOff;
  158.     (((*fsm).transition_logic)[9]).next_state = Off;
  159.  
  160.     /* SPEEDUP STIMULUS */
  161.     (((*fsm).transition_logic)[10]).prev_state = Walking;
  162.     (((*fsm).transition_logic)[10]).stimulus = SpeedUp;
  163.     (((*fsm).transition_logic)[10]).next_state = Running;
  164.  
  165.     /* SPEEDDOWN STIMULUS */
  166.     (((*fsm).transition_logic)[11]).prev_state = Walking;
  167.     (((*fsm).transition_logic)[11]).stimulus = SpeedDown;
  168.     (((*fsm).transition_logic)[11]).next_state = Stopped;
  169.  
  170.     /** RUNNING STATE */
  171.     /* TURNON STIMULUS */
  172.     (((*fsm).transition_logic)[12]).prev_state = Running;
  173.     (((*fsm).transition_logic)[12]).stimulus = TurnOn;
  174.     (((*fsm).transition_logic)[12]).next_state = Running;
  175.  
  176.     /* TURNOFF STIMULUS */
  177.     (((*fsm).transition_logic)[13]).prev_state = Running;
  178.     (((*fsm).transition_logic)[13]).stimulus = TurnOff;
  179.     (((*fsm).transition_logic)[13]).next_state = Off;
  180.  
  181.     /* SPEEDUP STIMULUS */
  182.     (((*fsm).transition_logic)[14]).prev_state = Running;
  183.     (((*fsm).transition_logic)[14]).stimulus = SpeedUp;
  184.     (((*fsm).transition_logic)[14]).next_state = Error;
  185.  
  186.     /* SPEEDDOWN STIMULUS */
  187.     (((*fsm).transition_logic)[15]).prev_state = Running;
  188.     (((*fsm).transition_logic)[15]).stimulus = SpeedDown;
  189.     (((*fsm).transition_logic)[15]).next_state = Walking;
  190.  
  191.     /** ERROR STATE */
  192.     /* TURNON STIMULUS */
  193.     (((*fsm).transition_logic)[16]).prev_state = Error;
  194.     (((*fsm).transition_logic)[16]).stimulus = TurnOn;
  195.     (((*fsm).transition_logic)[16]).next_state = Error;
  196.  
  197.     /* TURNOFF STIMULUS */
  198.     (((*fsm).transition_logic)[17]).prev_state = Error;
  199.     (((*fsm).transition_logic)[17]).stimulus = TurnOff;
  200.     (((*fsm).transition_logic)[17]).next_state = Off;
  201.  
  202.     /* SPEEDUP STIMULUS */
  203.     (((*fsm).transition_logic)[18]).prev_state = Error;
  204.     (((*fsm).transition_logic)[18]).stimulus = SpeedUp;
  205.     (((*fsm).transition_logic)[18]).next_state = Error;
  206.  
  207.     /* SPEEDDOWN STIMULUS */
  208.     (((*fsm).transition_logic)[19]).prev_state = Error;
  209.     (((*fsm).transition_logic)[19]).stimulus = SpeedDown;
  210.     (((*fsm).transition_logic)[19]).next_state = Error;
  211.  
  212. }
Add Comment
Please, Sign In to add comment