Simple example to use a Mail object in order to send 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 Mail object. Thread1 allocates mailbox slots, Thread2 should free up these slots after using up data stored in the slot.

Dependencies:   mbed-rtos mbed

main.cpp

Committer:
icserny
Date:
2016-02-23
Revision:
0:2a0e4f8a7b76
Child:
1:5ea1c9f5f9f1

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
            }
        }
    }
}