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 Engravity-CDU

main.cpp

Committer:
WillemBraat
Date:
2014-07-21
Revision:
11:d60c746c097c
Parent:
8:422544d24df3

File content as of revision 11:d60c746c097c:

// L. van der Kolk,  W.Braat  
// File:  main.cpp  
// Version 26 --->> other MBOS setup ! 
// ----------------------------------------- 

#include "mbed.h"
#include "MODSERIAL.h"
#include "mbos.h"
#include "mbos_def2.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, 1024);
DigitalOut alive_led(LED1); // : LED 1 on Mbed board toggles when CDU is alive

//void test_update_flags(); // << for testing only << !!!!!!!

// --- Debug only ----------------------------------------
// extra serial port to show debug info :
  MODSERIAL SERIAL_DEBUG(p9, p10, 512, 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(void); // : fill datastructures with initial data
void Send_KEY_message(int key_nr);
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 prototypes:
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);

//------ USB buffer overflow interrupt 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 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(&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
     
    // CDU keyboard initialisation and keyboard interrrupt setup:
    CDU_KB_COMM_INIT();
    CDU_KB_INT_START();
    BGL_LED.period(0.01);
    
    // CDU display initialisation:
    CDU_InitDisplay();
    CDU_StartScreen();
    wait(0.2);
    //CDU_Page();
    CDU_ScreenAlign();
            
    set_initial_data(); //: fill FS datastructures with initial data

    // -- debug only -------------------------------------      
    SERIAL_DEBUG.baud(38400); // : set baudrate to 38400
    SERIAL_DEBUG.printf("\n--- CDU_Mbed_26 ---\r\n");
    // ---------------------------------------------------

    // Create all mbos tasks, timers and resources:
    // Tasks:
    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.CreateTask(READ_POT_TASK_ID, READ_POT_TASK_PRIO, READ_POT_TASK_STACK_SZ, READ_POT_TASK );
    // Timers:
    CDU_OS.CreateTimer(READ_POT_TIMER_ID, READ_POT_TASK_ID, READ_POT_TIMER_EVENT);
    CDU_OS.CreateTimer(ALIVE_TIMER_ID, ALIVE_TASK_ID, ALIVE_EVENT);
    CDU_OS.CreateTimer(DECODE_TIMER_ID, RECEIVE_DECODE_TASK_ID, DECODE_TIMER_EVENT); 
    // Resources:
    CDU_OS.CreateResource(USB_TX_RESOURCE, USB_TX_PRIO);
    CDU_OS.CreateResource(FS_DATA_RESOURCE, FS_DATA_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)
{   // Mbos task triggered by mbos timer to scan USB receive buffer every 100 msec.
    // Collects and decodes data received from USB.
    CDU_OS.SetTimer( DECODE_TIMER_ID, DECODE_TIMER_PERIOD, DECODE_TIMER_PERIOD );
    while(1) { // : loop forever because it is a mbos taskfunction
        CDU_OS.WaitEvent(DECODE_TIMER_EVENT );   // : wait for Mbos timer event
        // start collecting and decoding of received data:
        CDU_OS.LockResource(FS_DATA_RESOURCE); // : lock FS database 
        collect_FSdata();
        CDU_OS.FreeResource(FS_DATA_RESOURCE); // : free FS database
    }
}

void SEND_KEYMESSAGE_TASK(void)
{   // Mbos task triggered by a 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_KB_GET_KEY(); // : read key from CDU keyboard
        CDU_OS.LockResource(USB_TX_RESOURCE);
        Send_KEY_message(key_hit_ID);
        CDU_OS.FreeResource(USB_TX_RESOURCE);
        key_hit_ID = 0;   // : reset key_hit_ID flag
    }
}

void ALIVE_TASK(void)
{   // Mbos task triggered 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) 
{   // Mbos task to read new screendata from FS datastructures and show on CDU screen.
    // Triggered by FS_DATA_EVENT ( = "new screendata available" )
    while(1) { // : loop forever because it is a mbos taskfunction
    
              if (CDU_OS.TestResource(FS_DATA_RESOURCE) == 0) {
                // FS_DATA_RESOURCE is free to access.
                // Lock it to get exclusive access and prevent intermediate updates:
                CDU_OS.LockResource(FS_DATA_RESOURCE); 
                CDU_OS.WaitEvent(FS_DATA_EVENT); //  wait for FS_DATA_EVENT
                //test_update_flags(); // : >>>>> debug ONLY !!!
                CDU_DSP_CSS(); // : get data and show on screen
                CDU_OS.FreeResource(FS_DATA_RESOURCE); // : free FS_DATA_RESOURCE
              }
              else {
                 // FS_DATA_RESOURCE is occupied, don’t read it !
              }
     }
}


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 );  // : wait for Mbos timer event
        CDU_SET_BGL_INTENSITY(255);
    }
}