Craig Evans
/
ELEC2645_FSM_Puffin
Gamepad2
main.cpp@4:b6e9d473ce0e, 2020-01-24 (annotated)
- Committer:
- eencae
- Date:
- Fri Jan 24 15:16:38 2020 +0000
- Revision:
- 4:b6e9d473ce0e
- Parent:
- 3:818317dbe8a5
Gamepad2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:32827ba075c9 | 1 | /* |
eencae | 0:32827ba075c9 | 2 | 2645_FSM_Puffin |
eencae | 0:32827ba075c9 | 3 | |
eencae | 3:818317dbe8a5 | 4 | Sample code from ELEC2645 |
eencae | 0:32827ba075c9 | 5 | |
eencae | 0:32827ba075c9 | 6 | Demonstrates how to implement a puffin crossing using a FSM |
eencae | 0:32827ba075c9 | 7 | |
eencae | 0:32827ba075c9 | 8 | (c) Craig A. Evans, University of Leeds, Jan 2016 |
eencae | 4:b6e9d473ce0e | 9 | Updated Janaury 2020 for Gamepad2 |
eencae | 0:32827ba075c9 | 10 | */ |
eencae | 0:32827ba075c9 | 11 | |
eencae | 0:32827ba075c9 | 12 | #include "mbed.h" |
eencae | 0:32827ba075c9 | 13 | // K64F on-board LEDs |
eencae | 4:b6e9d473ce0e | 14 | BusOut k64f_leds(LED_RED, LED_GREEN, LED_BLUE); |
eencae | 0:32827ba075c9 | 15 | |
eencae | 0:32827ba075c9 | 16 | // LEDs to display traffic light output |
eencae | 0:32827ba075c9 | 17 | // LSB MSB |
eencae | 0:32827ba075c9 | 18 | // car - green,amber, red pedestrian - green, red |
eencae | 4:b6e9d473ce0e | 19 | BusOut output(PTC3,PTC2,PTA2,PTC11,PTA1); |
eencae | 3:818317dbe8a5 | 20 | |
eencae | 0:32827ba075c9 | 21 | // BusIn to read inputs simutaneously |
eencae | 3:818317dbe8a5 | 22 | // camera (button A) , pedestrian button (button B) |
eencae | 3:818317dbe8a5 | 23 | // LSB, MSB |
eencae | 4:b6e9d473ce0e | 24 | BusIn input(PTC7,PTC9); |
eencae | 0:32827ba075c9 | 25 | |
eencae | 0:32827ba075c9 | 26 | // struct for state |
eencae | 0:32827ba075c9 | 27 | struct State { |
eencae | 0:32827ba075c9 | 28 | int output; // output value |
eencae | 0:32827ba075c9 | 29 | float time; // time in state |
eencae | 0:32827ba075c9 | 30 | int nextState[4]; // array of next states |
eencae | 0:32827ba075c9 | 31 | }; |
eencae | 0:32827ba075c9 | 32 | |
eencae | 2:299c10699314 | 33 | State fsm[4] = { |
eencae | 4:b6e9d473ce0e | 34 | {0x..,5.0,{..,..,..,..}}, // 0 - cars stop, pedestrian walk 5 seconds |
eencae | 4:b6e9d473ce0e | 35 | {0x..,2.0,{..,..,..,..}}, // 1 - cars get ready to go, pedestrian stop 2 seconds |
eencae | 4:b6e9d473ce0e | 36 | {0x..,10.0,{..,..,..,..}}, // 2 - cars go, pedestrian stop 10 seconds |
eencae | 4:b6e9d473ce0e | 37 | {0x..,2.0,{..,..,..,..}} // 3 - cars get ready to stop, pedestrian stop 2 seconds |
eencae | 0:32827ba075c9 | 38 | }; |
eencae | 0:32827ba075c9 | 39 | |
eencae | 0:32827ba075c9 | 40 | int main() |
eencae | 0:32827ba075c9 | 41 | { |
eencae | 4:b6e9d473ce0e | 42 | k64f_leds = 0b111; // turn off K64F LEDs |
eencae | 0:32827ba075c9 | 43 | |
eencae | 4:b6e9d473ce0e | 44 | // turn on internal pull-up for buttons A and B |
eencae | 4:b6e9d473ce0e | 45 | input.mode(PullUp); |
eencae | 0:32827ba075c9 | 46 | |
eencae | 0:32827ba075c9 | 47 | int state = 2; // start with cars green |
eencae | 0:32827ba075c9 | 48 | |
eencae | 0:32827ba075c9 | 49 | while(1) { |
eencae | 0:32827ba075c9 | 50 | output = fsm[state].output; // set ouput depending on current state |
eencae | 0:32827ba075c9 | 51 | wait(fsm[state].time); // wait in that state for desired time |
eencae | 0:32827ba075c9 | 52 | state = fsm[state].nextState[input]; // read input (BusIn) and update curent state |
eencae | 0:32827ba075c9 | 53 | } |
eencae | 0:32827ba075c9 | 54 | } |