coursework

Committer:
riyood
Date:
Sun Nov 27 17:57:06 2016 +0000
Revision:
0:b7287557047e
function;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
riyood 0:b7287557047e 1 #include "main.h"
riyood 0:b7287557047e 2 #include "rtos.h"
riyood 0:b7287557047e 3
riyood 0:b7287557047e 4 DigitalOut greenLed (PD_12);
riyood 0:b7287557047e 5 DigitalOut orangeLed (PD_13);
riyood 0:b7287557047e 6 DigitalOut redLed (PD_14);
riyood 0:b7287557047e 7 DigitalOut blueLed (PD_15);
riyood 0:b7287557047e 8
riyood 0:b7287557047e 9 AnalogOut *aout;
riyood 0:b7287557047e 10 Timer timer;
riyood 0:b7287557047e 11 const float pi = 3.141592653589793238462f;
riyood 0:b7287557047e 12
riyood 0:b7287557047e 13
riyood 0:b7287557047e 14 //Mutex signalMutex;
riyood 0:b7287557047e 15 bool signalHasChanged;
riyood 0:b7287557047e 16 Signal signalToGenerate;
riyood 0:b7287557047e 17
riyood 0:b7287557047e 18 void updateSignal (Signal signal) {
riyood 0:b7287557047e 19 //signalMutex.lock(); // synchronise access with generateSignalFunc()
riyood 0:b7287557047e 20 signalToGenerate = signal; // specify that the signal
riyood 0:b7287557047e 21 signalHasChanged = 1; // to generate has changed
riyood 0:b7287557047e 22 //signalMutex.unlock();
riyood 0:b7287557047e 23 }
riyood 0:b7287557047e 24
riyood 0:b7287557047e 25
riyood 0:b7287557047e 26 void generateSignalFunc (void const* args) {
riyood 0:b7287557047e 27 enum SIGNAL_TYPE type;
riyood 0:b7287557047e 28 float a, f, p, t;
riyood 0:b7287557047e 29 timer.start();
riyood 0:b7287557047e 30
riyood 0:b7287557047e 31 while(1) {
riyood 0:b7287557047e 32 if(signalHasChanged) {
riyood 0:b7287557047e 33 //signalMutex.lock(); // prevent changes to occur while
riyood 0:b7287557047e 34 type = signalToGenerate.type; // signal parameters are being read
riyood 0:b7287557047e 35 a = signalToGenerate.amplitude/3.3f; // scale from [0,3.3] to [0,1]
riyood 0:b7287557047e 36 f = signalToGenerate.frequency;
riyood 0:b7287557047e 37 signalHasChanged = 0; // reset flag
riyood 0:b7287557047e 38 //signalMutex.unlock(); // release lock
riyood 0:b7287557047e 39 greenLed = type==CONSTANT;
riyood 0:b7287557047e 40 orangeLed = type==SINE;
riyood 0:b7287557047e 41 redLed = type==SQUARE;
riyood 0:b7287557047e 42 }
riyood 0:b7287557047e 43 t = timer.read(); // get time t in seconds
riyood 0:b7287557047e 44 if(t>20) timer.reset(); // accuracy drops as t increases
riyood 0:b7287557047e 45 switch(type) {
riyood 0:b7287557047e 46 case CONSTANT:
riyood 0:b7287557047e 47 *aout = a;
riyood 0:b7287557047e 48 break;
riyood 0:b7287557047e 49 case SINE:
riyood 0:b7287557047e 50 *aout = a*0.5f*(1+sin(f*pi*2*t));
riyood 0:b7287557047e 51 break;
riyood 0:b7287557047e 52 case SQUARE:
riyood 0:b7287557047e 53 p = t*f - floor(t*f);
riyood 0:b7287557047e 54 *aout = (p < 0.5f) ? 0 : a;
riyood 0:b7287557047e 55 break;
riyood 0:b7287557047e 56 default: *aout = 0;
riyood 0:b7287557047e 57 }
riyood 0:b7287557047e 58 }
riyood 0:b7287557047e 59 }
riyood 0:b7287557047e 60