Logical switches

This commit is contained in:
Raphael Coeffic
2021-12-31 10:53:09 +01:00
parent 80c62bb1f0
commit c6b23797a7
8 changed files with 269 additions and 22 deletions
+1
View File
@@ -42,6 +42,7 @@ set(firmwares_SRCS
edgetx/yaml_expodata.cpp
edgetx/yaml_curvedata.cpp
edgetx/yaml_moduledata.cpp
edgetx/yaml_logicalswitchdata.cpp
datahelpers.cpp
customisation_data.cpp
)
@@ -0,0 +1,186 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "yaml_logicalswitchdata.h"
#include "yaml_rawswitch.h"
#include "yaml_rawsource.h"
static const YamlLookupTable funcLut = {
{LS_FN_OFF, "FUNC_NONE"},
{LS_FN_VEQUAL, "FUNC_VEQUAL"},
{LS_FN_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL"},
{LS_FN_VPOS, "FUNC_VPOS"},
{LS_FN_VNEG, "FUNC_VNEG"},
{LS_FN_APOS, "FUNC_APOS"},
{LS_FN_ANEG, "FUNC_ANEG"},
{LS_FN_AND, "FUNC_AND"},
{LS_FN_OR, "FUNC_OR"},
{LS_FN_XOR, "FUNC_XOR"},
{LS_FN_EDGE, "FUNC_EDGE"},
{LS_FN_EQUAL, "FUNC_EQUAL"},
{LS_FN_GREATER, "FUNC_GREATER"},
{LS_FN_LESS, "FUNC_LESS"},
{LS_FN_DPOS, "FUNC_DIFFEGREATER"},
{LS_FN_DAPOS, "FUNC_ADIFFEGREATER"},
{LS_FN_TIMER, "FUNC_TIMER"},
{LS_FN_STICKY, "FUNC_STICKY"},
};
static int timerValue2lsw(uint32_t t)
{
if (t < 20) {
return t - 129;
} else if (600) {
return t / 5 - 113;
} else {
return t / 10 - 53;
}
}
// val = [-129,-110] => [0,19] (step 1)
// val = [-109,6] => [20,595] (step 5)
// val = [7,122] => [600,1750] (step 10)
//
static int lswTimerValue(int val)
{
return (val < -109 ? 129+val : (val < 7 ? (113+val)*5 : (53+val)*10));
}
namespace YAML
{
Node convert<LogicalSwitchData>::encode(const LogicalSwitchData& rhs)
{
Node node;
node["func"] = funcLut << rhs.func;
std::string def;
switch (rhs.getFunctionFamily()) {
case LS_FAMILY_VBOOL:
case LS_FAMILY_STICKY: {
def += YamlRawSwitchEncode(RawSwitch(rhs.val1));
def += ",";
def += YamlRawSwitchEncode(RawSwitch(rhs.val2));
} break;
case LS_FAMILY_EDGE: {
def += YamlRawSwitchEncode(RawSwitch(rhs.val1));
def += ",";
def += std::to_string(lswTimerValue(rhs.val2));
def += ",";
def += std::to_string(lswTimerValue(rhs.val3));
} break;
case LS_FAMILY_VCOMP: {
def += YamlRawSourceEncode(RawSource(rhs.val1));
def += ",";
def += YamlRawSourceEncode(RawSource(rhs.val2));
} break;
case LS_FAMILY_TIMER: {
def += std::to_string(lswTimerValue(rhs.val1));
def += ",";
def += std::to_string(lswTimerValue(rhs.val2));
} break;
default: {
def += YamlRawSourceEncode(RawSource(rhs.val1));
def += ",";
def += std::to_string(rhs.val2);
} break;
}
node["def"] = def;
node["delay"] = rhs.delay;
node["duration"] = rhs.duration;
node["andsw"] = YamlRawSwitchEncode(RawSwitch(rhs.andsw));
return node;
}
bool convert<LogicalSwitchData>::decode(const Node& node,
LogicalSwitchData& rhs)
{
node["func"] >> funcLut >> rhs.func;
std::string def_str;
node["def"] >> def_str;
std::stringstream def(def_str);
switch (rhs.getFunctionFamily()) {
case LS_FAMILY_VBOOL:
case LS_FAMILY_STICKY: {
std::string sw_str;
getline(def, sw_str, ',');
rhs.val1 = YamlRawSwitchDecode(sw_str).toValue();
rhs.val2 = YamlRawSwitchDecode(def.str()).toValue();
} break;
case LS_FAMILY_EDGE: {
std::string sw_str;
getline(def, sw_str, ',');
rhs.val1 = YamlRawSwitchDecode(sw_str).toValue();
int v2=0, v3=0;
def >> v2;
rhs.val2 = timerValue2lsw(v2);
def.ignore();
if (def.peek() == '<') {
rhs.val3 = -1;
} else if (def.peek() == '-') {
rhs.val3 = 0;
} else {
def >> v3;
rhs.val3 = timerValue2lsw(v3);
}
} break;
case LS_FAMILY_VCOMP: {
std::string src_str;
getline(def, src_str, ',');
rhs.val1 = YamlRawSourceDecode(src_str).toValue();
rhs.val2 = YamlRawSourceDecode(def.str()).toValue();
} break;
case LS_FAMILY_TIMER: {
int v1=0, v2=0;
def >> v1;
rhs.val1 = timerValue2lsw(v1);
def.ignore();
def >> v2;
rhs.val2 = timerValue2lsw(v2);
} break;
default: {
std::string src_str;
getline(def, src_str, ',');
rhs.val1 = YamlRawSourceDecode(src_str).toValue();
def >> rhs.val2;
} break;
}
node["delay"] >> rhs.delay;
node["duration"] >> rhs.duration;
RawSwitch andsw;
node["andsw"] >> andsw;
rhs.andsw = andsw.toValue();
return true;
}
} // namespace YAML
@@ -0,0 +1,31 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "yaml_ops.h"
#include "logicalswitchdata.h"
namespace YAML
{
template <>
struct convert<LogicalSwitchData> {
static Node encode(const LogicalSwitchData& rhs);
static bool decode(const Node& node, LogicalSwitchData& rhs);
};
} // namespace YAML
@@ -25,6 +25,7 @@
#include "yaml_expodata.h"
#include "yaml_curvedata.h"
#include "yaml_moduledata.h"
#include "yaml_logicalswitchdata.h"
#include "modeldata.h"
#include "output_data.h"
@@ -315,7 +316,13 @@ Node convert<ModelData>::encode(const ModelData& rhs)
node["points"] = points;
}
// logicalSw[]
for (int i = 0; i < CPN_MAX_LOGICAL_SWITCHES; i++) {
const LogicalSwitchData& ls = rhs.logicalSw[i];
if (!ls.isEmpty()) {
node["logicalSw"][std::to_string(i)] = ls;
}
}
// customFn[]
// swashRingData
@@ -397,8 +404,8 @@ bool convert<ModelData>::decode(const Node& node, ModelData& rhs)
node["curves"] >> rhs.curves;
YamlReadCurvePoints(node["points"], rhs.curves);
// logicalSw[]
// customFn[]
node["logicalSw"] >> rhs.logicalSw;
node["customFn"] >> rhs.customFn;
// swashRingData
@@ -51,8 +51,7 @@ const YamlLookupTable specialSourceLut = {
// TODO: { ???, "TX_GPS" },
};
namespace YAML {
Node convert<RawSource>::encode(const RawSource& rhs)
std::string YamlRawSourceEncode(const RawSource& rhs)
{
std::string src_str;
switch (rhs.type) {
@@ -123,13 +122,12 @@ Node convert<RawSource>::encode(const RawSource& rhs)
src_str = "NONE";
break;
}
return Node(src_str);
return src_str;
}
bool convert<RawSource>::decode(const Node& node, RawSource& rhs)
RawSource YamlRawSourceDecode(const std::string& src_str)
{
std::string src_str = node.Scalar();
RawSource rhs;
const char* val = src_str.data();
size_t val_len = src_str.size();
@@ -252,8 +250,20 @@ bool convert<RawSource>::decode(const Node& node, RawSource& rhs)
rhs.index = 0;
}
}
// TODO: raw analogs
return rhs;
}
namespace YAML {
Node convert<RawSource>::encode(const RawSource& rhs)
{
return Node(YamlRawSourceEncode(rhs));
}
bool convert<RawSource>::decode(const Node& node, RawSource& rhs)
{
std::string src_str = node.Scalar();
rhs = YamlRawSourceDecode(src_str);
return true;
}
} // namespace YAML
@@ -21,12 +21,13 @@
#include "yaml_ops.h"
#include "rawsource.h"
namespace YAML {
std::string YamlRawSourceEncode(const RawSource& rhs);
RawSource YamlRawSourceDecode(const std::string& src_str);
namespace YAML {
template <>
struct convert<RawSource> {
static Node encode(const RawSource& rhs);
static bool decode(const Node& node, RawSource& rhs);
};
}
@@ -46,14 +46,9 @@ const YamlLookupTable switchTypeLut = {
{ SWITCH_TYPE_OFF, "OFF" },
};
namespace YAML {
ENUM_CONVERTER(RawSwitchType, switchTypeLut);
Node convert<RawSwitch>::encode(const RawSwitch& rhs)
std::string YamlRawSwitchEncode(const RawSwitch& rhs)
{
std::string sw_str;
int32_t sval = rhs.index;
if (rhs.index < 0) {
sval = -sval;
@@ -96,13 +91,12 @@ Node convert<RawSwitch>::encode(const RawSwitch& rhs)
sw_str += LookupValue(switchTypeLut, rhs.type);
break;
}
return Node(sw_str);
return sw_str;
}
bool convert<RawSwitch>::decode(const Node& node, RawSwitch& rhs)
RawSwitch YamlRawSwitchDecode(const std::string& sw_str)
{
const std::string& sw_str = node.Scalar();
RawSwitch rhs;
const char* val = sw_str.data();
size_t val_len = sw_str.size();
@@ -147,7 +141,21 @@ bool convert<RawSwitch>::decode(const Node& node, RawSwitch& rhs)
if (neg) {
rhs.index = -rhs.index;
}
return rhs;
}
namespace YAML {
ENUM_CONVERTER(RawSwitchType, switchTypeLut);
Node convert<RawSwitch>::encode(const RawSwitch& rhs)
{
return Node(YamlRawSwitchEncode(rhs));
}
bool convert<RawSwitch>::decode(const Node& node, RawSwitch& rhs)
{
rhs = YamlRawSwitchDecode(node.Scalar());
return true;
}
} // namespace YAML
@@ -21,6 +21,9 @@
#include "yaml_ops.h"
#include "rawswitch.h"
std::string YamlRawSwitchEncode(const RawSwitch& rhs);
RawSwitch YamlRawSwitchDecode(const std::string& sw_str);
namespace YAML {
template <>