Thread Sync Example

Dependencies:   C12832

main.cpp

Committer:
fpucher
Date:
2017-03-22
Revision:
0:567c690c073a
Child:
1:a477e0d640e0

File content as of revision 0:567c690c073a:

// see: [[RTOS: Demonstration Setup]] 
// Trace ab 15:00

#include "mbed.h"

class Rgb
{
private:
    DigitalOut _led;
 
public:
    Rgb(PinName ld) : _led(ld) { _led = 1};  // Constructor
    
    void LedOn() {
        _led = 0;
    }
    void LedOff(){
        _led.write(1);
    }
};  

class HasA
{
private:
    DigitalOut _led;
 
public:
    HasA(PinName ld) : _led(ld) {};  // Constructor
    
    void LedOn() {
        _led = 1;
    }
    void LedOff(){
        _led.write(0);
    }
};  

void Delay_Nonsense(uint32_t * DelayCounter, uint32_t const * TargetCount)
{
    while(*DelayCounter <= *TargetCount)
    {
        *DelayCounter = *DelayCounter + 1;
    }

    *DelayCounter = 0;
}

//M3 r (p23); g (p24); b (p25);
/*
HasA Led1(LED1);
HasA Led2(LED2);
HasA Led3(LED3);
*/
Rgb Led1(p23);
Rgb Led2(p24);
Rgb Led3(p25);

//void Led1_Blink(void *pvParameters)
void Led1_Blink()       // red long
{
   const int xDelay = 500; 
   uint32_t BlueDelay = 0;
   const uint32_t TargetCount = 16000;

   for(;;) {    
       for(int i = 0; i < 10; i++) {        // randomnes
          wait_ms(xDelay);
       }

       {
           Led1.LedOn();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
           Led1.LedOff();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
       }
   }
}

void Led2_Blink()   // green
{
   const int xDelay = 250; 
   uint32_t BlueDelay = 0;
   const uint32_t TargetCount = 16000;

   for(;;) {
       for(int i = 0; i < 10; i++) {     // randomnes
          wait_ms(xDelay);
       }
       {
           Led2.LedOn();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
           Led2.LedOff();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
       }
   }
}

void Led3_Blink()   // blue very short
{
   const int xDelay = 100; 
   uint32_t BlueDelay = 0;
   const uint32_t TargetCount = 16000;

   for(;;) {
       for(int i = 0; i < 10; i++) {     // randomnes
          wait_ms(xDelay);
       }
       {
           Led3.LedOn();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
           Led3.LedOff();
           Delay_Nonsense(&BlueDelay, &TargetCount);
           wait_ms(xDelay);
       }
   }
}

Thread thread1;
Thread thread2;
Thread thread3;

int main() {
    thread1.start(Led1_Blink);
    thread2.start(Led2_Blink);
    thread3.start(Led3_Blink);

    while(1) {
    }
}