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 Engravity-CDU

Committer:
WillemBraat
Date:
Fri Oct 10 18:23:36 2014 +0000
Revision:
21:f348e6f0f7d4
Parent:
20:150afde94910
Additional files: CDU_Maintenance.cpp / mbps_def3.h
; Rewrite of main() function for power checks

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