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:
Thu Sep 25 11:34:21 2014 +0000
Revision:
20:150afde94910
Parent:
17:b3545e9d38f7
Child:
21:f348e6f0f7d4
Definitive version.
; New developments started in version _36

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"
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 8:422544d24df3 14 MODSERIAL USB(USBTX, USBRX, 256, 1024);
WillemBraat 17:b3545e9d38f7 15 DigitalOut alive_led( HEARTBEAT ); // : LED 1 on Mbed board toggles when CDU is alive
LvdK 7:6576a287e563 16
LvdK 8:422544d24df3 17 //void test_update_flags(); // << for testing only << !!!!!!!
LvdK 6:e0bf3b244d7c 18
LvdK 8:422544d24df3 19 // --- Debug only ----------------------------------------
LvdK 7:6576a287e563 20 // extra serial port to show debug info :
WillemBraat 17:b3545e9d38f7 21 MODSERIAL SERIAL_DEBUG(MODSERIAL_TX, MODSERIAL_RX, 512, 64); //: tx, rx
LvdK 8:422544d24df3 22 // -------------------------------------------------------
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 8:422544d24df3 29 void set_initial_data(void); // : fill datastructures with initial data
LvdK 8:422544d24df3 30 void Send_KEY_message(int key_nr);
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 8:422544d24df3 49 // display function prototypes:
LvdK 7:6576a287e563 50 void CDU_InitDisplay(void);
LvdK 7:6576a287e563 51 void CDU_ScreenAlign(void);
LvdK 7:6576a287e563 52 void CDU_StartScreen(void);
WillemBraat 20:150afde94910 53 void CDU_LogoScreen(void);
WillemBraat 20:150afde94910 54 void CDU_TVSCreen(void);
LvdK 7:6576a287e563 55 void CDU_Page(void);
LvdK 7:6576a287e563 56 void CDU_DSP_CSS(void);
LvdK 7:6576a287e563 57 void CDU_displayclear(void);
LvdK 6:e0bf3b244d7c 58
LvdK 8:422544d24df3 59 //------ USB buffer overflow interrupt handling: -------------
LvdK 7:6576a287e563 60 void rx_buf_overflow(MODSERIAL_IRQ_INFO *q)
LvdK 8:422544d24df3 61 { // This functiom will be called when RX buffer overflows.
LvdK 7:6576a287e563 62 // Blue-Leds-of-Death will be showed on Mbed board
LvdK 7:6576a287e563 63 error("RX OVERFLOW !");
LvdK 6:e0bf3b244d7c 64 }
LvdK 6:e0bf3b244d7c 65
LvdK 7:6576a287e563 66 void tx_buf_overflow(MODSERIAL_IRQ_INFO *q)
LvdK 8:422544d24df3 67 { // This functiom will be called when TX buffer overflows.
LvdK 7:6576a287e563 68 // Blue-Leds-of-Death will be showed on Mbed board
LvdK 7:6576a287e563 69 error("RX OVERFLOW !");
LvdK 6:e0bf3b244d7c 70 }
LvdK 8:422544d24df3 71 //------------------------------------------------------------
LvdK 6:e0bf3b244d7c 72
LvdK 6:e0bf3b244d7c 73 void init_USB()
LvdK 8:422544d24df3 74 { // -- This function controls the setup for the CDU-FS USB communication --
LvdK 7:6576a287e563 75 // Function char_received() will be attached to RX interrupt.
LvdK 7:6576a287e563 76 USB.baud(38400); // : set default baudrate to 38400
LvdK 7:6576a287e563 77 USB.rxBufferFlush(); // : empty USB rx buffer in case it is not empty:
LvdK 7:6576a287e563 78 USB.txBufferFlush(); // : empty USB tx buffer in case it is not empty:
LvdK 7:6576a287e563 79 USB.attach(&rx_buf_overflow, MODSERIAL::RxOvIrq); // : attach function to call when USB RX buffer overflows
LvdK 7:6576a287e563 80 USB.attach(&tx_buf_overflow, MODSERIAL::TxOvIrq); // : attach function to call when USB TX buffer overflows
LvdK 6:e0bf3b244d7c 81 }
LvdK 7:6576a287e563 82
LvdK 7:6576a287e563 83 main() // : MBOS main()
LvdK 0:6f71ca095e78 84 {
LvdK 7:6576a287e563 85 init_USB(); // : setup USB communication to FS
LvdK 7:6576a287e563 86
LvdK 8:422544d24df3 87 // CDU keyboard initialisation and keyboard interrrupt setup:
LvdK 7:6576a287e563 88 CDU_KB_COMM_INIT();
LvdK 7:6576a287e563 89 CDU_KB_INT_START();
LvdK 7:6576a287e563 90 BGL_LED.period(0.01);
LvdK 5:99594f4ab659 91
LvdK 8:422544d24df3 92 // CDU display initialisation:
LvdK 7:6576a287e563 93 CDU_InitDisplay();
WillemBraat 20:150afde94910 94 //CDU_StartScreen();
WillemBraat 20:150afde94910 95 CDU_LogoScreen();
LvdK 8:422544d24df3 96 wait(0.2);
LvdK 8:422544d24df3 97 //CDU_Page();
LvdK 7:6576a287e563 98 CDU_ScreenAlign();
LvdK 8:422544d24df3 99
LvdK 8:422544d24df3 100 set_initial_data(); //: fill FS datastructures with initial data
LvdK 7:6576a287e563 101
LvdK 8:422544d24df3 102 // -- debug only -------------------------------------
LvdK 7:6576a287e563 103 SERIAL_DEBUG.baud(38400); // : set baudrate to 38400
LvdK 14:5767d651d624 104 SERIAL_DEBUG.printf("\n--- CDU_Mbed_30 ---\r\n");
LvdK 8:422544d24df3 105 // ---------------------------------------------------
LvdK 7:6576a287e563 106
LvdK 8:422544d24df3 107 // Create all mbos tasks, timers and resources:
LvdK 8:422544d24df3 108 // Tasks:
LvdK 7:6576a287e563 109 CDU_OS.CreateTask(ALIVE_TASK_ID, ALIVE_TASK_PRIO, ALIVE_TASK_STACK_SZ, ALIVE_TASK);
LvdK 7:6576a287e563 110 CDU_OS.CreateTask(RECEIVE_DECODE_TASK_ID, RECEIVE_DECODE_TASK_PRIO, RECEIVE_DECODE_TASK_STACK_SZ, RECEIVE_DECODE_TASK);
LvdK 7:6576a287e563 111 CDU_OS.CreateTask(SEND_KEYMESSAGE_TASK_ID, SEND_KEYMESSAGE_TASK_PRIO, SEND_KEYMESSAGE_TASK_STACK_SZ, SEND_KEYMESSAGE_TASK);
LvdK 7:6576a287e563 112 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 113 CDU_OS.CreateTask(READ_POT_TASK_ID, READ_POT_TASK_PRIO, READ_POT_TASK_STACK_SZ, READ_POT_TASK );
LvdK 8:422544d24df3 114 // Timers:
LvdK 7:6576a287e563 115 CDU_OS.CreateTimer(READ_POT_TIMER_ID, READ_POT_TASK_ID, READ_POT_TIMER_EVENT);
LvdK 8:422544d24df3 116 CDU_OS.CreateTimer(ALIVE_TIMER_ID, ALIVE_TASK_ID, ALIVE_EVENT);
LvdK 8:422544d24df3 117 CDU_OS.CreateTimer(DECODE_TIMER_ID, RECEIVE_DECODE_TASK_ID, DECODE_TIMER_EVENT);
LvdK 8:422544d24df3 118 // Resources:
LvdK 7:6576a287e563 119 CDU_OS.CreateResource(USB_TX_RESOURCE, USB_TX_PRIO);
LvdK 8:422544d24df3 120 CDU_OS.CreateResource(FS_DATA_RESOURCE, FS_DATA_PRIO);
LvdK 7:6576a287e563 121
LvdK 7:6576a287e563 122 // Start mbos O.S with a final statement in main() :
LvdK 7:6576a287e563 123 CDU_OS.Start(); // : MBOS is running tasks now....
LvdK 8:422544d24df3 124 // end of main <<---- program never reaches this point !
LvdK 7:6576a287e563 125 }
LvdK 6:e0bf3b244d7c 126
LvdK 6:e0bf3b244d7c 127 void RECEIVE_DECODE_TASK(void)
LvdK 8:422544d24df3 128 { // Mbos task triggered by mbos timer to scan USB receive buffer every 100 msec.
LvdK 8:422544d24df3 129 // Collects and decodes data received from USB.
LvdK 8:422544d24df3 130 CDU_OS.SetTimer( DECODE_TIMER_ID, DECODE_TIMER_PERIOD, DECODE_TIMER_PERIOD );
LvdK 7:6576a287e563 131 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 8:422544d24df3 132 CDU_OS.WaitEvent(DECODE_TIMER_EVENT ); // : wait for Mbos timer event
LvdK 8:422544d24df3 133 // start collecting and decoding of received data:
LvdK 8:422544d24df3 134 CDU_OS.LockResource(FS_DATA_RESOURCE); // : lock FS database
LvdK 6:e0bf3b244d7c 135 collect_FSdata();
LvdK 8:422544d24df3 136 CDU_OS.FreeResource(FS_DATA_RESOURCE); // : free FS database
LvdK 7:6576a287e563 137 }
LvdK 6:e0bf3b244d7c 138 }
LvdK 6:e0bf3b244d7c 139
LvdK 7:6576a287e563 140 void SEND_KEYMESSAGE_TASK(void)
LvdK 8:422544d24df3 141 { // Mbos task triggered by a KEY_EVENT ( = "CDU key pressed" )
LvdK 7:6576a287e563 142 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 8:422544d24df3 143 CDU_OS.WaitEvent(KEY_EVENT); // : wait for KEY event
LvdK 7:6576a287e563 144 CDU_KB_GET_KEY(); // : read key from CDU keyboard
LvdK 7:6576a287e563 145 CDU_OS.LockResource(USB_TX_RESOURCE);
LvdK 6:e0bf3b244d7c 146 Send_KEY_message(key_hit_ID);
LvdK 8:422544d24df3 147 CDU_OS.FreeResource(USB_TX_RESOURCE);
LvdK 7:6576a287e563 148 key_hit_ID = 0; // : reset key_hit_ID flag
LvdK 0:6f71ca095e78 149 }
LvdK 6:e0bf3b244d7c 150 }
LvdK 6:e0bf3b244d7c 151
LvdK 6:e0bf3b244d7c 152 void ALIVE_TASK(void)
LvdK 8:422544d24df3 153 { // Mbos task triggered by mbos timer to send ALIVE message to FS every 5 sec.
LvdK 6:e0bf3b244d7c 154 CDU_OS.SetTimer( ALIVE_TIMER_ID, ALIVE_TIMER_PERIOD, ALIVE_TIMER_PERIOD );
LvdK 6:e0bf3b244d7c 155 static int seconds = 0;
LvdK 7:6576a287e563 156 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 6:e0bf3b244d7c 157 CDU_OS.WaitEvent(ALIVE_EVENT ); // : wait for Mbos timer event (5 sec)
LvdK 7:6576a287e563 158 seconds += 5 ; // : increase seconds by 5
LvdK 7:6576a287e563 159 if (seconds >= 60) seconds = 0 ; // : overflow handling
LvdK 7:6576a287e563 160 CDU_OS.LockResource(USB_TX_RESOURCE);
LvdK 6:e0bf3b244d7c 161 Send_ALIVE_message(seconds);
LvdK 7:6576a287e563 162 CDU_OS.FreeResource(USB_TX_RESOURCE);
LvdK 7:6576a287e563 163 alive_led = !alive_led; // : toggle LED
LvdK 6:e0bf3b244d7c 164 }
LvdK 7:6576a287e563 165 }
LvdK 6:e0bf3b244d7c 166
LvdK 8:422544d24df3 167 void CDU_DSP_CSS_TASK(void)
LvdK 8:422544d24df3 168 { // Mbos task to read new screendata from FS datastructures and show on CDU screen.
LvdK 8:422544d24df3 169 // Triggered by FS_DATA_EVENT ( = "new screendata available" )
LvdK 7:6576a287e563 170 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 8:422544d24df3 171
LvdK 8:422544d24df3 172 if (CDU_OS.TestResource(FS_DATA_RESOURCE) == 0) {
LvdK 8:422544d24df3 173 // FS_DATA_RESOURCE is free to access.
LvdK 8:422544d24df3 174 // Lock it to get exclusive access and prevent intermediate updates:
LvdK 8:422544d24df3 175 CDU_OS.LockResource(FS_DATA_RESOURCE);
LvdK 8:422544d24df3 176 CDU_OS.WaitEvent(FS_DATA_EVENT); // wait for FS_DATA_EVENT
LvdK 8:422544d24df3 177 //test_update_flags(); // : >>>>> debug ONLY !!!
LvdK 8:422544d24df3 178 CDU_DSP_CSS(); // : get data and show on screen
LvdK 8:422544d24df3 179 CDU_OS.FreeResource(FS_DATA_RESOURCE); // : free FS_DATA_RESOURCE
LvdK 8:422544d24df3 180 }
LvdK 8:422544d24df3 181 else {
LvdK 8:422544d24df3 182 // FS_DATA_RESOURCE is occupied, don’t read it !
LvdK 8:422544d24df3 183 }
LvdK 8:422544d24df3 184 }
LvdK 6:e0bf3b244d7c 185 }
LvdK 7:6576a287e563 186
LvdK 8:422544d24df3 187
LvdK 7:6576a287e563 188 void READ_POT_TASK(void)
LvdK 7:6576a287e563 189 { // Mbos task started by mbos timer to scan potmeter every 100 msec
LvdK 8:422544d24df3 190 CDU_OS.SetTimer( READ_POT_TIMER_ID, READ_POT_TIMER_PERIOD, READ_POT_TIMER_PERIOD );
LvdK 7:6576a287e563 191 while(1) { // : loop forever because it is a mbos taskfunction
LvdK 8:422544d24df3 192 CDU_OS.WaitEvent(READ_POT_TIMER_EVENT ); // : wait for Mbos timer event
LvdK 7:6576a287e563 193 CDU_SET_BGL_INTENSITY(255);
LvdK 7:6576a287e563 194 }
LvdK 7:6576a287e563 195 }
LvdK 7:6576a287e563 196
LvdK 8:422544d24df3 197