voor willem test
Dependencies: 4DGL MODSERIAL mbed mbos
Diff: main.cpp
- Revision:
- 7:6576a287e563
- Parent:
- 6:e0bf3b244d7c
--- a/main.cpp Tue Jan 29 14:54:14 2013 +0000 +++ b/main.cpp Thu Jul 17 10:09:14 2014 +0000 @@ -1,178 +1,201 @@ -// L. van der Kolk, ELVEDEKA, Holland // -// File: main.cpp Mbos O.S testversion +// L. van der Kolk, W.Braat +// File: main.cpp +// Version 21 +// ---------------------------- #include "mbed.h" #include "MODSERIAL.h" #include "mbos.h" +#include "debug_lvdk.h" // : debug mode control LvdK +#include "mbos_def.h" // : Mbos tasks, timer and resource definitions -//-------------------------------------------------------------------------------- -#include "TextLCD.h" // < LCD connected for testing only << ! -TextLCD lcd(p8, p9, p10, p11, p12, p13); // rs, e, d4-d7 << for testing only << ! -//-------------------------------------------------------------------------------- +// Setup USB communication defined by Mbed USB TX and RX lines +// with TX and RX ringbuffers : +MODSERIAL USB(USBTX, USBRX, 256, 512); +DigitalOut alive_led(LED1); // : LED 1 on Mbed board toggles when CDU is alive + +//DigitalOut test_led(LED4); // : LED 4 on Mbed board <<<<<<<< TEST LED !!! -DigitalOut led1(LED1); // : LED 1 on Mbed board toggles when CDU is alive - -extern MODSERIAL USB; -extern int key_hit_ID; +void test_update_flags(); // << for testing only << !!!!!!! + +// extra serial port to show debug info : +MODSERIAL SERIAL_DEBUG(p9, p10, 1024, 64); //: tx, rx + int CDU_FS_interface = 0; // : defines interface to FS: 0 = USB, 1 = Ethernet +extern int key_hit_ID; +extern PwmOut BGL_LED; -void init_USB(); -void set_initial_CDU_screen(); -void Send_KEY_message(int button); +void init_USB(void); +void set_initial_data(); // : fill datastructures with initial data +void Send_KEY_message(int button); void Send_ALIVE_message(int seconds); void collect_FSdata(); -//---------------------------------------------------------------- -void init_buttons_Mbed(); // << for testing only << ! -void scan_buttons_Mbed(); // << for testing only << ! -//---------------------------------------------------------------- +mbos CDU_OS( 9, 5, 5); // : instantiate mbos O.S (tasks, timers, resources) -// ALIVE_TASK properties: -#define ALIVE_TASK_ID 1 -#define ALIVE_TASK_PRIO 50 -#define ALIVE_TASK_STACK_SZ 100 // : must be 100 to prevent stack overflow error! - -// ALIVE_TIMER properties: -#define ALIVE_TIMER_ID 1 -#define ALIVE_TIMER_PERIOD 500 // = 5 sec - -// RECEIVE_DECODE_TASK properties: -#define RECEIVE_DECODE_TASK_ID 2 -#define RECEIVE_DECODE_TASK_PRIO 80 -#define RECEIVE_DECODE_TASK_STACK_SZ 256 // : must be 256 to prevent stack overflow error! +// Task function prototypes: +void ALIVE_TASK(void); +void RECEIVE_DECODE_TASK(void); +void SEND_KEYMESSAGE_TASK(void); +void CDU_DSP_CSS_TASK(void); +void READ_POT_TASK(void); -// SEND_KEYMESSAGE_TASK properties: -#define SEND_KEYMESSAGE_TASK_ID 3 -#define SEND_KEYMESSAGE_TASK_PRIO 60 -#define SEND_KEYMESSAGE_TASK_STACK_SZ 100 // : must be 100 to prevent stack overflow error! - -//------------------------------ LvdK button scan -------------- -// SCAN_KEYS_TASK properties: -#define SCAN_KEYS_TASK_ID 4 -#define SCAN_KEYS_TASK_PRIO 85 -#define SCAN_KEYS_TASK_STACK_SZ 100 +// keyboard function prototypes: +void CDU_KB_COMM_INIT(void); +void CDU_KB_INT_START(void); +void CDU_KB_GET_KEY(void); +void CDU_SET_BGL_INTENSITY(int); -// SCAN_KEYS_TIMER properties: ( LvdK button scan ) -#define SCAN_KEYS_TIMER_ID 2 -#define SCAN_KEYS_TIMER_PERIOD 50 // = 50msec -//---------------------------------------------------------------- - -// Mbos EVENTS: -#define ALIVE_EVENT 1 -#define RX_EVENT 2 // : Event flag caused by serial RX interrupt -#define KEY_EVENT 4 -#define SCAN_KEYS_TIMER_EVENT 8 // : LvdK button scan timer event - -// Mbos resources: -#define USB_TX_RESOURCE 1 // : for locking USB TX buffer -#define USB_TX_PRIO 95 // : USB TX resource priority ( = highest! ) +// display function prototype: +void CDU_InitDisplay(void); +void CDU_ScreenAlign(void); +void CDU_StartScreen(void); +void CDU_Page(void); +void CDU_DSP_CSS(void); +void CDU_displayclear(void); -mbos CDU_OS( 8, 6, 5); //instantiate mbos O.S (tasks, timers, resources) - - // Task function prototypes: - void ALIVE_TASK(void); - void RECEIVE_DECODE_TASK(void); - void SCAN_KEYS_TASK(void); - void SEND_KEYMESSAGE_TASK(void); - - void char_received(MODSERIAL_IRQ_INFO *q) { - // -- This functiom will be called on EACH rx interrupt -- - // Note: this is Rx interrupt handling, NOT a mbos task. - // It only set an mbos Event. +void char_received(MODSERIAL_IRQ_INFO *q) +{ + // -- This functiom will be called on EACH USB receive interrupt -- + // It only sets an mbos Event: CDU_OS.SetEvent(RX_EVENT,RECEIVE_DECODE_TASK_ID); // : set event flag for Read Serial Task } -//------------ USB error handling ------------------------------------------------------------ -void rx_buf_overflow(MODSERIAL_IRQ_INFO *q) { - // This functiom will be called when RX buffer overflows - // Blue-Leds-of-Death will be showed, USB is dead so message itself will not be seen ! - error("RX OVERFLOW !"); +//------------ USB error interrupts ---------------------------------- +void rx_buf_overflow(MODSERIAL_IRQ_INFO *q) +{ + // This functiom will be called when RX buffer overflows. + // Blue-Leds-of-Death will be showed on Mbed board + error("RX OVERFLOW !"); } -void tx_buf_overflow(MODSERIAL_IRQ_INFO *q) { - // This functiom will be called when TX buffer overflows - // Blue-Leds-of-Death will be showed, USB is dead so message itself will not be seen ! - error("TX OVERFLOW !"); +void tx_buf_overflow(MODSERIAL_IRQ_INFO *q) +{ + // This functiom will be called when TX buffer overflows. + // Blue-Leds-of-Death will be showed on Mbed board + error("RX OVERFLOW !"); } -//--------------------------------------------------------------------------------------------- +//-------------------------------------------------------------------- void init_USB() -{ // -- This function controls the setup for the CDU-FS USB communication -- - // Function char_received() is attached to Rx interrupt. - USB.baud(38400); // allways set default baudrate to 38400 - USB.attach(&char_received, MODSERIAL::RxIrq); // : attach function char_received to RX inerrupt - USB.attach(&rx_buf_overflow, MODSERIAL::RxOvIrq); //: attach function to call when RX buffer overflows - USB.attach(&tx_buf_overflow, MODSERIAL::TxOvIrq); //: attach function to call when TX buffer overflows +{ + // -- This function controls the setup for the CDU-FS USB communication -- + // Function char_received() will be attached to RX interrupt. + USB.baud(38400); // : set default baudrate to 38400 + USB.rxBufferFlush(); // : empty USB rx buffer in case it is not empty: + USB.txBufferFlush(); // : empty USB tx buffer in case it is not empty: + USB.attach(&char_received, MODSERIAL::RxIrq); // : attach function char_received to USB RX inerrupt + USB.attach(&rx_buf_overflow, MODSERIAL::RxOvIrq); // : attach function to call when USB RX buffer overflows + USB.attach(&tx_buf_overflow, MODSERIAL::TxOvIrq); // : attach function to call when USB TX buffer overflows } - -main() + +main() // : MBOS main() { - init_USB(); // : setup USB communication - set_initial_CDU_screen(); - - //------------------ for testing only ! ---------------------------------- - init_buttons_Mbed(); - lcd.cls(); // : clear LCD display - lcd.printf("CDU USB Mbos\n"); - USB.printf("\n--- CDU USB Mbos ---\n"); - //------------------------------------------------------------------------ + init_USB(); // : setup USB communication to FS + + // Keyboard initialisation and keyboard interrrupt setup: + CDU_KB_COMM_INIT(); + CDU_KB_INT_START(); + BGL_LED.period(0.01); - // Configure all tasks, timers and resources: - CDU_OS.CreateTask(ALIVE_TASK_ID, ALIVE_TASK_PRIO, ALIVE_TASK_STACK_SZ, ALIVE_TASK); - CDU_OS.CreateTask(RECEIVE_DECODE_TASK_ID, RECEIVE_DECODE_TASK_PRIO, RECEIVE_DECODE_TASK_STACK_SZ, RECEIVE_DECODE_TASK); - CDU_OS.CreateTask(SEND_KEYMESSAGE_TASK_ID, SEND_KEYMESSAGE_TASK_PRIO, SEND_KEYMESSAGE_TASK_STACK_SZ, SEND_KEYMESSAGE_TASK); - CDU_OS.CreateTask(SCAN_KEYS_TASK_ID, SCAN_KEYS_TASK_PRIO, SCAN_KEYS_TASK_STACK_SZ, SCAN_KEYS_TASK ); - CDU_OS.CreateTimer(ALIVE_TIMER_ID, ALIVE_TASK_ID, ALIVE_EVENT); - CDU_OS.CreateTimer(SCAN_KEYS_TIMER_ID, SCAN_KEYS_TASK_ID, SCAN_KEYS_TIMER_EVENT); - CDU_OS.CreateResource(USB_TX_RESOURCE, USB_TX_PRIO); - //CDU_OS.CreateTask(TASK4_ID, TASK4_PRIO, TASK4_STACK_SZ, task4); - - // Start mbos O.S with final statement in main() : - CDU_OS.Start(); // : will never return! -} + // Display initialisation: + CDU_InitDisplay(); + CDU_StartScreen(); + wait(1); + CDU_Page(); + CDU_ScreenAlign(); + wait(1); + + + set_initial_data(); //: fill FS datastructures with initial (dummy) data + +#ifdef DEBUG_LVDK + //------------------ Testing only ! ---------------------------------- + init_buttons_Mbed(); + USB.printf("\n--- CDU_Mbed_21 ---\r\n"); +#endif + //--------------------------------------------------------------------- + + SERIAL_DEBUG.baud(38400); // : set baudrate to 38400 + SERIAL_DEBUG.printf("\n--- CDU_Mbed_21 ---\r\n"); + + // Create all tasks and timers: + CDU_OS.CreateTask(ALIVE_TASK_ID, ALIVE_TASK_PRIO, ALIVE_TASK_STACK_SZ, ALIVE_TASK); + CDU_OS.CreateTask(RECEIVE_DECODE_TASK_ID, RECEIVE_DECODE_TASK_PRIO, RECEIVE_DECODE_TASK_STACK_SZ, RECEIVE_DECODE_TASK); + CDU_OS.CreateTask(SEND_KEYMESSAGE_TASK_ID, SEND_KEYMESSAGE_TASK_PRIO, SEND_KEYMESSAGE_TASK_STACK_SZ, SEND_KEYMESSAGE_TASK); + CDU_OS.CreateTask(CDU_DSP_CSS_TASK_ID, CDU_DSP_CSS_TASK_PRIO, CDU_DSP_CSS_TASK_STACK_SZ, CDU_DSP_CSS_TASK ); + CDU_OS.CreateTimer(ALIVE_TIMER_ID, ALIVE_TASK_ID, ALIVE_EVENT); + CDU_OS.CreateTask(READ_POT_TASK_ID, READ_POT_TASK_PRIO, READ_POT_TASK_STACK_SZ, READ_POT_TASK ); + CDU_OS.CreateTimer(READ_POT_TIMER_ID, READ_POT_TASK_ID, READ_POT_TIMER_EVENT); + + // Create resources: + CDU_OS.CreateResource(USB_TX_RESOURCE, USB_TX_PRIO); + CDU_OS.CreateResource(FS_DATA_RESOURCE, FS_DATA_PRIO); // : highest prio ! + + // Start mbos O.S with a final statement in main() : + CDU_OS.Start(); // : MBOS is running tasks now.... + // end of main , program never reaches this point ! +} void RECEIVE_DECODE_TASK(void) -{ // Task waits for RX_EVENT, then - // collects and decodes data from FS - while(1){ +{ // Task waits for RX_EVENT, then + // collects and decodes data from FS + while(1) { // : loop forever because it is a mbos taskfunction CDU_OS.WaitEvent(RX_EVENT); // : wait for RX event collect_FSdata(); - } + } } -void SEND_KEYMESSAGE_TASK(void) +void SEND_KEYMESSAGE_TASK(void) { - while(1){ - CDU_OS.WaitEvent(KEY_EVENT); // : wait for KEY event ( = CDU key pressed ) + while(1) { // : loop forever because it is a mbos taskfunction + CDU_OS.WaitEvent(KEY_EVENT); // : wait for KEY event ( = "CDU key pressed" ) + CDU_KB_GET_KEY(); // : read key from CDU keyboard + CDU_OS.LockResource(USB_TX_RESOURCE); Send_KEY_message(key_hit_ID); - key_hit_ID = 0; // : reset Id flag + key_hit_ID = 0; // : reset key_hit_ID flag + CDU_OS.FreeResource(USB_TX_RESOURCE); } } void ALIVE_TASK(void) -{ // Mbos task started by mbos timer to send ALIVE message to FS every 5 sec. +{ + // Mbos task started by mbos timer to send ALIVE message to FS every 5 sec. CDU_OS.SetTimer( ALIVE_TIMER_ID, ALIVE_TIMER_PERIOD, ALIVE_TIMER_PERIOD ); static int seconds = 0; - while(1){ // : loop forever because it is a mbos taskfunction + while(1) { // : loop forever because it is a mbos taskfunction CDU_OS.WaitEvent(ALIVE_EVENT ); // : wait for Mbos timer event (5 sec) - seconds += 5 ; // : increase seconds by 5 - if (seconds >= 60) seconds = 0 ; + seconds += 5 ; // : increase seconds by 5 + if (seconds >= 60) seconds = 0 ; // : overflow handling + CDU_OS.LockResource(USB_TX_RESOURCE); Send_ALIVE_message(seconds); - led1 = !led1; + CDU_OS.FreeResource(USB_TX_RESOURCE); + alive_led = !alive_led; // : toggle LED } -} +} -// ------------- LvdK button scan, test only ------------------------------------------------- -void SCAN_KEYS_TASK(void) // : Test if button pressed -{ // Will be task written by W.B - // Is now LvdK test Task, scans some buttons attached to Mbed board. - // Task scans buttons every 50msec. - CDU_OS.SetTimer( SCAN_KEYS_TIMER_ID, SCAN_KEYS_TIMER_PERIOD, SCAN_KEYS_TIMER_PERIOD ); - - while(1){ // : loop forever because it is a mbos taskfunction - CDU_OS.WaitEvent(SCAN_KEYS_TIMER_EVENT ); // : scan buttons every 50msec - scan_buttons_Mbed(); - } +void CDU_DSP_CSS_TASK(void) // : read new screendata from FS datastructures +{ + while(1) { // : loop forever because it is a mbos taskfunction + CDU_OS.WaitEvent(FS_DATA_EVENT); + CDU_OS.LockResource(FS_DATA_RESOURCE); //lock resource to prevent intermediate updates + + //test_update_flags(); // : >>>>>>>>>>>>>>>>>>>>> LvdK TEST ONLY !!! + + CDU_DSP_CSS(); + + CDU_OS.FreeResource(FS_DATA_RESOURCE); //free resource + } } -// ------------------------------------------------------------------------------------------- \ No newline at end of file + +void READ_POT_TASK(void) +{ // Mbos task started by mbos timer to scan potmeter every 100 msec + CDU_OS.SetTimer( READ_POT_TIMER_ID, READ_POT_TIMER_PERIOD, READ_POT_TIMER_PERIOD ); + + while(1) { // : loop forever because it is a mbos taskfunction + CDU_OS.WaitEvent(READ_POT_TIMER_EVENT ); // : scan potmeter every 100msec + CDU_SET_BGL_INTENSITY(255); + } +} +