![](/media/cache/group/download_IjbieK2.png.50x50_q85.png)
demo new haven display
Dependencies: LCD Menu ButtonCtrl TimeManagement EventLog AddressMap emic2
ESCM 2000 Control and Display application provides interface for the LPC1768 processor boards with the ECSM 2000 system.
This application implements SW interface : - RX 485 Receive from physical system - RX 485 Interface to send toECOM / ESCM board - CAN Interface to send to ECOM / ESCM board - 4x40 LCD with menu controls - RTC configuration -EMIC2 Sound Card - GPIO Extender to push buttons etc
main.cpp@3:ecaf9963341b, 2019-07-25 (annotated)
- Committer:
- foxbrianr
- Date:
- Thu Jul 25 00:45:01 2019 +0000
- Revision:
- 3:ecaf9963341b
- Parent:
- 1:a16e53a9e991
- Child:
- 5:65f21c0b6b79
Baseline for testing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
foxbrianr | 0:91f25a0f819c | 1 | #include "mbed.h" |
foxbrianr | 3:ecaf9963341b | 2 | #include "rtos.h" |
foxbrianr | 3:ecaf9963341b | 3 | |
foxbrianr | 0:91f25a0f819c | 4 | #include "LCD.h" |
foxbrianr | 0:91f25a0f819c | 5 | |
foxbrianr | 3:ecaf9963341b | 6 | #include "ButtonController.h" |
foxbrianr | 3:ecaf9963341b | 7 | |
foxbrianr | 3:ecaf9963341b | 8 | #include "ESCMControlApp.h" |
foxbrianr | 3:ecaf9963341b | 9 | |
foxbrianr | 3:ecaf9963341b | 10 | #include "Menu.h" |
foxbrianr | 3:ecaf9963341b | 11 | #include "EditTimeMenu.h" |
foxbrianr | 3:ecaf9963341b | 12 | #include "DisplayCodesMenu.h" |
foxbrianr | 3:ecaf9963341b | 13 | |
foxbrianr | 3:ecaf9963341b | 14 | //#include "EditDateMenu.h" |
foxbrianr | 3:ecaf9963341b | 15 | //#include "EditAddressMenu.h" |
foxbrianr | 3:ecaf9963341b | 16 | //#include "DisplayFaultAddressMenu.h" |
foxbrianr | 3:ecaf9963341b | 17 | |
foxbrianr | 3:ecaf9963341b | 18 | #include "Navigator.h" |
foxbrianr | 3:ecaf9963341b | 19 | #include "Selection.h" |
foxbrianr | 3:ecaf9963341b | 20 | |
foxbrianr | 3:ecaf9963341b | 21 | DigitalOut led1(LED1); |
foxbrianr | 3:ecaf9963341b | 22 | DigitalOut led2(LED2); |
foxbrianr | 3:ecaf9963341b | 23 | DigitalOut led3(LED3); |
foxbrianr | 3:ecaf9963341b | 24 | DigitalOut led4(LED4); |
foxbrianr | 3:ecaf9963341b | 25 | |
foxbrianr | 3:ecaf9963341b | 26 | |
foxbrianr | 3:ecaf9963341b | 27 | Thread gpioThread (osPriorityHigh, 2000); |
foxbrianr | 3:ecaf9963341b | 28 | |
foxbrianr | 3:ecaf9963341b | 29 | Thread ioThread (osPriorityHigh, 2000); |
foxbrianr | 3:ecaf9963341b | 30 | |
foxbrianr | 3:ecaf9963341b | 31 | Thread soundThread(osPriorityLow, 2000); |
foxbrianr | 3:ecaf9963341b | 32 | |
foxbrianr | 3:ecaf9963341b | 33 | Thread displayThread(osPriorityNormal, 2000); |
foxbrianr | 3:ecaf9963341b | 34 | |
foxbrianr | 3:ecaf9963341b | 35 | |
foxbrianr | 3:ecaf9963341b | 36 | //EventQueue messageQueue(32 * EVENTS_EVENT_SIZE); |
foxbrianr | 3:ecaf9963341b | 37 | |
foxbrianr | 3:ecaf9963341b | 38 | typedef struct { |
foxbrianr | 3:ecaf9963341b | 39 | int event; |
foxbrianr | 3:ecaf9963341b | 40 | char msg[40]; |
foxbrianr | 3:ecaf9963341b | 41 | } event_t; |
foxbrianr | 3:ecaf9963341b | 42 | |
foxbrianr | 3:ecaf9963341b | 43 | |
foxbrianr | 3:ecaf9963341b | 44 | |
foxbrianr | 3:ecaf9963341b | 45 | CircularBuffer<event_t, 64> event_queue; |
foxbrianr | 3:ecaf9963341b | 46 | CircularBuffer<event_t, 64> playback_queue; |
foxbrianr | 3:ecaf9963341b | 47 | |
foxbrianr | 0:91f25a0f819c | 48 | |
foxbrianr | 0:91f25a0f819c | 49 | Serial pc(USBTX, USBRX); // tx, rx |
foxbrianr | 0:91f25a0f819c | 50 | |
foxbrianr | 3:ecaf9963341b | 51 | LCD lcd; |
foxbrianr | 3:ecaf9963341b | 52 | |
foxbrianr | 3:ecaf9963341b | 53 | |
foxbrianr | 3:ecaf9963341b | 54 | |
foxbrianr | 3:ecaf9963341b | 55 | Menu rootMenu ("root menu"); |
foxbrianr | 3:ecaf9963341b | 56 | EditTimeMenu editTime ("Edit Time"); |
foxbrianr | 3:ecaf9963341b | 57 | //EditDateMenu editDate ("Edit Date"); |
foxbrianr | 3:ecaf9963341b | 58 | //EditAddressMenu editAdress ("Edit Addresses"); |
foxbrianr | 3:ecaf9963341b | 59 | |
foxbrianr | 3:ecaf9963341b | 60 | DisplayCodesMenu showEvents ("Display Events" ); |
foxbrianr | 3:ecaf9963341b | 61 | |
foxbrianr | 3:ecaf9963341b | 62 | |
foxbrianr | 3:ecaf9963341b | 63 | Navigator navigator(&rootMenu, &lcd); |
foxbrianr | 3:ecaf9963341b | 64 | |
foxbrianr | 3:ecaf9963341b | 65 | |
foxbrianr | 3:ecaf9963341b | 66 | Menu * currentMenu = &showEvents; |
foxbrianr | 3:ecaf9963341b | 67 | |
foxbrianr | 3:ecaf9963341b | 68 | ButtonController controller(&navigator); |
foxbrianr | 3:ecaf9963341b | 69 | |
foxbrianr | 3:ecaf9963341b | 70 | |
foxbrianr | 3:ecaf9963341b | 71 | ESCMControlApp escmController; |
foxbrianr | 3:ecaf9963341b | 72 | |
foxbrianr | 3:ecaf9963341b | 73 | void toggleLed1(void* obj) |
foxbrianr | 3:ecaf9963341b | 74 | { |
foxbrianr | 3:ecaf9963341b | 75 | led1 = !led1; |
foxbrianr | 3:ecaf9963341b | 76 | } |
foxbrianr | 3:ecaf9963341b | 77 | void toggleLed2(void* obj) |
foxbrianr | 3:ecaf9963341b | 78 | { |
foxbrianr | 3:ecaf9963341b | 79 | led2 = !led2; |
foxbrianr | 3:ecaf9963341b | 80 | } |
foxbrianr | 3:ecaf9963341b | 81 | void toggleLed3(void* obj) |
foxbrianr | 3:ecaf9963341b | 82 | { |
foxbrianr | 3:ecaf9963341b | 83 | led3 = !led3; |
foxbrianr | 3:ecaf9963341b | 84 | } |
foxbrianr | 3:ecaf9963341b | 85 | void toggleLed4() |
foxbrianr | 3:ecaf9963341b | 86 | { |
foxbrianr | 3:ecaf9963341b | 87 | led4 = !led4; |
foxbrianr | 3:ecaf9963341b | 88 | } |
foxbrianr | 3:ecaf9963341b | 89 | /*********************************************************************** |
foxbrianr | 3:ecaf9963341b | 90 | * Thread to read GPIO and handle events |
foxbrianr | 3:ecaf9963341b | 91 | ***********************************************************************/ |
foxbrianr | 3:ecaf9963341b | 92 | |
foxbrianr | 3:ecaf9963341b | 93 | void ReadGPIOExtender(void const *name) |
foxbrianr | 3:ecaf9963341b | 94 | { |
foxbrianr | 3:ecaf9963341b | 95 | uint8_t code = 0; |
foxbrianr | 3:ecaf9963341b | 96 | |
foxbrianr | 3:ecaf9963341b | 97 | pc.printf("Starting %s task\n", name ); |
foxbrianr | 3:ecaf9963341b | 98 | |
foxbrianr | 3:ecaf9963341b | 99 | led4 = !led4; |
foxbrianr | 3:ecaf9963341b | 100 | |
foxbrianr | 3:ecaf9963341b | 101 | while (true) { |
foxbrianr | 3:ecaf9963341b | 102 | |
foxbrianr | 3:ecaf9963341b | 103 | controller.update(); |
foxbrianr | 3:ecaf9963341b | 104 | |
foxbrianr | 3:ecaf9963341b | 105 | code = controller.currentValue & 0x1F; // filter code(s) |
foxbrianr | 3:ecaf9963341b | 106 | |
foxbrianr | 3:ecaf9963341b | 107 | if (code) |
foxbrianr | 3:ecaf9963341b | 108 | { |
foxbrianr | 3:ecaf9963341b | 109 | event_t e; |
foxbrianr | 3:ecaf9963341b | 110 | e.event = code; |
foxbrianr | 3:ecaf9963341b | 111 | |
foxbrianr | 3:ecaf9963341b | 112 | if (!event_queue.full()){ |
foxbrianr | 3:ecaf9963341b | 113 | pc.printf("<%02x>\n",e.event); |
foxbrianr | 3:ecaf9963341b | 114 | event_queue.push(e); |
foxbrianr | 3:ecaf9963341b | 115 | } |
foxbrianr | 3:ecaf9963341b | 116 | |
foxbrianr | 3:ecaf9963341b | 117 | } |
foxbrianr | 3:ecaf9963341b | 118 | |
foxbrianr | 3:ecaf9963341b | 119 | led4 = !led4; |
foxbrianr | 3:ecaf9963341b | 120 | Thread::wait(10); |
foxbrianr | 3:ecaf9963341b | 121 | } |
foxbrianr | 3:ecaf9963341b | 122 | |
foxbrianr | 3:ecaf9963341b | 123 | |
foxbrianr | 3:ecaf9963341b | 124 | } |
foxbrianr | 3:ecaf9963341b | 125 | |
foxbrianr | 3:ecaf9963341b | 126 | /*********************************************************************** |
foxbrianr | 3:ecaf9963341b | 127 | * Thread to read GPIO and handle events |
foxbrianr | 3:ecaf9963341b | 128 | ***********************************************************************/ |
foxbrianr | 3:ecaf9963341b | 129 | |
foxbrianr | 3:ecaf9963341b | 130 | void ESCMController_Update(void const *name) |
foxbrianr | 3:ecaf9963341b | 131 | { |
foxbrianr | 3:ecaf9963341b | 132 | |
foxbrianr | 3:ecaf9963341b | 133 | pc.printf("Starting %s task\n", name ); |
foxbrianr | 3:ecaf9963341b | 134 | |
foxbrianr | 3:ecaf9963341b | 135 | |
foxbrianr | 3:ecaf9963341b | 136 | while(1) { |
foxbrianr | 3:ecaf9963341b | 137 | |
foxbrianr | 3:ecaf9963341b | 138 | escmController.update(); |
foxbrianr | 3:ecaf9963341b | 139 | |
foxbrianr | 3:ecaf9963341b | 140 | Thread::wait(1000); |
foxbrianr | 3:ecaf9963341b | 141 | } |
foxbrianr | 3:ecaf9963341b | 142 | } |
foxbrianr | 3:ecaf9963341b | 143 | |
foxbrianr | 3:ecaf9963341b | 144 | |
foxbrianr | 3:ecaf9963341b | 145 | /*********************************************************************** |
foxbrianr | 3:ecaf9963341b | 146 | * Update LCD Display Thread |
foxbrianr | 3:ecaf9963341b | 147 | ***********************************************************************/ |
foxbrianr | 3:ecaf9963341b | 148 | |
foxbrianr | 3:ecaf9963341b | 149 | void UpdateDisplay(void const *name) |
foxbrianr | 3:ecaf9963341b | 150 | { |
foxbrianr | 3:ecaf9963341b | 151 | |
foxbrianr | 3:ecaf9963341b | 152 | pc.printf("Starting %s task\n", name ); |
foxbrianr | 3:ecaf9963341b | 153 | |
foxbrianr | 3:ecaf9963341b | 154 | lcd.init(); |
foxbrianr | 3:ecaf9963341b | 155 | lcd.locate(0,0); |
foxbrianr | 3:ecaf9963341b | 156 | lcd.cls(); |
foxbrianr | 3:ecaf9963341b | 157 | |
foxbrianr | 3:ecaf9963341b | 158 | lcd.writeLine (0, "Initializing System.."); |
foxbrianr | 3:ecaf9963341b | 159 | |
foxbrianr | 3:ecaf9963341b | 160 | event_t ex;// = (event_t*)(event_queue.alloc()); |
foxbrianr | 3:ecaf9963341b | 161 | int event =0; |
foxbrianr | 3:ecaf9963341b | 162 | |
foxbrianr | 3:ecaf9963341b | 163 | currentMenu->update_needed = 1; |
foxbrianr | 3:ecaf9963341b | 164 | |
foxbrianr | 3:ecaf9963341b | 165 | while (true) { |
foxbrianr | 3:ecaf9963341b | 166 | |
foxbrianr | 3:ecaf9963341b | 167 | #if 1 |
foxbrianr | 3:ecaf9963341b | 168 | |
foxbrianr | 3:ecaf9963341b | 169 | while (!event_queue.empty()) { |
foxbrianr | 3:ecaf9963341b | 170 | event_queue.pop(ex); |
foxbrianr | 3:ecaf9963341b | 171 | |
foxbrianr | 3:ecaf9963341b | 172 | switch(ex.event) |
foxbrianr | 3:ecaf9963341b | 173 | { |
foxbrianr | 3:ecaf9963341b | 174 | case 0x01://up |
foxbrianr | 3:ecaf9963341b | 175 | currentMenu->pressUp(); |
foxbrianr | 3:ecaf9963341b | 176 | break; |
foxbrianr | 3:ecaf9963341b | 177 | |
foxbrianr | 3:ecaf9963341b | 178 | case 0x02://down |
foxbrianr | 3:ecaf9963341b | 179 | currentMenu->pressDown(); |
foxbrianr | 3:ecaf9963341b | 180 | break; |
foxbrianr | 3:ecaf9963341b | 181 | |
foxbrianr | 3:ecaf9963341b | 182 | case 0x04://clear |
foxbrianr | 3:ecaf9963341b | 183 | currentMenu->pressClear(); |
foxbrianr | 3:ecaf9963341b | 184 | break; |
foxbrianr | 3:ecaf9963341b | 185 | |
foxbrianr | 3:ecaf9963341b | 186 | case 0x08://mode |
foxbrianr | 3:ecaf9963341b | 187 | currentMenu->pressMode(); |
foxbrianr | 3:ecaf9963341b | 188 | break; |
foxbrianr | 3:ecaf9963341b | 189 | |
foxbrianr | 3:ecaf9963341b | 190 | case 0x10://set |
foxbrianr | 3:ecaf9963341b | 191 | currentMenu->pressSet(); |
foxbrianr | 3:ecaf9963341b | 192 | break; |
foxbrianr | 3:ecaf9963341b | 193 | default: |
foxbrianr | 3:ecaf9963341b | 194 | break; |
foxbrianr | 3:ecaf9963341b | 195 | } |
foxbrianr | 3:ecaf9963341b | 196 | } |
foxbrianr | 3:ecaf9963341b | 197 | |
foxbrianr | 3:ecaf9963341b | 198 | currentMenu->lcd = &lcd; |
foxbrianr | 3:ecaf9963341b | 199 | currentMenu->display(&lcd); |
foxbrianr | 3:ecaf9963341b | 200 | #endif |
foxbrianr | 3:ecaf9963341b | 201 | |
foxbrianr | 3:ecaf9963341b | 202 | led3 = !led3; |
foxbrianr | 3:ecaf9963341b | 203 | |
foxbrianr | 3:ecaf9963341b | 204 | Thread::wait(50); |
foxbrianr | 3:ecaf9963341b | 205 | |
foxbrianr | 3:ecaf9963341b | 206 | } |
foxbrianr | 3:ecaf9963341b | 207 | } |
foxbrianr | 3:ecaf9963341b | 208 | |
foxbrianr | 3:ecaf9963341b | 209 | /*********************************************************************** |
foxbrianr | 3:ecaf9963341b | 210 | * Play sounds |
foxbrianr | 3:ecaf9963341b | 211 | * TODO: should have its own queue. |
foxbrianr | 3:ecaf9963341b | 212 | ***********************************************************************/ |
foxbrianr | 3:ecaf9963341b | 213 | |
foxbrianr | 3:ecaf9963341b | 214 | void PlaySound(void const *name) |
foxbrianr | 3:ecaf9963341b | 215 | { |
foxbrianr | 3:ecaf9963341b | 216 | char msg[40]; |
foxbrianr | 3:ecaf9963341b | 217 | |
foxbrianr | 3:ecaf9963341b | 218 | event_t e; |
foxbrianr | 3:ecaf9963341b | 219 | |
foxbrianr | 3:ecaf9963341b | 220 | pc.printf("Starting %s task\n", name ); |
foxbrianr | 3:ecaf9963341b | 221 | |
foxbrianr | 3:ecaf9963341b | 222 | while (true) { |
foxbrianr | 3:ecaf9963341b | 223 | |
foxbrianr | 3:ecaf9963341b | 224 | while (!playback_queue.empty()) { |
foxbrianr | 3:ecaf9963341b | 225 | playback_queue.pop(e); |
foxbrianr | 3:ecaf9963341b | 226 | |
foxbrianr | 3:ecaf9963341b | 227 | sprintf(msg, "Unit %d is open\r",e.event); |
foxbrianr | 3:ecaf9963341b | 228 | speaker.speakf("S");//Speak command starts with "S" |
foxbrianr | 3:ecaf9963341b | 229 | speaker.speakf(msg); // Send the desired string to convert to speech |
foxbrianr | 3:ecaf9963341b | 230 | speaker.speakf("\r"); //marks end of speak command |
foxbrianr | 3:ecaf9963341b | 231 | speaker.ready(); //ready waits for speech to finish from last command with a ":" response |
foxbrianr | 3:ecaf9963341b | 232 | led2 = !led2; |
foxbrianr | 3:ecaf9963341b | 233 | } |
foxbrianr | 3:ecaf9963341b | 234 | Thread::wait(2000); |
foxbrianr | 3:ecaf9963341b | 235 | } |
foxbrianr | 3:ecaf9963341b | 236 | } |
foxbrianr | 3:ecaf9963341b | 237 | |
foxbrianr | 3:ecaf9963341b | 238 | /*********************************************************************** |
foxbrianr | 3:ecaf9963341b | 239 | * Main Loop |
foxbrianr | 3:ecaf9963341b | 240 | ***********************************************************************/ |
foxbrianr | 0:91f25a0f819c | 241 | |
foxbrianr | 0:91f25a0f819c | 242 | int main() { |
foxbrianr | 3:ecaf9963341b | 243 | |
foxbrianr | 3:ecaf9963341b | 244 | led1=1; |
foxbrianr | 3:ecaf9963341b | 245 | led1=!led1; |
foxbrianr | 3:ecaf9963341b | 246 | |
foxbrianr | 0:91f25a0f819c | 247 | pc.printf("\n\r"); |
foxbrianr | 0:91f25a0f819c | 248 | pc.printf("=====================================\n\r"); |
foxbrianr | 0:91f25a0f819c | 249 | pc.printf("= LCD TEST =\n\r"); |
foxbrianr | 0:91f25a0f819c | 250 | pc.printf("=====================================\n\r"); |
foxbrianr | 0:91f25a0f819c | 251 | |
foxbrianr | 3:ecaf9963341b | 252 | escmController.init(); |
foxbrianr | 3:ecaf9963341b | 253 | escmController.tx485Message(0); |
foxbrianr | 3:ecaf9963341b | 254 | led1=!led1; |
foxbrianr | 3:ecaf9963341b | 255 | |
foxbrianr | 3:ecaf9963341b | 256 | #if 0 |
foxbrianr | 3:ecaf9963341b | 257 | Menu ledMenu1("Events menu"); |
foxbrianr | 3:ecaf9963341b | 258 | Menu ledMenu2("Address menu"); |
foxbrianr | 3:ecaf9963341b | 259 | Menu ledMenu3("Set Time"); |
foxbrianr | 3:ecaf9963341b | 260 | Menu ledMenu4("Set Date"); |
foxbrianr | 0:91f25a0f819c | 261 | |
foxbrianr | 3:ecaf9963341b | 262 | //Add any selections |
foxbrianr | 3:ecaf9963341b | 263 | ledMenu1.add(Selection(&toggleLed1, 0, NULL, "Toggle LED1")); |
foxbrianr | 3:ecaf9963341b | 264 | ledMenu1.add(Selection(&toggleLed2, 0, NULL, "Toggle LED2")); |
foxbrianr | 3:ecaf9963341b | 265 | ledMenu1.add(Selection(&toggleLed3, 0, NULL, "Toggle LED3")); |
foxbrianr | 3:ecaf9963341b | 266 | ledMenu1.add(Selection(&toggleLed4, 0, NULL, "Toggle LED4")); |
foxbrianr | 3:ecaf9963341b | 267 | ledMenu1.add(Selection(NULL, 0, &rootMenu, "Go back")); |
foxbrianr | 3:ecaf9963341b | 268 | |
foxbrianr | 3:ecaf9963341b | 269 | //add a selection to go back up in the menu hierarchy. |
foxbrianr | 3:ecaf9963341b | 270 | // Do this by letting the child menu point to the previous menu |
foxbrianr | 3:ecaf9963341b | 271 | |
foxbrianr | 3:ecaf9963341b | 272 | ledMenu2.add(Selection(&toggleLed4, 0, NULL, "Current Address Code")); |
foxbrianr | 3:ecaf9963341b | 273 | ledMenu2.add(Selection(NULL, 0, &rootMenu, "Go back")); |
foxbrianr | 3:ecaf9963341b | 274 | |
foxbrianr | 3:ecaf9963341b | 275 | ledMenu3.add(Selection(&toggleLed4, 0, NULL, "Current Time")); |
foxbrianr | 3:ecaf9963341b | 276 | ledMenu3.add(Selection(NULL, 0, &rootMenu, "Go back")); |
foxbrianr | 3:ecaf9963341b | 277 | |
foxbrianr | 3:ecaf9963341b | 278 | ledMenu4.add(Selection(&toggleLed4, 0, NULL, "Current Date")); |
foxbrianr | 3:ecaf9963341b | 279 | ledMenu4.add(Selection(NULL, 0, &rootMenu, "Go back")); |
foxbrianr | 3:ecaf9963341b | 280 | |
foxbrianr | 3:ecaf9963341b | 281 | #endif |
foxbrianr | 0:91f25a0f819c | 282 | |
foxbrianr | 0:91f25a0f819c | 283 | |
foxbrianr | 3:ecaf9963341b | 284 | //add submenus to the root (as selections with child parameters set to the submenus) |
foxbrianr | 3:ecaf9963341b | 285 | // rootMenu.add(Selection(NULL, 0, &showEvents, "View Events")); |
foxbrianr | 3:ecaf9963341b | 286 | // rootMenu.add(Selection(NULL, 1, &editAdress, "Modify Addresses")); |
foxbrianr | 3:ecaf9963341b | 287 | rootMenu.add(Selection(NULL, 2, &editTime, "Set Time")); |
foxbrianr | 3:ecaf9963341b | 288 | // rootMenu.add(Selection(NULL, 3, &editDate, "Set Date")); |
foxbrianr | 3:ecaf9963341b | 289 | |
foxbrianr | 3:ecaf9963341b | 290 | led1=!led1; |
foxbrianr | 3:ecaf9963341b | 291 | |
foxbrianr | 3:ecaf9963341b | 292 | ioThread.start (callback(ESCMController_Update , (void *)"io")); |
foxbrianr | 0:91f25a0f819c | 293 | |
foxbrianr | 3:ecaf9963341b | 294 | gpioThread.start (callback(ReadGPIOExtender , (void *)"gpio")); |
foxbrianr | 3:ecaf9963341b | 295 | |
foxbrianr | 3:ecaf9963341b | 296 | soundThread.start(callback(PlaySound, (void *)"audio")); |
foxbrianr | 3:ecaf9963341b | 297 | |
foxbrianr | 3:ecaf9963341b | 298 | displayThread.start (callback(UpdateDisplay, (void *)"display")); |
foxbrianr | 3:ecaf9963341b | 299 | |
foxbrianr | 3:ecaf9963341b | 300 | escmController.say("Welcome"); |
foxbrianr | 3:ecaf9963341b | 301 | |
foxbrianr | 3:ecaf9963341b | 302 | uint32_t frameCount = 0; |
foxbrianr | 3:ecaf9963341b | 303 | |
foxbrianr | 0:91f25a0f819c | 304 | while(1) { |
foxbrianr | 3:ecaf9963341b | 305 | wait_ms(500); |
foxbrianr | 3:ecaf9963341b | 306 | frameCount++; |
foxbrianr | 3:ecaf9963341b | 307 | led1=!led1; |
foxbrianr | 3:ecaf9963341b | 308 | |
foxbrianr | 0:91f25a0f819c | 309 | } |
foxbrianr | 0:91f25a0f819c | 310 | } |
foxbrianr | 0:91f25a0f819c | 311 |