New work version with additional functions

Dependencies:   4DGL-UC ConfigFile MODSERIAL mbed mbos

Fork of CDU_Mbed_35 by Engravity-CDU

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?

UserRevisionLine numberNew 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