Use definitions in Boards for pots/sliders config
This commit is contained in:
@@ -403,8 +403,10 @@ Node convert<ModelData>::encode(const ModelData& rhs)
|
||||
|
||||
node["toplcdTimer"] = rhs.toplcdTimer;
|
||||
|
||||
// B&W only
|
||||
// customScreens
|
||||
// topBarData
|
||||
|
||||
node["view"] = rhs.view;
|
||||
node["modelRegistrationID"] = rhs.registrationId;
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ std::string YamlRawSwitchEncode(const RawSwitch& rhs)
|
||||
switch (rhs.type) {
|
||||
case SWITCH_TYPE_SWITCH:
|
||||
sw_str += 'S';
|
||||
// TODO: use lookup of switches in Boards ???
|
||||
sw_str += 'A' + (sval - 1) / 3;
|
||||
sw_str += std::to_string((sval - 1) % 3);
|
||||
break;
|
||||
@@ -129,6 +130,7 @@ RawSwitch YamlRawSwitchDecode(const std::string& sw_str)
|
||||
} else if (val_len >= 3 && val[0] == 'S' &&
|
||||
(val[1] >= 'A' && val[1] <= 'Z') &&
|
||||
(val[2] >= '0' && val[2] <= '2')) {
|
||||
// TODO: use lookup of switches in Boards ???
|
||||
rhs = RawSwitch(SWITCH_TYPE_SWITCH, (val[1] - 'A') * 3 + val[2] - '0');
|
||||
} else {
|
||||
// TODO: check if we have a match?
|
||||
|
||||
@@ -19,19 +19,9 @@
|
||||
*/
|
||||
|
||||
#include "yaml_switchconfig.h"
|
||||
|
||||
#include "boards.h"
|
||||
|
||||
const YamlLookupTable sticksLut = {
|
||||
{0, "0"},
|
||||
{1, "1"},
|
||||
{2, "2"},
|
||||
{3, "3"},
|
||||
};
|
||||
|
||||
const YamlLookupTable switchesLut = {
|
||||
{0, "SA"}, {1, "SB"}, {2, "SC"}, {3, "SD"}, {4, "SE"},
|
||||
{5, "SF"}, {6, "SG"}, {7, "SH"}, {8, "SI"}, {9, "SJ"},
|
||||
};
|
||||
#include "eeprominterface.h"
|
||||
|
||||
const YamlLookupTable switchConfigLut = {
|
||||
{Board::SWITCH_NOT_AVAILABLE, "none"},
|
||||
@@ -40,10 +30,6 @@ const YamlLookupTable switchConfigLut = {
|
||||
{Board::SWITCH_3POS, "3pos"},
|
||||
};
|
||||
|
||||
const YamlLookupTable potsLut = {
|
||||
{0, "S1"}, {1, "6POS"}, {2, "S2"},
|
||||
{3, "EXT1"}, {4, "EXT2"}, {5, "EXT3"}, {6, "EXT4"},
|
||||
};
|
||||
|
||||
const YamlLookupTable potConfigLut = {
|
||||
{Board::POT_NONE, "none"},
|
||||
@@ -62,3 +48,91 @@ const YamlLookupTable sliderConfigLut = {
|
||||
{Board::SLIDER_WITH_DETENT, "with_detent"},
|
||||
};
|
||||
|
||||
int YamlStickLookup::name2idx(const std::string& name)
|
||||
{
|
||||
int idx = std::stoi(name);
|
||||
if (idx < 4) {
|
||||
return idx;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string YamlStickLookup::idx2name(unsigned int idx)
|
||||
{
|
||||
if (idx < 4) {
|
||||
return std::to_string(idx);
|
||||
}
|
||||
|
||||
return std::string();
|
||||
}
|
||||
|
||||
int YamlSwitchLookup::name2idx(const std::string& name)
|
||||
{
|
||||
// TODO: replace this with a real lookup of available switches
|
||||
if (name.size() == 2
|
||||
&& name[0] == 'S'
|
||||
&& (name[1] >= 'A' && name[1] <= 'J')) {
|
||||
|
||||
return name[1] - 'A';
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string YamlSwitchLookup::idx2name(unsigned int idx)
|
||||
{
|
||||
// TODO: replace this with a real lookup of available switches
|
||||
if (idx < 10) {
|
||||
return std::string("S") + (char)('A' + idx);
|
||||
}
|
||||
|
||||
return std::string();
|
||||
}
|
||||
|
||||
int YamlPotLookup::name2idx(const std::string& name)
|
||||
{
|
||||
auto fw = getCurrentFirmware();
|
||||
int idx = fw->getAnalogInputIndex(name.c_str());
|
||||
if (idx < 0) return idx;
|
||||
|
||||
int pots = Boards::getCapability(fw->getBoard(), Board::Pots);
|
||||
if (idx >= pots) return -1;
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
std::string YamlPotLookup::idx2name(unsigned int idx)
|
||||
{
|
||||
auto fw = getCurrentFirmware();
|
||||
int pots = Boards::getCapability(fw->getBoard(), Board::Pots);
|
||||
if (idx >= pots) return std::string();
|
||||
|
||||
return fw->getAnalogInputTag(idx);
|
||||
}
|
||||
|
||||
int YamlSliderLookup::name2idx(const std::string& name)
|
||||
{
|
||||
auto fw = getCurrentFirmware();
|
||||
int idx = fw->getAnalogInputIndex(name.c_str());
|
||||
if (idx < 0) return idx;
|
||||
|
||||
int pots = Boards::getCapability(fw->getBoard(), Board::Pots);
|
||||
if (idx < pots) return -1;
|
||||
idx -= pots;
|
||||
|
||||
int sliders = Boards::getCapability(fw->getBoard(), Board::Sliders);
|
||||
if (idx >= sliders) return -1;
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
std::string YamlSliderLookup::idx2name(unsigned int idx)
|
||||
{
|
||||
auto fw = getCurrentFirmware();
|
||||
int pots = Boards::getCapability(fw->getBoard(), Board::Pots);
|
||||
int sliders = Boards::getCapability(fw->getBoard(), Board::Sliders);
|
||||
if (idx >= sliders) return std::string();
|
||||
|
||||
return fw->getAnalogInputTag(idx + pots);
|
||||
}
|
||||
|
||||
@@ -24,7 +24,12 @@
|
||||
#include "generalsettings.h"
|
||||
#include <string.h>
|
||||
|
||||
template <unsigned int N, const YamlLookupTable& name_lut>
|
||||
struct YamlStickLookup {
|
||||
static int name2idx(const std::string& name);
|
||||
static std::string idx2name(unsigned int idx);
|
||||
};
|
||||
|
||||
template <unsigned int N, class name_lookup>
|
||||
struct YamlNameConfig {
|
||||
char name[N][HARDWARE_NAME_LEN + 1];
|
||||
|
||||
@@ -41,19 +46,17 @@ struct YamlNameConfig {
|
||||
}
|
||||
};
|
||||
|
||||
extern const YamlLookupTable sticksLut;
|
||||
typedef YamlNameConfig<CPN_MAX_SWITCHES, sticksLut> YamlStickConfig;
|
||||
typedef YamlNameConfig<CPN_MAX_SWITCHES, YamlStickLookup> YamlStickConfig;
|
||||
|
||||
template <unsigned int N, const YamlLookupTable& name_lut,
|
||||
const YamlLookupTable& cfg_lut>
|
||||
struct YamlKnobConfig : public YamlNameConfig<N, name_lut> {
|
||||
template <unsigned int N, class name_lookup, const YamlLookupTable& cfg_lut>
|
||||
struct YamlKnobConfig : public YamlNameConfig<N, name_lookup> {
|
||||
unsigned int config[N];
|
||||
|
||||
YamlKnobConfig() { memset(config, 0, sizeof(config)); }
|
||||
|
||||
YamlKnobConfig(const char in_names[N][HARDWARE_NAME_LEN + 1],
|
||||
const unsigned int in_configs[N]) :
|
||||
YamlNameConfig<N, name_lut>(in_names)
|
||||
YamlNameConfig<N, name_lookup>(in_names)
|
||||
{
|
||||
memcpy(config, in_configs, sizeof(config));
|
||||
}
|
||||
@@ -61,7 +64,7 @@ struct YamlKnobConfig : public YamlNameConfig<N, name_lut> {
|
||||
void copy(char out_names[N][HARDWARE_NAME_LEN + 1],
|
||||
unsigned int out_configs[N])
|
||||
{
|
||||
YamlNameConfig<N, name_lut>::copy(out_names);
|
||||
YamlNameConfig<N, name_lookup>::copy(out_names);
|
||||
memcpy(out_configs, config, sizeof(config));
|
||||
}
|
||||
};
|
||||
@@ -69,71 +72,89 @@ struct YamlKnobConfig : public YamlNameConfig<N, name_lut> {
|
||||
// SA:
|
||||
// type: 3pos
|
||||
// name:
|
||||
extern const YamlLookupTable switchesLut;
|
||||
struct YamlSwitchLookup {
|
||||
static int name2idx(const std::string& name);
|
||||
static std::string idx2name(unsigned int idx);
|
||||
};
|
||||
extern const YamlLookupTable switchConfigLut;
|
||||
typedef YamlKnobConfig<CPN_MAX_SWITCHES, switchesLut, switchConfigLut>
|
||||
typedef YamlKnobConfig<CPN_MAX_SWITCHES, YamlSwitchLookup, switchConfigLut>
|
||||
YamlSwitchConfig;
|
||||
|
||||
// S1:
|
||||
// type: with_detent
|
||||
// name:
|
||||
extern const YamlLookupTable potsLut;
|
||||
struct YamlPotLookup {
|
||||
static int name2idx(const std::string& name);
|
||||
static std::string idx2name(unsigned int idx);
|
||||
};
|
||||
extern const YamlLookupTable potConfigLut;
|
||||
typedef YamlKnobConfig<CPN_MAX_POTS, potsLut, potConfigLut> YamlPotConfig;
|
||||
typedef YamlKnobConfig<CPN_MAX_POTS, YamlPotLookup, potConfigLut> YamlPotConfig;
|
||||
|
||||
// S1:
|
||||
// type: with_detent
|
||||
// name:
|
||||
extern const YamlLookupTable slidersLut;
|
||||
struct YamlSliderLookup {
|
||||
static int name2idx(const std::string& name);
|
||||
static std::string idx2name(unsigned int idx);
|
||||
};
|
||||
extern const YamlLookupTable sliderConfigLut;
|
||||
typedef YamlKnobConfig<CPN_MAX_SLIDERS, slidersLut, sliderConfigLut>
|
||||
typedef YamlKnobConfig<CPN_MAX_SLIDERS, YamlSliderLookup, sliderConfigLut>
|
||||
YamlSliderConfig;
|
||||
|
||||
namespace YAML
|
||||
{
|
||||
template <unsigned int N, const YamlLookupTable& name_lut>
|
||||
struct convert<YamlNameConfig<N, name_lut> > {
|
||||
static Node encode(const YamlNameConfig<N, name_lut>& rhs)
|
||||
template <unsigned int N, class name_lookup>
|
||||
struct convert<YamlNameConfig<N, name_lookup> > {
|
||||
static Node encode(const YamlNameConfig<N, name_lookup>& rhs)
|
||||
{
|
||||
Node node;
|
||||
for (const auto& kv : name_lut) {
|
||||
node[kv.second]["name"] = rhs.name[kv.first];
|
||||
for (unsigned int i=0; i<N; i++) {
|
||||
std::string name = name_lookup::idx2name(i);
|
||||
if (!name.empty()) {
|
||||
node[name]["name"] = rhs.name[i];
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
static bool decode(const Node& node, YamlNameConfig<N, name_lut>& rhs)
|
||||
static bool decode(const Node& node, YamlNameConfig<N, name_lookup>& rhs)
|
||||
{
|
||||
if (!node.IsMap()) return false;
|
||||
int idx = 0;
|
||||
for (const auto& kv : node) {
|
||||
kv.first >> name_lut >> idx;
|
||||
kv.second["name"] >> rhs.name[idx];
|
||||
idx = name_lookup::name2idx(kv.first.Scalar());
|
||||
if (idx >= 0) {
|
||||
kv.second["name"] >> rhs.name[idx];
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
template <unsigned int N, const YamlLookupTable& name_lut,
|
||||
const YamlLookupTable& cfg_lut>
|
||||
struct convert<YamlKnobConfig<N, name_lut, cfg_lut> > {
|
||||
static Node encode(const YamlKnobConfig<N, name_lut, cfg_lut>& rhs)
|
||||
template <unsigned int N, class name_lookup, const YamlLookupTable& cfg_lut>
|
||||
struct convert<YamlKnobConfig<N, name_lookup, cfg_lut> > {
|
||||
static Node encode(const YamlKnobConfig<N, name_lookup, cfg_lut>& rhs)
|
||||
{
|
||||
Node node;
|
||||
for (const auto& kv : name_lut) {
|
||||
node[kv.second]["type"] = cfg_lut << rhs.config[kv.first];
|
||||
node[kv.second]["name"] = rhs.name[kv.first];
|
||||
for (unsigned int i=0; i<N; i++) {
|
||||
std::string name = name_lookup::idx2name(i);
|
||||
if (!name.empty()) {
|
||||
node[name]["type"] = cfg_lut << rhs.config[i];
|
||||
node[name]["name"] = rhs.name[i];
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
static bool decode(const Node& node,
|
||||
YamlKnobConfig<N, name_lut, cfg_lut>& rhs)
|
||||
YamlKnobConfig<N, name_lookup, cfg_lut>& rhs)
|
||||
{
|
||||
if (!node.IsMap()) return false;
|
||||
int idx = 0;
|
||||
for (const auto& kv : node) {
|
||||
kv.first >> name_lut >> idx;
|
||||
kv.second["type"] >> cfg_lut >> rhs.config[idx];
|
||||
kv.second["name"] >> rhs.name[idx];
|
||||
idx = name_lookup::name2idx(kv.first.Scalar());
|
||||
if (idx >= 0) {
|
||||
kv.second["type"] >> cfg_lut >> rhs.config[idx];
|
||||
kv.second["name"] >> rhs.name[idx];
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user