up down counter fsm

Dependencies:   C12832_lcd

Committer:
jasonberry
Date:
Sun Oct 11 22:51:20 2020 +0000
Revision:
0:8964cd6e2cd3
up down counter with fsm and ipc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jasonberry 0:8964cd6e2cd3 1 #include "mbed.h"
jasonberry 0:8964cd6e2cd3 2 #include "rtos.h"
jasonberry 0:8964cd6e2cd3 3 #include "C12832_lcd.h"
jasonberry 0:8964cd6e2cd3 4
jasonberry 0:8964cd6e2cd3 5 //FINITE STATE MACHINE EVENTS
jasonberry 0:8964cd6e2cd3 6 #define NO_EVENT 0
jasonberry 0:8964cd6e2cd3 7 #define TIME_OUT 1
jasonberry 0:8964cd6e2cd3 8 #define BUTTON_PRESS 2
jasonberry 0:8964cd6e2cd3 9
jasonberry 0:8964cd6e2cd3 10 //STATES
jasonberry 0:8964cd6e2cd3 11 #define STATE_0 0
jasonberry 0:8964cd6e2cd3 12 #define STATE_1 1
jasonberry 0:8964cd6e2cd3 13 #define STATE_2 2
jasonberry 0:8964cd6e2cd3 14 #define STATE_3 3
jasonberry 0:8964cd6e2cd3 15 #define STATE_4 4
jasonberry 0:8964cd6e2cd3 16 #define STATE_5 5
jasonberry 0:8964cd6e2cd3 17
jasonberry 0:8964cd6e2cd3 18
jasonberry 0:8964cd6e2cd3 19
jasonberry 0:8964cd6e2cd3 20 //pass event via message queue
jasonberry 0:8964cd6e2cd3 21 typedef struct {
jasonberry 0:8964cd6e2cd3 22 int event; /* AD result of measured voltage */
jasonberry 0:8964cd6e2cd3 23 } message_t;
jasonberry 0:8964cd6e2cd3 24
jasonberry 0:8964cd6e2cd3 25 MemoryPool<message_t, 16> mpool;
jasonberry 0:8964cd6e2cd3 26 Queue<message_t, 16> queue;
jasonberry 0:8964cd6e2cd3 27
jasonberry 0:8964cd6e2cd3 28 //button plus local display
jasonberry 0:8964cd6e2cd3 29 DigitalIn fire(p14);
jasonberry 0:8964cd6e2cd3 30 C12832_LCD lcd; //On board LCD display
jasonberry 0:8964cd6e2cd3 31
jasonberry 0:8964cd6e2cd3 32 //leds for debug
jasonberry 0:8964cd6e2cd3 33 DigitalOut led(LED1); //button press
jasonberry 0:8964cd6e2cd3 34 DigitalOut led2(LED2); //fsm thread
jasonberry 0:8964cd6e2cd3 35 DigitalOut led3(LED3);
jasonberry 0:8964cd6e2cd3 36 DigitalOut led4(LED4); //timeout thread
jasonberry 0:8964cd6e2cd3 37
jasonberry 0:8964cd6e2cd3 38
jasonberry 0:8964cd6e2cd3 39
jasonberry 0:8964cd6e2cd3 40 void timeout_event(void const *n)
jasonberry 0:8964cd6e2cd3 41 {
jasonberry 0:8964cd6e2cd3 42 //generate local display info
jasonberry 0:8964cd6e2cd3 43 lcd.cls();
jasonberry 0:8964cd6e2cd3 44 lcd.locate(40,5);
jasonberry 0:8964cd6e2cd3 45 lcd.printf("timeout event");
jasonberry 0:8964cd6e2cd3 46
jasonberry 0:8964cd6e2cd3 47
jasonberry 0:8964cd6e2cd3 48 //event via a message queue
jasonberry 0:8964cd6e2cd3 49 message_t *message = mpool.alloc();
jasonberry 0:8964cd6e2cd3 50 message->event = TIME_OUT;
jasonberry 0:8964cd6e2cd3 51 queue.put(message);
jasonberry 0:8964cd6e2cd3 52
jasonberry 0:8964cd6e2cd3 53 led4 = !led4;
jasonberry 0:8964cd6e2cd3 54
jasonberry 0:8964cd6e2cd3 55 }
jasonberry 0:8964cd6e2cd3 56
jasonberry 0:8964cd6e2cd3 57
jasonberry 0:8964cd6e2cd3 58 void button_event_thread(void const *argument) {
jasonberry 0:8964cd6e2cd3 59 while (true) {
jasonberry 0:8964cd6e2cd3 60
jasonberry 0:8964cd6e2cd3 61 //debouce delay for switch
jasonberry 0:8964cd6e2cd3 62 Thread::wait(250);
jasonberry 0:8964cd6e2cd3 63
jasonberry 0:8964cd6e2cd3 64 if (fire)
jasonberry 0:8964cd6e2cd3 65 {
jasonberry 0:8964cd6e2cd3 66
jasonberry 0:8964cd6e2cd3 67 lcd.cls();
jasonberry 0:8964cd6e2cd3 68 lcd.locate(0,1);
jasonberry 0:8964cd6e2cd3 69 lcd.printf("button event");
jasonberry 0:8964cd6e2cd3 70
jasonberry 0:8964cd6e2cd3 71
jasonberry 0:8964cd6e2cd3 72 //event via a message queue
jasonberry 0:8964cd6e2cd3 73 message_t *message = mpool.alloc();
jasonberry 0:8964cd6e2cd3 74 message->event = BUTTON_PRESS;
jasonberry 0:8964cd6e2cd3 75 queue.put(message);
jasonberry 0:8964cd6e2cd3 76
jasonberry 0:8964cd6e2cd3 77 led = !led;
jasonberry 0:8964cd6e2cd3 78 }
jasonberry 0:8964cd6e2cd3 79 }
jasonberry 0:8964cd6e2cd3 80 }
jasonberry 0:8964cd6e2cd3 81
jasonberry 0:8964cd6e2cd3 82
jasonberry 0:8964cd6e2cd3 83 int main (void) {
jasonberry 0:8964cd6e2cd3 84
jasonberry 0:8964cd6e2cd3 85 //Thread fsm(fsm_thread);
jasonberry 0:8964cd6e2cd3 86 Thread button_event(button_event_thread);
jasonberry 0:8964cd6e2cd3 87 RtosTimer timer(timeout_event, osTimerPeriodic, (void *)0);
jasonberry 0:8964cd6e2cd3 88
jasonberry 0:8964cd6e2cd3 89 int state = STATE_0;
jasonberry 0:8964cd6e2cd3 90
jasonberry 0:8964cd6e2cd3 91
jasonberry 0:8964cd6e2cd3 92 //start timer with a 2 sec timeout
jasonberry 0:8964cd6e2cd3 93 timer.start(2000);
jasonberry 0:8964cd6e2cd3 94
jasonberry 0:8964cd6e2cd3 95 while (true) {
jasonberry 0:8964cd6e2cd3 96 switch(state)
jasonberry 0:8964cd6e2cd3 97 {
jasonberry 0:8964cd6e2cd3 98 case STATE_0:
jasonberry 0:8964cd6e2cd3 99 lcd.cls();
jasonberry 0:8964cd6e2cd3 100 lcd.locate(0,2);
jasonberry 0:8964cd6e2cd3 101 lcd.printf("FSM START");
jasonberry 0:8964cd6e2cd3 102
jasonberry 0:8964cd6e2cd3 103 osEvent evt = queue.get();
jasonberry 0:8964cd6e2cd3 104 if (evt.status == osEventMessage)
jasonberry 0:8964cd6e2cd3 105 {
jasonberry 0:8964cd6e2cd3 106 message_t *message = (message_t*)evt.value.p;
jasonberry 0:8964cd6e2cd3 107
jasonberry 0:8964cd6e2cd3 108
jasonberry 0:8964cd6e2cd3 109 if(message->event == BUTTON_PRESS) state = STATE_1;
jasonberry 0:8964cd6e2cd3 110 if(message->event == TIME_OUT) state = STATE_0;
jasonberry 0:8964cd6e2cd3 111
jasonberry 0:8964cd6e2cd3 112 mpool.free(message);
jasonberry 0:8964cd6e2cd3 113 }
jasonberry 0:8964cd6e2cd3 114
jasonberry 0:8964cd6e2cd3 115 timer.start(2000);
jasonberry 0:8964cd6e2cd3 116
jasonberry 0:8964cd6e2cd3 117 break;
jasonberry 0:8964cd6e2cd3 118
jasonberry 0:8964cd6e2cd3 119 case STATE_1:
jasonberry 0:8964cd6e2cd3 120 lcd.cls();
jasonberry 0:8964cd6e2cd3 121 lcd.locate(0,2);
jasonberry 0:8964cd6e2cd3 122 lcd.printf("FSM COUNTER 1");
jasonberry 0:8964cd6e2cd3 123
jasonberry 0:8964cd6e2cd3 124 evt = queue.get();
jasonberry 0:8964cd6e2cd3 125 if (evt.status == osEventMessage)
jasonberry 0:8964cd6e2cd3 126 {
jasonberry 0:8964cd6e2cd3 127 message_t *message = (message_t*)evt.value.p;
jasonberry 0:8964cd6e2cd3 128
jasonberry 0:8964cd6e2cd3 129
jasonberry 0:8964cd6e2cd3 130 if(message->event == BUTTON_PRESS) state = STATE_2;
jasonberry 0:8964cd6e2cd3 131 if(message->event == TIME_OUT) state = STATE_0;
jasonberry 0:8964cd6e2cd3 132
jasonberry 0:8964cd6e2cd3 133 mpool.free(message);
jasonberry 0:8964cd6e2cd3 134 }
jasonberry 0:8964cd6e2cd3 135
jasonberry 0:8964cd6e2cd3 136
jasonberry 0:8964cd6e2cd3 137 timer.start(2000);
jasonberry 0:8964cd6e2cd3 138
jasonberry 0:8964cd6e2cd3 139 break;
jasonberry 0:8964cd6e2cd3 140
jasonberry 0:8964cd6e2cd3 141 case STATE_2:
jasonberry 0:8964cd6e2cd3 142 lcd.cls();
jasonberry 0:8964cd6e2cd3 143 lcd.locate(0,2);
jasonberry 0:8964cd6e2cd3 144 lcd.printf("FSM COUNTER 2");
jasonberry 0:8964cd6e2cd3 145
jasonberry 0:8964cd6e2cd3 146 evt = queue.get();
jasonberry 0:8964cd6e2cd3 147 if (evt.status == osEventMessage)
jasonberry 0:8964cd6e2cd3 148 {
jasonberry 0:8964cd6e2cd3 149 message_t *message = (message_t*)evt.value.p;
jasonberry 0:8964cd6e2cd3 150
jasonberry 0:8964cd6e2cd3 151
jasonberry 0:8964cd6e2cd3 152 if(message->event == BUTTON_PRESS) state = STATE_3;
jasonberry 0:8964cd6e2cd3 153 if(message->event == TIME_OUT) state = STATE_1;
jasonberry 0:8964cd6e2cd3 154
jasonberry 0:8964cd6e2cd3 155 mpool.free(message);
jasonberry 0:8964cd6e2cd3 156 }
jasonberry 0:8964cd6e2cd3 157
jasonberry 0:8964cd6e2cd3 158 timer.start(2000);
jasonberry 0:8964cd6e2cd3 159
jasonberry 0:8964cd6e2cd3 160 break;
jasonberry 0:8964cd6e2cd3 161
jasonberry 0:8964cd6e2cd3 162 case STATE_3:
jasonberry 0:8964cd6e2cd3 163 lcd.cls();
jasonberry 0:8964cd6e2cd3 164 lcd.locate(0,2);
jasonberry 0:8964cd6e2cd3 165 lcd.printf("FSM COUNTER 3");
jasonberry 0:8964cd6e2cd3 166
jasonberry 0:8964cd6e2cd3 167 evt = queue.get();
jasonberry 0:8964cd6e2cd3 168 if (evt.status == osEventMessage)
jasonberry 0:8964cd6e2cd3 169 {
jasonberry 0:8964cd6e2cd3 170 message_t *message = (message_t*)evt.value.p;
jasonberry 0:8964cd6e2cd3 171
jasonberry 0:8964cd6e2cd3 172
jasonberry 0:8964cd6e2cd3 173 if(message->event == BUTTON_PRESS) state = STATE_4;
jasonberry 0:8964cd6e2cd3 174 if(message->event == TIME_OUT) state = STATE_2;
jasonberry 0:8964cd6e2cd3 175
jasonberry 0:8964cd6e2cd3 176 mpool.free(message);
jasonberry 0:8964cd6e2cd3 177 }
jasonberry 0:8964cd6e2cd3 178
jasonberry 0:8964cd6e2cd3 179
jasonberry 0:8964cd6e2cd3 180 timer.start(2000);
jasonberry 0:8964cd6e2cd3 181
jasonberry 0:8964cd6e2cd3 182 break;
jasonberry 0:8964cd6e2cd3 183
jasonberry 0:8964cd6e2cd3 184 case STATE_4:
jasonberry 0:8964cd6e2cd3 185 lcd.cls();
jasonberry 0:8964cd6e2cd3 186 lcd.locate(0,2);
jasonberry 0:8964cd6e2cd3 187 lcd.printf("FSM COUNTER 4");
jasonberry 0:8964cd6e2cd3 188
jasonberry 0:8964cd6e2cd3 189 evt = queue.get();
jasonberry 0:8964cd6e2cd3 190 if (evt.status == osEventMessage)
jasonberry 0:8964cd6e2cd3 191 {
jasonberry 0:8964cd6e2cd3 192 message_t *message = (message_t*)evt.value.p;
jasonberry 0:8964cd6e2cd3 193
jasonberry 0:8964cd6e2cd3 194
jasonberry 0:8964cd6e2cd3 195 if(message->event == BUTTON_PRESS) state = STATE_5;
jasonberry 0:8964cd6e2cd3 196 if(message->event == TIME_OUT) state = STATE_3;
jasonberry 0:8964cd6e2cd3 197
jasonberry 0:8964cd6e2cd3 198 mpool.free(message);
jasonberry 0:8964cd6e2cd3 199 }
jasonberry 0:8964cd6e2cd3 200
jasonberry 0:8964cd6e2cd3 201 timer.start(2000);
jasonberry 0:8964cd6e2cd3 202
jasonberry 0:8964cd6e2cd3 203 break;
jasonberry 0:8964cd6e2cd3 204
jasonberry 0:8964cd6e2cd3 205 case STATE_5:
jasonberry 0:8964cd6e2cd3 206 lcd.cls();
jasonberry 0:8964cd6e2cd3 207 lcd.locate(0,2);
jasonberry 0:8964cd6e2cd3 208 lcd.printf("FSM COUNTER 5");
jasonberry 0:8964cd6e2cd3 209
jasonberry 0:8964cd6e2cd3 210 evt = queue.get();
jasonberry 0:8964cd6e2cd3 211 if (evt.status == osEventMessage)
jasonberry 0:8964cd6e2cd3 212 {
jasonberry 0:8964cd6e2cd3 213 message_t *message = (message_t*)evt.value.p;
jasonberry 0:8964cd6e2cd3 214
jasonberry 0:8964cd6e2cd3 215
jasonberry 0:8964cd6e2cd3 216 if(message->event == BUTTON_PRESS) state = STATE_5;
jasonberry 0:8964cd6e2cd3 217 if(message->event == TIME_OUT) state = STATE_4;
jasonberry 0:8964cd6e2cd3 218
jasonberry 0:8964cd6e2cd3 219 mpool.free(message);
jasonberry 0:8964cd6e2cd3 220 }
jasonberry 0:8964cd6e2cd3 221
jasonberry 0:8964cd6e2cd3 222
jasonberry 0:8964cd6e2cd3 223
jasonberry 0:8964cd6e2cd3 224 timer.start(2000);
jasonberry 0:8964cd6e2cd3 225
jasonberry 0:8964cd6e2cd3 226 break;
jasonberry 0:8964cd6e2cd3 227
jasonberry 0:8964cd6e2cd3 228
jasonberry 0:8964cd6e2cd3 229
jasonberry 0:8964cd6e2cd3 230
jasonberry 0:8964cd6e2cd3 231 }//End of switch
jasonberry 0:8964cd6e2cd3 232
jasonberry 0:8964cd6e2cd3 233 //toggle led for local testing
jasonberry 0:8964cd6e2cd3 234 led2= !led2;
jasonberry 0:8964cd6e2cd3 235
jasonberry 0:8964cd6e2cd3 236 }//end of while(1)
jasonberry 0:8964cd6e2cd3 237
jasonberry 0:8964cd6e2cd3 238
jasonberry 0:8964cd6e2cd3 239 }