View difference between Paste ID: uTvTmXze and hudeeH2W
SHOW: | | - or go back to the newest paste.
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
#define STATE_AMOUNT 5
8
9-
enum Stimuli {
9+
enum Stimuli 
10
{
11
	TurnOn,
12
	TurnOff,
13
	SpeedUp,
14
	SpeedDown
15
};
16-
enum State {
16+
17
enum State 
18
{
19
	Off,
20
	Stopped,
21
	Walking,
22
	Running,
23
	Error
24-
struct Transition {
24+
25-
	enum State prev_state;
25+
26-
	enum Stimuli stimulus;
26+
27-
	enum State next_state;
27+
28
29
struct FSM 
30
{
31
	enum State curr_state;
32-
struct FSM {
32+
	enum State ** transition_logic;
33
	const char* printable_stimuli[4];
34-
	transition ** transition_logic;
34+
35
};
36
37
void stimulate (struct FSM* fsm, enum Stimuli stimulus);
38
void print_transition (enum State previous, enum Stimuli stimulus, enum State newState, const char** printable_stimuli, const char** printable_states);
39
void initialize (struct FSM* fsm);
40-
void print_transition (const transition trans, const char** printable_stimuli, const char** printable_states);
40+
41
int main (void) 
42
{
43-
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-
	while (input != 4) {
51+
	{
52
		printf("Input stimulus: 0_On, 1_Off, 2_SpUp, 3_SpDn, 4_Exit \n");
53
		scanf("%i", &input);
54
55-
		if ((0 <= input) && (input < 4)){
55+
		if ((0 <= input) && (input < 4))
56
		{
57
			stimulate (&the_machine, input);
58
		}
59
	}
60
	
61
	return EXIT_SUCCESS;
62
	
63
}
64-
void stimulate(struct FSM* fsm, enum Stimuli stimulus) {
64+
65
void stimulate(struct FSM* fsm, enum Stimuli stimulus) 
66
{
67
68
	enum State previous;
69
70-
	(*fsm).curr_state = (((*fsm).transition_logic)[previous][stimulus]).next_state;
70+
71
72-
	print_transition (((*fsm).transition_logic)[previous][stimulus], (*fsm).printable_stimuli, (*fsm).printable_states);
72+
	(*fsm).curr_state = (((*fsm).transition_logic)[previous][stimulus]);
73
74
	print_transition (previous, stimulus, (*fsm).curr_state, (*fsm).printable_stimuli, (*fsm).printable_states);
75
76-
void print_transition (const transition trans, const char** printable_stimuli, const char** printable_states) {
76+
77
78
void print_transition (const enum State previous, const enum Stimuli stimulus, const enum State newState, const char** printable_stimuli, const char** printable_states) 
79-
	char stimulus[MAX_NAME_LENGTH];
79+
{
80
81
	char prev_state[MAX_NAME_LENGTH];
82-
	strncpy (prev_state, printable_states[trans.prev_state], MAX_NAME_LENGTH);
82+
	char received_stimulus[MAX_NAME_LENGTH];
83-
	strncpy (stimulus, printable_stimuli[trans.stimulus], MAX_NAME_LENGTH);
83+
84-
	strncpy (next_state, printable_states[trans.next_state], MAX_NAME_LENGTH);
84+
85
	strncpy (prev_state, printable_states[previous], MAX_NAME_LENGTH);
86-
	printf("[%s]---[%s]--->[%s]\n", prev_state, stimulus, next_state);
86+
	strncpy (received_stimulus, printable_stimuli[stimulus], MAX_NAME_LENGTH);
87
	strncpy (next_state, printable_states[newState], MAX_NAME_LENGTH);
88
89-
void initialize (struct FSM* fsm) {
89+
	printf("[%s]---[%s]--->[%s]\n", prev_state, received_stimulus, next_state);
90
}
91
92
void initialize (struct FSM* fsm) 
93
{
94
95-
	(*fsm).printable_stimuli[0] = "TurnOn";
95+
96-
	(*fsm).printable_stimuli[1] = "TurnOff";
96+
97-
	(*fsm).printable_stimuli[2] = "SpeedUp";
97+
98-
	(*fsm).printable_stimuli[3] = "SpeedDown";
98+
99
	(*fsm).printable_stimuli[TurnOn] = "TurnOn";
100-
	(*fsm).printable_states[0] = "Off";
100+
	(*fsm).printable_stimuli[TurnOff] = "TurnOff";
101-
	(*fsm).printable_states[1] = "Stopped";
101+
	(*fsm).printable_stimuli[SpeedUp] = "SpeedUp";
102-
	(*fsm).printable_states[2] = "Walking";
102+
	(*fsm).printable_stimuli[SpeedDown] = "SpeedDown";
103-
	(*fsm).printable_states[3] = "Running";
103+
104-
	(*fsm).printable_states[4] = "Error";
104+
	(*fsm).printable_states[Off] = "Off";
105
	(*fsm).printable_states[Stopped] = "Stopped";
106-
	(*fsm).transition_logic = (transition **) calloc (STATE_AMOUNT ,sizeof(transition*));
106+
	(*fsm).printable_states[Walking] = "Walking";
107
	(*fsm).printable_states[Running] = "Running";
108-
	for (i=0; i<STATE_AMOUNT; i++) {
108+
	(*fsm).printable_states[Error] = "Error";
109-
		(*fsm).transition_logic[i] = (transition *) calloc (STIMULI_AMOUNT ,sizeof(transition));
109+
110
	(*fsm).transition_logic = (enum State **) calloc (STATE_AMOUNT ,sizeof(enum State *));
111
112
	for (i=0; i<STATE_AMOUNT; i++) 
113
	{
114-
	(((*fsm).transition_logic)[0][0]).prev_state = Off;
114+
		(*fsm).transition_logic[i] = (enum State *) calloc (STIMULI_AMOUNT ,sizeof(enum State));
115-
	(((*fsm).transition_logic)[0][0]).stimulus = TurnOn;
115+
116-
	(((*fsm).transition_logic)[0][0]).next_state = Stopped;
116+
117
	/** OFF STATE */
118
	/* TURNON STIMULUS */
119-
	(((*fsm).transition_logic)[0][1]).prev_state = Off;
119+
	((*fsm).transition_logic)[Off][TurnOn] = Stopped;
120-
	(((*fsm).transition_logic)[0][1]).stimulus = TurnOff;
120+
121-
	(((*fsm).transition_logic)[0][1]).next_state = Off;
121+
122
	((*fsm).transition_logic)[Off][TurnOff] = Off;
123
124-
	(((*fsm).transition_logic)[0][2]).prev_state = Off;
124+
125-
	(((*fsm).transition_logic)[0][2]).stimulus = SpeedUp;
125+
	((*fsm).transition_logic)[Off][SpeedUp] = Error;
126-
	(((*fsm).transition_logic)[0][2]).next_state = Error;
126+
127
	/* SPEEDDOWN STIMULUS */
128
	((*fsm).transition_logic)[Off][SpeedDown] = Error;
129-
	(((*fsm).transition_logic)[0][3]).prev_state = Off;
129+
130-
	(((*fsm).transition_logic)[0][3]).stimulus = SpeedDown;
130+
131-
	(((*fsm).transition_logic)[0][3]).next_state = Error;
131+
132
	((*fsm).transition_logic)[Stopped][TurnOn] = Error;
133
134
	/* TURNOFF STIMULUS */
135-
	(((*fsm).transition_logic)[1][0]).prev_state = Stopped;
135+
	((*fsm).transition_logic)[Stopped][TurnOff] = Off;
136-
	(((*fsm).transition_logic)[1][0]).stimulus = TurnOn;
136+
137-
	(((*fsm).transition_logic)[1][0]).next_state = Error;
137+
138
	((*fsm).transition_logic)[Stopped][SpeedUp] = Walking;
139
140-
	(((*fsm).transition_logic)[1][1]).prev_state = Stopped;
140+
141-
	(((*fsm).transition_logic)[1][1]).stimulus = TurnOff;
141+
	((*fsm).transition_logic)[Stopped][SpeedDown] = Error;
142-
	(((*fsm).transition_logic)[1][1]).next_state = Off;
142+
143
	/** WALKING STATE */
144
	/* TURNON STIMULUS */
145-
	(((*fsm).transition_logic)[1][2]).prev_state = Stopped;
145+
	((*fsm).transition_logic)[Walking][TurnOn] = Walking;
146-
	(((*fsm).transition_logic)[1][2]).stimulus = SpeedUp;
146+
147-
	(((*fsm).transition_logic)[1][2]).next_state = Walking;
147+
148
	((*fsm).transition_logic)[Walking][TurnOff] = Off;
149
150-
	(((*fsm).transition_logic)[1][3]).prev_state = Stopped;
150+
151-
	(((*fsm).transition_logic)[1][3]).stimulus = SpeedDown;
151+
	((*fsm).transition_logic)[Walking][SpeedUp] = Running;
152-
	(((*fsm).transition_logic)[1][3]).next_state = Error;
152+
153
	/* SPEEDDOWN STIMULUS */
154
	((*fsm).transition_logic)[Walking][SpeedDown] = Stopped;
155
156-
	(((*fsm).transition_logic)[2][0]).prev_state = Walking;
156+
157-
	(((*fsm).transition_logic)[2][0]).stimulus = TurnOn;
157+
158-
	(((*fsm).transition_logic)[2][0]).next_state = Walking;
158+
	((*fsm).transition_logic)[Running][TurnOn] = Running;
159
160
	/* TURNOFF STIMULUS */
161-
	(((*fsm).transition_logic)[2][1]).prev_state = Walking;
161+
	((*fsm).transition_logic)[Running][TurnOff] = Off;
162-
	(((*fsm).transition_logic)[2][1]).stimulus = TurnOff;
162+
163-
	(((*fsm).transition_logic)[2][1]).next_state = Off;
163+
164
	((*fsm).transition_logic)[Running][SpeedUp] = Error;
165
166-
	(((*fsm).transition_logic)[2][2]).prev_state = Walking;
166+
167-
	(((*fsm).transition_logic)[2][2]).stimulus = SpeedUp;
167+
	((*fsm).transition_logic)[Running][SpeedDown] = Walking;
168-
	(((*fsm).transition_logic)[2][2]).next_state = Running;
168+
169
	/** ERROR STATE */
170
	/* TURNON STIMULUS */
171-
	(((*fsm).transition_logic)[2][3]).prev_state = Walking;
171+
	((*fsm).transition_logic)[Error][TurnOn] = Error;
172-
	(((*fsm).transition_logic)[2][3]).stimulus = SpeedDown;
172+
173-
	(((*fsm).transition_logic)[2][3]).next_state = Stopped;
173+
174
	((*fsm).transition_logic)[Error][TurnOff] = Off;
175
176
	/* SPEEDUP STIMULUS */
177-
	(((*fsm).transition_logic)[3][0]).prev_state = Running;
177+
	((*fsm).transition_logic)[Error][SpeedUp] = Error;
178-
	(((*fsm).transition_logic)[3][0]).stimulus = TurnOn;
178+
179-
	(((*fsm).transition_logic)[3][0]).next_state = Running;
179+
180
	((*fsm).transition_logic)[Error][SpeedDown] = Error;
181
182-
	(((*fsm).transition_logic)[3][1]).prev_state = Running;
182+