![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Coursework
main.cpp@17:dee80717e423, 2022-01-15 (annotated)
- Committer:
- sesa514652
- Date:
- Sat Jan 15 16:18:09 2022 +0000
- Revision:
- 17:dee80717e423
- Parent:
- 16:2646c1c4e62e
trying with FSM in main while 1;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sesa514652 | 0:1f799c7cce2b | 1 | #include "mbed.h" |
sesa514652 | 0:1f799c7cce2b | 2 | #include "Joystick.h" |
sesa514652 | 0:1f799c7cce2b | 3 | #include "N5110.h" |
sesa514652 | 0:1f799c7cce2b | 4 | #include "hcsr04.h" |
sesa514652 | 3:6ecb75a2675c | 5 | #include "Piezo.h" |
sesa514652 | 8:770d168713cc | 6 | #include "string" |
sesa514652 | 12:ceea378d5691 | 7 | // FSM Menu |
sesa514652 | 12:ceea378d5691 | 8 | // defines directions as 0/1. Note UPPERCASE |
sesa514652 | 12:ceea378d5691 | 9 | #define UP 0 |
sesa514652 | 12:ceea378d5691 | 10 | #define DOWN 1 |
sesa514652 | 12:ceea378d5691 | 11 | // set inital state |
sesa514652 | 12:ceea378d5691 | 12 | volatile int state = 0; |
sesa514652 | 12:ceea378d5691 | 13 | // set initial direction |
sesa514652 | 12:ceea378d5691 | 14 | int direction = UP; |
sesa514652 | 12:ceea378d5691 | 15 | // array of states in the FSM, each element is the output of the counter |
sesa514652 | 12:ceea378d5691 | 16 | // set the output in binary to make it easier, 0 is LED on, 1 is LED off |
sesa514652 | 12:ceea378d5691 | 17 | string fsm[4] = {"buttonA_isr","buttonB_isr","buttonAsss_isr","buttonA_isr"}; |
sesa514652 | 17:dee80717e423 | 18 | volatile int Press; // Used to track the press |
sesa514652 | 17:dee80717e423 | 19 | volatile int g_buttonA_flag = 0; // Global Flag |
sesa514652 | 17:dee80717e423 | 20 | volatile int g_buttonB_flag = 0; // Global Flag |
sesa514652 | 17:dee80717e423 | 21 | volatile int g_buttonX_flag = 0; // Global Flag |
sesa514652 | 17:dee80717e423 | 22 | volatile int g_buttonY_flag = 0; // Global Flag |
sesa514652 | 17:dee80717e423 | 23 | volatile int g_buttonStart_flag = 0; // Global Flag |
sesa514652 | 17:dee80717e423 | 24 | volatile int g_buttonBack_flag = 0; // Global Flag |
sesa514652 | 17:dee80717e423 | 25 | volatile int g_buttonLeft_flag = 0; // Global Flag |
sesa514652 | 17:dee80717e423 | 26 | volatile int g_buttonRight_flag = 0; // Global Flag |
sesa514652 | 10:42e70b596099 | 27 | |
sesa514652 | 5:9b2c976ca318 | 28 | // y x button |
sesa514652 | 0:1f799c7cce2b | 29 | Joystick joystick(PTB10,PTB11,PTC16); |
sesa514652 | 0:1f799c7cce2b | 30 | HCSR04 sensor(D14, D15); |
sesa514652 | 3:6ecb75a2675c | 31 | Piezo Buzzer(PTC10); |
sesa514652 | 17:dee80717e423 | 32 | //Bringing in buttons as interuppts to allow change to be detected during operation |
sesa514652 | 8:770d168713cc | 33 | InterruptIn buttonA(PTB9); |
sesa514652 | 8:770d168713cc | 34 | InterruptIn buttonB(PTD0); |
sesa514652 | 8:770d168713cc | 35 | InterruptIn buttonX(PTC17); |
sesa514652 | 8:770d168713cc | 36 | InterruptIn buttonY(PTC12); |
sesa514652 | 11:1dec05b7d1c1 | 37 | InterruptIn buttonStart(PTC5); |
sesa514652 | 11:1dec05b7d1c1 | 38 | InterruptIn buttonBack(PTB19); |
sesa514652 | 11:1dec05b7d1c1 | 39 | InterruptIn buttonLeft(PTB18); |
sesa514652 | 11:1dec05b7d1c1 | 40 | InterruptIn buttonRight(PTB3); |
sesa514652 | 0:1f799c7cce2b | 41 | |
sesa514652 | 11:1dec05b7d1c1 | 42 | // create an event queue |
sesa514652 | 17:dee80717e423 | 43 | EventQueue queue; // Event Queue is used to get around interrupt issue with Printf and LCDprint issues |
sesa514652 | 5:9b2c976ca318 | 44 | //rows,cols |
sesa514652 | 0:1f799c7cce2b | 45 | int sprite[8][5] = { |
sesa514652 | 0:1f799c7cce2b | 46 | { 0,0,1,0,0 }, |
sesa514652 | 0:1f799c7cce2b | 47 | { 0,1,1,1,0 }, |
sesa514652 | 0:1f799c7cce2b | 48 | { 0,0,1,0,0 }, |
sesa514652 | 0:1f799c7cce2b | 49 | { 0,1,1,1,0 }, |
sesa514652 | 0:1f799c7cce2b | 50 | { 1,1,1,1,1 }, |
sesa514652 | 0:1f799c7cce2b | 51 | { 1,1,1,1,1 }, |
sesa514652 | 0:1f799c7cce2b | 52 | { 1,1,0,1,1 }, |
sesa514652 | 0:1f799c7cce2b | 53 | { 1,1,0,1,1 }, |
sesa514652 | 5:9b2c976ca318 | 54 | }; |
sesa514652 | 11:1dec05b7d1c1 | 55 | void init_K64F(); // Start K64fBoard |
sesa514652 | 11:1dec05b7d1c1 | 56 | void buttonA_isr(); // Button A interrupt service routine |
sesa514652 | 11:1dec05b7d1c1 | 57 | void buttonB_isr(); // Button B interrupt service routine |
sesa514652 | 11:1dec05b7d1c1 | 58 | void buttonX_isr(); // Button X interrupt service routine |
sesa514652 | 11:1dec05b7d1c1 | 59 | void buttonY_isr(); // Button Y interrupt service routine |
sesa514652 | 11:1dec05b7d1c1 | 60 | void buttonStart_isr(); // Button Start interrupt service routine |
sesa514652 | 11:1dec05b7d1c1 | 61 | void buttonBack_isr(); // Button Back interrupt service routine |
sesa514652 | 11:1dec05b7d1c1 | 62 | void buttonLeft_isr(); // Button Left interrupt service routine |
sesa514652 | 11:1dec05b7d1c1 | 63 | void buttonRight_isr(); // Button Right interrupt service routine |
sesa514652 | 17:dee80717e423 | 64 | |
sesa514652 | 15:234321e80678 | 65 | int buttonCounter(); |
sesa514652 | 17:dee80717e423 | 66 | |
sesa514652 | 10:42e70b596099 | 67 | // Menu Items |
sesa514652 | 10:42e70b596099 | 68 | int page1; |
sesa514652 | 10:42e70b596099 | 69 | int page2; |
sesa514652 | 10:42e70b596099 | 70 | int page3; |
sesa514652 | 10:42e70b596099 | 71 | string Listitem1 = "Game"; // guess distance |
sesa514652 | 10:42e70b596099 | 72 | string Listitem2 = "Measure"; // measure distance of object |
sesa514652 | 10:42e70b596099 | 73 | string Listitem3 = "Detect"; // alarm when object is dectected |
sesa514652 | 5:9b2c976ca318 | 74 | N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); |
sesa514652 | 17:dee80717e423 | 75 | |
sesa514652 | 17:dee80717e423 | 76 | int main() { |
sesa514652 | 10:42e70b596099 | 77 | |
sesa514652 | 17:dee80717e423 | 78 | joystick.init(); //initialise Joystick |
sesa514652 | 17:dee80717e423 | 79 | lcd.init(); //first need to initialise display |
sesa514652 | 17:dee80717e423 | 80 | //change set contrast in range 0.0 to 1.0 |
sesa514652 | 17:dee80717e423 | 81 | //0.5 appears to be a good starting point |
sesa514652 | 17:dee80717e423 | 82 | lcd.setContrast(0.5); |
sesa514652 | 17:dee80717e423 | 83 | |
sesa514652 | 17:dee80717e423 | 84 | // create a thread that'll run the event queue's dispatch function |
sesa514652 | 11:1dec05b7d1c1 | 85 | Thread eventThread; |
sesa514652 | 11:1dec05b7d1c1 | 86 | eventThread.start(callback(&queue, &EventQueue::dispatch_forever)); |
sesa514652 | 17:dee80717e423 | 87 | // This is used to call the function putting it in queue allowing the screen toupdat no muxt error |
sesa514652 | 17:dee80717e423 | 88 | buttonA.rise(queue.event(&buttonA_isr)); |
sesa514652 | 17:dee80717e423 | 89 | buttonB.rise(queue.event(&buttonB_isr)); |
sesa514652 | 17:dee80717e423 | 90 | buttonX.rise(queue.event(&buttonX_isr)); |
sesa514652 | 17:dee80717e423 | 91 | buttonY.rise(queue.event(&buttonY_isr)); |
sesa514652 | 17:dee80717e423 | 92 | buttonStart.rise(queue.event(&buttonStart_isr)); |
sesa514652 | 17:dee80717e423 | 93 | buttonBack.rise(queue.event(&buttonBack_isr)); |
sesa514652 | 17:dee80717e423 | 94 | buttonLeft.rise(queue.event(&buttonLeft_isr)); |
sesa514652 | 11:1dec05b7d1c1 | 95 | buttonRight.rise(queue.event(&buttonRight_isr)); |
sesa514652 | 8:770d168713cc | 96 | |
sesa514652 | 17:dee80717e423 | 97 | |
sesa514652 | 17:dee80717e423 | 98 | // Buttons are connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister |
sesa514652 | 17:dee80717e423 | 99 | buttonA.mode(PullDown); |
sesa514652 | 17:dee80717e423 | 100 | buttonB.mode(PullDown); |
sesa514652 | 17:dee80717e423 | 101 | buttonX.mode(PullDown); |
sesa514652 | 17:dee80717e423 | 102 | buttonY.mode(PullDown); |
sesa514652 | 11:1dec05b7d1c1 | 103 | buttonStart.mode(PullDown); |
sesa514652 | 17:dee80717e423 | 104 | buttonBack.mode(PullDown); |
sesa514652 | 17:dee80717e423 | 105 | buttonLeft.mode(PullDown); |
sesa514652 | 11:1dec05b7d1c1 | 106 | buttonRight.mode(PullDown); |
sesa514652 | 8:770d168713cc | 107 | |
sesa514652 | 6:f7f30e0e3bed | 108 | //Test Struct after research 05/01/22 |
sesa514652 | 6:f7f30e0e3bed | 109 | struct ObjectDefine{ |
sesa514652 | 7:ce70a873aa70 | 110 | int qwer; |
sesa514652 | 6:f7f30e0e3bed | 111 | float Distance; |
sesa514652 | 7:ce70a873aa70 | 112 | char te; |
sesa514652 | 7:ce70a873aa70 | 113 | double dubs; |
sesa514652 | 7:ce70a873aa70 | 114 | string namestruct; |
sesa514652 | 8:770d168713cc | 115 | // string ; |
sesa514652 | 6:f7f30e0e3bed | 116 | }; |
sesa514652 | 7:ce70a873aa70 | 117 | // Test Class 06/01/22 |
sesa514652 | 10:42e70b596099 | 118 | class myClass{ |
sesa514652 | 7:ce70a873aa70 | 119 | public: |
sesa514652 | 7:ce70a873aa70 | 120 | string nameclass ; |
sesa514652 | 7:ce70a873aa70 | 121 | double dubss; |
sesa514652 | 7:ce70a873aa70 | 122 | int inty; |
sesa514652 | 7:ce70a873aa70 | 123 | }; |
sesa514652 | 7:ce70a873aa70 | 124 | myClass Class1; |
sesa514652 | 7:ce70a873aa70 | 125 | Class1.nameclass ="firstclass"; |
sesa514652 | 10:42e70b596099 | 126 | ObjectDefine Object1; |
sesa514652 | 10:42e70b596099 | 127 | Object1.qwer = 12; |
sesa514652 | 6:f7f30e0e3bed | 128 | Object1.Distance = 34; |
sesa514652 | 7:ce70a873aa70 | 129 | Object1.te = 'A'; |
sesa514652 | 7:ce70a873aa70 | 130 | Object1.dubs = 23; |
sesa514652 | 10:42e70b596099 | 131 | Object1.namestruct = "name"; |
sesa514652 | 17:dee80717e423 | 132 | |
sesa514652 | 0:1f799c7cce2b | 133 | while(1) { |
sesa514652 | 17:dee80717e423 | 134 | long distanced = sensor.distance(); |
sesa514652 | 17:dee80717e423 | 135 | printf("Distance : %d cm",distanced); |
sesa514652 | 17:dee80717e423 | 136 | switch(Press){ |
sesa514652 | 16:2646c1c4e62e | 137 | case 1: |
sesa514652 | 17:dee80717e423 | 138 | Press = 1; |
sesa514652 | 16:2646c1c4e62e | 139 | lcd.clear(); |
sesa514652 | 17:dee80717e423 | 140 | lcd.printString("Menu 1",0,0); |
sesa514652 | 17:dee80717e423 | 141 | |
sesa514652 | 17:dee80717e423 | 142 | // if (distanced >= 400 || distanced <= 2) |
sesa514652 | 17:dee80717e423 | 143 | printf("Distance : %d cm",distanced); |
sesa514652 | 17:dee80717e423 | 144 | // wait(1.0); // 1 sec |
sesa514652 | 16:2646c1c4e62e | 145 | lcd.refresh(); |
sesa514652 | 17:dee80717e423 | 146 | break; |
sesa514652 | 16:2646c1c4e62e | 147 | case 2: |
sesa514652 | 16:2646c1c4e62e | 148 | Press = 2; |
sesa514652 | 16:2646c1c4e62e | 149 | lcd.clear(); |
sesa514652 | 17:dee80717e423 | 150 | lcd.printString("Menu 2",0,1); |
sesa514652 | 16:2646c1c4e62e | 151 | lcd.refresh(); |
sesa514652 | 16:2646c1c4e62e | 152 | break; |
sesa514652 | 17:dee80717e423 | 153 | /* |
sesa514652 | 17:dee80717e423 | 154 | case 3: |
sesa514652 | 17:dee80717e423 | 155 | Press = 3; |
sesa514652 | 17:dee80717e423 | 156 | lcd.clear(); |
sesa514652 | 17:dee80717e423 | 157 | lcd.printString("Menu 3",0,1); |
sesa514652 | 17:dee80717e423 | 158 | lcd.refresh(); |
sesa514652 | 17:dee80717e423 | 159 | break; |
sesa514652 | 17:dee80717e423 | 160 | }*/ |
sesa514652 | 16:2646c1c4e62e | 161 | } |
sesa514652 | 8:770d168713cc | 162 | } |
sesa514652 | 12:ceea378d5691 | 163 | } |
sesa514652 | 17:dee80717e423 | 164 | |
sesa514652 | 15:234321e80678 | 165 | int buttonCount(){ |
sesa514652 | 15:234321e80678 | 166 | Press++; |
sesa514652 | 15:234321e80678 | 167 | if (Press >3){ |
sesa514652 | 15:234321e80678 | 168 | Press = 0; |
sesa514652 | 15:234321e80678 | 169 | } |
sesa514652 | 15:234321e80678 | 170 | return Press; |
sesa514652 | 15:234321e80678 | 171 | } |
sesa514652 | 12:ceea378d5691 | 172 | //Button A event-triggered interrupt |
sesa514652 | 10:42e70b596099 | 173 | void buttonA_isr() |
sesa514652 | 10:42e70b596099 | 174 | { |
sesa514652 | 12:ceea378d5691 | 175 | |
sesa514652 | 15:234321e80678 | 176 | buttonCount(); |
sesa514652 | 16:2646c1c4e62e | 177 | |
sesa514652 | 12:ceea378d5691 | 178 | |
sesa514652 | 12:ceea378d5691 | 179 | g_buttonA_flag = 1; // set flag in ISR |
sesa514652 | 12:ceea378d5691 | 180 | |
sesa514652 | 12:ceea378d5691 | 181 | printf("press count = %i\n",Press); |
sesa514652 | 17:dee80717e423 | 182 | |
sesa514652 | 12:ceea378d5691 | 183 | } |
sesa514652 | 12:ceea378d5691 | 184 | |
sesa514652 | 11:1dec05b7d1c1 | 185 | |
sesa514652 | 10:42e70b596099 | 186 | //Button B event-triggered interrupt |
sesa514652 | 10:42e70b596099 | 187 | void buttonB_isr() |
sesa514652 | 10:42e70b596099 | 188 | { |
sesa514652 | 17:dee80717e423 | 189 | buttonCount(); |
sesa514652 | 10:42e70b596099 | 190 | g_buttonB_flag = 1; // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 191 | lcd.clear(); |
sesa514652 | 11:1dec05b7d1c1 | 192 | lcd.printString("Button B Pressed",0,0); |
sesa514652 | 17:dee80717e423 | 193 | lcd.refresh(); |
sesa514652 | 10:42e70b596099 | 194 | } |
sesa514652 | 10:42e70b596099 | 195 | //Button X event-triggered interrupt |
sesa514652 | 10:42e70b596099 | 196 | void buttonX_isr() |
sesa514652 | 10:42e70b596099 | 197 | { |
sesa514652 | 10:42e70b596099 | 198 | g_buttonX_flag = 1; // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 199 | lcd.clear(); |
sesa514652 | 11:1dec05b7d1c1 | 200 | lcd.printString("Button X Pressed",0,0); |
sesa514652 | 11:1dec05b7d1c1 | 201 | lcd.refresh(); // set flag in ISR |
sesa514652 | 10:42e70b596099 | 202 | } |
sesa514652 | 10:42e70b596099 | 203 | //Button Y event-triggered interrupt |
sesa514652 | 10:42e70b596099 | 204 | void buttonY_isr() |
sesa514652 | 10:42e70b596099 | 205 | { |
sesa514652 | 10:42e70b596099 | 206 | g_buttonY_flag = 1; // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 207 | lcd.clear(); |
sesa514652 | 11:1dec05b7d1c1 | 208 | lcd.printString("Button Y Pressed",0,0); |
sesa514652 | 11:1dec05b7d1c1 | 209 | lcd.refresh(); // set flag in ISR |
sesa514652 | 10:42e70b596099 | 210 | } |
sesa514652 | 11:1dec05b7d1c1 | 211 | //Button Start event-triggered interrupt |
sesa514652 | 11:1dec05b7d1c1 | 212 | void buttonStart_isr() |
sesa514652 | 11:1dec05b7d1c1 | 213 | { |
sesa514652 | 11:1dec05b7d1c1 | 214 | g_buttonStart_flag = 1; // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 215 | lcd.clear(); |
sesa514652 | 11:1dec05b7d1c1 | 216 | lcd.printString("Button Start Pressed",0,0); |
sesa514652 | 11:1dec05b7d1c1 | 217 | lcd.refresh(); // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 218 | } |
sesa514652 | 11:1dec05b7d1c1 | 219 | //Button Back event-triggered interrupt |
sesa514652 | 11:1dec05b7d1c1 | 220 | void buttonBack_isr() |
sesa514652 | 11:1dec05b7d1c1 | 221 | { |
sesa514652 | 11:1dec05b7d1c1 | 222 | g_buttonBack_flag = 1; // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 223 | lcd.clear(); |
sesa514652 | 11:1dec05b7d1c1 | 224 | lcd.printString("Button Back Pressed",0,0); |
sesa514652 | 11:1dec05b7d1c1 | 225 | lcd.refresh(); // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 226 | } |
sesa514652 | 11:1dec05b7d1c1 | 227 | //Button Left event-triggered interrupt |
sesa514652 | 11:1dec05b7d1c1 | 228 | void buttonLeft_isr() |
sesa514652 | 11:1dec05b7d1c1 | 229 | { |
sesa514652 | 11:1dec05b7d1c1 | 230 | g_buttonLeft_flag = 1; // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 231 | lcd.clear(); |
sesa514652 | 11:1dec05b7d1c1 | 232 | lcd.printString("Button Left Pressed",0,0); |
sesa514652 | 11:1dec05b7d1c1 | 233 | lcd.refresh(); // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 234 | } |
sesa514652 | 11:1dec05b7d1c1 | 235 | //Button Right event-triggered interrupt |
sesa514652 | 17:dee80717e423 | 236 | void buttonRight_isr() |
sesa514652 | 11:1dec05b7d1c1 | 237 | { |
sesa514652 | 11:1dec05b7d1c1 | 238 | g_buttonRight_flag = 1; // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 239 | lcd.clear(); |
sesa514652 | 11:1dec05b7d1c1 | 240 | lcd.printString("Button Right Pressed",0,0); |
sesa514652 | 11:1dec05b7d1c1 | 241 | lcd.refresh(); // set flag in ISR |
sesa514652 | 11:1dec05b7d1c1 | 242 | } |