replaces CDU_Mbed_26

Dependencies:   4DGL MODSERIAL mbed mbos

Fork of CDU_Mbed_26 by Engravity-CDU

Committer:
WillemBraat
Date:
Tue Aug 26 14:18:39 2014 +0000
Revision:
17:b3545e9d38f7
Parent:
14:5767d651d624
All pin-definitions are driven by pins.h

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