Simple example to use a Mempool object together with a Queue object in order to send more complex messages from thread1 to thread2.

Dependencies:   mbed-rtos mbed

main.cpp

Committer:
icserny
Date:
2016-02-23
Revision:
0:2a0e4f8a7b76

File content as of revision 0:2a0e4f8a7b76:

/** 10_rtos_mempool
 *
 * Simple example to use a Mempool object together with a Queue
 * object in order to send more complex messages from thread1 to thread2.
 * Thread1 generates transition between random RGB colors and sends
 * messages to Thread2. Thread2 displays the requested color on the
 * built in RGB LED.
 *
 * Data items for messages are stored in a MemoryPool object.
 * Thread1 allocates MemoryPool slots, Thread2 should free up
 * these slots after using up data stored in the slot.
 */

#include "mbed.h"
#include "rtos.h"
PwmOut rled(LED_RED);
PwmOut gled(LED_GREEN);
PwmOut bled(LED_BLUE);

typedef struct {
    float red;
    float green;
    float blue;
} message_t;

MemoryPool<message_t, 4> mpool;                     //Memory pool for data storage
Queue<message_t, 4> queue;                          //Message queue for 4 items

void led_thread(void const *argument)
{
    rled.period_ms(20);                             //Set period to 20 ms
    rled.write(1.0f);                               //Initialize to 0% duty cycle
    gled.period_ms(20);                             //Set period to 20 ms
    gled.write(1.0f);                               //Initialize to 0% duty cycle
    bled.period_ms(20);                             //Set period to 20 ms
    bled.write(1.0f);                               //Initialize to 0% duty cycle
    while (true) {
        osEvent evt = queue.get();                  //Wait for a message
        if(evt.status == osEventMessage) {
            message_t *mymessage = (message_t*)evt.value.p;
            rled = 1.0f - mymessage->red;
            gled = 1.0f - mymessage->green;
            bled = 1.0f - mymessage->blue;
            mpool.free(mymessage);                  //Free up memory
        }
    }
}

float frand(void)
{
    float rv = (float)(rand()&0xFFFF);
    return (rv/65536.0f);
}

int main (void)
{
    float RGB1[3];
    float RGB2[3];
    float INC[3];
    Thread thread2(led_thread);
//--- Create a random color ---------------------
    for (int x=0; x<3; x++) {
        RGB1[x] = frand();
    }

    while (true) {
//--- Create a new random color -----------------
        for (int x=0; x<3; x++) {
            RGB2[x] = frand();
        }
//--- Determine increments to go from color 1 to color 2 in 25 steps
        for (int x=0; x<3; x++) {
            INC[x] = (RGB1[x] - RGB2[x]) / 25;
        }       
//--- Send color codes to thread2 ---------------
        for (int s=0; s<25; s++) {
            message_t *message = mpool.alloc();     //Allocate memory
            message->red = RGB1[0];
            message->green = RGB1[1];
            message->blue = RGB1[2];
            queue.put(message);                     //Send data as message
            Thread::wait(100);
            for (int x=0; x<3; x++) {
                RGB1[x] -= INC[x];                  //Approach to second colour
            }
        }
    }
}