Check this one ! mbos setup changed, WTX hor pos changed, no font style check, no checksum check
Dependencies: 4DGL MODSERIAL mbed mbos
Fork of CDU_Mbed_21 by
Diff: main.cpp
- Revision:
- 6:e0bf3b244d7c
- Parent:
- 5:99594f4ab659
- Child:
- 7:6576a287e563
--- a/main.cpp Sat Dec 08 20:37:05 2012 +0000 +++ b/main.cpp Tue Jan 29 14:54:14 2013 +0000 @@ -1,58 +1,178 @@ // L. van der Kolk, ELVEDEKA, Holland // -// File: main.cpp version 1.0 +// File: main.cpp Mbos O.S testversion #include "mbed.h" -#include "TextLCD.h" -TextLCD lcd(p8, p9, p10, p11, p12, p13); // rs, e, d4-d7 +#include "MODSERIAL.h" +#include "mbos.h" + +//-------------------------------------------------------------------------------- +#include "TextLCD.h" // < LCD connected for testing only << ! +TextLCD lcd(p8, p9, p10, p11, p12, p13); // rs, e, d4-d7 << for testing only << ! +//-------------------------------------------------------------------------------- + +DigitalOut led1(LED1); // : LED 1 on Mbed board toggles when CDU is alive -DigitalOut led1(LED1); // Led1, only for testing - -extern Serial USB; // >>>>>>>>>>> alleen t.b.v TEST output !! +extern MODSERIAL USB; +extern int key_hit_ID; +int CDU_FS_interface = 0; // : defines interface to FS: 0 = USB, 1 = Ethernet void init_USB(); -void init_alivetimer(); -void check_alive(); +void set_initial_CDU_screen(); +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 << ! +//---------------------------------------------------------------- + +// 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! + +// 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 + +// SCAN_KEYS_TIMER properties: ( LvdK button scan ) +#define SCAN_KEYS_TIMER_ID 2 +#define SCAN_KEYS_TIMER_PERIOD 50 // = 50msec +//---------------------------------------------------------------- -void init_buttons_Mbed(); -void scan_buttons_Mbed(); +// 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! ) + + +mbos CDU_OS( 8, 6, 5); //instantiate mbos O.S (tasks, timers, resources) -void collect_decode_FSdata(); -void collect_and_send_FSdata(); -//void Braat_test_update_flag_van_LvdK_en_doet_wat_met_de_nieuwe_data(); + // 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. + 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 !"); +} + +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 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 +} main() { -// -- This is main.cpp created by LvdK to test all FS communication -- - - init_USB(); // : setup USB communication and Rx interrupt - init_alivetimer(); // : setup alive message timer - init_buttons_Mbed(); // : <<<<<<<<<<<<<<<<<<<<< test only - - lcd.cls(); // : clear LCD display - lcd.printf(" -- Mbed CDU --\n"); - USB.printf(" --- Mbed CDU ---\n"); - - - while (1==1) { // this is my endless main loop + 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"); + //------------------------------------------------------------------------ - led1 = !led1; // : toggle LED1 to show running program - //wait(0.02); - - // Check on new received characters from FS in filled Rx ringbuffer - // and decode to data if relevant: - collect_decode_FSdata(); - - // Proces new received FS data: - // Braat_test_update_flag_van_LvdK_en_doet_wat_met_de_nieuwe_data(); - - // Send relevant data to FS: - // LvdK test updates van data Braat en leest de data uit afgesproken datagebied - // en stuurt dit naar de FS: - scan_buttons_Mbed(); - - collect_and_send_FSdata(); - - check_alive(); // : if 5 sec passed, send alive message - + // 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! +} + +void RECEIVE_DECODE_TASK(void) +{ // Task waits for RX_EVENT, then + // collects and decodes data from FS + while(1){ + CDU_OS.WaitEvent(RX_EVENT); // : wait for RX event + collect_FSdata(); + } +} + +void SEND_KEYMESSAGE_TASK(void) +{ + while(1){ + CDU_OS.WaitEvent(KEY_EVENT); // : wait for KEY event ( = CDU key pressed ) + Send_KEY_message(key_hit_ID); + key_hit_ID = 0; // : reset Id flag } -} \ No newline at end of file +} + +void ALIVE_TASK(void) +{ // 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 + CDU_OS.WaitEvent(ALIVE_EVENT ); // : wait for Mbos timer event (5 sec) + seconds += 5 ; // : increase seconds by 5 + if (seconds >= 60) seconds = 0 ; + Send_ALIVE_message(seconds); + led1 = !led1; + } +} + +// ------------- 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(); + } +} +// ------------------------------------------------------------------------------------------- \ No newline at end of file