voor willem test

Dependencies:   4DGL MODSERIAL mbed mbos

main.cpp

Committer:
LvdK
Date:
2013-01-29
Revision:
6:e0bf3b244d7c
Parent:
5:99594f4ab659
Child:
7:6576a287e563

File content as of revision 6:e0bf3b244d7c:

// L. van der Kolk, ELVEDEKA, Holland //
// File:  main.cpp  Mbos O.S testversion  

#include "mbed.h"
#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
 
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 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 
//----------------------------------------------------------------  

// 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)

 // 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()
{
  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");
  //------------------------------------------------------------------------
    
  // 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
    }
}

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(); 
    } 
}
// -------------------------------------------------------------------------------------------