New work version with additional functions
Dependencies: 4DGL-UC ConfigFile MODSERIAL mbed mbos
Fork of CDU_Mbed_35 by
main.cpp@20:2d6ac4577e68, 2014-10-08 (annotated)
- Committer:
- WillemBraat
- Date:
- Wed Oct 08 14:14:52 2014 +0000
- Revision:
- 20:2d6ac4577e68
- Parent:
- 17:b3545e9d38f7
New release with additional new functions.
; * File handling for config files
; * CDU setup & test screens
; * External power monitoring
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
LvdK | 7:6576a287e563 | 1 | // L. van der Kolk, W.Braat |
LvdK | 7:6576a287e563 | 2 | // File: main.cpp |
LvdK | 14:5767d651d624 | 3 | // CDU Mbed version 30 |
LvdK | 8:422544d24df3 | 4 | // ----------------------------------------- |
LvdK | 5:99594f4ab659 | 5 | |
LvdK | 0:6f71ca095e78 | 6 | #include "mbed.h" |
LvdK | 6:e0bf3b244d7c | 7 | #include "MODSERIAL.h" |
LvdK | 6:e0bf3b244d7c | 8 | #include "mbos.h" |
LvdK | 8:422544d24df3 | 9 | #include "mbos_def2.h" // : Mbos tasks, timer and resource definitions |
WillemBraat | 17:b3545e9d38f7 | 10 | #include "pins.h" |
WillemBraat | 20:2d6ac4577e68 | 11 | #include "main.h" |
LvdK | 6:e0bf3b244d7c | 12 | |
LvdK | 7:6576a287e563 | 13 | // Setup USB communication defined by Mbed USB TX and RX lines |
LvdK | 7:6576a287e563 | 14 | // with TX and RX ringbuffers : |
WillemBraat | 20:2d6ac4577e68 | 15 | MODSERIAL USB(USBTX, USBRX, 256, 1024); //256, 1024 |
WillemBraat | 17:b3545e9d38f7 | 16 | DigitalOut alive_led( HEARTBEAT ); // : LED 1 on Mbed board toggles when CDU is alive |
WillemBraat | 20:2d6ac4577e68 | 17 | DigitalOut PWR_led( PWR_ON ); // : LED 4 on Mbed board is ON when external power applied to board |
WillemBraat | 20:2d6ac4577e68 | 18 | InterruptIn PWR_MON( PWR_IN ); // : Power monitor: input is connected to +5V and indirect to +12V |
WillemBraat | 20:2d6ac4577e68 | 19 | |
WillemBraat | 20:2d6ac4577e68 | 20 | //void test_update_flags(); // << for testing only << !!!!!!! |
LvdK | 6:e0bf3b244d7c | 21 | |
LvdK | 8:422544d24df3 | 22 | // --- Debug only ---------------------------------------- |
LvdK | 7:6576a287e563 | 23 | // extra serial port to show debug info : |
WillemBraat | 17:b3545e9d38f7 | 24 | MODSERIAL SERIAL_DEBUG(MODSERIAL_TX, MODSERIAL_RX, 512, 64); //: tx, rx |
LvdK | 8:422544d24df3 | 25 | // ------------------------------------------------------- |
LvdK | 7:6576a287e563 | 26 | |
WillemBraat | 20:2d6ac4577e68 | 27 | int CDU_FS_interface = Serial_USB; // : defines interface to FS: 0 = Serial_USB, 1 = Ethernet |
LvdK | 7:6576a287e563 | 28 | extern int key_hit_ID; |
LvdK | 7:6576a287e563 | 29 | extern PwmOut BGL_LED; |
LvdK | 0:6f71ca095e78 | 30 | |
LvdK | 7:6576a287e563 | 31 | void init_USB(void); |
LvdK | 8:422544d24df3 | 32 | void set_initial_data(void); // : fill datastructures with initial data |
LvdK | 8:422544d24df3 | 33 | void Send_KEY_message(int key_nr); |
LvdK | 6:e0bf3b244d7c | 34 | void Send_ALIVE_message(int seconds); |
LvdK | 6:e0bf3b244d7c | 35 | void collect_FSdata(); |
LvdK | 6:e0bf3b244d7c | 36 | |
LvdK | 7:6576a287e563 | 37 | mbos CDU_OS( 9, 5, 5); // : instantiate mbos O.S (tasks, timers, resources) |
LvdK | 6:e0bf3b244d7c | 38 | |
LvdK | 7:6576a287e563 | 39 | // Task function prototypes: |
LvdK | 7:6576a287e563 | 40 | void ALIVE_TASK(void); |
LvdK | 7:6576a287e563 | 41 | void RECEIVE_DECODE_TASK(void); |
LvdK | 7:6576a287e563 | 42 | void SEND_KEYMESSAGE_TASK(void); |
LvdK | 7:6576a287e563 | 43 | void CDU_DSP_CSS_TASK(void); |
LvdK | 7:6576a287e563 | 44 | void READ_POT_TASK(void); |
LvdK | 6:e0bf3b244d7c | 45 | |
LvdK | 7:6576a287e563 | 46 | // keyboard function prototypes: |
LvdK | 7:6576a287e563 | 47 | void CDU_KB_COMM_INIT(void); |
LvdK | 7:6576a287e563 | 48 | void CDU_KB_INT_START(void); |
LvdK | 7:6576a287e563 | 49 | void CDU_KB_GET_KEY(void); |
LvdK | 7:6576a287e563 | 50 | void CDU_SET_BGL_INTENSITY(int); |
LvdK | 6:e0bf3b244d7c | 51 | |
LvdK | 8:422544d24df3 | 52 | // display function prototypes: |
LvdK | 7:6576a287e563 | 53 | void CDU_InitDisplay(void); |
LvdK | 7:6576a287e563 | 54 | void CDU_ScreenAlign(void); |
LvdK | 7:6576a287e563 | 55 | void CDU_StartScreen(void); |
WillemBraat | 20:2d6ac4577e68 | 56 | void CDU_LogoScreen(void); |
WillemBraat | 20:2d6ac4577e68 | 57 | void CDU_Waiting(void); |
LvdK | 7:6576a287e563 | 58 | void CDU_Page(void); |
LvdK | 7:6576a287e563 | 59 | void CDU_DSP_CSS(void); |
LvdK | 7:6576a287e563 | 60 | void CDU_displayclear(void); |
LvdK | 6:e0bf3b244d7c | 61 | |
WillemBraat | 20:2d6ac4577e68 | 62 | void CDU_Screens(); |
WillemBraat | 20:2d6ac4577e68 | 63 | |
WillemBraat | 20:2d6ac4577e68 | 64 | void CDU_BOOT(); //reboot CDU |
WillemBraat | 20:2d6ac4577e68 | 65 | |
WillemBraat | 20:2d6ac4577e68 | 66 | |
LvdK | 8:422544d24df3 | 67 | //------ USB buffer overflow interrupt handling: ------------- |
LvdK | 7:6576a287e563 | 68 | void rx_buf_overflow(MODSERIAL_IRQ_INFO *q) |
LvdK | 8:422544d24df3 | 69 | { // This functiom will be called when RX buffer overflows. |
LvdK | 7:6576a287e563 | 70 | // Blue-Leds-of-Death will be showed on Mbed board |
LvdK | 7:6576a287e563 | 71 | error("RX OVERFLOW !"); |
LvdK | 6:e0bf3b244d7c | 72 | } |
LvdK | 6:e0bf3b244d7c | 73 | |
LvdK | 7:6576a287e563 | 74 | void tx_buf_overflow(MODSERIAL_IRQ_INFO *q) |
LvdK | 8:422544d24df3 | 75 | { // This functiom will be called when TX buffer overflows. |
LvdK | 7:6576a287e563 | 76 | // Blue-Leds-of-Death will be showed on Mbed board |
LvdK | 7:6576a287e563 | 77 | error("RX OVERFLOW !"); |
LvdK | 6:e0bf3b244d7c | 78 | } |
LvdK | 8:422544d24df3 | 79 | //------------------------------------------------------------ |
LvdK | 6:e0bf3b244d7c | 80 | |
LvdK | 6:e0bf3b244d7c | 81 | void init_USB() |
LvdK | 8:422544d24df3 | 82 | { // -- This function controls the setup for the CDU-FS USB communication -- |
LvdK | 7:6576a287e563 | 83 | // Function char_received() will be attached to RX interrupt. |
LvdK | 7:6576a287e563 | 84 | USB.baud(38400); // : set default baudrate to 38400 |
LvdK | 7:6576a287e563 | 85 | USB.rxBufferFlush(); // : empty USB rx buffer in case it is not empty: |
LvdK | 7:6576a287e563 | 86 | USB.txBufferFlush(); // : empty USB tx buffer in case it is not empty: |
LvdK | 7:6576a287e563 | 87 | USB.attach(&rx_buf_overflow, MODSERIAL::RxOvIrq); // : attach function to call when USB RX buffer overflows |
LvdK | 7:6576a287e563 | 88 | USB.attach(&tx_buf_overflow, MODSERIAL::TxOvIrq); // : attach function to call when USB TX buffer overflows |
LvdK | 6:e0bf3b244d7c | 89 | } |
LvdK | 7:6576a287e563 | 90 | |
WillemBraat | 20:2d6ac4577e68 | 91 | char CheckExtPower() |
WillemBraat | 20:2d6ac4577e68 | 92 | { |
WillemBraat | 20:2d6ac4577e68 | 93 | char ExtPower =0; |
WillemBraat | 20:2d6ac4577e68 | 94 | ExtPower = PWR_MON; //check on power input: if +5V is ON return 1 else 0 |
WillemBraat | 20:2d6ac4577e68 | 95 | //PWR_led = ExtPower; |
WillemBraat | 20:2d6ac4577e68 | 96 | return ExtPower; |
WillemBraat | 20:2d6ac4577e68 | 97 | } |
WillemBraat | 20:2d6ac4577e68 | 98 | |
WillemBraat | 20:2d6ac4577e68 | 99 | void EXT_PWR_DN() |
WillemBraat | 20:2d6ac4577e68 | 100 | { |
WillemBraat | 20:2d6ac4577e68 | 101 | //external power failed, reboot CDU! |
WillemBraat | 20:2d6ac4577e68 | 102 | CDU_BOOT(); |
WillemBraat | 20:2d6ac4577e68 | 103 | } |
WillemBraat | 20:2d6ac4577e68 | 104 | |
WillemBraat | 20:2d6ac4577e68 | 105 | |
WillemBraat | 20:2d6ac4577e68 | 106 | |
LvdK | 7:6576a287e563 | 107 | main() // : MBOS main() |
LvdK | 0:6f71ca095e78 | 108 | { |
WillemBraat | 20:2d6ac4577e68 | 109 | /* Check for a valid external power flag during boot sequence |
WillemBraat | 20:2d6ac4577e68 | 110 | When no external power is applied the VGA board and Keyboard chip are not operational |
WillemBraat | 20:2d6ac4577e68 | 111 | After initialization disconnecting external power will trigger interrupt to reboot. |
WillemBraat | 20:2d6ac4577e68 | 112 | */ |
WillemBraat | 20:2d6ac4577e68 | 113 | |
WillemBraat | 20:2d6ac4577e68 | 114 | PWR_MON.mode( PullDown ); //create a solid 0 when no external power supplied |
WillemBraat | 20:2d6ac4577e68 | 115 | while (! CheckExtPower() ); //wait for external power to come up |
WillemBraat | 20:2d6ac4577e68 | 116 | PWR_led = PWR_MON ; //switch on LED for external power indicator |
WillemBraat | 20:2d6ac4577e68 | 117 | PWR_MON.fall(&EXT_PWR_DN); //Bind function to handle interrupt when external power fails |
WillemBraat | 20:2d6ac4577e68 | 118 | |
LvdK | 7:6576a287e563 | 119 | init_USB(); // : setup USB communication to FS |
LvdK | 7:6576a287e563 | 120 | |
WillemBraat | 20:2d6ac4577e68 | 121 | // CDU keyboard initialisation and keyboard interrupt setup: |
LvdK | 7:6576a287e563 | 122 | CDU_KB_COMM_INIT(); |
LvdK | 7:6576a287e563 | 123 | CDU_KB_INT_START(); |
LvdK | 7:6576a287e563 | 124 | BGL_LED.period(0.01); |
LvdK | 5:99594f4ab659 | 125 | |
LvdK | 8:422544d24df3 | 126 | // CDU display initialisation: |
LvdK | 7:6576a287e563 | 127 | CDU_InitDisplay(); |
WillemBraat | 20:2d6ac4577e68 | 128 | //CDU_StartScreen(); |
WillemBraat | 20:2d6ac4577e68 | 129 | //CDU_LogoScreen(); |
WillemBraat | 20:2d6ac4577e68 | 130 | wait(2); |
WillemBraat | 20:2d6ac4577e68 | 131 | //CDU_Screens(); |
WillemBraat | 20:2d6ac4577e68 | 132 | CDU_Waiting(); |
LvdK | 8:422544d24df3 | 133 | //CDU_Page(); |
WillemBraat | 20:2d6ac4577e68 | 134 | //CDU_ScreenAlign(); |
WillemBraat | 20:2d6ac4577e68 | 135 | // |
LvdK | 8:422544d24df3 | 136 | set_initial_data(); //: fill FS datastructures with initial data |
LvdK | 7:6576a287e563 | 137 | |
LvdK | 8:422544d24df3 | 138 | // -- debug only ------------------------------------- |
LvdK | 7:6576a287e563 | 139 | SERIAL_DEBUG.baud(38400); // : set baudrate to 38400 |
LvdK | 14:5767d651d624 | 140 | SERIAL_DEBUG.printf("\n--- CDU_Mbed_30 ---\r\n"); |
LvdK | 8:422544d24df3 | 141 | // --------------------------------------------------- |
LvdK | 7:6576a287e563 | 142 | |
LvdK | 8:422544d24df3 | 143 | // Create all mbos tasks, timers and resources: |
LvdK | 8:422544d24df3 | 144 | // Tasks: |
LvdK | 7:6576a287e563 | 145 | CDU_OS.CreateTask(ALIVE_TASK_ID, ALIVE_TASK_PRIO, ALIVE_TASK_STACK_SZ, ALIVE_TASK); |
LvdK | 7:6576a287e563 | 146 | CDU_OS.CreateTask(RECEIVE_DECODE_TASK_ID, RECEIVE_DECODE_TASK_PRIO, RECEIVE_DECODE_TASK_STACK_SZ, RECEIVE_DECODE_TASK); |
LvdK | 7:6576a287e563 | 147 | CDU_OS.CreateTask(SEND_KEYMESSAGE_TASK_ID, SEND_KEYMESSAGE_TASK_PRIO, SEND_KEYMESSAGE_TASK_STACK_SZ, SEND_KEYMESSAGE_TASK); |
LvdK | 7:6576a287e563 | 148 | CDU_OS.CreateTask(CDU_DSP_CSS_TASK_ID, CDU_DSP_CSS_TASK_PRIO, CDU_DSP_CSS_TASK_STACK_SZ, CDU_DSP_CSS_TASK ); |
LvdK | 7:6576a287e563 | 149 | CDU_OS.CreateTask(READ_POT_TASK_ID, READ_POT_TASK_PRIO, READ_POT_TASK_STACK_SZ, READ_POT_TASK ); |
LvdK | 8:422544d24df3 | 150 | // Timers: |
LvdK | 7:6576a287e563 | 151 | CDU_OS.CreateTimer(READ_POT_TIMER_ID, READ_POT_TASK_ID, READ_POT_TIMER_EVENT); |
LvdK | 8:422544d24df3 | 152 | CDU_OS.CreateTimer(ALIVE_TIMER_ID, ALIVE_TASK_ID, ALIVE_EVENT); |
LvdK | 8:422544d24df3 | 153 | CDU_OS.CreateTimer(DECODE_TIMER_ID, RECEIVE_DECODE_TASK_ID, DECODE_TIMER_EVENT); |
LvdK | 8:422544d24df3 | 154 | // Resources: |
LvdK | 7:6576a287e563 | 155 | CDU_OS.CreateResource(USB_TX_RESOURCE, USB_TX_PRIO); |
LvdK | 8:422544d24df3 | 156 | CDU_OS.CreateResource(FS_DATA_RESOURCE, FS_DATA_PRIO); |
LvdK | 7:6576a287e563 | 157 | |
LvdK | 7:6576a287e563 | 158 | // Start mbos O.S with a final statement in main() : |
LvdK | 7:6576a287e563 | 159 | CDU_OS.Start(); // : MBOS is running tasks now.... |
LvdK | 8:422544d24df3 | 160 | // end of main <<---- program never reaches this point ! |
LvdK | 7:6576a287e563 | 161 | } |
LvdK | 6:e0bf3b244d7c | 162 | |
LvdK | 6:e0bf3b244d7c | 163 | void RECEIVE_DECODE_TASK(void) |
LvdK | 8:422544d24df3 | 164 | { // Mbos task triggered by mbos timer to scan USB receive buffer every 100 msec. |
LvdK | 8:422544d24df3 | 165 | // Collects and decodes data received from USB. |
LvdK | 8:422544d24df3 | 166 | CDU_OS.SetTimer( DECODE_TIMER_ID, DECODE_TIMER_PERIOD, DECODE_TIMER_PERIOD ); |
LvdK | 7:6576a287e563 | 167 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 8:422544d24df3 | 168 | CDU_OS.WaitEvent(DECODE_TIMER_EVENT ); // : wait for Mbos timer event |
LvdK | 8:422544d24df3 | 169 | // start collecting and decoding of received data: |
LvdK | 8:422544d24df3 | 170 | CDU_OS.LockResource(FS_DATA_RESOURCE); // : lock FS database |
LvdK | 6:e0bf3b244d7c | 171 | collect_FSdata(); |
LvdK | 8:422544d24df3 | 172 | CDU_OS.FreeResource(FS_DATA_RESOURCE); // : free FS database |
LvdK | 7:6576a287e563 | 173 | } |
LvdK | 6:e0bf3b244d7c | 174 | } |
LvdK | 6:e0bf3b244d7c | 175 | |
LvdK | 7:6576a287e563 | 176 | void SEND_KEYMESSAGE_TASK(void) |
LvdK | 8:422544d24df3 | 177 | { // Mbos task triggered by a KEY_EVENT ( = "CDU key pressed" ) |
LvdK | 7:6576a287e563 | 178 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 8:422544d24df3 | 179 | CDU_OS.WaitEvent(KEY_EVENT); // : wait for KEY event |
LvdK | 7:6576a287e563 | 180 | CDU_KB_GET_KEY(); // : read key from CDU keyboard |
LvdK | 7:6576a287e563 | 181 | CDU_OS.LockResource(USB_TX_RESOURCE); |
LvdK | 6:e0bf3b244d7c | 182 | Send_KEY_message(key_hit_ID); |
LvdK | 8:422544d24df3 | 183 | CDU_OS.FreeResource(USB_TX_RESOURCE); |
LvdK | 7:6576a287e563 | 184 | key_hit_ID = 0; // : reset key_hit_ID flag |
LvdK | 0:6f71ca095e78 | 185 | } |
LvdK | 6:e0bf3b244d7c | 186 | } |
LvdK | 6:e0bf3b244d7c | 187 | |
LvdK | 6:e0bf3b244d7c | 188 | void ALIVE_TASK(void) |
LvdK | 8:422544d24df3 | 189 | { // Mbos task triggered by mbos timer to send ALIVE message to FS every 5 sec. |
LvdK | 6:e0bf3b244d7c | 190 | CDU_OS.SetTimer( ALIVE_TIMER_ID, ALIVE_TIMER_PERIOD, ALIVE_TIMER_PERIOD ); |
LvdK | 6:e0bf3b244d7c | 191 | static int seconds = 0; |
LvdK | 7:6576a287e563 | 192 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 6:e0bf3b244d7c | 193 | CDU_OS.WaitEvent(ALIVE_EVENT ); // : wait for Mbos timer event (5 sec) |
LvdK | 7:6576a287e563 | 194 | seconds += 5 ; // : increase seconds by 5 |
LvdK | 7:6576a287e563 | 195 | if (seconds >= 60) seconds = 0 ; // : overflow handling |
LvdK | 7:6576a287e563 | 196 | CDU_OS.LockResource(USB_TX_RESOURCE); |
LvdK | 6:e0bf3b244d7c | 197 | Send_ALIVE_message(seconds); |
LvdK | 7:6576a287e563 | 198 | CDU_OS.FreeResource(USB_TX_RESOURCE); |
LvdK | 7:6576a287e563 | 199 | alive_led = !alive_led; // : toggle LED |
LvdK | 6:e0bf3b244d7c | 200 | } |
LvdK | 7:6576a287e563 | 201 | } |
LvdK | 6:e0bf3b244d7c | 202 | |
LvdK | 8:422544d24df3 | 203 | void CDU_DSP_CSS_TASK(void) |
LvdK | 8:422544d24df3 | 204 | { // Mbos task to read new screendata from FS datastructures and show on CDU screen. |
LvdK | 8:422544d24df3 | 205 | // Triggered by FS_DATA_EVENT ( = "new screendata available" ) |
LvdK | 7:6576a287e563 | 206 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 8:422544d24df3 | 207 | |
LvdK | 8:422544d24df3 | 208 | if (CDU_OS.TestResource(FS_DATA_RESOURCE) == 0) { |
LvdK | 8:422544d24df3 | 209 | // FS_DATA_RESOURCE is free to access. |
LvdK | 8:422544d24df3 | 210 | // Lock it to get exclusive access and prevent intermediate updates: |
LvdK | 8:422544d24df3 | 211 | CDU_OS.LockResource(FS_DATA_RESOURCE); |
LvdK | 8:422544d24df3 | 212 | CDU_OS.WaitEvent(FS_DATA_EVENT); // wait for FS_DATA_EVENT |
LvdK | 8:422544d24df3 | 213 | //test_update_flags(); // : >>>>> debug ONLY !!! |
LvdK | 8:422544d24df3 | 214 | CDU_DSP_CSS(); // : get data and show on screen |
LvdK | 8:422544d24df3 | 215 | CDU_OS.FreeResource(FS_DATA_RESOURCE); // : free FS_DATA_RESOURCE |
LvdK | 8:422544d24df3 | 216 | } |
LvdK | 8:422544d24df3 | 217 | else { |
LvdK | 8:422544d24df3 | 218 | // FS_DATA_RESOURCE is occupied, don’t read it ! |
LvdK | 8:422544d24df3 | 219 | } |
LvdK | 8:422544d24df3 | 220 | } |
LvdK | 6:e0bf3b244d7c | 221 | } |
LvdK | 7:6576a287e563 | 222 | |
LvdK | 8:422544d24df3 | 223 | |
LvdK | 7:6576a287e563 | 224 | void READ_POT_TASK(void) |
LvdK | 7:6576a287e563 | 225 | { // Mbos task started by mbos timer to scan potmeter every 100 msec |
LvdK | 8:422544d24df3 | 226 | CDU_OS.SetTimer( READ_POT_TIMER_ID, READ_POT_TIMER_PERIOD, READ_POT_TIMER_PERIOD ); |
LvdK | 7:6576a287e563 | 227 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 8:422544d24df3 | 228 | CDU_OS.WaitEvent(READ_POT_TIMER_EVENT ); // : wait for Mbos timer event |
LvdK | 7:6576a287e563 | 229 | CDU_SET_BGL_INTENSITY(255); |
LvdK | 7:6576a287e563 | 230 | } |
LvdK | 7:6576a287e563 | 231 | } |
LvdK | 7:6576a287e563 | 232 | |
LvdK | 8:422544d24df3 | 233 |