voor willem test

Dependencies:   4DGL MODSERIAL mbed mbos

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);
+    }
+}
+