Compare commits

..

64 Commits

Author SHA1 Message Date
bsongis 19ef43cd7f Compilation error on VC++ 2014-06-17 17:38:29 +02:00
bsongis 1861c5e264 Release notes updated 2014-06-17 17:13:32 +02:00
Kjell Kernen e040ab9897 Fixes #1300 2014-06-17 17:05:47 +02:00
bsongis f2b59df0f6 OpenTX 2.0.3 preparation 2014-06-17 16:54:05 +02:00
bsongis 824059d033 PPM Pulses code modification pulled from ersky9x 2014-06-17 16:51:39 +02:00
bsongis 500ca6554d Sky9x compilation failure 2014-06-17 15:57:25 +02:00
bsongis b3b35eca5b Compilation failure 2014-06-17 15:48:03 +02:00
bsongis 39118453da Code cleanup on Sky9x pulses 2014-06-17 15:41:27 +02:00
bsongis 9e64801384 Compilation failure on Sky9x without FRSKY extension 2014-06-17 15:41:27 +02:00
Damjan Adamic 6497407788 Removed frskyData.hub.gpsDistance simulator initialization because it is a calculated value. 2014-06-17 14:42:29 +02:00
Bertrand Songis 5a3d2244d8 Fixes #1267 2014-06-17 13:17:57 +02:00
Damjan Adamic 8115a78df7 Added couple of simulator telemety initialization values. 2014-06-17 13:04:35 +02:00
Michele f597e6412b Update it.h.txt
Some changes in Italian translations
2014-06-17 12:53:34 +02:00
Bertrand Songis 3df0b12ccb Update DONATIONS.txt 2014-06-17 12:31:25 +02:00
Damjan Adamic f99fc83993 Fixes #1264 - CFN_GVAR_CST_MAX is 500, int16_t is needed 2014-06-17 11:50:08 +02:00
bsongis bf511767ce Fixes #1281 - Needs to be tested on Windows 8 2014-06-17 11:34:02 +02:00
bsongis 9682bf116d Fixes #1271 2014-06-17 11:27:59 +02:00
bsongis 6086112cf9 Fixes #1264 2014-06-17 11:16:42 +02:00
bsongis 6dacd5a914 Google tests didn't compile with my last commit 2014-06-17 11:07:20 +02:00
bsongis 2094e87da5 'phase' renamed to 'flight mode' everywhere in the code 2014-06-17 10:59:00 +02:00
bsongis 20125474c1 Fixes #1267 2014-06-17 10:59:00 +02:00
Damjan Adamic 18f327612f re #1294 - clear input name if removing last input line 2014-06-17 10:01:14 +02:00
Damjan Adamic 6689919a39 Fixes #1294 - Companion, Delete action without a selection 2014-06-17 09:25:57 +02:00
bsongis c7133bb5a0 Backlight driver fixed on Taranis+ 2014-06-17 08:50:02 +02:00
Bertrand Songis a40dc4c4d2 Update DONATIONS.txt 2014-06-17 07:45:33 +02:00
bsongis 9840cc7dfc Fixes #1285 2014-06-16 18:01:42 +02:00
bsongis 8cd55856e9 Fixes #1288 2014-06-16 17:48:23 +02:00
bsongis f4bbaf682c Fixes #1292 2014-06-16 17:39:49 +02:00
Bertrand Songis db7dd83168 Update DONATIONS.txt 2014-06-16 17:34:05 +02:00
bsongis 4d71fb31db Reset All should be named Reset Flight 2014-06-16 14:49:54 +02:00
bsongis 101293124a timer10.wav and timerlt3.wav shouldn't exist any more (beeps) 2014-06-16 14:49:53 +02:00
Damjan Adamic effcb1610b Fixes #1290 - Gvar popup wrong if same as other FM 2014-06-15 18:50:45 +02:00
Bertrand Songis 97b37a5024 Update DONATIONS.txt 2014-06-15 16:40:18 +02:00
Bertrand Songis c79d78664b Update DONATIONS.txt 2014-06-15 15:23:02 +02:00
Bertrand Songis 9c972b0c42 Merge pull request #1286 from opentx/driver33/PL_TR
fixes
2014-06-14 22:54:27 +02:00
Jacek Drewniak 35765394dc fixes 2014-06-14 21:58:57 +02:00
Bertrand Songis 219c4e913c Merge pull request #1284 from opentx/projectkk2glider/issue_1269
Fixes #1269 - RSSI Tx should be hidden in companion if radio is Taranis.
2014-06-14 20:58:44 +02:00
Bertrand Songis d3ca801e53 Update DONATIONS.txt 2014-06-14 20:49:10 +02:00
Damjan Adamic 1c2257190a Fixes #1269 - RSSI Tx should be hidden in companion if radio is Taranis.
I followed isTelemetrySourceAvailable() and hided RssiTx and dTE.
2014-06-14 19:03:03 +02:00
Damjan Adamic f509a7d22b bug: wrong locaion for addText() 2014-06-14 18:30:23 +02:00
Bertrand Songis 44829cd579 Merge pull request #1276 from opentx/projectkk2glider/issue_1266
Fixes #1266 - Companion timer value not in time format
2014-06-14 11:30:34 +02:00
bsongis 94e749d08e Companion: limit for comparaison of timers in Logical Switches is now
300 (1 hour)
2014-06-14 11:22:53 +02:00
bsongis 726a03d433 Fixes #1277 2014-06-14 11:20:40 +02:00
bsongis d6ef1c011b Now the Lua Telemetry scripts 2014-06-14 11:13:02 +02:00
bsongis f295f3b888 Function renamed 2014-06-14 11:09:40 +02:00
Damjan Adamic f55e5f862b Merge pull request #1280 from opentx/ChrisNisbet01/issue_1278
Chris nisbet01/issue 1278
2014-06-14 09:03:16 +02:00
Bertrand Songis 3c5d9c617a Update DONATIONS.txt 2014-06-14 08:57:35 +02:00
Damjan Adamic 10413bbede Removed compiler warning: lua.cpp:63:60: warning: missing braces around initializer for 'ScriptInputsOutputs' [-Wmissing-braces] 2014-06-14 08:24:00 +02:00
Damjan Adamic 91dfb0309e Removed compiler warning: lua.cpp:1382:21: warning: variable 'filename' set but not used [-Wunused-but-set-variable] 2014-06-14 08:18:47 +02:00
Damjan Adamic 6707f68923 One more warning removed: ../targets/taranis/board_taranis.h:256:3: warning: function declaration isn't a prototype [-Wstrict-prototypes] 2014-06-14 08:10:40 +02:00
Chris Nisbet c4b19de8eb CN - Couple of bug fixes in USB code. This functions the bugs were in don't appear to be called by any of the OpenTX code. 2014-06-14 13:02:51 +12:00
Damjan Adamic 5351514180 Using enume instead of numeric constants 2014-06-14 00:04:44 +02:00
Damjan Adamic 37ec428efc Fixes #1266 - Companion timer value not in time format 2014-06-13 23:34:01 +02:00
Bertrand Songis 1941d3eb7e Update DONATIONS.txt 2014-06-13 23:23:01 +02:00
bsongis e3df420f8e Lua scripts directories changed. We will now have
/SCRIPTS/WIZARD/
/SCRIPTS/TEMPLATES/
/SCRIPTS/MIXES/
/SCRIPTS/FUNCTIONS/
2014-06-13 14:37:57 +02:00
bsongis 87c8b4b153 #1227 - TRIM_MARGIN is now radio dependant 2014-06-13 11:32:21 +02:00
bsongis 4149361de8 Hungarian voice added 2014-06-13 10:33:10 +02:00
bsongis 2fbd68ecb3 Google analytics removed. Completely wrong, we use the compilation
server numbers instead.
2014-06-13 10:17:36 +02:00
Bertrand Songis cedac96cf4 Update DONATIONS.txt 2014-06-13 07:29:20 +02:00
bsongis 89433127c4 Lua scripts now in custom functions! 2014-06-12 18:18:42 +02:00
Kjell Kernen c23f1e974a Fixes #1262 2014-06-12 16:14:21 +02:00
bsongis 9a83325119 Compilation error when GAUGES=NO 2014-06-12 15:59:54 +02:00
Damjan Adamic a596001338 Companion mixer tab, if CH1 is empty the Move up button will never bring something there, fixes #1261 2014-06-12 15:16:50 +02:00
Bertrand Songis 1127ea412e Update DONATIONS.txt 2014-06-12 12:27:12 +02:00
99 changed files with 2893 additions and 2331 deletions
+13
View File
@@ -467,3 +467,16 @@ Martijn Kruissen
Jörgen Norman
Nathan Kinney
John Godden
Larry Roper
Mike Frizell
Daniel Pospolita
Peter Herz
Don Mondrik
Paul Fram
Charles Knight
Matthew Adams
Kenneth Reed
Gary Wild
Christof Ramm
Bruno Bedard
Salih Samim Aydin
+6
View File
@@ -1,3 +1,9 @@
<h2>Version 2.0.3</h2>
<ul>
<li>EEPROM import bug on AdjustGVAR function</li>
<li>Timers correctly displayed in logical switches tab</li>
</ul>
<h2>Version 2.0.2</h2>
<ul>
<li>Mouse scroll wheel behaves differently</li>
+2 -7
View File
@@ -2,7 +2,7 @@ PROJECT( companion )
SET( C9X_VERSION_MAJOR "2" )
SET( C9X_VERSION_MINOR "0" )
SET( C9X_VERSION_REVISION "2" )
SET( C9X_VERSION_REVISION "3" )
SET( C9X_VERSION ${C9X_VERSION_MAJOR}.${C9X_VERSION_MINOR}.${C9X_VERSION_REVISION} )
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
@@ -130,15 +130,10 @@ set(common_SRCS
firmwares/opentx/opentxM128simulator.cpp
firmwares/opentx/opentxM64simulator.cpp
file.cpp
googleanalytics.cpp
appdata.cpp
)
set(common_MOC_HDRS
googleanalytics.h
)
qt4_wrap_cpp( common_SRCS ${common_MOC_HDRS} )
qt4_wrap_cpp(common_SRCS)
add_library(common ${common_SRCS})
+3
View File
@@ -633,6 +633,9 @@ AppData::AppData()
settings.remove("startup_check_companion9x");
settings.remove("wizardEnable");
// Delete settings that we do not want to carry over from 1.52
settings.remove("dfu_location");
// Select the new default profile as current profile
id( 0 );
}
+1 -4
View File
@@ -3,7 +3,6 @@
#include <QtGui>
#include "eeprominterface.h"
#include "flashinterface.h"
#include "googleanalytics.h"
#if defined WIN32 || !defined __GNUC__
#include <Windows.h>
@@ -94,8 +93,6 @@ avrOutputDialog::avrOutputDialog(QWidget *parent, QString prog, QStringList arg,
process->start(prog,arg);
}
}
ga.sendPageView(getBoardName(GetCurrentFirmware()->getBoard()) + " Flash");
}
# if !__GNUC__
@@ -142,8 +139,8 @@ void avrOutputDialog::doCopy()
if (source.open(QIODevice::ReadOnly)) {
QFile dest(destFile);
if (dest.open(QIODevice::WriteOnly)) {
addText(tr("Writing file: "));
for (int i=0; i<blocks; i++) {
addText(tr("Writing file: "));
int read = source.read(buf, BLKSIZE);
if (dest.write(buf, read) == read) {
dest.flush();
+14 -14
View File
@@ -310,8 +310,8 @@ void CompareDialog::printPhases()
}
str.append("</tr>");
for (i=0; i<GetCurrentFirmware()->getCapability(FlightModes); i++) {
PhaseData *pd1=&g_model1->phaseData[i];
PhaseData *pd2=&g_model2->phaseData[i];
FlightModeData *pd1=&g_model1->flightModeData[i];
FlightModeData *pd2=&g_model2->flightModeData[i];
str.append("<tr><td><b>"+tr("FM")+QString("%1</b> ").arg(i));
color=getColor1(pd1->name,pd2->name);
str.append(QString("<font size=+1 face='Courier New' color=%2>%1</font></td>").arg(pd1->name).arg(color));
@@ -367,8 +367,8 @@ void CompareDialog::printPhases()
}
str.append("</tr>");
for (i=0; i<GetCurrentFirmware()->getCapability(FlightModes); i++) {
PhaseData *pd1=&g_model1->phaseData[i];
PhaseData *pd2=&g_model2->phaseData[i];
FlightModeData *pd1=&g_model1->flightModeData[i];
FlightModeData *pd2=&g_model2->flightModeData[i];
str.append("<tr><td><b>"+tr("FM")+QString("%1</b> ").arg(i));
color=getColor1(pd1->name,pd2->name);
str.append(QString("<font size=+1 face='Courier New' color=%2>%1</font></td>").arg(pd1->name).arg(color));
@@ -412,8 +412,8 @@ void CompareDialog::printPhases()
}
str.append("</tr>");
for (i=0; i<GetCurrentFirmware()->getCapability(FlightModes); i++) {
PhaseData *pd1=&g_model1->phaseData[i];
PhaseData *pd2=&g_model2->phaseData[i];
FlightModeData *pd1=&g_model1->flightModeData[i];
FlightModeData *pd2=&g_model2->flightModeData[i];
str.append("<tr><td><b>"+tr("FM")+QString("%1</b> ").arg(i));
color=getColor2(pd1->name,pd2->name);
str.append(QString("<font size=+1 face='Courier New' color=%2>%1</font></td>").arg(pd2->name).arg(color));
@@ -456,8 +456,8 @@ void CompareDialog::printPhases()
}
str.append("</tr>");
for (i=0; i<GetCurrentFirmware()->getCapability(FlightModes); i++) {
PhaseData *pd1=&g_model1->phaseData[i];
PhaseData *pd2=&g_model2->phaseData[i];
FlightModeData *pd1=&g_model1->flightModeData[i];
FlightModeData *pd2=&g_model2->flightModeData[i];
str.append("<tr><td><b>"+tr("FM")+QString("%1</b> ").arg(i));
color=getColor1(pd1->name,pd2->name);
str.append(QString("<font size=+1 face='Courier New' color=%2>%1</font></td>").arg(pd2->name).arg(color));
@@ -574,8 +574,8 @@ void CompareDialog::printGvars()
str.append("<tr><td colspan=2><h2>"+tr("Global Variables")+"</h2></td></tr>");
str.append("<tr><td width=50%>");
str.append("<table border=1 cellspacing=0 cellpadding=3 width=100>");
PhaseData *pd1=&g_model1->phaseData[0];
PhaseData *pd2=&g_model2->phaseData[0];
FlightModeData *pd1=&g_model1->flightModeData[0];
FlightModeData *pd2=&g_model2->flightModeData[0];
int width=100/gvarnum;
str.append("<tr>");
for(int i=0; i<gvarnum; i++) {
@@ -673,7 +673,7 @@ void CompareDialog::printExpos()
first=1;
for (int j=0; j<GetCurrentFirmware()->getCapability(FlightModes);j++) {
if (!(ed->phases & mask)) {
PhaseData *pd = &g_model1->phaseData[j];
FlightModeData *pd = &g_model1->flightModeData[j];
if (!first) {
str += QString(", ")+ QString("%1").arg(getPhaseName(j+1, pd->name));
} else {
@@ -751,7 +751,7 @@ void CompareDialog::printExpos()
first=1;
for (int j=0; j<GetCurrentFirmware()->getCapability(FlightModes);j++) {
if (!(ed->phases & mask)) {
PhaseData *pd = &g_model2->phaseData[j];
FlightModeData *pd = &g_model2->flightModeData[j];
if (!first) {
str += QString(", ")+ QString("%1").arg(getPhaseName(j+1, pd->name));
} else {
@@ -849,7 +849,7 @@ void CompareDialog::printMixers()
first=1;
for (int j=0; j<GetCurrentFirmware()->getCapability(FlightModes);j++) {
if (!(md->phases & mask)) {
PhaseData *pd = &g_model1->phaseData[j];
FlightModeData *pd = &g_model1->flightModeData[j];
if (!first) {
str += QString(", ")+ QString("%1").arg(getPhaseName(j+1, pd->name));
} else {
@@ -928,7 +928,7 @@ void CompareDialog::printMixers()
first=1;
for (int j=0; j<GetCurrentFirmware()->getCapability(FlightModes);j++) {
if (!(md->phases & mask)) {
PhaseData *pd = &g_model2->phaseData[j];
FlightModeData *pd = &g_model2->flightModeData[j];
if (!first) {
str += QString(", ")+ QString("%1").arg(getPhaseName(j+1, pd->name));
} else {
+35 -10
View File
@@ -116,7 +116,7 @@ RawSourceRange RawSource::getRange(bool singleprec)
case TELEMETRY_SOURCE_TIMER1:
case TELEMETRY_SOURCE_TIMER2:
result.step = singleprec ? 5 : 1;
result.max = singleprec ? 255*5 : 7200;
result.max = singleprec ? 255*5 : 60*60;
break;
case TELEMETRY_SOURCE_RSSI_TX:
case TELEMETRY_SOURCE_RSSI_RX:
@@ -459,6 +459,11 @@ CSFunctionFamily LogicalSwitchData::getFunctionFamily()
return LS_FAMILY_VCOMP;
}
bool LogicalSwitchData::isDeltaFunction()
{
return (func == LS_FN_DPOS || func == LS_FN_DAPOS);
}
QString LogicalSwitchData::funcToString()
{
switch (func) {
@@ -545,7 +550,7 @@ QString LogicalSwitchData::toString(const ModelData & model)
else if (func == LS_FN_DPOS) result = "d(" + res + ")";
result += res;
if (func == LS_FN_APOS || func == LS_FN_VPOS || func == LS_FN_DAPOS || func == LS_FN_DPOS)
if (func == LS_FN_APOS || func == LS_FN_VPOS || isDeltaFunction())
result += " &gt; ";
else if (func == LS_FN_ANEG || func == LS_FN_VNEG)
result += " &lt; ";
@@ -1045,14 +1050,34 @@ bool ModelData::isInputValid(const unsigned int idx) const
void ModelData::removeInput(const int idx)
{
unsigned int chn = expoData[idx].chn;
memmove(&expoData[idx], &expoData[idx+1], (C9X_MAX_EXPOS-(idx+1))*sizeof(ExpoData));
expoData[C9X_MAX_EXPOS-1].clear();
//also remove input name if removing last line for this input
bool found = false;
for (int i=0; i<C9X_MAX_EXPOS; i++) {
if (expoData[i].mode==0) continue;
if (expoData[i].chn==chn) {
found = true;
break;
}
}
if (!found) inputNames[chn][0] = 0;
}
void ModelData::clearInputs()
{
for (int i=0; i<C9X_MAX_EXPOS; i++)
expoData[i].clear();
//clear all input names
if (GetCurrentFirmware()->getCapability(VirtualInputs)) {
for (int i=0; i<C9X_MAX_INPUTS; i++) {
inputNames[i][0] = 0;
}
}
}
void ModelData::clearMixes()
@@ -1080,7 +1105,7 @@ void ModelData::clear()
moduleData[1].protocol=OFF;
}
for (int i=0; i<C9X_MAX_FLIGHT_MODES; i++) {
phaseData[i].clear();
flightModeData[i].clear();
}
clearInputs();
clearMixes();
@@ -1149,7 +1174,7 @@ int ModelData::getTrimValue(int phaseIdx, int trimIdx)
{
int result = 0;
for (int i=0; i<C9X_MAX_FLIGHT_MODES; i++) {
PhaseData & phase = phaseData[phaseIdx];
FlightModeData & phase = flightModeData[phaseIdx];
if (phase.trimMode[trimIdx] < 0) {
return result;
}
@@ -1171,17 +1196,17 @@ int ModelData::getTrimValue(int phaseIdx, int trimIdx)
bool ModelData::isGVarLinked(int phaseIdx, int gvarIdx)
{
return phaseData[phaseIdx].gvars[gvarIdx] > 1024;
return flightModeData[phaseIdx].gvars[gvarIdx] > 1024;
}
int ModelData::getGVarValue(int phaseIdx, int gvarIdx)
{
int idx = phaseData[phaseIdx].gvars[gvarIdx];
int idx = flightModeData[phaseIdx].gvars[gvarIdx];
for (int i=0; idx>1024 && i<C9X_MAX_FLIGHT_MODES; i++) {
int nextPhase = idx - 1025;
if (nextPhase >= phaseIdx) nextPhase += 1;
phaseIdx = nextPhase;
idx = phaseData[phaseIdx].gvars[gvarIdx];
idx = flightModeData[phaseIdx].gvars[gvarIdx];
}
return idx;
}
@@ -1189,7 +1214,7 @@ int ModelData::getGVarValue(int phaseIdx, int gvarIdx)
void ModelData::setTrimValue(int phaseIdx, int trimIdx, int value)
{
for (uint8_t i=0; i<C9X_MAX_FLIGHT_MODES; i++) {
PhaseData & phase = phaseData[phaseIdx];
FlightModeData & phase = flightModeData[phaseIdx];
int mode = phase.trimMode[trimIdx];
int p = phase.trimRef[trimIdx];
int & trim = phase.trim[trimIdx];
@@ -1216,9 +1241,9 @@ void ModelData::setTrimValue(int phaseIdx, int trimIdx, int value)
void ModelData::removeGlobalVar(int & var)
{
if (var >= 126 && var <= 130)
var = phaseData[0].gvars[var-126];
var = flightModeData[0].gvars[var-126];
else if (var <= -126 && var >= -130)
var = - phaseData[0].gvars[-126-var];
var = - flightModeData[0].gvars[-126-var];
}
ModelData ModelData::removeGlobalVars()
+18 -10
View File
@@ -370,6 +370,11 @@ class RawSource {
return (this->type != other.type) || (this->index != other.index);
}
bool isTimeBased() const
{
return (type==SOURCE_TYPE_TELEMETRY && (index==TELEMETRY_SOURCE_TX_TIME || index==TELEMETRY_SOURCE_TIMER1 || index==TELEMETRY_SOURCE_TIMER2));
}
RawSourceType type;
int index;
const ModelData * model;
@@ -710,6 +715,7 @@ class LogicalSwitchData { // Logical Switches data
int andsw;
void clear() { memset(this, 0, sizeof(LogicalSwitchData)); }
CSFunctionFamily getFunctionFamily();
bool isDeltaFunction();
QString funcToString();
QString toString(const ModelData & model);
};
@@ -760,9 +766,9 @@ class FuncSwData { // Function Switches data
QStringList toStringList();
};
class PhaseData {
class FlightModeData {
public:
PhaseData() { clear(); }
FlightModeData() { clear(); }
int trimMode[NUM_STICKS];
int trimRef[NUM_STICKS];
int trim[NUM_STICKS];
@@ -772,7 +778,7 @@ class PhaseData {
unsigned int fadeOut;
int rotaryEncoders[2];
int gvars[C9X_MAX_GVARS];
void clear() { memset(this, 0, sizeof(PhaseData)); }
void clear() { memset(this, 0, sizeof(FlightModeData)); }
};
class SwashRingData { // Swash Ring data
@@ -991,7 +997,7 @@ class ModelData {
bool extendedLimits; // TODO xml
bool extendedTrims;
bool throttleReversed;
PhaseData phaseData[C9X_MAX_FLIGHT_MODES];
FlightModeData flightModeData[C9X_MAX_FLIGHT_MODES];
MixData mixData[C9X_MAX_MIXERS];
LimitData limitData[C9X_NUM_CHNOUT];
@@ -1231,12 +1237,12 @@ inline void applyStickModeToModel(ModelData &model, unsigned int mode)
for (int p=0; p<C9X_MAX_FLIGHT_MODES; p++) {
for (int i=0; i<NUM_STICKS/2; i++) {
int converted_stick = applyStickMode(i+1, mode) - 1;
int tmp = model.phaseData[p].trim[i];
model.phaseData[p].trim[i] = model.phaseData[p].trim[converted_stick];
model.phaseData[p].trim[converted_stick] = tmp;
tmp = model.phaseData[p].trimRef[i];
model.phaseData[p].trimRef[i] = model.phaseData[p].trimRef[converted_stick];
model.phaseData[p].trimRef[converted_stick] = tmp;
int tmp = model.flightModeData[p].trim[i];
model.flightModeData[p].trim[i] = model.flightModeData[p].trim[converted_stick];
model.flightModeData[p].trim[converted_stick] = tmp;
tmp = model.flightModeData[p].trimRef[i];
model.flightModeData[p].trimRef[i] = model.flightModeData[p].trimRef[converted_stick];
model.flightModeData[p].trimRef[converted_stick] = tmp;
}
}
@@ -1366,6 +1372,8 @@ class FirmwareInterface {
virtual int getCapability(const Capability) = 0;
virtual bool isTelemetrySourceAvailable(int source) = 0;
virtual SimulatorInterface * getSimulator()
{
return NULL;
+1 -1
View File
@@ -443,7 +443,7 @@ t_Er9xModelData::operator ModelData ()
}
for (int i=0; i<NUM_STICKS; i++)
c9x.phaseData[0].trim[i] = trim[i];
c9x.flightModeData[0].trim[i] = trim[i];
for (int i=0; i<ER9X_MAX_CURVE5; i++) {
c9x.curves[i].count = 5;
+3 -3
View File
@@ -195,13 +195,13 @@ PACK(typedef struct t_gvar {
// int8_t gvswitch ;
}) Er9xGvarData ;
PACK(typedef struct t_PhaseData {
PACK(typedef struct t_FlightModeData {
// Trim store as -1001 to -1, trim value-501, 0-5 use trim of phase 0-5
int16_t trim[4]; // -500..500 => trim value, 501 => use trim of phase 0, 502, 503, 504 => use trim of modes 1|2|3|4 instead
int8_t swtch; // Try 0-5 use trim of phase 0-5, 1000-2000, trim + 1500 ???
uint8_t fadeIn:4;
uint8_t fadeOut:4;
}) Er9xPhaseData;
}) Er9xFlightModeData;
PACK(typedef struct t_Er9xModelData {
char name[10]; // 10 must be first for eeLoadModelName
@@ -251,7 +251,7 @@ PACK(typedef struct t_Er9xModelData {
uint8_t unused1[8] ;
uint8_t CustomDisplayIndex[6] ;
Er9xGvarData gvars[ER9X_MAX_GVARS] ;
Er9xPhaseData phaseData[ER9X_MAX_MODES] ;
Er9xFlightModeData flightModeData[ER9X_MAX_MODES] ;
operator ModelData();
t_Er9xModelData() { memset(this, 0, sizeof(t_Er9xModelData)); }
@@ -571,7 +571,7 @@ t_Ersky9xModelData_v10::operator ModelData ()
}
for (int i=0; i<NUM_STICKS; i++)
c9x.phaseData[0].trim[i] = trim[i];
c9x.flightModeData[0].trim[i] = trim[i];
for (int i=0; i<ERSKY9X_MAX_CURVE5; i++) {
c9x.curves[i].count = 5;
@@ -690,7 +690,7 @@ t_Ersky9xModelData_v11::operator ModelData ()
}
for (int i=0; i<NUM_STICKS; i++)
c9x.phaseData[0].trim[i] = trim[i];
c9x.flightModeData[0].trim[i] = trim[i];
for (int i=0; i<ERSKY9X_MAX_CURVE5; i++) {
c9x.curves[i].count = 5;
@@ -726,7 +726,7 @@ t_Ersky9xModelData_v11::operator ModelData ()
// c9x.customdisplay[i]=customDisplayIndex[i];
// }
for (int i=0; i<5;i++) {
c9x.phaseData[0].gvars[i]=gvars[i].gvar;
c9x.flightModeData[0].gvars[i]=gvars[i].gvar;
// c9x.gvsource[i]=gvars[i].gvsource;
}
return c9x;
@@ -237,14 +237,14 @@ PACK(typedef struct t_Ersky9xgvar {
// int8_t gvswitch ;
}) Ersky9xGvarData ;
PACK(typedef struct t_Ersky9xPhaseData {
PACK(typedef struct t_Ersky9xFlightModeData {
int16_t trim[4]; // -500..500 => trim value, 501 => use trim of phase 0, 502, 503, 504 => use trim of phases 1|2|3|4 instead
int8_t swtch; // swtch of phase[0] is not used
char name[6];
uint8_t fadeIn:4;
uint8_t fadeOut:4;
uint16_t spare ; // Future expansion
}) Ersky9xPhaseData;
}) Ersky9xFlightModeData;
PACK(typedef struct t_Ersky9xFuncSwData { // Function Switches data
int8_t swtch; //input
@@ -421,7 +421,7 @@ PACK(typedef struct t_Ersky9xModelData_v11 {
// Add 6 bytes for custom telemetry screen
uint8_t customDisplayIndex[6] ;
Ersky9xFuncSwData funcSw[ERSKY9X_NUM_FSW];
Ersky9xPhaseData phaseData[6] ;
Ersky9xFlightModeData flightModeData[6] ;
Ersky9xGvarData gvars[ERSKY9X_MAX_GVARS] ;
operator ModelData();
@@ -347,9 +347,9 @@ t_Gruvin9xSwashRingData::operator SwashRingData ()
return c9x;
}
t_Gruvin9xPhaseData_v102::operator PhaseData ()
t_Gruvin9xFlightModeData_v102::operator FlightModeData ()
{
PhaseData c9x;
FlightModeData c9x;
for (int i=0; i<NUM_STICKS; i++)
c9x.trim[i] = trim[i];
c9x.swtch = gruvin9xToSwitch(swtch);
@@ -359,9 +359,9 @@ t_Gruvin9xPhaseData_v102::operator PhaseData ()
return c9x;
}
t_Gruvin9xPhaseData_v106::operator PhaseData ()
t_Gruvin9xFlightModeData_v106::operator FlightModeData ()
{
PhaseData c9x;
FlightModeData c9x;
for (int i=0; i<NUM_STICKS; i++)
c9x.trim[i] = (((int16_t)trim[i]) << 2) + ((trim_ext >> (2*i)) & 0x03);
c9x.swtch = gruvin9xToSwitch(swtch);
@@ -454,7 +454,7 @@ t_Gruvin9xModelData_v102::operator ModelData ()
c9x.moduleData[0].ppmPulsePol = pulsePol;
c9x.extendedLimits = extendedLimits;
for (int i=0; i<G9X_MAX_FLIGHT_MODES; i++)
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int i=0; i<G9X_MAX_MIXERS; i++)
c9x.mixData[i] = mixData[i];
for (int i=0; i<G9X_NUM_CHNOUT; i++)
@@ -525,7 +525,7 @@ t_Gruvin9xModelData_v103::operator ModelData ()
c9x.moduleData[0].ppmPulsePol = pulsePol;
c9x.extendedLimits = extendedLimits;
for (int i=0; i<G9X_MAX_FLIGHT_MODES; i++)
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int i=0; i<G9X_MAX_MIXERS; i++)
c9x.mixData[i] = mixData[i];
for (int i=0; i<G9X_NUM_CHNOUT; i++)
@@ -597,20 +597,20 @@ t_Gruvin9xModelData_v105::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<G9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (phaseData[i].trim[j] > 125) {
c9x.phaseData[i].trimRef[j] = 0;
c9x.phaseData[i].trim[j] = 0;
if (flightModeData[i].trim[j] > 125) {
c9x.flightModeData[i].trimRef[j] = 0;
c9x.flightModeData[i].trim[j] = 0;
}
else if (phaseData[i].trim[j] < -125) {
c9x.phaseData[i].trimRef[j] = 129 + phaseData[i].trim[j];
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
else if (flightModeData[i].trim[j] < -125) {
c9x.flightModeData[i].trimRef[j] = 129 + flightModeData[i].trim[j];
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
else {
c9x.phaseData[i].trim[j] += subtrim[j];
c9x.flightModeData[i].trim[j] += subtrim[j];
}
}
}
@@ -688,13 +688,13 @@ t_Gruvin9xModelData_v106::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<G9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -244,19 +244,19 @@ PACK(typedef struct t_Gruvin9xSwashRingData { // Swash Ring data
t_Gruvin9xSwashRingData();
}) Gruvin9xSwashRingData;
PACK(typedef struct t_Gruvin9xPhaseData_v102 {
PACK(typedef struct t_Gruvin9xFlightModeData_v102 {
int8_t trim[4]; // -125..125 => trim value, 127 => use trim of phase 0, -128, -127, -126 => use trim of phases 1|2|3|4 instead
int8_t swtch; // swtch of phase[0] is not used
char name[6];
uint8_t fadeIn:4;
uint8_t fadeOut:4;
operator PhaseData();
t_Gruvin9xPhaseData_v102() { memset(this, 0, sizeof(t_Gruvin9xPhaseData_v102)); }
}) Gruvin9xPhaseData_v102;
operator FlightModeData();
t_Gruvin9xFlightModeData_v102() { memset(this, 0, sizeof(t_Gruvin9xFlightModeData_v102)); }
}) Gruvin9xFlightModeData_v102;
PACK(typedef struct t_Gruvin9xPhaseData_v106 {
PACK(typedef struct t_Gruvin9xFlightModeData_v106 {
int8_t trim[4]; // -500..500 => trim value, 501 => use trim of phase 0, 502, 503, 504 => use trim of phases 1|2|3|4 instead
int8_t trim_ext:8; // 2 less significant extra bits per trim (10bits trims)
int8_t swtch; // swtch of phase[0] is not used
@@ -264,9 +264,9 @@ PACK(typedef struct t_Gruvin9xPhaseData_v106 {
uint8_t fadeIn:4;
uint8_t fadeOut:4;
operator PhaseData();
t_Gruvin9xPhaseData_v106() { memset(this, 0, sizeof(t_Gruvin9xPhaseData_v106)); }
}) Gruvin9xPhaseData_v106;
operator FlightModeData();
t_Gruvin9xFlightModeData_v106() { memset(this, 0, sizeof(t_Gruvin9xFlightModeData_v106)); }
}) Gruvin9xFlightModeData_v106;
PACK(typedef struct t_Gruvin9xTimerData {
int8_t mode:7; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
@@ -312,7 +312,7 @@ PACK(typedef struct t_Gruvin9xModelData_v102 {
Gruvin9xLogicalSwitchData customSw[G9X_NUM_CSW];
Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT];
Gruvin9xSwashRingData swashR;
Gruvin9xPhaseData_v102 phaseData[G9X_MAX_FLIGHT_MODES];
Gruvin9xFlightModeData_v102 flightModeData[G9X_MAX_FLIGHT_MODES];
Gruvin9xFrSkyData frsky;
operator ModelData();
@@ -344,7 +344,7 @@ PACK(typedef struct t_Gruvin9xModelData_v103 {
Gruvin9xLogicalSwitchData customSw[G9X_NUM_CSW];
Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT];
Gruvin9xSwashRingData swashR;
Gruvin9xPhaseData_v102 phaseData[G9X_MAX_FLIGHT_MODES];
Gruvin9xFlightModeData_v102 flightModeData[G9X_MAX_FLIGHT_MODES];
Gruvin9xFrSkyData frsky;
operator ModelData();
@@ -377,7 +377,7 @@ PACK(typedef struct t_Gruvin9xModelData_v105 {
Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT];
Gruvin9xFuncSwData funcSw[G9X_NUM_FSW];
Gruvin9xSwashRingData swashR;
Gruvin9xPhaseData_v102 phaseData[G9X_MAX_FLIGHT_MODES];
Gruvin9xFlightModeData_v102 flightModeData[G9X_MAX_FLIGHT_MODES];
int16_t subtrim[NUM_STICKS];
Gruvin9xFrSkyData frsky;
@@ -409,7 +409,7 @@ PACK(typedef struct t_Gruvin9xModelData_v106 {
Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT];
Gruvin9xFuncSwData funcSw[G9X_NUM_FSW];
Gruvin9xSwashRingData swashR;
Gruvin9xPhaseData_v106 phaseData[G9X_MAX_FLIGHT_MODES];
Gruvin9xFlightModeData_v106 flightModeData[G9X_MAX_FLIGHT_MODES];
Gruvin9xFrSkyData frsky;
operator ModelData();
@@ -8,9 +8,9 @@
extern void getEEPROMZString(char *dst, const char *src, int size);
extern RawSwitch open9xStockToSwitch(int8_t sw);
t_Open9xGruvin9xPhaseData_v207::operator PhaseData ()
t_Open9xGruvin9xFlightModeData_v207::operator FlightModeData ()
{
PhaseData c9x;
FlightModeData c9x;
for (int i=0; i<NUM_STICKS; i++)
c9x.trim[i] = (((int16_t)trim[i]) << 2) + ((trim_ext >> (2*i)) & 0x03);
c9x.swtch = open9xStockToSwitch(swtch);
@@ -22,9 +22,9 @@ t_Open9xGruvin9xPhaseData_v207::operator PhaseData ()
return c9x;
}
t_Open9xGruvin9xPhaseData_v208::operator PhaseData ()
t_Open9xGruvin9xFlightModeData_v208::operator FlightModeData ()
{
PhaseData c9x;
FlightModeData c9x;
for (int i=0; i<NUM_STICKS; i++)
c9x.trim[i] = trim[i];
c9x.swtch = open9xStockToSwitch(swtch);
@@ -461,13 +461,13 @@ t_Open9xGruvin9xModelData_v207::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -546,13 +546,13 @@ t_Open9xGruvin9xModelData_v208::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -635,13 +635,13 @@ t_Open9xGruvin9xModelData_v209::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -725,13 +725,13 @@ t_Open9xGruvin9xModelData_v210::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -812,13 +812,13 @@ t_Open9xGruvin9xModelData_v211::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -22,7 +22,7 @@
#include "open9xStockeeprom.h"
PACK(typedef struct t_Open9xGruvin9xPhaseData_v207 {
PACK(typedef struct t_Open9xGruvin9xFlightModeData_v207 {
int8_t trim[4]; // -500..500 => trim value, 501 => use trim of phase 0, 502, 503, 504 => use trim of phases 1|2|3|4 instead
int8_t trim_ext:8; // 2 less significant extra bits per trim (10bits trims)
int8_t swtch; // swtch of phase[0] is not used
@@ -30,20 +30,20 @@ PACK(typedef struct t_Open9xGruvin9xPhaseData_v207 {
uint8_t fadeIn:4;
uint8_t fadeOut:4;
int16_t rotaryEncoders[2];
operator PhaseData();
t_Open9xGruvin9xPhaseData_v207() { memset(this, 0, sizeof(t_Open9xGruvin9xPhaseData_v207)); }
}) Open9xGruvin9xPhaseData_v207;
operator FlightModeData();
t_Open9xGruvin9xFlightModeData_v207() { memset(this, 0, sizeof(t_Open9xGruvin9xFlightModeData_v207)); }
}) Open9xGruvin9xFlightModeData_v207;
PACK(typedef struct t_Open9xGruvin9xPhaseData_v208 {
PACK(typedef struct t_Open9xGruvin9xFlightModeData_v208 {
int16_t trim[4]; // -500..500 => trim value, 501 => use trim of phase 0, 502, 503, 504 => use trim of phases 1|2|3|4 instead
int8_t swtch; // swtch of phase[0] is not used
char name[6];
uint8_t fadeIn:4;
uint8_t fadeOut:4;
int16_t rotaryEncoders[2];
operator PhaseData();
t_Open9xGruvin9xPhaseData_v208() { memset(this, 0, sizeof(t_Open9xGruvin9xPhaseData_v208)); }
}) Open9xGruvin9xPhaseData_v208;
operator FlightModeData();
t_Open9xGruvin9xFlightModeData_v208() { memset(this, 0, sizeof(t_Open9xGruvin9xFlightModeData_v208)); }
}) Open9xGruvin9xFlightModeData_v208;
PACK(typedef struct t_Open9xGruvin9xMixData_v207 {
uint8_t destCh:4; // 0, 1..C9X_NUM_CHNOUT
@@ -197,7 +197,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v207 {
Open9xGruvin9xLogicalSwitchData_v207 customSw[O9X_NUM_CSW];
Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW];
Open9xGruvin9xSwashRingData_v208 swashR;
Open9xGruvin9xPhaseData_v207 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xGruvin9xFlightModeData_v207 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v205 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -231,7 +231,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v208 {
Open9xGruvin9xLogicalSwitchData_v207 customSw[O9X_NUM_CSW];
Open9xGruvin9xFuncSwData_v203 funcSw[O9X_NUM_FSW];
Open9xGruvin9xSwashRingData_v208 swashR;
Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xGruvin9xFlightModeData_v208 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v208 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -270,7 +270,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v209 {
Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW];
Open9xGruvin9xFuncSwData_v203 funcSw[O9X_NUM_FSW];
Open9xGruvin9xSwashRingData_v209 swashR;
Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xGruvin9xFlightModeData_v208 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v208 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -310,7 +310,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v210 {
Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW];
Open9xGruvin9xFuncSwData_v210 funcSw[O9X_NUM_FSW];
Open9xGruvin9xSwashRingData_v209 swashR;
Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xGruvin9xFlightModeData_v208 flightModeData[O9X_MAX_FLIGHT_MODES];
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -348,7 +348,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v211 {
Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW];
Open9xGruvin9xFuncSwData_v210 funcSw[O9X_NUM_FSW];
Open9xGruvin9xSwashRingData_v209 swashR;
Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xGruvin9xFlightModeData_v208 flightModeData[O9X_MAX_FLIGHT_MODES];
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -220,9 +220,9 @@ t_Open9xArmExpoData_v212::operator ExpoData ()
return c9x;
}
t_Open9xArmPhaseData_v208::operator PhaseData ()
t_Open9xArmFlightModeData_v208::operator FlightModeData ()
{
PhaseData c9x;
FlightModeData c9x;
for (int i=0; i<NUM_STICKS; i++)
c9x.trim[i] = trim[i];
c9x.swtch = open9xArmToSwitch(swtch);
@@ -232,9 +232,9 @@ t_Open9xArmPhaseData_v208::operator PhaseData ()
return c9x;
}
t_Open9xArmPhaseData_v212::operator PhaseData ()
t_Open9xArmFlightModeData_v212::operator FlightModeData ()
{
PhaseData c9x;
FlightModeData c9x;
for (int i=0; i<NUM_STICKS; i++)
c9x.trim[i] = trim[i];
c9x.swtch = open9xArmToSwitch(swtch);
@@ -768,13 +768,13 @@ t_Open9xArmModelData_v208::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_ARM_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -857,13 +857,13 @@ t_Open9xArmModelData_v209::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_ARM_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -947,13 +947,13 @@ t_Open9xArmModelData_v210::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_ARM_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1031,13 +1031,13 @@ t_Open9xArmModelData_v211::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_ARM_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1118,13 +1118,13 @@ t_Open9xArmModelData_v212::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_ARM_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -169,26 +169,26 @@ PACK(typedef struct t_Open9xArmMixData_v212 {
t_Open9xArmMixData_v212() { memset(this, 0, sizeof(t_Open9xArmMixData_v212)); }
}) Open9xArmMixData_v212;
PACK(typedef struct t_Open9xArmPhaseData_v208 {
PACK(typedef struct t_Open9xArmFlightModeData_v208 {
int16_t trim[4]; // -500..500 => trim value, 501 => use trim of phase 0, 502, 503, 504 => use trim of phases 1|2|3|4 instead
int8_t swtch; // swtch of phase[0] is not used
char name[6];
uint8_t fadeIn:4;
uint8_t fadeOut:4;
operator PhaseData();
t_Open9xArmPhaseData_v208() { memset(this, 0, sizeof(t_Open9xArmPhaseData_v208)); }
}) Open9xArmPhaseData_v208;
operator FlightModeData();
t_Open9xArmFlightModeData_v208() { memset(this, 0, sizeof(t_Open9xArmFlightModeData_v208)); }
}) Open9xArmFlightModeData_v208;
PACK(typedef struct t_Open9xArmPhaseData_v212 {
PACK(typedef struct t_Open9xArmFlightModeData_v212 {
int16_t trim[4]; // -500..500 => trim value, 501 => use trim of phase 0, 502, 503, 504 => use trim of phases 1|2|3|4 instead
int8_t swtch; // swtch of phase[0] is not used
char name[6];
uint8_t fadeIn:4;
uint8_t fadeOut:4;
int16_t rotaryEncoders[1];
operator PhaseData();
t_Open9xArmPhaseData_v212() { memset(this, 0, sizeof(t_Open9xArmPhaseData_v212)); }
}) Open9xArmPhaseData_v212;
operator FlightModeData();
t_Open9xArmFlightModeData_v212() { memset(this, 0, sizeof(t_Open9xArmFlightModeData_v212)); }
}) Open9xArmFlightModeData_v212;
PACK(typedef struct t_Open9xArmLogicalSwitchData_v208 { // Custom Switches data
int8_t v1; //input
@@ -346,7 +346,7 @@ PACK(typedef struct t_Open9xArmModelData_v208 {
Open9xArmLogicalSwitchData_v208 customSw[O9X_ARM_NUM_CSW];
Open9xArmFuncSwData_v208 funcSw[O9X_ARM_NUM_FSW];
Open9xArmSwashRingData_v208 swashR;
Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_FLIGHT_MODES];
Open9xArmFlightModeData_v208 flightModeData[O9X_ARM_MAX_FLIGHT_MODES];
Open9xFrSkyData_v208 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -385,7 +385,7 @@ PACK(typedef struct t_Open9xArmModelData_v209 {
Open9xArmLogicalSwitchData_v209 customSw[O9X_ARM_NUM_CSW];
Open9xArmFuncSwData_v208 funcSw[O9X_ARM_NUM_FSW];
Open9xArmSwashRingData_v209 swashR;
Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_FLIGHT_MODES];
Open9xArmFlightModeData_v208 flightModeData[O9X_ARM_MAX_FLIGHT_MODES];
Open9xFrSkyData_v208 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -425,7 +425,7 @@ PACK(typedef struct t_Open9xArmModelData_v210 {
Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW];
Open9xArmFuncSwData_v210 funcSw[O9X_ARM_NUM_FSW];
Open9xArmSwashRingData_v209 swashR;
Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_FLIGHT_MODES];
Open9xArmFlightModeData_v208 flightModeData[O9X_ARM_MAX_FLIGHT_MODES];
Open9xArmFrSkyData_v210 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -464,7 +464,7 @@ PACK(typedef struct t_Open9xArmModelData_v211 {
Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW];
Open9xArmFuncSwData_v211 funcSw[O9X_ARM_NUM_FSW];
Open9xArmSwashRingData_v209 swashR;
Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_FLIGHT_MODES];
Open9xArmFlightModeData_v208 flightModeData[O9X_ARM_MAX_FLIGHT_MODES];
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -502,7 +502,7 @@ PACK(typedef struct t_Open9xArmModelData_v212 {
Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW];
Open9xArmFuncSwData_v211 funcSw[O9X_ARM_NUM_FSW];
Open9xArmSwashRingData_v210 swashR;
Open9xArmPhaseData_v212 phaseData[O9X_ARM_MAX_FLIGHT_MODES];
Open9xArmFlightModeData_v212 flightModeData[O9X_ARM_MAX_FLIGHT_MODES];
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -686,9 +686,9 @@ t_Open9xSwashRingData_v209::operator SwashRingData ()
return c9x;
}
t_Open9xPhaseData_v201::operator PhaseData ()
t_Open9xFlightModeData_v201::operator FlightModeData ()
{
PhaseData c9x;
FlightModeData c9x;
for (int i=0; i<NUM_STICKS; i++)
c9x.trim[i] = (((int16_t)trim[i]) << 2) + ((trim_ext >> (2*i)) & 0x03);
c9x.swtch = open9xStockToSwitch(swtch);
@@ -949,13 +949,13 @@ t_Open9xModelData_v201::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1023,13 +1023,13 @@ t_Open9xModelData_v202::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1099,13 +1099,13 @@ t_Open9xModelData_v203::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1173,13 +1173,13 @@ t_Open9xModelData_v204::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1252,13 +1252,13 @@ t_Open9xModelData_v205::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1338,13 +1338,13 @@ t_Open9xModelData_v208::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1431,13 +1431,13 @@ t_Open9xModelData_v209::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1525,13 +1525,13 @@ t_Open9xModelData_v210::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -1613,13 +1613,13 @@ t_Open9xModelData_v211::operator ModelData ()
c9x.extendedLimits = extendedLimits;
c9x.extendedTrims = extendedTrims;
for (int i=0; i<O9X_MAX_FLIGHT_MODES; i++) {
c9x.phaseData[i] = phaseData[i];
c9x.flightModeData[i] = flightModeData[i];
for (int j=0; j<NUM_STICKS; j++) {
if (c9x.phaseData[i].trim[j] > 500) {
c9x.phaseData[i].trimRef[j] = c9x.phaseData[i].trim[j] - 501;
if (c9x.phaseData[i].trimRef[j] >= i)
c9x.phaseData[i].trimRef[j] += 1;
c9x.phaseData[i].trim[j] = 0;
if (c9x.flightModeData[i].trim[j] > 500) {
c9x.flightModeData[i].trimRef[j] = c9x.flightModeData[i].trim[j] - 501;
if (c9x.flightModeData[i].trimRef[j] >= i)
c9x.flightModeData[i].trimRef[j] += 1;
c9x.flightModeData[i].trim[j] = 0;
}
}
}
@@ -445,7 +445,7 @@ PACK(typedef struct t_Open9xSwashRingData_v209 { // Swash Ring data
t_Open9xSwashRingData_v209() { memset(this, 0, sizeof(t_Open9xSwashRingData_v209)); }
}) Open9xSwashRingData_v209;
PACK(typedef struct t_Open9xPhaseData_v201 {
PACK(typedef struct t_Open9xFlightModeData_v201 {
int8_t trim[4]; // -500..500 => trim value, 501 => use trim of phase 0, 502, 503, 504 => use trim of phases 1|2|3|4 instead
int8_t trim_ext:8; // 2 less significant extra bits per trim (10bits trims)
int8_t swtch; // swtch of phase[0] is not used
@@ -453,9 +453,9 @@ PACK(typedef struct t_Open9xPhaseData_v201 {
uint8_t fadeIn:4;
uint8_t fadeOut:4;
operator PhaseData();
t_Open9xPhaseData_v201() { memset(this, 0, sizeof(t_Open9xPhaseData_v201)); }
}) Open9xPhaseData_v201;
operator FlightModeData();
t_Open9xFlightModeData_v201() { memset(this, 0, sizeof(t_Open9xFlightModeData_v201)); }
}) Open9xFlightModeData_v201;
PACK(typedef struct t_Open9xTimerData_v201 {
int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
@@ -520,7 +520,7 @@ PACK(typedef struct t_Open9xModelData_v201 {
Open9xSafetySwData safetySw[O9X_NUM_CHNOUT];
Open9xFuncSwData_v201 funcSw[12];
Open9xSwashRingData_v208 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v201 frsky;
operator ModelData();
@@ -551,7 +551,7 @@ PACK(typedef struct t_Open9xModelData_v202 {
Open9xSafetySwData safetySw[O9X_NUM_CHNOUT];
Open9xFuncSwData_v201 funcSw[12];
Open9xSwashRingData_v208 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v202 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -584,7 +584,7 @@ PACK(typedef struct t_Open9xModelData_v203 {
Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW];
Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW];
Open9xSwashRingData_v208 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v202 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -617,7 +617,7 @@ PACK(typedef struct t_Open9xModelData_v204 {
Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW];
Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW];
Open9xSwashRingData_v208 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v204 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -650,7 +650,7 @@ PACK(typedef struct t_Open9xModelData_v205 {
Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW];
Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW];
Open9xSwashRingData_v208 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v205 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -685,7 +685,7 @@ PACK(typedef struct t_Open9xModelData_v208 {
Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW];
Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW];
Open9xSwashRingData_v208 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v208 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -724,7 +724,7 @@ PACK(typedef struct t_Open9xModelData_v209 {
Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW];
Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW];
Open9xSwashRingData_v209 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
Open9xFrSkyData_v208 frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -764,7 +764,7 @@ PACK(typedef struct t_Open9xModelData_v210 {
Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW];
Open9xFuncSwData_v210 funcSw[O9X_NUM_FSW];
Open9xSwashRingData_v209 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -802,7 +802,7 @@ PACK(typedef struct t_Open9xModelData_v211 {
Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW];
Open9xFuncSwData_v210 funcSw[O9X_NUM_FSW];
Open9xSwashRingData_v209 swashR;
Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES];
Open9xFlightModeData_v201 flightModeData[O9X_MAX_FLIGHT_MODES];
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
@@ -177,13 +177,13 @@ void Open9xGruvin9xSimulator::setValues(TxInputs &inputs)
void Open9xGruvin9xSimulator::setTrim(unsigned int idx, int value)
{
idx = Open9xGruvin9x::modn12x3[4*getStickMode() + idx];
uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx);
uint8_t phase = getTrimFlightPhase(getFlightMode(), idx);
setTrimValue(phase, idx, value);
}
void Open9xGruvin9xSimulator::getTrims(Trims & trims)
{
uint8_t phase = getFlightPhase();
uint8_t phase = getFlightMode();
trims.extended = hasExtendedTrims();
for (uint8_t idx=0; idx<4; idx++) {
trims.values[idx] = getTrimValue(getTrimFlightPhase(phase, idx), idx);
@@ -204,13 +204,13 @@ void Open9xGruvin9xSimulator::wheelEvent(uint8_t steps)
unsigned int Open9xGruvin9xSimulator::getPhase()
{
return getFlightPhase();
return getFlightMode();
}
const char * Open9xGruvin9xSimulator::getPhaseName(unsigned int phase)
{
static char buff[sizeof(g_model.phaseData[0].name)+1];
zchar2str(buff, g_model.phaseData[phase].name, sizeof(g_model.phaseData[0].name));
static char buff[sizeof(g_model.flightModeData[0].name)+1];
zchar2str(buff, g_model.flightModeData[phase].name, sizeof(g_model.flightModeData[0].name));
return buff;
}
@@ -169,13 +169,13 @@ void OpenTxM128Simulator::setValues(TxInputs &inputs)
void OpenTxM128Simulator::setTrim(unsigned int idx, int value)
{
idx = OpenTxM128::modn12x3[4*getStickMode() + idx];
uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx);
uint8_t phase = getTrimFlightPhase(getFlightMode(), idx);
setTrimValue(phase, idx, value);
}
void OpenTxM128Simulator::getTrims(Trims & trims)
{
uint8_t phase = getFlightPhase();
uint8_t phase = getFlightMode();
trims.extended = hasExtendedTrims();
for (uint8_t idx=0; idx<4; idx++) {
trims.values[idx] = getTrimValue(getTrimFlightPhase(phase, idx), idx);
@@ -195,13 +195,13 @@ void OpenTxM128Simulator::wheelEvent(uint8_t steps)
unsigned int OpenTxM128Simulator::getPhase()
{
return getFlightPhase();
return getFlightMode();
}
const char * OpenTxM128Simulator::getPhaseName(unsigned int phase)
{
static char buff[sizeof(g_model.phaseData[0].name)+1];
zchar2str(buff, g_model.phaseData[phase].name, sizeof(g_model.phaseData[0].name));
static char buff[sizeof(g_model.flightModeData[0].name)+1];
zchar2str(buff, g_model.flightModeData[phase].name, sizeof(g_model.flightModeData[0].name));
return buff;
}
@@ -179,13 +179,13 @@ void OpenTxM64Simulator::setValues(TxInputs &inputs)
void OpenTxM64Simulator::setTrim(unsigned int idx, int value)
{
idx = OpenTxM64::modn12x3[4*getStickMode() + idx];
uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx);
uint8_t phase = getTrimFlightPhase(getFlightMode(), idx);
setTrimValue(phase, idx, value);
}
void OpenTxM64Simulator::getTrims(Trims & trims)
{
uint8_t phase = getFlightPhase();
uint8_t phase = getFlightMode();
trims.extended = hasExtendedTrims();
for (uint8_t idx=0; idx<4; idx++) {
trims.values[idx] = getTrimValue(getTrimFlightPhase(phase, idx), idx);
@@ -201,13 +201,13 @@ void OpenTxM64Simulator::getTrims(Trims & trims)
unsigned int OpenTxM64Simulator::getPhase()
{
return getFlightPhase();
return getFlightMode();
}
const char * OpenTxM64Simulator::getPhaseName(unsigned int phase)
{
static char buff[sizeof(g_model.phaseData[0].name)+1];
zchar2str(buff, g_model.phaseData[phase].name, sizeof(g_model.phaseData[0].name));
static char buff[sizeof(g_model.flightModeData[0].name)+1];
zchar2str(buff, g_model.flightModeData[phase].name, sizeof(g_model.flightModeData[0].name));
return buff;
}
@@ -120,6 +120,7 @@ namespace Open9xSky9x {
#include "radio/src/translations/tts_pt.cpp"
#include "radio/src/translations/tts_sk.cpp"
#include "radio/src/translations/tts_pl.cpp"
#include "radio/src/translations/tts_hu.cpp"
int16_t g_anas[NUM_STICKS+BOARD_9X_NUM_POTS];
@@ -212,13 +213,13 @@ void Open9xSky9xSimulator::setValues(TxInputs &inputs)
void Open9xSky9xSimulator::setTrim(unsigned int idx, int value)
{
idx = Open9xSky9x::modn12x3[4*getStickMode() + idx];
uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx);
uint8_t phase = getTrimFlightPhase(getFlightMode(), idx);
setTrimValue(phase, idx, value);
}
void Open9xSky9xSimulator::getTrims(Trims & trims)
{
uint8_t phase = getFlightPhase();
uint8_t phase = getFlightMode();
trims.extended = hasExtendedTrims();
for (uint8_t idx=0; idx<4; idx++) {
trims.values[idx] = getTrimValue(getTrimFlightPhase(phase, idx), idx);
@@ -239,13 +240,13 @@ void Open9xSky9xSimulator::wheelEvent(uint8_t steps)
unsigned int Open9xSky9xSimulator::getPhase()
{
return getFlightPhase();
return getFlightMode();
}
const char * Open9xSky9xSimulator::getPhaseName(unsigned int phase)
{
static char buff[sizeof(g_model.phaseData[0].name)+1];
zchar2str(buff, g_model.phaseData[phase].name, sizeof(g_model.phaseData[0].name));
static char buff[sizeof(g_model.flightModeData[0].name)+1];
zchar2str(buff, g_model.flightModeData[phase].name, sizeof(g_model.flightModeData[0].name));
return buff;
}
@@ -129,7 +129,7 @@ inline int geteepromsize() {
#include "radio/src/translations/tts_pt.cpp"
#include "radio/src/translations/tts_sk.cpp"
#include "radio/src/translations/tts_pl.cpp"
#include "radio/src/translations/tts_hu.cpp"
#include "radio/src/lua.cpp"
#include "radio/src/lua/src/lapi.c"
#include "radio/src/lua/src/lcode.c"
@@ -251,13 +251,13 @@ void OpentxTaranisSimulator::setValues(TxInputs &inputs)
void OpentxTaranisSimulator::setTrim(unsigned int idx, int value)
{
idx = Open9xX9D::modn12x3[4*getStickMode() + idx];
uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx);
uint8_t phase = getTrimFlightPhase(getFlightMode(), idx);
setTrimValue(phase, idx, value);
}
void OpentxTaranisSimulator::getTrims(Trims & trims)
{
uint8_t phase = getFlightPhase();
uint8_t phase = getFlightMode();
trims.extended = hasExtendedTrims();
for (uint8_t idx=0; idx<4; idx++) {
trims.values[idx] = getTrimValue(getTrimFlightPhase(phase, idx), idx);
@@ -278,13 +278,13 @@ void OpentxTaranisSimulator::wheelEvent(uint8_t steps)
unsigned int OpentxTaranisSimulator::getPhase()
{
return getFlightPhase();
return getFlightMode();
}
const char * OpentxTaranisSimulator::getPhaseName(unsigned int phase)
{
static char buff[sizeof(g_model.phaseData[0].name)+1];
zchar2str(buff, g_model.phaseData[phase].name, sizeof(g_model.phaseData[0].name));
static char buff[sizeof(g_model.flightModeData[0].name)+1];
zchar2str(buff, g_model.flightModeData[phase].name, sizeof(g_model.flightModeData[0].name));
return buff;
}
@@ -701,7 +701,7 @@ class HeliField: public StructField {
class FlightModeField: public TransformedField {
public:
FlightModeField(PhaseData & phase, int index, BoardEnum board, unsigned int version):
FlightModeField(FlightModeData & phase, int index, BoardEnum board, unsigned int version):
TransformedField(internalField),
internalField("Phase"),
phase(phase),
@@ -826,7 +826,7 @@ class FlightModeField: public TransformedField {
protected:
StructField internalField;
PhaseData & phase;
FlightModeData & phase;
int index;
BoardEnum board;
unsigned int version;
@@ -1908,7 +1908,7 @@ class ArmCustomFunctionField: public TransformedField {
else if (fn.adjustMode == 2)
fn.param = RawSource(SOURCE_TYPE_GVAR, value).toValue();
else
fn.param = value;
fn.param = (int16_t)value;
}
else if (version >= 214) {
fn.adjustMode = _mode;
@@ -1917,7 +1917,7 @@ class ArmCustomFunctionField: public TransformedField {
else if (fn.adjustMode == 2)
fn.param = RawSource(SOURCE_TYPE_GVAR, value).toValue();
else
fn.param = value;
fn.param = (int8_t)value;
}
else {
sourcesConversionTable->importValue(value, (int &)fn.param);
@@ -2475,7 +2475,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
}
internalField.Append(new HeliField(modelData.swashRingData, board, version, variant));
for (int i=0; i<MAX_FLIGHT_MODES(board, version); i++)
internalField.Append(new FlightModeField(modelData.phaseData[i], i, board, version));
internalField.Append(new FlightModeField(modelData.flightModeData[i], i, board, version));
if (!IS_ARM(board) || version < 216) {
internalField.Append(new SignedField<8>(modelData.moduleData[0].ppmFrameLength));
@@ -2499,7 +2499,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
if ((board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) && (variant & GVARS_VARIANT)) {
for (int i=0; i<MAX_GVARS(board, version); i++) {
// on M64 GVARS are common to all phases, and there is no name
internalField.Append(new SignedField<16>(modelData.phaseData[0].gvars[i]));
internalField.Append(new SignedField<16>(modelData.flightModeData[0].gvars[i]));
}
}
@@ -680,6 +680,17 @@ int OpenTxFirmware::getCapability(const Capability capability)
}
}
bool OpenTxFirmware::isTelemetrySourceAvailable(int source)
{
if (IS_TARANIS(board) && (source == TELEMETRY_SOURCE_RSSI_TX))
return false;
if (source == TELEMETRY_SOURCE_DTE)
return false;
return true;
}
int OpenTxEepromInterface::isAvailable(Protocol proto, int port)
{
if (IS_TARANIS(board)) {
@@ -103,6 +103,7 @@ class OpenTxFirmware: public FirmwareInterface {
addTTSLanguage("pl");
addTTSLanguage("pt");
addTTSLanguage("es");
addTTSLanguage("hu");
}
virtual QString getStampUrl();
@@ -113,6 +114,8 @@ class OpenTxFirmware: public FirmwareInterface {
virtual int getCapability(const Capability);
virtual bool isTelemetrySourceAvailable(int source);
virtual SimulatorInterface * getSimulator();
+1 -1
View File
@@ -295,7 +295,7 @@ t_Th9xModelData::operator ModelData ()
for (int i=0; i<TH9X_MAX_MIXERS; i++)
c9x.mixData[i] = mixData[i];
for (int i=0; i<NUM_STICKS; i++)
c9x.phaseData[0].trim[i] = trimData[i].itrim;
c9x.flightModeData[0].trim[i] = trimData[i].itrim;
for (int i=0; i<TH9X_MAX_CURVES3; i++) {
c9x.curves[i].count = 3;
for (int j=0; j<3; j++) {
-3
View File
@@ -4,7 +4,6 @@
#include "appdata.h"
#include <QDateTime>
#include <QtGui>
#include "googleanalytics.h"
#define BIT_WARN_THR ( 0x01 )
#define BIT_WARN_SW ( 0x02 )
@@ -318,8 +317,6 @@ GeneralEdit::GeneralEdit(RadioData &radioData, QWidget *parent) :
}
disableMouseScrolling();
ga.sendPageView(getBoardName(GetCurrentFirmware()->getBoard()) + " GeneralEdit");
}
GeneralEdit::~GeneralEdit()
-73
View File
@@ -1,73 +0,0 @@
#include "googleanalytics.h"
#include <QtGui>
#define TRACKING_ID "UA-40098569-1"
GoogleAnalytics ga;
GoogleAnalytics::GoogleAnalytics():
userId(qrand()),
networkManager(new QNetworkAccessManager(this))
{
}
GoogleAnalytics::~GoogleAnalytics()
{
delete networkManager;
}
void GoogleAnalytics::sendPageView(QString title)
{
// create request and set URL of receiver
QNetworkRequest request;
QUrl host("http://www.google-analytics.com/collect");
request.setUrl(host);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
// setup parameters of request
QString requestParams;
requestParams += "v=1"; // version of protocol
requestParams += "&t=pageview"; // type of request
requestParams += "&tid=" TRACKING_ID; // Google Analytics account
requestParams += "&cid=" + QString::number(userId); // unique user identifier
requestParams += "&dp=companion-" + title.toLower().replace(" ", "-"); // name of page
requestParams += "&dt=" + title; // title of page
requestParams += "&ul=" + QLocale::system().name(); // language
// send request via post method
networkManager->post(request, requestParams.toStdString().c_str());
}
void GoogleAnalytics::sendEvent(QString category, QString action, QString label)
{
// create request and set URL of receiver
QNetworkRequest request;
QUrl host("http://www.google-analytics.com/collect");
request.setUrl(host);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
// setup parameters of request
QString requestParams;
requestParams += "v=1"; // version of protocol
requestParams += "&t=event"; // type of request
requestParams += "&ec=" + category;
requestParams += "&ea=" + action;
requestParams += "&el=" + label;
requestParams += "&tid=" TRACKING_ID; // Google Analytics account
requestParams += "&cid=" + QString::number(userId); // unique user identifier
requestParams += "&dt=Companion"; // name of page (or app name)
requestParams += "&ul=" + QLocale::system().name(); // language
// send request via post method
networkManager->post(request, requestParams.toStdString().c_str());
}
void GoogleAnalytics::slot_receive(QNetworkReply * reply)
{
// output information about reply
qDebug() << "RequestUrl:" << reply->request().url();
qDebug() << "Status:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
qDebug() << "Error:"<< reply->error();
QByteArray bytes = reply->readAll();
qDebug() << "Contents" << QString::fromUtf8(bytes.data(), bytes.size());
}
-21
View File
@@ -1,21 +0,0 @@
#include <QtNetwork>
class GoogleAnalytics: public QObject
{
Q_OBJECT
public:
GoogleAnalytics();
~GoogleAnalytics();
void sendPageView(QString page);
void sendEvent(QString category, QString action, QString label="");
protected slots:
void slot_receive(QNetworkReply * reply);
protected:
int userId;
QNetworkAccessManager * networkManager;
};
extern GoogleAnalytics ga;
+1 -1
View File
@@ -835,7 +835,7 @@ QString getPhasesStr(unsigned int phases, ModelData & model)
for (int i=0; i<numphases;i++) {
if (!(phases & (1<<i))) {
if (count++ > 0) str += QString(", ");
str += getPhaseName(i+1, model.phaseData[i].name);
str += getPhaseName(i+1, model.flightModeData[i].name);
}
}
}
+8
View File
@@ -132,4 +132,12 @@ QPixmap makePixMap( QImage image, QString firmwareType );
int version2index(QString version);
QString index2version(int index);
class QTimeS : public QTime
{
public:
QTimeS(int s) { int h = s/3600; s %= 3600; int m = s/60; s %=60; setHMS(h, m, s); };
QTimeS(const QTime & q) : QTime(q) {};
int seconds() const { return hour()*3600 + minute()*60 + second(); };
};
#endif // HELPERS_H
-4
View File
@@ -64,7 +64,6 @@
#include "helpers.h"
#include "appdata.h"
#include "radionotfound.h"
#include "googleanalytics.h"
#include "firmwares/opentx/opentxinterface.h" // TODO get rid of this include
#define DONATE_STR "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QUZ48K4SEXDP2"
@@ -164,8 +163,6 @@ MainWindow::MainWindow():
if (printing) {
QTimer::singleShot(0, this, SLOT(autoClose()));
}
ga.sendPageView("Home");
}
void MainWindow::displayWarnings()
@@ -512,7 +509,6 @@ void MainWindow::startFirmwareDownload()
downloadDialog * dd = new downloadDialog(this, url, filename);
connect(dd, SIGNAL(accepted()), this, SLOT(firmwareDownloadAccepted()));
dd->exec();
ga.sendEvent(getBoardName(GetCurrentFirmware()->getBoard()), "Download", url);
}
}
-3
View File
@@ -54,7 +54,6 @@
#include "appdata.h"
#include "wizarddialog.h"
#include <QFileInfo>
#include "googleanalytics.h"
#if defined WIN32 || !defined __GNUC__
#include <windows.h>
@@ -80,8 +79,6 @@ MdiChild::MdiChild():
if (!(this->isMaximized() || this->isMinimized())) {
adjustSize();
}
ga.sendPageView(getBoardName(firmware->getBoard()) + " Models");
}
MdiChild::~MdiChild()
+4 -4
View File
@@ -9,7 +9,7 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI
ModelPanel(parent, model, generalSettings, firmware),
ui(new Ui::FlightMode),
phaseIdx(phaseIdx),
phase(model.phaseData[phaseIdx]),
phase(model.flightModeData[phaseIdx]),
reCount(firmware->getCapability(RotaryEncoders)),
gvCount(((!firmware->getCapability(HasVariants)) || (GetCurrentFirmwareVariant() & GVARS_VARIANT)) ?
firmware->getCapability(Gvars) : 0)
@@ -216,10 +216,10 @@ void FlightModePanel::update()
for (int i=0; i<reCount; i++) {
reValues[i]->setDisabled(false);
int idx = phase.rotaryEncoders[i];
PhaseData *phasere = &phase;
FlightModeData *phasere = &phase;
while (idx > 1024) {
idx -= 1025;
phasere = &model.phaseData[idx];
phasere = &model.flightModeData[idx];
idx = phasere->rotaryEncoders[i];
reValues[i]->setDisabled(true);
}
@@ -436,7 +436,7 @@ void FlightModesPanel::onPhaseModified()
QString FlightModesPanel::getTabName(int index)
{
QString result = tr("Flight Mode %1").arg(index);
const char *name = model.phaseData[index].name;
const char *name = model.flightModeData[index].name;
if (firmware->getCapability(FlightModesName) && strlen(name) > 0) {
result += tr(" (%1)").arg(name);
}
+1 -1
View File
@@ -44,7 +44,7 @@ class FlightModePanel : public ModelPanel
private:
Ui::FlightMode *ui;
int phaseIdx;
PhaseData & phase;
FlightModeData & phase;
int reCount;
int gvCount;
QVector<QLabel *> trimsLabel;
+4 -1
View File
@@ -272,6 +272,9 @@ void InputsPanel::setSelectedByExpoList(QList<int> list)
void InputsPanel::exposDelete(bool ask)
{
QList<int> list = createExpoListFromSelected();
if(list.isEmpty()) return;
QMessageBox::StandardButton ret = QMessageBox::No;
if(ask)
@@ -281,7 +284,7 @@ void InputsPanel::exposDelete(bool ask)
if ((ret == QMessageBox::Yes) || (!ask)) {
exposDeleteList(createExpoListFromSelected());
exposDeleteList(list);
emit modified();
update();
}
+51 -15
View File
@@ -82,6 +82,12 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model,
connect(cswitchOffset2[i], SIGNAL(editingFinished()), this, SLOT(edited()));
cswitchOffset2[i]->setVisible(false);
v2Layout->addWidget(cswitchOffset2[i]);
cswitchTOffset[i] = new QTimeEdit(this);
cswitchTOffset[i]->setProperty("index",i);
cswitchTOffset[i]->setAccelerated(true);
connect(cswitchTOffset[i],SIGNAL(editingFinished()),this,SLOT(edited()));
v2Layout->addWidget(cswitchTOffset[i]);
cswitchTOffset[i]->setVisible(false);
gridLayout->addLayout(v2Layout, i+1, 3);
// AND
@@ -134,7 +140,7 @@ void LogicalSwitchesPanel::v1Edited(int value)
if (model.customSw[i].getFunctionFamily() == LS_FAMILY_VOFS) {
RawSource source = RawSource(model.customSw[i].val1, &model);
RawSourceRange range = source.getRange();
if (model.customSw[i].func == LS_FN_DPOS || model.customSw[i].func == LS_FN_DAPOS) {
if (model.customSw[i].isDeltaFunction()) {
model.customSw[i].val2 = (cswitchOffset[i]->value() / range.step);
}
else {
@@ -185,6 +191,7 @@ void LogicalSwitchesPanel::edited()
int i = sender()->property("index").toInt();
int newFunc = csw[i]->itemData(csw[i]->currentIndex()).toInt();
bool chAr = (model.customSw[i].getFunctionFamily() != LogicalSwitchData(newFunc).getFunctionFamily());
bool chDelta = (model.customSw[i].isDeltaFunction() ^ LogicalSwitchData(newFunc).isDeltaFunction());
model.customSw[i].func = newFunc;
if (chAr) {
if (model.customSw[i].getFunctionFamily() == LS_FAMILY_TIMER) {
@@ -203,6 +210,10 @@ void LogicalSwitchesPanel::edited()
model.customSw[i].andsw = 0;
setSwitchWidgetVisibility(i);
}
if (chDelta) {
model.customSw[i].val2 = 0;
setSwitchWidgetVisibility(i);
}
RawSource source;
switch (model.customSw[i].getFunctionFamily())
@@ -211,14 +222,18 @@ void LogicalSwitchesPanel::edited()
{
source = RawSource(model.customSw[i].val1, &model);
RawSourceRange range = source.getRange();
if (model.customSw[i].func == LS_FN_DPOS || model.customSw[i].func == LS_FN_DAPOS) {
model.customSw[i].val2 = (cswitchOffset[i]->value() / range.step);
cswitchOffset[i]->setValue(model.customSw[i].val2*range.step);
int value = source.isTimeBased() ? QTimeS(cswitchTOffset[i]->time()).seconds() : cswitchOffset[i]->value();
if (model.customSw[i].isDeltaFunction()) {
/*TODO: is this delta function value set correctly*/
model.customSw[i].val2 = (value/range.step);
value=model.customSw[i].val2*range.step;
}
else {
model.customSw[i].val2 = round((cswitchOffset[i]->value()-range.offset)/range.step);
cswitchOffset[i]->setValue(model.customSw[i].val2*range.step + range.offset);
model.customSw[i].val2 = round((value-range.offset)/range.step);;
value= model.customSw[i].val2*range.step + range.offset;
}
if (source.isTimeBased()) cswitchTOffset[i]->setTime(QTimeS(value));
else cswitchOffset[i]->setValue(value);
break;
}
case LS_FAMILY_TIMER:
@@ -266,6 +281,7 @@ void LogicalSwitchesPanel::updateTimerParam(QDoubleSpinBox *sb, int timer, bool
#define VALUE1_VISIBLE 0x4
#define VALUE2_VISIBLE 0x8
#define VALUE3_VISIBLE 0x10
#define VALUE_TO_VISIBLE 0x20
void LogicalSwitchesPanel::setSwitchWidgetVisibility(int i)
{
@@ -278,19 +294,39 @@ void LogicalSwitchesPanel::setSwitchWidgetVisibility(int i)
switch (model.customSw[i].getFunctionFamily())
{
case LS_FAMILY_VOFS:
mask |= SOURCE1_VISIBLE | VALUE2_VISIBLE;
mask |= SOURCE1_VISIBLE;
populateSourceCB(cswitchSource1[i], source, model, POPULATE_SOURCES | POPULATE_VIRTUAL_INPUTS | POPULATE_TRIMS | POPULATE_SWITCHES | POPULATE_TELEMETRY | (firmware->getCapability(GvarsInCS) ? POPULATE_GVARS : 0));
cswitchOffset[i]->setDecimals(range.decimals);
cswitchOffset[i]->setSingleStep(range.step);
if (model.customSw[i].func == LS_FN_DPOS || model.customSw[i].func == LS_FN_DAPOS) {
cswitchOffset[i]->setMinimum(range.step*-127);
cswitchOffset[i]->setMaximum(range.step*127);
cswitchOffset[i]->setValue(range.step*model.customSw[i].val2);
if (source.isTimeBased()) {
mask |= VALUE_TO_VISIBLE;
int maxTime;
int value;
if (model.customSw[i].isDeltaFunction()) {
/*TODO: is this delta function value set correctly*/
maxTime = range.step*127;
value = range.step*model.customSw[i].val2;
} else {
maxTime = range.max;
value = range.step*(model.customSw[i].val2/* TODO+source.getRawOffset(model)*/)+range.offset;
}
cswitchTOffset[i]->setMaximumTime(QTimeS(maxTime));
cswitchTOffset[i]->setDisplayFormat((maxTime>=3600)?"hh:mm:ss":"mm:ss");
cswitchTOffset[i]->setTime(QTimeS(value));
}
else {
cswitchOffset[i]->setMinimum(range.min);
cswitchOffset[i]->setMaximum(range.max);
cswitchOffset[i]->setValue(range.step*(model.customSw[i].val2/* TODO+source.getRawOffset(model)*/)+range.offset);
mask |= VALUE2_VISIBLE;
if (model.customSw[i].isDeltaFunction()) {
/*TODO: is this delta function value set correctly*/
cswitchOffset[i]->setMinimum(range.step*-127);
cswitchOffset[i]->setMaximum(range.step*127);
cswitchOffset[i]->setValue(range.step*model.customSw[i].val2);
}
else {
cswitchOffset[i]->setMinimum(range.min);
cswitchOffset[i]->setMaximum(range.max);
cswitchOffset[i]->setValue(range.step*(model.customSw[i].val2/* TODO+source.getRawOffset(model)*/)+range.offset);
}
}
break;
case LS_FAMILY_VBOOL:
@@ -322,7 +358,7 @@ void LogicalSwitchesPanel::setSwitchWidgetVisibility(int i)
cswitchValue[i]->setVisible(mask & VALUE1_VISIBLE);
cswitchOffset[i]->setVisible(mask & VALUE2_VISIBLE);
cswitchOffset2[i]->setVisible(mask & VALUE3_VISIBLE);
cswitchTOffset[i]->setVisible(mask & VALUE_TO_VISIBLE);
lock = false;
}
@@ -4,6 +4,7 @@
#include "modelpanel.h"
#include <QComboBox>
#include <QDoubleSpinBox>
#include <QTimeEdit>
class LogicalSwitchesPanel : public ModelPanel
{
@@ -33,6 +34,7 @@ class LogicalSwitchesPanel : public ModelPanel
QDoubleSpinBox * cswitchValue[C9X_NUM_CSW];
QDoubleSpinBox * cswitchOffset[C9X_NUM_CSW];
QDoubleSpinBox * cswitchOffset2[C9X_NUM_CSW];
QTimeEdit * cswitchTOffset[C9X_NUM_CSW];
QComboBox * cswitchAnd[C9X_NUM_CSW];
QDoubleSpinBox * cswitchDuration[C9X_NUM_CSW];
QDoubleSpinBox * cswitchDelay[C9X_NUM_CSW];
+13 -3
View File
@@ -322,6 +322,9 @@ void MixesPanel::setSelectedByMixList(QList<int> list)
void MixesPanel::mixersDelete(bool ask)
{
QList<int> list = createMixListFromSelected();
if(list.isEmpty()) return;
QMessageBox::StandardButton ret = QMessageBox::No;
if(ask)
@@ -331,7 +334,7 @@ void MixesPanel::mixersDelete(bool ask)
if ((ret == QMessageBox::Yes) || (!ask)) {
mixersDeleteList(createMixListFromSelected());
mixersDeleteList(list);
emit modified();
update();
}
@@ -522,10 +525,17 @@ void MixesPanel::mixerlistWidget_KeyPress(QKeyEvent *event)
int MixesPanel::gm_moveMix(int idx, bool dir) //true=inc=down false=dec=up
{
if(idx>firmware->getCapability(Mixes) || (idx==0 && !dir) || (idx==firmware->getCapability(Mixes) && dir)) return idx;
if(idx>firmware->getCapability(Mixes) || (idx==firmware->getCapability(Mixes) && dir)) return idx;
MixData &src=model.mixData[idx];
if (idx==0 && !dir) {
//special case: topmost mixer moving up
if (src.destCh > 1) src.destCh--;
return idx;
}
int tdx = dir ? idx+1 : idx-1;
MixData &src=model.mixData[idx];
MixData &tgt=model.mixData[tdx];
unsigned int outputs = firmware->getCapability(Outputs);
-3
View File
@@ -13,7 +13,6 @@
#include "telemetry.h"
#include "appdata.h"
#include <QScrollArea>
#include "googleanalytics.h"
ModelEdit::ModelEdit(QWidget * parent, RadioData & radioData, int modelId, FirmwareInterface * firmware) :
QDialog(parent),
@@ -43,8 +42,6 @@ ModelEdit::ModelEdit(QWidget * parent, RadioData & radioData, int modelId, Firmw
addTab(new TelemetryPanel(this, model, generalSettings, firmware), tr("Telemetry"));
connect(setupPanel, SIGNAL(extendedLimitsToggled()), chnPanel, SLOT(refreshExtendedLimits()));
ga.sendPageView(getBoardName(firmware->getBoard()) + " ModelEdit");
}
ModelEdit::~ModelEdit()
+6
View File
@@ -340,6 +340,12 @@ void TelemetryCustomScreen::populateTelemetrySourceCB(QComboBox *b, unsigned int
for (unsigned int i = 0; i < (last ? TELEMETRY_SOURCES_STATUS_COUNT : TELEMETRY_SOURCES_DISPLAY_COUNT); i++) {
b->addItem(RawSource(SOURCE_TYPE_TELEMETRY, i).toString());
if (!firmware->isTelemetrySourceAvailable(i)) {
//disable item
QModelIndex index = b->model()->index(i+1, 0);
QVariant v(0);
b->model()->setData(index, v, Qt::UserRole - 1);
}
if (!(i>=sizeof(telem_hub)/sizeof(int) || telem_hub[i]==0 || ((telem_hub[i]>=hubproto) && hubproto!=0))) {
QModelIndex index = b->model()->index(i, 0);
QVariant v(0);
+4 -7
View File
@@ -6,7 +6,6 @@
#include <QImage>
#include <QColor>
#include <QPainter>
#include "googleanalytics.h"
#if !defined WIN32 && defined __GNUC__
#include <unistd.h>
@@ -62,8 +61,6 @@ PrintDialog::PrintDialog(QWidget *parent, FirmwareInterface * firmware, GeneralS
printToFile();
QTimer::singleShot(0, this, SLOT(autoClose()));
}
ga.sendPageView(getBoardName(GetCurrentFirmware()->getBoard()) + " ModelsPrint");
}
void PrintDialog::closeEvent(QCloseEvent *event)
@@ -174,7 +171,7 @@ QString PrintDialog::printFlightModes()
}
str.append("</tr>");
for (int i=0; i<firmware->getCapability(FlightModes); i++) {
PhaseData *pd=&g_model->phaseData[i];
FlightModeData *pd=&g_model->flightModeData[i];
str.append("<tr><td><b>"+tr("FM")+QString("%1</b> <font size=+1 face='Courier New' color=green>%2</font></td>").arg(i).arg(pd->name));
str.append(QString("<td align=\"right\"><font size=+1 face='Courier New' color=green>%1</font></td>").arg((qreal)pd->fadeIn/firmware->getCapability(SlowScale)));
str.append(QString("<td width=\"30\" align=\"right\"><font size=+1 face='Courier New' color=green>%1</font></td>").arg((qreal)pd->fadeOut/firmware->getCapability(SlowScale)));
@@ -265,8 +262,8 @@ void PrintDialog::printInputs()
QString strModes;
for (int j=0; j<firmware->getCapability(FlightModes);j++) {
if (!(ed->phases & mask)) {
//PhaseData *pd = &g_model->phaseData[j];
const char * pdName = g_model->phaseData[j].name;
//FlightModeData *pd = &g_model->flightModeData[j];
const char * pdName = g_model->flightModeData[j].name;
if (first) {
strModes += Qt::escape(QString("%1").arg(getPhaseName(j+1,pdName)));
first = false;
@@ -618,7 +615,7 @@ void PrintDialog::printGvars()
QString str = "<table border=1 cellspacing=0 cellpadding=3 width=\"100%\">";
str.append("<tr><td><h2>"+tr("Global Variables")+"</h2></td></tr>");
str.append("<tr><td><table border=1 cellspacing=0 cellpadding=3 width=100>");
PhaseData *pd=&g_model->phaseData[0];
FlightModeData *pd=&g_model->flightModeData[0];
int width=100/gvarnum;
str.append("<tr>");
for(unsigned int i=0; i<gvarnum; i++) {
@@ -4,7 +4,6 @@
#include <iostream>
#include "helpers.h"
#include "simulatorinterface.h"
#include "googleanalytics.h"
#define GBALL_SIZE 20
#define RESX 1024
@@ -24,7 +23,6 @@ SimulatorDialog::SimulatorDialog(QWidget * parent, unsigned int flags):
trimPressed (TRIM_NONE),
middleButtonPressed(false)
{
ga.sendPageView(getBoardName(GetCurrentFirmware()->getBoard()) + " Simulator");
}
uint32_t SimulatorDialog9X::switchstatus = 0;
+1 -1
View File
@@ -60,7 +60,7 @@ for (int i=0; i<NUM_LOGICAL_SWITCH; i++)
outputs.vsw[i] = getSwitch(SWSRC_SW1+i, 0);
#endif
#ifdef GVAR_VALUE // defined(GVARS)
/* TODO it could be a good idea instead of getPhase() / getPhaseName() outputs.phase = getFlightPhase(); */
/* TODO it could be a good idea instead of getPhase() / getPhaseName() outputs.phase = getFlightMode(); */
for (int fm=0; fm<MAX_FLIGHT_MODES; fm++) {
for (int gv=0; gv<MAX_GVARS; gv++) {
outputs.gvars[fm][gv] = GVAR_VALUE(gv, getGVarFlightPhase(fm, gv));
File diff suppressed because it is too large Load Diff
-3
View File
@@ -16,7 +16,6 @@
#include "wizarddialog.h"
#include "wizarddata.h"
#include "helpers.h"
#include "googleanalytics.h"
WizardDialog::WizardDialog(const GeneralSettings & settings, unsigned int modelId, QWidget *parent):
QWizard(parent),
@@ -60,8 +59,6 @@ WizardDialog::WizardDialog(const GeneralSettings & settings, unsigned int modelI
setOption(QWizard::NoCancelButton, false);
setOption(HaveHelpButton, true);
connect(this, SIGNAL(helpRequested()), this, SLOT(showHelp()));
ga.sendPageView("Wizard");
}
void WizardDialog::showHelp()
+4 -4
View File
@@ -154,14 +154,14 @@ void saveModel(ModelData & m, model & xm)
phases xphases;
phases::phase_sequence & phases_sequence (xphases.phase());
for (int i=0; i<C9X_MAX_FLIGHT_MODES; i++) {
PhaseData & p = m.phaseData[i];
FlightModeData & p = m.flightModeData[i];
if (i == 0 || p.swtch.type!=SWITCH_TYPE_NONE) {
TrimType xtrim[4];
for (int j=0; j<4; j++) {
if (m.phaseData[i].trimRef[j] >= 0)
xtrim[j].phaseRef(m.phaseData[i].trimRef[j]);
if (m.flightModeData[i].trimRef[j] >= 0)
xtrim[j].phaseRef(m.flightModeData[i].trimRef[j]);
else
xtrim[j].value(m.phaseData[i].trim[j]);
xtrim[j].value(m.flightModeData[i].trim[j]);
}
trims1 xtrims(xtrim[0], xtrim[1], xtrim[2], xtrim[3]);
phase xphase(xtrims, i);
+7
View File
@@ -1,3 +1,10 @@
<h2>Version 2.0.3 / 2014-06-17</h2>
<ul>
<li>Bugfix on Reset Flight function (possible freeze of the menus)
<li>Imperial units bug (on altitude)
<li>FIRMWARE.BIN and EEPROM.BIN are not anymore marked as system files
</ul>
<h2>Version 2.0.2 / 2014-06-12</h2>
<ul>
<li>RxBatt removed (merged with A1 as before)
+3 -3
View File
@@ -226,7 +226,7 @@ IRPROTOS = NO
TRANSLATIONS = EN
# TTS
# Values = en, fr
# Values = en, fr, hu
TTS = $(TRANSLATIONS)
# UNITS
@@ -279,7 +279,7 @@ SHELL = sh
IMG2LBM = -python ../util/img2lbm.py
BIN2LBM = -python ../util/bin2lbm.py
TRANSLATE = -python ../util/translate.py
VERSION = 2.0.2
VERSION = 2.0.3
SRC =
CPPSRC =
@@ -753,7 +753,7 @@ TARGET = opentx
# List C++ source files here. (C dependencies are automatically generated.)
ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO TARANIS))
TTS_SRC = translations/tts_cz.cpp translations/tts_de.cpp translations/tts_en.cpp translations/tts_es.cpp translations/tts_fr.cpp translations/tts_it.cpp translations/tts_pt.cpp translations/tts_sk.cpp translations/tts_se.cpp translations/tts_pl.cpp
TTS_SRC = translations/tts_cz.cpp translations/tts_de.cpp translations/tts_en.cpp translations/tts_es.cpp translations/tts_fr.cpp translations/tts_it.cpp translations/tts_pt.cpp translations/tts_sk.cpp translations/tts_se.cpp translations/tts_pl.cpp translations/tts_hu.cpp
else
STD_TTS_SRC = translations/tts_$(shell sh -c "echo $(TTS) | tr '[:upper:]' '[:lower:]'").cpp
TTS_SRC = $(shell sh -c "if test -f $(STD_TTS_SRC); then echo $(STD_TTS_SRC); else echo translations/tts_en.cpp; fi")
+6 -6
View File
@@ -280,7 +280,7 @@ void referenceSystemAudioFiles()
const char * suffixes[] = { "-off", "-on" };
char * getModelPath(char * path)
char * getModelAudioPath(char * path)
{
strcpy(path, SOUNDS_PATH "/");
strncpy(path+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
@@ -292,7 +292,7 @@ char * getModelPath(char * path)
void getPhaseAudioFile(char * filename, int index, unsigned int event)
{
char * str = getModelPath(filename);
char * str = getModelAudioPath(filename);
char * tmp = strcat_phasename(str, index);
strcpy(tmp, suffixes[event]);
strcat(tmp, SOUNDS_EXT);
@@ -300,7 +300,7 @@ void getPhaseAudioFile(char * filename, int index, unsigned int event)
void getSwitchAudioFile(char * filename, int index)
{
char * str = getModelPath(filename);
char * str = getModelAudioPath(filename);
int len = STR_VSWITCHES[0];
strncpy(str, &STR_VSWITCHES[1+len*(index+1)], len);
str += len-1;
@@ -324,7 +324,7 @@ void getSwitchAudioFile(char * filename, int index)
void getLogicalSwitchAudioFile(char * filename, int index, unsigned int event)
{
char * str = getModelPath(filename);
char * str = getModelAudioPath(filename);
int len = STR_VSWITCHES[0];
strncpy(str, &STR_VSWITCHES[1+len*(index+SWSRC_FIRST_LOGICAL_SWITCH)], len);
str[len] = '\0';
@@ -346,7 +346,7 @@ void referenceModelAudioFiles()
sdAvailableSwitchAudioFiles = 0;
sdAvailableLogicalSwitchAudioFiles = 0;
char * filename = getModelPath(path);
char * filename = getModelAudioPath(path);
*(filename-1) = '\0';
FRESULT res = f_opendir(&dir, path); /* Open the directory */
@@ -917,7 +917,7 @@ void AudioQueue::stopAll()
CoEnterMutexSection(audioMutex);
widx = ridx; // clean the queue
priorityContext.clear();
normalContext.tone.clear();
normalContext.fragment.clear();
varioContext.clear();
backgroundContext.clear();
CoLeaveMutexSection(audioMutex);
+2 -2
View File
@@ -250,7 +250,7 @@ int applyCurve(int x, CurveRef & curve)
switch (curve.type) {
case CURVE_REF_DIFF:
{
int curveParam = calc100to256(GET_GVAR(curve.value, -100, 100, s_current_mixer_flight_mode));
int curveParam = calc100to256(GET_GVAR(curve.value, -100, 100, mixerCurrentFlightMode));
if (curveParam > 0 && x < 0)
x = (x * (256 - curveParam)) >> 8;
else if (curveParam < 0 && x > 0)
@@ -259,7 +259,7 @@ int applyCurve(int x, CurveRef & curve)
}
case CURVE_REF_EXPO:
return expo(x, GET_GVAR(curve.value, -100, 100, s_current_mixer_flight_mode));
return expo(x, GET_GVAR(curve.value, -100, 100, mixerCurrentFlightMode));
case CURVE_REF_FUNC:
switch (curve.value) {
+21 -21
View File
@@ -41,7 +41,7 @@ PACK(typedef struct {
uint8_t mode; // 0=end, 1=pos, 2=neg, 3=both
uint8_t chn;
int8_t swtch;
uint16_t phases;
uint16_t flightModes;
int8_t weight;
uint8_t curveMode;
char name[LEN_EXPOMIX_NAME];
@@ -53,7 +53,7 @@ PACK(typedef struct {
uint8_t mode; // 0=end, 1=pos, 2=neg, 3=both
uint8_t chn;
int8_t swtch;
uint16_t phases;
uint16_t flightModes;
int8_t weight;
uint8_t curveMode;
char name[LEN_EXPOMIX_NAME];
@@ -80,7 +80,7 @@ PACK(typedef struct {
#if defined(PCBTARANIS)
PACK(typedef struct {
uint8_t destCh;
uint16_t phases;
uint16_t flightModes;
uint8_t curveMode:1; // O=curve, 1=differential
uint8_t noExpo:1;
int8_t carryTrim:3;
@@ -103,7 +103,7 @@ PACK(typedef struct {
#else
PACK(typedef struct {
uint8_t destCh;
uint16_t phases;
uint16_t flightModes;
uint8_t curveMode:1; // O=curve, 1=differential
uint8_t noExpo:1;
int8_t carryTrim:3;
@@ -142,7 +142,7 @@ PACK(typedef struct {
uint8_t fadeOut;
ROTARY_ENCODER_ARRAY;
gvar_t gvars[5];
}) PhaseData_v215;
}) FlightModeData_v215;
PACK(typedef struct {
int16_t v1;
@@ -225,7 +225,7 @@ PACK(typedef struct {
LogicalSwitchData_v215 logicalSw[NUM_LOGICAL_SWITCH];
CustomFnData_v215 funcSw[32];
SwashRingData swashR;
PhaseData_v215 phaseData[MAX_FLIGHT_MODES];
FlightModeData_v215 flightModeData[MAX_FLIGHT_MODES];
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5ms increments
uint8_t thrTraceSrc;
@@ -500,7 +500,7 @@ void ConvertModel_215_to_216(ModelData &model)
MixData_v215 * oldMix = &oldModel.mixData[i];
#if defined(PCBTARANIS)
mix->destCh = oldMix->destCh;
mix->phases = oldMix->phases;
mix->flightModes = oldMix->flightModes;
mix->mltpx = oldMix->mltpx;
if (oldMix->carryTrim == TRIM_OFF) mix->carryTrim = TRIM_OFF;
mix->weight = ConvertGVAR_215_to_216(oldMix->weight);
@@ -533,7 +533,7 @@ void ConvertModel_215_to_216(ModelData &model)
#else
mix->destCh = oldMix->destCh;
mix->mixWarn = oldMix->mixWarn;
mix->phases = oldMix->phases;
mix->flightModes = oldMix->flightModes;
mix->curveMode = oldMix->curveMode;
mix->noExpo = oldMix->noExpo;
mix->carryTrim = oldMix->carryTrim;
@@ -575,7 +575,7 @@ void ConvertModel_215_to_216(ModelData &model)
if (oldExpo->mode) {
#if defined(PCBTARANIS)
uint8_t chn = oldExpo->chn;
if (!oldExpo->swtch && !oldExpo->phases) {
if (!oldExpo->swtch && !oldExpo->flightModes) {
indexes[chn] = -1;
}
else if (indexes[chn] != -1) {
@@ -588,7 +588,7 @@ void ConvertModel_215_to_216(ModelData &model)
expo->chn = chn;
expo->mode = oldExpo->mode;
expo->swtch = ConvertSwitch_215_to_216(oldExpo->swtch);
expo->phases = oldExpo->phases;
expo->flightModes = oldExpo->flightModes;
expo->weight = oldExpo->weight;
memcpy(expo->name, oldExpo->name, LEN_EXPOMIX_NAME);
if (oldExpo->curveMode==0/*expo*/) {
@@ -610,7 +610,7 @@ void ConvertModel_215_to_216(ModelData &model)
expo->chn = oldExpo->chn;
expo->curveMode = oldExpo->curveMode;
expo->swtch = oldExpo->swtch;
expo->phases = oldExpo->phases;
expo->flightModes = oldExpo->flightModes;
expo->weight = oldExpo->weight;
memcpy(expo->name, oldExpo->name, LEN_EXPOMIX_NAME);
expo->curveParam = oldExpo->curveParam;
@@ -678,8 +678,8 @@ void ConvertModel_215_to_216(ModelData &model)
if (cstate == LS_FAMILY_OFS || cstate == LS_FAMILY_DIFF) {
if ((uint8_t)sw.v1 >= MIXSRC_FIRST_TELEM) {
switch ((uint8_t)sw.v1) {
case MIXSRC_FIRST_TELEM + TELEM_TM1-1:
case MIXSRC_FIRST_TELEM + TELEM_TM2-1:
case MIXSRC_FIRST_TELEM + TELEM_TIMER1-1:
case MIXSRC_FIRST_TELEM + TELEM_TIMER2-1:
sw.v2 = (sw.v2+128) * 3;
break;
case MIXSRC_FIRST_TELEM + TELEM_ALT-1:
@@ -802,22 +802,22 @@ void ConvertModel_215_to_216(ModelData &model)
g_model.swashR.collectiveSource = ConvertSource_215_to_216(g_model.swashR.collectiveSource);
for (uint8_t i=0; i<9; i++) {
if (i==0 || oldModel.phaseData[i].swtch) {
memcpy(&g_model.phaseData[i], &oldModel.phaseData[i], sizeof(oldModel.phaseData[i])); // the last 4 gvars will remain blank
g_model.phaseData[i].swtch = ConvertSwitch_215_to_216(oldModel.phaseData[i].swtch);
if (i==0 || oldModel.flightModeData[i].swtch) {
memcpy(&g_model.flightModeData[i], &oldModel.flightModeData[i], sizeof(oldModel.flightModeData[i])); // the last 4 gvars will remain blank
g_model.flightModeData[i].swtch = ConvertSwitch_215_to_216(oldModel.flightModeData[i].swtch);
#if defined(PCBTARANIS)
for (uint8_t t=0; t<4; t++) {
int trim = oldModel.phaseData[i].trim[t];
int trim = oldModel.flightModeData[i].trim[t];
if (trim > 500) {
trim -= 501;
if (trim >= i)
trim += 1;
g_model.phaseData[i].trim[t].mode = 2*trim;
g_model.phaseData[i].trim[t].value = 0;
g_model.flightModeData[i].trim[t].mode = 2*trim;
g_model.flightModeData[i].trim[t].value = 0;
}
else {
g_model.phaseData[i].trim[t].mode = 2*i;
g_model.phaseData[i].trim[t].value = trim;
g_model.flightModeData[i].trim[t].mode = 2*i;
g_model.flightModeData[i].trim[t].value = trim;
}
}
#endif
+16 -16
View File
@@ -46,7 +46,7 @@ void doMixerCalculations();
memset(&g_model, 0, sizeof(g_model)); \
extern uint8_t s_mixer_first_run_done; \
s_mixer_first_run_done = false; \
s_last_phase = 255;
lastFlightMode = 255;
int32_t lastAct = 0;
void MIXER_RESET()
@@ -59,7 +59,7 @@ void MIXER_RESET()
s_last_switch_used = 0;
s_last_switch_value = 0;
#endif
s_current_mixer_flight_mode = s_last_phase = 0;
mixerCurrentFlightMode = lastFlightMode = 0;
lastAct = 0;
logicalSwitchesReset();
}
@@ -365,8 +365,8 @@ TEST(getSwitch, recursiveSW)
TEST(FlightModes, nullFadeOut_posFadeIn)
{
MODEL_RESET();
g_model.phaseData[1].swtch = SWSRC_ID1;
g_model.phaseData[1].fadeIn = 15;
g_model.flightModeData[1].swtch = SWSRC_ID1;
g_model.flightModeData[1].fadeIn = 15;
perMain();
simuSetSwitch(3, 0);
perMain();
@@ -527,16 +527,16 @@ TEST(Mixer, RecursiveAddChannelAfterInactivePhase)
{
MODEL_RESET();
MIXER_RESET();
g_model.phaseData[1].swtch = SWSRC_ID1;
g_model.flightModeData[1].swtch = SWSRC_ID1;
g_model.mixData[0].destCh = 0;
g_model.mixData[0].mltpx = MLTPX_ADD;
g_model.mixData[0].srcRaw = MIXSRC_CH2;
g_model.mixData[0].phases = 0b11110;
g_model.mixData[0].flightModes = 0b11110;
g_model.mixData[0].weight = 50;
g_model.mixData[1].destCh = 0;
g_model.mixData[1].mltpx = MLTPX_ADD;
g_model.mixData[1].srcRaw = MIXSRC_MAX;
g_model.mixData[1].phases = 0b11101;
g_model.mixData[1].flightModes = 0b11101;
g_model.mixData[1].weight = 50;
g_model.mixData[2].destCh = 1;
g_model.mixData[2].srcRaw = MIXSRC_MAX;
@@ -634,23 +634,23 @@ TEST(Mixer, SlowOnPhase)
{
MODEL_RESET();
MIXER_RESET();
g_model.phaseData[1].swtch = TR(SWSRC_THR, SWSRC_SA0);
g_model.flightModeData[1].swtch = TR(SWSRC_THR, SWSRC_SA0);
g_model.mixData[0].destCh = 0;
g_model.mixData[0].mltpx = MLTPX_ADD;
g_model.mixData[0].srcRaw = MIXSRC_MAX;
g_model.mixData[0].weight = 100;
g_model.mixData[0].phases = 0x2 + 0x4 + 0x8 + 0x10 /*only enabled in phase 0*/;
g_model.mixData[0].flightModes = 0x2 + 0x4 + 0x8 + 0x10 /*only enabled in phase 0*/;
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
s_mixer_first_run_done = true;
s_current_mixer_flight_mode = 0;
mixerCurrentFlightMode = 0;
evalFlightModeMixes(e_perout_mode_normal, 0);
EXPECT_EQ(chans[0], 0);
CHECK_SLOW_MOVEMENT(0, +1, 250);
s_current_mixer_flight_mode = 1;
mixerCurrentFlightMode = 1;
CHECK_SLOW_MOVEMENT(0, -1, 250);
}
@@ -659,16 +659,16 @@ TEST(Mixer, SlowOnSwitchAndPhase)
{
MODEL_RESET();
MIXER_RESET();
g_model.phaseData[1].swtch = TR(SWSRC_THR, SWSRC_SA0);
g_model.flightModeData[1].swtch = TR(SWSRC_THR, SWSRC_SA0);
g_model.mixData[0].destCh = 0;
g_model.mixData[0].mltpx = MLTPX_ADD;
g_model.mixData[0].srcRaw = MIXSRC_MAX;
g_model.mixData[0].weight = 100;
g_model.mixData[0].swtch = TR(SWSRC_THR, SWSRC_SA0);
#if defined(CPUARM)
g_model.mixData[0].phases = 0x2 + 0x4 + 0x8 + 0x10 + 0x20 + 0x40 + 0x80 + 0x100 /*only enabled in phase 0*/;
g_model.mixData[0].flightModes = 0x2 + 0x4 + 0x8 + 0x10 + 0x20 + 0x40 + 0x80 + 0x100 /*only enabled in phase 0*/;
#else
g_model.mixData[0].phases = 0x2 + 0x4 + 0x8 + 0x10 /*only enabled in phase 0*/;
g_model.mixData[0].flightModes = 0x2 + 0x4 + 0x8 + 0x10 /*only enabled in phase 0*/;
#endif
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
@@ -678,11 +678,11 @@ TEST(Mixer, SlowOnSwitchAndPhase)
EXPECT_EQ(chans[0], 0);
simuSetSwitch(0, 1);
s_current_mixer_flight_mode = 0;
mixerCurrentFlightMode = 0;
CHECK_SLOW_MOVEMENT(0, +1, 250);
simuSetSwitch(0, -1);
s_current_mixer_flight_mode = 1;
mixerCurrentFlightMode = 1;
CHECK_SLOW_MOVEMENT(0, -1, 250);
}
#endif
+4 -2
View File
@@ -51,19 +51,21 @@ extern LanguagePack plLanguagePack;
extern LanguagePack ptLanguagePack;
extern LanguagePack skLanguagePack;
extern LanguagePack seLanguagePack;
extern LanguagePack huLanguagePack;
LanguagePack * languagePacks[] = {
// alphabetical order
&czLanguagePack,
&deLanguagePack,
&enLanguagePack,
&esLanguagePack,
&frLanguagePack,
&deLanguagePack,
&huLanguagePack,
&itLanguagePack,
&plLanguagePack,
&ptLanguagePack,
&skLanguagePack,
&seLanguagePack,
&skLanguagePack,
NULL
};
#endif
+125 -99
View File
@@ -915,14 +915,11 @@ enum menuModelSetupItems {
ITEM_MODEL_EXTERNAL_MODULE_CHANNELS,
ITEM_MODEL_EXTERNAL_MODULE_BIND,
ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE,
#if defined(PCBSKY9X) && !defined(REVX)
#if defined(PCBSKY9X) && !defined(REVA) && !defined(REVX)
ITEM_MODEL_EXTRA_MODULE_LABEL,
ITEM_MODEL_EXTRA_MODULE_CHANNELS,
ITEM_MODEL_EXTRA_MODULE_BIND,
#endif
ITEM_MODEL_TRAINER_LABEL,
ITEM_MODEL_TRAINER_CHANNELS,
ITEM_MODEL_TRAINER_SETTINGS,
#else
ITEM_MODEL_PPM1_PROTOCOL,
ITEM_MODEL_PPM1_PARAMS,
@@ -977,10 +974,10 @@ void onModelSetupBitmapMenu(const char *result)
#if defined(PCBTARANIS)
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
#elif defined(PCBSKY9X) && defined(REVX)
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : EXTERNAL_MODULE)
#elif defined(PCBSKY9X) && !defined(REVA) && !defined(REVX)
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE)
#else
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE))
#define CURRENT_MODULE_EDITED(k) (EXTERNAL_MODULE)
#endif
void menuModelSetup(uint8_t event)
@@ -1005,18 +1002,23 @@ void menuModelSetup(uint8_t event)
#define IF_EXTERNAL_MODULE_ON(x) (g_model.externalModule == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x))
#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8)
#define EXTERNAL_MODULE_CHANNELS_ROWS() IF_EXTERNAL_MODULE_ON(IS_MODULE_DSM2(EXTERNAL_MODULE) ? (uint8_t)0 : (uint8_t)1)
#define TRAINER_CHANNELS_ROWS() (1)
#define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS() : TRAINER_CHANNELS_ROWS())
#define TRAINER_CHANNELS_ROWS() (HIDDEN_ROW)
#define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS() : 0)
#define FAILSAFE_ROWS(x) ((g_model.moduleData[x].rfProtocol==RF_PROTO_X16 || g_model.moduleData[x].rfProtocol==RF_PROTO_LR12) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW)
#define CURSOR_ON_CELL (true)
#define MODEL_SETUP_MAX_LINES (1+ITEM_MODEL_SETUP_MAX)
#define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0)
#if defined(REVX)
#define EXTRA_MODULE_ROWS
#else
#if defined(PCBTARANIS) || (defined(PCBSKY9X) && !defined(REVA) && !defined(REVX))
#define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2,
#else
#define EXTRA_MODULE_ROWS
#endif
MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0,CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, LABEL(ExternalModule), (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS(), (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), EXTRA_MODULE_ROWS LABEL(Trainer), TRAINER_CHANNELS_ROWS(), 2});
#if defined(PCBTARANIS)
#define TRAINER_MODULE_ROWS LABEL(Trainer), IF_TRAINER_ON(1), 2
#else
#define TRAINER_MODULE_ROWS
#endif
MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, LABEL(ExternalModule), (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS(), (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), EXTRA_MODULE_ROWS TRAINER_MODULE_ROWS });
#elif defined(CPUM64)
#define CURSOR_ON_CELL (true)
#define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX)
@@ -1160,7 +1162,7 @@ void menuModelSetup(uint8_t event)
if (event==EVT_KEY_LONG(KEY_ENTER)) {
s_noHi = NO_HI_LEN;
for (uint8_t i=0; i<MAX_FLIGHT_MODES; i++) {
memclear(&g_model.phaseData[i], TRIMS_ARRAY_SIZE);
memclear(&g_model.flightModeData[i], TRIMS_ARRAY_SIZE);
}
eeDirty(EE_MODEL);
AUDIO_WARNING1();
@@ -1426,21 +1428,22 @@ void menuModelSetup(uint8_t event)
}
}
break;
#endif
#if defined(PCBTARANIS)
case ITEM_MODEL_TRAINER_LABEL:
lcd_putsLeft(y, STR_TRAINER);
break;
#endif
#if defined(PCBTARANIS)
case ITEM_MODEL_INTERNAL_MODULE_CHANNELS:
#elif defined(PCBSKY9X) && !defined(REVX)
case ITEM_MODEL_EXTRA_MODULE_CHANNELS:
#endif
#if defined(CPUARM)
case ITEM_MODEL_EXTERNAL_MODULE_CHANNELS:
#if defined(PCBTARANIS)
case ITEM_MODEL_TRAINER_CHANNELS:
#endif
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
ModuleData & moduleData = g_model.moduleData[moduleIdx];
@@ -1457,7 +1460,11 @@ void menuModelSetup(uint8_t event)
break;
case 1:
CHECK_INCDEC_MODELVAR(event, moduleData.channelsCount, -4, min<int8_t>(MAX_CHANNELS(moduleIdx), 32-8-moduleData.channelsStart));
if ((k == ITEM_MODEL_EXTERNAL_MODULE_CHANNELS && g_model.externalModule == MODULE_TYPE_PPM) || (k == ITEM_MODEL_TRAINER_CHANNELS))
if ((k == ITEM_MODEL_EXTERNAL_MODULE_CHANNELS && g_model.externalModule == MODULE_TYPE_PPM)
#if defined(PCBTARANIS)
|| (k == ITEM_MODEL_TRAINER_CHANNELS)
#endif
)
SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx);
break;
}
@@ -1474,7 +1481,9 @@ void menuModelSetup(uint8_t event)
#endif
#if defined(CPUARM)
case ITEM_MODEL_EXTERNAL_MODULE_BIND:
#if defined(PCBTARANIS)
case ITEM_MODEL_TRAINER_SETTINGS:
#endif
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
ModuleData & moduleData = g_model.moduleData[moduleIdx];
@@ -1839,16 +1848,16 @@ FlightModesType editFlightModes(uint8_t x, uint8_t y, uint8_t event, FlightModes
#if defined(PCBTARANIS)
enum FlightModesItems {
ITEM_PHASES_NAME,
ITEM_PHASES_SWITCH,
ITEM_PHASES_TRIM_RUD,
ITEM_PHASES_TRIM_ELE,
ITEM_PHASES_TRIM_THR,
ITEM_PHASES_TRIM_AIL,
ITEM_PHASES_FADE_IN,
ITEM_PHASES_FADE_OUT,
ITEM_PHASES_COUNT,
ITEM_PHASES_LAST = ITEM_PHASES_COUNT-1
ITEM_FLIGHT_MODES_NAME,
ITEM_FLIGHT_MODES_SWITCH,
ITEM_FLIGHT_MODES_TRIM_RUD,
ITEM_FLIGHT_MODES_TRIM_ELE,
ITEM_FLIGHT_MODES_TRIM_THR,
ITEM_FLIGHT_MODES_TRIM_AIL,
ITEM_FLIGHT_MODES_FADE_IN,
ITEM_FLIGHT_MODES_FADE_OUT,
ITEM_FLIGHT_MODES_COUNT,
ITEM_FLIGHT_MODES_LAST = ITEM_FLIGHT_MODES_COUNT-1
};
bool isTrimModeAvailable(int mode)
@@ -1858,7 +1867,7 @@ bool isTrimModeAvailable(int mode)
void menuModelFlightModesAll(uint8_t event)
{
MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_FlightModesAll, 1+MAX_FLIGHT_MODES+1, {0, NAVIGATION_LINE_BY_LINE|(ITEM_PHASES_LAST-5), NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, 0});
MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_FlightModesAll, 1+MAX_FLIGHT_MODES+1, {0, NAVIGATION_LINE_BY_LINE|(ITEM_FLIGHT_MODES_LAST-5), NAVIGATION_LINE_BY_LINE|ITEM_FLIGHT_MODES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_FLIGHT_MODES_LAST, NAVIGATION_LINE_BY_LINE|NAVIGATION_LINE_BY_LINE|ITEM_FLIGHT_MODES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_FLIGHT_MODES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_FLIGHT_MODES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_FLIGHT_MODES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_FLIGHT_MODES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_FLIGHT_MODES_LAST, 0});
int8_t sub = m_posVert - 1;
@@ -1876,26 +1885,26 @@ void menuModelFlightModesAll(uint8_t event)
if (k==MAX_FLIGHT_MODES) {
// last line available - add the "check trims" line
lcd_putsLeft((LCD_LINES-1)*FH+1, STR_CHECKTRIMS);
putsFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, s_current_mixer_flight_mode+1);
putsFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, mixerCurrentFlightMode+1);
if (sub==MAX_FLIGHT_MODES && !trimsCheckTimer) {
lcd_status_line();
}
return;
}
PhaseData *p = phaseAddress(k);
FlightModeData *p = flightModeAddress(k);
putsFlightMode(0, y, k+1, (getFlightPhase()==k ? BOLD : 0) | ((sub==k && m_posHorz<0) ? INVERS : 0));
putsFlightMode(0, y, k+1, (getFlightMode()==k ? BOLD : 0) | ((sub==k && m_posHorz<0) ? INVERS : 0));
for (uint8_t j=0; j<ITEM_PHASES_COUNT; j++) {
for (uint8_t j=0; j<ITEM_FLIGHT_MODES_COUNT; j++) {
uint8_t attr = ((sub==k && posHorz==j) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0);
uint8_t active = (attr && (s_editMode>0 || p1valdiff)) ;
switch (j) {
case ITEM_PHASES_NAME:
case ITEM_FLIGHT_MODES_NAME:
editName(4*FW-1, y, p->name, sizeof(p->name), event, attr);
break;
case ITEM_PHASES_SWITCH:
case ITEM_FLIGHT_MODES_SWITCH:
if (k == 0) {
lcd_puts((5+LEN_FP_NAME)*FW, y, STR_DEFAULT);
}
@@ -1905,12 +1914,12 @@ void menuModelFlightModesAll(uint8_t event)
}
break;
case ITEM_PHASES_TRIM_RUD:
case ITEM_PHASES_TRIM_ELE:
case ITEM_PHASES_TRIM_THR:
case ITEM_PHASES_TRIM_AIL:
case ITEM_FLIGHT_MODES_TRIM_RUD:
case ITEM_FLIGHT_MODES_TRIM_ELE:
case ITEM_FLIGHT_MODES_TRIM_THR:
case ITEM_FLIGHT_MODES_TRIM_AIL:
if (k != 0) {
uint8_t t = j-ITEM_PHASES_TRIM_RUD;
uint8_t t = j-ITEM_FLIGHT_MODES_TRIM_RUD;
putsTrimMode((4+LEN_FP_NAME)*FW+j*(5*FW/2), y, k, t, attr);
if (active) {
trim_t & v = p->trim[t];
@@ -1918,12 +1927,12 @@ void menuModelFlightModesAll(uint8_t event)
}
}
break;
case ITEM_PHASES_FADE_IN:
case ITEM_FLIGHT_MODES_FADE_IN:
lcd_outdezAtt(32*FW-2, y, (10/DELAY_STEP)*p->fadeIn, attr|PREC1);
if (active) p->fadeIn = checkIncDec(event, p->fadeIn, 0, DELAY_MAX, EE_MODEL|NO_INCDEC_MARKS);
break;
case ITEM_PHASES_FADE_OUT:
case ITEM_FLIGHT_MODES_FADE_OUT:
lcd_outdezAtt(35*FW, y, (10/DELAY_STEP)*p->fadeOut, attr|PREC1);
if (active) p->fadeOut = checkIncDec(event, p->fadeOut, 0, DELAY_MAX, EE_MODEL|NO_INCDEC_MARKS);
break;
@@ -1961,14 +1970,14 @@ enum menuModelPhaseItems {
void menuModelPhaseOne(uint8_t event)
{
PhaseData *phase = phaseAddress(s_currIdx);
putsFlightMode(13*FW, 0, s_currIdx+1, (getFlightPhase()==s_currIdx ? BOLD : 0));
FlightModeData *fm = flightModeAddress(s_currIdx);
putsFlightMode(13*FW, 0, s_currIdx+1, (getFlightMode()==s_currIdx ? BOLD : 0));
#if defined(GVARS) && !defined(PCBSTD)
static const pm_uint8_t mstate_tab_phase1[] PROGMEM = {0, 0, 0, (uint8_t)-1, 1, 1, 1, 1, 1};
static const pm_uint8_t mstate_tab_fm1[] PROGMEM = {0, 0, 0, (uint8_t)-1, 1, 1, 1, 1, 1};
static const pm_uint8_t mstate_tab_others[] PROGMEM = {0, 0, 3, IF_ROTARY_ENCODERS(NUM_ROTARY_ENCODERS-1) 0, 0, (uint8_t)-1, 2, 2, 2, 2, 2};
if (!check(event, 0, NULL, 0, (s_currIdx == 0) ? mstate_tab_phase1 : mstate_tab_others, DIM(mstate_tab_others)-1, ITEM_MODEL_PHASE_MAX - 1 - (s_currIdx==0 ? (ITEM_MODEL_PHASE_FADE_IN-ITEM_MODEL_PHASE_SWITCH) : 0))) return;
if (!check(event, 0, NULL, 0, (s_currIdx == 0) ? mstate_tab_fm1 : mstate_tab_others, DIM(mstate_tab_others)-1, ITEM_MODEL_PHASE_MAX - 1 - (s_currIdx==0 ? (ITEM_MODEL_PHASE_FADE_IN-ITEM_MODEL_PHASE_SWITCH) : 0))) return;
TITLE(STR_MENUFLIGHTPHASE);
@@ -1996,10 +2005,10 @@ void menuModelPhaseOne(uint8_t event)
#endif
switch(i) {
case ITEM_MODEL_PHASE_NAME:
editSingleName(MIXES_2ND_COLUMN, y, STR_PHASENAME, phase->name, sizeof(phase->name), event, attr);
editSingleName(MIXES_2ND_COLUMN, y, STR_PHASENAME, fm->name, sizeof(fm->name), event, attr);
break;
case ITEM_MODEL_PHASE_SWITCH:
phase->swtch = switchMenuItem(MIXES_2ND_COLUMN, y, phase->swtch, attr, event);
fm->swtch = switchMenuItem(MIXES_2ND_COLUMN, y, fm->swtch, attr, event);
break;
case ITEM_MODEL_PHASE_TRIMS:
lcd_putsLeft(y, STR_TRIMS);
@@ -2023,12 +2032,12 @@ void menuModelPhaseOne(uint8_t event)
for (uint8_t t=0; t<NUM_ROTARY_ENCODERS; t++) {
putsRotaryEncoderMode(MIXES_2ND_COLUMN+(t*FW), y, s_currIdx, t, m_posHorz==t ? attr : 0);
if (attr && m_posHorz==t && ((editMode>0) || p1valdiff)) {
int16_t v = phaseAddress(s_currIdx)->rotaryEncoders[t];
int16_t v = flightModeAddress(s_currIdx)->rotaryEncoders[t];
if (v < ROTARY_ENCODER_MAX) v = ROTARY_ENCODER_MAX;
v = checkIncDec(event, v, ROTARY_ENCODER_MAX, ROTARY_ENCODER_MAX+MAX_FLIGHT_MODES-1, EE_MODEL);
if (checkIncDec_Ret) {
if (v == ROTARY_ENCODER_MAX) v = 0;
phaseAddress(s_currIdx)->rotaryEncoders[t] = v;
flightModeAddress(s_currIdx)->rotaryEncoders[t] = v;
}
}
}
@@ -2036,11 +2045,11 @@ void menuModelPhaseOne(uint8_t event)
#endif
case ITEM_MODEL_PHASE_FADE_IN:
phase->fadeIn = EDIT_DELAY(0, y, event, attr, STR_FADEIN, phase->fadeIn);
fm->fadeIn = EDIT_DELAY(0, y, event, attr, STR_FADEIN, fm->fadeIn);
break;
case ITEM_MODEL_PHASE_FADE_OUT:
phase->fadeOut = EDIT_DELAY(0, y, event, attr, STR_FADEOUT, phase->fadeOut);
fm->fadeOut = EDIT_DELAY(0, y, event, attr, STR_FADEOUT, fm->fadeOut);
break;
#if defined(GVARS) && !defined(PCBSTD)
@@ -2058,7 +2067,7 @@ void menuModelPhaseOne(uint8_t event)
editName(4*FW, y, g_model.gvars[idx].name, LEN_GVAR_NAME, event, posHorz==0 ? attr : 0);
int16_t v = phase->gvars[idx];
int16_t v = fm->gvars[idx];
if (v > GVAR_MAX) {
uint8_t p = v - GVAR_MAX - 1;
if (p >= s_currIdx) p++;
@@ -2072,7 +2081,7 @@ void menuModelPhaseOne(uint8_t event)
v = checkIncDec(event, v, GVAR_MAX, GVAR_MAX+MAX_FLIGHT_MODES-1, EE_MODEL);
if (checkIncDec_Ret) {
if (v == GVAR_MAX) v = 0;
phase->gvars[idx] = v;
fm->gvars[idx] = v;
}
}
@@ -2138,11 +2147,11 @@ void menuModelFlightModesAll(uint8_t event)
uint8_t y = 1 + (i+1)*FH;
#endif
att = (i==sub ? INVERS : 0);
PhaseData *p = phaseAddress(i);
FlightModeData *p = flightModeAddress(i);
#if ROTARY_ENCODERS > 2
putsFlightMode(0, y, i+1, att|CONDENSED|(getFlightPhase()==i ? BOLD : 0));
putsFlightMode(0, y, i+1, att|CONDENSED|(getFlightMode()==i ? BOLD : 0));
#else
putsFlightMode(0, y, i+1, att|(getFlightPhase()==i ? BOLD : 0));
putsFlightMode(0, y, i+1, att|(getFlightMode()==i ? BOLD : 0));
#endif
lcd_putsnAtt(4*FW+NAME_OFS, y, p->name, sizeof(p->name), ZCHAR);
@@ -2171,7 +2180,7 @@ void menuModelFlightModesAll(uint8_t event)
#endif
lcd_putsLeft((LCD_LINES-1)*FH+1, STR_CHECKTRIMS);
putsFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, s_current_mixer_flight_mode+1);
putsFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, mixerCurrentFlightMode+1);
if (sub==MAX_FLIGHT_MODES && !trimsCheckTimer) {
lcd_status_line();
}
@@ -2255,10 +2264,10 @@ int16_t expoFn(int16_t x)
ExpoData *ed = expoAddress(s_currIdx);
int16_t anas[NUM_INPUTS] = {0};
#if defined(PCBTARANIS)
applyExpos(anas, e_perout_mode_inactive_phase, ed->srcRaw, x);
applyExpos(anas, e_perout_mode_inactive_flight_mode, ed->srcRaw, x);
#else
anas[ed->chn] = x;
applyExpos(anas, e_perout_mode_inactive_phase);
applyExpos(anas, e_perout_mode_inactive_flight_mode);
#endif
return anas[ed->chn];
}
@@ -3022,7 +3031,7 @@ void menuModelExpoOne(uint8_t event)
#if defined(FLIGHT_MODES)
case EXPO_FIELD_FLIGHT_PHASE:
ed->phases = editFlightModes(EXPO_ONE_2ND_COLUMN-IF_9X(EXPO_ONE_FP_WIDTH), y, event, ed->phases, attr);
ed->flightModes = editFlightModes(EXPO_ONE_2ND_COLUMN-IF_9X(EXPO_ONE_FP_WIDTH), y, event, ed->flightModes, attr);
break;
#endif
@@ -3255,7 +3264,7 @@ void menuModelMixOne(uint8_t event)
#endif
#if defined(FLIGHT_MODES)
case MIX_FIELD_FLIGHT_PHASE:
md2->phases = editFlightModes(COLUMN_X+MIXES_2ND_COLUMN, y, event, md2->phases, attr);
md2->flightModes = editFlightModes(COLUMN_X+MIXES_2ND_COLUMN, y, event, md2->flightModes, attr);
break;
#endif
case MIX_FIELD_SWITCH:
@@ -3603,12 +3612,12 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
if (ed->mode!=3) lcd_putc(EXPO_LINE_SIDE_POS, y, ed->mode == 2 ? 126 : 127);
#if defined(CPUARM) && LCD_W >= 212
if (ed->phases) lcd_puts(EXPO_LINE_FM_POS, y, STR_FP);
if (ed->flightModes) lcd_puts(EXPO_LINE_FM_POS, y, STR_FP);
if (ed->name[0]) lcd_putsnAtt(EXPO_LINE_NAME_POS, y, ed->name, sizeof(ed->name), ZCHAR | (isExpoActive(i) ? BOLD : 0));
#elif defined(CPUARM)
if (ed->name[0]) lcd_putsnAtt(EXPO_LINE_NAME_POS, y, ed->name, sizeof(ed->name), ZCHAR | (isExpoActive(i) ? BOLD : 0));
#else
displayFlightModes(EXPO_LINE_FM_POS, y, ed->phases);
displayFlightModes(EXPO_LINE_FM_POS, y, ed->flightModes);
#endif
}
else {
@@ -3635,7 +3644,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
{
#if defined(PCBTARANIS)
putsCurveRef(MIX_LINE_CURVE_POS, y, md->curve, 0);
if (md->phases) lcd_puts(MIX_LINE_FM_POS, y, STR_FP);
if (md->flightModes) lcd_puts(MIX_LINE_FM_POS, y, STR_FP);
#else
if (md->curveParam) {
if (md->curveMode == MODE_CURVE)
@@ -4117,7 +4126,7 @@ void onGVARSMenu(const char *result)
}
else if (result == STR_CLEAR) {
for (int i=0; i<MAX_FLIGHT_MODES; i++) {
g_model.phaseData[i].gvars[sub] = 0;
g_model.flightModeData[i].gvars[sub] = 0;
}
eeDirty(EE_MODEL);
}
@@ -4134,7 +4143,7 @@ void menuModelGVars(uint8_t event)
if (first2seconds) {
menuTitle = STR_GLOBAL_V;
for (int i=0; i<MAX_GVARS; i++) {
putsStrIdx(GVARS_FM_COLUMN(i)-16, 1, STR_FP, i, SMLSIZE|(getFlightPhase()==i ? INVERS : 0));
putsStrIdx(GVARS_FM_COLUMN(i)-16, 1, STR_FP, i, SMLSIZE|(getFlightMode()==i ? INVERS : 0));
}
}
else {
@@ -4178,8 +4187,8 @@ void menuModelGVars(uint8_t event)
default:
{
PhaseData *phase = &g_model.phaseData[j-1];
int16_t & v = phase->gvars[i];
FlightModeData *fm = &g_model.flightModeData[j-1];
int16_t & v = fm->gvars[i];
int16_t vmin, vmax;
if (v > GVAR_MAX) {
uint8_t p = v - GVAR_MAX - 1;
@@ -4828,19 +4837,30 @@ void menuModelLogicalSwitches(uint8_t event)
void onCustomFunctionsFileSelectionMenu(const char *result)
{
int8_t sub = m_posVert - 1;
CustomFnData * cf = &g_model.funcSw[sub];
uint8_t func = CFN_FUNC(cf);
if (result == STR_UPDATE_LIST) {
char directory[] = SOUNDS_PATH;
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
if (!listSdFiles(directory, SOUNDS_EXT, sizeof(g_model.funcSw[sub].play.name), NULL)) {
POPUP_WARNING(STR_NO_SOUNDS_ON_SD);
char directory[256];
if (func == FUNC_PLAY_SCRIPT) {
strcpy(directory, SCRIPTS_FUNCS_PATH);
}
else {
strcpy(directory, SOUNDS_PATH);
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
}
if (!listSdFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cf->play.name), NULL)) {
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD);
s_menu_flags = 0;
}
}
else {
// The user choosed a wav file in the list
memcpy(g_model.funcSw[sub].play.name, result, sizeof(g_model.funcSw[sub].play.name));
// The user choosed a file in the list
memcpy(cf->play.name, result, sizeof(cf->play.name));
eeDirty(EE_MODEL);
if (func == FUNC_PLAY_SCRIPT) {
LUA_LOAD_MODEL_SCRIPTS();
}
}
}
#endif
@@ -4874,7 +4894,6 @@ void onCustomFunctionsMenu(const char *result)
eeDirty(EE_MODEL);
}
}
#endif
void menuModelCustomFunctions(uint8_t event)
@@ -5018,7 +5037,7 @@ void menuModelCustomFunctions(uint8_t event)
}
#endif
#if defined(CPUARM) && defined(SDCARD)
else if (func == FUNC_PLAY_TRACK || func == FUNC_BACKGND_MUSIC) {
else if (func == FUNC_PLAY_TRACK || func == FUNC_BACKGND_MUSIC || func == FUNC_PLAY_SCRIPT) {
#if LCD_W >= 212
xcoord_t x = MODEL_CUSTOM_FUNC_3RD_COLUMN;
#else
@@ -5030,13 +5049,19 @@ void menuModelCustomFunctions(uint8_t event)
lcd_putsiAtt(x, y, STR_VCSWFUNC, 0, attr);
if (active && event==EVT_KEY_BREAK(KEY_ENTER)) {
s_editMode = 0;
char directory[] = SOUNDS_PATH;
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
if (listSdFiles(directory, SOUNDS_EXT, sizeof(sd->play.name), sd->play.name)) {
char directory[256];
if (func==FUNC_PLAY_SCRIPT) {
strcpy(directory, SCRIPTS_FUNCS_PATH);
}
else {
strcpy(directory, SOUNDS_PATH);
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
}
if (listSdFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(sd->play.name), sd->play.name)) {
menuHandler = onCustomFunctionsFileSelectionMenu;
}
else {
POPUP_WARNING(STR_NO_SOUNDS_ON_SD);
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD);
s_menu_flags = 0;
}
}
@@ -5112,7 +5137,7 @@ void menuModelCustomFunctions(uint8_t event)
else if (func == FUNC_ADJUST_GVAR) {
switch (CFN_GVAR_MODE(sd)) {
case FUNC_ADJUST_GVAR_CONSTANT:
val_displayed = (int8_t)CFN_PARAM(sd);
val_displayed = (int16_t)CFN_PARAM(sd);
val_min = -CFN_GVAR_CST_MAX; val_max = +CFN_GVAR_CST_MAX;
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT);
break;
@@ -5204,7 +5229,7 @@ void onModelCustomScriptMenu(const char *result)
ScriptData &sd = g_model.scriptsData[s_currIdx];
if (result == STR_UPDATE_LIST) {
if (!listSdFiles(SCRIPTS_PATH, SCRIPTS_EXT, sizeof(sd.file), NULL)) {
if (!listSdFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), NULL)) {
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);
s_menu_flags = 0;
}
@@ -5235,7 +5260,7 @@ void menuModelCustomScriptOne(uint8_t event)
putsStrIdx(lcdLastPos+FW, 0, "LUA", s_currIdx+1, 0);
SUBMENU_NOTITLE(3+scriptInternalData[s_currIdx].inputsCount, { 0, 0, LABEL(inputs), 0/*repeated*/ });
SUBMENU_NOTITLE(3+scriptInputsOutputs[s_currIdx].inputsCount, { 0, 0, LABEL(inputs), 0/*repeated*/ });
int8_t sub = m_posVert;
@@ -5252,7 +5277,7 @@ void menuModelCustomScriptOne(uint8_t event)
lcd_putsiAtt(SCRIPT_ONE_2ND_COLUMN_POS, y, STR_VCSWFUNC, 0, attr);
if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && !READ_ONLY()) {
s_editMode = 0;
if (listSdFiles(SCRIPTS_PATH, SCRIPTS_EXT, sizeof(sd.file), sd.file, LIST_NONE_SD_FILE)) {
if (listSdFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), sd.file, LIST_NONE_SD_FILE)) {
menuHandler = onModelCustomScriptMenu;
}
else {
@@ -5268,32 +5293,32 @@ void menuModelCustomScriptOne(uint8_t event)
else if (i == ITEM_MODEL_CUSTOMSCRIPT_PARAMS_LABEL) {
lcd_putsLeft(y, STR_INPUTS);
}
else if (i <= ITEM_MODEL_CUSTOMSCRIPT_PARAMS_LABEL+scriptInternalData[s_currIdx].inputsCount) {
else if (i <= ITEM_MODEL_CUSTOMSCRIPT_PARAMS_LABEL+scriptInputsOutputs[s_currIdx].inputsCount) {
int inputIdx = i-ITEM_MODEL_CUSTOMSCRIPT_PARAMS_LABEL-1;
lcd_putsnAtt(INDENT_WIDTH, y, scriptInternalData[s_currIdx].inputs[inputIdx].name, 10, 0);
if (scriptInternalData[s_currIdx].inputs[inputIdx].type == 0) {
lcd_outdezAtt(SCRIPT_ONE_2ND_COLUMN_POS, y, g_model.scriptsData[s_currIdx].inputs[inputIdx]+scriptInternalData[s_currIdx].inputs[inputIdx].def, attr|LEFT);
lcd_putsnAtt(INDENT_WIDTH, y, scriptInputsOutputs[s_currIdx].inputs[inputIdx].name, 10, 0);
if (scriptInputsOutputs[s_currIdx].inputs[inputIdx].type == 0) {
lcd_outdezAtt(SCRIPT_ONE_2ND_COLUMN_POS, y, g_model.scriptsData[s_currIdx].inputs[inputIdx]+scriptInputsOutputs[s_currIdx].inputs[inputIdx].def, attr|LEFT);
if (attr) {
CHECK_INCDEC_MODELVAR(event, g_model.scriptsData[s_currIdx].inputs[inputIdx], scriptInternalData[s_currIdx].inputs[inputIdx].min-scriptInternalData[s_currIdx].inputs[inputIdx].def, scriptInternalData[s_currIdx].inputs[inputIdx].max-scriptInternalData[s_currIdx].inputs[inputIdx].def);
CHECK_INCDEC_MODELVAR(event, g_model.scriptsData[s_currIdx].inputs[inputIdx], scriptInputsOutputs[s_currIdx].inputs[inputIdx].min-scriptInputsOutputs[s_currIdx].inputs[inputIdx].def, scriptInputsOutputs[s_currIdx].inputs[inputIdx].max-scriptInputsOutputs[s_currIdx].inputs[inputIdx].def);
}
}
else {
putsMixerSource(SCRIPT_ONE_2ND_COLUMN_POS, y, g_model.scriptsData[s_currIdx].inputs[inputIdx]+scriptInternalData[s_currIdx].inputs[inputIdx].def, attr);
putsMixerSource(SCRIPT_ONE_2ND_COLUMN_POS, y, g_model.scriptsData[s_currIdx].inputs[inputIdx]+scriptInputsOutputs[s_currIdx].inputs[inputIdx].def, attr);
if (attr) {
uint8_t *source = (uint8_t *)&g_model.scriptsData[s_currIdx].inputs[inputIdx];
CHECK_INCDEC_MODELSOURCE(event, *source, scriptInternalData[s_currIdx].inputs[inputIdx].min-scriptInternalData[s_currIdx].inputs[inputIdx].def, scriptInternalData[s_currIdx].inputs[inputIdx].max-scriptInternalData[s_currIdx].inputs[inputIdx].def);
CHECK_INCDEC_MODELSOURCE(event, *source, scriptInputsOutputs[s_currIdx].inputs[inputIdx].min-scriptInputsOutputs[s_currIdx].inputs[inputIdx].def, scriptInputsOutputs[s_currIdx].inputs[inputIdx].max-scriptInputsOutputs[s_currIdx].inputs[inputIdx].def);
}
}
}
}
if (scriptInternalData[s_currIdx].outputsCount > 0) {
if (scriptInputsOutputs[s_currIdx].outputsCount > 0) {
lcd_vline(SCRIPT_ONE_3RD_COLUMN_POS-4, FH+1, LCD_H-FH-1);
lcd_puts(SCRIPT_ONE_3RD_COLUMN_POS, FH+1, STR_OUTPUTS);
for (int i=0; i<scriptInternalData[s_currIdx].outputsCount; i++) {
for (int i=0; i<scriptInputsOutputs[s_currIdx].outputsCount; i++) {
putsMixerSource(SCRIPT_ONE_3RD_COLUMN_POS+INDENT_WIDTH, FH+1+FH+i*FH, MIXSRC_FIRST_LUA+(s_currIdx*MAX_SCRIPT_OUTPUTS)+i, 0);
lcd_outdezNAtt(SCRIPT_ONE_3RD_COLUMN_POS+11*FW+3, FH+1+FH+i*FH, calcRESXto1000(scriptInternalData[s_currIdx].outputs[i].value), PREC1);
lcd_outdezNAtt(SCRIPT_ONE_3RD_COLUMN_POS+11*FW+3, FH+1+FH+i*FH, calcRESXto1000(scriptInputsOutputs[s_currIdx].outputs[i].value), PREC1);
}
}
}
@@ -5320,7 +5345,7 @@ void menuModelCustomScripts(uint8_t event)
break;
}
for (int i=0; i<MAX_SCRIPTS; i++) {
for (int i=0, scriptIndex=0; i<MAX_SCRIPTS; i++) {
y = 1 + (i+1)*FH;
ScriptData &sd = g_model.scriptsData[i];
@@ -5331,7 +5356,7 @@ void menuModelCustomScripts(uint8_t event)
// LUA script
if (ZEXIST(sd.file)) {
lcd_putsnAtt(5*FW, y, sd.file, sizeof(sd.file), 0);
switch (scriptInternalData[i].state) {
switch (scriptInternalData[scriptIndex].state) {
case SCRIPT_SYNTAX_ERROR:
lcd_puts(28*FW+2, y, "(error)");
break;
@@ -5342,12 +5367,13 @@ void menuModelCustomScripts(uint8_t event)
lcd_puts(29*FW+2, y, "(leak)");
break;
default:
lcd_outdezAtt(31*FW, y, luaGetCpuUsed(i));
lcd_outdezAtt(31*FW, y, luaGetCpuUsed(scriptIndex));
lcd_putc(31*FW, y, '%');
lcd_outdezAtt(34*FW+2, y, luaGetMemUsed(i));
lcd_outdezAtt(34*FW+2, y, luaGetMemUsed(scriptIndex));
lcd_putc(34*FW+2, y, 'k');
break;
}
scriptIndex++;
}
else {
lcd_putsiAtt(5*FW, y, STR_VCSWFUNC, 0, 0);
+8 -11
View File
@@ -341,16 +341,11 @@ uint8_t scrollbar_X = LCD_W-1;
#if defined(CPUARM)
bool modelHasNotes()
{
FILINFO info;
TCHAR lfn[_MAX_LFN + 1];
info.lfname = lfn;
info.lfsize = sizeof(lfn);
char filename[sizeof(MODELS_PATH)+1+sizeof(g_model.header.name)+sizeof(TEXT_EXT)] = MODELS_PATH "/";
char *buf = strcat_modelname(&filename[sizeof(MODELS_PATH)], g_eeGeneral.currModel);
strcpy(buf, TEXT_EXT);
return (f_stat(filename, &info) == FR_OK);
return isFileAvailable(filename);
}
void pushModelNotes()
@@ -1168,11 +1163,11 @@ int16_t gvarMenuItem(uint8_t x, uint8_t y, int16_t value, int16_t min, int16_t m
s_editMode = !s_editMode;
#if defined(CPUARM)
if (attr & PREC1)
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_current_mixer_flight_mode)*10 : delta);
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode)*10 : delta);
else
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_current_mixer_flight_mode) : delta);
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode) : delta);
#else
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_current_mixer_flight_mode) : delta);
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode) : delta);
#endif
eeDirty(EE_MODEL);
}
@@ -1391,7 +1386,7 @@ bool isSourceAvailable(int source)
#if defined(LUA_MODEL_SCRIPTS)
if (source>=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA) {
div_t qr = div(source-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS);
return (scriptInternalData[qr.quot].state==SCRIPT_OK && qr.rem<scriptInternalData[qr.quot].outputsCount);
return (qr.rem<scriptInputsOutputs[qr.quot].outputsCount);
}
#elif defined(PCBTARANIS)
if (source>=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA)
@@ -1568,7 +1563,9 @@ bool isAssignableFunctionAvailable(int function)
case FUNC_RESERVE1:
case FUNC_RESERVE2:
case FUNC_RESERVE3:
case FUNC_RESERVE4:
#if !defined(LUA)
case FUNC_PLAY_SCRIPT:
#endif
case FUNC_RESERVE5:
return false;
+4 -4
View File
@@ -654,8 +654,8 @@ void menuMainView(uint8_t event)
{
// Flight Phase Name
uint8_t phase = s_current_mixer_flight_mode;
lcd_putsnAtt(PHASE_X, PHASE_Y, g_model.phaseData[phase].name, sizeof(g_model.phaseData[phase].name), ZCHAR|PHASE_FLAGS);
uint8_t phase = mixerCurrentFlightMode;
lcd_putsnAtt(PHASE_X, PHASE_Y, g_model.flightModeData[phase].name, sizeof(g_model.flightModeData[phase].name), ZCHAR|PHASE_FLAGS);
// Model Name
putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE);
@@ -868,13 +868,13 @@ void menuMainView(uint8_t event)
putsStrIdx(BITMAP_X+FW, BITMAP_Y+FH-1, STR_GV, s_gvar_last+1);
lcd_putsnAtt(BITMAP_X+4*FW+FW/2, BITMAP_Y+FH-1, g_model.gvars[s_gvar_last].name, LEN_GVAR_NAME, ZCHAR);
lcd_putsAtt(BITMAP_X+FW, BITMAP_Y+2*FH+3, PSTR("[\010]"), BOLD);
lcd_outdezAtt(BITMAP_X+5*FW+FW/2, BITMAP_Y+2*FH+3, GVAR_VALUE(s_gvar_last, s_current_mixer_flight_mode), BOLD);
lcd_outdezAtt(BITMAP_X+5*FW+FW/2, BITMAP_Y+2*FH+3, GVAR_VALUE(s_gvar_last, getGVarFlightPhase(mixerCurrentFlightMode, s_gvar_last)), BOLD);
#else
s_warning = STR_GLOBAL_VAR;
displayBox();
lcd_putsnAtt(16, 5*FH, g_model.gvars[s_gvar_last].name, LEN_GVAR_NAME, ZCHAR);
lcd_putsAtt(16+7*FW, 5*FH, PSTR("[\010]"), BOLD);
lcd_outdezAtt(16+7*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last, s_current_mixer_flight_mode), BOLD);
lcd_outdezAtt(16+7*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last, getGVarFlightPhase(mixerCurrentFlightMode, s_gvar_last)), BOLD);
s_warning = NULL;
#endif
}
+10 -4
View File
@@ -56,7 +56,7 @@ enum FrskyViews {
FRSKY_VIEW_MAX = e_frsky_after_flight
};
static uint8_t s_frsky_view = e_frsky_custom_screen_1;
uint8_t s_frsky_view = e_frsky_custom_screen_1;
#if LCD_W >= 212
#define BAR_LEFT 26
@@ -206,6 +206,12 @@ void menuTelemetryFrsky(uint8_t event)
#endif
}
#if defined(LUA)
if (isTelemetryScriptAvailable(s_frsky_view)) {
return;
}
#endif
lcdDrawTelemetryTopBar();
if (s_frsky_view < MAX_FRSKY_SCREENS) {
@@ -229,7 +235,7 @@ void menuTelemetryFrsky(uint8_t event)
#endif
getvalue_t threshold = 0;
uint8_t thresholdX = 0;
if (source <= TELEM_TM2)
if (source <= TELEM_TIMER2)
threshold = 0;
else if (source <= TELEM_RSSI_RX)
threshold = getRssiAlarmValue(source-TELEM_RSSI_TX);
@@ -325,9 +331,9 @@ void menuTelemetryFrsky(uint8_t event)
#endif
putsTelemetryChannel(pos[j+1]-2, 1+FH+2*FH*i, field-1, value, att);
if (field >= TELEM_TM1 && field <= TELEM_TM2 && i!=3) {
if (field >= TELEM_TIMER1 && field <= TELEM_TIMER2 && i!=3) {
// there is not enough space on LCD for displaying "Tmr1" or "Tmr2" and still see the - sign, we write "T1" or "T2" instead
field = field-TELEM_TM1+TELEM_T1;
field = field-TELEM_TIMER1+TELEM_T1;
}
lcd_putsiAtt(pos[j], 1+FH+2*FH*i, STR_VTELEMCHNS, field, 0);
}
+13 -13
View File
@@ -860,12 +860,12 @@ void lcdDrawTelemetryTopBar()
if (g_model.timers[0].mode) {
att = (timersStates[0].val<0 ? BLINK : 0);
putsTimer(22*FW+5*FWNUM+3, 0, timersStates[0].val, att, att);
lcd_putsiAtt(18*FW+2, 1, STR_VTELEMCHNS, TELEM_TM1, SMLSIZE);
lcd_putsiAtt(18*FW+2, 1, STR_VTELEMCHNS, TELEM_TIMER1, SMLSIZE);
}
if (g_model.timers[1].mode) {
att = (timersStates[1].val<0 ? BLINK : 0);
putsTimer(31*FW+5*FWNUM+3, 0, timersStates[1].val, att, att);
lcd_putsiAtt(27*FW+2, 1, STR_VTELEMCHNS, TELEM_TM2, SMLSIZE);
lcd_putsiAtt(27*FW+2, 1, STR_VTELEMCHNS, TELEM_TIMER2, SMLSIZE);
}
lcd_invert_line(0);
}
@@ -976,10 +976,10 @@ void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att)
else if (idx <= MIXSRC_LAST_LUA) {
div_t qr = div(idx-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS);
#if defined(LUA_MODEL_SCRIPTS)
if (qr.quot < MAX_SCRIPTS && qr.rem < scriptInternalData[qr.quot].outputsCount) {
if (qr.quot < MAX_SCRIPTS && qr.rem < scriptInputsOutputs[qr.quot].outputsCount) {
lcd_putcAtt(x+2, y+1, '1'+qr.quot, TINSIZE);
lcd_filled_rect(x, y, 7, 7);
lcd_putsnAtt(x+8, y, scriptInternalData[qr.quot].outputs[qr.rem].name, att & STREXPANDED ? 9 : 4, att);
lcd_putsnAtt(x+8, y, scriptInputsOutputs[qr.quot].outputs[qr.rem].name, att & STREXPANDED ? 9 : 4, att);
}
else
#endif
@@ -1167,7 +1167,7 @@ void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags at
#if ROTARY_ENCODERS > 0
void putsRotaryEncoderMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att)
{
int16_t v = phaseAddress(phase)->rotaryEncoders[idx];
int16_t v = flightModeAddress(phase)->rotaryEncoders[idx];
if (v > ROTARY_ENCODER_MAX) {
uint8_t p = v - ROTARY_ENCODER_MAX - 1;
@@ -1214,8 +1214,8 @@ void putsTelemetryChannel(xcoord_t x, uint8_t y, uint8_t channel, lcdint_t val,
break;
}
#endif
case TELEM_TM1-1:
case TELEM_TM2-1:
case TELEM_TIMER1-1:
case TELEM_TIMER2-1:
att &= ~NO_UNIT;
putsTimer(x, y, val, att, att);
break;
@@ -1309,6 +1309,10 @@ void putsTelemetryChannel(xcoord_t x, uint8_t y, uint8_t channel, lcdint_t val,
putsTelemetryValue(x, y, val, UNIT_RAW, att);
break;
case TELEM_HDG-1:
putsTelemetryValue(x, y, val, UNIT_HDG, att);
break;
#if defined(FRSKY_SPORT)
case TELEM_ALT-1:
putsTelemetryValue(x, y, div10_and_round(val), UNIT_DIST, att|PREC1);
@@ -1324,10 +1328,6 @@ void putsTelemetryChannel(xcoord_t x, uint8_t y, uint8_t channel, lcdint_t val,
// no break
#endif
case TELEM_HDG-1:
putsTelemetryValue(x, y, val, UNIT_HDG, att);
break;
default:
{
uint8_t unit = 1;
@@ -1346,8 +1346,8 @@ void putsTelemetryChannel(xcoord_t x, uint8_t y, uint8_t channel, lcdint_t val,
void putsTelemetryChannel(xcoord_t x, uint8_t y, uint8_t channel, lcdint_t val, uint8_t att)
{
switch (channel) {
case TELEM_TM1-1:
case TELEM_TM2-1:
case TELEM_TIMER1-1:
case TELEM_TIMER2-1:
att &= ~NO_UNIT;
putsTimer(x, y, val, att, att);
break;
+3 -3
View File
@@ -115,7 +115,7 @@ const pm_char * openLogs()
f_puts("Time,", &g_oLogFile);
#endif
#if defined(CPUARM)
#if defined(CPUARM) && defined(FRSKY)
f_puts("SWR,RSSI,A1,A2,A3,A4,", &g_oLogFile);
#elif defined(FRSKY)
f_puts("Buffer,RX,TX,A1,A2,", &g_oLogFile);
@@ -196,13 +196,13 @@ void writeLogs()
f_printf(&g_oLogFile, "%d,", tmr10ms);
#endif
#if defined(FRSKY)
#if defined(CPUARM)
f_printf(&g_oLogFile, "%d,%d,", frskyData.swr.value, frskyData.rssi[0].value);
#elif defined(FRSKY)
#else
f_printf(&g_oLogFile, "%d,%d,%d,", frskyStreaming, frskyData.rssi[0].value, frskyData.rssi[1].value);
#endif
#if defined(FRSKY)
for (uint8_t i=0; i<MAX_FRSKY_A_CHANNELS; i++) {
int16_t converted_value = applyChannelRatio(i, frskyData.analog[i].value);
f_printf(&g_oLogFile, "%d.%02d,", converted_value/100, converted_value%100);
+157 -40
View File
@@ -58,7 +58,9 @@ extern "C" {
lua_State *L = NULL;
uint8_t luaState = 0;
uint8_t luaScriptsCount = 0;
ScriptInternalData scriptInternalData[MAX_SCRIPTS] = { { SCRIPT_NOFILE, 0 } };
ScriptInputsOutputs scriptInputsOutputs[MAX_SCRIPTS] = { {0} };
ScriptInternalData standaloneScript = { SCRIPT_NOFILE, 0 };
uint16_t maxLuaInterval = 0;
uint16_t maxLuaDuration = 0;
@@ -854,7 +856,7 @@ static int luaModelGetGlobalVariable(lua_State *L)
int idx = luaL_checkunsigned(L, 1);
int phase = luaL_checkunsigned(L, 2);
if (phase < MAX_FLIGHT_MODES && idx < MAX_GVARS)
lua_pushinteger(L, g_model.phaseData[phase].gvars[idx]);
lua_pushinteger(L, g_model.flightModeData[phase].gvars[idx]);
else
lua_pushnil(L);
return 1;
@@ -866,7 +868,7 @@ static int luaModelSetGlobalVariable(lua_State *L)
int phase = luaL_checkunsigned(L, 2);
int value = luaL_checkinteger(L, 3);
if (phase < MAX_FLIGHT_MODES && idx < MAX_GVARS && value >= -GVAR_LIMIT && value <= GVAR_LIMIT) {
g_model.phaseData[phase].gvars[idx] = value;
g_model.flightModeData[phase].gvars[idx] = value;
}
return 0;
}
@@ -915,7 +917,7 @@ static int luaDefaultChannel(lua_State *L)
return 1;
}
int luaGetInputs(ScriptInternalData & sid)
int luaGetInputs(ScriptInputsOutputs & sid)
{
if (!lua_istable(L, -1))
return -1;
@@ -969,7 +971,7 @@ int luaGetInputs(ScriptInternalData & sid)
return 0;
}
int luaGetOutputs(ScriptInternalData & sid)
int luaGetOutputs(ScriptInputsOutputs & sid)
{
if (!lua_istable(L, -1))
return -1;
@@ -1107,7 +1109,7 @@ void luaFree(ScriptInternalData & sid)
}
}
int luaLoad(const char *filename, ScriptInternalData & sid)
int luaLoad(const char *filename, ScriptInternalData & sid, ScriptInputsOutputs * sio=NULL)
{
int init = 0;
@@ -1136,11 +1138,11 @@ int luaLoad(const char *filename, ScriptInternalData & sid)
sid.run = luaL_ref(L, LUA_REGISTRYINDEX);
lua_pushnil(L);
}
else if (!strcmp(key, "input")) {
luaGetInputs(sid);
else if (sio && !strcmp(key, "input")) {
luaGetInputs(*sio);
}
else if (!strcmp(key, "output")) {
luaGetOutputs(sid);
else if (sio && !strcmp(key, "output")) {
luaGetOutputs(*sio);
}
}
@@ -1167,28 +1169,109 @@ int luaLoad(const char *filename, ScriptInternalData & sid)
return sid.state;
}
void luaLoadModelScript(uint8_t index)
void luaLoadMixScript(uint8_t index)
{
ScriptData & sd = g_model.scriptsData[index];
ScriptInternalData & sid = scriptInternalData[index];
memset(&sid, 0, sizeof(sid));
sid.state = SCRIPT_NOFILE;
if (ZEXIST(sd.file)) {
char filename[sizeof(SCRIPTS_PATH)+sizeof(sd.file)+sizeof(SCRIPTS_EXT)] = SCRIPTS_PATH "/";
strncpy(filename+sizeof(SCRIPTS_PATH), sd.file, sizeof(sd.file));
filename[sizeof(SCRIPTS_PATH)+sizeof(sd.file)] = '\0';
strcat(filename+sizeof(SCRIPTS_PATH), SCRIPTS_EXT);
luaLoad(filename, sid);
ScriptInternalData & sid = scriptInternalData[luaScriptsCount++];
ScriptInputsOutputs * sio = &scriptInputsOutputs[index];
memset(&sid, 0, sizeof(sid));
sid.reference = SCRIPT_MIX_FIRST+index;
sid.state = SCRIPT_NOFILE;
char filename[sizeof(SCRIPTS_MIXES_PATH)+sizeof(sd.file)+sizeof(SCRIPTS_EXT)] = SCRIPTS_MIXES_PATH "/";
strncpy(filename+sizeof(SCRIPTS_MIXES_PATH), sd.file, sizeof(sd.file));
filename[sizeof(SCRIPTS_MIXES_PATH)+sizeof(sd.file)] = '\0';
strcat(filename+sizeof(SCRIPTS_MIXES_PATH), SCRIPTS_EXT);
luaLoad(filename, sid, sio);
}
}
void luaLoadModelScripts()
bool luaLoadFunctionScript(uint8_t index)
{
CustomFnData & fn = g_model.funcSw[index];
if (fn.func == FUNC_PLAY_SCRIPT && ZEXIST(fn.play.name)) {
if (luaScriptsCount < MAX_SCRIPTS) {
ScriptInternalData & sid = scriptInternalData[luaScriptsCount++];
memset(&sid, 0, sizeof(sid));
sid.reference = SCRIPT_FUNC_FIRST+index;
sid.state = SCRIPT_NOFILE;
char filename[sizeof(SCRIPTS_FUNCS_PATH)+sizeof(fn.play.name)+sizeof(SCRIPTS_EXT)] = SCRIPTS_FUNCS_PATH "/";
strncpy(filename+sizeof(SCRIPTS_FUNCS_PATH), fn.play.name, sizeof(fn.play.name));
filename[sizeof(SCRIPTS_FUNCS_PATH)+sizeof(fn.play.name)] = '\0';
strcat(filename+sizeof(SCRIPTS_FUNCS_PATH), SCRIPTS_EXT);
luaLoad(filename, sid);
}
else {
return false;
}
}
return true;
}
void getTelemetryScriptPath(char * path, uint8_t index)
{
strcpy(path, SCRIPTS_PATH "/");
char * curs = strcat_modelname(path+sizeof(SCRIPTS_PATH), g_eeGeneral.currModel);
strcpy(curs, "/telemX.lua");
curs[6] = '0' + index;
}
bool luaLoadTelemetryScript(uint8_t index)
{
char path[256];
getTelemetryScriptPath(path, index);
if (isFileAvailable(path)) {
if (luaScriptsCount < MAX_SCRIPTS) {
ScriptInternalData & sid = scriptInternalData[luaScriptsCount++];
memset(&sid, 0, sizeof(sid));
sid.reference = SCRIPT_TELEMETRY_FIRST+index;
sid.state = SCRIPT_NOFILE;
luaLoad(path, sid);
}
else {
return false;
}
}
return true;
}
bool isTelemetryScriptAvailable(uint8_t index)
{
for (int i=0; i<luaScriptsCount; i++) {
ScriptInternalData & sid = scriptInternalData[i];
if (sid.reference == SCRIPT_TELEMETRY_FIRST+index) {
return true;
}
}
return false;
}
void luaLoadMixScripts()
{
luaScriptsCount = 0;
// Load model scripts
for (int i=0; i<MAX_SCRIPTS; i++) {
luaLoadModelScript(i);
luaLoadMixScript(i);
}
// Load custom function scripts
for (int i=0; i<NUM_CFN; i++) {
if (!luaLoadFunctionScript(i)) {
POPUP_WARNING("Too many Lua scripts!"); // TODO translation
break;
}
}
// Load telemetry scripts
for (int i=0; i<MAX_SCRIPTS; i++) {
if (!luaLoadTelemetryScript(i)) {
POPUP_WARNING("Too many Lua scripts!"); // TODO translation
break;
}
}
}
@@ -1246,6 +1329,8 @@ void luaExec(const char *filename)
}
}
extern uint8_t s_frsky_view;
void luaTask(uint8_t evt)
{
lcd_locked = false;
@@ -1330,40 +1415,71 @@ void luaTask(uint8_t evt)
if (luaState & LUASTATE_RELOAD_MODEL_SCRIPTS) {
luaState = 0;
LUA_RESET();
luaLoadModelScripts();
luaLoadMixScripts();
}
for (int i=0; i<MAX_SCRIPTS; i++) {
ScriptData & sd = g_model.scriptsData[i];
for (int i=0; i<luaScriptsCount; i++) {
ScriptInternalData & sid = scriptInternalData[i];
if (sid.state == SCRIPT_OK) {
uint8_t prev_mem = lua_gc(L, LUA_GCCOUNT, 0);
SET_LUA_INSTRUCTIONS_COUNT(PERMANENT_SCRIPTS_MAX_INSTRUCTIONS);
lua_rawgeti(L, LUA_REGISTRYINDEX, sid.run);
for (int j=0; j<sid.inputsCount; j++) {
if (sid.inputs[j].type == 1)
luaGetValueAndPush((uint8_t)sd.inputs[j]);
else
lua_pushinteger(L, sd.inputs[j] + sid.inputs[j].def);
#if defined(SIMU) || defined(DEBUG)
const char *filename;
#endif
ScriptInputsOutputs * sio = NULL;
if (sid.reference >= SCRIPT_MIX_FIRST && sid.reference <= SCRIPT_MIX_LAST) {
ScriptData & sd = g_model.scriptsData[sid.reference-SCRIPT_MIX_FIRST];
sio = &scriptInputsOutputs[sid.reference-SCRIPT_MIX_FIRST];
#if defined(SIMU) || defined(DEBUG)
filename = sd.file;
#endif
lua_rawgeti(L, LUA_REGISTRYINDEX, sid.run);
for (int j=0; j<sio->inputsCount; j++) {
if (sio->inputs[j].type == 1)
luaGetValueAndPush((uint8_t)sd.inputs[j]);
else
lua_pushinteger(L, sd.inputs[j] + sio->inputs[j].def);
}
}
if (lua_pcall(L, sid.inputsCount, sid.outputsCount, 0) == 0) {
for (int j=sid.outputsCount-1; j>=0; j--) {
if (!lua_isnumber(L, -1)) {
sid.state = (instructionsPercent > 100 ? SCRIPT_KILLED : SCRIPT_SYNTAX_ERROR);
TRACE("Script %10s disabled", sd.file);
break;
else if (sid.reference >= SCRIPT_FUNC_FIRST && sid.reference <= SCRIPT_FUNC_LAST) {
CustomFnData & fn = g_model.funcSw[sid.reference-SCRIPT_FUNC_FIRST];
if (!getSwitch(fn.swtch)) {
continue;
}
#if defined(SIMU) || defined(DEBUG)
filename = fn.play.name;
#endif
lua_rawgeti(L, LUA_REGISTRYINDEX, sid.run);
}
else {
if (g_menuStack[0]!=menuTelemetryFrsky || sid.reference!=SCRIPT_TELEMETRY_FIRST+s_frsky_view) {
continue;
}
#if defined(SIMU) || defined(DEBUG)
filename = "[telem]";
#endif
lua_rawgeti(L, LUA_REGISTRYINDEX, sid.run);
}
if (lua_pcall(L, sio ? sio->inputsCount : 0, sio ? sio->outputsCount : 0, 0) == 0) {
if (sio) {
for (int j=sio->outputsCount-1; j>=0; j--) {
if (!lua_isnumber(L, -1)) {
sid.state = (instructionsPercent > 100 ? SCRIPT_KILLED : SCRIPT_SYNTAX_ERROR);
TRACE("Script %8s disabled", filename);
break;
}
sio->outputs[j].value = lua_tointeger(L, -1);
lua_pop(L, 1);
}
sid.outputs[j].value = lua_tointeger(L, -1);
lua_pop(L, 1);
}
}
else {
if (instructionsPercent > 100) {
TRACE("Script %10s killed", sd.file);
TRACE("Script %8s killed", filename);
sid.state = SCRIPT_KILLED;
}
else {
TRACE("Script %10s error: %s", sd.file, lua_tostring(L, -1));
TRACE("Script %8s error: %s", filename, lua_tostring(L, -1));
sid.state = SCRIPT_SYNTAX_ERROR;
}
}
@@ -1392,6 +1508,7 @@ void luaTask(uint8_t evt)
if (max_idx >= 0) {
ScriptInternalData & sid = scriptInternalData[max_idx];
TRACE("Script %d killed", max_idx);
// TODO Global Warning
sid.state = SCRIPT_LEAK;
luaFree(sid);
}
+64 -47
View File
@@ -89,7 +89,7 @@ void applyExpos(int16_t *anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS)
if (!EXPO_VALID(ed)) break; // end of list
if (ed->chn == cur_chn)
continue;
if (ed->phases & (1<<s_current_mixer_flight_mode))
if (ed->flightModes & (1<<mixerCurrentFlightMode))
continue;
if (getSwitch(ed->swtch)) {
#if defined(PCBTARANIS)
@@ -128,18 +128,18 @@ void applyExpos(int16_t *anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS)
if (ed->curveMode == MODE_CURVE)
v = applyCurve(v, curveParam);
else
v = expo(v, GET_GVAR(curveParam, -100, 100, s_current_mixer_flight_mode));
v = expo(v, GET_GVAR(curveParam, -100, 100, mixerCurrentFlightMode));
}
#endif
//========== WEIGHT ===============
int16_t weight = GET_GVAR(ed->weight, MIN_EXPO_WEIGHT, 100, s_current_mixer_flight_mode);
int16_t weight = GET_GVAR(ed->weight, MIN_EXPO_WEIGHT, 100, mixerCurrentFlightMode);
weight = calc100to256(weight);
v = ((int32_t)v * weight) >> 8;
#if defined(PCBTARANIS)
//========== OFFSET ===============
int16_t offset = GET_GVAR(ed->offset, -100, 100, s_current_mixer_flight_mode);
int16_t offset = GET_GVAR(ed->offset, -100, 100, mixerCurrentFlightMode);
if (offset) v += calc100toRESX(offset);
//========== TRIMS ================
@@ -267,7 +267,7 @@ getvalue_t getValue(uint8_t i)
else if (i<MIXSRC_LAST_LUA) {
#if defined(LUA_MODEL_SCRIPTS)
div_t qr = div(i-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS);
return scriptInternalData[qr.quot].outputs[qr.rem].value;
return scriptInputsOutputs[qr.quot].outputs[qr.rem].value;
#else
return 0;
#endif
@@ -289,7 +289,7 @@ getvalue_t getValue(uint8_t i)
return 0;
#endif
else if (i<=MIXSRC_TrimAil) return calc1000toRESX((int16_t)8 * getTrimValue(s_current_mixer_flight_mode, i-MIXSRC_TrimRud));
else if (i<=MIXSRC_TrimAil) return calc1000toRESX((int16_t)8 * getTrimValue(mixerCurrentFlightMode, i-MIXSRC_TrimRud));
#if defined(PCBTARANIS)
else if (i==MIXSRC_SA) return (switchState(SW_SA0) ? -1024 : (switchState(SW_SA1) ? 0 : 1024));
@@ -314,7 +314,7 @@ getvalue_t getValue(uint8_t i)
else if (i<=MIXSRC_LAST_CH) return ex_chans[i-MIXSRC_CH1];
#if defined(GVARS)
else if (i<=MIXSRC_LAST_GVAR) return GVAR_VALUE(i-MIXSRC_GVAR1, getGVarFlightPhase(s_current_mixer_flight_mode, i-MIXSRC_GVAR1));
else if (i<=MIXSRC_LAST_GVAR) return GVAR_VALUE(i-MIXSRC_GVAR1, getGVarFlightPhase(mixerCurrentFlightMode, i-MIXSRC_GVAR1));
#endif
else if (i==MIXSRC_FIRST_TELEM-1+TELEM_TX_VOLTAGE) return g_vbat100mV;
@@ -325,7 +325,7 @@ getvalue_t getValue(uint8_t i)
return t.tm_hour*60 + t.tm_min;
}
#endif
else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_TM2) return timersStates[i-MIXSRC_FIRST_TELEM+1-TELEM_TM1].val;
else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_TIMER2) return timersStates[i-MIXSRC_FIRST_TELEM+1-TELEM_TIMER1].val;
#if defined(FRSKY)
#if defined(CPUARM)
else if (i==MIXSRC_FIRST_TELEM-1+TELEM_SWR) return frskyData.swr.value;
@@ -473,7 +473,7 @@ void evalInputs(uint8_t mode)
}
#endif
if (mode <= e_perout_mode_inactive_phase && isFunctionActive(FUNCTION_TRAINER+ch) && ppmInValid) {
if (mode <= e_perout_mode_inactive_flight_mode && isFunctionActive(FUNCTION_TRAINER+ch) && ppmInValid) {
// trainer mode
TrainerMix* td = &g_eeGeneral.trainer.mix[ch];
if (td->mode) {
@@ -528,7 +528,7 @@ void evalInputs(uint8_t mode)
#define HELI_ANAS_ARRAY anas
#endif
uint8_t s_current_mixer_flight_mode;
uint8_t mixerCurrentFlightMode;
void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms)
{
evalInputs(mode);
@@ -634,8 +634,8 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms)
}
//========== PHASE && SWITCH =====
bool mixCondition = (md->phases != 0 || md->swtch);
delayval_t mixEnabled = !(md->phases & (1 << s_current_mixer_flight_mode)) && getSwitch(md->swtch);
bool mixCondition = (md->flightModes != 0 || md->swtch);
delayval_t mixEnabled = !(md->flightModes & (1 << mixerCurrentFlightMode)) && getSwitch(md->swtch);
if (mixEnabled && md->srcRaw >= MIXSRC_FIRST_TRAINER && md->srcRaw <= MIXSRC_LAST_TRAINER && !ppmInValid) {
mixEnabled = 0;
@@ -643,7 +643,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms)
//========== VALUE ===============
getvalue_t v = 0;
if (mode > e_perout_mode_inactive_phase) {
if (mode > e_perout_mode_inactive_flight_mode) {
#if defined(PCBTARANIS)
if (!mixEnabled) {
continue;
@@ -767,14 +767,14 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms)
}
// saves 12 bytes code if done here and not together with weight; unknown reason
int16_t weight = GET_GVAR(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, s_current_mixer_flight_mode);
int16_t weight = GET_GVAR(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode);
weight = calc100to256_16Bits(weight);
//========== SPEED ===============
// now its on input side, but without weight compensation. More like other remote controls
// lower weight causes slower movement
if (mode <= e_perout_mode_inactive_phase && (md->speedUp || md->speedDown)) { // there are delay values
if (mode <= e_perout_mode_inactive_flight_mode && (md->speedUp || md->speedDown)) { // there are delay values
#define DEL_MULT_SHIFT 8
// we recale to a mult 256 higher value for calculation
int32_t tact = act[i];
@@ -827,7 +827,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms)
//========== OFFSET / AFTER ===============
if (apply_offset_and_curve) {
int16_t offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, s_current_mixer_flight_mode);
int16_t offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode);
if (offset) dv += int32_t(calc100toRESX_16Bits(offset)) << 8;
}
@@ -839,7 +839,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms)
#else
if (md->curveMode == MODE_DIFFERENTIAL) {
// @@@2 also recalculate curveParam to a 256 basis which ease the calculation later a lot
int16_t curveParam = calc100to256(GET_GVAR(md->curveParam, -100, 100, s_current_mixer_flight_mode));
int16_t curveParam = calc100to256(GET_GVAR(md->curveParam, -100, 100, mixerCurrentFlightMode));
if (curveParam > 0 && dv < 0)
dv = (dv * (256 - curveParam)) >> 8;
else if (curveParam < 0 && dv > 0)
@@ -925,7 +925,12 @@ int32_t sum_chans512[NUM_CHNOUT] = {0};
#define MAX_ACT 0xffff
uint8_t s_last_phase = 255; // TODO reinit everything here when the model changes, no???
uint8_t lastFlightMode = 255; // TODO reinit everything here when the model changes, no???
#if defined(CPUARM)
tmr10ms_t flightModeTransitionTime;
uint8_t flightModeTransitionLast = 255;
#endif
void evalMixes(uint8_t tick10ms)
{
@@ -935,46 +940,58 @@ void evalMixes(uint8_t tick10ms)
static uint16_t fp_act[MAX_FLIGHT_MODES] = {0};
static uint16_t delta = 0;
static ACTIVE_PHASES_TYPE s_fade_flight_phases = 0;
static ACTIVE_PHASES_TYPE flightModesFade = 0;
LS_RECURSIVE_EVALUATION_RESET();
uint8_t phase = getFlightPhase();
uint8_t fm = getFlightMode();
if (s_last_phase != phase) {
if (s_last_phase != 255) PLAY_PHASE_OFF(s_last_phase);
PLAY_PHASE_ON(phase);
if (lastFlightMode != fm) {
#if defined(CPUARM)
flightModeTransitionTime = get_tmr10ms();
#endif
if (s_last_phase == 255) {
fp_act[phase] = MAX_ACT;
if (lastFlightMode == 255) {
fp_act[fm] = MAX_ACT;
}
else {
uint8_t fadeTime = max(g_model.phaseData[s_last_phase].fadeOut, g_model.phaseData[phase].fadeIn);
ACTIVE_PHASES_TYPE transitionMask = ((ACTIVE_PHASES_TYPE)1 << s_last_phase) + ((ACTIVE_PHASES_TYPE)1 << phase);
uint8_t fadeTime = max(g_model.flightModeData[lastFlightMode].fadeOut, g_model.flightModeData[fm].fadeIn);
ACTIVE_PHASES_TYPE transitionMask = ((ACTIVE_PHASES_TYPE)1 << lastFlightMode) + ((ACTIVE_PHASES_TYPE)1 << fm);
if (fadeTime) {
s_fade_flight_phases |= transitionMask;
flightModesFade |= transitionMask;
delta = (MAX_ACT / (100/SLOW_STEP)) / fadeTime;
}
else {
s_fade_flight_phases &= ~transitionMask;
fp_act[s_last_phase] = 0;
fp_act[phase] = MAX_ACT;
flightModesFade &= ~transitionMask;
fp_act[lastFlightMode] = 0;
fp_act[fm] = MAX_ACT;
}
#if defined(CPUARM)
logicalSwitchesCopyState(s_last_phase, phase); // push last logical switches state from old to new phase
logicalSwitchesCopyState(lastFlightMode, fm); // push last logical switches state from old to new flight mode
#endif
}
s_last_phase = phase;
lastFlightMode = fm;
}
#if defined(CPUARM)
if (flightModeTransitionTime && get_tmr10ms() > flightModeTransitionTime+SWITCHES_DELAY()) {
flightModeTransitionTime = 0;
if (fm != flightModeTransitionLast) {
if (flightModeTransitionLast != 255) PLAY_PHASE_OFF(flightModeTransitionLast);
PLAY_PHASE_ON(fm);
flightModeTransitionLast = fm;
}
}
#endif
int32_t weight = 0;
if (s_fade_flight_phases) {
if (flightModesFade) {
memclear(sum_chans512, sizeof(sum_chans512));
for (uint8_t p=0; p<MAX_FLIGHT_MODES; p++) {
LS_RECURSIVE_EVALUATION_RESET();
if (s_fade_flight_phases & ((ACTIVE_PHASES_TYPE)1 << p)) {
s_current_mixer_flight_mode = p;
evalFlightModeMixes(p==phase ? e_perout_mode_normal : e_perout_mode_inactive_phase, p==phase ? tick10ms : 0);
if (flightModesFade & ((ACTIVE_PHASES_TYPE)1 << p)) {
mixerCurrentFlightMode = p;
evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0);
for (uint8_t i=0; i<NUM_CHNOUT; i++)
sum_chans512[i] += (chans[i] >> 4) * fp_act[p];
weight += fp_act[p];
@@ -982,10 +999,10 @@ void evalMixes(uint8_t tick10ms)
LS_RECURSIVE_EVALUATION_RESET();
}
assert(weight);
s_current_mixer_flight_mode = phase;
mixerCurrentFlightMode = fm;
}
else {
s_current_mixer_flight_mode = phase;
mixerCurrentFlightMode = fm;
evalFlightModeMixes(e_perout_mode_normal, tick10ms);
}
@@ -1006,7 +1023,7 @@ void evalMixes(uint8_t tick10ms)
// at the end chans[i] = chans[i]/256 => -1024..1024
// interpolate value with min/max so we get smooth motion from center to stop
// this limits based on v original values and min=-1024, max=1024 RESX=1024
int32_t q = (s_fade_flight_phases ? (sum_chans512[i] / weight) << 4 : chans[i]);
int32_t q = (flightModesFade ? (sum_chans512[i] / weight) << 4 : chans[i]);
#if defined(PCBSTD)
ex_chans[i] = q >> 8;
@@ -1021,17 +1038,17 @@ void evalMixes(uint8_t tick10ms)
sei();
}
if (tick10ms && s_fade_flight_phases) {
if (tick10ms && flightModesFade) {
uint16_t tick_delta = delta * tick10ms;
for (uint8_t p=0; p<MAX_FLIGHT_MODES; p++) {
ACTIVE_PHASES_TYPE phaseMask = ((ACTIVE_PHASES_TYPE)1 << p);
if (s_fade_flight_phases & phaseMask) {
if (p == phase) {
ACTIVE_PHASES_TYPE flightModeMask = ((ACTIVE_PHASES_TYPE)1 << p);
if (flightModesFade & flightModeMask) {
if (p == fm) {
if (MAX_ACT - fp_act[p] > tick_delta)
fp_act[p] += tick_delta;
else {
fp_act[p] = MAX_ACT;
s_fade_flight_phases -= phaseMask;
flightModesFade -= flightModeMask;
}
}
else {
@@ -1039,12 +1056,12 @@ void evalMixes(uint8_t tick10ms)
fp_act[p] -= tick_delta;
else {
fp_act[p] = 0;
s_fade_flight_phases -= phaseMask;
flightModesFade -= flightModeMask;
}
}
}
}
} //endif s_fade_fligh_phases
}
#if defined(PCBGRUVIN9X) && defined(DEBUG) && !defined(VOICE)
PORTH &= ~0x40; // PORTH:6 HIGH->LOW signals end of mixer interrupt
+26 -24
View File
@@ -205,7 +205,7 @@ typedef int16_t gvar_t;
#endif
#define MODEL_GVARS_DATA global_gvar_t gvars[MAX_GVARS];
#define PHASE_GVARS_DATA gvar_t gvars[MAX_GVARS]
#define GVAR_VALUE(x, p) g_model.phaseData[p].gvars[x]
#define GVAR_VALUE(x, p) g_model.flightModeData[p].gvars[x]
#endif
PACK(typedef struct t_TrainerMix {
@@ -481,7 +481,7 @@ PACK(typedef struct {
uint16_t scale;
uint8_t chn;
int8_t swtch;
uint16_t phases;
uint16_t flightModes;
int8_t weight;
int8_t carryTrim:6;
uint8_t mode:2;
@@ -499,7 +499,7 @@ PACK(typedef struct {
uint8_t chn:4;
uint8_t curveMode:2;
int8_t swtch;
uint16_t phases;
uint16_t flightModes;
int8_t weight;
char name[LEN_EXPOMIX_NAME];
int8_t curveParam;
@@ -513,7 +513,7 @@ PACK(typedef struct t_ExpoData {
uint8_t chn:2;
uint8_t curveMode:1;
uint8_t spare:3;
uint8_t phases;
uint8_t flightModes;
int8_t swtch;
uint8_t weight;
int8_t curveParam;
@@ -526,7 +526,7 @@ PACK(typedef struct t_ExpoData {
uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both
int8_t swtch:6;
uint8_t chn:2;
uint8_t phases:5;
uint8_t flightModes:5;
uint8_t curveMode:1;
uint8_t weight; // One spare bit here (used for GVARS)
int8_t curveParam;
@@ -540,9 +540,9 @@ PACK(typedef struct t_ExpoData {
#define limit_min_max_t int16_t
#define LIMIT_EXT_PERCENT 150
#define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10)
#define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, s_current_mixer_flight_mode)*10 : lim->max+1000)
#define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, s_current_mixer_flight_mode)*10 : lim->min-1000)
#define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR(lim->offset, -1000, 1000, s_current_mixer_flight_mode)*10 : lim->offset)
#define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode)*10 : lim->max+1000)
#define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode)*10 : lim->min-1000)
#define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR(lim->offset, -1000, 1000, mixerCurrentFlightMode)*10 : lim->offset)
#define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim))
#define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim))
#define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim))
@@ -593,7 +593,7 @@ PACK(typedef struct t_LimitData {
#if defined(PCBTARANIS)
PACK(typedef struct {
uint8_t destCh;
uint16_t phases;
uint16_t flightModes;
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
uint8_t carryTrim:1;
uint8_t spare1:5;
@@ -615,7 +615,7 @@ PACK(typedef struct {
PACK(typedef struct {
uint8_t destCh:4;
uint8_t mixWarn:4; // mixer warning
uint16_t phases;
uint16_t flightModes;
uint8_t curveMode:1;
uint8_t noExpo:1;
int8_t carryTrim:3;
@@ -673,7 +673,7 @@ PACK(typedef struct t_MixData {
uint8_t srcRaw;
int8_t weight;
int8_t swtch;
uint8_t phases;
uint8_t flightModes;
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
int8_t carryTrim:3;
uint8_t mixWarn:2; // mixer warning
@@ -695,7 +695,7 @@ PACK(typedef struct t_MixData {
int8_t weight;
int8_t swtch:6;
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
uint8_t phases:5;
uint8_t flightModes:5;
int8_t carryTrim:3;
uint8_t srcRaw:6;
uint8_t mixWarn:2; // mixer warning
@@ -824,7 +824,7 @@ enum Functions {
FUNC_PLAY_VALUE,
#if defined(CPUARM)
FUNC_PLAY_DIFF,
FUNC_RESERVE4,
FUNC_PLAY_SCRIPT,
FUNC_RESERVE5,
FUNC_BACKGND_MUSIC,
FUNC_BACKGND_MUSIC_PAUSE,
@@ -898,8 +898,10 @@ enum AdjustGvarFunctionParam {
#if defined(CPUARM)
#if defined(PCBTARANIS)
#define LEN_CFN_NAME 8
#define CFN_SPARE_TYPE int32_t
#else
#define LEN_CFN_NAME 6
#define CFN_SPARE_TYPE int16_t
#endif
PACK(typedef struct t_CustomFnData { // Function Switches data
int8_t swtch;
@@ -913,12 +915,12 @@ PACK(typedef struct t_CustomFnData { // Function Switches data
int16_t val;
uint8_t mode;
uint8_t param;
int16_t spare2;
CFN_SPARE_TYPE spare2;
}) all;
PACK(struct {
int32_t val1;
int16_t val2;
CFN_SPARE_TYPE val2;
}) clear;
});
uint8_t active;
@@ -1030,8 +1032,8 @@ enum TelemetrySource {
TELEM_RESERVE4,
TELEM_RESERVE5,
#endif
TELEM_TM1,
TELEM_TM2,
TELEM_TIMER1,
TELEM_TIMER2,
#if defined(CPUARM)
TELEM_SWR,
#endif
@@ -1115,7 +1117,7 @@ enum TelemetrySource {
#if defined(FRSKY)
TELEM_DISPLAY_MAX = TELEM_MAX_POWER,
#else
TELEM_DISPLAY_MAX = TELEM_TM2, // because used also in PlayValue
TELEM_DISPLAY_MAX = TELEM_TIMER2, // because used also in PlayValue
#endif
TELEM_STATUS_MAX = TELEM_GPS_TIME,
TELEM_FIRST_STREAMED_VALUE = TELEM_RSSI_TX,
@@ -1145,7 +1147,7 @@ enum VarioSource {
#elif defined(MAVLINK)
#define NUM_TELEMETRY 4
#else
#define NUM_TELEMETRY TELEM_TM2
#define NUM_TELEMETRY TELEM_TIMER2
#endif
PACK(typedef struct t_FrSkyBarData {
@@ -1313,7 +1315,7 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data
#endif
#if defined(CPUARM)
PACK(typedef struct t_PhaseData {
PACK(typedef struct t_FlightModeData {
TRIMS_ARRAY;
int8_t swtch; // swtch of phase[0] is not used
char name[LEN_FP_NAME];
@@ -1321,9 +1323,9 @@ PACK(typedef struct t_PhaseData {
uint8_t fadeOut;
ROTARY_ENCODER_ARRAY;
PHASE_GVARS_DATA;
}) PhaseData;
}) FlightModeData;
#else
PACK(typedef struct t_PhaseData {
PACK(typedef struct t_FlightModeData {
TRIMS_ARRAY;
int8_t swtch; // swtch of phase[0] is not used
char name[LEN_FP_NAME];
@@ -1331,7 +1333,7 @@ PACK(typedef struct t_PhaseData {
uint8_t fadeOut:4;
ROTARY_ENCODER_ARRAY;
PHASE_GVARS_DATA;
}) PhaseData;
}) FlightModeData;
#endif
enum SwitchSources {
@@ -1728,7 +1730,7 @@ PACK(typedef struct t_ModelData {
LogicalSwitchData logicalSw[NUM_LOGICAL_SWITCH];
CustomFnData funcSw[NUM_CFN];
SwashRingData swashR;
PhaseData phaseData[MAX_FLIGHT_MODES];
FlightModeData flightModeData[MAX_FLIGHT_MODES];
AVR_FIELD(int8_t ppmFrameLength) // 0=22.5ms (10ms-30ms) 0.5ms increments
uint8_t thrTraceSrc;
+42 -33
View File
@@ -261,9 +261,9 @@ void per10ms()
heartbeat |= HEART_TIMER_10MS;
}
PhaseData *phaseAddress(uint8_t idx)
FlightModeData *flightModeAddress(uint8_t idx)
{
return &g_model.phaseData[idx];
return &g_model.flightModeData[idx];
}
ExpoData *expoAddress(uint8_t idx )
@@ -426,8 +426,8 @@ void modelDefault(uint8_t id)
applyDefaultTemplate();
#if defined(LUA)
if (isFileAvailable(TEMPLATES_PATH "/" WIZARD_NAME)) {
f_chdir(TEMPLATES_PATH);
if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) {
f_chdir(WIZARD_PATH);
luaExec(WIZARD_NAME);
}
#endif
@@ -492,10 +492,10 @@ int8_t getMovedSource(GET_MOVED_SOURCE_PARAMS)
#endif
#if defined(FLIGHT_MODES)
uint8_t getFlightPhase()
uint8_t getFlightMode()
{
for (uint8_t i=1; i<MAX_FLIGHT_MODES; i++) {
PhaseData *phase = &g_model.phaseData[i];
FlightModeData *phase = &g_model.flightModeData[i];
if (phase->swtch && getSwitch(phase->swtch)) {
return i;
}
@@ -506,7 +506,7 @@ uint8_t getFlightPhase()
trim_t getRawTrimValue(uint8_t phase, uint8_t idx)
{
PhaseData *p = phaseAddress(phase);
FlightModeData *p = flightModeAddress(phase);
#if defined(PCBSTD)
return (((trim_t)p->trim[idx]) << 2) + ((p->trim_ext >> (2*idx)) & 0x03);
#else
@@ -546,7 +546,7 @@ void setTrimValue(uint8_t phase, uint8_t idx, int trim)
{
#if defined(PCBTARANIS)
for (uint8_t i=0; i<MAX_FLIGHT_MODES; i++) {
trim_t & v = phaseAddress(phase)->trim[idx];
trim_t & v = flightModeAddress(phase)->trim[idx];
if (v.mode == TRIM_MODE_NONE)
return;
unsigned int p = v.mode >> 1;
@@ -563,12 +563,12 @@ void setTrimValue(uint8_t phase, uint8_t idx, int trim)
}
}
#elif defined(PCBSTD)
PhaseData *p = phaseAddress(phase);
FlightModeData *p = flightModeAddress(phase);
p->trim[idx] = (int8_t)(trim >> 2);
idx <<= 1;
p->trim_ext = (p->trim_ext & ~(0x03 << idx)) + (((trim & 0x03) << idx));
#else
PhaseData *p = phaseAddress(phase);
FlightModeData *p = flightModeAddress(phase);
p->trim[idx] = trim;
#endif
eeDirty(EE_MODEL);
@@ -592,10 +592,10 @@ uint8_t getTrimFlightPhase(uint8_t phase, uint8_t idx)
#if defined(ROTARY_ENCODERS)
uint8_t getRotaryEncoderFlightPhase(uint8_t idx)
{
uint8_t phase = s_current_mixer_flight_mode;
uint8_t phase = mixerCurrentFlightMode;
for (uint8_t i=0; i<MAX_FLIGHT_MODES; i++) {
if (phase == 0) return 0;
int16_t value = phaseAddress(phase)->rotaryEncoders[idx];
int16_t value = flightModeAddress(phase)->rotaryEncoders[idx];
if (value <= ROTARY_ENCODER_MAX) return phase;
uint8_t result = value-ROTARY_ENCODER_MAX-1;
if (result >= phase) result++;
@@ -606,13 +606,13 @@ uint8_t getRotaryEncoderFlightPhase(uint8_t idx)
int16_t getRotaryEncoder(uint8_t idx)
{
return phaseAddress(getRotaryEncoderFlightPhase(idx))->rotaryEncoders[idx];
return flightModeAddress(getRotaryEncoderFlightPhase(idx))->rotaryEncoders[idx];
}
void incRotaryEncoder(uint8_t idx, int8_t inc)
{
g_rotenc[idx] += inc;
int16_t *value = &(phaseAddress(getRotaryEncoderFlightPhase(idx))->rotaryEncoders[idx]);
int16_t *value = &(flightModeAddress(getRotaryEncoderFlightPhase(idx))->rotaryEncoders[idx]);
*value = limit((int16_t)-1024, (int16_t)(*value + (inc * 8)), (int16_t)+1024);
eeDirty(EE_MODEL);
}
@@ -731,6 +731,9 @@ ls_telemetry_value_t maxTelemValue(uint8_t channel)
#if defined(CPUARM)
case TELEM_TX_TIME:
return 24*60-1;
case TELEM_TIMER1:
case TELEM_TIMER2:
return 60*60;
#endif
case TELEM_FUEL:
#if defined(CPUARM)
@@ -783,8 +786,8 @@ getvalue_t convert8bitsTelemValue(uint8_t channel, ls_telemetry_value_t value)
{
getvalue_t result;
switch (channel) {
case TELEM_TM1:
case TELEM_TM2:
case TELEM_TIMER1:
case TELEM_TIMER2:
result = value * 5;
break;
#if defined(FRSKY)
@@ -1219,13 +1222,13 @@ uint8_t checkTrim(uint8_t event)
#if defined(PCBSTD)
phase = 0;
#else
phase = getGVarFlightPhase(s_current_mixer_flight_mode, trimGvar[idx]);
phase = getGVarFlightPhase(mixerCurrentFlightMode, trimGvar[idx]);
#endif
before = GVAR_VALUE(trimGvar[idx], phase);
thro = false;
}
else {
phase = getTrimFlightPhase(s_current_mixer_flight_mode, idx);
phase = getTrimFlightPhase(mixerCurrentFlightMode, idx);
#if defined(PCBTARANIS)
before = getTrimValue(phase, idx);
#else
@@ -1234,7 +1237,7 @@ uint8_t checkTrim(uint8_t event)
thro = (idx==THR_STICK && g_model.thrTrim);
}
#else
phase = getTrimFlightPhase(s_current_mixer_flight_mode, idx);
phase = getTrimFlightPhase(mixerCurrentFlightMode, idx);
#if defined(PCBTARANIS)
before = getTrimValue(phase, idx);
#else
@@ -1594,7 +1597,7 @@ uint16_t s_sum_samples_thr_10s;
FORCEINLINE void evalTrims()
{
uint8_t phase = s_current_mixer_flight_mode;
uint8_t phase = mixerCurrentFlightMode;
for (uint8_t i=0; i<NUM_STICKS; i++) {
// do trim -> throttle trim if applicable
int16_t trim = getTrimValue(phase, i);
@@ -1646,8 +1649,8 @@ PLAY_FUNCTION(playValue, uint8_t idx)
case MIXSRC_FIRST_TELEM+TELEM_TX_VOLTAGE-1:
PLAY_NUMBER(val, 1+UNIT_VOLTS, PREC1);
break;
case MIXSRC_FIRST_TELEM+TELEM_TM1-1:
case MIXSRC_FIRST_TELEM+TELEM_TM2-1:
case MIXSRC_FIRST_TELEM+TELEM_TIMER1-1:
case MIXSRC_FIRST_TELEM+TELEM_TIMER2-1:
PLAY_DURATION(val, 0);
break;
#if defined(CPUARM) && defined(FRSKY)
@@ -1915,14 +1918,14 @@ void evalFunctions()
#if defined(GVARS)
case FUNC_ADJUST_GVAR:
if (CFN_GVAR_MODE(sd) == 0) {
SET_GVAR(CFN_GVAR_INDEX(sd), CFN_PARAM(sd), s_current_mixer_flight_mode);
SET_GVAR(CFN_GVAR_INDEX(sd), CFN_PARAM(sd), mixerCurrentFlightMode);
}
else if (CFN_GVAR_MODE(sd) == 2) {
SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_PARAM(sd), s_current_mixer_flight_mode), s_current_mixer_flight_mode);
SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_PARAM(sd), mixerCurrentFlightMode), mixerCurrentFlightMode);
}
else if (CFN_GVAR_MODE(sd) == 3) {
if (!(activeFnSwitches & switch_mask)) {
SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_GVAR_INDEX(sd), getGVarFlightPhase(s_current_mixer_flight_mode, CFN_GVAR_INDEX(sd))) + (CFN_PARAM(sd) ? +1 : -1), s_current_mixer_flight_mode);
SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_GVAR_INDEX(sd), getGVarFlightPhase(mixerCurrentFlightMode, CFN_GVAR_INDEX(sd))) + (CFN_PARAM(sd) ? +1 : -1), mixerCurrentFlightMode);
}
}
else if (CFN_PARAM(sd) >= MIXSRC_TrimRud && CFN_PARAM(sd) <= MIXSRC_TrimAil) {
@@ -1932,12 +1935,12 @@ void evalFunctions()
else if (CFN_PARAM(sd) >= MIXSRC_REa && CFN_PARAM(sd) < MIXSRC_TrimRud) {
int8_t scroll = rePreviousValues[CFN_PARAM(sd)-MIXSRC_REa] - (g_rotenc[CFN_PARAM(sd)-MIXSRC_REa] / ROTARY_ENCODER_GRANULARITY);
if (scroll) {
SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_GVAR_INDEX(sd), getGVarFlightPhase(s_current_mixer_flight_mode, CFN_GVAR_INDEX(sd))) + scroll, s_current_mixer_flight_mode);
SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_GVAR_INDEX(sd), getGVarFlightPhase(mixerCurrentFlightMode, CFN_GVAR_INDEX(sd))) + scroll, mixerCurrentFlightMode);
}
}
#endif
else {
SET_GVAR(CFN_GVAR_INDEX(sd), calcRESXto100(getValue(CFN_PARAM(sd))), s_current_mixer_flight_mode);
SET_GVAR(CFN_GVAR_INDEX(sd), calcRESXto100(getValue(CFN_PARAM(sd))), mixerCurrentFlightMode);
}
break;
#endif
@@ -2020,7 +2023,7 @@ void evalFunctions()
else {
#if defined(GVARS)
if (CFN_FUNC(sd) == FUNC_PLAY_TRACK && param > 250)
param = GVAR_VALUE(param-251, getGVarFlightPhase(s_current_mixer_flight_mode, param-251));
param = GVAR_VALUE(param-251, getGVarFlightPhase(mixerCurrentFlightMode, param-251));
#endif
PUSH_CUSTOM_PROMPT(active ? param : param+1, i+1);
}
@@ -2058,8 +2061,10 @@ void evalFunctions()
#if defined(SDCARD)
case FUNC_LOGS:
newActiveFunctions |= (1 << FUNCTION_LOGS);
logDelay = CFN_PARAM(sd);
if (CFN_PARAM(sd)) {
newActiveFunctions |= (1 << FUNCTION_LOGS);
logDelay = CFN_PARAM(sd);
}
break;
#endif
@@ -3006,7 +3011,11 @@ ISR(USART0_UDRE_vect)
#endif
#endif
#define INSTANT_TRIM_MARGIN 10 /* around 1% */
#if defined(PCBTARANIS)
#define INSTANT_TRIM_MARGIN 10 /* around 1% */
#else
#define INSTANT_TRIM_MARGIN 15 /* around 1.5% */
#endif
void instantTrim()
{
@@ -3015,7 +3024,7 @@ void instantTrim()
for (uint8_t i=0; i<NUM_STICKS; i++) {
if (i!=THR_STICK) {
// don't instant trim the throttle stick
uint8_t trim_phase = getTrimFlightPhase(s_current_mixer_flight_mode, i);
uint8_t trim_phase = getTrimFlightPhase(mixerCurrentFlightMode, i);
#if defined(PCBTARANIS)
int16_t delta = calibratedStick[i];
#else
@@ -3082,7 +3091,7 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim
// reset all trims, except throttle (if throttle trim)
for (uint8_t i=0; i<NUM_STICKS; i++) {
if (i!=THR_STICK || !g_model.thrTrim) {
int16_t original_trim = getTrimValue(s_current_mixer_flight_mode, i);
int16_t original_trim = getTrimValue(mixerCurrentFlightMode, i);
for (uint8_t phase=0; phase<MAX_FLIGHT_MODES; phase++) {
#if defined(PCBTARANIS)
trim_t trim = getRawTrimValue(phase, i);
+34 -18
View File
@@ -496,14 +496,7 @@ enum PotType {
#define MAX_EXTERNAL_MODULE_CHANNELS() ((g_model.externalModule == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[1].rfProtocol] : maxChannelsModules[g_model.externalModule])
#define MAX_CHANNELS(idx) (idx==INTERNAL_MODULE ? MAX_INTERNAL_MODULE_CHANNELS() : (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS()))
#define IS_PXX_RANGE_CHECK_ENABLE() (pxxFlag[INTERNAL_MODULE] == PXX_SEND_RANGECHECK || pxxFlag[EXTERNAL_MODULE] == PXX_SEND_RANGECHECK)
#elif defined(PCBSKY9X) && defined(REVX)
#define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_PPM))
#define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_XJT)
#define IS_MODULE_DSM2(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_DSM2)
#define MAX_EXTERNAL_MODULE_CHANNELS() ((g_model.externalModule == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol] : maxChannelsModules[g_model.externalModule])
#define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS())
#define IS_PXX_RANGE_CHECK_ENABLE() (pxxFlag[EXTERNAL_MODULE] == PXX_SEND_RANGECHECK)
#elif defined(PCBSKY9X)
#elif defined(PCBSKY9X) && !defined(REVA) && !defined(REVX)
#define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || idx==EXTRA_MODULE || (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_PPM))
#define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_XJT)
#define IS_MODULE_DSM2(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_DSM2)
@@ -511,6 +504,13 @@ enum PotType {
#define MAX_EXTRA_MODULE_CHANNELS() (0) // Only PPM
#define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : (idx==EXTRA_MODULE ? MAX_EXTRA_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS()))
#define IS_PXX_RANGE_CHECK_ENABLE() (pxxFlag[EXTERNAL_MODULE] == PXX_SEND_RANGECHECK)
#else
#define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_PPM))
#define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_XJT)
#define IS_MODULE_DSM2(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_DSM2)
#define MAX_EXTERNAL_MODULE_CHANNELS() ((g_model.externalModule == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol] : maxChannelsModules[g_model.externalModule])
#define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS())
#define IS_PXX_RANGE_CHECK_ENABLE() (pxxFlag[EXTERNAL_MODULE] == PXX_SEND_RANGECHECK)
#endif
#include "lcd.h"
@@ -647,7 +647,7 @@ extern void alert(const pm_char * t, const pm_char * s MESSAGE_SOUND_ARG);
enum PerOutMode {
e_perout_mode_normal = 0,
e_perout_mode_inactive_phase = 1,
e_perout_mode_inactive_flight_mode = 1,
e_perout_mode_notrainer = 2,
e_perout_mode_notrims = 4,
e_perout_mode_nosticks = 8,
@@ -673,8 +673,9 @@ enum StartupWarningStates {
#define FORCE_INDIRECT(ptr) __asm__ __volatile__ ("" : "=e" (ptr) : "0" (ptr))
#endif
extern uint8_t s_current_mixer_flight_mode;
extern uint8_t s_last_phase;
extern uint8_t mixerCurrentFlightMode;
extern uint8_t lastFlightMode;
extern uint8_t flightModeTransitionLast;
#if defined(CPUARM)
#define bitfield_channels_t uint32_t
@@ -739,9 +740,9 @@ int8_t getMovedSwitch();
#endif
#if defined(FLIGHT_MODES)
extern uint8_t getFlightPhase();
extern uint8_t getFlightMode();
#else
#define getFlightPhase() 0
#define getFlightMode() 0
#endif
#if !defined(PCBTARANIS)
@@ -1018,6 +1019,7 @@ void generalDefault();
void modelDefault(uint8_t id);
#if defined(CPUARM)
bool isFileAvailable(const char * filename);
void checkModelIdUnique(uint8_t id);
#endif
@@ -1135,7 +1137,7 @@ extern uint16_t lightOffCounter;
extern uint8_t flashCounter;
extern uint8_t mixWarning;
PhaseData *phaseAddress(uint8_t idx);
FlightModeData *flightModeAddress(uint8_t idx);
ExpoData *expoAddress(uint8_t idx);
MixData *mixAddress(uint8_t idx);
LimitData *limitAddress(uint8_t idx);
@@ -1450,11 +1452,22 @@ enum AUDIO_SOUNDS {
SCRIPT_KILLED,
SCRIPT_LEAK
};
enum ScriptReference {
SCRIPT_MIX_FIRST,
SCRIPT_MIX_LAST=SCRIPT_MIX_FIRST+MAX_SCRIPTS-1,
SCRIPT_FUNC_FIRST,
SCRIPT_FUNC_LAST=SCRIPT_FUNC_FIRST+MAX_SCRIPTS-1,
SCRIPT_TELEMETRY_FIRST,
SCRIPT_TELEMETRY_LAST=SCRIPT_TELEMETRY_FIRST+MAX_SCRIPTS-1,
};
struct ScriptInternalData {
uint8_t reference;
uint8_t state;
int run;
uint8_t instructions;
uint8_t memory;
};
struct ScriptInputsOutputs {
uint8_t inputsCount;
ScriptInput inputs[MAX_SCRIPT_INPUTS];
uint8_t outputsCount;
@@ -1463,15 +1476,18 @@ enum AUDIO_SOUNDS {
#define LUASTATE_STANDALONE_SCRIPT_RUNNING 1
#define LUASTATE_RELOAD_MODEL_SCRIPTS 2
extern uint8_t luaState;
extern ScriptInternalData scriptInternalData[MAX_SCRIPTS];
extern uint8_t luaScriptsCount;
extern ScriptInternalData standaloneScript;
extern ScriptInternalData scriptInternalData[MAX_SCRIPTS];
extern ScriptInputsOutputs scriptInputsOutputs[MAX_SCRIPTS];
void luaInit();
void luaTask(uint8_t evt);
void luaExec(const char *filename);
void luaLoadModelScript(uint8_t index);
void luaLoadModelScripts();
void luaLoadMixScript(uint8_t index);
void luaLoadMixScripts();
#define luaGetMemUsed(idx) scriptInternalData[idx].memory
#define luaGetCpuUsed(idx) scriptInternalData[idx].instructions
bool isTelemetryScriptAvailable(uint8_t index);
#define LUA_INIT()
#define LUA_RESET() luaInit()
#define LUA_LOAD_MODEL_SCRIPTS() luaState |= LUASTATE_RELOAD_MODEL_SCRIPTS
@@ -1547,7 +1563,7 @@ uint8_t zlen(const char *str, uint8_t size);
bool zexist(const char *str, uint8_t size);
char * strcat_zchar(char * dest, char * name, uint8_t size, const char *defaultName, uint8_t defaultNameSize, uint8_t defaultIdx);
#define strcat_modelname(dest, idx) strcat_zchar(dest, modelHeaders[idx].name, LEN_MODEL_NAME, STR_MODEL, PSIZE(TR_MODEL), idx+1)
#define strcat_phasename(dest, idx) strcat_zchar(dest, g_model.phaseData[idx].name, LEN_FP_NAME, STR_FP, PSIZE(TR_FP), idx+1)
#define strcat_phasename(dest, idx) strcat_zchar(dest, g_model.flightModeData[idx].name, LEN_FP_NAME, STR_FP, PSIZE(TR_FP), idx+1)
#define ZLEN(s) zlen(s, sizeof(s))
#define ZEXIST(s) zexist(s, sizeof(s))
#endif
+2 -2
View File
@@ -56,7 +56,7 @@ void setupPulsesPPM(unsigned int port) // Don't enable interru
#if defined(PCBSKY9X)
register Pwm *pwmptr = PWM;
uint32_t pwmCh = (port == 0 ? 3 : 1);
uint32_t pwmCh = (port == EXTERNAL_MODULE ? 3 : 1);
pwmptr->PWM_CH_NUM[pwmCh].PWM_CDTYUPD = (g_model.moduleData[port].ppmDelay * 50 + 300) * 2; //Stoplen *2
if (g_model.moduleData[port].ppmPulsePol)
pwmptr->PWM_CH_NUM[pwmCh].PWM_CMR |= 0x00000200 ; // CPOL
@@ -81,7 +81,7 @@ void setupPulsesPPM(unsigned int port) // Don't enable interru
if (port == TRAINER_MODULE) {
TIM3->CCR2 = rest - 1000 ; // Update time
TIM3->CCR4 = (g_model.moduleData[port].ppmDelay*50+300)*2;
if(!g_model.moduleData[TRAINER_MODULE].ppmPulsePol)
if (!g_model.moduleData[TRAINER_MODULE].ppmPulsePol)
TIM3->CCER |= TIM_CCER_CC4P;
else
TIM3->CCER &= ~TIM_CCER_CC4P;
+5 -3
View File
@@ -46,12 +46,14 @@
#define SOUNDS_PATH_LNG_OFS (sizeof(SOUNDS_PATH)-3)
#define SYSTEM_SUBDIR "SYSTEM" // no trailing slash = important
#define BITMAPS_PATH ROOT_PATH "BMP"
#define SCRIPTS_PATH ROOT_PATH "SCRIPTS"
#define FIRMWARES_PATH ROOT_PATH "FIRMWARES"
#define EEPROMS_PATH ROOT_PATH "EEPROMS"
#define TEMPLATES_PATH ROOT_PATH "TEMPLATES"
#define SCRIPTS_PATH ROOT_PATH "SCRIPTS"
#define WIZARD_PATH SCRIPTS_PATH "/WIZARD"
#define WIZARD_NAME "wizard.lua"
#define TEMPLATES_PATH SCRIPTS_PATH "/TEMPLATES"
#define SCRIPTS_MIXES_PATH SCRIPTS_PATH "/MIXES"
#define SCRIPTS_FUNCS_PATH SCRIPTS_PATH "/FUNCTIONS"
#define MODELS_EXT ".bin"
#define LOGS_EXT ".csv"
+19 -13
View File
@@ -188,7 +188,7 @@ bool getLogicalSwitch(uint8_t idx)
#endif
if (ls->func == LS_FUNC_NONE || (s && !getSwitch(s))) {
LS_LAST_VALUE(s_current_mixer_flight_mode, idx) = CS_LAST_VALUE_INIT;
LS_LAST_VALUE(mixerCurrentFlightMode, idx) = CS_LAST_VALUE_INIT;
result = false;
}
else if ((s=lswFamily(ls->func)) == LS_FAMILY_BOOL) {
@@ -208,14 +208,14 @@ bool getLogicalSwitch(uint8_t idx)
}
}
else if (s == LS_FAMILY_TIMER) {
result = (LS_LAST_VALUE(s_current_mixer_flight_mode, idx) <= 0);
result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0);
}
else if (s == LS_FAMILY_STICKY) {
result = (LS_LAST_VALUE(s_current_mixer_flight_mode, idx) & (1<<0));
result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0));
}
#if defined(CPUARM)
else if (s == LS_FAMILY_STAY) {
result = (LS_LAST_VALUE(s_current_mixer_flight_mode, idx) & (1<<0));
result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0));
}
#endif
else {
@@ -246,6 +246,7 @@ bool getLogicalSwitch(uint8_t idx)
y = convertLswTelemValue(ls);
#if defined(GAUGES)
// Fill the telemetry bars threshold array
if (s == LS_FAMILY_OFS) {
uint8_t idx = v1-MIXSRC_FIRST_TELEM+1-TELEM_ALT;
@@ -253,6 +254,8 @@ bool getLogicalSwitch(uint8_t idx)
FILL_THRESHOLD(idx, ls->v2);
}
}
#endif
}
else if (v1 >= MIXSRC_GVAR1) {
y = ls->v2;
@@ -300,10 +303,10 @@ bool getLogicalSwitch(uint8_t idx)
break;
default:
{
if (LS_LAST_VALUE(s_current_mixer_flight_mode, idx) == CS_LAST_VALUE_INIT) {
LS_LAST_VALUE(s_current_mixer_flight_mode, idx) = x;
if (LS_LAST_VALUE(mixerCurrentFlightMode, idx) == CS_LAST_VALUE_INIT) {
LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x;
}
int16_t diff = x - LS_LAST_VALUE(s_current_mixer_flight_mode, idx);
int16_t diff = x - LS_LAST_VALUE(mixerCurrentFlightMode, idx);
bool update = false;
if (ls->func == LS_FUNC_DIFFEGREATER) {
if (y >= 0) {
@@ -321,7 +324,7 @@ bool getLogicalSwitch(uint8_t idx)
result = (abs(diff) >= y);
}
if (result || update) {
LS_LAST_VALUE(s_current_mixer_flight_mode, idx) = x;
LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x;
}
break;
}
@@ -331,7 +334,7 @@ bool getLogicalSwitch(uint8_t idx)
#if defined(CPUARM)
if (ls->delay || ls->duration) {
LogicalSwitchContext &context = lswFm[s_current_mixer_flight_mode].lsw[idx];
LogicalSwitchContext &context = lswFm[mixerCurrentFlightMode].lsw[idx];
if (result) {
if (context.timerState == SWITCH_START) {
// set delay timer
@@ -432,13 +435,16 @@ bool getSwitch(int8_t swtch)
#if defined(CPUARM) && defined(FLIGHT_MODES)
else if (cs_idx >= SWSRC_FIRST_FLIGHT_MODE) {
uint8_t idx = cs_idx - SWSRC_FIRST_FLIGHT_MODE;
result = (idx == s_current_mixer_flight_mode);
if (flags & GETSWITCH_MIDPOS_DELAY)
result = (idx == flightModeTransitionLast);
else
result = (idx == mixerCurrentFlightMode);
}
#endif
else {
cs_idx -= SWSRC_FIRST_LOGICAL_SWITCH;
#if defined(CPUARM)
result = lswFm[s_current_mixer_flight_mode].lsw[cs_idx].state;
result = lswFm[mixerCurrentFlightMode].lsw[cs_idx].state;
#else
GETSWITCH_RECURSIVE_TYPE mask = ((GETSWITCH_RECURSIVE_TYPE)1 << cs_idx);
if (s_last_switch_used & mask) {
@@ -462,12 +468,12 @@ bool getSwitch(int8_t swtch)
#if defined(CPUARM)
/**
@brief Calculates new state of logical switches for s_current_mixer_flight_mode
@brief Calculates new state of logical switches for mixerCurrentFlightMode
*/
void evalLogicalSwitches(bool isCurrentPhase)
{
for (unsigned int idx=0; idx<NUM_LOGICAL_SWITCH; idx++) {
LogicalSwitchContext &context = lswFm[s_current_mixer_flight_mode].lsw[idx];
LogicalSwitchContext &context = lswFm[mixerCurrentFlightMode].lsw[idx];
bool result = getLogicalSwitch(idx);
if (isCurrentPhase) {
if (result) {
+7 -10
View File
@@ -191,17 +191,14 @@ extern uint32_t readTrims();
#define DBLKEYS_PRESSED_LFT_DWN(i) ((in & (0x40 + 0x08)) == (0x40 + 0x08))
// Pulses driver
#define init_no_pulses(port) init_main_ppm(3000, 0)
#define disable_no_pulses(port) disable_ppm(0)
void init_main_ppm(uint32_t period, uint32_t out_enable);
#define init_ppm(port) init_main_ppm(3000, 1)
void init_no_pulses(uint32_t port);
void disable_no_pulses(uint32_t port);
void init_ppm(uint32_t port);
void disable_ppm(uint32_t port);
void init_ssc();
void disable_ssc();
#define init_pxx(port) init_main_ppm(5000, 0); init_ssc()
#define disable_pxx(port) disable_ssc()
#define init_dsm2(port) init_main_ppm(5000, 0); init_ssc()
#define disable_dsm2(port) disable_ssc()
void init_pxx(uint32_t port);
void disable_pxx(uint32_t port);
void init_dsm2(uint32_t port);
void disable_dsm2(uint32_t port);
// SD driver
#if defined(SIMU)
+113 -33
View File
@@ -43,46 +43,53 @@ extern uint8_t *pxxStreamPtr[NUM_MODULES]; // TODO not here, duplicated
extern uint8_t dsm2Stream[64]; // Likely more than we need
extern uint8_t *dsm2StreamPtr;
void module_output_active()
{
register Pio *pioptr ;
pioptr = PIOA ;
pioptr->PIO_ABCDSR[0] &= ~PIO_PA17 ; // Peripheral C
pioptr->PIO_ABCDSR[1] |= PIO_PA17 ; // Peripheral C
pioptr->PIO_PDR = PIO_PA17 ; // Disable bit A17 Assign to peripheral
pioptr->PIO_MDER = PIO_PA17 ; // Open Drain O/p in A17
// pioptr->PIO_MDDR = PIO_PA17 ; // Push Pull O/p in A17
pioptr->PIO_PUER = PIO_PA17 ; // With pull up
}
void init_main_ppm(uint32_t period, uint32_t out_enable)
{
register Pio *pioptr ;
register Pwm *pwmptr ;
setupPulsesPPM(0) ;
setupPulsesPPM(EXTERNAL_MODULE) ;
if ( out_enable )
{
pioptr = PIOA ;
pioptr->PIO_ABCDSR[0] &= ~PIO_PA17 ; // Peripheral C
pioptr->PIO_ABCDSR[1] |= PIO_PA17 ; // Peripheral C
pioptr->PIO_PDR = PIO_PA17 ; // Disable bit A17 Assign to peripheral
if (out_enable) {
module_output_active();
}
pwmptr = PWM ;
// PWM3 for PPM output
pwmptr->PWM_CH_NUM[3].PWM_CMR = 0x0000000B ; // CLKA
if (g_model.moduleData[0].ppmPulsePol)
if (g_model.moduleData[EXTERNAL_MODULE].ppmPulsePol)
pwmptr->PWM_CH_NUM[3].PWM_CMR |= 0x00000200 ; // CPOL
pwmptr->PWM_CH_NUM[3].PWM_CPDR = period ; // Period in half uS
pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = period ; // Period in half uS
pwmptr->PWM_CH_NUM[3].PWM_CDTY = g_model.moduleData[0].ppmDelay*100+600; // Duty in half uS
pwmptr->PWM_CH_NUM[3].PWM_CDTYUPD = g_model.moduleData[0].ppmDelay*100+600; // Duty in half uS
pwmptr->PWM_CH_NUM[3].PWM_CDTY = g_model.moduleData[EXTERNAL_MODULE].ppmDelay*100+600; // Duty in half uS
pwmptr->PWM_CH_NUM[3].PWM_CDTYUPD = g_model.moduleData[EXTERNAL_MODULE].ppmDelay*100+600; // Duty in half uS
pwmptr->PWM_ENA = PWM_ENA_CHID3 ; // Enable channel 3
pwmptr->PWM_IER1 = PWM_IER1_CHID3 ;
#if !defined(REVA)
configure_pins( PIO_PC15, PIN_PERIPHERAL | PIN_INPUT | PIN_PER_B | PIN_PORTC | PIN_NO_PULLUP ) ;
#endif
#if !defined(REVA)
#if !defined(REVA) && !defined(REVX)
// PWM1 for PPM2
configure_pins(PIO_PC15, PIN_PERIPHERAL | PIN_INPUT | PIN_PER_B | PIN_PORTC | PIN_NO_PULLUP ) ;
pwmptr->PWM_CH_NUM[1].PWM_CMR = 0x0000000B ; // CLKB
if (g_model.moduleData[0].ppmPulsePol)
if (g_model.moduleData[EXTRA_MODULE].ppmPulsePol)
pwmptr->PWM_CH_NUM[1].PWM_CMR |= 0x00000200 ; // CPOL
pwmptr->PWM_CH_NUM[1].PWM_CPDR = period ; // Period
pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = period ; // Period
pwmptr->PWM_CH_NUM[1].PWM_CDTY = g_model.moduleData[0].ppmDelay*100+600 ; // Duty
pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = g_model.moduleData[0].ppmDelay*100+600 ; // Duty
pwmptr->PWM_CH_NUM[1].PWM_CDTY = g_model.moduleData[EXTRA_MODULE].ppmDelay*100+600 ; // Duty
pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = g_model.moduleData[EXTRA_MODULE].ppmDelay*100+600 ; // Duty
pwmptr->PWM_ENA = PWM_ENA_CHID1 ; // Enable channel 1
#endif
@@ -90,21 +97,52 @@ void init_main_ppm(uint32_t period, uint32_t out_enable)
NVIC_EnableIRQ(PWM_IRQn) ;
}
void init_no_pulses(uint32_t port)
{
if (port == EXTERNAL_MODULE) {
init_main_ppm(3000, 0);
}
else {
// TODO
}
}
void disable_no_pulses(uint32_t port)
{
if (port == EXTERNAL_MODULE) {
disable_ppm(0);
}
else {
// TODO
}
}
void init_ppm(uint32_t port)
{
if (port == EXTERNAL_MODULE) {
init_main_ppm(3000, 1);
}
else {
// TODO
}
}
void disable_ppm(uint32_t port)
{
register Pio *pioptr ;
if (port == 0) {
if (port == EXTERNAL_MODULE) {
pioptr = PIOA ;
pioptr->PIO_PER = PIO_PA17 ; // Assign A17 to PIO
PWM->PWM_IDR1 = PWM_IDR1_CHID3 ;
}
else {
#if !defined(REVA) && !defined(REVX)
pioptr = PIOC ;
pioptr->PIO_PER = PIO_PC17 ; // Assign A17 to PIO
PWM->PWM_IDR1 = PWM_IDR1_CHID1 ;
NVIC_DisableIRQ(PWM_IRQn) ;
#endif
}
}
@@ -138,6 +176,48 @@ void disable_ssc()
sscptr->SSC_CR = SSC_CR_TXDIS ;
}
void init_pxx(uint32_t port)
{
if (port == EXTERNAL_MODULE) {
init_main_ppm(5000, 0);
init_ssc();
}
else {
// TODO
}
}
void disable_pxx(uint32_t port)
{
if (port == EXTERNAL_MODULE) {
disable_ssc();
}
else {
// TODO
}
}
void init_dsm2(uint32_t port)
{
if (port == EXTERNAL_MODULE) {
init_main_ppm(5000, 0);
init_ssc();
}
else {
// TODO
}
}
void disable_dsm2(uint32_t port)
{
if (port == EXTERNAL_MODULE) {
disable_ssc();
}
else {
// TODO
}
}
#if !defined(SIMU)
extern "C" void PWM_IRQHandler(void)
{
@@ -149,8 +229,8 @@ extern "C" void PWM_IRQHandler(void)
pwmptr = PWM;
reason = pwmptr->PWM_ISR1 ;
if (reason & PWM_ISR1_CHID3) {
switch (s_current_protocol[0]) // Use the current, don't switch until set_up_pulses
{
// Use the current protocol, don't switch until set_up_pulses
switch (s_current_protocol[EXTERNAL_MODULE]) {
case PROTO_PXX:
// Alternate periods of 15.5mS and 2.5 mS
period = pwmptr->PWM_CH_NUM[3].PWM_CPDR;
@@ -162,13 +242,13 @@ extern "C" void PWM_IRQHandler(void)
}
pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = period; // Period in half uS
if (period != 5000) { // 2.5 mS
setupPulses(0);
setupPulses(EXTERNAL_MODULE);
}
else {
// Kick off serial output here
sscptr = SSC;
sscptr->SSC_TPR = CONVERT_PTR_UINT(pxxStream[0]);
sscptr->SSC_TCR = (uint8_t *)pxxStreamPtr[0] - (uint8_t *)pxxStream[0];
sscptr->SSC_TPR = CONVERT_PTR_UINT(pxxStream[EXTERNAL_MODULE]);
sscptr->SSC_TCR = (uint8_t *)pxxStreamPtr[EXTERNAL_MODULE] - (uint8_t *)pxxStream[EXTERNAL_MODULE];
sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers
}
break;
@@ -198,10 +278,10 @@ extern "C" void PWM_IRQHandler(void)
break;
default:
pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = ppmStream[0][ppmStreamIndex[0]++]; // Period in half uS
if (ppmStream[0][ppmStreamIndex[0]] == 0) {
ppmStreamIndex[0] = 0;
setupPulses(0);
pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = ppmStream[EXTERNAL_MODULE][ppmStreamIndex[EXTERNAL_MODULE]++]; // Period in half uS
if (ppmStream[EXTERNAL_MODULE][ppmStreamIndex[EXTERNAL_MODULE]] == 0) {
ppmStreamIndex[EXTERNAL_MODULE] = 0;
setupPulses(EXTERNAL_MODULE);
}
break;
@@ -209,10 +289,10 @@ extern "C" void PWM_IRQHandler(void)
}
if (reason & PWM_ISR1_CHID1) {
pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = ppmStream[1][ppmStreamIndex[1]++] ; // Period in half uS
if (ppmStream[1][ppmStreamIndex[1]] == 0) {
ppmStreamIndex[1] = 0;
setupPulsesPPM(1);
pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = ppmStream[EXTRA_MODULE][ppmStreamIndex[EXTRA_MODULE]++] ; // Period in half uS
if (ppmStream[EXTRA_MODULE][ppmStreamIndex[EXTRA_MODULE]] == 0) {
ppmStreamIndex[EXTRA_MODULE] = 0;
setupPulsesPPM(EXTRA_MODULE);
}
}
}
@@ -1961,7 +1961,7 @@ void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev)
if(pdev->cfg.low_power)
{
/* un-gate USB Core clock */
power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL);
power.d32 = USB_OTG_READ_REG32(pdev->regs.PCGCCTL);
power.b.gatehclk = 0;
power.b.stoppclk = 0;
USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32);
@@ -1995,7 +1995,7 @@ void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev)
if(dsts.b.suspsts == 1)
{
/* un-gate USB Core clock */
power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL);
power.d32 = USB_OTG_READ_REG32(pdev->regs.PCGCCTL);
power.b.gatehclk = 0;
power.b.stoppclk = 0;
USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32);
@@ -358,7 +358,7 @@ static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev)
if(pdev->cfg.low_power)
{
/* un-gate USB Core clock */
power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL);
power.d32 = USB_OTG_READ_REG32(pdev->regs.PCGCCTL);
power.b.gatehclk = 0;
power.b.stoppclk = 0;
USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32);
+1 -1
View File
@@ -253,7 +253,7 @@ void hapticOff(void);
#if defined(REVPLUS)
void hapticOn(uint32_t pwmPercent);
#else
void hapticOn();
void hapticOn(void);
#define HAPTIC_ON() hapticOn()
#endif
+23 -22
View File
@@ -137,6 +137,29 @@ static void LCD_BL_Config()
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOBL, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
#if defined(REVPLUS)
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_BL|GPIO_Pin_BLW;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOBL, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOBL, GPIO_PinSource_BL, Pin_BL_AF);
GPIO_PinAFConfig(GPIOBL, GPIO_PinSource_BLW, Pin_BL_AF);
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN ; // Enable clock
TIM4->ARR = 100 ;
TIM4->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 10000 - 1;
TIM4->CCMR1 = TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 ; // PWM
TIM4->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 ; // PWM
TIM4->CCER = TIM_CCER_CC4E | TIM_CCER_CC2E ;
TIM4->CCR2 = 0 ;
TIM4->CCR4 = 0 ;
TIM4->EGR = 0 ;
TIM4->CR1 = TIM_CR1_CEN ; // Counter enable
#else
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_BL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
@@ -145,28 +168,6 @@ static void LCD_BL_Config()
GPIO_Init(GPIOBL, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOBL, GPIO_PinSource_BL, Pin_BL_AF);
#if defined(REVPLUS)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_BLW;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOBL, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOBL, GPIO_PinSource_BLW, Pin_BLW_AF);
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN ; // Enable clock
TIM4->ARR = 100 ;
TIM4->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 10000 - 1;
TIM4->CCMR1 = TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 ; // PWM
TIM4->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 ; // PWM
TIM4->CCER = TIM_CCER_CC4E | TIM_CCER_CC2E ;
int BacklightBrightness = 0 ;
TIM4->CCR2 = BacklightBrightness ;
TIM4->CCR4 = BacklightBrightness ;
TIM4->EGR = 0 ;
TIM4->CR1 = TIM_CR1_CEN ; // Counter enable
#else
RCC->APB2ENR |= RCC_APB2ENR_TIM10EN ; // Enable clock
TIM10->ARR = 100 ;
TIM10->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 10000 - 1;
@@ -457,7 +457,7 @@ const FATDirEntry_t g_DIRroot[16] =
{
{ 'E', 'E', 'P', 'R', 'O', 'M', ' ', ' '},
{ 'B', 'I', 'N'},
0x24, // Archive, hidden, system
0x20, // Archive
0x00,
0x3E,
0xA301,
@@ -472,7 +472,7 @@ const FATDirEntry_t g_DIRroot[16] =
{
{ 'F', 'I', 'R', 'M', 'W', 'A', 'R', 'E'},
{ 'B', 'I', 'N'},
0x24, // Archive, hidden, system
0x20, // Archive
0x00,
0x3E,
0xA301,
+3
View File
@@ -556,6 +556,9 @@ void telemetryReset()
frskyData.hub.baroAltitude_bp = 50;
frskyData.hub.minAltitude = 10;
frskyData.hub.maxAltitude = 500;
#if defined(CPUARM)
frskyData.hub.baroAltitude = 340*100; //in cm
#endif
frskyData.hub.accelY = 100;
frskyData.hub.temperature1 = -30;
+9 -3
View File
@@ -249,8 +249,14 @@
#define TR_ADJUST_GVAR "[AdjustGV]\0"
#endif
#ifdef DEBUG
#define TR_CFN_TEST "Test\0 "
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Lua Script "
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0 "
#else
#define TR_CFN_TEST
#endif
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[rezerva]\0 "
#if defined(CPUARM)
#define TR_VFSWFUNC "Zámek \0 ""Trenér \0 ""Insta-Trim\0""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Hlasitost\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Podsvětlení" TR_CFN_TEST
#define TR_VFSWFUNC "Zámek \0 ""Trenér \0 ""Insta-Trim\0""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Hlasitost\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Podsvětlení" TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Zámek \0 ""Trenér \0 ""Insta-Trim\0""Reset\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Podsvětlení" TR_CFN_TEST
#else
+8 -2
View File
@@ -249,7 +249,13 @@
#define TR_ADJUST_GVAR "[AdjustGV]"
#endif
#ifdef DEBUG
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Lua Script"
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0"
#else
#define TR_CFN_TEST
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[Reserve]\0"
#if defined(CPUARM)
#define TR_VFSWFUNC "Sicher\0 ""Lehrer \0 ""Inst. Trim""Rücksetz.\0""Setze \0 " TR_ADJUST_GVAR "Lautstr.\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "LCD Licht\0" TR_CFN_TEST
#define TR_VFSWFUNC "Sicher\0 ""Lehrer \0 ""Inst. Trim""Rücksetz.\0""Setze \0 " TR_ADJUST_GVAR "Lautstr.\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "LCD Licht\0" TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Sicher\0 ""Lehrer \0 ""Inst. Trim""Rücksetz.\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "LCD Licht\0" TR_CFN_TEST
#else
+9 -3
View File
@@ -249,7 +249,13 @@
#define TR_ADJUST_GVAR "[AdjustGV]"
#endif
#ifdef DEBUG
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Lua Script"
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0"
#else
#define TR_CFN_TEST
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[reserve]\0"
#if defined(CPUARM)
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0" TR_CFN_TEST
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0" TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim""Reset\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0" TR_CFN_TEST
#else
@@ -281,7 +287,7 @@
#define TR_FSW_RESET_ROTENC
#endif
#define TR_VFSWRESET TR("Tmr1""Tmr2""All\0" TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, "Timer 1\0 ""Timer 2\0 ""All\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC)
#define TR_VFSWRESET TR("Tmr1""Tmr2""All\0" TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, "Timer 1\0 ""Timer 2\0 ""Flight\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC)
#define LEN_FUNCSOUNDS TR("\004", "\006")
#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Wrn1""Wrn2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Warn1 ""Warn2 ""Cheep ""Ratata""Tick ""Siren ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk")
+11 -5
View File
@@ -243,13 +243,19 @@
#define TR_SDCLOGS "[SD Logs]\0"
#endif
#ifdef GVARS
#define TR_ADJUST_GVAR "Ajuste\0 "
#if defined(GVARS)
#define TR_ADJUST_GVAR "Ajuste\0 "
#else
#define TR_ADJUST_GVAR "[AdjustGV]"
#define TR_ADJUST_GVAR "[AdjustGV]"
#endif
#ifdef DEBUG
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Lua Script"
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0"
#else
#define TR_CFN_TEST
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[reserve]\0"
#if defined(CPUARM)
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volumen\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_CFN_TEST
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volumen\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Inst. Trim""Reset\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_CFN_TEST
#else
+8 -2
View File
@@ -249,7 +249,13 @@
#define TR_ADJUST_GVAR "[AdjustGV]"
#endif
#ifdef DEBUG
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Lua Script"
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0"
#else
#define TR_CFN_TEST
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[reserve]\0"
#if defined(CPUARM)
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0" TR_CFN_TEST
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0" TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim""Reset\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0" TR_CFN_TEST
#else
+8 -2
View File
@@ -249,7 +249,13 @@
#define TR_ADJUST_GVAR "[AjusteGV]\0 "
#endif
#ifdef DEBUG
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Script Lua\0 "
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0 "
#else
#define TR_CFN_TEST
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[reserve]\0 "
#if defined(CPUARM)
#define TR_VFSWFUNC "Sécur.\0 ""Ecolage\0 ""Trim instant.""Remise à 0\0 ""Déf.\0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Rétroécl.\0 " TR_CFN_TEST
#define TR_VFSWFUNC "Sécur.\0 ""Ecolage\0 ""Trim instant.""Remise à 0\0 ""Déf.\0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Rétroécl.\0 " TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Sécur.\0 ""Ecolage\0 ""Trim instant.""Remise à 0\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Rétroécl.\0 " TR_CFN_TEST
#else
+14 -8
View File
@@ -80,10 +80,10 @@
#define TR_TRNCHN "ch1ch2ch3ch4"
#define LEN_UART3MODES "\017"
#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Debug\0 "
#define TR_UART3MODES "OFF\0 ""Replica Porta-S""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "None\0 ""Pot\0 ""Inter. Multipos"
#define TR_POTTYPES "None\0 ""Potenziometro\0 ""Inter. Multipos"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATA:""ORA :"
@@ -249,7 +249,13 @@
#define TR_ADJUST_GVAR "[RegolaVG]\0 "
#endif
#ifdef DEBUG
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Script Lua\0 "
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0 "
#else
#define TR_CFN_TEST
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[riserva] \0"
#if defined(CPUARM)
#define TR_VFSWFUNC "Blocco\0 ""Maestro \0 ""Trim Instant.""Azzera\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Retroillum.\0 " TR_CFN_TEST
#define TR_VFSWFUNC "Blocco\0 ""Maestro \0 ""Trim Instant.""Azzera\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Retroillum.\0 " TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Blocco\0 ""Maestro \0 ""Trim Instant.""Azzera\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Retroillum.\0 " TR_CFN_TEST
#else
@@ -574,12 +580,12 @@
#define TR_BLOFFBRIGHTNESS TR(INDENT"Lumin. OFF",INDENT"Luminosità OFF")
#define TR_BLCOLOR INDENT "Colore"
#define TR_SPLASHSCREEN TR("Schermo avvio", "Schermata di avvio")
#define TR_THROTTLEWARNING TR("All. Thr", INDENT "Allarme Motore")
#define TR_THROTTLEWARNING TR("All. Mot", INDENT "Allarme Motore")
#define TR_SWITCHWARNING TR("Avv. Int.", INDENT "Avviso Interr.")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Avviso Pot.")
#define TR_POTWARNING TR("Avv. Pot.", INDENT "Avviso Pot.")
#define TR_TIMEZONE "Ora locale"
#define TR_RXCHANNELORD "Ordine ch RX"
#define TR_SWITCHES_DELAY "Ritardo Inter."
#define TR_SWITCHES_DELAY "Ritardo voce FV"
#define TR_SLAVE "Allievo"
#define TR_MODESRC "Modo\006% Origine"
#define TR_MULTIPLIER "Moltiplica"
@@ -781,7 +787,7 @@
#define TR_ANTENNAPROBLEM CENTER "Problemi antenna TX!"
#define TR_MODELIDUSED TR("ID già usato","ID Modello già usato")
#define TR_MODULE INDENT "Modulo"
#define TR_TELEMETRY_TYPE "Mod. Telemetria"
#define TR_TELEMETRY_TYPE "Tipo Telemetria"
#define TR_CHANNELRANGE INDENT "Numero Canali"
#define TR_LOWALARM INDENT "Allarme Basso"
#define TR_CRITICALALARM INDENT "Allarme Critico"
+10 -4
View File
@@ -249,7 +249,13 @@
#define TR_ADJUST_GVAR "[UstawZG] "
#endif
#ifdef DEBUG
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Skrypty Lua"
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0"
#else
#define TR_CFN_TEST
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[rezerwa]\0"
#if defined(CPUARM)
#define TR_VFSWFUNC "Bezp.\0 ""Trener \0 ""Inst-Trim ""Resetuj\0 ""Ustaw\0 " TR_ADJUST_GVAR "Głośność\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Podświetl\0" TR_CFN_TEST
#define TR_VFSWFUNC "Bezp.\0 ""Trener \0 ""Inst-Trim ""Resetuj\0 ""Ustaw\0 " TR_ADJUST_GVAR "Głośność\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Podświetl\0" TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Bezp.\0 ""Trener \0 ""Inst-Trim ""Resetuj\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Podświetl\0" TR_CFN_TEST
#else
@@ -579,7 +585,7 @@
#define TR_POTWARNING TR(IF_CPUARM(IDENT) "Ostrz.Poten.", INDENT "PozycjaPotencj.")
#define TR_TIMEZONE TR("Strefa czasowa" ,"Strefa czasowa GPS")
#define TR_RXCHANNELORD TR("KolejnKan.RX", "Bazowa kolejność kanałów")
#define TR_SWITCHES_DELAY "Switches Delay"
#define TR_SWITCHES_DELAY "Opóźn.Przeł."
#define TR_SLAVE "Uczeń"
#define TR_MODESRC " Tryb\006% Źródło"
#define TR_MULTIPLIER "Połącznie"
@@ -781,7 +787,7 @@
#define TR_ANTENNAPROBLEM CENTER "Problem z anteną TX"
#define TR_MODELIDUSED TR("ID zajęte","ID modelu zajęte")
#define TR_MODULE INDENT "Moduł"
#define TR_TELEMETRY_TYPE "Telemetry Type"
#define TR_TELEMETRY_TYPE "Typ Telemetri"
#define TR_CHANNELRANGE TR(INDENT "ZakrKn",INDENT "Zakres kanału")
#define TR_LOWALARM INDENT "Alarm niski"
#define TR_CRITICALALARM INDENT "Alarm krytyczny"
+9 -3
View File
@@ -249,8 +249,14 @@
#define TR_ADJUST_GVAR "[AdjustGV]\0 "
#endif
#ifdef DEBUG
#define TR_CFN_TEST "Teste\0 "
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Lua Script\0 "
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Teste\0 "
#else
#define TR_CFN_TEST
#endif
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[reserve]\0 "
#if defined(CPUARM)
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Ajuste Rapido""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0 " TR_CFN_TEST
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Ajuste Rapido""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0 " TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Seguro\0 ""Aprendiz\0 ""Ajuste Rapido""Reset\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Backlight\0 " TR_CFN_TEST
#else
+9 -3
View File
@@ -249,7 +249,13 @@
#define TR_ADJUST_GVAR "[Just. GV]"
#endif
#ifdef DEBUG
#if defined(LUA)
#define TR_CFN_PLAY_SCRIPT "Lua Script"
#else
#define TR_CFN_PLAY_SCRIPT "[Lua]\0 "
#endif
#if defined(DEBUG)
#define TR_CFN_TEST "Test\0"
#else
#define TR_CFN_TEST
@@ -258,7 +264,7 @@
#define TR_CFN_RESERVE "[reserve]\0"
#if defined(CPUARM)
#define TR_VFSWFUNC "Säkra \0 ""Trainer\0 ""Sätt Trim\0""Nollställ\0""Sätt\0 " TR_ADJUST_GVAR "Volym\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Belysning\0" TR_CFN_TEST
#define TR_VFSWFUNC "Säkra \0 ""Trainer\0 ""Sätt Trim\0""Nollställ\0""Sätt\0 " TR_ADJUST_GVAR "Volym\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_PLAY_SCRIPT TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Belysning\0" TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Säkra \0 ""Trainer \0 ""Sätt Trim\0""Nollställ\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Belysning\0" TR_CFN_TEST
#else
@@ -836,7 +842,7 @@
// Taranis column headers
#define TR_PHASES_HEADERS { " Namn ", " Brytare ", " Rodertrim ", " Höjdrodertrim ", " Gastrim ", " Skevrodertrim ", " Tona Upp ", " Tona Ned " }
#define TR_LIMITS_HEADERS { " Namn ", " Offset ", " Min ", " Max ", " Riktning ", " PPM-centrum ", " Symmetriskt " }
#define TR_LIMITS_HEADERS { " Namn ", " Subtrim ", " Min ", " Max ", " Riktning ", " Kurva ", " PPM-center ", " Subtrim-läge " }
#define TR_CSW_HEADERS { " Funktion ", " V1 ", " V2 ", " V2 ", " OCH Brytare ", " Tidslängd ", " Fördröj " }
// About screen
+2 -2
View File
@@ -58,8 +58,8 @@ enum CzechPrompts {
CZ_PROMPT_G = CZ_PROMPT_UNITS_BASE+(UNIT_G*4),
CZ_PROMPT_LABELS_BASE = 194,
CZ_PROMPT_TIMER1 = CZ_PROMPT_LABELS_BASE+TELEM_TM1,
CZ_PROMPT_TIMER2 = CZ_PROMPT_LABELS_BASE+TELEM_TM2,
CZ_PROMPT_TIMER1 = CZ_PROMPT_LABELS_BASE+TELEM_TIMER1,
CZ_PROMPT_TIMER2 = CZ_PROMPT_LABELS_BASE+TELEM_TIMER2,
CZ_PROMPT_RSSI_TX = CZ_PROMPT_LABELS_BASE+TELEM_RSSI_TX,
CZ_PROMPT_RSSI_RX = CZ_PROMPT_LABELS_BASE+TELEM_RSSI_RX,
CZ_PROMPT_A1 = CZ_PROMPT_LABELS_BASE+TELEM_A1,
+2 -2
View File
@@ -59,8 +59,8 @@ enum GermanPrompts {
DE_PROMPT_G= DE_PROMPT_UNITS_BASE+UNIT_G,
DE_PROMPT_LABELS_BASE = 128,
DE_PROMPT_TIMER1 = DE_PROMPT_LABELS_BASE+TELEM_TM1,
DE_PROMPT_TIMER2 = DE_PROMPT_LABELS_BASE+TELEM_TM2,
DE_PROMPT_TIMER1 = DE_PROMPT_LABELS_BASE+TELEM_TIMER1,
DE_PROMPT_TIMER2 = DE_PROMPT_LABELS_BASE+TELEM_TIMER2,
DE_PROMPT_RSSI_TX = DE_PROMPT_LABELS_BASE+TELEM_RSSI_TX,
DE_PROMPT_RSSI_RX = DE_PROMPT_LABELS_BASE+TELEM_RSSI_RX,
DE_PROMPT_A1 = DE_PROMPT_LABELS_BASE+TELEM_A1,
+2 -2
View File
@@ -83,8 +83,8 @@ enum SpanishPrompts {
ES_PROMPT_G= ES_PROMPT_UNITS_BASE+UNIT_G,
ES_PROMPT_LABELS_BASE = 139,
ES_PROMPT_TIMER1 = ES_PROMPT_LABELS_BASE+TELEM_TM1,
ES_PROMPT_TIMER2 = ES_PROMPT_LABELS_BASE+TELEM_TM2,
ES_PROMPT_TIMER1 = ES_PROMPT_LABELS_BASE+TELEM_TIMER1,
ES_PROMPT_TIMER2 = ES_PROMPT_LABELS_BASE+TELEM_TIMER2,
ES_PROMPT_RSSI_TX = ES_PROMPT_LABELS_BASE+TELEM_RSSI_TX,
ES_PROMPT_RSSI_RX = ES_PROMPT_LABELS_BASE+TELEM_RSSI_RX,
ES_PROMPT_A1 = ES_PROMPT_LABELS_BASE+TELEM_A1,
+2 -2
View File
@@ -64,8 +64,8 @@ enum FrenchPrompts {
FR_PROMPT_SECONDE = FR_PROMPT_UNITS_BASE+UNIT_SECONDS,
FR_PROMPT_LABELS_BASE = 145,
FR_PROMPT_TIMER1 = FR_PROMPT_LABELS_BASE+TELEM_TM1,
FR_PROMPT_TIMER2 = FR_PROMPT_LABELS_BASE+TELEM_TM2,
FR_PROMPT_TIMER1 = FR_PROMPT_LABELS_BASE+TELEM_TIMER1,
FR_PROMPT_TIMER2 = FR_PROMPT_LABELS_BASE+TELEM_TIMER2,
FR_PROMPT_RSSI_TX = FR_PROMPT_LABELS_BASE+TELEM_RSSI_TX,
FR_PROMPT_RSSI_RX = FR_PROMPT_LABELS_BASE+TELEM_RSSI_RX,
FR_PROMPT_A1 = FR_PROMPT_LABELS_BASE+TELEM_A1,
+182
View File
@@ -0,0 +1,182 @@
/*
* Authors (alphabetical order)
* - Andre Bernet <bernet.andre@gmail.com>
* - Andreas Weitl
* - Bertrand Songis <bsongis@gmail.com>
* - Bryan J. Rentoul (Gruvin) <gruvin@gmail.com>
* - Cameron Weeks <th9xer@gmail.com>
* - Erez Raviv
* - Gabriel Birkus
* - Jean-Pierre Parisy
* - Karl Szmutny
* - Michael Blandford
* - Michal Hlavinka
* - Pat Mackenzie
* - Philip Moss
* - Rob Thomson
* - Romolo Manfredini <romolo.manfredini@gmail.com>
* - Thomas Husterer
*
* opentx is based on code named
* gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/,
* er9x by Erez Raviv: http://code.google.com/p/er9x/,
* and the original (and ongoing) project by
* Thomas Husterer, th9x: http://code.google.com/p/th9x/
*
* 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 "../opentx.h"
enum HungarianPrompts {
HU_PROMPT_NUMBERS_BASE = 0,
HU_PROMPT_ZERO = HU_PROMPT_NUMBERS_BASE+0, //02-99
HU_PROMPT_HUNDRED = HU_PROMPT_NUMBERS_BASE+100, //100,200 .. 900
HU_PROMPT_THOUSAND = HU_PROMPT_NUMBERS_BASE+109, //1000
HU_PROMPT_AND = HU_PROMPT_NUMBERS_BASE+110,
HU_PROMPT_MINUS = HU_PROMPT_NUMBERS_BASE+111,
HU_PROMPT_POINT = HU_PROMPT_NUMBERS_BASE+112,
HU_PROMPT_UNITS_BASE = 115,
HU_PROMPT_VOLTS = HU_PROMPT_UNITS_BASE+UNIT_VOLTS, //(one)volt,(two)volts
HU_PROMPT_AMPS = HU_PROMPT_UNITS_BASE+(UNIT_AMPS*2),
HU_PROMPT_METERS_PER_SECOND = HU_PROMPT_UNITS_BASE+(UNIT_METERS_PER_SECOND*2),
HU_PROMPT_SPARE1 = HU_PROMPT_UNITS_BASE+(UNIT_RAW*2),
HU_PROMPT_KMH = HU_PROMPT_UNITS_BASE+(UNIT_SPEED*2),
HU_PROMPT_METERS = HU_PROMPT_UNITS_BASE+(UNIT_DIST*2),
HU_PROMPT_DEGREES = HU_PROMPT_UNITS_BASE+(UNIT_TEMPERATURE*2),
HU_PROMPT_PERCENT = HU_PROMPT_UNITS_BASE+(UNIT_PERCENT*2),
HU_PROMPT_MILLIAMPS = HU_PROMPT_UNITS_BASE+(UNIT_MILLIAMPS*2),
HU_PROMPT_MAH = HU_PROMPT_UNITS_BASE+(UNIT_MAH*2),
HU_PROMPT_WATTS = HU_PROMPT_UNITS_BASE+(UNIT_WATTS*2),
HU_PROMPT_DB = HU_PROMPT_UNITS_BASE+(UNIT_DBM*2),
HU_PROMPT_FEET = HU_PROMPT_UNITS_BASE+(UNIT_FEET*2),
HU_PROMPT_MPH = HU_PROMPT_UNITS_BASE+(UNIT_KTS*2),
HU_PROMPT_HOURS = HU_PROMPT_UNITS_BASE+(UNIT_HOURS*2),
HU_PROMPT_MINUTES = HU_PROMPT_UNITS_BASE+(UNIT_MINUTES*2),
HU_PROMPT_SECONDS = HU_PROMPT_UNITS_BASE+(UNIT_SECONDS*2),
HU_PROMPT_RPMS = HU_PROMPT_UNITS_BASE+(UNIT_RPMS*2),
HU_PROMPT_G = HU_PROMPT_UNITS_BASE+(UNIT_G*2),
HU_PROMPT_POINT_BASE = 160, //.0 - .9
};
#if defined(VOICE)
#if defined(CPUARM)
#define HU_PUSH_UNIT_PROMPT(p, u) hu_pushUnitPrompt((p), (u), id)
#else
#define HU_PUSH_UNIT_PROMPT(p, u) pushUnitPrompt((p), (u))
#endif
I18N_PLAY_FUNCTION(hu, pushUnitPrompt, int16_t number, uint8_t unitprompt)
{
if (number == 1)
PUSH_NUMBER_PROMPT(unitprompt);
else
PUSH_NUMBER_PROMPT(unitprompt+1);
}
I18N_PLAY_FUNCTION(hu, playNumber, getvalue_t number, uint8_t unit, uint8_t att)
{
if (number < 0) {
PUSH_NUMBER_PROMPT(HU_PROMPT_MINUS);
number = -number;
}
if (unit) {
unit--;
convertUnit(number, unit);
if (IS_IMPERIAL_ENABLE()) {
if (unit == UNIT_DIST) {
unit = UNIT_FEET;
}
if (unit == UNIT_SPEED) {
unit = UNIT_KTS;
}
}
#if defined(CPUARM)
if ((att & PREC1) && (unit == UNIT_FEET || (unit == UNIT_DIST && number >= 100))) {
number = div10_and_round(number);
att -= PREC1;
}
#endif
unit++;
}
int8_t mode = MODE(att);
if (mode > 0) {
// we assume that we are PREC1
div_t qr = div(number, 10);
if (qr.rem) {
PLAY_NUMBER(qr.quot, 0, 0);
PUSH_NUMBER_PROMPT(HU_PROMPT_POINT_BASE + qr.rem);
number = -1;
}
else {
number = qr.quot;
}
}
int16_t tmp = number;
if (number >= 1000) {
PLAY_NUMBER(number / 1000, 0, 0);
PUSH_NUMBER_PROMPT(HU_PROMPT_THOUSAND);
number %= 1000;
if (number == 0)
number = -1;
}
if (number >= 100) {
PUSH_NUMBER_PROMPT(HU_PROMPT_HUNDRED + (number/100)-1);
number %= 100;
if (number == 0)
number = -1;
}
if (number >= 0) {
PUSH_NUMBER_PROMPT(HU_PROMPT_ZERO + number);
}
if (unit) {
HU_PUSH_UNIT_PROMPT(tmp, (HU_PROMPT_UNITS_BASE+((unit-1)*2)));
}
}
I18N_PLAY_FUNCTION(hu, playDuration, int seconds PLAY_DURATION_ATT)
{
if (seconds < 0) {
PUSH_NUMBER_PROMPT(HU_PROMPT_MINUS);
seconds = -seconds;
}
uint8_t tmp = seconds / 3600;
seconds %= 3600;
if (tmp > 0 || IS_PLAY_TIME()) {
PLAY_NUMBER(tmp, UNIT_HOURS+1 , 0);
}
tmp = seconds / 60;
seconds %= 60;
if (tmp > 0) {
PLAY_NUMBER(tmp, UNIT_MINUTES+1 , 0);
if (seconds > 0)
PUSH_NUMBER_PROMPT(HU_PROMPT_AND);
}
if (seconds > 0) {
PLAY_NUMBER(seconds, UNIT_SECONDS+1 , 0);
}
}
LANGUAGE_PACK_DECLARE(hu, "Hungarian");
#endif
+2 -2
View File
@@ -55,8 +55,8 @@ enum ItalianPrompts {
IT_PROMPT_KTS = IT_PROMPT_UNITS_BASE+UNIT_KTS,
IT_PROMPT_LABELS_BASE = 131,
IT_PROMPT_TIMER1 = IT_PROMPT_LABELS_BASE+TELEM_TM1,
IT_PROMPT_TIMER2 = IT_PROMPT_LABELS_BASE+TELEM_TM2,
IT_PROMPT_TIMER1 = IT_PROMPT_LABELS_BASE+TELEM_TIMER1,
IT_PROMPT_TIMER2 = IT_PROMPT_LABELS_BASE+TELEM_TIMER2,
IT_PROMPT_RSSI_TX = IT_PROMPT_LABELS_BASE+TELEM_RSSI_TX,
IT_PROMPT_RSSI_RX = IT_PROMPT_LABELS_BASE+TELEM_RSSI_RX,
IT_PROMPT_A1 = IT_PROMPT_LABELS_BASE+TELEM_A1,
+2 -2
View File
@@ -59,8 +59,8 @@ enum PolishPrompts {
PL_PROMPT_G = PL_PROMPT_UNITS_BASE+(UNIT_G*4),
PL_PROMPT_LABELS_BASE = 250,
PL_PROMPT_TIMER1 = PL_PROMPT_LABELS_BASE+TELEM_TM1,
PL_PROMPT_TIMER2 = PL_PROMPT_LABELS_BASE+TELEM_TM2,
PL_PROMPT_TIMER1 = PL_PROMPT_LABELS_BASE+TELEM_TIMER1,
PL_PROMPT_TIMER2 = PL_PROMPT_LABELS_BASE+TELEM_TIMER2,
PL_PROMPT_RSSI_TX = PL_PROMPT_LABELS_BASE+TELEM_RSSI_TX,
PL_PROMPT_RSSI_RX = PL_PROMPT_LABELS_BASE+TELEM_RSSI_RX,
PL_PROMPT_A1 = PL_PROMPT_LABELS_BASE+TELEM_A1,
+2 -2
View File
@@ -78,8 +78,8 @@ enum PortuguesePrompts {
PT_PROMPT_KTS = PT_PROMPT_UNITS_BASE+UNIT_KTS,
PT_PROMPT_LABELS_BASE = 140,
PT_PROMPT_TIMER1 = PT_PROMPT_LABELS_BASE+TELEM_TM1,
PT_PROMPT_TIMER2 = PT_PROMPT_LABELS_BASE+TELEM_TM2,
PT_PROMPT_TIMER1 = PT_PROMPT_LABELS_BASE+TELEM_TIMER1,
PT_PROMPT_TIMER2 = PT_PROMPT_LABELS_BASE+TELEM_TIMER2,
PT_PROMPT_RSSI_TX = PT_PROMPT_LABELS_BASE+TELEM_RSSI_TX,
PT_PROMPT_RSSI_RX = PT_PROMPT_LABELS_BASE+TELEM_RSSI_RX,
PT_PROMPT_A1 = PT_PROMPT_LABELS_BASE+TELEM_A1,
+2 -2
View File
@@ -73,8 +73,8 @@ enum SlovakPrompts {
SK_PROMPT_G = SK_PROMPT_UNITS_BASE+(UNIT_G*4),
SK_PROMPT_LABELS_BASE = 194,
SK_PROMPT_TIMER1 = SK_PROMPT_LABELS_BASE+TELEM_TM1,
SK_PROMPT_TIMER2 = SK_PROMPT_LABELS_BASE+TELEM_TM2,
SK_PROMPT_TIMER1 = SK_PROMPT_LABELS_BASE+TELEM_TIMER1,
SK_PROMPT_TIMER2 = SK_PROMPT_LABELS_BASE+TELEM_TIMER2,
SK_PROMPT_RSSI_TX = SK_PROMPT_LABELS_BASE+TELEM_RSSI_TX,
SK_PROMPT_RSSI_RX = SK_PROMPT_LABELS_BASE+TELEM_RSSI_RX,
SK_PROMPT_A1 = SK_PROMPT_LABELS_BASE+TELEM_A1,
-5
View File
@@ -167,8 +167,6 @@ def ttsEn():
(u"Welcome to open tea ex!", "tada", 480),
(u"twenty. seconds", "timer20", 500),
(u"thirty. seconds", "timer30", 501),
(u"10. seconds", "timer10", NO_ALTERNATE),
(u"time up!", "timerlt3", NO_ALTERNATE),
(u"A1,low", "a1_org", NO_ALTERNATE),
(u"A1,critical", "a1_red", NO_ALTERNATE),
(u"A2,low", "a2_org", NO_ALTERNATE),
@@ -265,7 +263,6 @@ def ttsFr():
(u"Bienvenue sur Open TI X!", "tada", 480),
(u"vingt secondes", "timer20", 500),
(u"trente secondes", "timer30", 501),
(u"dix secondes", "timer10", NO_ALTERNATE),
(u"A1,faible", "a1_org", NO_ALTERNATE),
(u"A1,critique", "a1_red", NO_ALTERNATE),
(u"A2,faible", "a2_org", NO_ALTERNATE),
@@ -648,8 +645,6 @@ def ttsCz():
(u"Oupn najn iks", "tada", 480),
(u"dvacet sekund", "timer20", 500),
(u"třicet sekund", "timer30", 501),
(u"deset sekund", "timer10", NO_ALTERNATE),
(u"time up!", "timerlt3", NO_ALTERNATE),
(u"A1,nízká", "a1_org", NO_ALTERNATE),
(u"A1,kritická", "a1_red", NO_ALTERNATE),
(u"A2,nízká", "a2_org", NO_ALTERNATE),