1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-18 05:45:21 +03:00

Merge branch 'master' into kilrah/ar9x

This commit is contained in:
Andre Bernet 2015-09-06 14:47:26 +02:00
commit 45801a89ea
160 changed files with 20171 additions and 19093 deletions

View file

@ -1,3 +0,0 @@
<a href="http://3drobotics.com">3D Robotics</a>
They sell the Iris+ with a modified version of OpenTX which doesn't fullfil the GPL requirements.
No donations, no thanks, we are just free staff for them...

View file

@ -8,6 +8,7 @@
<a href="http://litepilots.com">LitePilots</a> <a href="http://litepilots.com">LitePilots</a>
<a href="http://openpilot.com">David Ankers (OpenPilot)</a> <a href="http://openpilot.com">David Ankers (OpenPilot)</a>
<a href="http://3drobotics.com">3D Robotics</a> <a href="http://3drobotics.com">3D Robotics</a>
<a href="http://rcstudio.cz">RC Studio (monthly)</a>
Mario Sette Mario Sette
Felice Baratto Felice Baratto
@ -401,7 +402,6 @@ Colin Rycroft
Emanuel Stassar Emanuel Stassar
Michael Gregory Michael Gregory
Robert Russell Robert Russell
Gordon Stahl
Felix Kaiser Felix Kaiser
Joshua Bardwell Joshua Bardwell
Davd Goodall Davd Goodall
@ -599,7 +599,6 @@ Julien Gérard
Alexandre d'Alton Alexandre d'Alton
Peter Mergaerts Peter Mergaerts
Jan Houwers Jan Houwers
Gordon Stahl
Christian Grandjean Christian Grandjean
Roger Bergevin Roger Bergevin
NorthSide NorthSide
@ -802,4 +801,12 @@ Roger Keatley
Sherman Lovell Sherman Lovell
Hugh Caldwell Hugh Caldwell
JB Fisher Company JB Fisher Company
Michels Bernhard
Pietro Rossin
Carsten Wache
Brock White
Steven Poretz
David Huelster
Gordon Stahl (monthly)
John Mathison
Richard Duczmal

View file

@ -1,5 +1,5 @@
##OpenTX 2.1 Branch ##OpenTX 2.1 Branch
The ongoing development is not done in this branch. It is performed in the branch called next. The ongoing development on 2.1.x is done in this branch.
Refer to the opentx.wiki for information about setting up the tool chains for building OpenTX and OpenTX Companion as well as other development related issues. Refer to the opentx.wiki for information about setting up the tool chains for building OpenTX and OpenTX Companion as well as other development related issues.

View file

