66 lines
1.4 KiB
C++
66 lines
1.4 KiB
C++
#include "SignalGenerator.hpp"
|
|
#include "sal/Listener.hpp"
|
|
#include "sal/Memory.hpp"
|
|
|
|
using namespace std;
|
|
using namespace fail;
|
|
|
|
bool SignalGenerator::run()
|
|
{
|
|
m_log << "Signalgenerator started. @ " << m_symbol << std::endl;
|
|
|
|
MemoryManager& mm = simulator.getMemoryManager();
|
|
MemReadListener l_mem(m_symbol.getAddress());
|
|
|
|
/**
|
|
* for EZS we currently use 8bit ADCs.
|
|
* @todo Make more versatile for future use.
|
|
*/
|
|
uint8_t value;
|
|
|
|
while (true) {
|
|
simulator.addListenerAndResume(&l_mem);
|
|
value = handleEvent();
|
|
mm.setBytes(m_symbol.getAddress(), sizeof(value), &value);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
uint8_t SignalGenerator::handleEvent(void)
|
|
{
|
|
double val = m_signal->calculate();
|
|
// Scale to uint8: 0 .. 255
|
|
val = val * 127; // -1: -127 .. +1: +127
|
|
val = val + 127; // -127: 0 .. +127 : 254
|
|
return (uint8_t) val;
|
|
}
|
|
|
|
|
|
|
|
Sine::Sine(const SineParams_t param)
|
|
{
|
|
m_params.push_back(param);
|
|
}
|
|
|
|
double Sine::calculate() const
|
|
{
|
|
simtime_t tps = ticksPerSecond();
|
|
if(tps == 0){
|
|
// Simulator speed not valid.
|
|
return 0;
|
|
}
|
|
|
|
// Get simulation time in seconds.
|
|
double sec = (double)simulator.getTimerTicks() / tps;
|
|
|
|
// Sum up all sine waves
|
|
double val = 0;
|
|
for(Sine::SineParamsList_t::const_iterator it = m_params.begin();
|
|
it != m_params.end(); it++)
|
|
{
|
|
val += it->amplitude * sinus(it->freq_in_hz, sec);
|
|
}
|
|
return val;
|
|
}
|
|
|