64 lines
2.0 KiB
C++
64 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include "RadioDevice.h"
|
|
|
|
#include <map>
|
|
|
|
namespace tt::hal::radio {
|
|
|
|
class ParameterSet {
|
|
private:
|
|
struct ParameterHash
|
|
{
|
|
std::size_t operator()(RadioDevice::Parameter t) const
|
|
{
|
|
return static_cast<std::size_t>(t);
|
|
}
|
|
};
|
|
|
|
using Map = std::unordered_map<RadioDevice::Parameter, float, ParameterHash>;
|
|
Map parameters;
|
|
|
|
public:
|
|
explicit ParameterSet() {}
|
|
explicit ParameterSet(const ParameterSet& other) { parameters = other.parameters; }
|
|
~ParameterSet() = default;
|
|
|
|
float get(const RadioDevice::Parameter parameter) { return parameters[parameter]; }
|
|
void set(const RadioDevice::Parameter parameter, const float value) { parameters[parameter] = value; }
|
|
bool has(const RadioDevice::Parameter parameter) { return parameters.contains(parameter); }
|
|
bool erase(const RadioDevice::Parameter parameter) {
|
|
if (has(parameter)) {
|
|
parameters.erase(parameter);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
void clear() { parameters.clear(); }
|
|
|
|
bool apply(RadioDevice &radio) {
|
|
bool successful = true;
|
|
for (const auto& [parameter, value] : parameters) {
|
|
// No break on error chosen to apply all parameters,
|
|
// a bad one doesn't make the successive tries any more invalid
|
|
successful &= (radio.setParameter(parameter, value) == RadioDevice::ParameterStatus::Success);
|
|
}
|
|
return successful;
|
|
}
|
|
|
|
void load(const RadioDevice &radio) {
|
|
// This loop has to be ajusted for each new parameter.
|
|
// Could be made more maintainable with a template enum iterator in an utility header.
|
|
for (RadioDevice::Parameter p = RadioDevice::Parameter::Power;
|
|
p < RadioDevice::Parameter::NarrowGrid;
|
|
p = static_cast<RadioDevice::Parameter>((size_t)p + 1)) {
|
|
float value = 0.0;
|
|
if (radio.getParameter(p, value) == RadioDevice::ParameterStatus::Success) {
|
|
set(p, value);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
}
|