finished

Dependencies:   C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed

Committer:
cathal66
Date:
Thu Feb 26 15:00:42 2015 +0000
Revision:
0:151f0dbf3ca8
Child:
1:57407e283b03
fixed problem with push button

Who changed what in which revision?

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