coursework

generate.cpp

Committer:
riyood
Date:
2016-11-27
Revision:
0:b7287557047e

File content as of revision 0:b7287557047e:

#include "main.h"
#include "rtos.h"

DigitalOut greenLed (PD_12);
DigitalOut orangeLed (PD_13);
DigitalOut redLed (PD_14);
DigitalOut blueLed (PD_15);

AnalogOut *aout;
Timer timer;
const float pi = 3.141592653589793238462f;


//Mutex signalMutex;
bool signalHasChanged;
Signal signalToGenerate;

void updateSignal (Signal signal) {
    //signalMutex.lock();     // synchronise access with generateSignalFunc()
    signalToGenerate = signal;  // specify that the signal
    signalHasChanged = 1;       // to generate has changed
    //signalMutex.unlock();
}


void generateSignalFunc (void const* args) {
    enum SIGNAL_TYPE type;
    float a, f, p, t;
    timer.start();

    while(1) {
        if(signalHasChanged) {
            //signalMutex.lock();             // prevent changes to occur while
            type = signalToGenerate.type;   // signal parameters are being read
            a    = signalToGenerate.amplitude/3.3f; // scale from [0,3.3] to [0,1]
            f    = signalToGenerate.frequency;
            signalHasChanged = 0;           // reset flag
            //signalMutex.unlock();           // release lock
            greenLed = type==CONSTANT;
            orangeLed = type==SINE;
            redLed = type==SQUARE;
        }
        t = timer.read();       // get time t in seconds
        if(t>20) timer.reset(); // accuracy drops as t increases
        switch(type) {
            case CONSTANT:
                *aout = a;
                break;
            case SINE:
                *aout = a*0.5f*(1+sin(f*pi*2*t));
                break;
            case SQUARE:
                p = t*f - floor(t*f);
                *aout = (p < 0.5f) ? 0 : a;
                break;
            default: *aout = 0;
        }
    }
}