Modifications in 4DGL library. Added CDU_hw_sw.h for version info. Added pins.h for hardware pin remapping
Dependencies: 4DGL-UC MODSERIAL mbed mbos
Fork of CDU_Mbed_30 by
main.cpp@7:6576a287e563, 2014-07-17 (annotated)
- Committer:
- LvdK
- Date:
- Thu Jul 17 10:09:14 2014 +0000
- Revision:
- 7:6576a287e563
- Parent:
- 6:e0bf3b244d7c
- Child:
- 8:422544d24df3
CDU V21
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 | 7:6576a287e563 | 3 | // Version 21 |
LvdK | 7:6576a287e563 | 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 | 7:6576a287e563 | 9 | #include "debug_lvdk.h" // : debug mode control LvdK |
LvdK | 7:6576a287e563 | 10 | #include "mbos_def.h" // : Mbos tasks, timer and resource definitions |
LvdK | 6:e0bf3b244d7c | 11 | |
LvdK | 7:6576a287e563 | 12 | // Setup USB communication defined by Mbed USB TX and RX lines |
LvdK | 7:6576a287e563 | 13 | // with TX and RX ringbuffers : |
LvdK | 7:6576a287e563 | 14 | MODSERIAL USB(USBTX, USBRX, 256, 512); |
LvdK | 7:6576a287e563 | 15 | DigitalOut alive_led(LED1); // : LED 1 on Mbed board toggles when CDU is alive |
LvdK | 7:6576a287e563 | 16 | |
LvdK | 7:6576a287e563 | 17 | //DigitalOut test_led(LED4); // : LED 4 on Mbed board <<<<<<<< TEST LED !!! |
LvdK | 6:e0bf3b244d7c | 18 | |
LvdK | 7:6576a287e563 | 19 | void test_update_flags(); // << for testing only << !!!!!!! |
LvdK | 7:6576a287e563 | 20 | |
LvdK | 7:6576a287e563 | 21 | // extra serial port to show debug info : |
LvdK | 7:6576a287e563 | 22 | MODSERIAL SERIAL_DEBUG(p9, p10, 1024, 64); //: tx, rx |
LvdK | 7:6576a287e563 | 23 | |
LvdK | 6:e0bf3b244d7c | 24 | int CDU_FS_interface = 0; // : defines interface to FS: 0 = USB, 1 = Ethernet |
LvdK | 7:6576a287e563 | 25 | extern int key_hit_ID; |
LvdK | 7:6576a287e563 | 26 | extern PwmOut BGL_LED; |
LvdK | 0:6f71ca095e78 | 27 | |
LvdK | 7:6576a287e563 | 28 | void init_USB(void); |
LvdK | 7:6576a287e563 | 29 | void set_initial_data(); // : fill datastructures with initial data |
LvdK | 7:6576a287e563 | 30 | void Send_KEY_message(int button); |
LvdK | 6:e0bf3b244d7c | 31 | void Send_ALIVE_message(int seconds); |
LvdK | 6:e0bf3b244d7c | 32 | void collect_FSdata(); |
LvdK | 6:e0bf3b244d7c | 33 | |
LvdK | 7:6576a287e563 | 34 | mbos CDU_OS( 9, 5, 5); // : instantiate mbos O.S (tasks, timers, resources) |
LvdK | 6:e0bf3b244d7c | 35 | |
LvdK | 7:6576a287e563 | 36 | // Task function prototypes: |
LvdK | 7:6576a287e563 | 37 | void ALIVE_TASK(void); |
LvdK | 7:6576a287e563 | 38 | void RECEIVE_DECODE_TASK(void); |
LvdK | 7:6576a287e563 | 39 | void SEND_KEYMESSAGE_TASK(void); |
LvdK | 7:6576a287e563 | 40 | void CDU_DSP_CSS_TASK(void); |
LvdK | 7:6576a287e563 | 41 | void READ_POT_TASK(void); |
LvdK | 6:e0bf3b244d7c | 42 | |
LvdK | 7:6576a287e563 | 43 | // keyboard function prototypes: |
LvdK | 7:6576a287e563 | 44 | void CDU_KB_COMM_INIT(void); |
LvdK | 7:6576a287e563 | 45 | void CDU_KB_INT_START(void); |
LvdK | 7:6576a287e563 | 46 | void CDU_KB_GET_KEY(void); |
LvdK | 7:6576a287e563 | 47 | void CDU_SET_BGL_INTENSITY(int); |
LvdK | 6:e0bf3b244d7c | 48 | |
LvdK | 7:6576a287e563 | 49 | // display function prototype: |
LvdK | 7:6576a287e563 | 50 | void CDU_InitDisplay(void); |
LvdK | 7:6576a287e563 | 51 | void CDU_ScreenAlign(void); |
LvdK | 7:6576a287e563 | 52 | void CDU_StartScreen(void); |
LvdK | 7:6576a287e563 | 53 | void CDU_Page(void); |
LvdK | 7:6576a287e563 | 54 | void CDU_DSP_CSS(void); |
LvdK | 7:6576a287e563 | 55 | void CDU_displayclear(void); |
LvdK | 6:e0bf3b244d7c | 56 | |
LvdK | 6:e0bf3b244d7c | 57 | |
LvdK | 7:6576a287e563 | 58 | void char_received(MODSERIAL_IRQ_INFO *q) |
LvdK | 7:6576a287e563 | 59 | { |
LvdK | 7:6576a287e563 | 60 | // -- This functiom will be called on EACH USB receive interrupt -- |
LvdK | 7:6576a287e563 | 61 | // It only sets an mbos Event: |
LvdK | 6:e0bf3b244d7c | 62 | CDU_OS.SetEvent(RX_EVENT,RECEIVE_DECODE_TASK_ID); // : set event flag for Read Serial Task |
LvdK | 6:e0bf3b244d7c | 63 | } |
LvdK | 6:e0bf3b244d7c | 64 | |
LvdK | 7:6576a287e563 | 65 | //------------ USB error interrupts ---------------------------------- |
LvdK | 7:6576a287e563 | 66 | void rx_buf_overflow(MODSERIAL_IRQ_INFO *q) |
LvdK | 7:6576a287e563 | 67 | { |
LvdK | 7:6576a287e563 | 68 | // This functiom will be called when RX buffer overflows. |
LvdK | 7:6576a287e563 | 69 | // Blue-Leds-of-Death will be showed on Mbed board |
LvdK | 7:6576a287e563 | 70 | error("RX OVERFLOW !"); |
LvdK | 6:e0bf3b244d7c | 71 | } |
LvdK | 6:e0bf3b244d7c | 72 | |
LvdK | 7:6576a287e563 | 73 | void tx_buf_overflow(MODSERIAL_IRQ_INFO *q) |
LvdK | 7:6576a287e563 | 74 | { |
LvdK | 7:6576a287e563 | 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 | 7:6576a287e563 | 79 | //-------------------------------------------------------------------- |
LvdK | 6:e0bf3b244d7c | 80 | |
LvdK | 6:e0bf3b244d7c | 81 | void init_USB() |
LvdK | 7:6576a287e563 | 82 | { |
LvdK | 7:6576a287e563 | 83 | // -- This function controls the setup for the CDU-FS USB communication -- |
LvdK | 7:6576a287e563 | 84 | // Function char_received() will be attached to RX interrupt. |
LvdK | 7:6576a287e563 | 85 | USB.baud(38400); // : set default baudrate to 38400 |
LvdK | 7:6576a287e563 | 86 | USB.rxBufferFlush(); // : empty USB rx buffer in case it is not empty: |
LvdK | 7:6576a287e563 | 87 | USB.txBufferFlush(); // : empty USB tx buffer in case it is not empty: |
LvdK | 7:6576a287e563 | 88 | USB.attach(&char_received, MODSERIAL::RxIrq); // : attach function char_received to USB RX inerrupt |
LvdK | 7:6576a287e563 | 89 | USB.attach(&rx_buf_overflow, MODSERIAL::RxOvIrq); // : attach function to call when USB RX buffer overflows |
LvdK | 7:6576a287e563 | 90 | USB.attach(&tx_buf_overflow, MODSERIAL::TxOvIrq); // : attach function to call when USB TX buffer overflows |
LvdK | 6:e0bf3b244d7c | 91 | } |
LvdK | 7:6576a287e563 | 92 | |
LvdK | 7:6576a287e563 | 93 | main() // : MBOS main() |
LvdK | 0:6f71ca095e78 | 94 | { |
LvdK | 7:6576a287e563 | 95 | init_USB(); // : setup USB communication to FS |
LvdK | 7:6576a287e563 | 96 | |
LvdK | 7:6576a287e563 | 97 | // Keyboard initialisation and keyboard interrrupt setup: |
LvdK | 7:6576a287e563 | 98 | CDU_KB_COMM_INIT(); |
LvdK | 7:6576a287e563 | 99 | CDU_KB_INT_START(); |
LvdK | 7:6576a287e563 | 100 | BGL_LED.period(0.01); |
LvdK | 5:99594f4ab659 | 101 | |
LvdK | 7:6576a287e563 | 102 | // Display initialisation: |
LvdK | 7:6576a287e563 | 103 | CDU_InitDisplay(); |
LvdK | 7:6576a287e563 | 104 | CDU_StartScreen(); |
LvdK | 7:6576a287e563 | 105 | wait(1); |
LvdK | 7:6576a287e563 | 106 | CDU_Page(); |
LvdK | 7:6576a287e563 | 107 | CDU_ScreenAlign(); |
LvdK | 7:6576a287e563 | 108 | wait(1); |
LvdK | 7:6576a287e563 | 109 | |
LvdK | 7:6576a287e563 | 110 | |
LvdK | 7:6576a287e563 | 111 | set_initial_data(); //: fill FS datastructures with initial (dummy) data |
LvdK | 7:6576a287e563 | 112 | |
LvdK | 7:6576a287e563 | 113 | #ifdef DEBUG_LVDK |
LvdK | 7:6576a287e563 | 114 | //------------------ Testing only ! ---------------------------------- |
LvdK | 7:6576a287e563 | 115 | init_buttons_Mbed(); |
LvdK | 7:6576a287e563 | 116 | USB.printf("\n--- CDU_Mbed_21 ---\r\n"); |
LvdK | 7:6576a287e563 | 117 | #endif |
LvdK | 7:6576a287e563 | 118 | //--------------------------------------------------------------------- |
LvdK | 7:6576a287e563 | 119 | |
LvdK | 7:6576a287e563 | 120 | SERIAL_DEBUG.baud(38400); // : set baudrate to 38400 |
LvdK | 7:6576a287e563 | 121 | SERIAL_DEBUG.printf("\n--- CDU_Mbed_21 ---\r\n"); |
LvdK | 7:6576a287e563 | 122 | |
LvdK | 7:6576a287e563 | 123 | // Create all tasks and timers: |
LvdK | 7:6576a287e563 | 124 | CDU_OS.CreateTask(ALIVE_TASK_ID, ALIVE_TASK_PRIO, ALIVE_TASK_STACK_SZ, ALIVE_TASK); |
LvdK | 7:6576a287e563 | 125 | CDU_OS.CreateTask(RECEIVE_DECODE_TASK_ID, RECEIVE_DECODE_TASK_PRIO, RECEIVE_DECODE_TASK_STACK_SZ, RECEIVE_DECODE_TASK); |
LvdK | 7:6576a287e563 | 126 | CDU_OS.CreateTask(SEND_KEYMESSAGE_TASK_ID, SEND_KEYMESSAGE_TASK_PRIO, SEND_KEYMESSAGE_TASK_STACK_SZ, SEND_KEYMESSAGE_TASK); |
LvdK | 7:6576a287e563 | 127 | 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 | 128 | CDU_OS.CreateTimer(ALIVE_TIMER_ID, ALIVE_TASK_ID, ALIVE_EVENT); |
LvdK | 7:6576a287e563 | 129 | CDU_OS.CreateTask(READ_POT_TASK_ID, READ_POT_TASK_PRIO, READ_POT_TASK_STACK_SZ, READ_POT_TASK ); |
LvdK | 7:6576a287e563 | 130 | CDU_OS.CreateTimer(READ_POT_TIMER_ID, READ_POT_TASK_ID, READ_POT_TIMER_EVENT); |
LvdK | 7:6576a287e563 | 131 | |
LvdK | 7:6576a287e563 | 132 | // Create resources: |
LvdK | 7:6576a287e563 | 133 | CDU_OS.CreateResource(USB_TX_RESOURCE, USB_TX_PRIO); |
LvdK | 7:6576a287e563 | 134 | CDU_OS.CreateResource(FS_DATA_RESOURCE, FS_DATA_PRIO); // : highest prio ! |
LvdK | 7:6576a287e563 | 135 | |
LvdK | 7:6576a287e563 | 136 | // Start mbos O.S with a final statement in main() : |
LvdK | 7:6576a287e563 | 137 | CDU_OS.Start(); // : MBOS is running tasks now.... |
LvdK | 7:6576a287e563 | 138 | // end of main , program never reaches this point ! |
LvdK | 7:6576a287e563 | 139 | } |
LvdK | 6:e0bf3b244d7c | 140 | |
LvdK | 6:e0bf3b244d7c | 141 | void RECEIVE_DECODE_TASK(void) |
LvdK | 7:6576a287e563 | 142 | { // Task waits for RX_EVENT, then |
LvdK | 7:6576a287e563 | 143 | // collects and decodes data from FS |
LvdK | 7:6576a287e563 | 144 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 6:e0bf3b244d7c | 145 | CDU_OS.WaitEvent(RX_EVENT); // : wait for RX event |
LvdK | 6:e0bf3b244d7c | 146 | collect_FSdata(); |
LvdK | 7:6576a287e563 | 147 | } |
LvdK | 6:e0bf3b244d7c | 148 | } |
LvdK | 6:e0bf3b244d7c | 149 | |
LvdK | 7:6576a287e563 | 150 | void SEND_KEYMESSAGE_TASK(void) |
LvdK | 6:e0bf3b244d7c | 151 | { |
LvdK | 7:6576a287e563 | 152 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 7:6576a287e563 | 153 | CDU_OS.WaitEvent(KEY_EVENT); // : wait for KEY event ( = "CDU key pressed" ) |
LvdK | 7:6576a287e563 | 154 | CDU_KB_GET_KEY(); // : read key from CDU keyboard |
LvdK | 7:6576a287e563 | 155 | CDU_OS.LockResource(USB_TX_RESOURCE); |
LvdK | 6:e0bf3b244d7c | 156 | Send_KEY_message(key_hit_ID); |
LvdK | 7:6576a287e563 | 157 | key_hit_ID = 0; // : reset key_hit_ID flag |
LvdK | 7:6576a287e563 | 158 | CDU_OS.FreeResource(USB_TX_RESOURCE); |
LvdK | 0:6f71ca095e78 | 159 | } |
LvdK | 6:e0bf3b244d7c | 160 | } |
LvdK | 6:e0bf3b244d7c | 161 | |
LvdK | 6:e0bf3b244d7c | 162 | void ALIVE_TASK(void) |
LvdK | 7:6576a287e563 | 163 | { |
LvdK | 7:6576a287e563 | 164 | // Mbos task started by mbos timer to send ALIVE message to FS every 5 sec. |
LvdK | 6:e0bf3b244d7c | 165 | CDU_OS.SetTimer( ALIVE_TIMER_ID, ALIVE_TIMER_PERIOD, ALIVE_TIMER_PERIOD ); |
LvdK | 6:e0bf3b244d7c | 166 | static int seconds = 0; |
LvdK | 7:6576a287e563 | 167 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 6:e0bf3b244d7c | 168 | CDU_OS.WaitEvent(ALIVE_EVENT ); // : wait for Mbos timer event (5 sec) |
LvdK | 7:6576a287e563 | 169 | seconds += 5 ; // : increase seconds by 5 |
LvdK | 7:6576a287e563 | 170 | if (seconds >= 60) seconds = 0 ; // : overflow handling |
LvdK | 7:6576a287e563 | 171 | CDU_OS.LockResource(USB_TX_RESOURCE); |
LvdK | 6:e0bf3b244d7c | 172 | Send_ALIVE_message(seconds); |
LvdK | 7:6576a287e563 | 173 | CDU_OS.FreeResource(USB_TX_RESOURCE); |
LvdK | 7:6576a287e563 | 174 | alive_led = !alive_led; // : toggle LED |
LvdK | 6:e0bf3b244d7c | 175 | } |
LvdK | 7:6576a287e563 | 176 | } |
LvdK | 6:e0bf3b244d7c | 177 | |
LvdK | 7:6576a287e563 | 178 | void CDU_DSP_CSS_TASK(void) // : read new screendata from FS datastructures |
LvdK | 7:6576a287e563 | 179 | { |
LvdK | 7:6576a287e563 | 180 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 7:6576a287e563 | 181 | CDU_OS.WaitEvent(FS_DATA_EVENT); |
LvdK | 7:6576a287e563 | 182 | CDU_OS.LockResource(FS_DATA_RESOURCE); //lock resource to prevent intermediate updates |
LvdK | 7:6576a287e563 | 183 | |
LvdK | 7:6576a287e563 | 184 | //test_update_flags(); // : >>>>>>>>>>>>>>>>>>>>> LvdK TEST ONLY !!! |
LvdK | 7:6576a287e563 | 185 | |
LvdK | 7:6576a287e563 | 186 | CDU_DSP_CSS(); |
LvdK | 7:6576a287e563 | 187 | |
LvdK | 7:6576a287e563 | 188 | CDU_OS.FreeResource(FS_DATA_RESOURCE); //free resource |
LvdK | 7:6576a287e563 | 189 | } |
LvdK | 6:e0bf3b244d7c | 190 | } |
LvdK | 7:6576a287e563 | 191 | |
LvdK | 7:6576a287e563 | 192 | void READ_POT_TASK(void) |
LvdK | 7:6576a287e563 | 193 | { // Mbos task started by mbos timer to scan potmeter every 100 msec |
LvdK | 7:6576a287e563 | 194 | CDU_OS.SetTimer( READ_POT_TIMER_ID, READ_POT_TIMER_PERIOD, READ_POT_TIMER_PERIOD ); |
LvdK | 7:6576a287e563 | 195 | |
LvdK | 7:6576a287e563 | 196 | while(1) { // : loop forever because it is a mbos taskfunction |
LvdK | 7:6576a287e563 | 197 | CDU_OS.WaitEvent(READ_POT_TIMER_EVENT ); // : scan potmeter every 100msec |
LvdK | 7:6576a287e563 | 198 | CDU_SET_BGL_INTENSITY(255); |
LvdK | 7:6576a287e563 | 199 | } |
LvdK | 7:6576a287e563 | 200 | } |
LvdK | 7:6576a287e563 | 201 |