RTOS timer usage

Dependencies:   mbed-rtos mbed

main.cpp

Committer:
icserny
Date:
2016-02-23
Revision:
0:95dae97a932f
Child:
1:10da8ca3d1cd

File content as of revision 0:95dae97a932f:

/** 10_rtos_queue
 *
 * Simple example to use a Queue object to send integer data
 * from thread1 to thread2. Note that Queue's put() method is
 * intended to send a pointer, therefore typecasting
 * should be appliedin in order to avoid compiler error messages.
 */

#include "mbed.h"
#include "rtos.h"

AnalogIn potmeter(A0);
PwmOut myled(LED_BLUE);

typedef uint32_t message_t;
Queue<message_t, 16> queue;

void led_thread(void const *argument)
{
    myled.period_us(16384);                                       //Set period to 16.384 ms
    myled.pulsewidth_us(8192);                                    //Initialize to 50% duty cycle
    while (true) {
        osEvent evt = queue.get();                                //Wait for a message
        switch(evt.status) {
            case osOK:
                printf("osOK\n");                                 //no error, no message arrived
                break;
            case osEventMessage:
                printf("osEventMessage = %#05x\n",evt.value.v);  //message arrived
                //Note that evt.value is a union.
                //Read as value.v to get a data, or value.p to get a pointer...
                myled.pulsewidth_us((int)(evt.value.v>>2));      //roughly 0..16 ms
                break;
            case osEventTimeout:
                printf("osEventTimeout\n");                      //timeout occurred
                break;
            case osErrorParameter:
                printf("osErrorParameter\n");
                break;                                           //invalid parameter or is out of range.
            default:
                printf("Unknown error flag: %#08x\n",(uint32_t)evt.status);
                break;
        };
    }
}

int main (void)
{
    Thread thread2(led_thread);

    while (true) {
        Thread::wait(1000);
        uint16_t raw = potmeter.read_u16();                     // read raw 16-bit data
        queue.put((message_t*)raw);
    }
}