coursework

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers generate.cpp Source File

generate.cpp

00001 #include "main.h"
00002 #include "rtos.h"
00003 
00004 DigitalOut greenLed (PD_12);
00005 DigitalOut orangeLed (PD_13);
00006 DigitalOut redLed (PD_14);
00007 DigitalOut blueLed (PD_15);
00008 
00009 AnalogOut *aout;
00010 Timer timer;
00011 const float pi = 3.141592653589793238462f;
00012 
00013 
00014 //Mutex signalMutex;
00015 bool signalHasChanged;
00016 Signal signalToGenerate;
00017 
00018 void updateSignal (Signal signal) {
00019     //signalMutex.lock();     // synchronise access with generateSignalFunc()
00020     signalToGenerate = signal;  // specify that the signal
00021     signalHasChanged = 1;       // to generate has changed
00022     //signalMutex.unlock();
00023 }
00024 
00025 
00026 void generateSignalFunc (void const* args) {
00027     enum SIGNAL_TYPE type;
00028     float a, f, p, t;
00029     timer.start();
00030 
00031     while(1) {
00032         if(signalHasChanged) {
00033             //signalMutex.lock();             // prevent changes to occur while
00034             type = signalToGenerate.type;   // signal parameters are being read
00035             a    = signalToGenerate.amplitude/3.3f; // scale from [0,3.3] to [0,1]
00036             f    = signalToGenerate.frequency;
00037             signalHasChanged = 0;           // reset flag
00038             //signalMutex.unlock();           // release lock
00039             greenLed = type==CONSTANT;
00040             orangeLed = type==SINE;
00041             redLed = type==SQUARE;
00042         }
00043         t = timer.read();       // get time t in seconds
00044         if(t>20) timer.reset(); // accuracy drops as t increases
00045         switch(type) {
00046             case CONSTANT:
00047                 *aout = a;
00048                 break;
00049             case SINE:
00050                 *aout = a*0.5f*(1+sin(f*pi*2*t));
00051                 break;
00052             case SQUARE:
00053                 p = t*f - floor(t*f);
00054                 *aout = (p < 0.5f) ? 0 : a;
00055                 break;
00056             default: *aout = 0;
00057         }
00058     }
00059 }
00060