István Cserny / Mbed 2 deprecated Lab08_rtos_mailbox

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 }