@ -1,4 +1,5 @@
<h2>Version 2.1.2 / <set date></h2> <h2>Version 2.1.2 / <set date></h2>
<ul> <ul>
<li>Fixed: Lua model scripts outputs not working in a simulator (<a href=https://github.com/opentx/opentx/issues/2684>#2684</a>)</li> <li>Fixed: Lua model scripts outputs not working in a simulator (<a href=https://github.com/opentx/opentx/issues/2684>#2684</a>)</li>
<li>Fixed a problem of Companion 2.1 trying to install into 2.0 path. <li>Fixed a problem of Companion 2.1 trying to install into 2.0 path.
@ -6,6 +7,10 @@
(<a href=https://github.com/opentx/opentx/issues/2645>#2645</a>)</li> (<a href=https://github.com/opentx/opentx/issues/2645>#2645</a>)</li>
<li>Added missing SDL libraries to MAC package (<a href=https://github.com/opentx/opentx/issues/2678>#2678</a>)</li> <li>Added missing SDL libraries to MAC package (<a href=https://github.com/opentx/opentx/issues/2678>#2678</a>)</li>
<li>Added used channels check/warning in Wizard (<a href=https://github.com/opentx/opentx/issues/2091>#2091</a>)</li> <li>Added used channels check/warning in Wizard (<a href=https://github.com/opentx/opentx/issues/2091>#2091</a>)</li>
<li>Model Print and Model Compare improvements and fixes (<a href=https://github.com/opentx/opentx/issues/2734>#2734</a>, <a href=https://github.com/opentx/opentx/issues/2737>#2737</a>, <a href=https://github.com/opentx/opentx/issues/2576>#2576</a>)</li>
<li>Negative telemetry offset value was reset when writing back to radio (<a href=https://github.com/opentx/opentx/issues/2738>#2738</a>)</li>
<li>Telemetry sensor names were not displayed (<a href=https://github.com/opentx/opentx/issues/2807>#2807</a>)</li>
<li>Mixes multiplex representation now the same as on the radio (<a href=https://github.com/opentx/opentx/issues/2808>#2808</a>)</li>
</ul> </ul>

View file

@ -6,7 +6,7 @@ SET(C9X_VERSION_REVISION "2")
SET(C9X_VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) SET(C9X_VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX})
SET(C9X_VERSION ${C9X_VERSION_MAJOR}.${C9X_VERSION_MINOR}.${C9X_VERSION_REVISION}${C9X_VERSION_SUFFIX}) SET(C9X_VERSION ${C9X_VERSION_MAJOR}.${C9X_VERSION_MINOR}.${C9X_VERSION_REVISION}${C9X_VERSION_SUFFIX})
MESSAGE(STATUS OpenTX Companion ${C9X_VERSION}) MESSAGE(STATUS "OpenTX Companion ${C9X_VERSION}")
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )

View file

@ -312,10 +312,10 @@ QString Profile::speaker() const { return _speaker; }
QString Profile::stickPotCalib() const { return _stickPotCalib; } QString Profile::stickPotCalib() const { return _stickPotCalib; }
QString Profile::timeStamp() const { return _timeStamp; } QString Profile::timeStamp() const { return _timeStamp; }
QString Profile::trainerCalib() const { return _trainerCalib; } QString Profile::trainerCalib() const { return _trainerCalib; }
int Profile::currentCalib() const { return _currentCalib; } int Profile::txCurrentCalibration() const { return _txCurrentCalibration; }
int Profile::gsStickMode() const { return _gsStickMode; } int Profile::gsStickMode() const { return _gsStickMode; }
int Profile::ppmMultiplier() const { return _ppmMultiplier; } int Profile::ppmMultiplier() const { return _ppmMultiplier; }
int Profile::vBatCalib() const { return _vBatCalib; } int Profile::txVoltageCalibration() const { return _txVoltageCalibration; }
int Profile::vBatWarn() const { return _vBatWarn; } int Profile::vBatWarn() const { return _vBatWarn; }
int Profile::vBatMin() const { return _vBatMin; } int Profile::vBatMin() const { return _vBatMin; }
int Profile::vBatMax() const { return _vBatMax; } int Profile::vBatMax() const { return _vBatMax; }
@ -342,10 +342,10 @@ void Profile::speaker (const QString x) { store(x, _speaker, "Speake
void Profile::stickPotCalib (const QString x) { store(x, _stickPotCalib, "StickPotCalib" ,"Profiles", QString("profile%1").arg(index));} void Profile::stickPotCalib (const QString x) { store(x, _stickPotCalib, "StickPotCalib" ,"Profiles", QString("profile%1").arg(index));}
void Profile::timeStamp (const QString x) { store(x, _timeStamp, "TimeStamp" ,"Profiles", QString("profile%1").arg(index));} void Profile::timeStamp (const QString x) { store(x, _timeStamp, "TimeStamp" ,"Profiles", QString("profile%1").arg(index));}
void Profile::trainerCalib (const QString x) { store(x, _trainerCalib, "TrainerCalib" ,"Profiles", QString("profile%1").arg(index));} void Profile::trainerCalib (const QString x) { store(x, _trainerCalib, "TrainerCalib" ,"Profiles", QString("profile%1").arg(index));}
void Profile::currentCalib (const int x) { store(x, _currentCalib, "currentCalib" ,"Profiles", QString("profile%1").arg(index));} void Profile::txCurrentCalibration (const int x) { store(x, _txCurrentCalibration, "currentCalib","Profiles", QString("profile%1").arg(index));}
void Profile::gsStickMode (const int x) { store(x, _gsStickMode, "GSStickMode" ,"Profiles", QString("profile%1").arg(index));} void Profile::gsStickMode (const int x) { store(x, _gsStickMode, "GSStickMode" ,"Profiles", QString("profile%1").arg(index));}
void Profile::ppmMultiplier (const int x) { store(x, _ppmMultiplier, "PPM_Multiplier" ,"Profiles", QString("profile%1").arg(index));} void Profile::ppmMultiplier (const int x) { store(x, _ppmMultiplier, "PPM_Multiplier" ,"Profiles", QString("profile%1").arg(index));}
void Profile::vBatCalib (const int x) { store(x, _vBatCalib, "VbatCalib" ,"Profiles", QString("profile%1").arg(index));} void Profile::txVoltageCalibration (const int x) { store(x, _txVoltageCalibration, "VbatCalib","Profiles", QString("profile%1").arg(index));}
void Profile::vBatWarn (const int x) { store(x, _vBatWarn, "vBatWarn" ,"Profiles", QString("profile%1").arg(index));} void Profile::vBatWarn (const int x) { store(x, _vBatWarn, "vBatWarn" ,"Profiles", QString("profile%1").arg(index));}
void Profile::vBatMin (const int x) { store(x, _vBatMin, "VbatMin" ,"Profiles", QString("profile%1").arg(index));} void Profile::vBatMin (const int x) { store(x, _vBatMin, "VbatMin" ,"Profiles", QString("profile%1").arg(index));}
void Profile::vBatMax (const int x) { store(x, _vBatMax, "VbatMax" ,"Profiles", QString("profile%1").arg(index));} void Profile::vBatMax (const int x) { store(x, _vBatMax, "VbatMax" ,"Profiles", QString("profile%1").arg(index));}
@ -378,10 +378,10 @@ Profile& Profile::operator=(const Profile& rhs)
speaker ( rhs.speaker() ); speaker ( rhs.speaker() );
stickPotCalib( rhs.stickPotCalib() ); stickPotCalib( rhs.stickPotCalib() );
trainerCalib ( rhs.trainerCalib() ); trainerCalib ( rhs.trainerCalib() );
currentCalib ( rhs.currentCalib() ); txCurrentCalibration ( rhs.txCurrentCalibration() );
gsStickMode ( rhs.gsStickMode() ); gsStickMode ( rhs.gsStickMode() );
ppmMultiplier( rhs.ppmMultiplier() ); ppmMultiplier( rhs.ppmMultiplier() );
vBatCalib ( rhs.vBatCalib() ); txVoltageCalibration ( rhs.txVoltageCalibration() );
vBatWarn ( rhs.vBatWarn() ); vBatWarn ( rhs.vBatWarn() );
vBatMin ( rhs.vBatMin() ); vBatMin ( rhs.vBatMin() );
vBatMax ( rhs.vBatMax() ); vBatMax ( rhs.vBatMax() );
@ -424,10 +424,10 @@ void Profile::initFwVariables()
_timeStamp = ""; _timeStamp = "";
_trainerCalib = ""; _trainerCalib = "";
_currentCalib = 0; _txCurrentCalibration = 0;
_gsStickMode = 0; _gsStickMode = 0;
_ppmMultiplier = 0; _ppmMultiplier = 0;
_vBatCalib = 0; _txVoltageCalibration = 0;
_vBatWarn = 0; _vBatWarn = 0;
_vBatMin = 0; _vBatMin = 0;
_vBatMax = 0; _vBatMax = 0;
@ -483,10 +483,10 @@ void Profile::flush()
getset( _stickPotCalib, "StickPotCalib" ,"" ,"Profiles", QString("profile%1").arg(index)); getset( _stickPotCalib, "StickPotCalib" ,"" ,"Profiles", QString("profile%1").arg(index));
getset( _timeStamp, "TimeStamp" ,"" ,"Profiles", QString("profile%1").arg(index)); getset( _timeStamp, "TimeStamp" ,"" ,"Profiles", QString("profile%1").arg(index));
getset( _trainerCalib, "TrainerCalib" ,"" ,"Profiles", QString("profile%1").arg(index)); getset( _trainerCalib, "TrainerCalib" ,"" ,"Profiles", QString("profile%1").arg(index));
getset( _currentCalib, "currentCalib" ,0 ,"Profiles", QString("profile%1").arg(index)); getset( _txCurrentCalibration, "currentCalib" ,0 ,"Profiles", QString("profile%1").arg(index));
getset( _gsStickMode, "GSStickMode" ,0 ,"Profiles", QString("profile%1").arg(index)); getset( _gsStickMode, "GSStickMode" ,0 ,"Profiles", QString("profile%1").arg(index));
getset( _ppmMultiplier, "PPM_Multiplier" ,0 ,"Profiles", QString("profile%1").arg(index)); getset( _ppmMultiplier, "PPM_Multiplier" ,0 ,"Profiles", QString("profile%1").arg(index));
getset( _vBatCalib, "VbatCalib" ,0 ,"Profiles", QString("profile%1").arg(index)); getset( _txVoltageCalibration, "VbatCalib" ,0 ,"Profiles", QString("profile%1").arg(index));
getset( _vBatWarn, "vBatWarn" ,0 ,"Profiles", QString("profile%1").arg(index)); getset( _vBatWarn, "vBatWarn" ,0 ,"Profiles", QString("profile%1").arg(index));
getset( _vBatMin, "VbatMin" ,0 ,"Profiles", QString("profile%1").arg(index)); getset( _vBatMin, "VbatMin" ,0 ,"Profiles", QString("profile%1").arg(index));
getset( _vBatMax, "VbatMax" ,0 ,"Profiles", QString("profile%1").arg(index)); getset( _vBatMax, "VbatMax" ,0 ,"Profiles", QString("profile%1").arg(index));

View file

@ -125,10 +125,10 @@ class Profile: protected CompStoreObj
QString _stickPotCalib; QString _stickPotCalib;
QString _timeStamp; QString _timeStamp;
QString _trainerCalib; QString _trainerCalib;
int _currentCalib; int _txCurrentCalibration;
int _gsStickMode; int _gsStickMode;
int _ppmMultiplier; int _ppmMultiplier;
int _vBatCalib; int _txVoltageCalibration;
int _vBatWarn; int _vBatWarn;
int _vBatMin; int _vBatMin;
int _vBatMax; int _vBatMax;
@ -156,10 +156,10 @@ class Profile: protected CompStoreObj
QString stickPotCalib() const; QString stickPotCalib() const;
QString timeStamp() const; QString timeStamp() const;
QString trainerCalib() const; QString trainerCalib() const;
int currentCalib() const; int txCurrentCalibration() const;
int gsStickMode() const; int gsStickMode() const;
int ppmMultiplier() const; int ppmMultiplier() const;
int vBatCalib() const; int txVoltageCalibration() const;
int vBatWarn() const; int vBatWarn() const;
int vBatMin() const; int vBatMin() const;
int vBatMax() const; int vBatMax() const;
@ -186,10 +186,10 @@ class Profile: protected CompStoreObj
void stickPotCalib (const QString); void stickPotCalib (const QString);
void timeStamp (const QString); void timeStamp (const QString);
void trainerCalib (const QString); void trainerCalib (const QString);
void currentCalib (const int); void txCurrentCalibration (const int);
void gsStickMode (const int); void gsStickMode (const int);
void ppmMultiplier (const int); void ppmMultiplier (const int);
void vBatCalib (const int); void txVoltageCalibration (const int);
void vBatWarn (const int); void vBatWarn (const int);
void vBatMin (const int); void vBatMin (const int);
void vBatMax (const int); void vBatMax (const int);

View file

@ -4,7 +4,6 @@
<file>icon.png</file> <file>icon.png</file>
<file>../../CREDITS.txt</file> <file>../../CREDITS.txt</file>
<file>../../DONATIONS.txt</file> <file>../../DONATIONS.txt</file>
<file>../../BLACKLIST.txt</file>
<file>../releasenotes.txt</file> <file>../releasenotes.txt</file>
<file>images/9xdb.png</file> <file>images/9xdb.png</file>
<file>images/9xdl.png</file> <file>images/9xdl.png</file>

View file

@ -63,12 +63,15 @@ ContributorsDialog::ContributorsDialog(QWidget * parent):
" <tr><td class=\"normal\">" + tr("Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe)") + "<br/></td></tr>" \ " <tr><td class=\"normal\">" + tr("Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe)") + "<br/></td></tr>" \
"</table>"); "</table>");
#if 0
QFile blacklist(":/BLACKLIST.txt"); QFile blacklist(":/BLACKLIST.txt");
if (blacklist.open(QIODevice::ReadOnly | QIODevice::Text)) { if (blacklist.open(QIODevice::ReadOnly | QIODevice::Text)) {
QStringList names; QStringList names;
names << blacklist.readAll(); names << blacklist.readAll();
str.append(formatTable(tr("OpenTX Blacklist"), names, 1)); str.append(formatTable(tr("OpenTX Blacklist"), names, 1));
} }
#endif
str.append("</body></html>"); str.append("</body></html>");
ui->textEditor->setHtml(str); ui->textEditor->setHtml(str);
ui->textEditor->scroll(0, 0); ui->textEditor->scroll(0, 0);

View file

@ -897,7 +897,7 @@ QString CustomFunctionData::paramToString(const ModelData * model) const
} }
else if ((func==FuncVolume)|| (func==FuncPlayValue)) { else if ((func==FuncVolume)|| (func==FuncPlayValue)) {
RawSource item(param); RawSource item(param);
return item.toString(); return item.toString(model);
} }
else if ((func==FuncPlayPrompt) || (func==FuncPlayBoth)) { else if ((func==FuncPlayPrompt) || (func==FuncPlayBoth)) {
if ( GetCurrentFirmware()->getCapability(VoicesAsNumbers)) { if ( GetCurrentFirmware()->getCapability(VoicesAsNumbers)) {
@ -1083,8 +1083,8 @@ GeneralSettings::GeneralSettings()
} }
else { else {
QString t_trainercalib=g.profile[g.id()].trainerCalib(); QString t_trainercalib=g.profile[g.id()].trainerCalib();
int8_t t_vBatCalib=(int8_t)g.profile[g.id()].vBatCalib(); int8_t t_txVoltageCalibration=(int8_t)g.profile[g.id()].txVoltageCalibration();
int8_t t_currentCalib=(int8_t)g.profile[g.id()].currentCalib(); int8_t t_txCurrentCalibration=(int8_t)g.profile[g.id()].txCurrentCalibration();
int8_t t_PPM_Multiplier=(int8_t)g.profile[g.id()].ppmMultiplier(); int8_t t_PPM_Multiplier=(int8_t)g.profile[g.id()].ppmMultiplier();
uint8_t t_stickMode=(uint8_t)g.profile[g.id()].gsStickMode(); uint8_t t_stickMode=(uint8_t)g.profile[g.id()].gsStickMode();
uint8_t t_vBatWarn=(uint8_t)g.profile[g.id()].vBatWarn(); uint8_t t_vBatWarn=(uint8_t)g.profile[g.id()].vBatWarn();
@ -1118,8 +1118,8 @@ GeneralSettings::GeneralSettings()
if (ok) if (ok)
trainer.calib[i]=byte16; trainer.calib[i]=byte16;
} }
currentCalib=t_currentCalib; txCurrentCalibration=t_txCurrentCalibration;
vBatCalib=t_vBatCalib; txVoltageCalibration=t_txVoltageCalibration;
vBatWarn=t_vBatWarn; vBatWarn=t_vBatWarn;
PPM_Multiplier=t_PPM_Multiplier; PPM_Multiplier=t_PPM_Multiplier;
stickMode = t_stickMode; stickMode = t_stickMode;
@ -1383,16 +1383,16 @@ void ModelData::clear()
moduleData[2].ppmDelay = 300; moduleData[2].ppmDelay = 300;
int board = GetEepromInterface()->getBoard(); int board = GetEepromInterface()->getBoard();
if (IS_TARANIS(board)) { if (IS_TARANIS(board)) {
moduleData[0].protocol=PXX_XJT_X16; moduleData[0].protocol = PULSES_PXX_XJT_X16;
moduleData[1].protocol=OFF; moduleData[1].protocol = PULSES_OFF;
} }
else if (IS_SKY9X(board)) { else if (IS_SKY9X(board)) {
moduleData[0].protocol=PPM; moduleData[0].protocol = PULSES_PPM;
moduleData[1].protocol=PPM; moduleData[1].protocol = PULSES_PPM;
} }
else { else {
moduleData[0].protocol=PPM; moduleData[0].protocol = PULSES_PPM;
moduleData[1].protocol=OFF; moduleData[1].protocol = PULSES_OFF;
} }
for (int i=0; i<C9X_MAX_FLIGHT_MODES; i++) { for (int i=0; i<C9X_MAX_FLIGHT_MODES; i++) {
flightModeData[i].clear(); flightModeData[i].clear();

View file

@ -815,31 +815,31 @@ class TimerData {
void clear() { memset(this, 0, sizeof(TimerData)); mode = RawSwitch(SWITCH_TYPE_TIMER_MODE, 0); } void clear() { memset(this, 0, sizeof(TimerData)); mode = RawSwitch(SWITCH_TYPE_TIMER_MODE, 0); }
}; };
enum Protocol { enum PulsesProtocol {
OFF, PULSES_OFF,
PPM, PULSES_PPM,
SILV_A, PULSES_SILV_A,
SILV_B, PULSES_SILV_B,
SILV_C, PULSES_SILV_C,
CTP1009, PULSES_CTP1009,
LP45, PULSES_LP45,
DSM2, PULSES_DSM2,
DSMX, PULSES_DSMX,
PPM16, PULSES_PPM16,
PPMSIM, PULSES_PPMSIM,
PXX_XJT_X16, PULSES_PXX_XJT_X16,
PXX_XJT_D8, PULSES_PXX_XJT_D8,
PXX_XJT_LR12, PULSES_PXX_XJT_LR12,
PXX_DJT, PULSES_PXX_DJT,
PROTO_LAST PULSES_PROTOCOL_LAST
}; };
enum TrainerProtocol { enum TrainerProtocol {
MASTER_JACK, TRAINER_MASTER_JACK,
SLAVE_JACK, TRAINER_SLAVE_JACK,
MASTER_SBUS_MODULE, TRAINER_MASTER_SBUS_MODULE,
MASTER_CPPM_MODULE, TRAINER_MASTER_CPPM_MODULE,
MASTER_SBUS_BATT_COMPARTMENT TRAINER_MASTER_SBUS_BATT_COMPARTMENT
}; };
class ModuleData { class ModuleData {
@ -1139,7 +1139,8 @@ class GeneralSettings {
unsigned int currModel; // 0..15 unsigned int currModel; // 0..15
unsigned int contrast; unsigned int contrast;
unsigned int vBatWarn; unsigned int vBatWarn;
int vBatCalib; int txVoltageCalibration;
int txCurrentCalibration;
int vBatMin; int vBatMin;
int vBatMax; int vBatMax;
int backlightMode; int backlightMode;
@ -1187,7 +1188,6 @@ class GeneralSettings {
int speakerVolume; int speakerVolume;
unsigned int backlightBright; unsigned int backlightBright;
int switchesDelay; int switchesDelay;
int currentCalib;
int temperatureCalib; int temperatureCalib;
int temperatureWarn; int temperatureWarn;
unsigned int mAhWarn; unsigned int mAhWarn;
@ -1318,7 +1318,7 @@ enum Capability {
PPMCenter, PPMCenter,
PPMUnitMicroseconds, PPMUnitMicroseconds,
SYMLimits, SYMLimits,
HasCurrentCalibration, HastxCurrentCalibration,
HasVolume, HasVolume,
HasBrightness, HasBrightness,
PerModelTimers, PerModelTimers,
@ -1378,7 +1378,7 @@ class EEPROMInterface
virtual int getSize(const GeneralSettings &) = 0; virtual int getSize(const GeneralSettings &) = 0;
virtual int isAvailable(Protocol proto, int port=0) = 0; virtual int isAvailable(PulsesProtocol proto, int port=0) = 0;
virtual const int getEEpromSize() = 0; virtual const int getEEpromSize() = 0;

View file

@ -70,7 +70,7 @@ Er9xGeneral::operator GeneralSettings ()
result.currModel = currModel; result.currModel = currModel;
result.contrast = contrast; result.contrast = contrast;
result.vBatWarn = vBatWarn; result.vBatWarn = vBatWarn;
result.vBatCalib = vBatCalib; result.txVoltageCalibration = txVoltageCalibration;
result.trainer = trainer; result.trainer = trainer;
result.blightinv=blightinv; result.blightinv=blightinv;
result.stickScroll=stickScroll; result.stickScroll=stickScroll;
@ -361,16 +361,16 @@ t_Er9xModelData::operator ModelData ()
c9x.timers[0].val = tmrVal; c9x.timers[0].val = tmrVal;
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].ppmFrameLength=ppmFrameLength; c9x.moduleData[0].ppmFrameLength=ppmFrameLength;

View file

@ -61,7 +61,7 @@ PACK(typedef struct t_Er9xGeneral {
uint8_t currModel; //0..15 uint8_t currModel; //0..15
uint8_t contrast; uint8_t contrast;
uint8_t vBatWarn; uint8_t vBatWarn;
int8_t vBatCalib; int8_t txVoltageCalibration;
int8_t lightSw; int8_t lightSw;
Er9xTrainerData trainer; Er9xTrainerData trainer;
uint8_t view; uint8_t view;

View file

@ -200,13 +200,13 @@ int Er9xInterface::getSize(const GeneralSettings &settings)
return 0; return 0;
} }
int Er9xInterface::isAvailable(Protocol prot, int port) int Er9xInterface::isAvailable(PulsesProtocol prot, int port)
{ {
switch (prot) { switch (prot) {
case PPM: case PULSES_PPM:
case DSM2: case PULSES_DSM2:
case PXX_DJT: case PULSES_PXX_DJT:
case PPM16: case PULSES_PPM16:
return 1; return 1;
default: default:
return 0; return 0;

View file

@ -46,7 +46,7 @@ class Er9xInterface : public EEPROMInterface
virtual int getSize(const GeneralSettings &settings); virtual int getSize(const GeneralSettings &settings);
virtual int isAvailable(Protocol proto, int port=0); virtual int isAvailable(PulsesProtocol proto, int port=0);
protected: protected:

View file

@ -82,7 +82,7 @@ Ersky9xGeneral::operator GeneralSettings ()
result.currModel = currModel; result.currModel = currModel;
result.contrast = contrast; result.contrast = contrast;
result.vBatWarn = vBatWarn; result.vBatWarn = vBatWarn;
result.vBatCalib = vBatCalib; result.txVoltageCalibration = txVoltageCalibration;
result.backlightMode = 0; result.backlightMode = 0;
if (lightSw == 22) { if (lightSw == 22) {
@ -135,7 +135,7 @@ Ersky9xGeneral::operator GeneralSettings ()
result.switchWarningStates = switchWarningStates; result.switchWarningStates = switchWarningStates;
result.speakerVolume = volume; result.speakerVolume = volume;
result.backlightBright = bright ; result.backlightBright = bright ;
result.currentCalib = current_calib; result.txCurrentCalibration = current_calib;
return result; return result;
} }
@ -493,16 +493,16 @@ t_Ersky9xModelData_v10::operator ModelData ()
} }
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].ppmFrameLength=ppmFrameLength; c9x.moduleData[0].ppmFrameLength=ppmFrameLength;
@ -608,16 +608,16 @@ t_Ersky9xModelData_v11::operator ModelData ()
} }
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].ppmFrameLength=ppmFrameLength; c9x.moduleData[0].ppmFrameLength=ppmFrameLength;

View file

@ -69,7 +69,7 @@ PACK(typedef struct t_Ersky9xGeneral {
uint8_t currModel; //0..15 uint8_t currModel; //0..15
uint8_t contrast; uint8_t contrast;
uint8_t vBatWarn; uint8_t vBatWarn;
int8_t vBatCalib; int8_t txVoltageCalibration;
int8_t lightSw; int8_t lightSw;
Ersky9xTrainerData trainer; Ersky9xTrainerData trainer;
uint8_t view; uint8_t view;

View file

@ -244,13 +244,13 @@ int Ersky9xInterface::getSize(const GeneralSettings & settings)
return 0; return 0;
} }
int Ersky9xInterface::isAvailable(Protocol prot, int port) int Ersky9xInterface::isAvailable(PulsesProtocol prot, int port)
{ {
switch (prot) { switch (prot) {
case PPM: case PULSES_PPM:
case DSM2: case PULSES_DSM2:
case PXX_DJT: case PULSES_PXX_DJT:
case PPM16: case PULSES_PPM16:
return 1; return 1;
default: default:
return 0; return 0;

View file

@ -46,7 +46,7 @@ class Ersky9xInterface : public EEPROMInterface
virtual int getSize(const GeneralSettings & settings); virtual int getSize(const GeneralSettings & settings);
virtual int isAvailable(Protocol proto, int port=0); virtual int isAvailable(PulsesProtocol proto, int port=0);
protected: protected:

View file

@ -70,7 +70,7 @@ Gruvin9xGeneral_v103::operator GeneralSettings ()
result.currModel = currModel; result.currModel = currModel;
result.contrast = contrast; result.contrast = contrast;
result.vBatWarn = vBatWarn; result.vBatWarn = vBatWarn;
result.vBatCalib = vBatCalib; result.txVoltageCalibration = txVoltageCalibration;
result.backlightMode = 0; result.backlightMode = 0;
if (lightSw == 22) { if (lightSw == 22) {
@ -127,7 +127,7 @@ Gruvin9xGeneral_v104::operator GeneralSettings ()
result.currModel = currModel; result.currModel = currModel;
result.contrast = contrast; result.contrast = contrast;
result.vBatWarn = vBatWarn; result.vBatWarn = vBatWarn;
result.vBatCalib = vBatCalib; result.txVoltageCalibration = txVoltageCalibration;
result.backlightMode = 0; result.backlightMode = 0;
if (lightSw == 22) { if (lightSw == 22) {
@ -423,25 +423,25 @@ t_Gruvin9xModelData_v102::operator ModelData ()
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = SILV_A; c9x.moduleData[0].protocol = PULSES_SILV_A;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = SILV_B; c9x.moduleData[0].protocol = PULSES_SILV_B;
break; break;
case 5: case 5:
c9x.moduleData[0].protocol = SILV_C; c9x.moduleData[0].protocol = PULSES_SILV_C;
break; break;
case 6: case 6:
c9x.moduleData[0].protocol = CTP1009; c9x.moduleData[0].protocol = PULSES_CTP1009;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -493,25 +493,25 @@ t_Gruvin9xModelData_v103::operator ModelData ()
c9x.timers[1] = timer2; c9x.timers[1] = timer2;
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = SILV_A; c9x.moduleData[0].protocol = PULSES_SILV_A;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = SILV_B; c9x.moduleData[0].protocol = PULSES_SILV_B;
break; break;
case 5: case 5:
c9x.moduleData[0].protocol = SILV_C; c9x.moduleData[0].protocol = PULSES_SILV_C;
break; break;
case 6: case 6:
c9x.moduleData[0].protocol = CTP1009; c9x.moduleData[0].protocol = PULSES_CTP1009;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -563,25 +563,25 @@ t_Gruvin9xModelData_v105::operator ModelData ()
c9x.timers[1] = timer2; c9x.timers[1] = timer2;
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = SILV_A; c9x.moduleData[0].protocol = PULSES_SILV_A;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = SILV_B; c9x.moduleData[0].protocol = PULSES_SILV_B;
break; break;
case 5: case 5:
c9x.moduleData[0].protocol = SILV_C; c9x.moduleData[0].protocol = PULSES_SILV_C;
break; break;
case 6: case 6:
c9x.moduleData[0].protocol = CTP1009; c9x.moduleData[0].protocol = PULSES_CTP1009;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -653,25 +653,25 @@ t_Gruvin9xModelData_v106::operator ModelData ()
c9x.timers[1] = timer2; c9x.timers[1] = timer2;
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = SILV_A; c9x.moduleData[0].protocol = PULSES_SILV_A;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = SILV_B; c9x.moduleData[0].protocol = PULSES_SILV_B;
break; break;
case 5: case 5:
c9x.moduleData[0].protocol = SILV_C; c9x.moduleData[0].protocol = PULSES_SILV_C;
break; break;
case 6: case 6:
c9x.moduleData[0].protocol = CTP1009; c9x.moduleData[0].protocol = PULSES_CTP1009;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);

View file

@ -69,7 +69,7 @@ PACK(typedef struct t_Gruvin9xGeneral_v103 {
uint8_t currModel; //0..15 uint8_t currModel; //0..15
uint8_t contrast; uint8_t contrast;
uint8_t vBatWarn; uint8_t vBatWarn;
int8_t vBatCalib; int8_t txVoltageCalibration;
int8_t lightSw; int8_t lightSw;
Gruvin9xTrainerData_v103 trainer; Gruvin9xTrainerData_v103 trainer;
uint8_t view; //index of subview in main scrren uint8_t view; //index of subview in main scrren
@ -106,7 +106,7 @@ PACK(typedef struct t_Gruvin9xGeneral_v104 {
uint8_t currModel; //0..15 uint8_t currModel; //0..15
uint8_t contrast; uint8_t contrast;
uint8_t vBatWarn; uint8_t vBatWarn;
int8_t vBatCalib; int8_t txVoltageCalibration;
int8_t lightSw; int8_t lightSw;
Gruvin9xTrainerData_v104 trainer; Gruvin9xTrainerData_v104 trainer;
uint8_t view; //index of subview in main scrren uint8_t view; //index of subview in main scrren

View file

@ -216,15 +216,15 @@ int Gruvin9xInterface::getSize(const GeneralSettings & settings)
return 0; return 0;
} }
int Gruvin9xInterface::isAvailable(Protocol proto, int port) int Gruvin9xInterface::isAvailable(PulsesProtocol proto, int port)
{ {
switch (proto) { switch (proto) {
case PPM: case PULSES_PPM:
case SILV_A: case PULSES_SILV_A:
case SILV_B: case PULSES_SILV_B:
case SILV_C: case PULSES_SILV_C:
case CTP1009: case PULSES_CTP1009:
case DSM2: case PULSES_DSM2:
return 1; return 1;
default: default:
return 0; return 0;

View file

@ -47,7 +47,7 @@ class Gruvin9xInterface : public EEPROMInterface
virtual int getSize(const GeneralSettings & settings); virtual int getSize(const GeneralSettings & settings);
virtual int isAvailable(Protocol proto, int port=0); virtual int isAvailable(PulsesProtocol proto, int port=0);
protected: protected:

View file

@ -440,16 +440,16 @@ t_Open9xGruvin9xModelData_v207::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -514,19 +514,19 @@ t_Open9xGruvin9xModelData_v208::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -596,19 +596,19 @@ t_Open9xGruvin9xModelData_v209::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -679,19 +679,19 @@ t_Open9xGruvin9xModelData_v210::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -766,19 +766,19 @@ t_Open9xGruvin9xModelData_v211::operator ModelData ()
} }
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);

View file

@ -716,19 +716,19 @@ t_Open9xArmModelData_v208::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -799,19 +799,19 @@ t_Open9xArmModelData_v209::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -883,19 +883,19 @@ t_Open9xArmModelData_v210::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -967,19 +967,19 @@ t_Open9xArmModelData_v211::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -1054,19 +1054,19 @@ t_Open9xArmModelData_v212::operator ModelData ()
} }
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);

View file

@ -917,16 +917,16 @@ t_Open9xModelData_v201::operator ModelData ()
c9x.timers[1] = timer2; c9x.timers[1] = timer2;
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -991,16 +991,16 @@ t_Open9xModelData_v202::operator ModelData ()
c9x.timers[1] = timer2; c9x.timers[1] = timer2;
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -1067,16 +1067,16 @@ t_Open9xModelData_v203::operator ModelData ()
c9x.timers[1] = timer2; c9x.timers[1] = timer2;
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -1141,16 +1141,16 @@ t_Open9xModelData_v204::operator ModelData ()
c9x.timers[1] = timer2; c9x.timers[1] = timer2;
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -1217,19 +1217,19 @@ t_Open9xModelData_v205::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -1295,19 +1295,19 @@ t_Open9xModelData_v208::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -1381,19 +1381,19 @@ t_Open9xModelData_v209::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -1468,19 +1468,19 @@ t_Open9xModelData_v210::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);
@ -1556,19 +1556,19 @@ t_Open9xModelData_v211::operator ModelData ()
c9x.timers[i] = timers[i]; c9x.timers[i] = timers[i];
switch(protocol) { switch(protocol) {
case 1: case 1:
c9x.moduleData[0].protocol = PPM16; c9x.moduleData[0].protocol = PULSES_PPM16;
break; break;
case 2: case 2:
c9x.moduleData[0].protocol = PPMSIM; c9x.moduleData[0].protocol = PULSES_PPMSIM;
break; break;
case 3: case 3:
c9x.moduleData[0].protocol = PXX_DJT; c9x.moduleData[0].protocol = PULSES_PXX_DJT;
break; break;
case 4: case 4:
c9x.moduleData[0].protocol = DSM2; c9x.moduleData[0].protocol = PULSES_DSM2;
break; break;
default: default:
c9x.moduleData[0].protocol = PPM; c9x.moduleData[0].protocol = PULSES_PPM;
break; break;
} }
c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH);

View file

@ -12,7 +12,7 @@
#define HAS_PERSISTENT_TIMERS(board) (IS_ARM(board) || IS_2560(board)) #define HAS_PERSISTENT_TIMERS(board) (IS_ARM(board) || IS_2560(board))
#define HAS_LARGE_LCD(board) IS_TARANIS(board) #define HAS_LARGE_LCD(board) IS_TARANIS(board)
#define MAX_VIEWS(board) (HAS_LARGE_LCD(board) ? 2 : 256) #define MAX_VIEWS(board) (HAS_LARGE_LCD(board) ? 2 : 256)
#define MAX_POTS(board) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 4 : 3) : 3) #define MAX_POTS(board, version) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 4 : (version >= 216 ? 3 : 2)) : 3)
#define MAX_SLIDERS(board) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 4 : 2) : 0) #define MAX_SLIDERS(board) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 4 : 2) : 0)
#define MAX_SWITCHES(board, version) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 18 : 8) : 7) #define MAX_SWITCHES(board, version) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 18 : 8) : 7)
#define MAX_SWITCHES_POSITION(board, version) (IS_TARANIS_X9E(board) ? 18*3 : (IS_TARANIS(board) ? 8*3 : 9)) #define MAX_SWITCHES_POSITION(board, version) (IS_TARANIS_X9E(board) ? 18*3 : (IS_TARANIS(board) ? 8*3 : 9))
@ -80,7 +80,7 @@ class SwitchesConversionTable: public ConversionTable {
} }
if (IS_TARANIS(board) && version >= 216) { if (IS_TARANIS(board) && version >= 216) {
for (int i=1; i<=MAX_POTS(board)*6; i++) { for (int i=1; i<=MAX_POTS(board, version)*6; i++) {
addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, -i), -val+offset); addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, -i), -val+offset);
addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, i), val++); addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, i), val++);
} }
@ -212,8 +212,9 @@ class SourcesConversionTable: public ConversionTable {
} }
if (IS_TARANIS(board) && version >= 216) { if (IS_TARANIS(board) && version >= 216) {
for (int i=0; i<32; i++) for (int i=0; i<32; i++) {
addConversion(RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i), val++); addConversion(RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i), val++);
}
for (int i=0; i<7; i++) { for (int i=0; i<7; i++) {
for (int j=0; j<6; j++) { for (int j=0; j<6; j++) {
addConversion(RawSource(SOURCE_TYPE_LUA_OUTPUT, i*16+j), val++); addConversion(RawSource(SOURCE_TYPE_LUA_OUTPUT, i*16+j), val++);
@ -221,17 +222,19 @@ class SourcesConversionTable: public ConversionTable {
} }
} }
for (int i=0; i<NUM_STICKS+MAX_POTS(board)+MAX_SLIDERS(board); i++) { for (int i=0; i<NUM_STICKS+MAX_POTS(board, version)+MAX_SLIDERS(board); i++) {
addConversion(RawSource(SOURCE_TYPE_STICK, i), val++); addConversion(RawSource(SOURCE_TYPE_STICK, i), val++);
} }
for (int i=0; i<MAX_ROTARY_ENCODERS(board); i++) for (int i=0; i<MAX_ROTARY_ENCODERS(board); i++) {
addConversion(RawSource(SOURCE_TYPE_ROTARY_ENCODER, 0), val++); addConversion(RawSource(SOURCE_TYPE_ROTARY_ENCODER, 0), val++);
}
if (!afterrelease21March2013) { if (!afterrelease21March2013) {
for (int i=0; i<NUM_STICKS; i++) for (int i=0; i<NUM_STICKS; i++) {
addConversion(RawSource(SOURCE_TYPE_TRIM, i), val++); addConversion(RawSource(SOURCE_TYPE_TRIM, i), val++);
} }
}
addConversion(RawSource(SOURCE_TYPE_MAX), val++); addConversion(RawSource(SOURCE_TYPE_MAX), val++);
@ -1746,6 +1749,7 @@ class LogicalSwitchField: public TransformedField {
{ {
delete andswitchesConversionTable; delete andswitchesConversionTable;
} }
virtual void beforeExport() virtual void beforeExport()
{ {
if (csw.func == LS_FN_TIMER) { if (csw.func == LS_FN_TIMER) {
@ -1787,8 +1791,14 @@ class LogicalSwitchField: public TransformedField {
switchesConversionTable->importValue(v2, csw.val2); switchesConversionTable->importValue(v2, csw.val2);
} }
else if (csw.func >= LS_FN_EQUAL && csw.func <= LS_FN_ELESS) { else if (csw.func >= LS_FN_EQUAL && csw.func <= LS_FN_ELESS) {
if (IS_ARM(board)) {
sourcesConversionTable->importValue((uint32_t)v1, csw.val1);
sourcesConversionTable->importValue((uint32_t)v2, csw.val2);
}
else {
sourcesConversionTable->importValue((uint8_t)v1, csw.val1); sourcesConversionTable->importValue((uint8_t)v1, csw.val1);
sourcesConversionTable->importValue((uint8_t)v2, csw.val2); sourcesConversionTable->importValue((uint8_t)v2, csw.val2);
}
if (IS_TARANIS(board) && version < 216) { if (IS_TARANIS(board) && version < 216) {
RawSource val1(csw.val1); RawSource val1(csw.val1);
if (val1.type == SOURCE_TYPE_STICK && val1.index < NUM_STICKS) { if (val1.type == SOURCE_TYPE_STICK && val1.index < NUM_STICKS) {
@ -1801,7 +1811,12 @@ class LogicalSwitchField: public TransformedField {
} }
} }
else if (csw.func != LS_FN_OFF) { else if (csw.func != LS_FN_OFF) {
if (IS_ARM(board)) {
sourcesConversionTable->importValue((uint32_t)v1, csw.val1);
}
else {
sourcesConversionTable->importValue((uint8_t)v1, csw.val1); sourcesConversionTable->importValue((uint8_t)v1, csw.val1);
}
if (IS_TARANIS(board) && version < 216) { if (IS_TARANIS(board) && version < 216) {
RawSource val1(csw.val1); RawSource val1(csw.val1);
if (val1.type == SOURCE_TYPE_STICK && val1.index < NUM_STICKS) { if (val1.type == SOURCE_TYPE_STICK && val1.index < NUM_STICKS) {
@ -2809,7 +2824,8 @@ class SensorField: public TransformedField {
if (sensor.type == SensorData::TELEM_TYPE_CUSTOM) { if (sensor.type == SensorData::TELEM_TYPE_CUSTOM) {
_id = sensor.id; _id = sensor.id;
_instance = sensor.instance; _instance = sensor.instance;
_param = (sensor.ratio) + ((unsigned int)sensor.offset << 16); _ratio = sensor.ratio;
_offset = sensor.offset;
} }
else { else {
_id = sensor.persistentValue; _id = sensor.persistentValue;
@ -2820,7 +2836,7 @@ class SensorField: public TransformedField {
_param = ((uint8_t)sensor.sources[0]) + ((uint8_t)sensor.sources[1] << 8) + ((uint8_t)sensor.sources[2] << 16) + ((uint8_t)sensor.sources[3] << 24); _param = ((uint8_t)sensor.sources[0]) + ((uint8_t)sensor.sources[1] << 8) + ((uint8_t)sensor.sources[2] << 16) + ((uint8_t)sensor.sources[3] << 24);
else if (sensor.formula == SensorData::TELEM_FORMULA_DIST) else if (sensor.formula == SensorData::TELEM_FORMULA_DIST)
_param = (sensor.gps) + (sensor.alt << 8); _param = (sensor.gps) + (sensor.alt << 8);
else if (sensor.formula == SensorData::TELEM_FORMULA_CONSUMPTION) else if (sensor.formula == SensorData::TELEM_FORMULA_CONSUMPTION || sensor.formula == SensorData::TELEM_FORMULA_TOTALIZE)
_param = (sensor.amps); _param = (sensor.amps);
} }
} }
@ -2830,8 +2846,8 @@ class SensorField: public TransformedField {
if (sensor.type == SensorData::TELEM_TYPE_CUSTOM) { if (sensor.type == SensorData::TELEM_TYPE_CUSTOM) {
sensor.id = _id; sensor.id = _id;
sensor.instance = _instance; sensor.instance = _instance;
sensor.ratio = _param & 0xFFFF; sensor.ratio = _ratio;
sensor.offset = (_param >> 16) & 0xFFFF; sensor.offset = _offset;
} }
else { else {
sensor.persistentValue = _id; sensor.persistentValue = _id;
@ -2843,7 +2859,7 @@ class SensorField: public TransformedField {
sensor.sources[i] = _sources[i]; sensor.sources[i] = _sources[i];
else if (sensor.formula == SensorData::TELEM_FORMULA_DIST) else if (sensor.formula == SensorData::TELEM_FORMULA_DIST)
(sensor.gps = _sources[0], sensor.alt = _sources[1]); (sensor.gps = _sources[0], sensor.alt = _sources[1]);
else if (sensor.formula == SensorData::TELEM_FORMULA_CONSUMPTION) else if (sensor.formula == SensorData::TELEM_FORMULA_CONSUMPTION || sensor.formula == SensorData::TELEM_FORMULA_TOTALIZE)
sensor.amps = _sources[0]; sensor.amps = _sources[0];
} }
eepromImportDebug() << QString("imported %1").arg(internalField.getName()); eepromImportDebug() << QString("imported %1").arg(internalField.getName());
@ -2857,6 +2873,10 @@ class SensorField: public TransformedField {
union { union {
unsigned int _param; unsigned int _param;
uint8_t _sources[4]; uint8_t _sources[4];
struct {
uint16_t _ratio;
int16_t _offset;
};
}; };
}; };
@ -3148,7 +3168,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
if (IS_ARM(board) && version >= 217) { if (IS_ARM(board) && version >= 217) {
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
if (i < MAX_POTS(board)+MAX_SLIDERS(board)) if (i < MAX_POTS(board, version)+MAX_SLIDERS(board))
internalField.Append(new BoolField<1>(modelData.potsWarningEnabled[i])); internalField.Append(new BoolField<1>(modelData.potsWarningEnabled[i]));
else else
internalField.Append(new SpareBitsField<1>()); internalField.Append(new SpareBitsField<1>());
@ -3156,7 +3176,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
} }
else if (IS_ARM(board) && version >= 216) { else if (IS_ARM(board) && version >= 216) {
for (int i=0; i<6; i++) { for (int i=0; i<6; i++) {
if (i < MAX_POTS(board)+MAX_SLIDERS(board)) if (i < MAX_POTS(board, version)+MAX_SLIDERS(board))
internalField.Append(new BoolField<1>(modelData.potsWarningEnabled[i])); internalField.Append(new BoolField<1>(modelData.potsWarningEnabled[i]));
else else
internalField.Append(new SpareBitsField<1>()); internalField.Append(new SpareBitsField<1>());
@ -3165,7 +3185,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
} }
if (IS_ARM(board) && version >= 216) { if (IS_ARM(board) && version >= 216) {
for (int i=0; i < MAX_POTS(board)+MAX_SLIDERS(board); i++) { for (int i=0; i < MAX_POTS(board, version)+MAX_SLIDERS(board); i++) {
internalField.Append(new SignedField<8>(modelData.potPosition[i])); internalField.Append(new SignedField<8>(modelData.potPosition[i]));
} }
} }
@ -3191,10 +3211,10 @@ void OpenTxModelData::beforeExport()
// qDebug() << QString("before export model") << modelData.name; // qDebug() << QString("before export model") << modelData.name;
for (int module=0; module<3; module++) { for (int module=0; module<3; module++) {
if (modelData.moduleData[module].protocol >= PXX_XJT_X16 && modelData.moduleData[module].protocol <= PXX_XJT_LR12) if (modelData.moduleData[module].protocol >= PULSES_PXX_XJT_X16 && modelData.moduleData[module].protocol <= PULSES_PXX_XJT_LR12)
subprotocols[module] = modelData.moduleData[module].protocol - PXX_XJT_X16; subprotocols[module] = modelData.moduleData[module].protocol - PULSES_PXX_XJT_X16;
else if (modelData.moduleData[module].protocol >= LP45 && modelData.moduleData[module].protocol <= DSMX) else if (modelData.moduleData[module].protocol >= PULSES_LP45 && modelData.moduleData[module].protocol <= PULSES_DSMX)
subprotocols[module] = modelData.moduleData[module].protocol - LP45; subprotocols[module] = modelData.moduleData[module].protocol - PULSES_LP45;
else else
subprotocols[module] = (module==0 ? -1 : 0); subprotocols[module] = (module==0 ? -1 : 0);
} }
@ -3224,15 +3244,15 @@ void OpenTxModelData::afterImport()
} }
for (int module=0; module<3; module++) { for (int module=0; module<3; module++) {
if (modelData.moduleData[module].protocol == PXX_XJT_X16 || modelData.moduleData[module].protocol == LP45) { if (modelData.moduleData[module].protocol == PULSES_PXX_XJT_X16 || modelData.moduleData[module].protocol == PULSES_LP45) {
if (subprotocols[module] >= 0) if (subprotocols[module] >= 0)
modelData.moduleData[module].protocol += subprotocols[module]; modelData.moduleData[module].protocol += subprotocols[module];
else else
modelData.moduleData[module].protocol = OFF; modelData.moduleData[module].protocol = PULSES_OFF;
} }
} }
if (IS_TARANIS(board) && version < 217 && modelData.moduleData[1].protocol != OFF) { if (IS_TARANIS(board) && version < 217 && modelData.moduleData[1].protocol != PULSES_OFF) {
modelData.moduleData[1].modelId = modelData.moduleData[0].modelId; modelData.moduleData[1].modelId = modelData.moduleData[0].modelId;
} }
} }
@ -3243,7 +3263,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, BoardEnum bo
generalData(generalData), generalData(generalData),
board(board), board(board),
version(version), version(version),
inputsCount(NUM_STICKS+MAX_POTS(board)+MAX_SLIDERS(board)) inputsCount(NUM_STICKS+MAX_POTS(board, version)+MAX_SLIDERS(board))
{ {
eepromImportDebug() << QString("OpenTxGeneralData::OpenTxGeneralData(board: %1, version:%2, variant:%3)").arg(board).arg(version).arg(variant); eepromImportDebug() << QString("OpenTxGeneralData::OpenTxGeneralData(board: %1, version:%2, variant:%3)").arg(board).arg(version).arg(variant);
@ -3280,7 +3300,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, BoardEnum bo
internalField.Append(new UnsignedField<8>(generalData.currModel)); internalField.Append(new UnsignedField<8>(generalData.currModel));
internalField.Append(new UnsignedField<8>(generalData.contrast)); internalField.Append(new UnsignedField<8>(generalData.contrast));
internalField.Append(new UnsignedField<8>(generalData.vBatWarn)); internalField.Append(new UnsignedField<8>(generalData.vBatWarn));
internalField.Append(new SignedField<8>(generalData.vBatCalib)); internalField.Append(new SignedField<8>(generalData.txVoltageCalibration));
internalField.Append(new SignedField<8>(generalData.backlightMode)); internalField.Append(new SignedField<8>(generalData.backlightMode));
for (int i=0; i<NUM_STICKS; i++) for (int i=0; i<NUM_STICKS; i++)
@ -3364,7 +3384,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, BoardEnum bo
if (IS_ARM(board)) { if (IS_ARM(board)) {
internalField.Append(new UnsignedField<8>(generalData.backlightBright)); internalField.Append(new UnsignedField<8>(generalData.backlightBright));
internalField.Append(new SignedField<8>(generalData.currentCalib)); internalField.Append(new SignedField<8>(generalData.txCurrentCalibration));
if (version >= 213) { if (version >= 213) {
internalField.Append(new SignedField<8>(generalData.temperatureWarn)); // TODO internalField.Append(new SignedField<8>(generalData.temperatureWarn)); // TODO
internalField.Append(new UnsignedField<8>(generalData.mAhWarn)); internalField.Append(new UnsignedField<8>(generalData.mAhWarn));
@ -3407,7 +3427,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, BoardEnum bo
internalField.Append(new UnsignedField<8>(generalData.hw_uartMode)); internalField.Append(new UnsignedField<8>(generalData.hw_uartMode));
} }
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
if (i < MAX_POTS(board)) if (i < MAX_POTS(board, version))
internalField.Append(new UnsignedField<2>(generalData.potConfig[i])); internalField.Append(new UnsignedField<2>(generalData.potConfig[i]));
else else
internalField.Append(new SpareBitsField<2>()); internalField.Append(new SpareBitsField<2>());
@ -3439,7 +3459,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, BoardEnum bo
for (int i=0; i<NUM_STICKS; ++i) { for (int i=0; i<NUM_STICKS; ++i) {
internalField.Append(new ZCharField<3>(generalData.stickName[i])); internalField.Append(new ZCharField<3>(generalData.stickName[i]));
} }
for (int i=0; i<MAX_POTS(board); ++i) { for (int i=0; i<MAX_POTS(board, version); ++i) {
internalField.Append(new ZCharField<3>(generalData.potName[i])); internalField.Append(new ZCharField<3>(generalData.potName[i]));
} }
for (int i=0; i<MAX_SLIDERS(board); ++i) { for (int i=0; i<MAX_SLIDERS(board); ++i) {

View file

@ -56,30 +56,30 @@ class ProtocolsConversionTable: public ConversionTable
{ {
int val = 0; int val = 0;
if (IS_ARM(board)) { if (IS_ARM(board)) {
addConversion(OFF, val++); addConversion(PULSES_OFF, val++);
} }
addConversion(PPM, val++); addConversion(PULSES_PPM, val++);
if (!IS_ARM(board)) { if (!IS_ARM(board)) {
addConversion(PPM16, val++); addConversion(PULSES_PPM16, val++);
addConversion(PPMSIM, val++); addConversion(PULSES_PPMSIM, val++);
} }
if (IS_ARM(board)) { if (IS_ARM(board)) {
addConversion(PXX_XJT_X16, val); addConversion(PULSES_PXX_XJT_X16, val);
addConversion(PXX_XJT_D8, val); addConversion(PULSES_PXX_XJT_D8, val);
addConversion(PXX_XJT_LR12, val++); addConversion(PULSES_PXX_XJT_LR12, val++);
} }
else { else {
addConversion(PXX_DJT, val++); addConversion(PULSES_PXX_DJT, val++);
} }
if (IS_ARM(board)) { if (IS_ARM(board)) {
addConversion(LP45, val); addConversion(PULSES_LP45, val);
addConversion(DSM2, val); addConversion(PULSES_DSM2, val);
addConversion(DSMX, val++); addConversion(PULSES_DSMX, val++);
} }
else { else {
addConversion(LP45, val++); addConversion(PULSES_LP45, val++);
addConversion(DSM2, val++); addConversion(PULSES_DSM2, val++);
addConversion(DSMX, val++); addConversion(PULSES_DSMX, val++);
} }
} }
}; };

View file

@ -714,7 +714,7 @@ int OpenTxFirmware::getCapability(const Capability capability)
return (IS_ARM(board) && !IS_9XRPRO(board)) ? 2 : 1; return (IS_ARM(board) && !IS_9XRPRO(board)) ? 2 : 1;
case HasPPMStart: case HasPPMStart:
return (IS_ARM(board) ? true : false); return (IS_ARM(board) ? true : false);
case HasCurrentCalibration: case HastxCurrentCalibration:
return (IS_SKY9X(board) ? true : false); return (IS_SKY9X(board) ? true : false);
case HasVolume: case HasVolume:
return (IS_ARM(board) ? true : false); return (IS_ARM(board) ? true : false);
@ -797,16 +797,16 @@ bool OpenTxFirmware::isTelemetrySourceAvailable(int source)
return true; return true;
} }
int OpenTxEepromInterface::isAvailable(Protocol proto, int port) int OpenTxEepromInterface::isAvailable(PulsesProtocol proto, int port)
{ {
if (IS_TARANIS(board)) { if (IS_TARANIS(board)) {
switch (port) { switch (port) {
case 0: case 0:
switch (proto) { switch (proto) {
case OFF: case PULSES_OFF:
case PXX_XJT_X16: case PULSES_PXX_XJT_X16:
case PXX_XJT_D8: case PULSES_PXX_XJT_D8:
case PXX_XJT_LR12: case PULSES_PXX_XJT_LR12:
return 1; return 1;
default: default:
return 0; return 0;
@ -814,15 +814,15 @@ int OpenTxEepromInterface::isAvailable(Protocol proto, int port)
break; break;
case 1: case 1:
switch (proto) { switch (proto) {
case OFF: case PULSES_OFF:
case PPM: case PULSES_PPM:
case PXX_XJT_X16: case PULSES_PXX_XJT_X16:
case PXX_XJT_D8: case PULSES_PXX_XJT_D8:
case PXX_XJT_LR12: case PULSES_PXX_XJT_LR12:
//case PXX_DJT: // Unavailable for now //case PULSES_PXX_DJT: // Unavailable for now
case LP45: case PULSES_LP45:
case DSM2: case PULSES_DSM2:
case DSMX: case PULSES_DSMX:
return 1; return 1;
default: default:
return 0; return 0;
@ -830,7 +830,7 @@ int OpenTxEepromInterface::isAvailable(Protocol proto, int port)
break; break;
case -1: case -1:
switch (proto) { switch (proto) {
case PPM: case PULSES_PPM:
return 1; return 1;
default: default:
return 0; return 0;
@ -844,13 +844,13 @@ int OpenTxEepromInterface::isAvailable(Protocol proto, int port)
switch (port) { switch (port) {
case 0: case 0:
switch (proto) { switch (proto) {
case PPM: case PULSES_PPM:
case PXX_XJT_X16: case PULSES_PXX_XJT_X16:
case PXX_XJT_D8: case PULSES_PXX_XJT_D8:
case PXX_XJT_LR12: case PULSES_PXX_XJT_LR12:
case LP45: case PULSES_LP45:
case DSM2: case PULSES_DSM2:
case DSMX: case PULSES_DSMX:
return 1; return 1;
default: default:
return 0; return 0;
@ -858,7 +858,7 @@ int OpenTxEepromInterface::isAvailable(Protocol proto, int port)
break; break;
case 1: case 1:
switch (proto) { switch (proto) {
case PPM: case PULSES_PPM:
return 1; return 1;
default: default:
return 0; return 0;
@ -870,13 +870,13 @@ int OpenTxEepromInterface::isAvailable(Protocol proto, int port)
} }
else { else {
switch (proto) { switch (proto) {
case PPM: case PULSES_PPM:
case DSMX: case PULSES_DSMX:
case LP45: case PULSES_LP45:
case DSM2: case PULSES_DSM2:
case PXX_DJT: case PULSES_PXX_DJT:
case PPM16: case PULSES_PPM16:
case PPMSIM: case PULSES_PPMSIM:
return 1; return 1;
default: default:
return 0; return 0;

View file

@ -45,7 +45,7 @@ class OpenTxEepromInterface : public EEPROMInterface
virtual int getSize(const GeneralSettings &); virtual int getSize(const GeneralSettings &);
virtual int isAvailable(Protocol proto, int port=0); virtual int isAvailable(PulsesProtocol proto, int port=0);
protected: protected:

View file

@ -233,7 +233,7 @@ namespace NAMESPACE {
#include "radio/src/targets/taranis/pulses_driver.cpp" #include "radio/src/targets/taranis/pulses_driver.cpp"
#include "radio/src/targets/taranis/rtc_driver.cpp" #include "radio/src/targets/taranis/rtc_driver.cpp"
#include "radio/src/targets/taranis/trainer_driver.cpp" #include "radio/src/targets/taranis/trainer_driver.cpp"
#include "radio/src/targets/taranis/uart3_driver.cpp" #include "radio/src/targets/taranis/serial2_driver.cpp"
#elif defined(PCBSKY9X) #elif defined(PCBSKY9X)
#include "radio/src/targets/sky9x/board_sky9x.cpp" #include "radio/src/targets/sky9x/board_sky9x.cpp"
#include "radio/src/targets/sky9x/telemetry_driver.cpp" #include "radio/src/targets/sky9x/telemetry_driver.cpp"
@ -244,7 +244,7 @@ namespace NAMESPACE {
#include "radio/src/targets/sky9x/sdcard_driver.cpp" #include "radio/src/targets/sky9x/sdcard_driver.cpp"
#include "radio/src/targets/sky9x/coproc_driver.cpp" #include "radio/src/targets/sky9x/coproc_driver.cpp"
#include "radio/src/targets/sky9x/haptic_driver.cpp" #include "radio/src/targets/sky9x/haptic_driver.cpp"
#include "radio/src/targets/sky9x/second_serial_driver.cpp" #include "radio/src/targets/sky9x/serial2_driver.cpp"
#include "radio/src/targets/sky9x/pulses_driver.cpp" #include "radio/src/targets/sky9x/pulses_driver.cpp"
#elif defined(PCBGRUVIN9X) #elif defined(PCBGRUVIN9X)
#include "radio/src/targets/gruvin9x/board_gruvin9x.cpp" #include "radio/src/targets/gruvin9x/board_gruvin9x.cpp"

View file

@ -62,7 +62,7 @@ Th9xGeneral::operator GeneralSettings ()
result.currModel = currModel; result.currModel = currModel;
result.contrast = contrast; result.contrast = contrast;
result.vBatWarn = vBatWarn; result.vBatWarn = vBatWarn;
result.vBatCalib = vBatCalib; result.txVoltageCalibration = txVoltageCalibration;
// result.lightSw = th9xToSwitch(lightSw); // result.lightSw = th9xToSwitch(lightSw);
result.trainer = trainer; result.trainer = trainer;
result.view = view; result.view = view;

View file

@ -64,7 +64,7 @@ PACK(typedef struct t_Th9xGeneral {
uint8_t currModel; //0..15 uint8_t currModel; //0..15
uint8_t contrast; uint8_t contrast;
uint8_t vBatWarn; uint8_t vBatWarn;
int8_t vBatCalib; int8_t txVoltageCalibration;
int8_t lightSw; int8_t lightSw;
Th9xTrainerData trainer; Th9xTrainerData trainer;
uint8_t adcFilt:2; uint8_t adcFilt:2;

View file

@ -140,14 +140,14 @@ int Th9xInterface::getSize(const GeneralSettings & settings)
return 0; return 0;
} }
int Th9xInterface::isAvailable(Protocol proto, int port) int Th9xInterface::isAvailable(PulsesProtocol proto, int port)
{ {
switch (proto) { switch (proto) {
case PPM: case PULSES_PPM:
case SILV_A: case PULSES_SILV_A:
case SILV_B: case PULSES_SILV_B:
case SILV_C: case PULSES_SILV_C:
case CTP1009: case PULSES_CTP1009:
return 1; return 1;
default: default:
return 0; return 0;

View file

@ -46,7 +46,7 @@ class Th9xInterface : public EEPROMInterface
virtual int getSize(const GeneralSettings &); virtual int getSize(const GeneralSettings &);
virtual int isAvailable(Protocol proto, int port=0); virtual int isAvailable(PulsesProtocol proto, int port=0);
protected: protected:

View file

@ -175,8 +175,8 @@ bool FlashEEpromDialog::patchCalibration()
QString calib = g.profile[g.id()].stickPotCalib(); QString calib = g.profile[g.id()].stickPotCalib();
QString trainercalib = g.profile[g.id()].trainerCalib(); QString trainercalib = g.profile[g.id()].trainerCalib();
int potsnum=GetCurrentFirmware()->getCapability(Pots); int potsnum=GetCurrentFirmware()->getCapability(Pots);
int8_t vBatCalib=(int8_t) g.profile[g.id()].vBatCalib(); int8_t txVoltageCalibration=(int8_t) g.profile[g.id()].txVoltageCalibration();
int8_t currentCalib=(int8_t) g.profile[g.id()].currentCalib(); int8_t txCurrentCalibration=(int8_t) g.profile[g.id()].txCurrentCalibration();
int8_t PPM_Multiplier=(int8_t) g.profile[g.id()].ppmMultiplier(); int8_t PPM_Multiplier=(int8_t) g.profile[g.id()].ppmMultiplier();
if ((calib.length()==(NUM_STICKS+potsnum)*12) && (trainercalib.length()==16)) { if ((calib.length()==(NUM_STICKS+potsnum)*12) && (trainercalib.length()==16)) {
@ -204,8 +204,8 @@ bool FlashEEpromDialog::patchCalibration()
radioData->generalSettings.trainer.calib[i] = byte16; radioData->generalSettings.trainer.calib[i] = byte16;
} }
} }
radioData->generalSettings.currentCalib = currentCalib; radioData->generalSettings.txCurrentCalibration = txCurrentCalibration;
radioData->generalSettings.vBatCalib = vBatCalib; radioData->generalSettings.txVoltageCalibration = txVoltageCalibration;
radioData->generalSettings.PPM_Multiplier = PPM_Multiplier; radioData->generalSettings.PPM_Multiplier = PPM_Multiplier;
return true; return true;
} }

View file

@ -159,6 +159,11 @@ CalibrationPanel::CalibrationPanel(QWidget * parent, GeneralSettings & generalSe
ui->serialPortLabel->hide(); ui->serialPortLabel->hide();
} }
if (!IS_SKY9X(firmware->getBoard())) {
ui->txCurrentCalibration->hide();
ui->txCurrentCalibrationLabel->hide();
}
if (IS_TARANIS_X9E(firmware->getBoard())) { if (IS_TARANIS_X9E(firmware->getBoard())) {
ui->bluetoothEnable->setChecked(generalSettings.bluetoothEnable); ui->bluetoothEnable->setChecked(generalSettings.bluetoothEnable);
ui->bluetoothName->setField(generalSettings.bluetoothName, 10, this); ui->bluetoothName->setField(generalSettings.bluetoothName, 10, this);
@ -214,9 +219,9 @@ void CalibrationPanel::on_PPM4_editingFinished()
} }
void CalibrationPanel::on_CurrentCalib_SB_editingFinished() void CalibrationPanel::on_txCurrentCalibration_editingFinished()
{ {
generalSettings.currentCalib = ui->CurrentCalib_SB->value(); generalSettings.txCurrentCalibration = ui->txCurrentCalibration->value();
emit modified(); emit modified();
} }
@ -228,8 +233,8 @@ void CalibrationPanel::on_bluetoothEnable_stateChanged(int)
void CalibrationPanel::setValues() void CalibrationPanel::setValues()
{ {
ui->battCalibDSB->setValue((double)generalSettings.vBatCalib/10); ui->txVoltageCalibration->setValue((double)generalSettings.txVoltageCalibration/10);
ui->CurrentCalib_SB->setValue((double)generalSettings.currentCalib); ui->txCurrentCalibration->setValue((double)generalSettings.txCurrentCalibration);
ui->ana1Neg->setValue(generalSettings.calibSpanNeg[0]); ui->ana1Neg->setValue(generalSettings.calibSpanNeg[0]);
ui->ana2Neg->setValue(generalSettings.calibSpanNeg[1]); ui->ana2Neg->setValue(generalSettings.calibSpanNeg[1]);
@ -265,9 +270,9 @@ void CalibrationPanel::setValues()
ui->PPM_MultiplierDSB->setValue((qreal)(generalSettings.PPM_Multiplier+10)/10); ui->PPM_MultiplierDSB->setValue((qreal)(generalSettings.PPM_Multiplier+10)/10);
} }
void CalibrationPanel::on_battCalibDSB_editingFinished() void CalibrationPanel::on_txVoltageCalibration_editingFinished()
{ {
generalSettings.vBatCalib = ui->battCalibDSB->value()*10; generalSettings.txVoltageCalibration = ui->txVoltageCalibration->value()*10;
emit modified(); emit modified();
} }

View file

@ -21,14 +21,14 @@ class CalibrationPanel : public GeneralPanel
// virtual void update(); // virtual void update();
private slots: private slots:
void on_battCalibDSB_editingFinished(); void on_txVoltageCalibration_editingFinished();
void on_PPM1_editingFinished(); void on_PPM1_editingFinished();
void on_PPM2_editingFinished(); void on_PPM2_editingFinished();
void on_PPM3_editingFinished(); void on_PPM3_editingFinished();
void on_PPM4_editingFinished(); void on_PPM4_editingFinished();
void on_PPM_MultiplierDSB_editingFinished(); void on_PPM_MultiplierDSB_editingFinished();
void on_CurrentCalib_SB_editingFinished(); void on_txCurrentCalibration_editingFinished();
void on_bluetoothEnable_stateChanged(int); void on_bluetoothEnable_stateChanged(int);
void on_ana1Neg_editingFinished(); void on_ana1Neg_editingFinished();

View file

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>805</width> <width>805</width>
<height>1269</height> <height>1313</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -562,14 +562,14 @@
</widget> </widget>
</item> </item>
<item row="42" column="0"> <item row="42" column="0">
<widget class="QLabel" name="label_22"> <widget class="QLabel" name="txVoltageCalibrationLabel">
<property name="text"> <property name="text">
<string>Battery</string> <string>Battery Offset</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="42" column="1"> <item row="42" column="1">
<widget class="QDoubleSpinBox" name="battCalibDSB"> <widget class="QDoubleSpinBox" name="txVoltageCalibration">
<property name="statusTip"> <property name="statusTip">
<string/> <string/>
</property> </property>
@ -674,7 +674,7 @@
</widget> </widget>
</item> </item>
<item row="43" column="1"> <item row="43" column="1">
<widget class="QSpinBox" name="CurrentCalib_SB"> <widget class="QSpinBox" name="txCurrentCalibration">
<property name="minimum"> <property name="minimum">
<number>-49</number> <number>-49</number>
</property> </property>
@ -698,9 +698,9 @@
</widget> </widget>
</item> </item>
<item row="43" column="0"> <item row="43" column="0">
<widget class="QLabel" name="label_CurrentCalib"> <widget class="QLabel" name="txCurrentCalibrationLabel">
<property name="text"> <property name="text">
<string>Current</string> <string>Current Offset</string>
</property> </property>
</widget> </widget>
</item> </item>

View file

@ -88,8 +88,8 @@ void GeneralEdit::on_calretrieve_PB_clicked()
} }
else { else {
QString trainercalib = g.profile[profile_id].trainerCalib(); QString trainercalib = g.profile[profile_id].trainerCalib();
int8_t vBatCalib = (int8_t)g.profile[profile_id].vBatCalib(); int8_t txVoltageCalibration = (int8_t)g.profile[profile_id].txVoltageCalibration();
int8_t currentCalib = (int8_t)g.profile[profile_id].currentCalib(); int8_t txCurrentCalibration = (int8_t)g.profile[profile_id].txCurrentCalibration();
int8_t PPM_Multiplier = (int8_t)g.profile[profile_id].ppmMultiplier(); int8_t PPM_Multiplier = (int8_t)g.profile[profile_id].ppmMultiplier();
uint8_t GSStickMode = (uint8_t)g.profile[profile_id].gsStickMode(); uint8_t GSStickMode = (uint8_t)g.profile[profile_id].gsStickMode();
uint8_t vBatWarn = (uint8_t)g.profile[profile_id].vBatWarn(); uint8_t vBatWarn = (uint8_t)g.profile[profile_id].vBatWarn();
@ -123,8 +123,8 @@ void GeneralEdit::on_calretrieve_PB_clicked()
if (ok) if (ok)
generalSettings.trainer.calib[i]=byte16; generalSettings.trainer.calib[i]=byte16;
} }
generalSettings.currentCalib=currentCalib; generalSettings.txCurrentCalibration=txCurrentCalibration;
generalSettings.vBatCalib=vBatCalib; generalSettings.txVoltageCalibration=txVoltageCalibration;
generalSettings.vBatWarn=vBatWarn; generalSettings.vBatWarn=vBatWarn;
if (GetCurrentFirmware()->getCapability(HasBatMeterRange)) { if (GetCurrentFirmware()->getCapability(HasBatMeterRange)) {
generalSettings.vBatMin = (int8_t) g.profile[profile_id].vBatMin(); generalSettings.vBatMin = (int8_t) g.profile[profile_id].vBatMin();
@ -225,8 +225,8 @@ void GeneralEdit::on_calstore_PB_clicked()
calib.append(QString("%1").arg((uint16_t)generalSettings.trainer.calib[i], 4, 16, QChar('0'))); calib.append(QString("%1").arg((uint16_t)generalSettings.trainer.calib[i], 4, 16, QChar('0')));
} }
g.profile[profile_id].trainerCalib( calib ); g.profile[profile_id].trainerCalib( calib );
g.profile[profile_id].vBatCalib( generalSettings.vBatCalib ); g.profile[profile_id].txVoltageCalibration( generalSettings.txVoltageCalibration );
g.profile[profile_id].currentCalib( generalSettings.currentCalib ); g.profile[profile_id].txCurrentCalibration( generalSettings.txCurrentCalibration );
g.profile[profile_id].vBatWarn( generalSettings.vBatWarn ); g.profile[profile_id].vBatWarn( generalSettings.vBatWarn );
if (GetCurrentFirmware()->getCapability(HasBatMeterRange)) { if (GetCurrentFirmware()->getCapability(HasBatMeterRange)) {
g.profile[profile_id].vBatMin( generalSettings.vBatMin ); g.profile[profile_id].vBatMin( generalSettings.vBatMin );

View file

@ -1118,8 +1118,8 @@ void MainWindow::createMenus()
languageMenu->addAction(germanLangAct); languageMenu->addAction(germanLangAct);
languageMenu->addAction(finnishLangAct); languageMenu->addAction(finnishLangAct);
languageMenu->addAction(frenchLangAct); languageMenu->addAction(frenchLangAct);
// languageMenu->addAction(hebrewLangAct);
languageMenu->addAction(italianLangAct); languageMenu->addAction(italianLangAct);
// languageMenu->addAction(hebrewLangAct);
languageMenu->addAction(polishLangAct); languageMenu->addAction(polishLangAct);
// languageMenu->addAction(portugueseLangAct); // languageMenu->addAction(portugueseLangAct);
languageMenu->addAction(spanishLangAct); languageMenu->addAction(spanishLangAct);
@ -1366,20 +1366,20 @@ void MainWindow::updateLanguageActions()
frenchLangAct->setChecked(true); frenchLangAct->setChecked(true);
else if (langId=="it_IT") else if (langId=="it_IT")
italianLangAct->setChecked(true); italianLangAct->setChecked(true);
else if (langId=="he_IL") // else if (langId=="he_IL")
hebrewLangAct->setChecked(true); // hebrewLangAct->setChecked(true);
else if (langId=="pl_PL") else if (langId=="pl_PL")
polishLangAct->setChecked(true); polishLangAct->setChecked(true);
else if (langId=="pt_PT") // else if (langId=="pt_PT")
portugueseLangAct->setChecked(true); // portugueseLangAct->setChecked(true);
else if (langId=="ru_RU")
russianLangAct->setChecked(true);
else if (langId=="es_ES") else if (langId=="es_ES")
spanishLangAct->setChecked(true); spanishLangAct->setChecked(true);
else if (langId=="sv_SE") else if (langId=="sv_SE")
swedishLangAct->setChecked(true); swedishLangAct->setChecked(true);
else if (langId=="nl_NL") // else if (langId=="ru_RU")
dutchLangAct->setChecked(true); // russianLangAct->setChecked(true);
// else if (langId=="nl_NL")
// dutchLangAct->setChecked(true);
} }
void MainWindow::updateIconThemeActions() void MainWindow::updateIconThemeActions()

View file

@ -262,20 +262,22 @@ class MainWindow : public QMainWindow
QAction *normalIconAct; QAction *normalIconAct;
QAction *bigIconAct; QAction *bigIconAct;
QAction *hugeIconAct; QAction *hugeIconAct;
QAction *sysLangAct; QAction *sysLangAct;
QAction *englishLangAct;
QAction *czechLangAct; QAction *czechLangAct;
QAction *germanLangAct; QAction *germanLangAct;
QAction *frenchLangAct; QAction *englishLangAct;
QAction *finnishLangAct; QAction *finnishLangAct;
QAction *frenchLangAct;
QAction *italianLangAct; QAction *italianLangAct;
QAction *hebrewLangAct; // QAction *hebrewLangAct;
QAction *polishLangAct; QAction *polishLangAct;
// QAction *portugueseLangAct;
QAction *spanishLangAct; QAction *spanishLangAct;
QAction *portugueseLangAct;
QAction *swedishLangAct; QAction *swedishLangAct;
QAction *russianLangAct; // QAction *russianLangAct;
QAction *dutchLangAct; // QAction *dutchLangAct;
QAction *openDocURLAct; QAction *openDocURLAct;
}; };

View file

@ -121,14 +121,14 @@ bool MixesPanel::AddMixerLine(int dest)
QString MixesPanel::getMixerText(int dest, bool * new_ch) QString MixesPanel::getMixerText(int dest, bool * new_ch)
{ {
QString str; QString str;
if (new_ch) *new_ch = 0; bool newChannel = false;
if (dest < 0) { if (dest < 0) {
str = modelPrinter.printMixerName(-dest); str = modelPrinter.printMixerName(-dest);
//highlight channel if needed //highlight channel if needed
if (-dest == (int)highlightedSource) { if (-dest == (int)highlightedSource) {
str = "<b>" + str + "</b>"; str = "<b>" + str + "</b>";
} }
if (new_ch) *new_ch = 1; newChannel = true;
} }
else { else {
MixData & mix = model->mixData[dest]; MixData & mix = model->mixData[dest];
@ -136,7 +136,7 @@ QString MixesPanel::getMixerText(int dest, bool * new_ch)
str = modelPrinter.printMixerName(mix.destCh); str = modelPrinter.printMixerName(mix.destCh);
if ((dest == 0) || (model->mixData[dest-1].destCh != mix.destCh)) { if ((dest == 0) || (model->mixData[dest-1].destCh != mix.destCh)) {
if (new_ch) *new_ch = 1; newChannel = true;
//highlight channel if needed //highlight channel if needed
if (mix.destCh == highlightedSource) { if (mix.destCh == highlightedSource) {
str = "<b>" + str + "</b>"; str = "<b>" + str + "</b>";
@ -146,8 +146,9 @@ QString MixesPanel::getMixerText(int dest, bool * new_ch)
str.fill(' '); str.fill(' ');
} }
str += modelPrinter.printMixerLine(mix, highlightedSource); str += modelPrinter.printMixerLine(mix, !newChannel, highlightedSource);
} }
if (new_ch) *new_ch = newChannel;
return str.replace(" ", "&nbsp;"); return str.replace(" ", "&nbsp;");
} }

View file

@ -167,8 +167,8 @@ ModulePanel::ModulePanel(QWidget *parent, ModelData & model, ModuleData & module
ui->label_module->setText(label); ui->label_module->setText(label);
// The protocols available on this board // The protocols available on this board
for (int i=0; i<PROTO_LAST; i++) { for (int i=0; i<PULSES_PROTOCOL_LAST; i++) {
if (GetEepromInterface()->isAvailable((Protocol)i, moduleIdx)) { if (GetEepromInterface()->isAvailable((PulsesProtocol)i, moduleIdx)) {
ui->protocol->addItem(ModelPrinter::printModuleProtocol(i), (QVariant)i); ui->protocol->addItem(ModelPrinter::printModuleProtocol(i), (QVariant)i);
if (i == module.protocol) ui->protocol->setCurrentIndex(ui->protocol->count()-1); if (i == module.protocol) ui->protocol->setCurrentIndex(ui->protocol->count()-1);
} }
@ -223,42 +223,42 @@ ModulePanel::~ModulePanel()
void ModulePanel::update() void ModulePanel::update()
{ {
unsigned int mask = 0; unsigned int mask = 0;
Protocol protocol = (Protocol)module.protocol; PulsesProtocol protocol = (PulsesProtocol)module.protocol;
unsigned int max_rx_num = 63; unsigned int max_rx_num = 63;
if (moduleIdx >= 0) { if (moduleIdx >= 0) {
mask |= MASK_PROTOCOL; mask |= MASK_PROTOCOL;
switch (protocol) { switch (protocol) {
case PXX_XJT_X16: case PULSES_PXX_XJT_X16:
case PXX_XJT_D8: case PULSES_PXX_XJT_D8:
case PXX_XJT_LR12: case PULSES_PXX_XJT_LR12:
case PXX_DJT: case PULSES_PXX_DJT:
mask |= MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT; mask |= MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT;
if ((protocol==PXX_XJT_X16) || (protocol==PXX_XJT_LR12)) mask |= MASK_FAILSAFES | MASK_RX_NUMBER; if ((protocol==PULSES_PXX_XJT_X16) || (protocol==PULSES_PXX_XJT_LR12)) mask |= MASK_FAILSAFES | MASK_RX_NUMBER;
break; break;
case LP45: case PULSES_LP45:
case DSM2: case PULSES_DSM2:
case DSMX: case PULSES_DSMX:
mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER; mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER;
module.channelsCount = 6; module.channelsCount = 6;
max_rx_num = 20; max_rx_num = 20;
break; break;
case PPM: case PULSES_PPM:
mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE| MASK_CHANNELS_COUNT; mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE| MASK_CHANNELS_COUNT;
if (IS_9XRPRO(firmware->getBoard())) { if (IS_9XRPRO(firmware->getBoard())) {
mask |= MASK_OPEN_DRAIN; mask |= MASK_OPEN_DRAIN;
} }
break; break;
case OFF: case PULSES_OFF:
default: default:
break; break;
} }
} }
else if (IS_TARANIS(firmware->getBoard())) { else if (IS_TARANIS(firmware->getBoard())) {
switch(model->trainerMode) { switch(model->trainerMode) {
case MASTER_JACK: case TRAINER_MASTER_JACK:
break; break;
case SLAVE_JACK: case TRAINER_SLAVE_JACK:
mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT; mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT;
break; break;
default: default:
@ -266,7 +266,7 @@ void ModulePanel::update()
break; break;
} }
} }
else if (model->trainerMode != MASTER_JACK) { else if (model->trainerMode != TRAINER_MASTER_JACK) {
mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT; mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT;
} }

View file

@ -533,6 +533,7 @@ void TelemetrySensorPanel::update()
bool cellsFieldsDisplayed = false; bool cellsFieldsDisplayed = false;
bool consFieldsDisplayed = false; bool consFieldsDisplayed = false;
bool ratioFieldsDisplayed = false; bool ratioFieldsDisplayed = false;
bool totalizeFieldsDisplayed = false;
bool sources12FieldsDisplayed = false; bool sources12FieldsDisplayed = false;
bool sources34FieldsDisplayed = false; bool sources34FieldsDisplayed = false;
@ -556,6 +557,7 @@ void TelemetrySensorPanel::update()
consFieldsDisplayed = (sensor.formula == SensorData::TELEM_FORMULA_CONSUMPTION); consFieldsDisplayed = (sensor.formula == SensorData::TELEM_FORMULA_CONSUMPTION);
sources12FieldsDisplayed = (sensor.formula <= SensorData::TELEM_FORMULA_MULTIPLY); sources12FieldsDisplayed = (sensor.formula <= SensorData::TELEM_FORMULA_MULTIPLY);
sources34FieldsDisplayed = (sensor.formula < SensorData::TELEM_FORMULA_MULTIPLY); sources34FieldsDisplayed = (sensor.formula < SensorData::TELEM_FORMULA_MULTIPLY);
totalizeFieldsDisplayed = (sensor.formula == SensorData::TELEM_FORMULA_TOTALIZE);
updateSourcesComboBox(ui->source1, true); updateSourcesComboBox(ui->source1, true);
updateSourcesComboBox(ui->source2, true); updateSourcesComboBox(ui->source2, true);
updateSourcesComboBox(ui->source3, true); updateSourcesComboBox(ui->source3, true);
@ -595,15 +597,15 @@ void TelemetrySensorPanel::update()
ui->offsetLabel->setVisible(ratioFieldsDisplayed && sensor.unit != SensorData::UNIT_RPMS); ui->offsetLabel->setVisible(ratioFieldsDisplayed && sensor.unit != SensorData::UNIT_RPMS);
ui->multiplierLabel->setVisible(sensor.unit == SensorData::UNIT_RPMS); ui->multiplierLabel->setVisible(sensor.unit == SensorData::UNIT_RPMS);
ui->offset->setVisible(ratioFieldsDisplayed); ui->offset->setVisible(ratioFieldsDisplayed);
ui->precLabel->setVisible(isConfigurable); ui->precLabel->setVisible(isConfigurable && sensor.unit != SensorData::UNIT_FAHRENHEIT);
ui->prec->setVisible(isConfigurable && sensor.unit != SensorData::UNIT_FAHRENHEIT); ui->prec->setVisible(isConfigurable && sensor.unit != SensorData::UNIT_FAHRENHEIT);
ui->unit->setVisible((sensor.type == SensorData::TELEM_TYPE_CALCULATED && (sensor.formula == SensorData::TELEM_FORMULA_DIST)) || isConfigurable); ui->unit->setVisible((sensor.type == SensorData::TELEM_TYPE_CALCULATED && (sensor.formula == SensorData::TELEM_FORMULA_DIST)) || isConfigurable);
ui->gpsSensorLabel->setVisible(gpsFieldsDisplayed); ui->gpsSensorLabel->setVisible(gpsFieldsDisplayed);
ui->gpsSensor->setVisible(gpsFieldsDisplayed); ui->gpsSensor->setVisible(gpsFieldsDisplayed);
ui->altSensorLabel->setVisible(gpsFieldsDisplayed); ui->altSensorLabel->setVisible(gpsFieldsDisplayed);
ui->altSensor->setVisible(gpsFieldsDisplayed); ui->altSensor->setVisible(gpsFieldsDisplayed);
ui->ampsSensorLabel->setVisible(consFieldsDisplayed); ui->ampsSensorLabel->setVisible(consFieldsDisplayed || totalizeFieldsDisplayed);
ui->ampsSensor->setVisible(consFieldsDisplayed); ui->ampsSensor->setVisible(consFieldsDisplayed || totalizeFieldsDisplayed);
ui->cellsSensorLabel->setVisible(cellsFieldsDisplayed); ui->cellsSensorLabel->setVisible(cellsFieldsDisplayed);
ui->cellsSensor->setVisible(cellsFieldsDisplayed); ui->cellsSensor->setVisible(cellsFieldsDisplayed);
ui->cellsIndex->setVisible(cellsFieldsDisplayed); ui->cellsIndex->setVisible(cellsFieldsDisplayed);
@ -749,7 +751,7 @@ TelemetryPanel::~TelemetryPanel()
void TelemetryPanel::update() void TelemetryPanel::update()
{ {
if (IS_TARANIS(firmware->getBoard())) { if (IS_TARANIS(firmware->getBoard())) {
if (model->moduleData[0].protocol == OFF && model->moduleData[1].protocol == PPM) { if (model->moduleData[0].protocol == PULSES_OFF && model->moduleData[1].protocol == PULSES_PPM) {
ui->telemetryProtocol->setEnabled(true); ui->telemetryProtocol->setEnabled(true);
} }
else { else {

View file

@ -62,7 +62,16 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<layout class="QGridLayout" name="rssiLayout" columnstretch="0,0,1"> <layout class="QGridLayout" name="rssiLayout" columnstretch="0,0,1">
<property name="margin"> <property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number> <number>4</number>
</property> </property>
<item row="2" column="0"> <item row="2" column="0">
@ -269,7 +278,16 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<layout class="QVBoxLayout" name="A1Layout"> <layout class="QVBoxLayout" name="A1Layout">
<property name="margin"> <property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number> <number>4</number>
</property> </property>
<item> <item>
@ -294,7 +312,16 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<layout class="QVBoxLayout" name="A2Layout"> <layout class="QVBoxLayout" name="A2Layout">
<property name="margin"> <property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number> <number>4</number>
</property> </property>
<item> <item>
@ -322,7 +349,16 @@
</sizepolicy> </sizepolicy>
</property> </property>
<layout class="QGridLayout" name="gridLayout_39"> <layout class="QGridLayout" name="gridLayout_39">
<property name="margin"> <property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number> <number>4</number>
</property> </property>
<property name="spacing"> <property name="spacing">
@ -571,7 +607,16 @@
</sizepolicy> </sizepolicy>
</property> </property>
<layout class="QGridLayout" name="gridLayout_40"> <layout class="QGridLayout" name="gridLayout_40">
<property name="margin"> <property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number> <number>4</number>
</property> </property>
<property name="spacing"> <property name="spacing">
@ -642,7 +687,16 @@
</sizepolicy> </sizepolicy>
</property> </property>
<layout class="QGridLayout" name="gridLayout_6"> <layout class="QGridLayout" name="gridLayout_6">
<property name="margin"> <property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number> <number>4</number>
</property> </property>
<property name="spacing"> <property name="spacing">
@ -893,7 +947,16 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<layout class="QGridLayout" name="sensorsLayout" columnstretch="0"> <layout class="QGridLayout" name="sensorsLayout" columnstretch="0">
<property name="margin"> <property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number> <number>4</number>
</property> </property>
<item row="1" column="0"> <item row="1" column="0">

View file

@ -272,7 +272,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text"> <property name="text">
<string>Amps Sensor :</string> <string>Sensor :</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -366,82 +366,82 @@
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Voltage (V)</string> <string>V</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Current (A)</string> <string>A</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Current (mA)</string> <string>mA</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Speed (kts)</string> <string>kt</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Speed (m/s)</string> <string>m/s</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Speed (ft/s)</string> <string>ft/s</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Speed (km/h)</string> <string>km/h</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Speed (miles/h)</string> <string>mph</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Meters (m)</string> <string>m</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Feet (ft)</string> <string>ft</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Temp (°C)</string> <string>°C</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Temp (°F)</string> <string>°F</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Percentage (%)</string> <string>%</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Energy (mAh)</string> <string>mAh</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Power (W)</string> <string>W</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>RF Power (dBm)</string> <string>dBm</string>
</property> </property>
</item> </item>
<item> <item>
@ -451,22 +451,22 @@
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Acceleration (g)</string> <string>g</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Heading (°)</string> <string>°</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Volume (mL)</string> <string>mL</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Volume (US fl.Oz.)</string> <string>US fl.Oz.</string>
</property> </property>
</item> </item>
</widget> </widget>

View file

@ -108,13 +108,13 @@ QString ModelPrinter::printModuleProtocol(unsigned int protocol)
QString ModelPrinter::printModule(int idx) QString ModelPrinter::printModule(int idx)
{ {
const ModuleData & module = model.moduleData[idx]; const ModuleData & module = model.moduleData[idx];
if (module.protocol == OFF) if (module.protocol == PULSES_OFF)
return printModuleProtocol(module.protocol); return printModuleProtocol(module.protocol);
else if (module.protocol == PPM) else if (module.protocol == PULSES_PPM)
return tr("%1, Channels(%2-%3), PPM delay(%4usec), Pulse polarity(%5)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount).arg(module.ppmDelay).arg(module.polarityToString()); return tr("%1, Channels(%2-%3), PPM delay(%4usec), Pulse polarity(%5)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount).arg(module.ppmDelay).arg(module.polarityToString());
else { else {
QString result = tr("%1, Channels(%2-%3)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount); QString result = tr("%1, Channels(%2-%3)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount);
if (module.protocol != PXX_XJT_D8) { if (module.protocol != PULSES_PXX_XJT_D8) {
result += " " + tr("Receiver number(%1)").arg(module.modelId); result += " " + tr("Receiver number(%1)").arg(module.modelId);
} }
return result; return result;
@ -327,21 +327,25 @@ QString ModelPrinter::printMixerName(int curDest)
return Qt::escape(str); return Qt::escape(str);
} }
QString ModelPrinter::printMixerLine(int idx, int highlightedSource) QString ModelPrinter::printMixerLine(int idx, bool showMultiplex, int highlightedSource)
{ {
return printMixerLine(model.mixData[idx], highlightedSource); return printMixerLine(model.mixData[idx], highlightedSource, showMultiplex);
} }
QString ModelPrinter::printMixerLine(const MixData & mix, int highlightedSource) QString ModelPrinter::printMixerLine(const MixData & mix, bool showMultiplex, int highlightedSource)
{ {
QString str = "&nbsp;"; QString str = "&nbsp;";
if (showMultiplex) {
switch(mix.mltpx) { switch(mix.mltpx) {
case (1): str += "*"; break; case (1): str += "*="; break;
case (2): str += "R"; break; case (2): str += ":="; break;
default: str += "&nbsp;"; break; default: str += "+="; break;
}; }
}
else {
str += "&nbsp;&nbsp;";
}
// highlight source if needed // highlight source if needed
QString source = Qt::escape(mix.srcRaw.toString(&model)); QString source = Qt::escape(mix.srcRaw.toString(&model));
if ( (mix.srcRaw.type == SOURCE_TYPE_CH) && (mix.srcRaw.index+1 == (int)highlightedSource) ) { if ( (mix.srcRaw.type == SOURCE_TYPE_CH) && (mix.srcRaw.index+1 == (int)highlightedSource) ) {

View file

@ -50,8 +50,8 @@ class ModelPrinter: public QObject
QString printInputLine(int idx); QString printInputLine(int idx);
QString printInputLine(const ExpoData & ed); QString printInputLine(const ExpoData & ed);
QString printMixerName(int curDest); QString printMixerName(int curDest);
QString printMixerLine(int idx, int highlightedSource = 0); QString printMixerLine(int idx, bool showMultiplex, int highlightedSource = 0);
QString printMixerLine(const MixData & md, int highlightedSource = 0); QString printMixerLine(const MixData & md, bool showMultiplex, int highlightedSource = 0);
QString printLogicalSwitchLine(int idx); QString printLogicalSwitchLine(int idx);
QString printCustomFunctionLine(int idx); QString printCustomFunctionLine(int idx);
static QString printChannelName(int idx); static QString printChannelName(int idx);

View file

@ -357,7 +357,7 @@ QString MultiModelPrinter::printMixers()
for (int j=0; j<count; j++) { for (int j=0; j<count; j++) {
if (j > 0) if (j > 0)
columns.append("<br/>"); columns.append("<br/>");
COMPARE((j < model->mixes(i).size()) ? modelPrinter->printMixerLine(*model->mixes(i)[j]) : "&nbsp;"); COMPARE((j < model->mixes(i).size()) ? modelPrinter->printMixerLine(*model->mixes(i)[j], (j>0)) : "&nbsp;");
} }
columns.append("</td></tr>"); columns.append("</td></tr>");
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -69,7 +69,7 @@ void saveGeneralSettings(GeneralSettings & settings, global_settings & gs)
// TODO BSS settings.currModel; // TODO BSS settings.currModel;
gs.contrast(settings.contrast); gs.contrast(settings.contrast);
gs.battery(battery(settings.vBatCalib, settings.vBatWarn)); gs.battery(battery(settings.txVoltageCalibration, settings.vBatWarn));
gs.ppm_input_calibration(ppm_input_calibration(settings.PPM_Multiplier, gs.ppm_input_calibration(ppm_input_calibration(settings.PPM_Multiplier,
PPMCalibration(settings.trainer.calib[0]), PPMCalibration(settings.trainer.calib[0]),
@ -124,7 +124,7 @@ void saveModel(ModelData & m, model & xm)
} }
} }
*/ */
if (m.moduleData[0].protocol != PPM || m.moduleData[0].channelsCount != 8 || m.moduleData[0].ppmDelay != 300 || m.moduleData[0].ppmPulsePol != 0) { if (m.moduleData[0].protocol != PULSES_PPM || m.moduleData[0].channelsCount != 8 || m.moduleData[0].ppmDelay != 300 || m.moduleData[0].ppmPulsePol != 0) {
modulation mod; modulation mod;
mod.type(modulation::type_type::value(m.moduleData[0].protocol)); mod.type(modulation::type_type::value(m.moduleData[0].protocol));
mod.channels(m.moduleData[0].channelsCount); mod.channels(m.moduleData[0].channelsCount);

View file

@ -4,18 +4,35 @@
<ul> <ul>
<li>Fixed several issues with D series altimeter/vario (negative values, hi/lo precision vario) (<a href=https://github.com/opentx/opentx/issues/2685>#2685</a>)</li> <li>Fixed several issues with D series altimeter/vario (negative values, hi/lo precision vario) (<a href=https://github.com/opentx/opentx/issues/2685>#2685</a>)</li>
<li>Auto-offset for Frsky variometer on per default (<a href=https://github.com/opentx/opentx/issues/2693>#2693</a>)</li> <li>Auto-offset for Frsky variometer on per default (<a href=https://github.com/opentx/opentx/issues/2693>#2693</a>)</li>
<li>9XE top LDC fixes: added TX battery blinking on battery warning, fixed display problem when battery voltage lower than batlow value. (<a href=https://github.com/opentx/opentx/issues/2671>#2671</a>)</li> <li>X9E top LDC fixes: added TX battery blinking on battery warning, fixed display problem when battery voltage lower than batlow value. (<a href=https://github.com/opentx/opentx/issues/2671>#2671</a>)</li>
<li>Timers range extended (it was limited to around 9 hours before) (<a href=https://github.com/opentx/opentx/issues/2702>#2702</a>)</li> <li>Timers range extended (it was limited to around 9 hours before) (<a href=https://github.com/opentx/opentx/issues/2702>#2702</a>)</li>
<li>Fixed: Playing two background sounds at once causes sound to stop (<a href=https://github.com/opentx/opentx/issues/2704>#2704</a>)</li> <li>Fixed: Playing two background sounds at once causes sound to stop (<a href=https://github.com/opentx/opentx/issues/2704>#2704</a>)</li>
<li>Several fixes to the SD card manager menu (<a href=https://github.com/opentx/opentx/issues/2623>#2623</a>)</li> <li>Several fixes to the SD card manager menu (<a href=https://github.com/opentx/opentx/issues/2623>#2623</a>)</li>
<li>Fixed the difference between top and main LCD TX battery bars on 9Xe (<a href=https://github.com/opentx/opentx/issues/2671>#2671</a>)</li> <li>Fixed the difference between top and main LCD TX battery bars on 9Xe (<a href=https://github.com/opentx/opentx/issues/2671>#2671</a>)</li>
<li>Several Lua getValue() fields were not exported correctly (tx-voltage, clock and timers1-3)</li> <li>Several Lua getValue() fields were not exported correctly (tx-voltage, clock and timers1-3)</li>
<li>Fixed: Edge Logical Switch could trigger right after the model was loaded or the radio turned on (<a href=https://github.com/opentx/opentx/issues/2728>#2728</a>)</li> <li>Fixed: Edge Logical Switch could trigger right after the model was loaded or the radio turned on (<a href=https://github.com/opentx/opentx/issues/2728>#2728</a>)</li>
<li>Fixed output channel jitter if trim was used (<a href=https://github.com/opentx/opentx/issues/2774>#2774</a>)</li>
<li>Some telemetry sensors did not work in logical switches if there were more than 16 sensors (<a href=https://github.com/opentx/opentx/issues/2787>#2787</a>)</li>
<li>Improved mixer screen layout (<a href=https://github.com/opentx/opentx/issues/2785>#2785</a>)</li>
</ul> </ul>
[X9E]
<ul>
<li>Unwanted radio turning off on watchdog reset fixed (<a href=https://github.com/opentx/opentx/issues/2681>#2681</a>, <a href=https://github.com/opentx/opentx/issues/2790>#2790</a>)</li>
<li>Added code to help mitigate the issue of RTC loosing its time when radio was turned off (<a href=https://github.com/opentx/opentx/issues/2626>#2626</a>)</li>
</ul>
[Sky9x / 9XR-PRO] [Sky9x / 9XR-PRO]
<ul> <ul>
<li>Sound was unintelligible (<a href=https://github.com/opentx/opentx/issues/2665>#2665</a>)</li> <li>Sound was unintelligible (<a href=https://github.com/opentx/opentx/issues/2665>#2665</a>)</li>
<li>PXX wasn't enabled</li>
</ul>
[All]
<ul>
<li>Various texts and translations corrections</li>
<li>Various small bug-fixes</li>
</ul> </ul>

View file

@ -273,6 +273,10 @@ SHUTDOWN_CONFIRMATION = NO
# Values = YES, NO # Values = YES, NO
DEBUG = NO DEBUG = NO
# Activate Command Line Interpreter
# Values = NO, YES
CLI = NO
# Activate writing of SPORT telemetry received data to sport.log file # Activate writing of SPORT telemetry received data to sport.log file
# Values = YES, NO # Values = YES, NO
SPORT_FILE_LOG = NO SPORT_FILE_LOG = NO
@ -306,9 +310,10 @@ LUA = NO
MENUS_LOCK = NO MENUS_LOCK = NO
# USB options in the main image # USB options in the main image
# Values = JOYSTICK, MASSSTORAGE # Values = JOYSTICK, MASSSTORAGE, SERIAL
# JOYSTICK: The TX will appear as a joystick # JOYSTICK: The TX will appear as a joystick
# MASSSTORAGE: The TX will appear as a drive # MASSSTORAGE: The TX will appear as a drive
# SERIAL: The TX will appear as a serial port
USB = JOYSTICK USB = JOYSTICK
# Mixers monitor view added to Channels monitor one # Mixers monitor view added to Channels monitor one
@ -366,6 +371,10 @@ SIMU_DISKIO = NO
# Values = NO, YES # Values = NO, YES
SIMU_AUDIO = NO SIMU_AUDIO = NO
# Enable Watchdog test (DANGEROUS)
# Values = NO, YES
WATCHDOG_TEST = NO
#------- END BUILD OPTIONS --------------------------- #------- END BUILD OPTIONS ---------------------------
# Define programs and commands. # Define programs and commands.
@ -811,7 +820,7 @@ ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X))
EEPROMSRC = eeprom_common.cpp eeprom_raw.cpp eeprom_conversions.cpp EEPROMSRC = eeprom_common.cpp eeprom_raw.cpp eeprom_conversions.cpp
PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp pulses/dsm2_arm.cpp PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp pulses/dsm2_arm.cpp
CPPSRC += tasks_arm.cpp audio_arm.cpp haptic.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp telemetry/telemetry.cpp CPPSRC += tasks_arm.cpp audio_arm.cpp haptic.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp telemetry/telemetry.cpp
CPPSRC += targets/sky9x/telemetry_driver.cpp targets/sky9x/second_serial_driver.cpp targets/sky9x/pwr_driver.cpp targets/sky9x/adc_driver.cpp targets/sky9x/eeprom_driver.cpp targets/sky9x/pulses_driver.cpp targets/sky9x/keys_driver.cpp targets/sky9x/audio_driver.cpp targets/sky9x/buzzer_driver.cpp targets/sky9x/haptic_driver.cpp targets/sky9x/sdcard_driver.cpp targets/sky9x/massstorage.cpp CPPSRC += targets/sky9x/telemetry_driver.cpp targets/sky9x/serial2_driver.cpp targets/sky9x/pwr_driver.cpp targets/sky9x/adc_driver.cpp targets/sky9x/eeprom_driver.cpp targets/sky9x/pulses_driver.cpp targets/sky9x/keys_driver.cpp targets/sky9x/audio_driver.cpp targets/sky9x/buzzer_driver.cpp targets/sky9x/haptic_driver.cpp targets/sky9x/sdcard_driver.cpp targets/sky9x/massstorage.cpp
CPPSRC += loadboot.cpp debug.cpp CPPSRC += loadboot.cpp debug.cpp
BITMAPS += bitmaps/9X/splash.lbm bitmaps/9X/asterisk.lbm bitmaps/9X/about.lbm BITMAPS += bitmaps/9X/splash.lbm bitmaps/9X/asterisk.lbm bitmaps/9X/about.lbm
ifeq ($(SDCARD), YES) ifeq ($(SDCARD), YES)
@ -928,17 +937,20 @@ ifeq ($(PCB), TARANIS)
LDSCRIPT = targets/taranis/stm32f2_flash.ld LDSCRIPT = targets/taranis/stm32f2_flash.ld
endif endif
STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries
INCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc INCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc
INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc
INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc
INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc
INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc
GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp
BOARDSRC = main_arm.cpp targets/taranis/board_taranis.cpp BOARDSRC = main_arm.cpp targets/taranis/board_taranis.cpp
EXTRABOARDSRC += targets/taranis/configure_pins.cpp targets/taranis/lcd_driver.cpp targets/taranis/flash_driver.cpp targets/taranis/i2c_driver.cpp targets/taranis/aspi.c targets/taranis/delays.c EXTRABOARDSRC += targets/taranis/configure_pins.cpp targets/taranis/lcd_driver.cpp targets/taranis/flash_driver.cpp targets/taranis/i2c_driver.cpp targets/taranis/aspi.c targets/taranis/delays.c serial.cpp
SRC += $(COOSDIR)/kernel/core.c $(COOSDIR)/kernel/hook.c $(COOSDIR)/kernel/task.c $(COOSDIR)/kernel/event.c $(COOSDIR)/kernel/time.c $(COOSDIR)/kernel/timer.c $(COOSDIR)/kernel/flag.c $(COOSDIR)/kernel/mutex.c $(COOSDIR)/kernel/serviceReq.c $(COOSDIR)/portable/GCC/port.c $(COOSDIR)/portable/arch.c SRC += $(COOSDIR)/kernel/core.c $(COOSDIR)/kernel/hook.c $(COOSDIR)/kernel/task.c $(COOSDIR)/kernel/event.c $(COOSDIR)/kernel/time.c $(COOSDIR)/kernel/timer.c $(COOSDIR)/kernel/flag.c $(COOSDIR)/kernel/mutex.c $(COOSDIR)/kernel/serviceReq.c $(COOSDIR)/portable/GCC/port.c $(COOSDIR)/portable/arch.c
SRC += targets/taranis/pwr_driver.c targets/taranis/usb_driver.c SRC += targets/taranis/pwr_driver.c targets/taranis/usb_driver.c
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp eeprom_conversions.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp eeprom_conversions.cpp
PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp
CPPSRC += tasks_arm.cpp audio_arm.cpp sbus.cpp telemetry/telemetry.cpp CPPSRC += tasks_arm.cpp audio_arm.cpp sbus.cpp telemetry/telemetry.cpp
CPPSRC += targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/uart3_driver.cpp targets/taranis/telemetry_driver.cpp CPPSRC += targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/serial2_driver.cpp targets/taranis/telemetry_driver.cpp
CPPSRC += bmp.cpp gui/$(GUIDIRECTORY)/view_channels.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp debug.cpp CPPSRC += bmp.cpp gui/$(GUIDIRECTORY)/view_channels.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp debug.cpp
CPPSRC += loadboot.cpp CPPSRC += loadboot.cpp
ifeq ($(PCBREV), REV9E) ifeq ($(PCBREV), REV9E)
@ -981,6 +993,10 @@ ifeq ($(PCB), TARANIS)
ifeq ($(USB), JOYSTICK) ifeq ($(USB), JOYSTICK)
CPPDEFS += -DUSB_JOYSTICK CPPDEFS += -DUSB_JOYSTICK
SRC += targets/taranis/usbd_hid_joystick.c SRC += targets/taranis/usbd_hid_joystick.c
else ifeq ($(USB), SERIAL)
CPPDEFS += -DUSB_SERIAL
SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c
EXTRABOARDSRC += targets/taranis/usbd_cdc.cpp
else else
CPPDEFS += -DUSB_MASS_STORAGE CPPDEFS += -DUSB_MASS_STORAGE
SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c
@ -1036,6 +1052,9 @@ ifeq ($(PCB), TARANIS)
ifeq ($(MIXERS_MONITOR), YES) ifeq ($(MIXERS_MONITOR), YES)
CPPDEFS += -DMIXERS_MONITOR CPPDEFS += -DMIXERS_MONITOR
endif endif
ifeq ($(WATCHDOG_TEST), YES)
CPPDEFS += -DWATCHDOG_TEST
endif
endif endif
CC = $(TRGT)gcc CC = $(TRGT)gcc
@ -1255,7 +1274,7 @@ endif
ifeq ($(EXT), MAVLINK) ifeq ($(EXT), MAVLINK)
CPPDEFS += -DMAVLINK CPPDEFS += -DMAVLINK
INCDIRS += thirdparty INCDIRS += thirdparty
CPPSRC += telemetry/mavlink.cpp gui/$(GUIDIRECTORY)/view_mavlink.cpp serial.cpp CPPSRC += telemetry/mavlink.cpp gui/$(GUIDIRECTORY)/view_mavlink.cpp targets/common_avr/serial_driver.cpp
EEPROM_VARIANT += ${MAVLINK_VARIANT} EEPROM_VARIANT += ${MAVLINK_VARIANT}
endif endif
@ -1297,8 +1316,15 @@ ifeq ($(EXT), $(filter $(EXT), FRSKY FRSKY_SPORT TELEMETREZ))
EEPROM_VARIANT += ${FRSKY_VARIANT} EEPROM_VARIANT += ${FRSKY_VARIANT}
endif endif
ifeq ($(DEBUG), YES) ifeq ($(SIMU), YES)
CPPDEFS += -DDEBUG CPPDEFS += -DDEBUG
CPPSRC += dump.cpp
else ifeq ($(CLI), YES)
CPPDEFS += -DCLI -DDEBUG
CPPSRC += cli.cpp dump.cpp
else ifeq ($(DEBUG), YES)
CPPDEFS += -DDEBUG
CPPSRC += dump.cpp
endif endif
ifeq ($(EEPROM_PROGRESS_BAR), YES) ifeq ($(EEPROM_PROGRESS_BAR), YES)

View file

@ -305,24 +305,28 @@ void getPhaseAudioFile(char * filename, int index, unsigned int event)
void getSwitchAudioFile(char * filename, int index) void getSwitchAudioFile(char * filename, int index)
{ {
char * str = getModelAudioPath(filename); char * str = getModelAudioPath(filename);
int len = STR_VSWITCHES[0];
strncpy(str, &STR_VSWITCHES[1+len*(index+1)], len); #if defined(PCBTARANIS)
str += len-1; if (index <= SWSRC_LAST_SWITCH) {
if (*str == '\300') { div_t swinfo = switchInfo(index);
strcpy(str, "-up"); *str++ = 'S';
str += 3; *str++ = 'A' + swinfo.quot;
} const char * positions[] = { "-up", "-mid", "-down" };
else if (*str == '-') { strcpy(str, positions[swinfo.rem]);
strcpy(str, "-mid");
str += 4;
}
else if (*str == '\301') {
strcpy(str, "-down");
str += 5;
} }
else { else {
*(str+1) = 0; div_t swinfo = div(index - SWSRC_FIRST_MULTIPOS_SWITCH, XPOTS_MULTIPOS_COUNT);
*str++ = 'S';
*str++ = '1' + swinfo.quot;
*str++ = '1' + swinfo.rem;
*str = '\0';
} }
#else
int len = STR_VSWITCHES[0];
strncpy(str, &STR_VSWITCHES[1+(len*index)], len);
str += len;
*str = '\0';
#endif
strcat(str, SOUNDS_EXT); strcat(str, SOUNDS_EXT);
} }
@ -381,7 +385,7 @@ void referenceModelAudioFiles()
} }
// Switches Audio Files <switchname>-[up|mid|down].wav // Switches Audio Files <switchname>-[up|mid|down].wav
for (int i=0; i<SWSRC_LAST_SWITCH+NUM_XPOTS*XPOTS_MULTIPOS_COUNT && !found; i++) { for (int i=SWSRC_FIRST_SWITCH; i<=SWSRC_LAST_SWITCH+NUM_XPOTS*XPOTS_MULTIPOS_COUNT && !found; i++) {
getSwitchAudioFile(path, i); getSwitchAudioFile(path, i);
// TRACE("referenceModelAudioFiles(): searching for %s in %s", filename, fn); // TRACE("referenceModelAudioFiles(): searching for %s in %s", filename, fn);
if (!strcasecmp(filename, fn)) { if (!strcasecmp(filename, fn)) {

View file

@ -306,8 +306,15 @@ void audioStart();
#define AUDIO_ERROR() AUDIO_BUZZER(audioEvent(AU_ERROR), beep(4)) #define AUDIO_ERROR() AUDIO_BUZZER(audioEvent(AU_ERROR), beep(4))
#define AUDIO_TIMER_30() AUDIO_BUZZER(audioEvent(AU_TIMER_30), { beepAgain=2; beep(2); }) #define AUDIO_TIMER_30() AUDIO_BUZZER(audioEvent(AU_TIMER_30), { beepAgain=2; beep(2); })
#define AUDIO_TIMER_20() AUDIO_BUZZER(audioEvent(AU_TIMER_20), { beepAgain=1; beep(2); }) #define AUDIO_TIMER_20() AUDIO_BUZZER(audioEvent(AU_TIMER_20), { beepAgain=1; beep(2); })
#if defined(HAPTIC)
#define AUDIO_TIMER_LT10(m, x) do { if (m==COUNTDOWN_VOICE) playNumber(x, 0, 0, 0); else if (m==COUNTDOWN_HAPTIC) haptic.event(AU_TIMER_LT10); else AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2)); } while(0)
#define AUDIO_TIMER_00(m) do { if (m==COUNTDOWN_VOICE) playNumber(0, 0, 0, 0); else if (m==COUNTDOWN_HAPTIC) haptic.event(AU_TIMER_00); else AUDIO_BUZZER(audioEvent(AU_TIMER_00), beep(3)); } while(0)
#else
#define AUDIO_TIMER_LT10(m, x) do { if (m==COUNTDOWN_VOICE) playNumber(x, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2)); } while(0) #define AUDIO_TIMER_LT10(m, x) do { if (m==COUNTDOWN_VOICE) playNumber(x, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2)); } while(0)
#define AUDIO_TIMER_00(m) do { if (m==COUNTDOWN_VOICE) playNumber(0, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_00), beep(3)); } while(0) #define AUDIO_TIMER_00(m) do { if (m==COUNTDOWN_VOICE) playNumber(0, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_00), beep(3)); } while(0)
#endif
#define AUDIO_INACTIVITY() AUDIO_BUZZER(audioEvent(AU_INACTIVITY), beep(3)) #define AUDIO_INACTIVITY() AUDIO_BUZZER(audioEvent(AU_INACTIVITY), beep(3))
#define AUDIO_MIX_WARNING(x) AUDIO_BUZZER(audioEvent(AU_MIX_WARNING_1+x-1), beep(1)) #define AUDIO_MIX_WARNING(x) AUDIO_BUZZER(audioEvent(AU_MIX_WARNING_1+x-1), beep(1))
#define AUDIO_POT_MIDDLE(x) AUDIO_BUZZER(audioEvent(AU_STICK1_MIDDLE+x), beep(2)) #define AUDIO_POT_MIDDLE(x) AUDIO_BUZZER(audioEvent(AU_STICK1_MIDDLE+x), beep(2))

View file

@ -62,7 +62,7 @@ void audioQueue::heartbeat()
else { else {
#if defined(CPUM2560) #if defined(CPUM2560)
if (toneFreq) { if (toneFreq) {
OCR0A = (5000 / toneFreq); // sticking with old values approx 20(abs. min) to 90, 60 being the default tone(?). OCR4A = (5000 / toneFreq); // sticking with old values approx 20(abs. min) to 90, 60 being the default tone(?).
speakerOn(); speakerOn();
} }
#endif #endif
@ -88,7 +88,7 @@ void audioQueue::heartbeat()
if (tone2TimeLeft > 0) { if (tone2TimeLeft > 0) {
#if defined(CPUM2560) #if defined(CPUM2560)
if (tone2Freq) { if (tone2Freq) {
OCR0A = (5000 / tone2Freq); // sticking with old values approx 20(abs. min) to 90, 60 being the default tone(?). OCR4A = (5000 / tone2Freq); // sticking with old values approx 20(abs. min) to 90, 60 being the default tone(?).
speakerOn(); speakerOn();
} }
#else #else

View file

@ -39,11 +39,11 @@ void * bin_realloc(void * ptr, size_t size)
// if it fits in current slot, return it // if it fits in current slot, return it
// TODO if new size is smaller, try to relocate in smaller slot // TODO if new size is smaller, try to relocate in smaller slot
if ( slots1.can_fit(ptr, size) ) { if ( slots1.can_fit(ptr, size) ) {
// TRACE("OUR realloc %p[%lu] fits in slot1", ptr, size); FLUSH(); // TRACE("OUR realloc %p[%lu] fits in slot1", ptr, size);
return ptr; return ptr;
} }
if ( slots2.can_fit(ptr, size) ) { if ( slots2.can_fit(ptr, size) ) {
// TRACE("OUR realloc %p[%lu] fits in slot2", ptr, size); FLUSH(); // TRACE("OUR realloc %p[%lu] fits in slot2", ptr, size);
return ptr; return ptr;
} }
@ -51,10 +51,10 @@ void * bin_realloc(void * ptr, size_t size)
void * res = bin_malloc(size); void * res = bin_malloc(size);
if (res == 0) { if (res == 0) {
// we don't have the space, use libc malloc // we don't have the space, use libc malloc
// TRACE("bin_malloc [%lu] FAILURE", size); FLUSH(); // TRACE("bin_malloc [%lu] FAILURE", size);
res = malloc(size); res = malloc(size);
if (res == 0) { if (res == 0) {
TRACE("libc malloc [%lu] FAILURE", size); FLUSH(); TRACE("libc malloc [%lu] FAILURE", size);
return 0; return 0;
} }
} }
@ -73,7 +73,7 @@ void *bin_l_alloc (void *ud, void *ptr, size_t osize, size_t nsize)
if (ptr) { // avoid a bunch of NULL pointer free calls if (ptr) { // avoid a bunch of NULL pointer free calls
if (!bin_free(ptr)) { if (!bin_free(ptr)) {
// not our range, use libc allocator // not our range, use libc allocator
// TRACE("libc free %p", ptr); FLUSH(); // TRACE("libc free %p", ptr);
free(ptr); free(ptr);
} }
} }
@ -89,18 +89,18 @@ void *bin_l_alloc (void *ud, void *ptr, size_t osize, size_t nsize)
} }
if ( SimulateMallocFailure > 0) { if ( SimulateMallocFailure > 0) {
// simulate one malloc failure // simulate one malloc failure
TRACE("bin_l_alloc(): simulating malloc failure at %p[%lu]", ptr, nsize); FLUSH(); TRACE("bin_l_alloc(): simulating malloc failure at %p[%lu]", ptr, nsize);
return 0; return 0;
} }
#endif // #if defined(DEBUG) #endif // #if defined(DEBUG)
// try our allocator, if it fails use libc allocator // try our allocator, if it fails use libc allocator
void * res = bin_realloc(ptr, nsize); void * res = bin_realloc(ptr, nsize);
if (res && ptr) { if (res && ptr) {
// TRACE("OUR realloc %p[%lu] -> %p[%lu]", ptr, osize, res, nsize); FLUSH(); // TRACE("OUR realloc %p[%lu] -> %p[%lu]", ptr, osize, res, nsize);
} }
if (res == 0) { if (res == 0) {
res = realloc(ptr, nsize); res = realloc(ptr, nsize);
// TRACE("libc realloc %p[%lu] -> %p[%lu]", ptr, osize, res, nsize); FLUSH(); // TRACE("libc realloc %p[%lu] -> %p[%lu]", ptr, osize, res, nsize);
// if (res == 0 ){ // if (res == 0 ){
// TRACE("realloc FAILURE %lu", nsize); // TRACE("realloc FAILURE %lu", nsize);
// dumpFreeMemory(); // dumpFreeMemory();

View file

@ -20,7 +20,7 @@ public:
if (ptr == Bins[n].data) { if (ptr == Bins[n].data) {
Bins[n].Used = false; Bins[n].Used = false;
--NoUsedBins; --NoUsedBins;
// TRACE("\tBinAllocator<%d> free %lu ------", SIZE_SLOT, n); FLUSH(); // TRACE("\tBinAllocator<%d> free %lu ------", SIZE_SLOT, n);
return true; return true;
} }
} }
@ -31,22 +31,22 @@ public:
} }
void * malloc(size_t size) { void * malloc(size_t size) {
if (size > SIZE_SLOT) { if (size > SIZE_SLOT) {
// TRACE("BinAllocator<%d> malloc [%lu] size > SIZE_SLOT", SIZE_SLOT, size); FLUSH(); // TRACE("BinAllocator<%d> malloc [%lu] size > SIZE_SLOT", SIZE_SLOT, size);
return 0; return 0;
} }
if (NoUsedBins >= NUM_BINS) { if (NoUsedBins >= NUM_BINS) {
// TRACE("BinAllocator<%d> malloc [%lu] no free slots", SIZE_SLOT, size); FLUSH(); // TRACE("BinAllocator<%d> malloc [%lu] no free slots", SIZE_SLOT, size);
return 0; return 0;
} }
for (size_t n = 0; n < NUM_BINS; ++n) { for (size_t n = 0; n < NUM_BINS; ++n) {
if (!Bins[n].Used) { if (!Bins[n].Used) {
Bins[n].Used = true; Bins[n].Used = true;
++NoUsedBins; ++NoUsedBins;
// TRACE("\tBinAllocator<%d> malloc %lu[%lu]", SIZE_SLOT, n, size); FLUSH(); // TRACE("\tBinAllocator<%d> malloc %lu[%lu]", SIZE_SLOT, n, size);
return Bins[n].data; return Bins[n].data;
} }
} }
// TRACE("BinAllocator<%d> malloc [%lu] no free slots", SIZE_SLOT , size); FLUSH(); // TRACE("BinAllocator<%d> malloc [%lu] no free slots", SIZE_SLOT , size);
return 0; return 0;
} }
size_t size(void * ptr) { size_t size(void * ptr) {

353
radio/src/cli.cpp Normal file
View file

@ -0,0 +1,353 @@
/*
* 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"
#include <ctype.h>
#define CLI_COMMAND_MAX_ARGS 8
#define CLI_COMMAND_MAX_LEN 256
OS_TID cliTaskId;
TaskStack<CLI_STACK_SIZE> cliStack;
Fifo<256> cliRxFifo;
uint8_t cliTracesEnabled = false;
typedef int (* CliFunction) (const char ** args);
struct CliCommand
{
const char * name;
CliFunction func;
const char * args;
};
struct MemArea
{
const char * name;
void * start;
int size;
};
void cliPrompt()
{
serialPutc('>');
}
int toInt(const char ** argv, int index, int * val)
{
if (*argv[index] == '\0') {
return 0;
}
else {
int base = 10;
const char * s = argv[index];
if (strlen(s) > 2 && s[0] == '0' && s[1] == 'x') {
base = 16;
s = &argv[index][2];
}
char * endptr = NULL;
*val = strtol(s, &endptr, base);
if (*endptr == '\0')
return 1;
else {
serialPrint("%s: Invalid argument \"%s\"", argv[0], argv[index]);
return -1;
}
}
}
int cliBeep(const char ** argv)
{
int freq = BEEP_DEFAULT_FREQ;
int duration = 100;
if (toInt(argv, 1, &freq) >= 0 && toInt(argv, 2, &duration) >= 0) {
audioQueue.playTone(freq, duration, 20, PLAY_NOW);
}
return 0;
}
int cliPlay(const char ** argv)
{
audioQueue.playFile(argv[1], PLAY_NOW);
return 0;
}
int cliLs(const char ** argv)
{
FILINFO fno;
DIR dir;
char *fn; /* This function is assuming non-Unicode cfg. */
#if _USE_LFN
TCHAR lfn[_MAX_LFN + 1];
fno.lfname = lfn;
fno.lfsize = sizeof(lfn);
#endif
FRESULT res = f_opendir(&dir, argv[1]); /* Open the directory */
if (res == FR_OK) {
for (;;) {
res = f_readdir(&dir, &fno); /* Read a directory item */
if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */
#if _USE_LFN
fn = *fno.lfname ? fno.lfname : fno.fname;
#else
fn = fno.fname;
#endif
serialPrint(fn);
}
}
else {
serialPrint("%s: Invalid directory \"%s\"", argv[0], argv[1]);
}
return 0;
}
int cliTrace(const char ** argv)
{
if (!strcmp(argv[1], "on")) {
cliTracesEnabled = true;
}
else if (!strcmp(argv[1], "off")) {
cliTracesEnabled = false;
}
else {
serialPrint("%s: Invalid argument \"%s\"", argv[0], argv[1]);
}
return 0;
}
int cliStackInfo(const char ** argv)
{
int tid = 0;
if (toInt(argv, 1, &tid) > 0) {
int available = 0;
int total = 0;
switch(tid) {
case MENU_TASK_INDEX:
total = menusStack.size();
available = menusStack.available();
break;
case MIXER_TASK_INDEX:
total = mixerStack.size();
available = mixerStack.available();
break;
case AUDIO_TASK_INDEX:
total = audioStack.size();
available = audioStack.available();
break;
case CLI_TASK_INDEX:
total = cliStack.size();
available = cliStack.available();
break;
case MAIN_TASK_INDEX:
total = stackAvailable();
available = stackSize();
break;
default:
break;
}
serialPrint("%d available (%d total)", available, total);
}
else {
serialPrint("%s: Invalid argument \"%s\"", argv[0], argv[1]);
}
return 0;
}
int cliVolume(const char ** argv)
{
int level = 0;
if (toInt(argv, 1, &level) > 0) {
setVolume(level);
}
else {
serialPrint("%s: Invalid argument \"%s\"", argv[0], argv[1]);
}
return 0;
}
const MemArea memAreas[] = {
{ "RCC", RCC, sizeof(RCC_TypeDef) },
{ "GPIOA", GPIOA, sizeof(GPIO_TypeDef) },
{ "GPIOB", GPIOB, sizeof(GPIO_TypeDef) },
{ "GPIOC", GPIOC, sizeof(GPIO_TypeDef) },
{ "GPIOD", GPIOD, sizeof(GPIO_TypeDef) },
{ "GPIOE", GPIOE, sizeof(GPIO_TypeDef) },
{ "GPIOF", GPIOF, sizeof(GPIO_TypeDef) },
{ "GPIOG", GPIOG, sizeof(GPIO_TypeDef) },
{ "USART1", USART1, sizeof(USART_TypeDef) },
{ "USART3", USART3, sizeof(USART_TypeDef) },
{ NULL, NULL, 0 },
};
int cliDisplay(const char ** argv)
{
int address = 0;
for (const MemArea * area = memAreas; area->name != NULL; area++) {
if (!strcmp(area->name, argv[1])) {
dump((uint8_t *)area->start, area->size);
return 0;
}
}
if (!strcmp(argv[1], "adc")) {
for (int i=0; i<NUMBER_ANALOG; i++) {
serialPrint("adc[%d] = %04X", i, Analog_values[i]);
}
}
else if (!strcmp(argv[1], "outputs")) {
for (int i=0; i<NUM_CHNOUT; i++) {
serialPrint("outputs[%d] = %04X", i, channelOutputs[i]);
}
}
else if (toInt(argv, 1, &address) > 0) {
int size = 256;
if (toInt(argv, 2, &size) >= 0) {
dump((uint8_t *)address, size);
}
}
return 0;
}
int cliHelp(const char ** argv);
const CliCommand cliCommands[] = {
{ "beep", cliBeep, "[<frequency>] [<duration>]" },
{ "ls", cliLs, "<directory>" },
{ "play", cliPlay, "<filename>" },
{ "print", cliDisplay, "<address> [<size>] | <what>" },
{ "stackinfo", cliStackInfo, "<tid>" },
{ "trace", cliTrace, "on | off" },
{ "volume", cliVolume, "<level>" },
{ "help", cliHelp, "[<command>]" },
{ NULL, NULL, NULL } /* sentinel */
};
int cliHelp(const char ** argv)
{
for (const CliCommand * command = cliCommands; command->name != NULL; command++) {
if (argv[1][0] == '\0' || !strcmp(command->name, argv[0])) {
serialPrint("%s %s", command->name, command->args);
if (argv[1][0] != '\0') {
return 0;
}
}
}
if (argv[1][0] != '\0') {
serialPrint("Invalid command \"%s\"", argv[0]);
}
return -1;
}
int cliExecCommand(const char ** argv)
{
if (argv[0][0] == '\0')
return 0;
for (const CliCommand * command = cliCommands; command->name != NULL; command++) {
if (!strcmp(command->name, argv[0])) {
return command->func(argv);
}
}
serialPrint("Invalid command \"%s\"", argv[0]);
return -1;
}
int cliExecLine(char * line)
{
int len = strlen(line);
const char * argv[CLI_COMMAND_MAX_ARGS];
memset(argv, 0, sizeof(argv));
int argc = 1;
argv[0] = line;
for (int i=0; i<len; i++) {
if (line[i] == ' ') {
line[i] = '\0';
if (argc < CLI_COMMAND_MAX_ARGS) {
argv[argc++] = &line[i+1];
}
}
}
return cliExecCommand(argv);
}
void cliTask(void * pdata)
{
char line[CLI_COMMAND_MAX_LEN+1];
int pos = 0;
cliPrompt();
for (;;) {
uint8_t c;
while (!cliRxFifo.pop(c)) {
CoTickDelay(10); // 20ms
}
if (c == 12) {
// clear screen
serialPrint("\033[2J\033[1;1H");
cliPrompt();
}
else if (c == 127) {
// backspace
if (pos) {
line[--pos] = '\0';
serialPutc(c);
}
}
else if (c == '\r' || c == '\n') {
// enter
serialCrlf();
line[pos] = '\0';
cliExecLine(line);
pos = 0;
cliPrompt();
}
else if (isascii(c) && pos < CLI_COMMAND_MAX_LEN) {
line[pos++] = c;
serialPutc(c);
}
}
}
void cliStart()
{
cliTaskId = CoCreateTaskEx(cliTask, NULL, 10, &cliStack.stack[CLI_STACK_SIZE-1], CLI_STACK_SIZE, 1, false);
}

54
radio/src/cli.h Normal file
View file

@ -0,0 +1,54 @@
/*
* 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.
*
*/
#ifndef _CLI_H_
#define _CLI_H_
#include "serial.h"
extern uint8_t cliTracesEnabled;
#ifdef __cplusplus
#include "fifo.h"
extern Fifo<256> cliRxFifo;
#include "tasks_arm.h"
#define CLI_STACK_SIZE 1000
extern TaskStack<CLI_STACK_SIZE> cliStack;
#endif
void cliStart();
#endif // _CLI_H_

View file

@ -34,27 +34,16 @@
* *
*/ */
extern "C" {
#include <stdio.h>
#include <stdarg.h>
}
#include "opentx.h" #include "opentx.h"
#include <stdarg.h>
#if (defined(DEBUG) && defined(CPUARM)) || defined(SIMU)
#if defined(SIMU) #if defined(SIMU)
traceCallbackFunc traceCallback = 0; traceCallbackFunc traceCallback = 0;
#endif #endif
#if defined(SIMU) #if defined(SIMU)
#define PRINTF_BUFFER_SIZE 1024 #define PRINTF_BUFFER_SIZE 1024
#else void debugPrintf(const char * format, ...)
#define PRINTF_BUFFER_SIZE 256
#endif
// Outputs a string to the UART
void debugPuts(const char *format, ...)
{ {
va_list arglist; va_list arglist;
char tmp[PRINTF_BUFFER_SIZE]; char tmp[PRINTF_BUFFER_SIZE];
@ -62,197 +51,17 @@ void debugPuts(const char *format, ...)
va_start(arglist, format); va_start(arglist, format);
vsnprintf(tmp, PRINTF_BUFFER_SIZE, format, arglist); vsnprintf(tmp, PRINTF_BUFFER_SIZE, format, arglist);
va_end(arglist); va_end(arglist);
#if defined(SIMU)
fputs(tmp, stdout); fputs(tmp, stdout);
fflush(stdout); fflush(stdout);
if (traceCallback) { if (traceCallback) {
traceCallback(tmp); traceCallback(tmp);
} }
#else }
const char *t = tmp;
while (*t) {
debugPutc(*t++);
}
#endif #endif
}
void dump(unsigned char *data, unsigned int size)
{
debugPuts("DUMP %d bytes ...\n\r", size);
unsigned int i = 0, j=0;
while (i*32+j < size) {
debugPuts("%.2X ", data[i*32+j]);
j++;
if (j==32) {
i++; j=0;
debugPuts("\n\r");
}
}
debugPuts("\n\r");
}
#if !defined(SIMU)
uint32_t Mem_address ;
uint32_t Next_mem_address ;
uint32_t Memaddmode ;
Fifo<512> debugRxFifo;
void crlf()
{
debugPutc( 13 ) ;
debugPutc( 10 ) ;
}
// Send a single 4 bit value to the RS232 port as a hex digit
void hex_digit_send( unsigned char c )
{
c &= 0x0F ;
if ( c > 9 )
{
c += 7 ;
}
c += '0' ;
debugPutc( c ) ;
}
// Send the 8 bit value to the RS232 port as 2 hex digits
void p2hex( unsigned char c )
{
// asm("swap %c") ;
hex_digit_send( c >> 4 ) ;
// asm("swap %c") ;
hex_digit_send( c ) ;
}
// Send the 16 bit value to the RS232 port as 4 hex digits
void p4hex( uint16_t value )
{
p2hex( value >> 8 ) ;
p2hex( value ) ;
}
// Send the 32 bit value to the RS232 port as 8 hex digits
void p8hex( uint32_t value )
{
p4hex( value >> 16 ) ;
p4hex( value ) ;
}
static void dispw_256( register uint32_t address, register uint32_t lines )
{
register uint32_t i ;
register uint32_t j ;
address &= 0xFFFFFFFC ;
for ( i = 0 ; i < lines ; i += 1 )
{
p8hex( address ) ;
for ( j = 0 ; j < 4 ; j += 1 )
{
debugPutc(' ') ;
p8hex( *( (uint32_t *)address ) ) ;
address += 4 ;
}
crlf() ;
}
}
extern Fifo<512> uart3TxFifo;
void debugFlush()
{
uart3TxFifo.flush();
}
void debugTask(void* pdata)
{
uint8_t rxchar ;
TRACE("DEBUG Task started");
crlf() ;
dispw_256( (uint32_t)USART3, 4 ) ;
for (;;) {
while ( (USART3->SR & USART_SR_RXNE) == 0 )
CoTickDelay(5); // 10ms
rxchar = USART3->DR;
if ( Memaddmode )
{
if ( ( rxchar >= 'a' ) && ( rxchar <= 'f' ) )
{
rxchar -= 0x20; // toupper!
}
if ( ( ( rxchar >= '0' ) && ( rxchar <= '9' ) ) || ( ( rxchar >= 'A' ) && ( rxchar <= 'F' ) ) )
{
debugPutc( rxchar );
rxchar -= '0';
if ( rxchar > 9 )
{
rxchar -= 7;
}
Mem_address <<= 4;
Mem_address |= rxchar;
}
else if ( rxchar == 13 )
{
crlf();
if ( Mem_address == 0 )
{
Mem_address = Next_mem_address;
}
dispw_256( Mem_address, 4 );
Next_mem_address = Mem_address + 64;
Memaddmode = 0;
}
else if ( rxchar == 8 )
{
debugPutc( rxchar );
debugPutc( rxchar );
debugPutc( rxchar );
Mem_address >>= 4;
}
else if ( rxchar == 27 )
{
crlf();
Memaddmode = 0;
}
}
if ( rxchar == '?' )
{
Memaddmode = 1;
Mem_address = 0;
debugPutc( '>' );
}
if ( rxchar == 'm' )
{
crlf();
p8hex( (uint32_t) &g_model.moduleData[0] );
debugPutc( ' ' );
p8hex( (uint32_t) &g_model.moduleData[1] );
crlf();
}
}
}
#endif // #if !defined(SIMU)
#endif // #if (defined(DEBUG) && defined(CPUARM)) || defined(SIMU)
#if defined(DEBUG_TRACE_BUFFER) #if defined(DEBUG_TRACE_BUFFER)
static struct TraceElement traceBuffer[TRACE_BUFFER_LEN]; static struct TraceElement traceBuffer[TRACE_BUFFER_LEN];
static uint8_t traceBufferPos; static uint8_t traceBufferPos;
extern Fifo<512> uart3TxFifo;
gtime_t filltm(gtime_t *t, struct gtm *tp); gtime_t filltm(gtime_t *t, struct gtm *tp);
void trace_event(enum TraceEvent event, uint32_t data) void trace_event(enum TraceEvent event, uint32_t data)
@ -298,13 +107,11 @@ void dumpTraceBuffer()
TRACE(" %03d 0x%08x", traceBuffer[n].event, traceBuffer[n].data); TRACE(" %03d 0x%08x", traceBuffer[n].event, traceBuffer[n].data);
if (traceBuffer[n].time == 0 && traceBuffer[n].time_ms == 0) break; if (traceBuffer[n].time == 0 && traceBuffer[n].time_ms == 0) break;
if ((n % 5) == 0) { if ((n % 5) == 0) {
while (!uart3TxFifo.empty()) { while (!serial2TxFifo.empty()) {
CoTickDelay(1); CoTickDelay(1);
} }
} }
} }
TRACE("End of Trace Buffer dump"); TRACE("End of Trace Buffer dump");
} }
#endif #endif

View file

@ -39,58 +39,42 @@
#include <inttypes.h> #include <inttypes.h>
#include "rtc.h" #include "rtc.h"
#include "dump.h"
#if defined(CLI)
#include "cli.h"
#endif
#if (defined(DEBUG) && defined(CPUARM)) || defined(SIMU) #if defined(__cplusplus)
#ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
uint8_t serial2TracesEnabled();
#if defined(__cplusplus)
}
#endif
#if defined(SIMU) #if defined(SIMU)
typedef void (*traceCallbackFunc)(const char * text); typedef void (*traceCallbackFunc)(const char * text);
extern traceCallbackFunc traceCallback; extern traceCallbackFunc traceCallback;
void debugPrintf(const char * format, ...);
#elif defined(DEBUG) && defined(CLI) && defined(USB_SERIAL)
#define debugPrintf(...) do { if (cliTracesEnabled) serialPrintf(__VA_ARGS__); } while(0)
#elif defined(DEBUG) && defined(CLI)
#define debugPrintf(...) do { if (serial2TracesEnabled() && cliTracesEnabled) serialPrintf(__VA_ARGS__); } while(0)
#elif defined(DEBUG) && defined(CPUARM)
#define debugPrintf(...) do { if (serial2TracesEnabled()) serialPrintf(__VA_ARGS__); } while(0)
#else
#define debugPrintf(...)
#endif #endif
void debugPuts(const char *string, ...); #define TRACE(...) do { debugPrintf(__VA_ARGS__); debugPrintf("\r\n"); } while(0)
void dump(unsigned char *data, unsigned int size);
void debugFlush();
#ifdef __cplusplus
}
#endif
#define TRACE(...) do { debugPuts(__VA_ARGS__); debugPuts("\r\n"); } while(0)
#define DUMP(data, size) dump(data, size) #define DUMP(data, size) dump(data, size)
#define TRACE_DEBUG(...) debugPuts("-D- " __VA_ARGS__) #define TRACE_DEBUG(...) debugPrintf("-D- " __VA_ARGS__)
#define TRACE_DEBUG_WP(...) debugPuts(__VA_ARGS__) #define TRACE_DEBUG_WP(...) debugPrintf(__VA_ARGS__)
#define TRACE_INFO(...) debugPuts("-I- " __VA_ARGS__) #define TRACE_INFO(...) debugPrintf("-I- " __VA_ARGS__)
#define TRACE_INFO_WP(...) debugPuts(__VA_ARGS__) #define TRACE_INFO_WP(...) debugPrintf(__VA_ARGS__)
#define TRACE_WARNING(...) debugPuts("-W- " __VA_ARGS__) #define TRACE_WARNING(...) debugPrintf("-W- " __VA_ARGS__)
#define TRACE_WARNING_WP(...) debugPuts(__VA_ARGS__) #define TRACE_WARNING_WP(...) debugPrintf(__VA_ARGS__)
#define TRACE_ERROR(...) debugPuts("-E- " __VA_ARGS__) #define TRACE_ERROR(...) debugPrintf("-E- " __VA_ARGS__)
#if !defined(SIMU)
#define FLUSH() debugFlush();
void debugTask(void* pdata);
#else
#define FLUSH()
#endif
#else
#define TRACE(...) { }
#define DUMP(...) { }
#define TRACE_DEBUG(...) { }
#define TRACE_DEBUG_WP(...) { }
#define TRACE_INFO(...) { }
#define TRACE_INFO_WP(...) { }
#define TRACE_WARNING(...) { }
#define TRACE_WARNING_WP(...) { }
#define TRACE_ERROR(...) { }
#define FLUSH()
#endif
#if defined(DEBUG_TRACE_BUFFER) #if defined(DEBUG_TRACE_BUFFER)

38
radio/src/dump.cpp Normal file
View file

@ -0,0 +1,38 @@
#include "opentx.h"
#if defined(SIMU)
#define dumpPrintf(...) debugPrintf(__VA_ARGS__)
#else
#define dumpPrintf(...) serialPrintf(__VA_ARGS__)
#endif
uint8_t dumpPosition;
void dumpStart(unsigned int size)
{
dumpPrintf("DUMP %d bytes ...\n\r", size);
dumpPosition = 0;
}
void dumpBody(const uint8_t *data, unsigned int size)
{
for (unsigned int i=0; i<size; i++) {
dumpPrintf("%.2X ", data[i]);
dumpPosition++;
if ((dumpPosition & (32-1)) == 0) {
dumpPrintf("\r\n");
}
}
}
void dumpEnd()
{
dumpPrintf("\r\n");
}
void dump(const uint8_t *data, unsigned int size)
{
dumpStart(size);
dumpBody(data, size);
dumpEnd();
}

13
radio/src/dump.h Normal file
View file

@ -0,0 +1,13 @@
#ifndef _DUMP_H_
#define _DUMP_H_
#if defined(DEBUG) || defined(CLI)
void dumpStart(unsigned int size);
void dumpBody(const uint8_t * data, unsigned int size);
void dumpEnd();
void dump(const uint8_t * data, unsigned int size);
#else
#define dump(data, size)
#endif
#endif // _DUMP_H_

View file

@ -626,7 +626,7 @@ PACK(typedef struct {
int8_t currModel; int8_t currModel;
uint8_t contrast; uint8_t contrast;
uint8_t vBatWarn; uint8_t vBatWarn;
int8_t vBatCalib; int8_t txVoltageCalibration;
int8_t backlightMode; int8_t backlightMode;
TrainerData trainer; TrainerData trainer;
uint8_t view; // index of view in main screen uint8_t view; // index of view in main screen
@ -659,7 +659,7 @@ PACK(typedef struct {
int8_t vBatMin; int8_t vBatMin;
int8_t vBatMax; int8_t vBatMax;
uint8_t backlightBright; uint8_t backlightBright;
int8_t currentCalib; int8_t txCurrentCalibration;
int8_t temperatureWarn; int8_t temperatureWarn;
uint8_t mAhWarn; uint8_t mAhWarn;
uint16_t mAhUsed; uint16_t mAhUsed;
@ -908,7 +908,7 @@ void ConvertModel_216_to_217(ModelData &model)
if (oldModel.timers[i].mode >= TMRMODE_COUNT) if (oldModel.timers[i].mode >= TMRMODE_COUNT)
timer.mode = TMRMODE_COUNT + ConvertSwitch_216_to_217(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; timer.mode = TMRMODE_COUNT + ConvertSwitch_216_to_217(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1;
else else
timer.mode = oldModel.timers[i].mode; timer.mode = ConvertSwitch_216_to_217(oldModel.timers[i].mode);
timer.start = oldModel.timers[i].start; timer.start = oldModel.timers[i].start;
timer.countdownBeep = oldModel.timers[i].countdownBeep; timer.countdownBeep = oldModel.timers[i].countdownBeep;
timer.minuteBeep = oldModel.timers[i].minuteBeep; timer.minuteBeep = oldModel.timers[i].minuteBeep;

View file

@ -370,6 +370,17 @@ void eeLoadModel(uint8_t id)
restoreTimers(); restoreTimers();
#if defined(CPUARM)
for (int i=0; i<MAX_SENSORS; i++) {
TelemetrySensor & sensor = g_model.telemetrySensors[i];
if (sensor.type == TELEM_TYPE_CALCULATED && sensor.persistent) {
telemetryItems[i].value = sensor.persistentValue;
}
}
#endif
LOAD_MODEL_CURVES();
resumeMixerCalculations(); resumeMixerCalculations();
// TODO pulses should be started after mixer calculations ... // TODO pulses should be started after mixer calculations ...

View file

@ -56,7 +56,7 @@ class Fifo
} }
bool pop(uint8_t & byte) { bool pop(uint8_t & byte) {
if (empty()) { if (isEmpty()) {
return false; return false;
} }
else { else {
@ -66,12 +66,17 @@ class Fifo
} }
} }
bool empty() { bool isEmpty() {
return (ridx == widx); return (ridx == widx);
} }
bool isFull() {
uint32_t next = (widx+1) & (N-1);
return (next == ridx);
}
void flush() { void flush() {
while (!empty()) {}; while (!isEmpty()) {};
} }
protected: protected:
@ -80,4 +85,4 @@ class Fifo
volatile uint32_t ridx; volatile uint32_t ridx;
}; };
#endif #endif // _FIFO_H_

View file

@ -284,7 +284,7 @@ void evalFunctions()
#endif #endif
for (uint8_t i=0; i<NUM_CFN; i++) { for (uint8_t i=0; i<NUM_CFN; i++) {
const CustomFunctionData *cfn = &functions[i]; const CustomFunctionData * cfn = &functions[i];
int8_t swtch = CFN_SWITCH(cfn); int8_t swtch = CFN_SWITCH(cfn);
if (swtch) { if (swtch) {
MASK_CFN_TYPE switch_mask = ((MASK_CFN_TYPE)1 << i); MASK_CFN_TYPE switch_mask = ((MASK_CFN_TYPE)1 << i);

View file

@ -140,7 +140,7 @@ enum SwitchContext
bool isSwitchAvailable(int swtch, SwitchContext context) bool isSwitchAvailable(int swtch, SwitchContext context)
{ {
if (swtch < 0) { if (swtch < 0) {
if (swtch == -SWSRC_ON || swtch == -SWSRC_One) { if (swtch == -SWSRC_ON || swtch == -SWSRC_ONE) {
return false; return false;
} }
swtch = -swtch; swtch = -swtch;
@ -156,7 +156,7 @@ bool isSwitchAvailable(int swtch, SwitchContext context)
} }
} }
if (context != ModelCustomFunctionsContext && context != GeneralCustomFunctionsContext && (swtch == SWSRC_ON || swtch == SWSRC_One)) { if (context != ModelCustomFunctionsContext && context != GeneralCustomFunctionsContext && (swtch == SWSRC_ON || swtch == SWSRC_ONE)) {
return false; return false;
} }

View file

@ -77,7 +77,7 @@ void menuGeneralDiagAna(uint8_t event)
lcd_putsLeft(MENU_HEADER_HEIGHT+1+4*FH, STR_BATT_CALIB); lcd_putsLeft(MENU_HEADER_HEIGHT+1+4*FH, STR_BATT_CALIB);
static int32_t adcBatt; static int32_t adcBatt;
adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8;
uint32_t batCalV = (adcBatt + adcBatt*(g_eeGeneral.vBatCalib)/128) * 4191; uint32_t batCalV = (adcBatt + adcBatt*(g_eeGeneral.txVoltageCalibration)/128) * 4191;
batCalV /= 55296; batCalV /= 55296;
putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+4*FH, batCalV, (m_posVert==1 ? INVERS : 0)); putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+4*FH, batCalV, (m_posVert==1 ? INVERS : 0));
#elif defined(PCBGRUVIN9X) #elif defined(PCBGRUVIN9X)
@ -85,18 +85,18 @@ void menuGeneralDiagAna(uint8_t event)
// Gruvin wants 2 decimal places and instant update of volts calib field when button pressed // Gruvin wants 2 decimal places and instant update of volts calib field when button pressed
static uint16_t adcBatt; static uint16_t adcBatt;
adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; // running average, sourced directly (to avoid unending debate :P) adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; // running average, sourced directly (to avoid unending debate :P)
uint32_t batCalV = ((uint32_t)adcBatt*1390 + (10*(int32_t)adcBatt*g_eeGeneral.vBatCalib)/8) / BandGap; uint32_t batCalV = ((uint32_t)adcBatt*1390 + (10*(int32_t)adcBatt*g_eeGeneral.txVoltageCalibration)/8) / BandGap;
lcd_outdezNAtt(LEN_CALIB_FIELDS*FW+4*FW, 6*FH-2, batCalV, PREC2|(m_posVert==1 ? INVERS : 0)); lcd_outdezNAtt(LEN_CALIB_FIELDS*FW+4*FW, 6*FH-2, batCalV, PREC2|(m_posVert==1 ? INVERS : 0));
#else #else
lcd_putsLeft(6*FH-2, STR_BATT_CALIB); lcd_putsLeft(6*FH-2, STR_BATT_CALIB);
putsVolts(LEN_CALIB_FIELDS*FW+4*FW, 6*FH-2, g_vbat100mV, (m_posVert==1 ? INVERS : 0)); putsVolts(LEN_CALIB_FIELDS*FW+4*FW, 6*FH-2, g_vbat100mV, (m_posVert==1 ? INVERS : 0));
#endif #endif
if (m_posVert==1) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatCalib, -127, 127); if (m_posVert==1) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127);
#if defined(PCBSKY9X) && !defined(REVA) && !defined(AR9X) #if defined(PCBSKY9X) && !defined(REVA) && !defined(AR9X)
lcd_putsLeft(6*FH+1, STR_CURRENT_CALIB); lcd_putsLeft(6*FH+1, STR_CURRENT_CALIB);
putsValueWithUnit(LEN_CALIB_FIELDS*FW+4*FW, 6*FH+1, getCurrent(), UNIT_MILLIAMPS, (m_posVert==2 ? INVERS : 0)) ; putsValueWithUnit(LEN_CALIB_FIELDS*FW+4*FW, 6*FH+1, getCurrent(), UNIT_MILLIAMPS, (m_posVert==2 ? INVERS : 0)) ;
if (m_posVert==2) CHECK_INCDEC_GENVAR(event, g_eeGeneral.currentCalib, -49, 49); if (m_posVert==2) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49);
#endif #endif
#if defined(PCBSKY9X) #if defined(PCBSKY9X)

View file

@ -140,8 +140,9 @@ void menuModelLogicalSwitchOne(uint8_t event)
v1_min = SWSRC_OFF+1; v1_max = SWSRC_ON-1; v1_min = SWSRC_OFF+1; v1_max = SWSRC_ON-1;
} }
else if (cstate == LS_FAMILY_TIMER) { else if (cstate == LS_FAMILY_TIMER) {
lcd_outdezAtt(CSWONE_2ND_COLUMN, y, v1_val+1, LEFT|attr); lcd_outdezAtt(CSWONE_2ND_COLUMN, y, lswTimerValue(cs->v1), LEFT|PREC1|attr);
v1_max = 99; v1_min = -128;
v1_max = 122;
} }
else { else {
v1_val = (uint8_t)cs->v1; v1_val = (uint8_t)cs->v1;
@ -163,8 +164,9 @@ void menuModelLogicalSwitchOne(uint8_t event)
v2_min = SWSRC_OFF+1; v2_max = SWSRC_ON-1; v2_min = SWSRC_OFF+1; v2_max = SWSRC_ON-1;
} }
else if (cstate == LS_FAMILY_TIMER) { else if (cstate == LS_FAMILY_TIMER) {
lcd_outdezAtt(CSWONE_2ND_COLUMN, y, cs->v2+1, LEFT|attr); lcd_outdezAtt(CSWONE_2ND_COLUMN, y, lswTimerValue(cs->v2), LEFT|PREC1|attr);
v2_max = 99; v2_min = -128;
v2_max = 122;
} }
else if (cstate == LS_FAMILY_EDGE) { else if (cstate == LS_FAMILY_EDGE) {
putsEdgeDelayParam(CSWONE_2ND_COLUMN, y, cs, m_posHorz==0 ? attr : 0, m_posHorz==1 ? attr : 0); putsEdgeDelayParam(CSWONE_2ND_COLUMN, y, cs, m_posHorz==0 ? attr : 0, m_posHorz==1 ? attr : 0);
@ -286,8 +288,8 @@ void menuModelLogicalSwitches(uint8_t event)
putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, 0, 0); putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, 0, 0);
} }
else if (cstate == LS_FAMILY_TIMER) { else if (cstate == LS_FAMILY_TIMER) {
lcd_outdezAtt(CSW_2ND_COLUMN, y, cs->v1+1, LEFT); lcd_outdezAtt(CSW_2ND_COLUMN, y, lswTimerValue(cs->v1), LEFT|PREC1);
lcd_outdezAtt(CSW_3RD_COLUMN, y, cs->v2+1, LEFT); lcd_outdezAtt(CSW_3RD_COLUMN, y, lswTimerValue(cs->v2), LEFT|PREC1);
} }
else { else {
uint8_t v1 = cs->v1; uint8_t v1 = cs->v1;

View file

@ -256,7 +256,7 @@ void menuModelSetup(uint8_t event)
case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP: case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP:
{ {
TimerData * timer = &g_model.timers[k>=ITEM_MODEL_TIMER3 ? 2 : (k>=ITEM_MODEL_TIMER2 ? 1 : 0)]; TimerData * timer = &g_model.timers[k>=ITEM_MODEL_TIMER3 ? 2 : (k>=ITEM_MODEL_TIMER2 ? 1 : 0)];
timer->countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, timer->countdownBeep, 0, 2, attr, event); timer->countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, timer->countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event);
break; break;
} }

View file

@ -86,8 +86,10 @@ enum menuModelTelemetryItems {
ITEM_TELEMETRY_SENSOR30, ITEM_TELEMETRY_SENSOR30,
ITEM_TELEMETRY_SENSOR31, ITEM_TELEMETRY_SENSOR31,
ITEM_TELEMETRY_SENSOR32, ITEM_TELEMETRY_SENSOR32,
ITEM_TELEMETRY_NEWSENSOR, ITEM_TELEMETRY_DISCOVER_SENSORS,
ITEM_TELEMETRY_IGNORE_SENSORID, ITEM_TELEMETRY_NEW_SENSOR,
ITEM_TELEMETRY_DELETE_ALL_SENSORS,
ITEM_TELEMETRY_IGNORE_SENSOR_INSTANCE,
#endif #endif
#if !defined(CPUARM) #if !defined(CPUARM)
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
@ -147,7 +149,7 @@ enum menuModelTelemetryItems {
#if defined(CPUARM) #if defined(CPUARM)
#define CHANNELS_ROWS #define CHANNELS_ROWS
#define SENSOR_ROWS(x) (isTelemetryFieldAvailable(x) ? (uint8_t)0 : HIDDEN_ROW) #define SENSOR_ROWS(x) (isTelemetryFieldAvailable(x) ? (uint8_t)0 : HIDDEN_ROW)
#define SENSORS_ROWS LABEL(Sensors), SENSOR_ROWS(0), SENSOR_ROWS(1), SENSOR_ROWS(2), SENSOR_ROWS(3), SENSOR_ROWS(4), SENSOR_ROWS(5), SENSOR_ROWS(6), SENSOR_ROWS(7), SENSOR_ROWS(8), SENSOR_ROWS(9), SENSOR_ROWS(10), SENSOR_ROWS(11), SENSOR_ROWS(12), SENSOR_ROWS(13), SENSOR_ROWS(14), SENSOR_ROWS(15), SENSOR_ROWS(16), SENSOR_ROWS(17), SENSOR_ROWS(18), SENSOR_ROWS(19), SENSOR_ROWS(20), SENSOR_ROWS(21), SENSOR_ROWS(22), SENSOR_ROWS(23), SENSOR_ROWS(24), SENSOR_ROWS(25), SENSOR_ROWS(26), SENSOR_ROWS(27), SENSOR_ROWS(28), SENSOR_ROWS(29), SENSOR_ROWS(30), SENSOR_ROWS(31), 0, 0, #define SENSORS_ROWS LABEL(Sensors), SENSOR_ROWS(0), SENSOR_ROWS(1), SENSOR_ROWS(2), SENSOR_ROWS(3), SENSOR_ROWS(4), SENSOR_ROWS(5), SENSOR_ROWS(6), SENSOR_ROWS(7), SENSOR_ROWS(8), SENSOR_ROWS(9), SENSOR_ROWS(10), SENSOR_ROWS(11), SENSOR_ROWS(12), SENSOR_ROWS(13), SENSOR_ROWS(14), SENSOR_ROWS(15), SENSOR_ROWS(16), SENSOR_ROWS(17), SENSOR_ROWS(18), SENSOR_ROWS(19), SENSOR_ROWS(20), SENSOR_ROWS(21), SENSOR_ROWS(22), SENSOR_ROWS(23), SENSOR_ROWS(24), SENSOR_ROWS(25), SENSOR_ROWS(26), SENSOR_ROWS(27), SENSOR_ROWS(28), SENSOR_ROWS(29), SENSOR_ROWS(30), SENSOR_ROWS(31), 0, 0, 0, 0,
#else #else
#define CHANNEL_ROWS(x) LABEL(CHANNEL), 1, 0, 2, 2 #define CHANNEL_ROWS(x) LABEL(CHANNEL), 1, 0, 2, 2
#define CHANNELS_ROWS CHANNEL_ROWS(0), CHANNEL_ROWS(1), #define CHANNELS_ROWS CHANNEL_ROWS(0), CHANNEL_ROWS(1),
@ -191,10 +193,10 @@ enum menuModelTelemetryItems {
#if defined(CPUARM) #if defined(CPUARM)
#define TELEMETRY_SCREEN_LINE(x) (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE ? HIDDEN_ROW : (uint8_t)2) #define TELEMETRY_SCREEN_LINE(x) (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE ? HIDDEN_ROW : (uint8_t)2)
#define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x) #define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x)
#define TELEMETRY_CURRENT_EDIT_SCREEN(k) (k < ITEM_TELEMETRY_SCREEN_LABEL2 ? 0 : (k < ITEM_TELEMETRY_SCREEN_LABEL3 ? 1 : (k < ITEM_TELEMETRY_SCREEN_LABEL4 ? 2 : 3))) #define TELEMETRY_CURRENT_SCREEN(k) (k < ITEM_TELEMETRY_SCREEN_LABEL2 ? 0 : (k < ITEM_TELEMETRY_SCREEN_LABEL3 ? 1 : (k < ITEM_TELEMETRY_SCREEN_LABEL4 ? 2 : 3)))
#else #else
#define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, 2, 2, 2, 2 #define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, 2, 2, 2, 2
#define TELEMETRY_CURRENT_EDIT_CHANNEL(k) (k >= ITEM_TELEMETRY_A2_LABEL ? TELEM_ANA_A2 : TELEM_ANA_A1) #define TELEMETRY_CURRENT_CHANNEL(k) (k >= ITEM_TELEMETRY_A2_LABEL ? TELEM_ANA_A2 : TELEM_ANA_A1)
#endif #endif
#if defined(CPUARM) #if defined(CPUARM)
@ -497,7 +499,7 @@ void onSensorMenu(const char *result)
if (index<MAX_SENSORS && isTelemetryFieldAvailable(index)) if (index<MAX_SENSORS && isTelemetryFieldAvailable(index))
m_posVert += 1; m_posVert += 1;
else else
m_posVert = 1+ITEM_TELEMETRY_NEWSENSOR; m_posVert = 1+ITEM_TELEMETRY_NEW_SENSOR;
} }
else if (result == STR_COPY) { else if (result == STR_COPY) {
int newIndex = availableTelemetryIndex(); int newIndex = availableTelemetryIndex();
@ -521,6 +523,15 @@ void onSensorMenu(const char *result)
void menuModelTelemetry(uint8_t event) void menuModelTelemetry(uint8_t event)
{ {
#if defined(CPUARM)
if (s_warning_result) {
s_warning_result = 0;
for (int i=0; i<MAX_SENSORS; i++) {
delTelemetryIndex(i);
}
}
#endif
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, TELEMETRY_TYPE_ROWS CHANNELS_ROWS RSSI_ROWS SENSORS_ROWS USRDATA_ROWS CASE_VARIO(LABEL(Vario)) CASE_VARIO(0) CASE_VARIO(VARIO_RANGE_ROWS) TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1), CASE_CPUARM(TELEMETRY_SCREEN_ROWS(2)) CASE_CPUARM(TELEMETRY_SCREEN_ROWS(3))}); MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, TELEMETRY_TYPE_ROWS CHANNELS_ROWS RSSI_ROWS SENSORS_ROWS USRDATA_ROWS CASE_VARIO(LABEL(Vario)) CASE_VARIO(0) CASE_VARIO(VARIO_RANGE_ROWS) TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1), CASE_CPUARM(TELEMETRY_SCREEN_ROWS(2)) CASE_CPUARM(TELEMETRY_SCREEN_ROWS(3))});
uint8_t sub = m_posVert - 1; uint8_t sub = m_posVert - 1;
@ -549,7 +560,7 @@ void menuModelTelemetry(uint8_t event)
uint8_t attr = (sub == k ? blink : 0); uint8_t attr = (sub == k ? blink : 0);
#if !defined(CPUARM) #if !defined(CPUARM)
uint8_t ch = TELEMETRY_CURRENT_EDIT_CHANNEL(k); uint8_t ch = TELEMETRY_CURRENT_CHANNEL(k);
FrSkyChannelData & channel = g_model.frsky.channels[ch]; FrSkyChannelData & channel = g_model.frsky.channels[ch];
uint8_t dest = TELEM_A1-1+ch; uint8_t dest = TELEM_A1-1+ch;
#endif #endif
@ -604,7 +615,15 @@ void menuModelTelemetry(uint8_t event)
lcd_putsLeft(y, STR_TELEMETRY_SENSORS); lcd_putsLeft(y, STR_TELEMETRY_SENSORS);
break; break;
case ITEM_TELEMETRY_NEWSENSOR: case ITEM_TELEMETRY_DISCOVER_SENSORS:
lcd_putsAtt(0, y, allowNewSensors ? STR_STOP_DISCOVER_SENSORS : STR_DISCOVER_SENSORS, attr);
if (attr && event==EVT_KEY_BREAK(KEY_ENTER)) {
s_editMode = 0;
allowNewSensors = !allowNewSensors;
}
break;
case ITEM_TELEMETRY_NEW_SENSOR:
lcd_putsAtt(0, y, STR_TELEMETRY_NEWSENSOR, attr); lcd_putsAtt(0, y, STR_TELEMETRY_NEWSENSOR, attr);
if (attr && event==EVT_KEY_BREAK(KEY_ENTER)) { if (attr && event==EVT_KEY_BREAK(KEY_ENTER)) {
s_editMode = 0; s_editMode = 0;
@ -619,8 +638,17 @@ void menuModelTelemetry(uint8_t event)
} }
break; break;
case ITEM_TELEMETRY_IGNORE_SENSORID: case ITEM_TELEMETRY_DELETE_ALL_SENSORS:
ON_OFF_MENU_ITEM(g_model.ignoreSensorIds, TELEM_COL2, y, STR_IGNOREIDS, attr, event); lcd_putsAtt(0, y, STR_DELETE_ALL_SENSORS, attr);
s_editMode = 0;
if (attr && event==EVT_KEY_LONG(KEY_ENTER)) {
killEvents(KEY_ENTER);
POPUP_CONFIRMATION(STR_CONFIRMDELETE);
}
break;
case ITEM_TELEMETRY_IGNORE_SENSOR_INSTANCE:
ON_OFF_MENU_ITEM(g_model.ignoreSensorIds, TELEM_COL2, y, STR_IGNORE_INSTANCE, attr, event);
break; break;
#endif #endif
@ -830,7 +858,7 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_SCREEN_LABEL3: case ITEM_TELEMETRY_SCREEN_LABEL3:
case ITEM_TELEMETRY_SCREEN_LABEL4: case ITEM_TELEMETRY_SCREEN_LABEL4:
{ {
uint8_t screenIndex = TELEMETRY_CURRENT_EDIT_SCREEN(k); uint8_t screenIndex = TELEMETRY_CURRENT_SCREEN(k);
putsStrIdx(0*FW, y, STR_SCREEN, screenIndex+1); putsStrIdx(0*FW, y, STR_SCREEN, screenIndex+1);
TelemetryScreenType oldScreenType = TELEMETRY_SCREEN_TYPE(screenIndex); TelemetryScreenType oldScreenType = TELEMETRY_SCREEN_TYPE(screenIndex);
TelemetryScreenType newScreenType = (TelemetryScreenType)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VTELEMSCREENTYPE, oldScreenType, 0, TELEMETRY_SCREEN_TYPE_MAX, (m_posHorz==0 ? attr : 0), event); TelemetryScreenType newScreenType = (TelemetryScreenType)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VTELEMSCREENTYPE, oldScreenType, 0, TELEMETRY_SCREEN_TYPE_MAX, (m_posHorz==0 ? attr : 0), event);
@ -900,9 +928,15 @@ void menuModelTelemetry(uint8_t event)
#if defined(CPUARM) #if defined(CPUARM)
putsMixerSource(TELEM_COL1, y, barSource, m_posHorz==0 ? attr : 0); putsMixerSource(TELEM_COL1, y, barSource, m_posHorz==0 ? attr : 0);
if (barSource) { if (barSource) {
if (barSource <= MIXSRC_LAST_CH) {
putsChannelValue(TELEM_BARS_COLMIN, y, barSource, calc100toRESX(bar.barMin), (m_posHorz==1 ? attr : 0) | LEFT);
putsChannelValue(TELEM_BARS_COLMAX, y, barSource, calc100toRESX(bar.barMax), (m_posHorz==2 ? attr : 0) | LEFT);
}
else {
putsChannelValue(TELEM_BARS_COLMIN, y, barSource, bar.barMin, (m_posHorz==1 ? attr : 0) | LEFT); putsChannelValue(TELEM_BARS_COLMIN, y, barSource, bar.barMin, (m_posHorz==1 ? attr : 0) | LEFT);
putsChannelValue(TELEM_BARS_COLMAX, y, barSource, bar.barMax, (m_posHorz==2 ? attr : 0) | LEFT); putsChannelValue(TELEM_BARS_COLMAX, y, barSource, bar.barMax, (m_posHorz==2 ? attr : 0) | LEFT);
} }
}
#else #else
lcd_putsiAtt(TELEM_COL1, y, STR_VTELEMCHNS, barSource, m_posHorz==0 ? attr : 0); lcd_putsiAtt(TELEM_COL1, y, STR_VTELEMCHNS, barSource, m_posHorz==0 ? attr : 0);
if (barSource) { if (barSource) {

View file

@ -629,36 +629,61 @@ void check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t
} }
#if defined(CPUARM) #if defined(CPUARM)
if (l_posVert<1) { int linesCount = maxrow;
s_pgOfs=0;
} if (l_posVert == 0 || (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) {
else if (menuTab && horTab) { s_pgOfs = 0;
vertpos_t realPosVert = l_posVert; if (horTab) {
vertpos_t realPgOfs = s_pgOfs; linesCount = 0;
vertpos_t realMaxrow = maxrow; for (int i=0; i<maxrow; i++) {
for (vertpos_t i=1; i<=maxrow; i++) { if (i>=horTabMax || horTab[i] != HIDDEN_ROW) {
if (MAXCOL(i) == HIDDEN_ROW) { linesCount++;
realMaxrow--;
if (i < l_posVert)
realPosVert--;
if (i < s_pgOfs)
realPgOfs--;
} }
} }
if (realPosVert>(LCD_LINES-1)+realPgOfs) realPgOfs = realPosVert-(LCD_LINES-1);
else if (realPosVert<1+realPgOfs) realPgOfs = realPosVert-1;
s_pgOfs = realPgOfs;
for (vertpos_t i=1; i<=realPgOfs; i++) {
if (MAXCOL(i) == HIDDEN_ROW) {
s_pgOfs++;
} }
} }
maxrow = realMaxrow; else if (horTab) {
if (maxrow > NUM_BODY_LINES) {
while (1) {
vertpos_t firstLine = 0;
for (int numLines=0; firstLine<maxrow && numLines<s_pgOfs; firstLine++) {
if (firstLine>=horTabMax || horTab[firstLine+1] != HIDDEN_ROW) {
numLines++;
}
}
if (l_posVert <= firstLine) {
s_pgOfs--;
} }
else { else {
uint8_t max = menuTab ? LCD_LINES-1 : LCD_LINES-2; vertpos_t lastLine = firstLine;
if (l_posVert>max+s_pgOfs) s_pgOfs = l_posVert-max; for (int numLines=0; lastLine<maxrow && numLines<NUM_BODY_LINES; lastLine++) {
else if (l_posVert<1+s_pgOfs) s_pgOfs = l_posVert-1; if (lastLine>=horTabMax || horTab[lastLine+1] != HIDDEN_ROW) {
numLines++;
}
}
if (l_posVert > lastLine) {
s_pgOfs++;
}
else {
linesCount = s_pgOfs + NUM_BODY_LINES;
for (int i=lastLine; i<maxrow; i++) {
if (i>=horTabMax || horTab[i] != HIDDEN_ROW) {
linesCount++;
}
}
break;
}
}
}
}
}
else {
if (l_posVert>NUM_BODY_LINES+s_pgOfs) {
s_pgOfs = l_posVert-NUM_BODY_LINES;
}
else if (l_posVert<=s_pgOfs) {
s_pgOfs = l_posVert-1;
}
} }
#else #else
uint8_t max = menuTab ? LCD_LINES-1 : LCD_LINES-2; uint8_t max = menuTab ? LCD_LINES-1 : LCD_LINES-2;

View file

@ -226,8 +226,8 @@ void displayVoltageOrAlarm()
if (g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) { if (g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) {
putsValueWithUnit(6*FW-1, 2*FH, getTemperature(), UNIT_TEMPERATURE, BLINK|INVERS|DBLSIZE); putsValueWithUnit(6*FW-1, 2*FH, getTemperature(), UNIT_TEMPERATURE, BLINK|INVERS|DBLSIZE);
} }
else if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.currentCalib)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { else if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.txCurrentCalibration)/8192/36) / 500 >= g_eeGeneral.mAhWarn) {
putsValueWithUnit(7*FW-1, 2*FH, (g_eeGeneral.mAhUsed + Current_used*(488 + g_eeGeneral.currentCalib)/8192/36)/10, UNIT_MAH, BLINK|INVERS|DBLSIZE); putsValueWithUnit(7*FW-1, 2*FH, (g_eeGeneral.mAhUsed + Current_used*(488 + g_eeGeneral.txCurrentCalibration)/8192/36)/10, UNIT_MAH, BLINK|INVERS|DBLSIZE);
} }
else { else {
displayBattVoltage(); displayBattVoltage();

View file

@ -46,7 +46,7 @@
#include "opentx.h" #include "opentx.h"
#include "telemetry/mavlink.h" #include "telemetry/mavlink.h"
#include "gui/9X/menus.h" #include "gui/9X/menus.h"
#include "serial.h" #include "targets/common_avr/serial_driver.h"
#define APSIZE (BSS | DBLSIZE) #define APSIZE (BSS | DBLSIZE)

View file

@ -155,7 +155,7 @@ void menuStatisticsDebug(uint8_t event)
// current // current
lcd_putsLeft(MENU_DEBUG_Y_CURRENT, STR_CPU_CURRENT); lcd_putsLeft(MENU_DEBUG_Y_CURRENT, STR_CPU_CURRENT);
putsValueWithUnit(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_CURRENT, getCurrent(), UNIT_MILLIAMPS, LEFT); putsValueWithUnit(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_CURRENT, getCurrent(), UNIT_MILLIAMPS, LEFT);
uint32_t current_scale = 488 + g_eeGeneral.currentCalib; uint32_t current_scale = 488 + g_eeGeneral.txCurrentCalibration;
lcd_putc(MENU_DEBUG_COL2_OFS, MENU_DEBUG_Y_CURRENT, '>'); lcd_putc(MENU_DEBUG_COL2_OFS, MENU_DEBUG_Y_CURRENT, '>');
putsValueWithUnit(MENU_DEBUG_COL2_OFS+FW+1, MENU_DEBUG_Y_CURRENT, Current_max*10*current_scale/8192, UNIT_RAW, LEFT); putsValueWithUnit(MENU_DEBUG_COL2_OFS+FW+1, MENU_DEBUG_Y_CURRENT, Current_max*10*current_scale/8192, UNIT_RAW, LEFT);
// consumption // consumption
@ -196,11 +196,11 @@ void menuStatisticsDebug(uint8_t event)
#if defined(CPUARM) #if defined(CPUARM)
lcd_putsLeft(MENU_DEBUG_Y_RTOS, STR_FREESTACKMINB); lcd_putsLeft(MENU_DEBUG_Y_RTOS, STR_FREESTACKMINB);
lcd_outdezAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_RTOS+2, stack_free(0), UNSIGN|LEFT|TINSIZE); lcd_outdezAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_RTOS+2, menusStack.available(), UNSIGN|LEFT|TINSIZE);
lcd_puts(lcdLastPos, MENU_DEBUG_Y_RTOS, "/"); lcd_puts(lcdLastPos, MENU_DEBUG_Y_RTOS, "/");
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS+2, stack_free(1), UNSIGN|LEFT|TINSIZE); lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS+2, mixerStack.available(), UNSIGN|LEFT|TINSIZE);
lcd_puts(lcdLastPos, MENU_DEBUG_Y_RTOS, "/"); lcd_puts(lcdLastPos, MENU_DEBUG_Y_RTOS, "/");
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS+2, stack_free(2), UNSIGN|LEFT|TINSIZE); lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS+2, audioStack.available(), UNSIGN|LEFT|TINSIZE);
#endif #endif
#if !defined(CPUARM) #if !defined(CPUARM)
@ -213,7 +213,7 @@ void menuStatisticsDebug(uint8_t event)
lcd_putsLeft(4*FH, STR_TMIXMAXMS); lcd_putsLeft(4*FH, STR_TMIXMAXMS);
lcd_outdezAtt(MENU_DEBUG_COL1_OFS, 4*FH, DURATION_MS_PREC2(maxMixerDuration), PREC2); lcd_outdezAtt(MENU_DEBUG_COL1_OFS, 4*FH, DURATION_MS_PREC2(maxMixerDuration), PREC2);
lcd_putsLeft(5*FH, STR_FREESTACKMINB); lcd_putsLeft(5*FH, STR_FREESTACKMINB);
lcd_outdezAtt(14*FW, 5*FH, stack_free(), UNSIGN) ; lcd_outdezAtt(14*FW, 5*FH, stackAvailable(), UNSIGN) ;
#endif #endif
lcd_puts(4*FW, 7*FH+1, STR_MENUTORESET); lcd_puts(4*FW, 7*FH+1, STR_MENUTORESET);

View file

@ -246,6 +246,10 @@ bool displayGaugesTelemetryScreen(FrSkyScreenData & screen)
#if defined(CPUARM) #if defined(CPUARM)
getvalue_t barMin = bar.barMin; getvalue_t barMin = bar.barMin;
getvalue_t barMax = bar.barMax; getvalue_t barMax = bar.barMax;
if (source <= MIXSRC_LAST_CH) {
barMin = calc100toRESX(barMin);
barMax = calc100toRESX(barMax);
}
#else #else
getvalue_t barMin = convertBarTelemValue(source, bar.barMin); getvalue_t barMin = convertBarTelemValue(source, bar.barMin);
getvalue_t barMax = convertBarTelemValue(source, 255-bar.barMax); getvalue_t barMax = convertBarTelemValue(source, 255-bar.barMax);

View file

@ -203,7 +203,7 @@ bool isSwitchAvailable(int swtch, SwitchContext context)
if (swtch < 0) { if (swtch < 0) {
negative = true; negative = true;
if (swtch == -SWSRC_ON || swtch == -SWSRC_One) { if (swtch == -SWSRC_ON || swtch == -SWSRC_ONE) {
return false; return false;
} }
swtch = -swtch; swtch = -swtch;
@ -245,7 +245,7 @@ bool isSwitchAvailable(int swtch, SwitchContext context)
} }
} }
if (context != ModelCustomFunctionsContext && context != GeneralCustomFunctionsContext && (swtch == SWSRC_ON || swtch == SWSRC_One)) { if (context != ModelCustomFunctionsContext && context != GeneralCustomFunctionsContext && (swtch == SWSRC_ON || swtch == SWSRC_ONE)) {
return false; return false;
} }

View file

@ -674,7 +674,7 @@ void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
else else
lcd_putsiAtt(x, y, STR_VSRCRAW, idx+1, att); lcd_putsiAtt(x, y, STR_VSRCRAW, idx+1, att);
} }
else if (idx >= MIXSRC_FIRST_SWITCH && idx < MIXSRC_FIRST_LOGICAL_SWITCH) { else if (idx >= MIXSRC_FIRST_SWITCH && idx <= MIXSRC_LAST_SWITCH) {
idx = idx-MIXSRC_FIRST_SWITCH; idx = idx-MIXSRC_FIRST_SWITCH;
if (ZEXIST(g_eeGeneral.switchNames[idx])) { if (ZEXIST(g_eeGeneral.switchNames[idx])) {
lcd_putcAtt(x, y, '\312', att); //switch symbol lcd_putcAtt(x, y, '\312', att); //switch symbol
@ -692,8 +692,8 @@ void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
else if (idx <= MIXSRC_LAST_CH) { else if (idx <= MIXSRC_LAST_CH) {
putsStrIdx(x, y, STR_CH, idx-MIXSRC_CH1+1, att); putsStrIdx(x, y, STR_CH, idx-MIXSRC_CH1+1, att);
if (ZEXIST(g_model.limitData[idx-MIXSRC_CH1].name) && (att & STREXPANDED)) { if (ZEXIST(g_model.limitData[idx-MIXSRC_CH1].name) && (att & STREXPANDED)) {
lcd_putcAtt(lcdLastPos, y, ' ', att); lcd_putcAtt(lcdLastPos, y, ' ', att|SMLSIZE);
lcd_putsnAtt(lcdLastPos+3, y, g_model.limitData[idx-MIXSRC_CH1].name, LEN_CHANNEL_NAME, ZCHAR|att); lcd_putsnAtt(lcdLastPos+3, y, g_model.limitData[idx-MIXSRC_CH1].name, LEN_CHANNEL_NAME, ZCHAR|att|SMLSIZE);
} }
} }
else if (idx <= MIXSRC_LAST_GVAR) else if (idx <= MIXSRC_LAST_GVAR)
@ -727,29 +727,48 @@ void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att)
} }
} }
void putsSwitches(coord_t x, coord_t y, int8_t idx, LcdFlags att) void putsSwitches(coord_t x, coord_t y, int32_t idx, LcdFlags att)
{ {
if (idx == SWSRC_OFF) if (idx == SWSRC_NONE) {
return lcd_putsiAtt(x, y, STR_VSWITCHES, 0, att);
}
else if (idx == SWSRC_OFF) {
return lcd_putsiAtt(x, y, STR_OFFON, 0, att); return lcd_putsiAtt(x, y, STR_OFFON, 0, att);
}
if (idx < 0) { if (idx < 0) {
lcd_putcAtt(x-2, y, '!', att); lcd_putcAtt(x-2, y, '!', att);
idx = -idx; idx = -idx;
} }
#if defined(FLIGHT_MODES)
if (idx >= SWSRC_FIRST_FLIGHT_MODE) { if (idx <= SWSRC_LAST_SWITCH) {
return putsStrIdx(x, y, STR_FP, idx-SWSRC_FIRST_FLIGHT_MODE, att);
}
#endif
if (idx >= SWSRC_FIRST_SWITCH && idx <= SWSRC_LAST_SWITCH) {
div_t swinfo = switchInfo(idx); div_t swinfo = switchInfo(idx);
if (ZEXIST(g_eeGeneral.switchNames[swinfo.quot])) { if (ZEXIST(g_eeGeneral.switchNames[swinfo.quot])) {
lcd_putsnAtt(x, y, g_eeGeneral.switchNames[swinfo.quot], LEN_SWITCH_NAME, ZCHAR|att); lcd_putsnAtt(x, y, g_eeGeneral.switchNames[swinfo.quot], LEN_SWITCH_NAME, ZCHAR|att);
}
else {
lcd_putcAtt(x, y, 'S', att);
lcd_putcAtt(lcdNextPos, y, 'A'+swinfo.quot, att);
}
char c = "\300-\301"[swinfo.rem]; char c = "\300-\301"[swinfo.rem];
lcd_putcAtt(lcdNextPos, y, c, att); lcd_putcAtt(lcdNextPos, y, c, att);
return;
} }
else if (idx <= SWSRC_LAST_MULTIPOS_SWITCH) {
div_t swinfo = div(idx - SWSRC_FIRST_MULTIPOS_SWITCH, XPOTS_MULTIPOS_COUNT);
putsStrIdx(x, y, "S", swinfo.quot*10+swinfo.rem+11, att);
}
else if (idx <= SWSRC_LAST_TRIM) {
lcd_putsiAtt(x, y, STR_VSWITCHES, idx-SWSRC_FIRST_TRIM+1, att);
}
else if (idx <= SWSRC_LAST_LOGICAL_SWITCH) {
putsStrIdx(x, y, "L", idx-SWSRC_FIRST_LOGICAL_SWITCH+1, att);
}
else if (idx <= SWSRC_ONE) {
lcd_putsiAtt(x, y, STR_VSWITCHES, idx-SWSRC_ON+1+(2*NUM_STICKS), att);
}
else {
putsStrIdx(x, y, STR_FP, idx-SWSRC_FIRST_FLIGHT_MODE, att);
} }
return lcd_putsiAtt(x, y, STR_VSWITCHES, idx, att);
} }
#if defined(FLIGHT_MODES) #if defined(FLIGHT_MODES)
@ -803,7 +822,7 @@ void putsCurve(coord_t x, coord_t y, int8_t idx, LcdFlags att)
putsStrIdx(x, y, STR_CV, idx, att); putsStrIdx(x, y, STR_CV, idx, att);
} }
void putsTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att) void putsTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att)
{ {
if (mode >= 0) { if (mode >= 0) {
if (mode < TMRMODE_COUNT) if (mode < TMRMODE_COUNT)

View file

@ -167,7 +167,7 @@ void lcd_outdez8(coord_t x, coord_t y, int8_t val);
void putsStrIdx(coord_t x, coord_t y, const pm_char *str, uint8_t idx, LcdFlags att=0); void putsStrIdx(coord_t x, coord_t y, const pm_char *str, uint8_t idx, LcdFlags att=0);
void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att);
void putsSwitches(coord_t x, coord_t y, int8_t swtch, LcdFlags att=0); void putsSwitches(coord_t x, coord_t y, int32_t swtch, LcdFlags att=0);
void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0);
void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0); void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0);
void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att=0);
@ -175,7 +175,7 @@ void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att=0);
void putsCurveRef(coord_t x, coord_t y, CurveRef &curve, LcdFlags att); void putsCurveRef(coord_t x, coord_t y, CurveRef &curve, LcdFlags att);
#endif #endif
void putsCurve(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); void putsCurve(coord_t x, coord_t y, int8_t idx, LcdFlags att=0);
void putsTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att=0); void putsTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att=0);
void putsTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); void putsTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att);
#define putsChn(x, y, idx, att) putsMixerSource(x, y, MIXSRC_CH1+idx-1, att) #define putsChn(x, y, idx, att) putsMixerSource(x, y, MIXSRC_CH1+idx-1, att)

View file

@ -62,9 +62,9 @@ void menuGeneralDiagAna(uint8_t event)
lcd_putsLeft(MENU_HEADER_HEIGHT+1+5*FH, STR_BATT_CALIB); lcd_putsLeft(MENU_HEADER_HEIGHT+1+5*FH, STR_BATT_CALIB);
static int32_t adcBatt; static int32_t adcBatt;
adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8;
uint32_t batCalV = (adcBatt + (adcBatt*g_eeGeneral.vBatCalib)/128) * BATT_SCALE; uint32_t batCalV = (adcBatt + (adcBatt*g_eeGeneral.txVoltageCalibration)/128) * BATT_SCALE;
batCalV >>= 11; batCalV >>= 11;
batCalV += 2; // because of the diode batCalV += 2; // because of the diode
putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+5*FH, batCalV, s_editMode > 0 ? BLINK|INVERS : INVERS); putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+5*FH, batCalV, s_editMode > 0 ? BLINK|INVERS : INVERS);
if (s_editMode > 0) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatCalib, -127, 127); if (s_editMode > 0) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127);
} }

View file

@ -219,9 +219,9 @@ void menuGeneralHardware(uint8_t event)
break; break;
#endif #endif
case ITEM_SETUP_HW_UART3_MODE: case ITEM_SETUP_HW_UART3_MODE:
g_eeGeneral.uart3Mode = selectMenuItem(HW_SETTINGS_COLUMN, y, STR_UART3MODE, STR_UART3MODES, g_eeGeneral.uart3Mode, 0, UART_MODE_MAX, attr, event); g_eeGeneral.serial2Mode = selectMenuItem(HW_SETTINGS_COLUMN, y, STR_UART3MODE, STR_UART3MODES, g_eeGeneral.serial2Mode, 0, UART_MODE_MAX, attr, event);
if (attr && checkIncDec_Ret) { if (attr && checkIncDec_Ret) {
uart3Init(g_eeGeneral.uart3Mode, MODEL_TELEMETRY_PROTOCOL()); serial2Init(g_eeGeneral.serial2Mode, MODEL_TELEMETRY_PROTOCOL());
} }
break; break;
} }

View file

@ -121,6 +121,35 @@ void onCustomFunctionsMenu(const char *result)
} }
} }
void onAdjustGvarSourceLongEnterPress(const char * result)
{
CustomFunctionData * cfn = &g_model.customFn[m_posVert];
if (result == STR_CONSTANT) {
CFN_GVAR_MODE(cfn) = FUNC_ADJUST_GVAR_CONSTANT;
CFN_PARAM(cfn) = 0;
eeDirty(EE_MODEL);
}
else if (result == STR_MIXSOURCE) {
CFN_GVAR_MODE(cfn) = FUNC_ADJUST_GVAR_SOURCE;
CFN_PARAM(cfn) = 0;
eeDirty(EE_MODEL);
}
else if (result == STR_GLOBALVAR) {
CFN_GVAR_MODE(cfn) = FUNC_ADJUST_GVAR_GVAR;
CFN_PARAM(cfn) = 0;
eeDirty(EE_MODEL);
}
else if (result == STR_INCDEC) {
CFN_GVAR_MODE(cfn) = FUNC_ADJUST_GVAR_INC;
CFN_PARAM(cfn) = 0;
eeDirty(EE_MODEL);
}
else {
onSourceLongEnterPress(result);
}
}
void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext) void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext)
{ {
int sub = m_posVert; int sub = m_posVert;
@ -325,8 +354,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
case FUNC_ADJUST_GVAR_SOURCE: case FUNC_ADJUST_GVAR_SOURCE:
val_max = MIXSRC_LAST_CH; val_max = MIXSRC_LAST_CH;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr); putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr);
// TODO later, we have a conflict on [Enter Long] here ... INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE);
// INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE);
INCDEC_ENABLE_CHECK(isSourceAvailable); INCDEC_ENABLE_CHECK(isSourceAvailable);
break; break;
case FUNC_ADJUST_GVAR_GVAR: case FUNC_ADJUST_GVAR_GVAR:
@ -334,27 +362,39 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
putsStrIdx(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_GV, val_displayed+1, attr); putsStrIdx(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_GV, val_displayed+1, attr);
break; break;
default: // FUNC_ADJUST_GVAR_INC default: // FUNC_ADJUST_GVAR_INC
#if 0 // TODO 2.2.X
val_min = -100; val_max = +100;
if (val_displayed < 0)
lcd_putsAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, "-=", attr);
else
lcd_putsAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, "+=", attr);
lcd_outdezAtt(lcdNextPos, y, abs(val_displayed), attr|LEFT);
#endif
val_max = 1; val_max = 1;
lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, PSTR("\003-=1+=1"), val_displayed, attr); lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, PSTR("\003-=1+=1"), val_displayed, attr);
break; break;
} }
if (attr && event==EVT_KEY_LONG(KEY_ENTER)) {
killEvents(event);
s_editMode = !s_editMode;
active = true;
CFN_GVAR_MODE(cfn) += 1;
CFN_GVAR_MODE(cfn) &= 0x03;
val_displayed = 0;
}
} }
#endif #endif
else if (attr) { else if (attr) {
REPEAT_LAST_CURSOR_MOVE(); REPEAT_LAST_CURSOR_MOVE();
} }
if (active) { if (active || event==EVT_KEY_LONG(KEY_ENTER)) {
CFN_PARAM(cfn) = CHECK_INCDEC_PARAM(event, val_displayed, val_min, val_max); CFN_PARAM(cfn) = CHECK_INCDEC_PARAM(event, val_displayed, val_min, val_max);
if (attr && event==EVT_KEY_LONG(KEY_ENTER)) {
killEvents(event);
if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_CONSTANT)
MENU_ADD_ITEM(STR_CONSTANT);
if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_SOURCE)
MENU_ADD_ITEM(STR_MIXSOURCE);
if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_GVAR)
MENU_ADD_ITEM(STR_GLOBALVAR);
if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INC)
MENU_ADD_ITEM(STR_INCDEC);
menuHandler = onAdjustGvarSourceLongEnterPress;
s_editMode = EDIT_MODIFY_FIELD;
}
} }
break; break;
} }

View file

@ -88,7 +88,7 @@ void DrawFunction(FnFuncP fn, uint8_t offset)
coord_t prev_yv = (coord_t)-1; coord_t prev_yv = (coord_t)-1;
for (int8_t xv=-WCHART; xv<=WCHART; xv++) { for (int xv=-WCHART; xv<=WCHART; xv++) {
coord_t yv = (LCD_H-1) - (((uint16_t)RESX + fn(xv * (RESX/WCHART))) / 2 * (LCD_H-1) / RESX); coord_t yv = (LCD_H-1) - (((uint16_t)RESX + fn(xv * (RESX/WCHART))) / 2 * (LCD_H-1) / RESX);
if (prev_yv != (coord_t)-1) { if (prev_yv != (coord_t)-1) {
if (abs((int8_t)yv-prev_yv) <= 1) { if (abs((int8_t)yv-prev_yv) <= 1) {
@ -108,7 +108,7 @@ uint8_t getExpoMixCount(uint8_t expo)
uint8_t count = 0; uint8_t count = 0;
uint8_t ch ; uint8_t ch ;
for(int8_t i=(expo ? MAX_EXPOS-1 : MAX_MIXERS-1); i>=0; i--) { for (int i=(expo ? MAX_EXPOS-1 : MAX_MIXERS-1); i>=0; i--) {
ch = (expo ? EXPO_VALID(expoAddress(i)) : mixAddress(i)->srcRaw); ch = (expo ? EXPO_VALID(expoAddress(i)) : mixAddress(i)->srcRaw);
if (ch != 0) { if (ch != 0) {
count++; count++;
@ -652,7 +652,7 @@ void displayHeaderChannelName(uint8_t ch)
{ {
uint8_t len = zlen(g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name)); uint8_t len = zlen(g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name));
if (len) { if (len) {
lcd_putsnAtt(70, 1, g_model.limitData[ch].name, len, ZCHAR|SMLSIZE); lcd_putsnAtt(80, 1, g_model.limitData[ch].name, len, ZCHAR|SMLSIZE);
} }
} }
@ -837,14 +837,14 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
// Value // Value
uint8_t index = expoAddress(s_currIdx)->chn; uint8_t index = expoAddress(s_currIdx)->chn;
if (!s_currCh) { if (!s_currCh) {
lcd_outdezAtt(120, 2, calcRESXto1000(anas[index]), PREC1|TINSIZE); lcd_outdezAtt(127, 2, calcRESXto1000(anas[index]), PREC1|TINSIZE);
} }
SIMPLE_MENU(STR_MENUINPUTS, menuTabModel, e_InputsAll, s_maxLines); SIMPLE_MENU(STR_MENUINPUTS, menuTabModel, e_InputsAll, s_maxLines);
// Gauge // Gauge
if (!s_currCh) { if (!s_currCh) {
drawGauge(120, 1, 58, 6, anas[index], 1024); drawGauge(127, 1, 58, 6, anas[index], 1024);
} }
} }
else { else {
@ -855,14 +855,14 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
uint8_t index = mixAddress(s_currIdx)->destCh; uint8_t index = mixAddress(s_currIdx)->destCh;
if (!s_currCh) { if (!s_currCh) {
displayHeaderChannelName(index); displayHeaderChannelName(index);
lcd_outdezAtt(120, 2, calcRESXto1000(ex_chans[index]), PREC1|TINSIZE); lcd_outdezAtt(127, 2, calcRESXto1000(ex_chans[index]), PREC1|TINSIZE);
} }
SIMPLE_MENU(STR_MIXER, menuTabModel, e_MixAll, s_maxLines); SIMPLE_MENU(STR_MIXER, menuTabModel, e_MixAll, s_maxLines);
// Gauge // Gauge
if (!s_currCh) { if (!s_currCh) {
drawGauge(120, 1, 58, 6, ex_chans[index], 1024); drawGauge(127, 1, 58, 6, ex_chans[index], 1024);
} }
} }

View file

@ -142,15 +142,15 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event)
switch (m_posHorz) { switch (m_posHorz) {
case 0: case 0:
{ {
int8_t timerMode = timer->mode; swsrc_t timerMode = timer->mode;
if (timerMode < 0) timerMode -= TMRMODE_COUNT-1; if (timerMode < 0) timerMode -= TMRMODE_COUNT-1;
CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers); CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers);
if (timerMode < 0) timerMode += TMRMODE_COUNT-1; if (timerMode < 0) timerMode += TMRMODE_COUNT-1;
timer->mode = timerMode; timer->mode = timerMode;
#if defined(AUTOSWITCH) #if defined(AUTOSWITCH)
if (s_editMode>0) { if (s_editMode>0) {
int8_t val = timer->mode - (TMRMODE_COUNT-1); swsrc_t val = timer->mode - (TMRMODE_COUNT-1);
int8_t switchVal = checkIncDecMovedSwitch(val); swsrc_t switchVal = checkIncDecMovedSwitch(val);
if (val != switchVal) { if (val != switchVal) {
timer->mode = switchVal + (TMRMODE_COUNT-1); timer->mode = switchVal + (TMRMODE_COUNT-1);
eeDirty(EE_MODEL); eeDirty(EE_MODEL);
@ -321,7 +321,7 @@ void menuModelSetup(uint8_t event)
break; break;
case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP: case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP:
g_model.timers[0].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[0].countdownBeep, 0, 2, attr, event); g_model.timers[0].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[0].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event);
break; break;
case ITEM_MODEL_TIMER1_PERSISTENT: case ITEM_MODEL_TIMER1_PERSISTENT:
@ -342,7 +342,7 @@ void menuModelSetup(uint8_t event)
break; break;
case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP: case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP:
g_model.timers[1].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[1].countdownBeep, 0, 2, attr, event); g_model.timers[1].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[1].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event);
break; break;
case ITEM_MODEL_TIMER2_PERSISTENT: case ITEM_MODEL_TIMER2_PERSISTENT:
@ -364,7 +364,7 @@ void menuModelSetup(uint8_t event)
break; break;
case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP: case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP:
g_model.timers[2].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[2].countdownBeep, 0, 2, attr, event); g_model.timers[2].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[2].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event);
break; break;
case ITEM_MODEL_TIMER3_PERSISTENT: case ITEM_MODEL_TIMER3_PERSISTENT:

View file

@ -73,8 +73,10 @@ enum menuModelTelemetryItems {
ITEM_TELEMETRY_SENSOR30, ITEM_TELEMETRY_SENSOR30,
ITEM_TELEMETRY_SENSOR31, ITEM_TELEMETRY_SENSOR31,
ITEM_TELEMETRY_SENSOR32, ITEM_TELEMETRY_SENSOR32,
ITEM_TELEMETRY_NEWSENSOR, ITEM_TELEMETRY_DISCOVER_SENSORS,
ITEM_TELEMETRY_IGNORE_SENSORID, ITEM_TELEMETRY_NEW_SENSOR,
ITEM_TELEMETRY_DELETE_ALL_SENSORS,
ITEM_TELEMETRY_IGNORE_SENSOR_INSTANCE,
#if defined(VARIO) #if defined(VARIO)
ITEM_TELEMETRY_VARIO_LABEL, ITEM_TELEMETRY_VARIO_LABEL,
ITEM_TELEMETRY_VARIO_SOURCE, ITEM_TELEMETRY_VARIO_SOURCE,
@ -121,7 +123,7 @@ enum menuModelTelemetryItems {
#define IS_RANGE_DEFINED(k) (g_model.frsky.channels[k].ratio > 0) #define IS_RANGE_DEFINED(k) (g_model.frsky.channels[k].ratio > 0)
#define SENSOR_ROWS(x) (isTelemetryFieldAvailable(x) ? (uint8_t)0 : HIDDEN_ROW) #define SENSOR_ROWS(x) (isTelemetryFieldAvailable(x) ? (uint8_t)0 : HIDDEN_ROW)
#define SENSORS_ROWS LABEL(Sensors), SENSOR_ROWS(0), SENSOR_ROWS(1), SENSOR_ROWS(2), SENSOR_ROWS(3), SENSOR_ROWS(4), SENSOR_ROWS(5), SENSOR_ROWS(6), SENSOR_ROWS(7), SENSOR_ROWS(8), SENSOR_ROWS(9), SENSOR_ROWS(10), SENSOR_ROWS(11), SENSOR_ROWS(12), SENSOR_ROWS(13), SENSOR_ROWS(14), SENSOR_ROWS(15), SENSOR_ROWS(16), SENSOR_ROWS(17), SENSOR_ROWS(18), SENSOR_ROWS(19), SENSOR_ROWS(20), SENSOR_ROWS(21), SENSOR_ROWS(22), SENSOR_ROWS(23), SENSOR_ROWS(24), SENSOR_ROWS(25), SENSOR_ROWS(26), SENSOR_ROWS(27), SENSOR_ROWS(28), SENSOR_ROWS(29), SENSOR_ROWS(30), SENSOR_ROWS(31), 0, 0, #define SENSORS_ROWS LABEL(Sensors), SENSOR_ROWS(0), SENSOR_ROWS(1), SENSOR_ROWS(2), SENSOR_ROWS(3), SENSOR_ROWS(4), SENSOR_ROWS(5), SENSOR_ROWS(6), SENSOR_ROWS(7), SENSOR_ROWS(8), SENSOR_ROWS(9), SENSOR_ROWS(10), SENSOR_ROWS(11), SENSOR_ROWS(12), SENSOR_ROWS(13), SENSOR_ROWS(14), SENSOR_ROWS(15), SENSOR_ROWS(16), SENSOR_ROWS(17), SENSOR_ROWS(18), SENSOR_ROWS(19), SENSOR_ROWS(20), SENSOR_ROWS(21), SENSOR_ROWS(22), SENSOR_ROWS(23), SENSOR_ROWS(24), SENSOR_ROWS(25), SENSOR_ROWS(26), SENSOR_ROWS(27), SENSOR_ROWS(28), SENSOR_ROWS(29), SENSOR_ROWS(30), SENSOR_ROWS(31), 0, 0, 0, 0,
#if defined(VARIO) #if defined(VARIO)
#define VARIO_ROWS LABEL(Vario), 0, 1, 2, #define VARIO_ROWS LABEL(Vario), 0, 1, 2,
#else #else
@ -142,7 +144,7 @@ enum menuModelTelemetryItems {
#define TELEMETRY_SCREEN_LINE(x) (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE ? HIDDEN_ROW : (uint8_t)2) #define TELEMETRY_SCREEN_LINE(x) (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE ? HIDDEN_ROW : (uint8_t)2)
#endif #endif
#define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x) #define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x)
#define TELEMETRY_CURRENT_EDIT_SCREEN(k) (k < ITEM_TELEMETRY_SCREEN_LABEL2 ? 0 : (k < ITEM_TELEMETRY_SCREEN_LABEL3 ? 1 : (k < ITEM_TELEMETRY_SCREEN_LABEL4 ? 2 : 3))) #define TELEMETRY_CURRENT_SCREEN(k) (k < ITEM_TELEMETRY_SCREEN_LABEL2 ? 0 : (k < ITEM_TELEMETRY_SCREEN_LABEL3 ? 1 : (k < ITEM_TELEMETRY_SCREEN_LABEL4 ? 2 : 3)))
enum SensorFields { enum SensorFields {
SENSOR_FIELD_NAME, SENSOR_FIELD_NAME,
@ -344,7 +346,7 @@ void menuModelSensor(uint8_t event)
lcd_putsLeft(y, STR_CURRENTSENSOR); lcd_putsLeft(y, STR_CURRENTSENSOR);
putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr);
if (attr) { if (attr) {
sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCurrentSensor); sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isTelemetryFieldAvailable);
} }
break; break;
} }
@ -467,7 +469,7 @@ void onSensorMenu(const char *result)
if (index<MAX_SENSORS && isTelemetryFieldAvailable(index)) if (index<MAX_SENSORS && isTelemetryFieldAvailable(index))
m_posVert += 1; m_posVert += 1;
else else
m_posVert = ITEM_TELEMETRY_NEWSENSOR; m_posVert = ITEM_TELEMETRY_NEW_SENSOR;
} }
else if (result == STR_COPY) { else if (result == STR_COPY) {
int newIndex = availableTelemetryIndex(); int newIndex = availableTelemetryIndex();
@ -492,7 +494,7 @@ void onSensorMenu(const char *result)
void onTelemetryScriptFileSelectionMenu(const char *result) void onTelemetryScriptFileSelectionMenu(const char *result)
{ {
int sub = m_posVert; int sub = m_posVert;
int screenIndex = TELEMETRY_CURRENT_EDIT_SCREEN(sub); int screenIndex = TELEMETRY_CURRENT_SCREEN(sub);
if (result == STR_UPDATE_LIST) { if (result == STR_UPDATE_LIST) {
if (!listSdFiles(SCRIPTS_TELEM_PATH, SCRIPTS_EXT, sizeof(g_model.frsky.screens[screenIndex].script.file), NULL)) { if (!listSdFiles(SCRIPTS_TELEM_PATH, SCRIPTS_EXT, sizeof(g_model.frsky.screens[screenIndex].script.file), NULL)) {
@ -517,6 +519,13 @@ void onTelemetryScriptFileSelectionMenu(const char *result)
void menuModelTelemetry(uint8_t event) void menuModelTelemetry(uint8_t event)
{ {
if (s_warning_result) {
s_warning_result = 0;
for (int i=0; i<MAX_SENSORS; i++) {
delTelemetryIndex(i);
}
}
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX, { TELEMETRY_TYPE_ROWS RSSI_ROWS SENSORS_ROWS VARIO_ROWS LABEL(TopBar), 0, 0, TOPLCD_ROWS TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1), CASE_CPUARM(TELEMETRY_SCREEN_ROWS(2)) CASE_CPUARM(TELEMETRY_SCREEN_ROWS(3)) }); MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX, { TELEMETRY_TYPE_ROWS RSSI_ROWS SENSORS_ROWS VARIO_ROWS LABEL(TopBar), 0, 0, TOPLCD_ROWS TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1), CASE_CPUARM(TELEMETRY_SCREEN_ROWS(2)) CASE_CPUARM(TELEMETRY_SCREEN_ROWS(3)) });
int sub = m_posVert; int sub = m_posVert;
@ -574,7 +583,7 @@ void menuModelTelemetry(uint8_t event)
switch (k) { switch (k) {
case ITEM_TELEMETRY_PROTOCOL_TYPE: case ITEM_TELEMETRY_PROTOCOL_TYPE:
g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, STR_TELEMETRY_TYPE, "\017FrSky S.PORT\0 FrSky D\0 FrSky D (cable)", g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, g_eeGeneral.uart3Mode==UART_MODE_TELEMETRY ? PROTOCOL_FRSKY_D_SECONDARY : PROTOCOL_FRSKY_D, attr, event); g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, STR_TELEMETRY_TYPE, "\017FrSky S.PORT\0 FrSky D\0 FrSky D (cable)", g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, g_eeGeneral.serial2Mode==UART_MODE_TELEMETRY ? PROTOCOL_FRSKY_D_SECONDARY : PROTOCOL_FRSKY_D, attr, event);
break; break;
case ITEM_TELEMETRY_SENSORS_LABEL: case ITEM_TELEMETRY_SENSORS_LABEL:
@ -585,7 +594,15 @@ void menuModelTelemetry(uint8_t event)
} }
break; break;
case ITEM_TELEMETRY_NEWSENSOR: case ITEM_TELEMETRY_DISCOVER_SENSORS:
lcd_putsAtt(0, y, allowNewSensors ? STR_STOP_DISCOVER_SENSORS : STR_DISCOVER_SENSORS, attr);
if (attr && event==EVT_KEY_BREAK(KEY_ENTER)) {
s_editMode = 0;
allowNewSensors = !allowNewSensors;
}
break;
case ITEM_TELEMETRY_NEW_SENSOR:
lcd_putsAtt(0, y, STR_TELEMETRY_NEWSENSOR, attr); lcd_putsAtt(0, y, STR_TELEMETRY_NEWSENSOR, attr);
if (attr && event==EVT_KEY_BREAK(KEY_ENTER)) { if (attr && event==EVT_KEY_BREAK(KEY_ENTER)) {
s_editMode = 0; s_editMode = 0;
@ -600,8 +617,17 @@ void menuModelTelemetry(uint8_t event)
} }
break; break;
case ITEM_TELEMETRY_IGNORE_SENSORID: case ITEM_TELEMETRY_DELETE_ALL_SENSORS:
ON_OFF_MENU_ITEM(g_model.ignoreSensorIds, TELEM_COL2, y, STR_IGNOREIDS, attr, event); lcd_putsAtt(0, y, STR_DELETE_ALL_SENSORS, attr);
s_editMode = 0;
if (attr && event==EVT_KEY_LONG(KEY_ENTER)) {
killEvents(KEY_ENTER);
POPUP_CONFIRMATION(STR_CONFIRMDELETE);
}
break;
case ITEM_TELEMETRY_IGNORE_SENSOR_INSTANCE:
ON_OFF_MENU_ITEM(g_model.ignoreSensorIds, TELEM_COL2, y, STR_IGNORE_INSTANCE, attr, event);
break; break;
case ITEM_TELEMETRY_RSSI_LABEL: case ITEM_TELEMETRY_RSSI_LABEL:
@ -705,7 +731,7 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_SCREEN_LABEL3: case ITEM_TELEMETRY_SCREEN_LABEL3:
case ITEM_TELEMETRY_SCREEN_LABEL4: case ITEM_TELEMETRY_SCREEN_LABEL4:
{ {
uint8_t screenIndex = TELEMETRY_CURRENT_EDIT_SCREEN(k); uint8_t screenIndex = TELEMETRY_CURRENT_SCREEN(k);
putsStrIdx(0*FW, y, STR_SCREEN, screenIndex+1); putsStrIdx(0*FW, y, STR_SCREEN, screenIndex+1);
TelemetryScreenType oldScreenType = TELEMETRY_SCREEN_TYPE(screenIndex); TelemetryScreenType oldScreenType = TELEMETRY_SCREEN_TYPE(screenIndex);
TelemetryScreenType newScreenType = (TelemetryScreenType)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VTELEMSCREENTYPE, oldScreenType, 0, TELEMETRY_SCREEN_TYPE_MAX, (m_posHorz==0 ? attr : 0), event); TelemetryScreenType newScreenType = (TelemetryScreenType)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VTELEMSCREENTYPE, oldScreenType, 0, TELEMETRY_SCREEN_TYPE_MAX, (m_posHorz==0 ? attr : 0), event);

View file

@ -176,7 +176,7 @@ extern const CheckIncDecStops &stopsSwitch;
(val), (val+1) (val), (val+1)
int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int i_flags=0, IsValueAvailable isValueAvailable=NULL, const CheckIncDecStops &stops=stops100); int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int i_flags=0, IsValueAvailable isValueAvailable=NULL, const CheckIncDecStops &stops=stops100);
int8_t checkIncDecMovedSwitch(int8_t val); swsrc_t checkIncDecMovedSwitch(swsrc_t val);
#define checkIncDecModel(event, i_val, i_min, i_max) checkIncDec(event, i_val, i_min, i_max, EE_MODEL) #define checkIncDecModel(event, i_val, i_min, i_max) checkIncDec(event, i_val, i_min, i_max, EE_MODEL)
#define checkIncDecModelZero(event, i_val, i_max) checkIncDec(event, i_val, 0, i_max, EE_MODEL) #define checkIncDecModelZero(event, i_val, i_max) checkIncDec(event, i_val, 0, i_max, EE_MODEL)
#define checkIncDecGen(event, i_val, i_min, i_max) checkIncDec(event, i_val, i_min, i_max, EE_GENERAL) #define checkIncDecGen(event, i_val, i_min, i_max) checkIncDec(event, i_val, i_min, i_max, EE_GENERAL)

Some files were not shown because too many files have changed in this diff Show more