1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-21 23:35:17 +03:00

Issue #515 fixed. Standalone Qt based simu added. xsimulatordialog and

simulatordialog merged
This commit is contained in:
Bertrand Songis 2014-02-14 18:34:01 +01:00
parent 0b9602a8da
commit 0d76f2461a
48 changed files with 4112 additions and 9488 deletions

View file

@ -72,50 +72,9 @@ ELSE( )
LINK_DIRECTORIES( /usr/local/lib )
ENDIF( )
INCLUDE_DIRECTORIES( ${XSD_INCLUDE_DIR} )
FIND_PACKAGE( Subversion )
SET( C9X_WC_REVISION 0 )
IF( Subversion_FOUND )
# Subversion_WC_INFO( ${PROJECT_SOURCE_DIR} C9X )
ENDIF( )
set(RADIO_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}/../../radio/src)
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${RADIO_SRC_DIRECTORY}/../..
${RADIO_SRC_DIRECTORY}
${RADIO_SRC_DIRECTORY}/fonts/std
${RADIO_SRC_DIRECTORY}/lua/src
)
set(TH9X_CHECKOUT_DIRECTORY ${PROJECT_BINARY_DIR}/firmwares/th9x)
add_custom_command(
OUTPUT ${TH9X_CHECKOUT_DIRECTORY}/th9xsimulator.cpp
COMMAND ${CMAKE_COMMAND} -E make_directory ${TH9X_CHECKOUT_DIRECTORY}
COMMAND cd ${TH9X_CHECKOUT_DIRECTORY} && svn checkout http://th9x.googlecode.com/svn/trunk/src@285 .
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/firmwares/th9x/th9xsimulator.cpp ${TH9X_CHECKOUT_DIRECTORY}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/firmwares/th9x/th9xsimulator.cpp
)
set(ER9X_CHECKOUT_DIRECTORY ${PROJECT_BINARY_DIR}/firmwares/er9x)
add_custom_command(
OUTPUT ${ER9X_CHECKOUT_DIRECTORY}/er9xsimulator.cpp
COMMAND ${CMAKE_COMMAND} -E make_directory ${ER9X_CHECKOUT_DIRECTORY}
COMMAND cd ${ER9X_CHECKOUT_DIRECTORY} && svn checkout http://er9x.googlecode.com/svn/trunk/src@790 .
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/firmwares/er9x/er9xsimulator.cpp ${ER9X_CHECKOUT_DIRECTORY}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/firmwares/er9x/er9xsimulator.cpp
)
set(ERSKY9X_CHECKOUT_DIRECTORY ${PROJECT_BINARY_DIR}/firmwares/ersky9x)
add_custom_command(
OUTPUT ${ERSKY9X_CHECKOUT_DIRECTORY}/ersky9xsimulator.cpp
COMMAND ${CMAKE_COMMAND} -E make_directory ${ERSKY9X_CHECKOUT_DIRECTORY}
COMMAND cd ${ERSKY9X_CHECKOUT_DIRECTORY} && svn checkout http://ersky9x.googlecode.com/svn/trunk/src@170 .
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/firmwares/ersky9x/ersky9xsimulator.cpp ${ERSKY9X_CHECKOUT_DIRECTORY}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/firmwares/ersky9x/ersky9xsimulator.cpp
)
set(SIMU_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}/simulator)
set(COMPANION_SRC_DIRECTORY ${PROJECT_SOURCE_DIR})
add_custom_command(
OUTPUT ${RADIO_SRC_DIRECTORY}/bitmaps/sticks.lbm
@ -124,7 +83,18 @@ add_custom_command(
WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
)
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${PROJECT_SOURCE_DIR}/../..
${SIMU_SRC_DIRECTORY}
${RADIO_SRC_DIRECTORY}
${RADIO_SRC_DIRECTORY}/fonts/std
${RADIO_SRC_DIRECTORY}/lua/src
${XSD_INCLUDE_DIR}
)
add_subdirectory(modeledit)
add_subdirectory(simulator)
SET( companion_SRCS
eeprominterface.cpp
@ -135,10 +105,8 @@ SET( companion_SRCS
${PROJECT_BINARY_DIR}/radio.cxx
firmwares/th9x/th9xeeprom.cpp
firmwares/th9x/th9xinterface.cpp
${TH9X_CHECKOUT_DIRECTORY}/th9xsimulator.cpp
firmwares/er9x/er9xeeprom.cpp
firmwares/er9x/er9xinterface.cpp
${ER9X_CHECKOUT_DIRECTORY}/er9xsimulator.cpp
firmwares/gruvin9x/gruvin9xeeprom.cpp
firmwares/gruvin9x/gruvin9xinterface.cpp
firmwares/opentx/opentxeeprom.cpp
@ -153,7 +121,6 @@ SET( companion_SRCS
firmwares/opentx/opentxsimulator.cpp
firmwares/ersky9x/ersky9xeeprom.cpp
firmwares/ersky9x/ersky9xinterface.cpp
${ERSKY9X_CHECKOUT_DIRECTORY}/ersky9xsimulator.cpp
${RADIO_SRC_DIRECTORY}/bitmaps/sticks.lbm
helpers.cpp
mdichild.cpp
@ -172,8 +139,6 @@ SET( companion_SRCS
fusesdialog.cpp
logsdialog.cpp
downloaddialog.cpp
simulatordialog.cpp
xsimulatordialog.cpp
splashlibrary.cpp
mainwindow.cpp
main.cpp
@ -196,12 +161,6 @@ SET( companion_MOC_HDRS
splashlabel.h
burndialog.h
downloaddialog.h
cursorwidget.h
menuwidget.h
simulatordialog.h
xcursorwidget.h
xmenuwidget.h
xsimulatordialog.h
generaledit.h
modelslist.h
mdichild.h
@ -220,8 +179,6 @@ SET( companion_UIS
logsdialog.ui
apppreferencesdialog.ui
fwpreferencesdialog.ui
simulatordialog.ui
xsimulatordialog.ui
burnconfigdialog.ui
downloaddialog.ui
generaledit.ui
@ -233,25 +190,6 @@ SET( companion_UIS
modelconfigdialog.ui
)
IF ( SDL_FOUND )
SET( companion_SRCS
${companion_SRCS}
joystick.cpp
joystickdialog.cpp
)
SET( companion_MOC_HDRS
${companion_MOC_HDRS}
joystick.h
joystickdialog.h
)
SET( companion_UIS
${companion_UIS}
joystickdialog.ui
)
ENDIF( )
SET( companion_RCS
companion.qrc
${CMAKE_CURRENT_BINARY_DIR}/translations.qrc
@ -322,7 +260,7 @@ ELSE( )
ADD_EXECUTABLE( ${PROJECT_NAME} WIN32 ${companion_SRCS} ${companion_QM} )
ENDIF( )
TARGET_LINK_LIBRARIES( ${PROJECT_NAME} modeledit ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY} ${XERCESC_LIBRARY} ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${PHONON_LIBS} )
TARGET_LINK_LIBRARIES( ${PROJECT_NAME} modeledit simulation ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY} ${XERCESC_LIBRARY} ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${PHONON_LIBS} )
IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
INSTALL( TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin )

View file

@ -992,13 +992,13 @@ void RegisterEepromInterfaces()
{
QSettings settings;
int rev4a = settings.value("rev4asupport",0).toInt();
eepromInterfaces.push_back(new Open9xInterface(BOARD_STOCK));
eepromInterfaces.push_back(new Open9xInterface(BOARD_M128));
eepromInterfaces.push_back(new Open9xInterface(BOARD_GRUVIN9X));
eepromInterfaces.push_back(new Open9xInterface(BOARD_SKY9X));
eepromInterfaces.push_back(new Open9xInterface(BOARD_TARANIS));
eepromInterfaces.push_back(new OpenTxInterface(BOARD_STOCK));
eepromInterfaces.push_back(new OpenTxInterface(BOARD_M128));
eepromInterfaces.push_back(new OpenTxInterface(BOARD_GRUVIN9X));
eepromInterfaces.push_back(new OpenTxInterface(BOARD_SKY9X));
eepromInterfaces.push_back(new OpenTxInterface(BOARD_TARANIS));
if (rev4a)
eepromInterfaces.push_back(new Open9xInterface(BOARD_TARANIS_REV4a));
eepromInterfaces.push_back(new OpenTxInterface(BOARD_TARANIS_REV4a));
eepromInterfaces.push_back(new Gruvin9xInterface(BOARD_STOCK));
eepromInterfaces.push_back(new Gruvin9xInterface(BOARD_GRUVIN9X));
eepromInterfaces.push_back(new Ersky9xInterface());
@ -1010,26 +1010,11 @@ QList<FirmwareInfo *> firmwares;
FirmwareVariant default_firmware_variant;
FirmwareVariant current_firmware_variant;
const char * ER9X_STAMP = "http://er9x.googlecode.com/svn/trunk/src/stamp-er9x.h";
const char * ERSKY9X_STAMP = "http://ersky9x.googlecode.com/svn/trunk/src/stamp-ersky9x.h";
void RegisterFirmwares()
{
firmwares.push_back(new FirmwareInfo("th9x", QObject::tr("th9x"), new Th9xInterface(), "http://th9x.googlecode.com/svn/trunk/%1.bin", "http://th9x.googlecode.com/svn/trunk/src/stamp-th9x.h"));
firmwares.push_back(new FirmwareInfo("er9x", QObject::tr("er9x"), new Er9xInterface(), "http://er9x.googlecode.com/svn/trunk/%1.hex", ER9X_STAMP));
FirmwareInfo * er9x = firmwares.last();
Option er9x_options[] = { { "noht", "", 0 }, { "frsky", "", 0 }, { "frsky-noht", "", 0 }, { "jeti", "", 0 }, { "ardupilot", "", 0 }, { "nmea", "", 0 }, { NULL } };
er9x->addOptions(er9x_options);
er9x->addOption("noht");
RegisterOpen9xFirmwares();
#ifndef __APPLE__
firmwares.push_back(new FirmwareInfo("ersky9x", QObject::tr("ersky9x"), new Ersky9xInterface(), "http://ersky9x.googlecode.com/svn/trunk/ersky9x_rom.bin", ERSKY9X_STAMP));
#endif
default_firmware_variant = GetFirmwareVariant("opentx-9x-heli-templates-en");
current_firmware_variant = default_firmware_variant;
RegisterEepromInterfaces();
}
@ -1070,7 +1055,6 @@ FirmwareVariant GetFirmwareVariant(QString id)
FirmwareVariant result;
foreach(FirmwareInfo * firmware, firmwares) {
if (id.contains(firmware->id+"-") || (!id.contains("-") && id.contains(firmware->id))) {
result.id = id;
result.firmware = firmware;

View file

@ -950,7 +950,6 @@ enum Capability {
FlightPhases,
FlightModesName,
FlightPhasesHaveFades,
SimulatorType,
Mixes,
MixesWithoutExpo,
Timers,
@ -1059,15 +1058,8 @@ enum Capability {
HasFasOffset,
HasMahPersistent,
MultiposPots,
MultiposPotsPositions
};
enum UseContext {
DefaultContext,
TimerContext,
FlightPhaseContext,
MixerContext,
ExpoContext,
MultiposPotsPositions,
SimulatorVariant,
};
class SimulatorInterface;
@ -1102,7 +1094,7 @@ class EEPROMInterface
virtual int isAvailable(Protocol proto, int port=0) = 0;
virtual SimulatorInterface * getSimulator() = 0;
virtual SimulatorInterface * getSimulator() { return NULL; }
virtual const int getEEpromSize() = 0;

View file

@ -303,7 +303,7 @@ int Er9xInterface::isAvailable(Protocol prot, int port)
SimulatorInterface * Er9xInterface::getSimulator()
{
return new Er9xSimulator(this);
return NULL; // new Er9xSimulator(this);
}

View file

@ -343,7 +343,7 @@ int Ersky9xInterface::isAvailable(Protocol prot, int port)
SimulatorInterface * Ersky9xInterface::getSimulator()
{
return new Ersky9xSimulator(this);
return NULL; // new Ersky9xSimulator(this);
}

View file

@ -105,7 +105,7 @@ uint8_t getStickMode()
using namespace Open9xGruvin9x;
Open9xGruvin9xSimulator::Open9xGruvin9xSimulator(Open9xInterface * open9xInterface):
Open9xGruvin9xSimulator::Open9xGruvin9xSimulator(OpenTxInterface * open9xInterface):
open9xInterface(open9xInterface)
{
}
@ -128,15 +128,23 @@ bool Open9xGruvin9xSimulator::lcdChanged(bool & lightEnable)
#include "simulatorimport.h"
}
void Open9xGruvin9xSimulator::start(RadioData &radioData, bool tests)
void Open9xGruvin9xSimulator::start(QByteArray & eeprom, bool tests)
{
g_rotenc[0] = 0;
g_rotenc[1] = 0;
open9xInterface->save(&eeprom[0], radioData, SIMU_GRUVIN9X_VARIANTS);
memcpy(Open9xGruvin9x::eeprom, eeprom.data(), std::min<int>(sizeof(Open9xGruvin9x::eeprom), eeprom.size()));
StartEepromThread(NULL);
StartMainThread(tests);
}
void Open9xGruvin9xSimulator::start(const char * filename, bool tests)
{
g_rotenc[0] = 0;
g_rotenc[1] = 0;
StartEepromThread(filename);
StartMainThread(tests);
}
void Open9xGruvin9xSimulator::stop()
{
StopMainThread();

View file

@ -20,15 +20,17 @@
#include "simulatorinterface.h"
class RadioData;
class Open9xInterface;
class OpenTxInterface;
class Open9xGruvin9xSimulator : public SimulatorInterface {
public:
Open9xGruvin9xSimulator(Open9xInterface *);
Open9xGruvin9xSimulator(OpenTxInterface *);
virtual void start(RadioData & radioData, bool tests);
virtual void start(QByteArray & eeprom, bool tests=true);
virtual void start(const char * filename, bool tests=true);
virtual void stop();
@ -54,7 +56,7 @@ class Open9xGruvin9xSimulator : public SimulatorInterface {
protected:
Open9xInterface * open9xInterface;
OpenTxInterface * open9xInterface;
};
#endif

View file

@ -103,7 +103,7 @@ uint8_t getStickMode()
using namespace Open9xM128;
Open9xM128Simulator::Open9xM128Simulator(Open9xInterface * open9xInterface):
Open9xM128Simulator::Open9xM128Simulator(OpenTxInterface * open9xInterface):
open9xInterface(open9xInterface)
{
}
@ -126,13 +126,19 @@ bool Open9xM128Simulator::lcdChanged(bool & lightEnable)
#include "simulatorimport.h"
}
void Open9xM128Simulator::start(RadioData &radioData, bool tests)
void Open9xM128Simulator::start(QByteArray & eeprom, bool tests)
{
open9xInterface->save(&eeprom[0], radioData, SIMU_M128_VARIANTS);
memcpy(Open9xM128::eeprom, eeprom.data(), std::min<int>(sizeof(Open9xM128::eeprom), eeprom.size()));
StartEepromThread(NULL);
StartMainThread(tests);
}
void Open9xM128Simulator::start(const char * filename, bool tests)
{
StartEepromThread(filename);
StartMainThread(tests);
}
void Open9xM128Simulator::stop()
{
StopMainThread();

View file

@ -20,15 +20,17 @@
#include "simulatorinterface.h"
class RadioData;
class Open9xInterface;
class OpenTxInterface;
class Open9xM128Simulator : public SimulatorInterface {
public:
Open9xM128Simulator(Open9xInterface *);
Open9xM128Simulator(OpenTxInterface *);
virtual void start(RadioData & radioData, bool tests);
virtual void start(QByteArray & eeprom, bool tests=true);
virtual void start(const char * filename, bool tests=true);
virtual void stop();
@ -54,7 +56,7 @@ class Open9xM128Simulator : public SimulatorInterface {
protected:
Open9xInterface * open9xInterface;
OpenTxInterface * open9xInterface;
};
#endif

View file

@ -132,7 +132,7 @@ uint8_t getStickMode()
using namespace Open9xSky9x;
Open9xSky9xSimulator::Open9xSky9xSimulator(Open9xInterface * open9xInterface):
Open9xSky9xSimulator::Open9xSky9xSimulator(OpenTxInterface * open9xInterface):
open9xInterface(open9xInterface)
{
QSettings settings;
@ -162,14 +162,21 @@ bool Open9xSky9xSimulator::lcdChanged(bool & lightEnable)
#include "simulatorimport.h"
}
void Open9xSky9xSimulator::start(RadioData &radioData, bool tests)
void Open9xSky9xSimulator::start(QByteArray & eeprom, bool tests)
{
g_rotenc[0] = 0;
open9xInterface->save(&eeprom[0], radioData);
memcpy(Open9xSky9x::eeprom, eeprom.data(), std::min<int>(sizeof(Open9xSky9x::eeprom), eeprom.size()));
StartEepromThread(NULL);
StartMainThread(tests);
}
void Open9xSky9xSimulator::start(const char * filename, bool tests)
{
g_rotenc[0] = 0;
StartEepromThread(filename);
StartMainThread(tests);
}
void Open9xSky9xSimulator::stop()
{
StopMainThread();

View file

@ -20,15 +20,17 @@
#include "simulatorinterface.h"
class RadioData;
class Open9xInterface;
class OpenTxInterface;
class Open9xSky9xSimulator : public SimulatorInterface {
public:
Open9xSky9xSimulator(Open9xInterface *);
Open9xSky9xSimulator(OpenTxInterface *);
virtual void start(RadioData & radioData, bool tests);
virtual void start(QByteArray & eeprom, bool tests=true);
virtual void start(const char * filename, bool tests=true);
virtual void stop();
@ -54,7 +56,7 @@ class Open9xSky9xSimulator : public SimulatorInterface {
protected:
Open9xInterface * open9xInterface;
OpenTxInterface * open9xInterface;
};
#endif

View file

@ -177,7 +177,7 @@ void resetTrims()
using namespace Open9xX9D;
OpentxTaranisSimulator::OpentxTaranisSimulator(Open9xInterface * open9xInterface):
OpentxTaranisSimulator::OpentxTaranisSimulator(OpenTxInterface * open9xInterface):
open9xInterface(open9xInterface)
{
taranisSimulatorBoard = GetEepromInterface()->getBoard();
@ -208,13 +208,19 @@ bool OpentxTaranisSimulator::lcdChanged(bool & lightEnable)
#include "simulatorimport.h"
}
void OpentxTaranisSimulator::start(RadioData &radioData, bool tests)
void OpentxTaranisSimulator::start(QByteArray & eeprom, bool tests)
{
open9xInterface->save(Open9xX9D::eeprom, radioData);
memcpy(Open9xX9D::eeprom, eeprom.data(), std::min<int>(sizeof(Open9xX9D::eeprom), eeprom.size()));
StartEepromThread(NULL);
StartMainThread(tests);
}
void OpentxTaranisSimulator::start(const char * filename, bool tests)
{
StartEepromThread(filename);
StartMainThread(tests);
}
void OpentxTaranisSimulator::stop()
{
StopMainThread();

View file

@ -20,15 +20,17 @@
#include "simulatorinterface.h"
class RadioData;
class Open9xInterface;
class OpenTxInterface;
class OpentxTaranisSimulator : public SimulatorInterface {
public:
OpentxTaranisSimulator(Open9xInterface *);
OpentxTaranisSimulator(OpenTxInterface *);
virtual void start(RadioData & radioData, bool tests);
virtual void start(QByteArray & eeprom, bool tests=true);
virtual void start(const char * filename, bool tests=true);
virtual void stop();
@ -54,7 +56,7 @@ class OpentxTaranisSimulator : public SimulatorInterface {
protected:
Open9xInterface * open9xInterface;
OpenTxInterface * open9xInterface;
};
#endif

View file

@ -30,8 +30,6 @@
#define SIMU_STOCK_VARIANTS (GVARS_VARIANT|FRSKY_VARIANT)
#define SIMU_M128_VARIANTS (M128_VARIANT|SIMU_STOCK_VARIANTS)
#define SIMU_GRUVIN9X_VARIANTS (0)
#define SIMU_ARM_VARIANTS (0)
#define O9X_MAX_TIMERS 2
#define O9X_MAX_PHASES 5

View file

@ -42,18 +42,18 @@ size_t SizeOfArray( T(&)[ N ] )
return N;
}
Open9xInterface::Open9xInterface(BoardEnum board):
OpenTxInterface::OpenTxInterface(BoardEnum board):
EEPROMInterface(board),
efile(new EFile())
{
}
Open9xInterface::~Open9xInterface()
OpenTxInterface::~OpenTxInterface()
{
delete efile;
}
const char * Open9xInterface::getName()
const char * OpenTxInterface::getName()
{
switch (board) {
case BOARD_STOCK:
@ -73,7 +73,7 @@ const char * Open9xInterface::getName()
}
}
const int Open9xInterface::getEEpromSize()
const int OpenTxInterface::getEEpromSize()
{
switch (board) {
case BOARD_STOCK:
@ -93,7 +93,7 @@ const int Open9xInterface::getEEpromSize()
}
}
const int Open9xInterface::getMaxModels()
const int OpenTxInterface::getMaxModels()
{
if (IS_ARM(board))
return 60;
@ -106,7 +106,7 @@ const int Open9xInterface::getMaxModels()
}
template <class T>
bool Open9xInterface::loadModel(ModelData &model, uint8_t *data, int index, unsigned int stickMode)
bool OpenTxInterface::loadModel(ModelData &model, uint8_t *data, int index, unsigned int stickMode)
{
T _model;
@ -139,7 +139,7 @@ bool Open9xInterface::loadModel(ModelData &model, uint8_t *data, int index, unsi
}
template <class T>
bool Open9xInterface::loadModelVariant(unsigned int index, ModelData &model, uint8_t *data, unsigned int version, unsigned int variant)
bool OpenTxInterface::loadModelVariant(unsigned int index, ModelData &model, uint8_t *data, unsigned int version, unsigned int variant)
{
T open9xModel(model, board, version, variant);
@ -166,7 +166,7 @@ bool Open9xInterface::loadModelVariant(unsigned int index, ModelData &model, uin
return true;
}
bool Open9xInterface::loadModel(uint8_t version, ModelData &model, uint8_t *data, int index, unsigned int variant, unsigned int stickMode)
bool OpenTxInterface::loadModel(uint8_t version, ModelData &model, uint8_t *data, int index, unsigned int variant, unsigned int stickMode)
{
if (version == 201) {
return loadModel<Open9xModelData_v201>(model, data, index, stickMode);
@ -247,7 +247,7 @@ bool Open9xInterface::loadModel(uint8_t version, ModelData &model, uint8_t *data
}
template <class T>
bool Open9xInterface::loadGeneral(GeneralSettings &settings, unsigned int version)
bool OpenTxInterface::loadGeneral(GeneralSettings &settings, unsigned int version)
{
QByteArray eepromData(sizeof(settings), 0); // GeneralSettings should be always bigger than the EEPROM struct
T open9xSettings(settings, board, version);
@ -263,7 +263,7 @@ bool Open9xInterface::loadGeneral(GeneralSettings &settings, unsigned int versio
}
template <class T>
bool Open9xInterface::saveGeneral(GeneralSettings &settings, BoardEnum board, uint32_t version, uint32_t variant)
bool OpenTxInterface::saveGeneral(GeneralSettings &settings, BoardEnum board, uint32_t version, uint32_t variant)
{
T open9xSettings(settings, board, version, variant);
// open9xSettings.Dump();
@ -274,7 +274,7 @@ bool Open9xInterface::saveGeneral(GeneralSettings &settings, BoardEnum board, ui
}
template <class T>
bool Open9xInterface::saveModel(unsigned int index, ModelData &model, unsigned int version, unsigned int variant)
bool OpenTxInterface::saveModel(unsigned int index, ModelData &model, unsigned int version, unsigned int variant)
{
T open9xModel(model, board, version, variant);
// open9xModel.Dump();
@ -284,12 +284,12 @@ bool Open9xInterface::saveModel(unsigned int index, ModelData &model, unsigned i
return (sz == eeprom.size());
}
bool Open9xInterface::loadxml(RadioData &radioData, QDomDocument &doc)
bool OpenTxInterface::loadxml(RadioData &radioData, QDomDocument &doc)
{
return false;
}
bool Open9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size)
bool OpenTxInterface::load(RadioData &radioData, uint8_t *eeprom, int size)
{
std::cout << "trying " << getName() << " import...";
@ -350,7 +350,7 @@ bool Open9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size)
return true;
}
int Open9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t variant, uint8_t version)
int OpenTxInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t variant, uint8_t version)
{
EEPROMWarnings.clear();
@ -403,7 +403,7 @@ int Open9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t varian
return size;
}
int Open9xInterface::getSize(ModelData &model)
int OpenTxInterface::getSize(ModelData &model)
{
if (board == BOARD_SKY9X)
return 0;
@ -426,7 +426,7 @@ int Open9xInterface::getSize(ModelData &model)
return efile->size(0);
}
int Open9xInterface::getSize(GeneralSettings &settings)
int OpenTxInterface::getSize(GeneralSettings &settings)
{
if (board == BOARD_SKY9X)
return 0;
@ -446,7 +446,7 @@ int Open9xInterface::getSize(GeneralSettings &settings)
return efile->size(0);
}
int Open9xInterface::getCapability(const Capability capability)
int OpenTxInterface::getCapability(const Capability capability)
{
switch (capability) {
case OwnerName:
@ -456,11 +456,6 @@ int Open9xInterface::getCapability(const Capability capability)
return 1;
else
return 0;
case SimulatorType:
if (IS_TARANIS(board))
return 1;
else
return 0;
case HasBeeper:
if (IS_ARM(board))
return 0;
@ -687,12 +682,19 @@ int Open9xInterface::getCapability(const Capability capability)
return IS_TARANIS(board) ? 2 : 0;
case MultiposPotsPositions:
return IS_TARANIS(board) ? 6 : 0;
case SimulatorVariant:
if (board == BOARD_STOCK)
return SIMU_STOCK_VARIANTS;
else if (board == BOARD_M128)
return SIMU_M128_VARIANTS;
else
return 0;
default:
return 0;
}
}
int Open9xInterface::isAvailable(Protocol proto, int port)
int OpenTxInterface::isAvailable(Protocol proto, int port)
{
if (IS_TARANIS(board)) {
switch (port) {
@ -777,7 +779,7 @@ int Open9xInterface::isAvailable(Protocol proto, int port)
}
}
SimulatorInterface * Open9xInterface::getSimulator()
SimulatorInterface * OpenTxInterface::getSimulator()
{
switch (board) {
case BOARD_STOCK:
@ -789,7 +791,6 @@ SimulatorInterface * Open9xInterface::getSimulator()
case BOARD_SKY9X:
return new Open9xSky9xSimulator(this);
case BOARD_TARANIS:
return new OpentxTaranisSimulator(this);
case BOARD_TARANIS_REV4a:
return new OpentxTaranisSimulator(this);
default:
@ -802,7 +803,7 @@ size_t getSizeA(T (&)[SIZE]) {
return SIZE;
}
bool Open9xInterface::checkVersion(unsigned int version)
bool OpenTxInterface::checkVersion(unsigned int version)
{
switch(version) {
case 201:
@ -868,7 +869,7 @@ bool Open9xInterface::checkVersion(unsigned int version)
return true;
}
bool Open9xInterface::checkVariant(unsigned int version, unsigned int variant)
bool OpenTxInterface::checkVariant(unsigned int version, unsigned int variant)
{
if (board == BOARD_M128 && !(variant & 0x8000)) {
if (version == 212) {
@ -890,7 +891,7 @@ bool Open9xInterface::checkVariant(unsigned int version, unsigned int variant)
}
}
bool Open9xInterface::loadBackup(RadioData &radioData, uint8_t *eeprom, int esize, int index)
bool OpenTxInterface::loadBackup(RadioData &radioData, uint8_t *eeprom, int esize, int index)
{
std::cout << "trying " << getName() << " backup import...";
@ -1015,7 +1016,7 @@ void RegisterOpen9xFirmwares()
Option extr_options[] = { { "frsky", QObject::tr("Support for frsky telemetry mod"), FRSKY_VARIANT }, { "jeti", QObject::tr("Support for jeti telemetry mod"), 0 }, { "ardupilot", QObject::tr("Support for receiving ardupilot data"), 0 }, { "nmea", QObject::tr("Support for receiving NMEA data"), 0 }, { "mavlink", QObject::tr("Support for MAVLINK devices"), MAVLINK_VARIANT }, { NULL } };
Option fai_options[] = { { "faichoice", QObject::tr("Possibility to enable FAI MODE at field") }, { "faimode", QObject::tr("FAI MODE always enabled") }, { NULL } };
/* 9x board */
open9x = new Open9xFirmware("opentx-9x", QObject::tr("OpenTX for 9X board"), new Open9xInterface(BOARD_STOCK), geturl(BOARD_STOCK), getstamp(BOARD_STOCK), getrnurl(BOARD_STOCK), false);
open9x = new Open9xFirmware("opentx-9x", QObject::tr("OpenTX for 9X board"), new OpenTxInterface(BOARD_STOCK), geturl(BOARD_STOCK), getstamp(BOARD_STOCK), getrnurl(BOARD_STOCK), false);
open9x->addOptions(ext_options);
open9x->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support"));
open9x->addOption("templates", QObject::tr("Enable TEMPLATES menu"));
@ -1052,7 +1053,7 @@ void RegisterOpen9xFirmwares()
firmwares.push_back(open9x);
/* 9x board with M128 chip */
open9x = new Open9xFirmware("opentx-9x128", QObject::tr("OpenTX for M128 / 9X board"), new Open9xInterface(BOARD_M128), geturl(BOARD_M128), getstamp(BOARD_M128),getrnurl(BOARD_M128), false);
open9x = new Open9xFirmware("opentx-9x128", QObject::tr("OpenTX for M128 / 9X board"), new OpenTxInterface(BOARD_M128), geturl(BOARD_M128), getstamp(BOARD_M128),getrnurl(BOARD_M128), false);
open9x->addOptions(ext_options);
open9x->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support"));
open9x->addOption("templates", QObject::tr("Enable TEMPLATES menu"));
@ -1084,7 +1085,7 @@ void RegisterOpen9xFirmwares()
firmwares.push_back(open9x);
/* 9XR board */
open9x = new Open9xFirmware("opentx-9xr", QObject::tr("OpenTX for 9XR"), new Open9xInterface(BOARD_STOCK), geturl(BOARD_STOCK), getstamp(BOARD_STOCK),getrnurl(BOARD_STOCK), false);
open9x = new Open9xFirmware("opentx-9xr", QObject::tr("OpenTX for 9XR"), new OpenTxInterface(BOARD_STOCK), geturl(BOARD_STOCK), getstamp(BOARD_STOCK),getrnurl(BOARD_STOCK), false);
open9x->addOptions(extr_options);
open9x->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support"));
open9x->addOption("templates", QObject::tr("Enable TEMPLATES menu"));
@ -1118,7 +1119,7 @@ void RegisterOpen9xFirmwares()
firmwares.push_back(open9x);
/* 9XR board with M128 chip */
open9x = new Open9xFirmware("opentx-9xr128", QObject::tr("OpenTX for 9XR with M128 chip"), new Open9xInterface(BOARD_M128), geturl(BOARD_M128), getstamp(BOARD_M128),getrnurl(BOARD_M128), false);
open9x = new Open9xFirmware("opentx-9xr128", QObject::tr("OpenTX for 9XR with M128 chip"), new OpenTxInterface(BOARD_M128), geturl(BOARD_M128), getstamp(BOARD_M128),getrnurl(BOARD_M128), false);
open9x->addOptions(extr_options);
open9x->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support"));
open9x->addOption("templates", QObject::tr("Enable TEMPLATES menu"));
@ -1148,7 +1149,7 @@ void RegisterOpen9xFirmwares()
firmwares.push_back(open9x);
/* Gruvin9x board */
open9x = new Open9xFirmware("opentx-gruvin9x", QObject::tr("OpenTX for Gruvin9x board / 9X"), new Open9xInterface(BOARD_GRUVIN9X), geturl(BOARD_GRUVIN9X), getstamp(BOARD_GRUVIN9X),getrnurl(BOARD_GRUVIN9X), false);
open9x = new Open9xFirmware("opentx-gruvin9x", QObject::tr("OpenTX for Gruvin9x board / 9X"), new OpenTxInterface(BOARD_GRUVIN9X), geturl(BOARD_GRUVIN9X), getstamp(BOARD_GRUVIN9X),getrnurl(BOARD_GRUVIN9X), false);
open9x->setVariantBase(FRSKY_VARIANT);
open9x->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support"));
open9x->addOption("templates", QObject::tr("Enable TEMPLATES menu"));
@ -1178,7 +1179,7 @@ void RegisterOpen9xFirmwares()
#ifndef __APPLE__
/* SKY9X board */
open9x = new Open9xFirmware("opentx-sky9x", QObject::tr("OpenTX for Sky9x board / 9X"), new Open9xInterface(BOARD_SKY9X), geturl(BOARD_SKY9X), getstamp(BOARD_SKY9X),getrnurl(BOARD_SKY9X), true);
open9x = new Open9xFirmware("opentx-sky9x", QObject::tr("OpenTX for Sky9x board / 9X"), new OpenTxInterface(BOARD_SKY9X), geturl(BOARD_SKY9X), getstamp(BOARD_SKY9X),getrnurl(BOARD_SKY9X), true);
open9x->setVariantBase(FRSKY_VARIANT);
open9x->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support"));
open9x->addOption("templates", QObject::tr("Enable TEMPLATES menu"));
@ -1203,7 +1204,7 @@ void RegisterOpen9xFirmwares()
#endif
/* Taranis board */
open9x = new Open9xFirmware("opentx-taranis", QObject::tr("OpenTX for FrSky Taranis"), new Open9xInterface(BOARD_TARANIS), geturl(BOARD_TARANIS), getstamp(BOARD_TARANIS),getrnurl(BOARD_TARANIS), true);
open9x = new Open9xFirmware("opentx-taranis", QObject::tr("OpenTX for FrSky Taranis"), new OpenTxInterface(BOARD_TARANIS), geturl(BOARD_TARANIS), getstamp(BOARD_TARANIS),getrnurl(BOARD_TARANIS), true);
open9x->addOption("noheli", QObject::tr("Disable HELI menu and cyclic mix support"));
open9x->addOption("notemplates", QObject::tr("Disable TEMPLATES menu"));
open9x->addOption("nogvars", QObject::tr("Disable Global variables"));
@ -1215,7 +1216,7 @@ void RegisterOpen9xFirmwares()
QSettings settings;
int rev4a = settings.value("rev4asupport",0).toInt();
if (rev4a) {
open9x = new Open9xFirmware("opentx-taranisrev4a", QObject::tr("OpenTX for FrSky Taranis Rev4a"), new Open9xInterface(BOARD_TARANIS_REV4a), geturl(BOARD_TARANIS_REV4a), getstamp(BOARD_TARANIS_REV4a),getrnurl(BOARD_TARANIS), true);
open9x = new Open9xFirmware("opentx-taranisrev4a", QObject::tr("OpenTX for FrSky Taranis Rev4a"), new OpenTxInterface(BOARD_TARANIS_REV4a), geturl(BOARD_TARANIS_REV4a), getstamp(BOARD_TARANIS_REV4a),getrnurl(BOARD_TARANIS), true);
open9x->addOption("noheli", QObject::tr("Disable HELI menu and cyclic mix support"));
open9x->addOption("notemplates", QObject::tr("Disable TEMPLATES menu"));
open9x->addOption("nogvars", QObject::tr("Disable Global variables"));

View file

@ -23,13 +23,13 @@
class EFile;
class Open9xInterface : public EEPROMInterface
class OpenTxInterface : public EEPROMInterface
{
public:
Open9xInterface(BoardEnum board);
OpenTxInterface(BoardEnum board);
virtual ~Open9xInterface();
virtual ~OpenTxInterface();
virtual const char * getName();

View file

@ -107,7 +107,7 @@ uint8_t getStickMode()
using namespace Open9x;
Open9xSimulator::Open9xSimulator(Open9xInterface * open9xInterface):
Open9xSimulator::Open9xSimulator(OpenTxInterface * open9xInterface):
open9xInterface(open9xInterface)
{
#define INIT_IMPORT
@ -132,13 +132,20 @@ bool Open9xSimulator::lcdChanged(bool & lightEnable)
#include "simulatorimport.h"
}
void Open9xSimulator::start(RadioData &radioData, bool tests)
void Open9xSimulator::start(QByteArray & eeprom, bool tests)
{
open9xInterface->save(&Open9x::eeprom[0], radioData, SIMU_STOCK_VARIANTS);
memcpy(&Open9x::eeprom[0], eeprom.data(), 2048);
StartEepromThread(NULL);
StartMainThread(tests);
}
void Open9xSimulator::start(const char * filename, bool tests)
{
// open9xInterface->save(&Open9x::eeprom[0], radioData, SIMU_STOCK_VARIANTS);
StartEepromThread(filename);
StartMainThread(tests);
}
void Open9xSimulator::stop()
{
StopMainThread();

View file

@ -19,15 +19,17 @@
#include "simulatorinterface.h"
class Open9xInterface;
class OpenTxInterface;
class Open9xSimulator : public SimulatorInterface {
public:
Open9xSimulator(Open9xInterface *);
Open9xSimulator(OpenTxInterface *);
virtual void start(RadioData &radioData, bool tests);
virtual void start(QByteArray & eeprom, bool tests=true);
virtual void start(const char * filename, bool tests=true);
virtual void stop();
@ -53,7 +55,7 @@ class Open9xSimulator : public SimulatorInterface {
protected:
Open9xInterface * open9xInterface;
OpenTxInterface * open9xInterface;
};

View file

@ -202,5 +202,5 @@ int Th9xInterface::isAvailable(Protocol proto, int port)
SimulatorInterface * Th9xInterface::getSimulator()
{
return new Th9xSimulator(this);
return NULL; // new Th9xSimulator(this);
}

View file

@ -1,5 +1,6 @@
#include <QtGui>
#include "helpers.h"
#include "simulatordialog.h"
QString getPhaseName(int val, char * phasename)
{
@ -945,3 +946,34 @@ CompanionIcon::CompanionIcon(QString baseimage)
addFile(":/themes/"+theme+"/48/"+baseimage, QSize(48,48));
}
void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx)
{
if (GetEepromInterface()->getSimulator()) {
RadioData * simuData = new RadioData(radioData);
unsigned int flags = 0;
if (modelIdx >= 0) {
flags |= SIMULATOR_FLAGS_NOTX;
simuData->generalSettings.currModel = modelIdx;
}
if (radioData.generalSettings.stickMode & 1) {
flags |= SIMULATOR_FLAGS_STICK_MODE_LEFT;
}
BoardEnum board = GetEepromInterface()->getBoard();
SimulatorDialog * sd;
if (IS_TARANIS(board))
sd = new SimulatorDialogTaranis(parent, flags);
else
sd = new SimulatorDialog9X(parent, flags);
QByteArray eeprom(GetEepromInterface()->getEEpromSize(), 0);
GetEepromInterface()->save((uint8_t *)eeprom.data(), *simuData, GetEepromInterface()->getCapability(SimulatorVariant));
delete simuData;
sd->start(eeprom);
sd->exec();
delete sd;
}
else {
QMessageBox::warning(NULL,
QObject::tr("Warning"),
QObject::tr("Simulator for this firmware is not yet available"));
}
}

View file

@ -131,4 +131,6 @@ QString getFrSkySrc(int index);
float ValToTim(int value);
int TimToVal(float value);
void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx);
#endif // HELPERS_H

View file

@ -48,8 +48,6 @@
#include "generaledit.h"
#include "avroutputdialog.h"
#include "burnconfigdialog.h"
#include "simulatordialog.h"
#include "xsimulatordialog.h"
#include "printdialog.h"
#include "burndialog.h"
#include "helpers.h"
@ -142,25 +140,7 @@ void MdiChild::setModified()
void MdiChild::on_SimulateTxButton_clicked()
{
if (GetEepromInterface()->getSimulator()) {
if (GetEepromInterface()->getCapability(SimulatorType)==1) {
xsimulatorDialog * sd = new xsimulatorDialog(this);
sd->loadParams(radioData);
sd->exec();
delete sd;
}
else {
simulatorDialog * sd = new simulatorDialog(this);
sd->loadParams(radioData);
sd->exec();
delete sd;
}
}
else {
QMessageBox::warning(NULL,
QObject::tr("Warning"),
QObject::tr("Simulator for this firmware is not yet available"));
}
startSimulation(this, radioData, -1);
}
void MdiChild::OpenEditWindow(bool wizard=false)
@ -647,21 +627,8 @@ void MdiChild::burnTo() // write to Tx
void MdiChild::simulate()
{
if(ui->modelsList->currentRow()<1) return;
if (GetEepromInterface()->getSimulator()) {
if (GetEepromInterface()->getCapability(SimulatorType)) {
xsimulatorDialog sd(this);
sd.loadParams(radioData, ui->modelsList->currentRow()-1);
sd.exec();
} else {
simulatorDialog sd(this);
sd.loadParams(radioData, ui->modelsList->currentRow()-1);
sd.exec();
}
} else {
QMessageBox::warning(NULL,
QObject::tr("Warning"),
QObject::tr("Simulator for this firmware is not yet available"));
if (ui->modelsList->currentRow() >= 1) {
startSimulation(this, radioData, ui->modelsList->currentRow()-1);
}
}

View file

@ -107,35 +107,13 @@ void ModelEdit::on_pushButton_clicked()
launchSimulation();
}
// TODO merge both
#include "simulatordialog.h"
#include "xsimulatordialog.h"
void ModelEdit::launchSimulation()
{
if (GetEepromInterface()->getSimulator()) {
RadioData *simuData = new RadioData();
simuData->generalSettings = generalSettings;
simuData->models[modelId] = model;
if (GetEepromInterface()->getCapability(SimulatorType)) {
xsimulatorDialog *sd = new xsimulatorDialog(this);
sd->loadParams(*simuData, modelId);
sd->exec();
delete sd;
}
else {
simulatorDialog *sd = new simulatorDialog(this);
sd->loadParams(*simuData, modelId);
sd->exec();
delete sd;
}
simuData->models[0] = model;
startSimulation(this, *simuData, 0);
delete simuData;
}
else {
QMessageBox::warning(NULL,
QObject::tr("Warning"),
QObject::tr("Simulator for this firmware is not yet available"));
}
}

View file

@ -1,9 +1,6 @@
/*
* File: mySlider.h
* Author: Romolo Manfredini
*
* Created on 11 gennaio 2012, 23.39
*/
#ifndef MYSLIDER_H
#define MYSLIDER_H
#include <QSlider>
#include <QtGui>
@ -31,4 +28,4 @@ protected:
}
};
#endif

View file

@ -0,0 +1,121 @@
set(TH9X_CHECKOUT_DIRECTORY ${PROJECT_BINARY_DIR}/firmwares/th9x)
add_custom_command(
OUTPUT ${TH9X_CHECKOUT_DIRECTORY}/th9xsimulator.cpp
COMMAND ${CMAKE_COMMAND} -E make_directory ${TH9X_CHECKOUT_DIRECTORY}
COMMAND cd ${TH9X_CHECKOUT_DIRECTORY} && svn checkout http://th9x.googlecode.com/svn/trunk/src@285 .
COMMAND ${CMAKE_COMMAND} -E copy ${COMPANION_SRC_DIRECTORY}/firmwares/th9x/th9xsimulator.cpp ${TH9X_CHECKOUT_DIRECTORY}
DEPENDS ${COMPANION_SRC_DIRECTORY}/firmwares/th9x/th9xsimulator.cpp
)
set(ER9X_CHECKOUT_DIRECTORY ${PROJECT_BINARY_DIR}/firmwares/er9x)
add_custom_command(
OUTPUT ${ER9X_CHECKOUT_DIRECTORY}/er9xsimulator.cpp
COMMAND ${CMAKE_COMMAND} -E make_directory ${ER9X_CHECKOUT_DIRECTORY}
COMMAND cd ${ER9X_CHECKOUT_DIRECTORY} && svn checkout http://er9x.googlecode.com/svn/trunk/src@790 .
COMMAND ${CMAKE_COMMAND} -E copy ${COMPANION_SRC_DIRECTORY}/firmwares/er9x/er9xsimulator.cpp ${ER9X_CHECKOUT_DIRECTORY}
DEPENDS ${COMPANION_SRC_DIRECTORY}/firmwares/er9x/er9xsimulator.cpp
)
set(ERSKY9X_CHECKOUT_DIRECTORY ${PROJECT_BINARY_DIR}/firmwares/ersky9x)
add_custom_command(
OUTPUT ${ERSKY9X_CHECKOUT_DIRECTORY}/ersky9xsimulator.cpp
COMMAND ${CMAKE_COMMAND} -E make_directory ${ERSKY9X_CHECKOUT_DIRECTORY}
COMMAND cd ${ERSKY9X_CHECKOUT_DIRECTORY} && svn checkout http://ersky9x.googlecode.com/svn/trunk/src@170 .
COMMAND ${CMAKE_COMMAND} -E copy ${COMPANION_SRC_DIRECTORY}/firmwares/ersky9x/ersky9xsimulator.cpp ${ERSKY9X_CHECKOUT_DIRECTORY}
DEPENDS ${COMPANION_SRC_DIRECTORY}/firmwares/ersky9x/ersky9xsimulator.cpp
)
set(simulation_SRCS
simulatordialog.cpp
)
set(simulation_UIS
simulatordialog-9x.ui
simulatordialog-taranis.ui
)
set(simulation_HDRS
simulatordialog.h
cursorwidget.h
menuwidget.h
xcursorwidget.h
xmenuwidget.h
)
if(SDL_FOUND)
set(simulation_SRCS
${simulation_SRCS}
joystick.cpp
joystickdialog.cpp
)
set(simulation_HDRS
${simulation_HDRS}
joystick.h
joystickdialog.h
)
set(simulation_UIS
${simulation_UIS}
joystickdialog.ui
)
endif()
include_directories(
# ${CMAKE_BINARY_DIR}
# ${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../..
${COMPANION_SRC_DIRECTORY}
${RADIO_SRC_DIRECTORY}/fonts/std
)
qt4_wrap_ui(simulation_SRCS ${simulation_UIS})
qt4_wrap_cpp(simulation_SRCS ${simulation_HDRS})
add_library(simulation ${simulation_SRCS})
set(simu_SRCS
${COMPANION_SRC_DIRECTORY}/eeprominterface.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/th9x/th9xeeprom.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/firmwares/th9x/th9xinterface.cpp
${TH9X_CHECKOUT_DIRECTORY}/th9xsimulator.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/er9x/er9xeeprom.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/firmwares/er9x/er9xinterface.cpp
${ER9X_CHECKOUT_DIRECTORY}/er9xsimulator.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/gruvin9x/gruvin9xeeprom.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/firmwares/gruvin9x/gruvin9xinterface.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/opentxeeprom.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/open9xStockeeprom.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/open9xGruvin9xeeprom.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/open9xSky9xeeprom.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/opentxinterface.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/opentxTaranisSimulator.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/opentxSky9xsimulator.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/opentxGruvin9xsimulator.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/opentxM128simulator.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/opentx/opentxsimulator.cpp
${COMPANION_SRC_DIRECTORY}/firmwares/ersky9x/ersky9xeeprom.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/firmwares/ersky9x/ersky9xinterface.cpp
${ERSKY9X_CHECKOUT_DIRECTORY}/ersky9xsimulator.cpp
${RADIO_SRC_DIRECTORY}/bitmaps/sticks.lbm
${COMPANION_SRC_DIRECTORY}/file.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/helpers.cpp # TODO not needed
${COMPANION_SRC_DIRECTORY}/modeledit/node.cpp
${COMPANION_SRC_DIRECTORY}/modeledit/edge.cpp # TODO not needed
main.cpp
)
set(simu_HDRS
${COMPANION_SRC_DIRECTORY}/modeledit/node.h
${COMPANION_SRC_DIRECTORY}/helpers.h # TODO not needed
${COMPANION_SRC_DIRECTORY}/myslider.h # TODO not needed
)
qt4_wrap_cpp(simu_SRCS ${simu_HDRS} )
qt4_add_resources(simu_SRCS ${COMPANION_SRC_DIRECTORY}/companion.qrc) # TODO not needed
add_executable(simu WIN32 ${simu_SRCS})
target_link_libraries(simu simulation ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY} ${XERCESC_LIBRARY} ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${PHONON_LIBS})

View file

@ -0,0 +1,121 @@
/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QString>
#include <QDir>
#include <QFileInfo>
#include <QSettings>
#include <QSplashScreen>
#include <QThread>
#include <iostream>
#include "simulatordialog.h"
#include "eeprominterface.h"
#if defined WIN32 || !defined __GNUC__
#include <windows.h>
#define sleep(x) Sleep(x*1000)
#else
#include <unistd.h>
#endif
#ifdef __APPLE__
#include <QProxyStyle>
class MyProxyStyle : public QProxyStyle
{
public:
void polish ( QWidget * w ) {
QMenu* mn = dynamic_cast<QMenu*>(w);
QPushButton* pb = dynamic_cast<QPushButton*>(w);
if(!(mn || pb) && !w->testAttribute(Qt::WA_MacNormalSize))
w->setAttribute(Qt::WA_MacSmallSize);
}
};
#endif
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(companion);
QApplication app(argc, argv);
app.setApplicationName("OpenTX Simulator");
app.setOrganizationName("OpenTX");
app.setOrganizationDomain("open-tx.org");
#ifdef __APPLE__
app.setStyle(new MyProxyStyle);
#endif
QString dir;
if (argc) dir = QFileInfo(argv[0]).canonicalPath() + "/lang";
/* QTranslator companionTranslator;
companionTranslator.load(":/companion_" + locale);
QTranslator qtTranslator;
qtTranslator.load((QString)"qt_" + locale.left(2), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&companionTranslator);
app.installTranslator(&qtTranslator);
*/
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
RegisterFirmwares();
SimulatorDialog *dialog;
if (argc > 1 && !strcmp(argv[1], "taranis")) {
current_firmware_variant = GetFirmwareVariant("opentx-taranis-en");
dialog = new SimulatorDialogTaranis();
}
else {
dialog = new SimulatorDialog9X();
}
dialog->show();
dialog->start("eeprom.bin");
int result = app.exec();
delete dialog;
return result;
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,755 @@
#include "simulatordialog.h"
#include "ui_simulatordialog-9x.h"
#include "ui_simulatordialog-taranis.h"
#include <iostream>
#include "helpers.h"
#include "simulatorinterface.h"
#define GBALL_SIZE 20
#define RESX 1024
int SimulatorDialog::screenshotIdx = 0;
SimulatorDialog::SimulatorDialog(QWidget * parent, unsigned int flags):
QDialog(parent),
flags(flags),
dialP_4(NULL),
timer(NULL),
lightOn(false),
txInterface(NULL),
simulator(NULL),
beepVal(0),
buttonPressed(0),
middleButtonPressed(false)
{
}
SimulatorDialog9X::SimulatorDialog9X(QWidget * parent, unsigned int flags):
SimulatorDialog(parent, flags),
ui(new Ui::SimulatorDialog9X),
beepShow(0)
{
lcdWidth = 128;
lcdDepth = 1;
initUi<Ui::SimulatorDialog9X>(ui);
QSettings settings;
backLight = settings.value("backLight", 0).toInt();
if (backLight > 4) backLight = 0;
switch (backLight) {
case 1:
ui->lcd->setBackgroundColor(166,247,159);
break;
case 2:
ui->lcd->setBackgroundColor(247,159,166);
break;
case 3:
ui->lcd->setBackgroundColor(255,195,151);
break;
case 4:
ui->lcd->setBackgroundColor(247,242,159);
break;
default:
ui->lcd->setBackgroundColor(159,165,247);
break;
}
connect(ui->dialP_1, SIGNAL(valueChanged(int)), this, SLOT(dialChanged()));
connect(ui->dialP_2, SIGNAL(valueChanged(int)), this, SLOT(dialChanged()));
connect(ui->dialP_3, SIGNAL(valueChanged(int)), this, SLOT(dialChanged()));
connect(ui->cursor, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->menu, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
}
SimulatorDialog9X::~SimulatorDialog9X()
{
delete ui;
}
SimulatorDialogTaranis::SimulatorDialogTaranis(QWidget * parent, unsigned int flags):
SimulatorDialog(parent, flags),
ui(new Ui::SimulatorDialogTaranis)
{
lcdWidth = 212;
lcdDepth = 4;
initUi<Ui::SimulatorDialogTaranis>(ui);
dialP_4 = ui->dialP_4;
ui->lcd->setBackgroundColor(47, 123, 227);
connect(ui->cursor, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->menu, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
}
SimulatorDialogTaranis::~SimulatorDialogTaranis()
{
delete ui;
}
SimulatorDialog::~SimulatorDialog()
{
delete timer;
}
void SimulatorDialog::closeEvent (QCloseEvent *)
{
simulator->stop();
timer->stop();
}
void SimulatorDialog::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::MidButton) {
middleButtonPressed = true;
}
}
void SimulatorDialog::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::MidButton) {
middleButtonPressed = false;
}
}
void SimulatorDialog9X::dialChanged()
{
ui->dialP_1value->setText(QString("%1 %").arg((ui->dialP_1->value()*100)/1024));
ui->dialP_2value->setText(QString("%1 %").arg((ui->dialP_2->value()*100)/1024));
ui->dialP_3value->setText(QString("%1 %").arg((ui->dialP_3->value()*100)/1024));
}
void SimulatorDialog::wheelEvent (QWheelEvent *event)
{
simulator->wheelEvent(event->delta() > 0 ? 1 : -1);
}
void SimulatorDialog::keyPressEvent (QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Enter:
case Qt::Key_Return:
buttonPressed = Qt::Key_Enter;
break;
case Qt::Key_Escape:
case Qt::Key_Backspace:
buttonPressed = Qt::Key_Escape;
break;
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Right:
case Qt::Key_Left:
case Qt::Key_Minus:
case Qt::Key_Plus:
case Qt::Key_PageDown:
case Qt::Key_Menu:
buttonPressed = event->key();
break;
}
}
void SimulatorDialog::keyReleaseEvent(QKeyEvent * event)
{
switch (event->key()) {
case Qt::Key_Enter:
case Qt::Key_Return:
case Qt::Key_Escape:
case Qt::Key_Backspace:
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Right:
case Qt::Key_Left:
case Qt::Key_Plus:
case Qt::Key_Minus:
case Qt::Key_PageDown:
case Qt::Key_Menu:
buttonPressed = 0;
break;
}
}
void SimulatorDialog::setupTimer()
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimerEvent()));
timer->start(10);
}
template <class T>
void SimulatorDialog::initUi(T * ui)
{
ui->setupUi(this);
lcd = ui->lcd;
leftStick = ui->leftStick;
rightStick = ui->rightStick;
dialP_1 = ui->dialP_1;
dialP_2 = ui->dialP_2;
dialP_3 = ui->dialP_3;
trimHLeft = ui->trimHLeft;
trimVLeft = ui->trimVLeft;
trimHRight = ui->trimHRight;
trimVRight = ui->trimVRight;
tabWidget = ui->tabWidget;
logicalSwitchesLayout = ui->logicalSwitchesLayout;
channelsLayout = ui->channelsLayout;
leftXPerc = ui->leftXPerc;
leftYPerc = ui->leftYPerc;
rightXPerc = ui->rightXPerc;
rightYPerc = ui->rightYPerc;
setupSticks();
resize(0, 0); // to force min height, min width
setFixedSize(width(), height());
#ifdef JOYSTICKS
QSettings settings;
bool js_enable = settings.value("js_support",false).toBool();
int js_ctrl=settings.value("js_ctrl",-1).toInt();
if (js_enable) {
settings.beginGroup("JsCalibration");
int count=0;
for (int j=0; j<8;j++){
int axe=settings.value(QString("stick%1_axe").arg(j),-1).toInt();
if (axe>=0 && axe<8) {
jsmap[axe]=j;
jscal[axe][0]=settings.value(QString("stick%1_min").arg(j),-32767).toInt();
jscal[axe][1]=settings.value(QString("stick%1_med").arg(j),0).toInt();
jscal[axe][2]=settings.value(QString("stick%1_max").arg(j),0).toInt();
jscal[axe][3]=settings.value(QString("stick%1_inv").arg(j),0).toInt();
count++;
}
}
settings.endGroup();
if (count<3) {
QMessageBox::critical(this, tr("Warning"), tr("Joystick enabled but not configured correctly"));
}
if (js_ctrl!=-1) {
joystick = new Joystick(this);
if (joystick) {
if (joystick->open(js_ctrl)) {
int numAxes=std::min(joystick->numAxes,8);
for (int j=0; j<numAxes; j++) {
joystick->sensitivities[j] = 0;
joystick->deadzones[j]=0;
}
nodeRight->setCenteringY(false); //mode 1,3 -> THR on right
ui->holdRightY->setChecked(true);
nodeRight->setCenteringX(false); //mode 1,3 -> THR on right
ui->holdRightX->setChecked(true);
nodeLeft->setCenteringY(false); //mode 1,3 -> THR on right
ui->holdLeftY->setChecked(true);
nodeLeft->setCenteringX(false); //mode 1,3 -> THR on right
ui->holdLeftX->setChecked(true);
connect(joystick, SIGNAL(axisValueChanged(int, int)), this, SLOT(onjoystickAxisValueChanged(int, int)));
}
else {
QMessageBox::critical(this, tr("Warning"), tr("Cannot open joystick, joystick disabled"));
}
}
}
}
#endif
txInterface = GetEepromInterface();
windowName = tr("Simulating Tx (%1)").arg(txInterface->getName());
setWindowTitle(windowName);
simulator = txInterface->getSimulator();
lcd->setData(simulator->getLcd(), lcdWidth, 64, lcdDepth);
if (flags & SIMULATOR_FLAGS_STICK_MODE_LEFT) {
nodeLeft->setCenteringY(false);
ui->holdLeftY->setChecked(true);
}
else {
nodeRight->setCenteringY(false);
ui->holdRightY->setChecked(true);
}
setTrims();
int outputs = std::min(16, txInterface->getCapability(Outputs));
for (int i=0; i<outputs; i++) {
int column = i / (outputs/2);
int line = i % (outputs/2);
QLabel * label = new QLabel(tabWidget);
label->setText(RawSource(SOURCE_TYPE_CH, i).toString());
channelsLayout->addWidget(label, line, column == 0 ? 0 : 5, 1, 1);
QSlider * slider = new QSlider(tabWidget);
slider->setEnabled(false);
slider->setMaximumSize(QSize(16777215, 18));
slider->setStyleSheet(QString::fromUtf8("QSlider::sub-page:horizontal:disabled {\n"
"border-color: #999;\n"
"}\n"
"\n"
"QSlider::add-page:horizontal:disabled {\n"
"border-color: #999;\n"
"}\n"
"\n"
"QSlider::handle:horizontal:disabled {\n"
"background: #0000CC;\n"
"border: 1px solid #aaa;\n"
"border-radius: 4px;\n"
"}"));
slider->setMinimum(-1024);
slider->setMaximum(1024);
slider->setPageStep(128);
slider->setTracking(false);
slider->setOrientation(Qt::Horizontal);
slider->setInvertedAppearance(false);
slider->setTickPosition(QSlider::TicksBelow);
channelSliders << slider;
channelsLayout->addWidget(slider, line, column == 0 ? 1 : 4, 1, 1);
QLabel * value = new QLabel(tabWidget);
value->setMinimumSize(QSize(50, 0));
value->setAlignment(Qt::AlignCenter);
channelValues << value;
channelsLayout->addWidget(value, line, column == 0 ? 2 : 3, 1, 1);
}
int switches = txInterface->getCapability(LogicalSwitches);
for (int i=0; i<switches; i++) {
QFrame * swtch = new QFrame(tabWidget);
swtch->setAutoFillBackground(true);
swtch->setFrameShape(QFrame::Panel);
swtch->setFrameShadow(QFrame::Raised);
swtch->setLineWidth(2);
QVBoxLayout * layout = new QVBoxLayout(swtch);
layout->setContentsMargins(2, 2, 2, 2);
QLabel * label = new QLabel(swtch);
label->setText(RawSwitch(SWITCH_TYPE_VIRTUAL, i+1).toString());
label->setAlignment(Qt::AlignCenter);
logicalSwitchLabels << label;
layout->addWidget(label);
logicalSwitchesLayout->addWidget(swtch, i / (switches/2), i % (switches/2), 1, 1);
}
if (flags & SIMULATOR_FLAGS_NOTX) {
ui->tabWidget->setCurrentIndex(1);
}
else {
ui->lcd->setFocus();
}
setupTimer();
}
void SimulatorDialog::onButtonPressed(int value)
{
if (value == Qt::Key_Print) {
QSettings settings;
bool toclipboard = settings.value("snapshot_to_clipboard", false).toBool();
QString fileName = "";
if (!toclipboard) {
fileName = QString("screenshot-%1.png").arg(++screenshotIdx);
}
lcd->makeScreenshot(fileName);
}
else {
buttonPressed = value;
}
}
void SimulatorDialog9X::setLightOn(bool enable)
{
QString bg = "";
if (enable) {
QStringList list;
list << "bl" << "gr" << "rd" << "or" << "yl";
bg = QString("-") + list[backLight];
}
ui->top->setStyleSheet(QString("background:url(:/images/9xdt.png%1);").arg(bg));
ui->bottom->setStyleSheet(QString("background:url(:/images/9xdb%1.png);").arg(bg));
ui->left->setStyleSheet(QString("background:url(:/images/9xdl%1.png);").arg(bg));
ui->right->setStyleSheet(QString("background:url(:/images/9xdr%1.png);").arg(bg));
}
void SimulatorDialog9X::updateBeepButton()
{
#define CBEEP_ON "QLabel { background-color: #FF364E }"
#define CBEEP_OFF "QLabel { }"
if (beepVal) {
beepShow = 20;
}
ui->label_beep->setStyleSheet(beepShow ? CBEEP_ON : CBEEP_OFF);
if (beepShow) {
beepShow--;
}
}
void SimulatorDialog::onTimerEvent()
{
static unsigned int lcd_counter = 0;
if (!simulator->timer10ms()) {
QMessageBox::critical(this, "Companion", tr("Firmware %1 error: %2").arg(txInterface->getName()).arg(simulator->getError()));
timer->stop();
return;
}
getValues();
if (!(flags & SIMULATOR_FLAGS_NOTX) && tabWidget->currentIndex()==0) {
bool lightEnable;
if (simulator->lcdChanged(lightEnable)) {
lcd->onLcdChanged(lightEnable);
if (lightOn != lightEnable) {
setLightOn(lightEnable);
lightOn = lightEnable;
}
}
}
if (!(lcd_counter++ % 5)) {
setValues();
setTrims();
centerSticks();
updateBeepButton();
if (beepVal) {
beepVal = 0;
QApplication::beep();
}
}
}
void SimulatorDialog::centerSticks()
{
if (leftStick->scene())
nodeLeft->stepToCenter();
if (rightStick->scene())
nodeRight->stepToCenter();
}
void SimulatorDialog::start(QByteArray & eeprom)
{
simulator->start(eeprom, (flags & SIMULATOR_FLAGS_NOTX) ? false : true);
}
void SimulatorDialog::start(const char * filename)
{
simulator->start(filename);
}
void SimulatorDialog::setTrims()
{
Trims trims;
simulator->getTrims(trims);
int trimMin = -125, trimMax = +125;
if (trims.extended) {
trimMin = -500;
trimMax = +500;
}
trimHLeft->setRange(trimMin, trimMax); trimHLeft->setValue(trims.values[0]);
trimVLeft->setRange(trimMin, trimMax); trimVLeft->setValue(trims.values[1]);
trimVRight->setRange(trimMin, trimMax); trimVRight->setValue(trims.values[2]);
trimHRight->setRange(trimMin, trimMax); trimHRight->setValue(trims.values[3]);
}
void SimulatorDialog9X::getValues()
{
TxInputs inputs = {
{
int(1024*nodeLeft->getX()), // LEFT HORZ
int(-1024*nodeLeft->getY()), // LEFT VERT
int(-1024*nodeRight->getY()), // RGHT VERT
int(1024*nodeRight->getX()) // RGHT HORZ
},
{
ui->dialP_1->value(),
ui->dialP_2->value(),
ui->dialP_3->value(), 0
},
{
ui->switchTHR->isChecked(),
ui->switchRUD->isChecked(),
ui->switchELE->isChecked(),
ui->switchID2->isChecked() ? 1 : (ui->switchID1->isChecked() ? 0 : -1),
ui->switchAIL->isChecked(),
ui->switchGEA->isChecked(),
ui->switchTRN->isDown(),
0, 0, 0
},
{
buttonPressed == Qt::Key_Enter,
buttonPressed == Qt::Key_Escape,
buttonPressed == Qt::Key_Down,
buttonPressed == Qt::Key_Up,
buttonPressed == Qt::Key_Right,
buttonPressed == Qt::Key_Left,
},
middleButtonPressed
};
simulator->setValues(inputs);
}
void SimulatorDialogTaranis::getValues()
{
TxInputs inputs = {
{
int(1024*nodeLeft->getX()), // LEFT HORZ
int(-1024*nodeLeft->getY()), // LEFT VERT
int(-1024*nodeRight->getY()), // RGHT VERT
int(1024*nodeRight->getX()) // RGHT HORZ
},
{
-ui->dialP_1->value(),
ui->dialP_2->value(),
-ui->dialP_3->value(),
ui->dialP_4->value()
},
{
ui->switchA->value() - 1,
ui->switchB->value() - 1,
ui->switchC->value() - 1,
ui->switchD->value() - 1,
ui->switchE->value() - 1,
ui->switchF->value(),
ui->switchG->value() - 1,
ui->switchH->value(), 0, 0
},
{
buttonPressed == Qt::Key_Menu,
buttonPressed == Qt::Key_Escape,
buttonPressed == Qt::Key_Enter,
buttonPressed == Qt::Key_PageDown,
buttonPressed == Qt::Key_Plus,
buttonPressed == Qt::Key_Minus
},
middleButtonPressed
};
simulator->setValues(inputs);
}
inline int chVal(int val)
{
return qMin(1024, qMax(-1024, val));
}
void SimulatorDialog::on_trimHLeft_valueChanged(int value)
{
simulator->setTrim(0, value);
}
void SimulatorDialog::on_trimVLeft_valueChanged(int value)
{
simulator->setTrim(1, value);
}
void SimulatorDialog::on_trimHRight_valueChanged(int value)
{
simulator->setTrim(3, value);
}
void SimulatorDialog::on_trimVRight_valueChanged(int value)
{
simulator->setTrim(2, value);
}
void SimulatorDialog::setValues()
{
TxOutputs outputs;
simulator->getValues(outputs);
Trims trims;
simulator->getTrims(trims);
for (int i=0; i<std::min(16, GetEepromInterface()->getCapability(Outputs)); i++) {
channelSliders[i]->setValue(chVal(outputs.chans[i]));
channelValues[i]->setText(QString("%1").arg((qreal)outputs.chans[i]*100/1024, 0, 'f', 1));
}
leftXPerc->setText(QString("X %1%").arg((qreal)nodeLeft->getX()*100+trims.values[0]/5, 2, 'f', 0));
leftYPerc->setText(QString("Y %1%").arg((qreal)nodeLeft->getY()*-100+trims.values[1]/5, 2, 'f', 0));
rightXPerc->setText(QString("X %1%").arg((qreal)nodeRight->getX()*100+trims.values[2]/5, 2, 'f', 0));
rightYPerc->setText(QString("Y %1%").arg((qreal)nodeRight->getY()*-100+trims.values[3]/5, 2, 'f', 0));
QString CSWITCH_ON = "QLabel { background-color: #4CC417 }";
QString CSWITCH_OFF = "QLabel { }";
for (int i=0; i<GetEepromInterface()->getCapability(LogicalSwitches); i++) {
logicalSwitchLabels[i]->setStyleSheet(outputs.vsw[i] ? CSWITCH_ON : CSWITCH_OFF);
}
if (outputs.beep) {
beepVal = outputs.beep;
}
}
void SimulatorDialog::setupSticks()
{
QGraphicsScene *leftScene = new QGraphicsScene(leftStick);
leftScene->setItemIndexMethod(QGraphicsScene::NoIndex);
leftStick->setScene(leftScene);
// leftStick->scene()->addLine(0,10,20,30);
QGraphicsScene *rightScene = new QGraphicsScene(rightStick);
rightScene->setItemIndexMethod(QGraphicsScene::NoIndex);
rightStick->setScene(rightScene);
// rightStick->scene()->addLine(0,10,20,30);
nodeLeft = new Node();
nodeLeft->setPos(-GBALL_SIZE/2,-GBALL_SIZE/2);
nodeLeft->setBallSize(GBALL_SIZE);
leftScene->addItem(nodeLeft);
nodeRight = new Node();
nodeRight->setPos(-GBALL_SIZE/2,-GBALL_SIZE/2);
nodeRight->setBallSize(GBALL_SIZE);
rightScene->addItem(nodeRight);
}
void SimulatorDialog::resizeEvent(QResizeEvent *event)
{
if (leftStick->scene()) {
QRect qr = leftStick->contentsRect();
qreal w = (qreal)qr.width() - GBALL_SIZE;
qreal h = (qreal)qr.height() - GBALL_SIZE;
qreal cx = (qreal)qr.width()/2;
qreal cy = (qreal)qr.height()/2;
leftStick->scene()->setSceneRect(-cx,-cy,w,h);
QPointF p = nodeLeft->pos();
p.setX(qMin(cx, qMax(p.x(), -cx)));
p.setY(qMin(cy, qMax(p.y(), -cy)));
nodeLeft->setPos(p);
}
if (rightStick->scene()) {
QRect qr = rightStick->contentsRect();
qreal w = (qreal)qr.width() - GBALL_SIZE;
qreal h = (qreal)qr.height() - GBALL_SIZE;
qreal cx = (qreal)qr.width()/2;
qreal cy = (qreal)qr.height()/2;
rightStick->scene()->setSceneRect(-cx,-cy,w,h);
QPointF p = nodeRight->pos();
p.setX(qMin(cx, qMax(p.x(), -cx)));
p.setY(qMin(cy, qMax(p.y(), -cy)));
nodeRight->setPos(p);
}
QDialog::resizeEvent(event);
}
void SimulatorDialog::on_holdLeftX_clicked(bool checked)
{
nodeLeft->setCenteringX(!checked);
}
void SimulatorDialog::on_holdLeftY_clicked(bool checked)
{
nodeLeft->setCenteringY(!checked);
}
void SimulatorDialog::on_holdRightX_clicked(bool checked)
{
nodeRight->setCenteringX(!checked);
}
void SimulatorDialog::on_holdRightY_clicked(bool checked)
{
nodeRight->setCenteringY(!checked);
}
void SimulatorDialog::on_FixLeftX_clicked(bool checked)
{
nodeLeft->setFixedX(checked);
}
void SimulatorDialog::on_FixLeftY_clicked(bool checked)
{
nodeLeft->setFixedY(checked);
}
void SimulatorDialog::on_FixRightX_clicked(bool checked)
{
nodeRight->setFixedX(checked);
}
void SimulatorDialog::on_FixRightY_clicked(bool checked)
{
nodeRight->setFixedY(checked);
}
#ifdef JOYSTICKS
void SimulatorDialog::onjoystickAxisValueChanged(int axis, int value)
{
int stick;
if (axis>=0 && axis<=8) {
stick=jsmap[axis];
int stickval;
if (value>jscal[axis][1]) {
if ((jscal[axis][2]-jscal[axis][1])==0)
return;
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][2]-jscal[axis][1]);
}
else {
if ((jscal[axis][1]-jscal[axis][0])==0)
return;
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][1]-jscal[axis][0]);
}
if (jscal[axis][3]==1) {
stickval*=-1;
}
if (stick==1 || stick==2) {
float currX=nodeRight->getX();
float currY=nodeRight->getY();
if (stick==1 ) {
nodeRight->setPos(currX*100-10,-stickval*100/1024-10);
}
if (stick==2) {
nodeRight->setPos(stickval*100/1024-10,currY*100-10);
}
}
else if (stick==3 || stick==4) {
float currX=nodeLeft->getX();
float currY=nodeLeft->getY();
if (stick==3) {
nodeLeft->setPos(currX*100-10,-stickval*100/1024-10);
}
if (stick==4) {
nodeLeft->setPos(stickval*100/1024-10,currY*100-10);
}
}
if (stick==5) {
dialP_1->setValue(stickval);
}
if (stick==6) {
dialP_2->setValue(stickval);
}
if (stick==7) {
dialP_3->setValue(stickval);
}
if (stick==8 && dialP_4) {
dialP_4->setValue(stickval);
}
}
}
#endif

View file

@ -0,0 +1,167 @@
#ifndef SIMULATORDIALOG_H
#define SIMULATORDIALOG_H
#include <QDialog>
#include "modeledit/node.h"
#include "eeprominterface.h"
#ifdef JOYSTICKS
#include "joystick.h"
#endif
#define TMR_OFF 0
#define TMR_RUNNING 1
#define TMR_BEEPING 2
#define TMR_STOPPED 3
#define FLASH_DURATION 10
namespace Ui {
class SimulatorDialog9X;
class SimulatorDialogTaranis;
}
// TODO rename + move?
class lcdWidget;
class mySlider;
#define SIMULATOR_FLAGS_NOTX 1
#define SIMULATOR_FLAGS_STICK_MODE_LEFT 2
class SimulatorDialog : public QDialog
{
Q_OBJECT
public:
explicit SimulatorDialog(QWidget * parent = NULL, unsigned int flags=0);
virtual ~SimulatorDialog();
void start(const char * filename);
void start(QByteArray & eeprom);
protected:
template <class T> void initUi(T * ui);
virtual void setLightOn(bool enable) { }
virtual void updateBeepButton() { }
unsigned int flags;
lcdWidget * lcd;
QGraphicsView * leftStick, * rightStick;
QDial * dialP_1, * dialP_2, * dialP_3, * dialP_4;
mySlider * trimHLeft, * trimVLeft, * trimHRight, * trimVRight;
QLabel * leftXPerc, * rightXPerc, * leftYPerc, * rightYPerc;
QTabWidget * tabWidget;
QGridLayout * logicalSwitchesLayout;
QGridLayout * channelsLayout;
QVector<QLabel *> logicalSwitchLabels;
QVector<QSlider *> channelSliders;
QVector<QLabel *> channelValues;
void init();
Node *nodeLeft;
Node *nodeRight;
QTimer *timer;
QString windowName;
unsigned int backLight;
bool lightOn;
int switches;
#ifdef JOYSTICKS
Joystick *joystick;
int jscal[8][4];
int jsmap[8];
#endif
EEPROMInterface *txInterface;
SimulatorInterface *simulator;
void setupSticks();
void setupTimer();
void resizeEvent(QResizeEvent *event = 0);
virtual void getValues() = 0;
void setValues();
void centerSticks();
// void timerTick();
bool keyState(EnumKeys key);
int getValue(qint8 i);
bool getSwitch(int swtch, bool nc, qint8 level=0);
void setTrims();
int beepVal;
int lcdWidth;
int lcdDepth;
protected:
virtual void closeEvent(QCloseEvent *);
virtual void mousePressEvent(QMouseEvent *);
virtual void mouseReleaseEvent(QMouseEvent *);
virtual void wheelEvent(QWheelEvent *);
virtual void keyPressEvent(QKeyEvent *);
virtual void keyReleaseEvent(QKeyEvent *);
static int screenshotIdx;
int buttonPressed;
bool middleButtonPressed;
private slots:
void onButtonPressed(int value);
void on_FixRightY_clicked(bool checked);
void on_FixRightX_clicked(bool checked);
void on_FixLeftY_clicked(bool checked);
void on_FixLeftX_clicked(bool checked);
void on_holdRightY_clicked(bool checked);
void on_holdRightX_clicked(bool checked);
void on_holdLeftY_clicked(bool checked);
void on_holdLeftX_clicked(bool checked);
void on_trimHLeft_valueChanged(int);
void on_trimVLeft_valueChanged(int);
void on_trimHRight_valueChanged(int);
void on_trimVRight_valueChanged(int);
void onTimerEvent();
#ifdef JOYSTICKS
void onjoystickAxisValueChanged(int axis, int value);
#endif
};
class SimulatorDialog9X: public SimulatorDialog
{
Q_OBJECT
public:
explicit SimulatorDialog9X(QWidget * parent = NULL, unsigned int flags=0);
virtual ~SimulatorDialog9X();
protected:
virtual void getValues();
virtual void setLightOn(bool enable);
virtual void updateBeepButton();
private slots:
void dialChanged();
private:
Ui::SimulatorDialog9X * ui;
int beepShow;
};
class SimulatorDialogTaranis: public SimulatorDialog
{
Q_OBJECT
public:
explicit SimulatorDialogTaranis(QWidget * parent = NULL, unsigned int flags=0);
virtual ~SimulatorDialogTaranis();
protected:
virtual void getValues();
private:
Ui::SimulatorDialogTaranis * ui;
};
#endif // SIMULATORDIALOG_H

View file

@ -47,7 +47,9 @@ class SimulatorInterface {
public:
virtual void start(RadioData &radioData, bool tests) = 0;
virtual void start(QByteArray & eeprom, bool tests=true) = 0;
virtual void start(const char * filename, bool tests=true) = 0;
virtual void stop() = 0;

View file

@ -1,744 +0,0 @@
#include "simulatordialog.h"
#include "ui_simulatordialog.h"
#include <iostream>
#include "helpers.h"
#include "simulatorinterface.h"
#ifdef JOYSTICKS
#include "joystick.h"
#endif
#define GBALL_SIZE 20
#define RESX 1024
#define W 128
#define H 64
int simulatorDialog::screenshotIdx = 0;
uint32_t simulatorDialog::switchstatus = 0;
simulatorDialog::simulatorDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::simulatorDialog),
timer(NULL),
txInterface(NULL),
simulator(NULL),
g_modelIdx(-1),
buttonPressed(0),
middleButtonPressed(false)
{
ui->setupUi(this);
ui->lcd->setFocus();
beepVal = 0;
beepShow = 0;
QSettings settings;
backLight = settings.value("backLight",0).toInt();
bool simuSW=settings.value("simuSW",false).toBool();
switch (backLight) {
case 1:
ui->lcd->setBackgroundColor(166,247,159);
break;
case 2:
ui->lcd->setBackgroundColor(247,159,166);
break;
case 3:
ui->lcd->setBackgroundColor(255,195,151);
break;
case 4:
ui->lcd->setBackgroundColor(247,242,159);
break;
default:
ui->lcd->setBackgroundColor(159,165,247);
break;
}
lightOn=NULL;
setupSticks();
resize(0, 0); // to force min height, min width
this->setFixedSize(this->width(),this->height());
if (simuSW) {
ui->switchAIL->setChecked(switchstatus & 0x1);
switchstatus >>=1;
ui->switchELE->setChecked(switchstatus & 0x1);
switchstatus >>=1;
ui->switchGEA->setChecked(switchstatus & 0x1);
switchstatus >>=1;
ui->switchID0->setChecked(switchstatus & 0x1);
switchstatus >>=1;
ui->switchID1->setChecked(switchstatus & 0x1);
switchstatus >>=1;
ui->switchID2->setChecked(switchstatus & 0x1);
switchstatus >>=1;
ui->switchRUD->setChecked(switchstatus & 0x1);
switchstatus >>=1;
ui->switchTHR->setChecked(switchstatus & 0x1);
}
#ifdef JOYSTICKS
bool js_enable=settings.value("js_support",false).toBool();
int js_ctrl=settings.value("js_ctrl",-1).toInt();
if (js_enable) {
settings.beginGroup("JsCalibration");
int count=0;
for (int j=0; j<8;j++){
int axe=settings.value(QString("stick%1_axe").arg(j),-1).toInt();
if (axe>=0 && axe<8) {
jsmap[axe]=j;
jscal[axe][0]=settings.value(QString("stick%1_min").arg(j),-32767).toInt();
jscal[axe][1]=settings.value(QString("stick%1_med").arg(j),0).toInt();
jscal[axe][2]=settings.value(QString("stick%1_max").arg(j),0).toInt();
jscal[axe][3]=settings.value(QString("stick%1_inv").arg(j),0).toInt();
count++;
}
}
settings.endGroup();
if (count<3) {
QMessageBox::critical(this, tr("Warning"), tr("Joystick enabled but not configured correctly"));
}
if (js_ctrl!=-1) {
joystick = new Joystick(this);
if (joystick) {
if (joystick->open(js_ctrl)) {
int numAxes=std::min(joystick->numAxes,8);
for (int j=0; j<numAxes; j++) {
joystick->sensitivities[j] = 0;
joystick->deadzones[j]=0;
}
nodeRight->setCenteringY(false); //mode 1,3 -> THR on right
ui->holdRightY->setChecked(true);
nodeRight->setCenteringX(false); //mode 1,3 -> THR on right
ui->holdRightX->setChecked(true);
nodeLeft->setCenteringY(false); //mode 1,3 -> THR on right
ui->holdLeftY->setChecked(true);
nodeLeft->setCenteringX(false); //mode 1,3 -> THR on right
ui->holdLeftX->setChecked(true);
connect(joystick, SIGNAL(axisValueChanged(int, int)), this, SLOT(onjoystickAxisValueChanged(int, int)));
}
else {
QMessageBox::critical(this, tr("Warning"), tr("Cannot open joystick, joystick disabled"));
}
}
}
}
#endif
connect(ui->dialP_1,SIGNAL(valueChanged(int)),this,SLOT(dialChanged()));
connect(ui->dialP_2,SIGNAL(valueChanged(int)),this,SLOT(dialChanged()));
connect(ui->dialP_3,SIGNAL(valueChanged(int)),this,SLOT(dialChanged()));
connect(ui->cursor, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->menu, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
}
simulatorDialog::~simulatorDialog()
{
delete timer;
delete ui;
}
void simulatorDialog::closeEvent (QCloseEvent *)
{
simulator->stop();
timer->stop();
}
void simulatorDialog::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::MidButton)
middleButtonPressed = true;
}
void simulatorDialog::dialChanged()
{
ui->dialP_1value->setText(QString("%1 %").arg((ui->dialP_1->value()*100)/1024));
ui->dialP_2value->setText(QString("%1 %").arg((ui->dialP_2->value()*100)/1024));
ui->dialP_3value->setText(QString("%1 %").arg((ui->dialP_3->value()*100)/1024));
}
void simulatorDialog::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::MidButton)
middleButtonPressed = false;
}
void simulatorDialog::wheelEvent (QWheelEvent *event)
{
simulator->wheelEvent(event->delta() > 0 ? 1 : -1);
}
void simulatorDialog::keyPressEvent (QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Enter:
case Qt::Key_Return:
buttonPressed = Qt::Key_Enter;
break;
case Qt::Key_Escape:
case Qt::Key_Backspace:
buttonPressed = Qt::Key_Escape;
break;
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Right:
case Qt::Key_Left:
buttonPressed = event->key();
break;
}
}
void simulatorDialog::keyReleaseEvent(QKeyEvent * event)
{
switch (event->key()) {
case Qt::Key_Enter:
case Qt::Key_Return:
case Qt::Key_Escape:
case Qt::Key_Backspace:
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Right:
case Qt::Key_Left:
buttonPressed = 0;
break;
}
}
void simulatorDialog::setupTimer()
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimerEvent()));
timer->start(10);
}
void simulatorDialog::onButtonPressed(int value)
{
if (value==Qt::Key_Print) {
QSettings settings;
bool toclipboard=settings.value("snapshot_to_clipboard", false).toBool();
QString fileName ="";
if (!toclipboard) {
fileName = QString("screenshot-%1.png").arg(++screenshotIdx);
}
ui->lcd->makeScreenshot(fileName);
} else {
buttonPressed = value;
}
}
void simulatorDialog::onTimerEvent()
{
static unsigned int lcd_counter = 0;
if (!simulator->timer10ms()) {
QMessageBox::critical(this, "Companion", QString(tr("Firmware %1 error: %2")).arg(txInterface->getName()).arg(simulator->getError()));
timer->stop();
return;
}
getValues();
if (g_modelIdx >= 0) {
ModelData *model = & g_radioData.models[g_modelIdx];
setWindowTitle(windowName + (txInterface->getCapability(FlightPhases) ? tr(" - Flight mode: %1(%2)").arg(model->phaseData[simulator->getPhase()].name).arg(simulator->getPhase()) : ""));
/* TODO + QString(" - Timer: (%3, %4) %1:%2") .arg(abs(
-s_timerVal) / 60, 2, 10, QChar('0')).arg(abs(-s_timerVal) % 60, 2, 10,
QChar('0')) .arg(getTimerMode(model->timers[0].mode)) // TODO why timers[0]
.arg(model->timers[0].dir ? "Count Up" : "Count Down")); */
}
else if (ui->tabWidget->currentIndex() == 0) {
bool lightEnable;
if (simulator->lcdChanged(lightEnable)) {
ui->lcd->onLcdChanged(lightEnable);
if (lightOn!=lightEnable) {
if (lightEnable) {
switch (backLight) {
case 1:
ui->top->setStyleSheet("background:url(:/images/9xdt-gr.png);");
ui->bottom->setStyleSheet("background:url(:/images/9xdb-gr.png);");
ui->left->setStyleSheet("background:url(:/images/9xdl-gr.png);");
ui->right->setStyleSheet("background:url(:/images/9xdr-gr.png);");
break;
case 2:
ui->top->setStyleSheet("background:url(:/images/9xdt-rd.png);");
ui->bottom->setStyleSheet("background:url(:/images/9xdb-rd.png);");
ui->left->setStyleSheet("background:url(:/images/9xdl-rd.png);");
ui->right->setStyleSheet("background:url(:/images/9xdr-rd.png);");
break;
case 3:
ui->top->setStyleSheet("background:url(:/images/9xdt-or.png);");
ui->bottom->setStyleSheet("background:url(:/images/9xdb-or.png);");
ui->left->setStyleSheet("background:url(:/images/9xdl-or.png);");
ui->right->setStyleSheet("background:url(:/images/9xdr-or.png);");
break;
case 4:
ui->top->setStyleSheet("background:url(:/images/9xdt-yl.png);");
ui->bottom->setStyleSheet("background:url(:/images/9xdb-yl.png);");
ui->left->setStyleSheet("background:url(:/images/9xdl-yl.png);");
ui->right->setStyleSheet("background:url(:/images/9xdr-yl.png);");
break;
default:
ui->top->setStyleSheet("background:url(:/images/9xdt-bl.png);");
ui->bottom->setStyleSheet("background:url(:/images/9xdb-bl.png);");
ui->left->setStyleSheet("background:url(:/images/9xdl-bl.png);");
ui->right->setStyleSheet("background:url(:/images/9xdr-bl.png);");
break;
}
} else {
ui->top->setStyleSheet("background:url(:/images/9xdt.png);");
ui->bottom->setStyleSheet("background:url(:/images/9xdb.png);");
ui->left->setStyleSheet("background:url(:/images/9xdl.png);");
ui->right->setStyleSheet("background:url(:/images/9xdr.png);");
}
lightOn=lightEnable;
}
}
}
if (!(lcd_counter++ % 5)) {
setValues();
setTrims();
centerSticks();
if (beepVal) {
beepVal = 0;
QApplication::beep();
}
#define CBEEP_ON "QLabel { background-color: #FF364E }"
#define CBEEP_OFF "QLabel { }"
ui->label_beep->setStyleSheet(beepShow ? CBEEP_ON : CBEEP_OFF);
if (beepShow) {
beepShow--;
}
}
}
void simulatorDialog::centerSticks()
{
if(ui->leftStick->scene()) nodeLeft->stepToCenter();
if(ui->rightStick->scene()) nodeRight->stepToCenter();
}
void simulatorDialog::loadParams(RadioData &radioData, const int model_idx)
{
g_modelIdx = model_idx;
txInterface = GetEepromInterface();
simulator = txInterface->getSimulator();
g_radioData = radioData;
if (model_idx < 0) {
windowName = QString(tr("Simulating Tx (%1)").arg(txInterface->getName()));
ui->lcd->setData(simulator->getLcd(), W, H);
}
else {
ui->tabWidget->removeTab(0);
g_radioData.generalSettings.currModel = model_idx;
windowName = tr("Simulating ") + g_radioData.models[model_idx].name;
}
setWindowTitle(windowName);
if (g_radioData.generalSettings.stickMode & 1)
{
nodeLeft->setCenteringY(false); //mode 1,3 -> THR on left
ui->holdLeftY->setChecked(true);
}
else
{
nodeRight->setCenteringY(false); //mode 1,3 -> THR on right
ui->holdRightY->setChecked(true);
}
setTrims();
beepVal = 0;
beepShow = 0;
switches=txInterface->getCapability(LogicalSwitches);
if ( switches < 13) {
ui->cswitch_13->hide();
ui->labelCSW_13->hide();
ui->cswitch_14->hide();
ui->labelCSW_14->hide();
ui->cswitch_15->hide();
ui->labelCSW_15->hide();
}
if ( switches < 16) {
ui->cswitch_16->hide();
ui->labelCSW_16->hide();
ui->cswitch_17->hide();
ui->labelCSW_17->hide();
ui->cswitch_18->hide();
ui->labelCSW_18->hide();
ui->cswitch_19->hide();
ui->labelCSW_19->hide();
ui->cswitch_20->hide();
ui->labelCSW_20->hide();
ui->cswitch_21->hide();
ui->labelCSW_21->hide();
ui->cswitch_22->hide();
ui->labelCSW_22->hide();
ui->cswitch_23->hide();
ui->labelCSW_23->hide();
ui->cswitch_24->hide();
ui->labelCSW_24->hide();
ui->cswitch_25->hide();
ui->labelCSW_25->hide();
ui->cswitch_26->hide();
ui->labelCSW_26->hide();
ui->cswitch_27->hide();
ui->labelCSW_27->hide();
ui->cswitch_28->hide();
ui->labelCSW_28->hide();
ui->cswitch_29->hide();
ui->labelCSW_29->hide();
ui->cswitch_30->hide();
ui->labelCSW_30->hide();
ui->cswitch_31->hide();
ui->labelCSW_31->hide();
ui->cswitch_32->hide();
ui->labelCSW_32->hide();
}
simulator->start(g_radioData, model_idx<0);
setupTimer();
}
void simulatorDialog::setTrims()
{
Trims trims;
simulator->getTrims(trims);
int trimMin = -125, trimMax = +125;
if (trims.extended) {
trimMin = -500;
trimMax = +500;
}
ui->trimHLeft->setRange(trimMin, trimMax); ui->trimHLeft->setValue(trims.values[0]);
ui->trimVLeft->setRange(trimMin, trimMax); ui->trimVLeft->setValue(trims.values[1]);
ui->trimVRight->setRange(trimMin, trimMax); ui->trimVRight->setValue(trims.values[2]);
ui->trimHRight->setRange(trimMin, trimMax); ui->trimHRight->setValue(trims.values[3]);
}
void simulatorDialog::getValues()
{
TxInputs inputs = {{ int(1024*nodeLeft->getX()), // LEFT HORZ
int(-1024*nodeLeft->getY()), // LEFT VERT
int(-1024*nodeRight->getY()), // RGHT VERT
int(1024*nodeRight->getX()) }, // RGHT HORZ
{ ui->dialP_1->value(),
ui->dialP_2->value(),
ui->dialP_3->value(), 0 },
{ ui->switchTHR->isChecked(),
ui->switchRUD->isChecked(),
ui->switchELE->isChecked(),
ui->switchID2->isChecked() ? 1 : (ui->switchID1->isChecked() ? 0 : -1),
ui->switchAIL->isChecked(),
ui->switchGEA->isChecked(),
ui->switchTRN->isDown(),
0, 0, 0 },
{ buttonPressed == Qt::Key_Enter,
buttonPressed == Qt::Key_Escape,
buttonPressed == Qt::Key_Down,
buttonPressed == Qt::Key_Up,
buttonPressed == Qt::Key_Right,
buttonPressed == Qt::Key_Left,
},
middleButtonPressed
};
simulator->setValues(inputs);
switchstatus=ui->switchTHR->isChecked();
switchstatus<<=1;
switchstatus+=(ui->switchRUD->isChecked()&0x1);
switchstatus<<=1;
switchstatus+=(ui->switchID2->isChecked()&0x1);
switchstatus<<=1;
switchstatus+=(ui->switchID1->isChecked()&0x1);
switchstatus<<=1;
switchstatus+=(ui->switchID0->isChecked()&0x1);
switchstatus<<=1;
switchstatus+=(ui->switchGEA->isChecked()&0x1);
switchstatus<<=1;
switchstatus+=(ui->switchELE->isChecked()&0x1);
switchstatus<<=1;
switchstatus+=(ui->switchAIL->isChecked()&0x1);
}
inline int chVal(int val)
{
return qMin(1024, qMax(-1024, val));
}
void simulatorDialog::on_trimHLeft_valueChanged(int value)
{
simulator->setTrim(0, value);
}
void simulatorDialog::on_trimVLeft_valueChanged(int value)
{
simulator->setTrim(1, value);
}
void simulatorDialog::on_trimHRight_valueChanged(int value)
{
simulator->setTrim(3, value);
}
void simulatorDialog::on_trimVRight_valueChanged(int value)
{
simulator->setTrim(2, value);
}
void simulatorDialog::setValues()
{
TxOutputs outputs;
simulator->getValues(outputs);
Trims trims;
simulator->getTrims(trims);
ui->chnout_1->setValue(chVal(outputs.chans[0]));
ui->chnout_2->setValue(chVal(outputs.chans[1]));
ui->chnout_3->setValue(chVal(outputs.chans[2]));
ui->chnout_4->setValue(chVal(outputs.chans[3]));
ui->chnout_5->setValue(chVal(outputs.chans[4]));
ui->chnout_6->setValue(chVal(outputs.chans[5]));
ui->chnout_7->setValue(chVal(outputs.chans[6]));
ui->chnout_8->setValue(chVal(outputs.chans[7]));
if (txInterface->getCapability(Outputs) > 8) {
ui->chnout_9->setValue(chVal(outputs.chans[8]));
ui->chnout_10->setValue(chVal(outputs.chans[9]));
ui->chnout_11->setValue(chVal(outputs.chans[10]));
ui->chnout_12->setValue(chVal(outputs.chans[11]));
ui->chnout_13->setValue(chVal(outputs.chans[12]));
ui->chnout_14->setValue(chVal(outputs.chans[13]));
ui->chnout_15->setValue(chVal(outputs.chans[14]));
ui->chnout_16->setValue(chVal(outputs.chans[15]));
}
ui->chnoutV_1->setText(QString("%1").arg((qreal)outputs.chans[0]*100/1024, 0, 'f', 1));
ui->chnoutV_2->setText(QString("%1").arg((qreal)outputs.chans[1]*100/1024, 0, 'f', 1));
ui->chnoutV_3->setText(QString("%1").arg((qreal)outputs.chans[2]*100/1024, 0, 'f', 1));
ui->chnoutV_4->setText(QString("%1").arg((qreal)outputs.chans[3]*100/1024, 0, 'f', 1));
ui->chnoutV_5->setText(QString("%1").arg((qreal)outputs.chans[4]*100/1024, 0, 'f', 1));
ui->chnoutV_6->setText(QString("%1").arg((qreal)outputs.chans[5]*100/1024, 0, 'f', 1));
ui->chnoutV_7->setText(QString("%1").arg((qreal)outputs.chans[6]*100/1024, 0, 'f', 1));
ui->chnoutV_8->setText(QString("%1").arg((qreal)outputs.chans[7]*100/1024, 0, 'f', 1));
if (txInterface->getCapability(Outputs) > 8) {
ui->chnoutV_9->setText(QString("%1").arg((qreal)outputs.chans[8]*100/1024, 0, 'f', 1));
ui->chnoutV_10->setText(QString("%1").arg((qreal)outputs.chans[9]*100/1024, 0, 'f', 1));
ui->chnoutV_11->setText(QString("%1").arg((qreal)outputs.chans[10]*100/1024, 0, 'f', 1));
ui->chnoutV_12->setText(QString("%1").arg((qreal)outputs.chans[11]*100/1024, 0, 'f', 1));
ui->chnoutV_13->setText(QString("%1").arg((qreal)outputs.chans[12]*100/1024, 0, 'f', 1));
ui->chnoutV_14->setText(QString("%1").arg((qreal)outputs.chans[13]*100/1024, 0, 'f', 1));
ui->chnoutV_15->setText(QString("%1").arg((qreal)outputs.chans[14]*100/1024, 0, 'f', 1));
ui->chnoutV_16->setText(QString("%1").arg((qreal)outputs.chans[15]*100/1024, 0, 'f', 1));
}
ui->leftXPerc->setText(QString("X %1%").arg((qreal)nodeLeft->getX()*100+trims.values[0]/5, 2, 'f', 0));
ui->leftYPerc->setText(QString("Y %1%").arg((qreal)nodeLeft->getY()*-100+trims.values[1]/5, 2, 'f', 0));
ui->rightXPerc->setText(QString("X %1%").arg((qreal)nodeRight->getX()*100+trims.values[2]/5, 2, 'f', 0));
ui->rightYPerc->setText(QString("Y %1%").arg((qreal)nodeRight->getY()*-100+trims.values[3]/5, 2, 'f', 0));
#define CSWITCH_ON "QLabel { background-color: #4CC417 }"
#define CSWITCH_OFF "QLabel { }"
ui->labelCSW_1->setStyleSheet(outputs.vsw[0] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_2->setStyleSheet(outputs.vsw[1] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_3->setStyleSheet(outputs.vsw[2] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_4->setStyleSheet(outputs.vsw[3] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_5->setStyleSheet(outputs.vsw[4] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_6->setStyleSheet(outputs.vsw[5] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_7->setStyleSheet(outputs.vsw[6] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_8->setStyleSheet(outputs.vsw[7] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_9->setStyleSheet(outputs.vsw[8] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_10->setStyleSheet(outputs.vsw[9] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_11->setStyleSheet(outputs.vsw[10] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_12->setStyleSheet(outputs.vsw[11] ? CSWITCH_ON : CSWITCH_OFF);
if (switches > 12) {
ui->labelCSW_13->setStyleSheet(outputs.vsw[12] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_14->setStyleSheet(outputs.vsw[13] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_15->setStyleSheet(outputs.vsw[14] ? CSWITCH_ON : CSWITCH_OFF);
}
if (switches > 15) {
ui->labelCSW_16->setStyleSheet(outputs.vsw[15] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_17->setStyleSheet(outputs.vsw[16] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_18->setStyleSheet(outputs.vsw[17] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_19->setStyleSheet(outputs.vsw[18] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_20->setStyleSheet(outputs.vsw[19] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_21->setStyleSheet(outputs.vsw[20] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_22->setStyleSheet(outputs.vsw[21] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_23->setStyleSheet(outputs.vsw[22] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_24->setStyleSheet(outputs.vsw[23] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_25->setStyleSheet(outputs.vsw[24] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_26->setStyleSheet(outputs.vsw[25] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_27->setStyleSheet(outputs.vsw[26] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_28->setStyleSheet(outputs.vsw[27] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_29->setStyleSheet(outputs.vsw[28] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_30->setStyleSheet(outputs.vsw[29] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_31->setStyleSheet(outputs.vsw[30] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_32->setStyleSheet(outputs.vsw[31] ? CSWITCH_ON : CSWITCH_OFF);
}
if (outputs.beep) {
beepVal = outputs.beep;
beepShow=20;
}
}
void simulatorDialog::setupSticks()
{
QGraphicsScene *leftScene = new QGraphicsScene(ui->leftStick);
leftScene->setItemIndexMethod(QGraphicsScene::NoIndex);
ui->leftStick->setScene(leftScene);
// ui->leftStick->scene()->addLine(0,10,20,30);
QGraphicsScene *rightScene = new QGraphicsScene(ui->rightStick);
rightScene->setItemIndexMethod(QGraphicsScene::NoIndex);
ui->rightStick->setScene(rightScene);
// ui->rightStick->scene()->addLine(0,10,20,30);
nodeLeft = new Node();
nodeLeft->setPos(-GBALL_SIZE/2,-GBALL_SIZE/2);
nodeLeft->setBallSize(GBALL_SIZE);
leftScene->addItem(nodeLeft);
nodeRight = new Node();
nodeRight->setPos(-GBALL_SIZE/2,-GBALL_SIZE/2);
nodeRight->setBallSize(GBALL_SIZE);
rightScene->addItem(nodeRight);
}
void simulatorDialog::resizeEvent(QResizeEvent *event)
{
if(ui->leftStick->scene())
{
QRect qr = ui->leftStick->contentsRect();
qreal w = (qreal)qr.width() - GBALL_SIZE;
qreal h = (qreal)qr.height() - GBALL_SIZE;
qreal cx = (qreal)qr.width()/2;
qreal cy = (qreal)qr.height()/2;
ui->leftStick->scene()->setSceneRect(-cx,-cy,w,h);
QPointF p = nodeLeft->pos();
p.setX(qMin(cx, qMax(p.x(), -cx)));
p.setY(qMin(cy, qMax(p.y(), -cy)));
nodeLeft->setPos(p);
}
if(ui->rightStick->scene())
{
QRect qr = ui->rightStick->contentsRect();
qreal w = (qreal)qr.width() - GBALL_SIZE;
qreal h = (qreal)qr.height() - GBALL_SIZE;
qreal cx = (qreal)qr.width()/2;
qreal cy = (qreal)qr.height()/2;
ui->rightStick->scene()->setSceneRect(-cx,-cy,w,h);
QPointF p = nodeRight->pos();
p.setX(qMin(cx, qMax(p.x(), -cx)));
p.setY(qMin(cy, qMax(p.y(), -cy)));
nodeRight->setPos(p);
}
QDialog::resizeEvent(event);
}
void simulatorDialog::on_holdLeftX_clicked(bool checked)
{
nodeLeft->setCenteringX(!checked);
}
void simulatorDialog::on_holdLeftY_clicked(bool checked)
{
nodeLeft->setCenteringY(!checked);
}
void simulatorDialog::on_holdRightX_clicked(bool checked)
{
nodeRight->setCenteringX(!checked);
}
void simulatorDialog::on_holdRightY_clicked(bool checked)
{
nodeRight->setCenteringY(!checked);
}
void simulatorDialog::on_FixLeftX_clicked(bool checked)
{
nodeLeft->setFixedX(checked);
}
void simulatorDialog::on_FixLeftY_clicked(bool checked)
{
nodeLeft->setFixedY(checked);
}
void simulatorDialog::on_FixRightX_clicked(bool checked)
{
nodeRight->setFixedX(checked);
}
void simulatorDialog::on_FixRightY_clicked(bool checked)
{
nodeRight->setFixedY(checked);
}
#ifdef JOYSTICKS
void simulatorDialog::onjoystickAxisValueChanged(int axis, int value) {
int stick;
if (axis>=0 && axis<8) {
stick=jsmap[axis];
int stickval;
if (value>jscal[axis][1]) {
if ((jscal[axis][2]-jscal[axis][1])==0)
return;
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][2]-jscal[axis][1]);
}
else {
if ((jscal[axis][1]-jscal[axis][0])==0)
return;
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][1]-jscal[axis][0]);
}
if (jscal[axis][3]==1) {
stickval*=-1;
}
if (stick==1 || stick==2) {
float currX=nodeRight->getX();
float currY=nodeRight->getY();
if (stick==1 ) {
nodeRight->setPos(currX*100-10,-stickval*100/1024-10);
}
if (stick==2) {
nodeRight->setPos(stickval*100/1024-10,currY*100-10);
}
} else if (stick==3 || stick==4) {
float currX=nodeLeft->getX();
float currY=nodeLeft->getY();
if (stick==3) {
nodeLeft->setPos(currX*100-10,-stickval*100/1024-10);
}
if (stick==4) {
nodeLeft->setPos(stickval*100/1024-10,currY*100-10);
}
}
if (stick==5) {
ui->dialP_1->setValue(stickval);
}
if (stick==6) {
ui->dialP_2->setValue(stickval);
}
if (stick==7) {
ui->dialP_3->setValue(stickval);
}
}
}
#endif

View file

@ -1,118 +0,0 @@
#ifndef SIMULATORDIALOG_H
#define SIMULATORDIALOG_H
#include <QDialog>
#include "modeledit/node.h"
#include "eeprominterface.h"
#ifdef JOYSTICKS
#include "joystick.h"
#endif
#define TMR_OFF 0
#define TMR_RUNNING 1
#define TMR_BEEPING 2
#define TMR_STOPPED 3
#define FLASH_DURATION 10
namespace Ui {
class simulatorDialog;
}
class simulatorDialog : public QDialog
{
Q_OBJECT
public:
explicit simulatorDialog(QWidget *parent = 0);
~simulatorDialog();
void loadParams(RadioData &radioData, const int model_idx=-1);
private:
Ui::simulatorDialog *ui;
Node *nodeLeft;
Node *nodeRight;
QTimer *timer;
QString windowName;
int backLight;
bool lightOn;
int switches;
#ifdef JOYSTICKS
Joystick *joystick;
int jscal[8][4];
int jsmap[8];
#endif
/* quint16 s_timeCumTot;
quint16 s_timeCumAbs;
quint16 s_timeCumSw;
quint16 s_timeCumThr;
quint16 s_timeCum16ThrP;
quint8 s_timerState;
quint8 beepAgain;
quint16 g_LightOffCounter;
qint16 s_timerVal;
quint16 s_time;
quint16 s_cnt;
quint16 s_sum;
quint8 sw_toggled; */
EEPROMInterface *txInterface;
SimulatorInterface *simulator;
RadioData g_radioData;
int g_modelIdx;
void setupSticks();
void setupTimer();
void resizeEvent(QResizeEvent *event = 0);
void getValues();
void setValues();
void centerSticks();
// void timerTick();
bool keyState(EnumKeys key);
int getValue(qint8 i);
bool getSwitch(int swtch, bool nc, qint8 level=0);
void setTrims();
int beepVal;
int beepShow;
protected:
virtual void closeEvent(QCloseEvent *);
virtual void mousePressEvent(QMouseEvent *);
virtual void mouseReleaseEvent(QMouseEvent *);
virtual void wheelEvent(QWheelEvent *);
virtual void keyPressEvent(QKeyEvent *);
virtual void keyReleaseEvent(QKeyEvent *);
static int screenshotIdx;
static uint32_t switchstatus;
int buttonPressed;
bool middleButtonPressed;
private slots:
void onButtonPressed(int value);
void on_FixRightY_clicked(bool checked);
void on_FixRightX_clicked(bool checked);
void on_FixLeftY_clicked(bool checked);
void on_FixLeftX_clicked(bool checked);
void on_holdRightY_clicked(bool checked);
void on_holdRightX_clicked(bool checked);
void on_holdLeftY_clicked(bool checked);
void on_holdLeftX_clicked(bool checked);
void on_trimHLeft_valueChanged(int);
void on_trimVLeft_valueChanged(int);
void on_trimHRight_valueChanged(int);
void on_trimVRight_valueChanged(int);
void onTimerEvent();
void dialChanged();
#ifdef JOYSTICKS
void onjoystickAxisValueChanged(int axis, int value);
#endif
};
#endif // SIMULATORDIALOG_H

File diff suppressed because it is too large Load diff

View file

@ -1,638 +0,0 @@
#include "xsimulatordialog.h"
#include "ui_xsimulatordialog.h"
#include <iostream>
#include "helpers.h"
#include "simulatorinterface.h"
#ifdef JOYSTICKS
#include "joystick.h"
#endif
#define GBALL_SIZE 20
#define RESX 1024
#define W 212
#define H 64
int xsimulatorDialog::screenshotIdx = 0;
uint32_t xsimulatorDialog::xswitchstatus = 0;
xsimulatorDialog::xsimulatorDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::xsimulatorDialog),
timer(NULL),
lightOn(false),
txInterface(NULL),
simulator(NULL),
g_modelIdx(-1),
beepVal(0),
beepShow(0),
buttonPressed(0)
{
ui->setupUi(this);
ui->lcd->setFocus();
QSettings settings;
ui->lcd->setBackgroundColor(47, 123, 227);
setupSticks();
resize(0, 0); // to force min height, min width
this->setFixedSize(this->width(), this->height());
bool simuSW=settings.value("simuSW",false).toBool();
#ifdef JOYSTICKS
bool js_enable=settings.value("js_support",false).toBool();
int js_ctrl=settings.value("js_ctrl",-1).toInt();
if (js_enable) {
settings.beginGroup("JsCalibration");
int count=0;
for (int j=0; j<8;j++){
int axe=settings.value(QString("stick%1_axe").arg(j),-1).toInt();
if (axe>=0 && axe<8) {
jsmap[axe]=j;
jscal[axe][0]=settings.value(QString("stick%1_min").arg(j),-32767).toInt();
jscal[axe][1]=settings.value(QString("stick%1_med").arg(j),0).toInt();
jscal[axe][2]=settings.value(QString("stick%1_max").arg(j),0).toInt();
jscal[axe][3]=settings.value(QString("stick%1_inv").arg(j),0).toInt();
count++;
}
}
settings.endGroup();
if (count<3) {
QMessageBox::critical(this, tr("Warning"), tr("Joystick enabled but not configured correctly"));
}
if (js_ctrl!=-1) {
joystick = new Joystick(this);
if (joystick) {
if (joystick->open(js_ctrl)) {
int numAxes=std::min(joystick->numAxes,8);
for (int j=0; j<numAxes; j++) {
joystick->sensitivities[j] = 0;
joystick->deadzones[j]=0;
}
nodeRight->setCenteringY(false); //mode 1,3 -> THR on right
ui->holdRightY->setChecked(true);
nodeRight->setCenteringX(false); //mode 1,3 -> THR on right
ui->holdRightX->setChecked(true);
nodeLeft->setCenteringY(false); //mode 1,3 -> THR on right
ui->holdLeftY->setChecked(true);
nodeLeft->setCenteringX(false); //mode 1,3 -> THR on right
ui->holdLeftX->setChecked(true);
connect(joystick, SIGNAL(axisValueChanged(int, int)), this, SLOT(onjoystickAxisValueChanged(int, int)));
}
else {
QMessageBox::critical(this, tr("Warning"), tr("Cannot open joystick, joystick disabled"));
}
}
}
}
#endif
if (simuSW) {
ui->switchH->setValue(xswitchstatus & 0x3);
xswitchstatus>>=2;
ui->switchG->setValue(xswitchstatus & 0x3);
xswitchstatus>>=2;
ui->switchF->setValue(xswitchstatus & 0x3);
xswitchstatus>>=2;
ui->switchE->setValue(xswitchstatus & 0x3);
xswitchstatus>>=2;
ui->switchD->setValue(xswitchstatus & 0x3);
xswitchstatus>>=2;
ui->switchC->setValue(xswitchstatus & 0x3);
xswitchstatus>>=2;
ui->switchB->setValue(xswitchstatus & 0x3);
xswitchstatus>>=2;
ui->switchA->setValue(xswitchstatus & 0x3);
}
connect(ui->cursor, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->menu, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
}
xsimulatorDialog::~xsimulatorDialog()
{
delete timer;
delete ui;
}
void xsimulatorDialog::closeEvent (QCloseEvent *)
{
simulator->stop();
timer->stop();
}
void xsimulatorDialog::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::MidButton)
middleButtonPressed = true;
}
void xsimulatorDialog::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::MidButton)
middleButtonPressed = false;
}
void xsimulatorDialog::wheelEvent (QWheelEvent *event)
{
simulator->wheelEvent(event->delta() > 0 ? 1 : -1);
}
void xsimulatorDialog::keyPressEvent (QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Enter:
case Qt::Key_Return:
buttonPressed = Qt::Key_Enter;
break;
case Qt::Key_Escape:
case Qt::Key_Backspace:
buttonPressed = Qt::Key_Escape;
break;
case Qt::Key_Minus:
case Qt::Key_Plus:
case Qt::Key_PageDown:
case Qt::Key_Menu:
buttonPressed = event->key();
break;
}
}
void xsimulatorDialog::keyReleaseEvent(QKeyEvent * event)
{
switch (event->key()) {
case Qt::Key_Enter:
case Qt::Key_Return:
case Qt::Key_Escape:
case Qt::Key_Backspace:
case Qt::Key_Plus:
case Qt::Key_Minus:
case Qt::Key_PageDown:
case Qt::Key_Menu:
buttonPressed = 0;
break;
}
}
void xsimulatorDialog::setupTimer()
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimerEvent()));
timer->start(10);
}
void xsimulatorDialog::onButtonPressed(int value)
{
if (value==Qt::Key_Print) {
QSettings settings;
bool toclipboard=settings.value("snapshot_to_clipboard", false).toBool();
QString fileName ="";
if (!toclipboard) {
fileName = QString("screenshot-%1.png").arg(++screenshotIdx);
}
ui->lcd->makeScreenshot(fileName);
} else {
buttonPressed = value;
}
}
void xsimulatorDialog::onTimerEvent()
{
static unsigned int lcd_counter = 0;
if (!simulator->timer10ms()) {
QMessageBox::critical(this, "companion", tr("Firmware %1 error: %2").arg(txInterface->getName()).arg(simulator->getError()));
timer->stop();
return;
}
getValues();
if (g_modelIdx >= 0) {
ModelData *model = & g_radioData.models[g_modelIdx];
setWindowTitle(windowName + (txInterface->getCapability(FlightPhases) ? tr(" - Flight mode: %1(%2)").arg(model->phaseData[simulator->getPhase()].name).arg(simulator->getPhase()) : ""));
}
else if (ui->tabWidget->currentIndex() == 0) {
bool lightEnable;
if (simulator->lcdChanged(lightEnable)) {
ui->lcd->onLcdChanged(lightEnable);
if (lightOn!=lightEnable) {
lightOn=lightEnable;
}
}
}
if (!(lcd_counter++ % 5)) {
setValues();
setTrims();
centerSticks();
if (beepVal) {
beepVal = 0;
QApplication::beep();
}
#define CBEEP_ON "QLabel { background-color: #FF364E }"
#define CBEEP_OFF "QLabel { }"
if (beepShow) {
beepShow--;
}
}
}
void xsimulatorDialog::centerSticks()
{
if(ui->leftStick->scene()) nodeLeft->stepToCenter();
if(ui->rightStick->scene()) nodeRight->stepToCenter();
}
void xsimulatorDialog::loadParams(RadioData &radioData, const int model_idx)
{
g_modelIdx = model_idx;
txInterface = GetEepromInterface();
simulator = txInterface->getSimulator();
g_radioData = radioData;
if (model_idx < 0) {
windowName = QString(tr("Simulating Tx (%1)").arg(txInterface->getName()));
ui->lcd->setData(simulator->getLcd(), W, H, 4);
}
else {
ui->tabWidget->removeTab(0);
g_radioData.generalSettings.currModel = model_idx;
windowName = tr("Simulating ") + g_radioData.models[model_idx].name;
}
setWindowTitle(windowName);
if (g_radioData.generalSettings.stickMode & 1)
{
nodeLeft->setCenteringY(false); //mode 1,3 -> THR on left
ui->holdLeftY->setChecked(true);
}
else
{
nodeRight->setCenteringY(false); //mode 1,3 -> THR on right
ui->holdRightY->setChecked(true);
}
setTrims();
beepVal = 0;
beepShow = 0;
simulator->start(g_radioData, model_idx<0);
setupTimer();
}
void xsimulatorDialog::setTrims()
{
Trims trims;
simulator->getTrims(trims);
int trimMin = -125, trimMax = +125;
if (trims.extended) {
trimMin = -500;
trimMax = +500;
}
ui->trimHLeft->setRange(trimMin, trimMax); ui->trimHLeft->setValue(trims.values[0]);
ui->trimVLeft->setRange(trimMin, trimMax); ui->trimVLeft->setValue(trims.values[1]);
ui->trimVRight->setRange(trimMin, trimMax); ui->trimVRight->setValue(trims.values[2]);
ui->trimHRight->setRange(trimMin, trimMax); ui->trimHRight->setValue(trims.values[3]);
}
void xsimulatorDialog::getValues()
{
TxInputs inputs = {{ int(1024*nodeLeft->getX()), // LEFT HORZ
int(-1024*nodeLeft->getY()), // LEFT VERT
int(-1024*nodeRight->getY()), // RGHT VERT
int(1024*nodeRight->getX()) }, // RGHT HORZ
{ -ui->dialP_1->value(),
ui->dialP_2->value(),
-ui->dialP_3->value(),
ui->dialP_4->value() },
{ ui->switchA->value() - 1,
ui->switchB->value() - 1,
ui->switchC->value() - 1,
ui->switchD->value() - 1,
ui->switchE->value() - 1,
ui->switchF->value(),
ui->switchG->value() - 1,
ui->switchH->value(), 0, 0 },
{
buttonPressed == Qt::Key_Menu,
buttonPressed == Qt::Key_Escape,
buttonPressed == Qt::Key_Enter,
buttonPressed == Qt::Key_PageDown,
buttonPressed == Qt::Key_Plus,
buttonPressed == Qt::Key_Minus },
middleButtonPressed
};
simulator->setValues(inputs);
xswitchstatus=ui->switchA->value();
xswitchstatus<<=2;
xswitchstatus+=ui->switchB->value();
xswitchstatus<<=2;
xswitchstatus+=ui->switchC->value();
xswitchstatus<<=2;
xswitchstatus+=ui->switchD->value();
xswitchstatus<<=2;
xswitchstatus+=ui->switchE->value();
xswitchstatus<<=2;
xswitchstatus+=ui->switchF->value();
xswitchstatus<<=2;
xswitchstatus+=ui->switchG->value();
xswitchstatus<<=2;
xswitchstatus+=ui->switchH->value();
}
inline int chVal(int val)
{
return qMin(1024, qMax(-1024, val));
}
void xsimulatorDialog::on_switchH_sliderReleased()
{
QTimer::singleShot(400, this, SLOT(resetTrn()));
}
void xsimulatorDialog::on_trimHLeft_valueChanged(int value)
{
simulator->setTrim(0, value);
}
void xsimulatorDialog::on_trimVLeft_valueChanged(int value)
{
simulator->setTrim(1, value);
}
void xsimulatorDialog::on_trimHRight_valueChanged(int value)
{
simulator->setTrim(3, value);
}
void xsimulatorDialog::on_trimVRight_valueChanged(int value)
{
simulator->setTrim(2, value);
}
void xsimulatorDialog::setValues()
{
TxOutputs outputs;
simulator->getValues(outputs);
Trims trims;
simulator->getTrims(trims);
ui->chnout_1->setValue(chVal(outputs.chans[0]));
ui->chnout_2->setValue(chVal(outputs.chans[1]));
ui->chnout_3->setValue(chVal(outputs.chans[2]));
ui->chnout_4->setValue(chVal(outputs.chans[3]));
ui->chnout_5->setValue(chVal(outputs.chans[4]));
ui->chnout_6->setValue(chVal(outputs.chans[5]));
ui->chnout_7->setValue(chVal(outputs.chans[6]));
ui->chnout_8->setValue(chVal(outputs.chans[7]));
if (txInterface->getCapability(Outputs) > 8) {
ui->chnout_9->setValue(chVal(outputs.chans[8]));
ui->chnout_10->setValue(chVal(outputs.chans[9]));
ui->chnout_11->setValue(chVal(outputs.chans[10]));
ui->chnout_12->setValue(chVal(outputs.chans[11]));
ui->chnout_13->setValue(chVal(outputs.chans[12]));
ui->chnout_14->setValue(chVal(outputs.chans[13]));
ui->chnout_15->setValue(chVal(outputs.chans[14]));
ui->chnout_16->setValue(chVal(outputs.chans[15]));
}
ui->chnoutV_1->setText(QString("%1").arg((qreal)outputs.chans[0]*100/1024, 0, 'f', 1));
ui->chnoutV_2->setText(QString("%1").arg((qreal)outputs.chans[1]*100/1024, 0, 'f', 1));
ui->chnoutV_3->setText(QString("%1").arg((qreal)outputs.chans[2]*100/1024, 0, 'f', 1));
ui->chnoutV_4->setText(QString("%1").arg((qreal)outputs.chans[3]*100/1024, 0, 'f', 1));
ui->chnoutV_5->setText(QString("%1").arg((qreal)outputs.chans[4]*100/1024, 0, 'f', 1));
ui->chnoutV_6->setText(QString("%1").arg((qreal)outputs.chans[5]*100/1024, 0, 'f', 1));
ui->chnoutV_7->setText(QString("%1").arg((qreal)outputs.chans[6]*100/1024, 0, 'f', 1));
ui->chnoutV_8->setText(QString("%1").arg((qreal)outputs.chans[7]*100/1024, 0, 'f', 1));
if (txInterface->getCapability(Outputs) > 8) {
ui->chnoutV_9->setText(QString("%1").arg((qreal)outputs.chans[8]*100/1024, 0, 'f', 1));
ui->chnoutV_10->setText(QString("%1").arg((qreal)outputs.chans[9]*100/1024, 0, 'f', 1));
ui->chnoutV_11->setText(QString("%1").arg((qreal)outputs.chans[10]*100/1024, 0, 'f', 1));
ui->chnoutV_12->setText(QString("%1").arg((qreal)outputs.chans[11]*100/1024, 0, 'f', 1));
ui->chnoutV_13->setText(QString("%1").arg((qreal)outputs.chans[12]*100/1024, 0, 'f', 1));
ui->chnoutV_14->setText(QString("%1").arg((qreal)outputs.chans[13]*100/1024, 0, 'f', 1));
ui->chnoutV_15->setText(QString("%1").arg((qreal)outputs.chans[14]*100/1024, 0, 'f', 1));
ui->chnoutV_16->setText(QString("%1").arg((qreal)outputs.chans[15]*100/1024, 0, 'f', 1));
}
ui->leftXPerc->setText(QString("X %1%").arg((qreal)nodeLeft->getX()*100+trims.values[0]/5, 2, 'f', 0));
ui->leftYPerc->setText(QString("Y %1%").arg((qreal)nodeLeft->getY()*-100+trims.values[1]/5, 2, 'f', 0));
ui->rightXPerc->setText(QString("X %1%").arg((qreal)nodeRight->getX()*100+trims.values[2]/5, 2, 'f', 0));
ui->rightYPerc->setText(QString("Y %1%").arg((qreal)nodeRight->getY()*-100+trims.values[3]/5, 2, 'f', 0));
#define CSWITCH_ON "QLabel { background-color: #4CC417 }"
#define CSWITCH_OFF "QLabel { }"
ui->labelCSW_1->setStyleSheet(outputs.vsw[0] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_2->setStyleSheet(outputs.vsw[1] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_3->setStyleSheet(outputs.vsw[2] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_4->setStyleSheet(outputs.vsw[3] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_5->setStyleSheet(outputs.vsw[4] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_6->setStyleSheet(outputs.vsw[5] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_7->setStyleSheet(outputs.vsw[6] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_8->setStyleSheet(outputs.vsw[7] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_9->setStyleSheet(outputs.vsw[8] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_10->setStyleSheet(outputs.vsw[9] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_11->setStyleSheet(outputs.vsw[10] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_12->setStyleSheet(outputs.vsw[11] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_13->setStyleSheet(outputs.vsw[12] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_14->setStyleSheet(outputs.vsw[13] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_15->setStyleSheet(outputs.vsw[14] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_16->setStyleSheet(outputs.vsw[15] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_17->setStyleSheet(outputs.vsw[16] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_18->setStyleSheet(outputs.vsw[17] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_19->setStyleSheet(outputs.vsw[18] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_20->setStyleSheet(outputs.vsw[19] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_21->setStyleSheet(outputs.vsw[20] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_22->setStyleSheet(outputs.vsw[21] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_23->setStyleSheet(outputs.vsw[22] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_24->setStyleSheet(outputs.vsw[23] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_25->setStyleSheet(outputs.vsw[24] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_26->setStyleSheet(outputs.vsw[25] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_27->setStyleSheet(outputs.vsw[26] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_28->setStyleSheet(outputs.vsw[27] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_29->setStyleSheet(outputs.vsw[28] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_30->setStyleSheet(outputs.vsw[29] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_31->setStyleSheet(outputs.vsw[30] ? CSWITCH_ON : CSWITCH_OFF);
ui->labelCSW_32->setStyleSheet(outputs.vsw[31] ? CSWITCH_ON : CSWITCH_OFF);
if (outputs.beep) {
beepVal = outputs.beep;
beepShow=20;
}
}
void xsimulatorDialog::setupSticks()
{
QGraphicsScene *leftScene = new QGraphicsScene(ui->leftStick);
leftScene->setItemIndexMethod(QGraphicsScene::NoIndex);
ui->leftStick->setScene(leftScene);
// ui->leftStick->scene()->addLine(0,10,20,30);
QGraphicsScene *rightScene = new QGraphicsScene(ui->rightStick);
rightScene->setItemIndexMethod(QGraphicsScene::NoIndex);
ui->rightStick->setScene(rightScene);
// ui->rightStick->scene()->addLine(0,10,20,30);
nodeLeft = new Node();
nodeLeft->setPos(-GBALL_SIZE/2,-GBALL_SIZE/2);
nodeLeft->setBallSize(GBALL_SIZE);
leftScene->addItem(nodeLeft);
nodeRight = new Node();
nodeRight->setPos(-GBALL_SIZE/2,-GBALL_SIZE/2);
nodeRight->setBallSize(GBALL_SIZE);
rightScene->addItem(nodeRight);
}
void xsimulatorDialog::resizeEvent(QResizeEvent *event)
{
if(ui->leftStick->scene())
{
QRect qr = ui->leftStick->contentsRect();
qreal w = (qreal)qr.width() - GBALL_SIZE;
qreal h = (qreal)qr.height() - GBALL_SIZE;
qreal cx = (qreal)qr.width()/2;
qreal cy = (qreal)qr.height()/2;
ui->leftStick->scene()->setSceneRect(-cx,-cy,w,h);
QPointF p = nodeLeft->pos();
p.setX(qMin(cx, qMax(p.x(), -cx)));
p.setY(qMin(cy, qMax(p.y(), -cy)));
nodeLeft->setPos(p);
}
if(ui->rightStick->scene())
{
QRect qr = ui->rightStick->contentsRect();
qreal w = (qreal)qr.width() - GBALL_SIZE;
qreal h = (qreal)qr.height() - GBALL_SIZE;
qreal cx = (qreal)qr.width()/2;
qreal cy = (qreal)qr.height()/2;
ui->rightStick->scene()->setSceneRect(-cx,-cy,w,h);
QPointF p = nodeRight->pos();
p.setX(qMin(cx, qMax(p.x(), -cx)));
p.setY(qMin(cy, qMax(p.y(), -cy)));
nodeRight->setPos(p);
}
QDialog::resizeEvent(event);
}
void xsimulatorDialog::on_holdLeftX_clicked(bool checked)
{
nodeLeft->setCenteringX(!checked);
}
void xsimulatorDialog::on_holdLeftY_clicked(bool checked)
{
nodeLeft->setCenteringY(!checked);
}
void xsimulatorDialog::on_holdRightX_clicked(bool checked)
{
nodeRight->setCenteringX(!checked);
}
void xsimulatorDialog::on_holdRightY_clicked(bool checked)
{
nodeRight->setCenteringY(!checked);
}
void xsimulatorDialog::on_FixLeftX_clicked(bool checked)
{
nodeLeft->setFixedX(checked);
}
void xsimulatorDialog::on_FixLeftY_clicked(bool checked)
{
nodeLeft->setFixedY(checked);
}
void xsimulatorDialog::on_FixRightX_clicked(bool checked)
{
nodeRight->setFixedX(checked);
}
void xsimulatorDialog::on_FixRightY_clicked(bool checked)
{
nodeRight->setFixedY(checked);
}
void xsimulatorDialog::resetTrn()
{
ui->switchH->setValue(0);
}
#ifdef JOYSTICKS
void xsimulatorDialog::onjoystickAxisValueChanged(int axis, int value) {
int stick;
if (axis>=0 && axis<8) {
stick=jsmap[axis];
int stickval;
if (value>jscal[axis][1]) {
if ((jscal[axis][2]-jscal[axis][1])==0)
return;
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][2]-jscal[axis][1]);
}
else {
if ((jscal[axis][1]-jscal[axis][0])==0)
return;
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][1]-jscal[axis][0]);
}
if (jscal[axis][3]==1) {
stickval*=-1;
}
if (stick==1 || stick==2) {
float currX=nodeRight->getX();
float currY=nodeRight->getY();
if (stick==1 ) {
nodeRight->setPos(currX*100-10,-stickval*100/1024-10);
}
if (stick==2) {
nodeRight->setPos(stickval*100/1024-10,currY*100-10);
}
}
else if (stick==3 || stick==4) {
float currX=nodeLeft->getX();
float currY=nodeLeft->getY();
if (stick==3) {
nodeLeft->setPos(currX*100-10,-stickval*100/1024-10);
}
if (stick==4) {
nodeLeft->setPos(stickval*100/1024-10,currY*100-10);
}
}
if (stick==5) {
ui->dialP_1->setValue(stickval);
}
if (stick==6) {
ui->dialP_2->setValue(stickval);
}
if (stick==7) {
ui->dialP_3->setValue(stickval);
}
if (stick==8) {
ui->dialP_4->setValue(stickval);
}
}
}
#endif

View file

@ -1,104 +0,0 @@
#ifndef XSIMULATORDIALOG_H
#define XSIMULATORDIALOG_H
#include <QDialog>
#include "modeledit/node.h"
#include "eeprominterface.h"
#ifdef JOYSTICKS
#include "joystick.h"
#endif
#define TMR_OFF 0
#define TMR_RUNNING 1
#define TMR_BEEPING 2
#define TMR_STOPPED 3
#define FLASH_DURATION 10
;
namespace Ui {
class xsimulatorDialog;
}
class xsimulatorDialog : public QDialog
{
Q_OBJECT
public:
explicit xsimulatorDialog(QWidget *parent = 0);
~xsimulatorDialog();
void loadParams(RadioData &radioData, const int model_idx=-1);
private:
Ui::xsimulatorDialog *ui;
Node *nodeLeft;
Node *nodeRight;
QTimer *timer;
QString windowName;
int backLight;
bool lightOn;
#ifdef JOYSTICKS
Joystick *joystick;
int jscal[8][4];
int jsmap[8];
#endif
EEPROMInterface *txInterface;
SimulatorInterface *simulator;
RadioData g_radioData;
int g_modelIdx;
void setupSticks();
void setupTimer();
void resizeEvent(QResizeEvent *event = 0);
void getValues();
void setValues();
void centerSticks();
// void timerTick();
bool keyState(EnumKeys key);
int getValue(qint8 i);
bool getSwitch(int swtch, bool nc, qint8 level=0);
void setTrims();
int beepVal;
int beepShow;
protected:
virtual void closeEvent(QCloseEvent *);
virtual void mousePressEvent(QMouseEvent *);
virtual void mouseReleaseEvent(QMouseEvent *);
virtual void wheelEvent(QWheelEvent *);
virtual void keyPressEvent(QKeyEvent *);
virtual void keyReleaseEvent(QKeyEvent *);
static int screenshotIdx;
int buttonPressed;
bool middleButtonPressed;
static uint32_t xswitchstatus;
private slots:
void onButtonPressed(int value);
void on_FixRightY_clicked(bool checked);
void on_FixRightX_clicked(bool checked);
void on_FixLeftY_clicked(bool checked);
void on_FixLeftX_clicked(bool checked);
void on_holdRightY_clicked(bool checked);
void on_holdRightX_clicked(bool checked);
void on_holdLeftY_clicked(bool checked);
void on_holdLeftX_clicked(bool checked);
void on_trimHLeft_valueChanged(int);
void on_trimVLeft_valueChanged(int);
void on_trimHRight_valueChanged(int);
void on_trimVRight_valueChanged(int);
void on_switchH_sliderReleased();
void onTimerEvent();
void resetTrn();
#ifdef JOYSTICKS
void onjoystickAxisValueChanged(int axis, int value);
#endif
};
#endif // SIMULATORDIALOG_H

File diff suppressed because it is too large Load diff