coursework
generate.cpp@0:b7287557047e, 2016-11-27 (annotated)
- Committer:
- riyood
- Date:
- Sun Nov 27 17:57:06 2016 +0000
- Revision:
- 0:b7287557047e
function;
Who changed what in which revision?
User | Revision | Line number | New 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 |