Example code displaying how to use and implement the mbed RTOS along with a simple state machine used to capture button presses.

Dependencies:   mbed

Fork of mbed-rtos by mbed official

main.cpp

Committer:
gelmes
Date:
2016-02-25
Revision:
106:1b09dd92c3f1
Parent:
105:d7ee57473fdb

File content as of revision 106:1b09dd92c3f1:


#include "mbed.h"
#include "rtos.h"
#include "color.h"


//Set Up all basic colors
Color black(0.0f,0.0f,0.0f);
Color red(1.0f,0.0f,0.0f);
Color yellow(1.0f,1.0f,0.0f);
Color green(0.0f,1.0f,0.0f);
Color teal(0.0f,1.0f,1.0f);
Color blue(0.0f,0.0f,1.0f);
Color purple(1.0f,0.0f,1.0f);

//PWM pins used D12, D11, D10
PwmOut   ledr(D12);
PwmOut   ledg(D11);
PwmOut   ledb(D10);
DigitalIn btn(USER_BUTTON);
DigitalOut led(LED1);

int state = 0; //State of the button animation

/** Fades LED from one value to the next to calculate animation time
    multiply steps by stepTime

    @param start Starting clor
    @param finish Ending color
    @param step Steps to take to get to color
    @param setTime Time taken by each step
 */
bool fadeTo(Color start, Color finish, float steps, double stepTime)
{
    float rSteps = (finish.r - start.r)/steps;
    float gSteps = (finish.g - start.g)/steps;
    float bSteps = (finish.b - start.b)/steps;

    steps = 1/steps;

    float rStepsCounter = 1.0f - start.r;
    float gStepsCounter = 1.0f - start.g;
    float bStepsCounter = 1.0f - start.b;
    int stateBefore = state; //Used as a temporary variable
    //  and print what the measured voltage should be (assuming VCC = 3.3v)
    for (float i = 0.0f; i < 1.0f; i += steps) {
        rStepsCounter -= rSteps;
        gStepsCounter -= gSteps;
        bStepsCounter -= bSteps;

        ledr = rStepsCounter ;
        ledg = gStepsCounter;
        ledb = bStepsCounter;

        Thread::wait(stepTime*1000);
        if (stateBefore != state) return 0;
    }
    return 1;
}

/** Fades LED through all standard colors (black, red, yellow, green, teal, blue, purple)
    to calculate animation time multiply steps by stepTime by 7

    @param steps Number of steps to take
    @param stepTime Time taken by each step
 */
void fadeThruAll(float steps, float stepTime)
{
    bool cont = 1;
    cont = fadeTo(black, red, steps, stepTime);
    if(cont) cont = fadeTo(red, yellow, steps, stepTime);
    if(cont) cont = fadeTo(yellow, green, steps, stepTime);
    if(cont) cont = fadeTo(green, teal, steps, stepTime);
    if(cont) cont = fadeTo(teal, blue, steps, stepTime);
    if(cont) cont = fadeTo(blue, purple, steps, stepTime);
    if(cont) cont = fadeTo(purple, black, steps, stepTime);
}


/** This is the thread used for controlling the LED rendering state. This state
    is modified by the btnPresses process through the use of the state global
    variable.
*/
void renderColors(void const * arg)
{
    while (1) {
        switch(state) {
            case 0:
                fadeThruAll(100.0f, 0.025f);
                break;
            case 1:
                fadeThruAll(1.0f,0.1f);
                break;
            case 2:
                state = 0;
                break;
            default:
                state = 0;
                break;
        }
    }
}

enum SMBtnStates {SMBtnStart, SMBtnPressedOff, SMBtnUnpressedOff, SMBtnPressedOn, SMBtnUnpressedOn} SMBtnState;
/** This is the thread used to gather button presses information. This is a simple State machine of a button
    press.
     ___________      _______________
    |           |    |               |
    |SMBtn Start| -> |SMBtnPressedOFF|
    |___________|    |_______________|
*/
void btnPresses(void const * arg)
{
    while(1) {
        switch(SMBtnState) {
            case SMBtnStart:
                SMBtnState = SMBtnUnpressedOff;
                break;
            case SMBtnUnpressedOff:
                if(!btn) SMBtnState = SMBtnPressedOn;
                break;
            case SMBtnPressedOn:
                if(btn) {
                    SMBtnState = SMBtnUnpressedOn;
                    state++;
                    led = 1;
                }
                break;
            case SMBtnUnpressedOn:
                if(!btn) SMBtnState = SMBtnPressedOff;
                break;
            case SMBtnPressedOff:
                if(btn) {
                    SMBtnState = SMBtnUnpressedOff;
                    state++;
                    led = 0;
                }
                break;
            default:
                SMBtnState = SMBtnStart;
                break;
        }

        switch(SMBtnState) {
            case SMBtnStart:
                SMBtnState = SMBtnUnpressedOff;
                break;
            case SMBtnUnpressedOff:
                break;
            case SMBtnPressedOn:
                break;
            case SMBtnUnpressedOn:
                break;
            case SMBtnPressedOff:
                break;
            default:
                SMBtnState = SMBtnStart;
                break;
        }
    }
}

/** Main thread control
*/
int main()
{
    Thread thread1(renderColors);
    Thread thread2(btnPresses);
    while(true) {};
}