voor willem test
Dependencies: 4DGL MODSERIAL mbed mbos
main.cpp
- Committer:
- LvdK
- Date:
- 2014-07-17
- Revision:
- 7:6576a287e563
- Parent:
- 6:e0bf3b244d7c
File content as of revision 7:6576a287e563:
// 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 // 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 !!! 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); void set_initial_data(); // : fill datastructures with initial data void Send_KEY_message(int button); void Send_ALIVE_message(int seconds); void collect_FSdata(); mbos CDU_OS( 9, 5, 5); // : instantiate mbos O.S (tasks, timers, resources) // 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); // 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); // 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); 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 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 on Mbed board error("RX OVERFLOW !"); } //-------------------------------------------------------------------- void init_USB() { // -- 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() // : MBOS main() { 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); // 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) { // : loop forever because it is a mbos taskfunction CDU_OS.WaitEvent(RX_EVENT); // : wait for RX event collect_FSdata(); } } void SEND_KEYMESSAGE_TASK(void) { 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 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. 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 ; // : overflow handling CDU_OS.LockResource(USB_TX_RESOURCE); Send_ALIVE_message(seconds); CDU_OS.FreeResource(USB_TX_RESOURCE); alive_led = !alive_led; // : toggle LED } } 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 } } 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); } }