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 an 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 mbed-rtos

Committer:
cspista
Date:
Thu Mar 17 13:03:30 2022 +0000
Revision:
0:9f2b4b5956c0
Final version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cspista 0:9f2b4b5956c0 1 #include "mbed.h"
cspista 0:9f2b4b5956c0 2 #include "rtos.h"
cspista 0:9f2b4b5956c0 3 PwmOut rled(D3);
cspista 0:9f2b4b5956c0 4 PwmOut gled(D5);
cspista 0:9f2b4b5956c0 5 PwmOut bled(D6);
cspista 0:9f2b4b5956c0 6 DigitalOut led_common(D4);
cspista 0:9f2b4b5956c0 7
cspista 0:9f2b4b5956c0 8 typedef struct {
cspista 0:9f2b4b5956c0 9 float red;
cspista 0:9f2b4b5956c0 10 float green;
cspista 0:9f2b4b5956c0 11 float blue;
cspista 0:9f2b4b5956c0 12 } message_t;
cspista 0:9f2b4b5956c0 13
cspista 0:9f2b4b5956c0 14 Mail <message_t,4> mbox; //Mailbox for 4 messages
cspista 0:9f2b4b5956c0 15
cspista 0:9f2b4b5956c0 16 void led_thread(void const *argument) {
cspista 0:9f2b4b5956c0 17 rled.period_ms(20); //Set period to 20 ms
cspista 0:9f2b4b5956c0 18 rled.write(1.0f); //Initialize to 0% duty cycle
cspista 0:9f2b4b5956c0 19 gled.period_ms(20); //Set period to 20 ms
cspista 0:9f2b4b5956c0 20 gled.write(1.0f); //Initialize to 0% duty cycle
cspista 0:9f2b4b5956c0 21 bled.period_ms(20); //Set period to 20 ms
cspista 0:9f2b4b5956c0 22 bled.write(1.0f); //Initialize to 0% duty cycle
cspista 0:9f2b4b5956c0 23 while (true) {
cspista 0:9f2b4b5956c0 24 osEvent evt = mbox.get(); //Wait for a message
cspista 0:9f2b4b5956c0 25 if(evt.status == osEventMail) {
cspista 0:9f2b4b5956c0 26 message_t *mymessage = (message_t*)evt.value.p;
cspista 0:9f2b4b5956c0 27 rled = 1.0f - mymessage->red;
cspista 0:9f2b4b5956c0 28 gled = 1.0f - mymessage->green;
cspista 0:9f2b4b5956c0 29 bled = 1.0f - mymessage->blue;
cspista 0:9f2b4b5956c0 30 mbox.free(mymessage); //Free up memory
cspista 0:9f2b4b5956c0 31 }
cspista 0:9f2b4b5956c0 32 }
cspista 0:9f2b4b5956c0 33 }
cspista 0:9f2b4b5956c0 34
cspista 0:9f2b4b5956c0 35 float frand(void) {
cspista 0:9f2b4b5956c0 36 int32_t rv = 0x8000 -(rand()&0xFFFF);
cspista 0:9f2b4b5956c0 37 return (rv*rv/1073741824.0f);
cspista 0:9f2b4b5956c0 38 }
cspista 0:9f2b4b5956c0 39
cspista 0:9f2b4b5956c0 40 int main (void) {
cspista 0:9f2b4b5956c0 41 float RGB1[3];
cspista 0:9f2b4b5956c0 42 float RGB2[3];
cspista 0:9f2b4b5956c0 43 float INC[3];
cspista 0:9f2b4b5956c0 44 led_common = 1; // for commono anode...
cspista 0:9f2b4b5956c0 45 Thread thread2(led_thread);
cspista 0:9f2b4b5956c0 46 //--- Create a random color ---------------------
cspista 0:9f2b4b5956c0 47 for (int x=0; x<3; x++) {
cspista 0:9f2b4b5956c0 48 RGB1[x] = frand();
cspista 0:9f2b4b5956c0 49 }
cspista 0:9f2b4b5956c0 50
cspista 0:9f2b4b5956c0 51 while (true) {
cspista 0:9f2b4b5956c0 52 //--- Create a new random color -----------------
cspista 0:9f2b4b5956c0 53 for (int x=0; x<3; x++) {
cspista 0:9f2b4b5956c0 54 RGB2[x] = frand();
cspista 0:9f2b4b5956c0 55 }
cspista 0:9f2b4b5956c0 56 //--- Determine increments to go from color 1 to color 2 in 25 steps
cspista 0:9f2b4b5956c0 57 for (int x=0; x<3; x++) {
cspista 0:9f2b4b5956c0 58 INC[x] = (RGB1[x] - RGB2[x]) / 25;
cspista 0:9f2b4b5956c0 59 }
cspista 0:9f2b4b5956c0 60 //--- Send color codes to thread2 ---------------
cspista 0:9f2b4b5956c0 61 for (int s=0; s<25; s++) {
cspista 0:9f2b4b5956c0 62 message_t *message = mbox.alloc(); //Allocate memory
cspista 0:9f2b4b5956c0 63 message->red = RGB1[0];
cspista 0:9f2b4b5956c0 64 message->green = RGB1[1];
cspista 0:9f2b4b5956c0 65 message->blue = RGB1[2];
cspista 0:9f2b4b5956c0 66 mbox.put(message); //Send data as message
cspista 0:9f2b4b5956c0 67 Thread::wait(100);
cspista 0:9f2b4b5956c0 68 for (int x=0; x<3; x++) {
cspista 0:9f2b4b5956c0 69 RGB1[x] -= INC[x]; //Approach to second colour
cspista 0:9f2b4b5956c0 70 }
cspista 0:9f2b4b5956c0 71 }
cspista 0:9f2b4b5956c0 72 }
cspista 0:9f2b4b5956c0 73 }