diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..3e0c0844a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/.*project +/.settings +/.autotools diff --git a/CREDITS.txt b/CREDITS.txt index 6ea0e45a2..4d36d8d36 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -2,6 +2,7 @@ Bertrand Songis Romolo Manfredini André Bernet Michael Blandford +Rob Thomson Bryan J. Rentoul (aka Gruvin) Cameron Weeks Martin Hotař @@ -17,4 +18,5 @@ Severino Anedda (splash screens) Grootwitbaas - 9xforums.com (mac) Adrian Amberg (splash screens) Wallaguest1 - 9xforums.com (splash screens) -HC1969 - 9xforums.com (splash screens) \ No newline at end of file +HC1969 - 9xforums.com (splash screens) + diff --git a/DONATIONS.txt b/DONATIONS.txt index b2e0e77ea..2c53a5b43 100644 --- a/DONATIONS.txt +++ b/DONATIONS.txt @@ -45,7 +45,7 @@ Martin Wilson Joe Street John Holdsworth Daniel Schwartz -Dean Church +Dean Church (monthly) Michael Halse David Mark Ted Moss @@ -95,8 +95,7 @@ Heinrich Illig Michael Collins Michael Manning Craig Lorentz -Jonathan Modellismo - http://jonathan.it -Aviomotive - http://www.aviomotive.com +Jonathan Modellismo - jonathan.it André Lasseret Felipe Alexandre de Oliveira Brian Harris @@ -126,7 +125,7 @@ Larisa Filocamo Alex Calderhead Hartmut Sahm Åke Brodin -Aloft Hobbies - http://www.alofthobbies.com +Aloft Hobbies - www.alofthobbies.com Ted Moss Filippos Tigarakis Chewytm @@ -166,7 +165,7 @@ Heiko Polig Andrew Fernie Marco Lange Nick McMillan -Michel Baily (mensual) +Michel Baily (monthly) Patrick Mullen Scott Campbell Erich Roeder @@ -252,4 +251,83 @@ Sławomir Juszczak Stephen Henderson David Morgan Aloft Hobbies - +Netanel Hobara +Cameron Galipo +Doug Schafer +Pietro Rossin +Earl Killingsworth +Victor B Wright +Terry McKinley +Марков Алексей +Offer Shmuely +Ian Lobley +Keith Hertzog +Stéphane Fortas +Peter Mitrik +Thomas Majewski +ANF King +Henrik Hammarström +Kenneth Lilja (monthly) +R Wells +Uwe Jordt +Harald Wilczak +Bernhard Lohmann +Ferenc Koller +Robert Ferguson +Daniel Byers +Tyler Darby +Miguel Villalpando +Kim Dong Hoon +Terry McKinley +Walter Bell +wsTech - http://wstech.de +Clinton Linck +Gordon Stahl +Josep Clodas Sola +Thierry Martin +Peter Mauro +Mitchell Brenner +Ulach Green +Lluis Bullich Rañe +Steffen Rohr +Eric Jacquin +Harvest Lane +Ville Kuvaja +DK-System +Heinz Vogel +Heung Jin Choi +MMJS van der Helm +Dan Neelands +Yashiro Masayuki +Isaac Sloan +Harold Baird +Roy Bender +Bradley Murchie +Maximilian Süß +Dean Jansa +Ronald Donker +Paul Oldenkamp +Dietmar Drees +Bradley Murchie +Richard Fahie +James Kaufman +Henry Deucker +Christian Fuchs +Arold Reinders +Robert Miller +Aviomotive - www.aviomotive.com +Mark Gaskievicz +Roland Müller +Frank Gewalt +Remi Viard +Leonard MacKey +Reginald H Millsom +Emanuel Stassar +Pierluigi Sommaruga +Rafael Eric Suarez Nordlow +A Harris +Stefan Grunenberg +Francisco Gutierrez Muñoz +Steve Coley +Sean Cull +Roberto Orsello diff --git a/README.md b/README.md new file mode 100644 index 000000000..1b9c5331e --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +##OpenTX Next Branch + +You have found your way to the GitHub repository site for the OpenTX Next Branch. This code branch holds the source code for the ongoing development. + +The stable release code is not here, it is in the master branch. +Under no circumstances build and use software from this branch for real world application. At times you will be more or less guaranteed to crash your plane and destroy all your model settings. + +Refer to the opentx.wiki for information about setting up the tool chains for building OpenTX and OpenTX Companion as well as other development related issues. diff --git a/README.txt b/README.txt deleted file mode 100644 index 8f6415cbd..000000000 --- a/README.txt +++ /dev/null @@ -1 +0,0 @@ -[to be written] diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 318a65524..73d21daff 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -1,7 +1,7 @@ -PROJECT( companion9x ) +PROJECT( companion ) SET( C9X_VERSION_MAJOR "1" ) -SET( C9X_VERSION_MINOR "51" ) +SET( C9X_VERSION_MINOR "52" ) SET( C9X_VERSION ${C9X_VERSION_MAJOR}.${C9X_VERSION_MINOR} ) CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) @@ -72,180 +72,135 @@ ELSE( ) LINK_DIRECTORIES( /usr/local/lib ) ENDIF( ) -INCLUDE_DIRECTORIES( ${XSD_INCLUDE_DIR} ) +set(RADIO_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}/../../radio/src) +set(SIMU_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}/simulation) +set(COMPANION_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}) -FIND_PACKAGE( Subversion ) -SET( C9X_WC_REVISION 0 ) -IF( Subversion_FOUND ) - # Subversion_WC_INFO( ${PROJECT_SOURCE_DIR} C9X ) -ENDIF( ) - -INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/../.. ${PROJECT_SOURCE_DIR}/../../radio/src/fonts/std ) - -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 + OUTPUT ${RADIO_SRC_DIRECTORY}/bitmaps/sticks.lbm + COMMAND make lbm + DEPENDS ${RADIO_SRC_DIRECTORY}/bitmaps/sticks_4x1.xbm + WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY} ) -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 + OUTPUT ${RADIO_SRC_DIRECTORY}/translations/en.h + COMMAND make tra + DEPENDS ${RADIO_SRC_DIRECTORY}/translations/en.h.txt + WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY} ) -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 +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} ) -SET( companion9x_SRCS - eeprominterface.cpp - hexinterface.cpp - flashinterface.cpp - file.cpp - xmlinterface.cpp - ${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/open9xeeprom.cpp - firmwares/opentx/open9xStockeeprom.cpp - firmwares/opentx/open9xinterface.cpp - firmwares/opentx/open9xGruvin9xeeprom.cpp - firmwares/opentx/open9xSky9xeeprom.cpp - firmwares/opentx/opentxTaranisSimulator.cpp - firmwares/opentx/open9xSky9xsimulator.cpp - firmwares/opentx/open9xGruvin9xsimulator.cpp - firmwares/opentx/open9xM128simulator.cpp - firmwares/opentx/open9xsimulator.cpp - firmwares/ersky9x/ersky9xeeprom.cpp - firmwares/ersky9x/ersky9xinterface.cpp - ${ERSKY9X_CHECKOUT_DIRECTORY}/ersky9xsimulator.cpp - node.cpp - edge.cpp - helpers.cpp - mdichild.cpp - generaledit.cpp - modeledit.cpp - modelslist.cpp - mountlist.cpp - mixerslist.cpp - avroutputdialog.cpp - preferencesdialog.cpp - burnconfigdialog.cpp - comparedialog.cpp - contributorsdialog.cpp - customizesplashdialog.cpp - burndialog.cpp - printdialog.cpp - fusesdialog.cpp - expodialog.cpp - mixerdialog.cpp - logsdialog.cpp - downloaddialog.cpp - simulatordialog.cpp - xsimulatordialog.cpp - splashlibrary.cpp - mainwindow.cpp - main.cpp - modelconfigdialog.cpp - qcustomplot.cpp +add_subdirectory(modeledit) +add_subdirectory(simulation) + +set(companion_SRCS + eeprominterface.cpp + hexinterface.cpp + flashinterface.cpp + file.cpp + xmlinterface.cpp + ${PROJECT_BINARY_DIR}/radio.cxx + firmwares/th9x/th9xeeprom.cpp + firmwares/th9x/th9xinterface.cpp + firmwares/er9x/er9xeeprom.cpp + firmwares/er9x/er9xinterface.cpp + firmwares/gruvin9x/gruvin9xeeprom.cpp + firmwares/gruvin9x/gruvin9xinterface.cpp + firmwares/opentx/opentxeeprom.cpp + firmwares/opentx/open9xStockeeprom.cpp + firmwares/opentx/open9xGruvin9xeeprom.cpp + firmwares/opentx/open9xSky9xeeprom.cpp + firmwares/opentx/opentxinterface.cpp + firmwares/opentx/opentxTaranisSimulator.cpp + firmwares/opentx/opentxSky9xsimulator.cpp + firmwares/opentx/opentxGruvin9xsimulator.cpp + firmwares/opentx/opentxM128simulator.cpp + firmwares/opentx/opentxsimulator.cpp + firmwares/ersky9x/ersky9xeeprom.cpp + firmwares/ersky9x/ersky9xinterface.cpp + ${RADIO_SRC_DIRECTORY}/bitmaps/sticks.lbm + ${RADIO_SRC_DIRECTORY}/translations/en.h + appdata.cpp + helpers.cpp + mdichild.cpp + generaledit.cpp + modelslist.cpp + mountlist.cpp + avroutputdialog.cpp + apppreferencesdialog.cpp + fwpreferencesdialog.cpp + burnconfigdialog.cpp + comparedialog.cpp + contributorsdialog.cpp + customizesplashdialog.cpp + burndialog.cpp + printdialog.cpp + fusesdialog.cpp + logsdialog.cpp + downloaddialog.cpp + splashlibrary.cpp + mainwindow.cpp + companion.cpp + modelconfigdialog.cpp + qcustomplot.cpp ) -SET( companion9x_MOC_HDRS - avroutputdialog.h - preferencesdialog.h - burnconfigdialog.h - comparedialog.h - printdialog.h - fusesdialog.h - mixerdialog.h - logsdialog.h - expodialog.h - contributorsdialog.h - customizesplashdialog.h - splashlibrary.h - splashlabel.h - burndialog.h - downloaddialog.h - cursorwidget.h - menuwidget.h - simulatordialog.h - xcursorwidget.h - xmenuwidget.h - xsimulatordialog.h - generaledit.h - modeledit.h - modelslist.h - mixerslist.h - mdichild.h - mainwindow.h - myslider.h - modelconfigdialog.h - qcustomplot.h +set(companion_MOC_HDRS + avroutputdialog.h + apppreferencesdialog.h + fwpreferencesdialog.h + burnconfigdialog.h + comparedialog.h + printdialog.h + fusesdialog.h + logsdialog.h + contributorsdialog.h + customizesplashdialog.h + splashlibrary.h + splashlabel.h + burndialog.h + downloaddialog.h + generaledit.h + modelslist.h + mdichild.h + mainwindow.h + modelconfigdialog.h + qcustomplot.h + helpers.h ) -SET( companion9x_UIS - mdichild.ui - avroutputdialog.ui - comparedialog.ui - fusesdialog.ui - expodialog.ui - logsdialog.ui - mixerdialog.ui - preferencesdialog.ui - simulatordialog.ui - xsimulatordialog.ui - burnconfigdialog.ui - downloaddialog.ui - generaledit.ui - modeledit.ui - printdialog.ui - contributorsdialog.ui - customizesplashdialog.ui - splashlibrary.ui - burndialog.ui - modelconfigdialog.ui +set(companion_UIS + mdichild.ui + avroutputdialog.ui + comparedialog.ui + fusesdialog.ui + logsdialog.ui + apppreferencesdialog.ui + fwpreferencesdialog.ui + burnconfigdialog.ui + downloaddialog.ui + generaledit.ui + printdialog.ui + contributorsdialog.ui + customizesplashdialog.ui + splashlibrary.ui + burndialog.ui + modelconfigdialog.ui ) -IF ( SDL_FOUND ) - SET( companion9x_SRCS - ${companion9x_SRCS} - joystick.cpp - joystickdialog.cpp - ) - - SET( companion9x_MOC_HDRS - ${companion9x_MOC_HDRS} - joystick.h - joystickdialog.h - ) - - SET( companion9x_UIS - ${companion9x_UIS} - joystickdialog.ui - ) -ENDIF( ) - -SET( companion9x_RCS - companion9x.qrc - ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc +set(companion_RCS + companion.qrc + ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc ) MACRO (TODAY RESULT) @@ -283,10 +238,8 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/translations.qrc.in ${CMAKE_CURRENT_B # Subversion_WC_INFO( ${PROJECT_SOURCE_DIR}/../${FIRMWARE} G9X ) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/firmwares/opentx/stamp-opentx.h.in ${CMAKE_CURRENT_BINARY_DIR}/stamp-opentx.h @ONLY) -SET( PATCH_FLAGS "--binary" ) - IF( WIN32 ) - SET( companion9x_SRCS ${companion9x_SRCS} icon.rc ) + SET( companion_SRCS ${companion_SRCS} icon.rc ) IF ( NOT MSVC ) SET(CMAKE_EXE_LINKER_FLAGS -mwindows) ENDIF( ) @@ -295,31 +248,120 @@ ENDIF( ) INCLUDE_DIRECTORIES( ${CMAKE_BINARY_DIR} ) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR} ) - -SET( LANGUAGES he pt ru de fr it sv cs ) +SET( LANGUAGES he pl pt ru de fr it sv cs fi) FOREACH( language ${LANGUAGES} ) - SET( companion9x_TS ${companion9x_TS} translations/companion9x_${language}.ts ) + SET( companion_TS ${companion_TS} translations/companion_${language}.ts ) ENDFOREACH( language ) -QT4_WRAP_UI( companion9x_SRCS ${companion9x_UIS} ) -QT4_WRAP_CPP( companion9x_SRCS ${companion9x_MOC_HDRS} ) -QT4_ADD_TRANSLATION( companion9x_QM ${companion9x_TS} ) -QT4_ADD_RESOURCES( companion9x_SRCS ${companion9x_RCS} ) +QT4_WRAP_UI( companion_SRCS ${companion_UIS} ) +QT4_WRAP_CPP( companion_SRCS ${companion_MOC_HDRS} ) +QT4_ADD_TRANSLATION( companion_QM ${companion_TS} ) +QT4_ADD_RESOURCES( companion_SRCS ${companion_RCS} ) ADD_DEFINITIONS( -DQT_TRANSLATIONS_DIR="${QT_TRANSLATIONS_DIR}" ) IF( APPLE ) - ADD_EXECUTABLE( ${PROJECT_NAME} MACOSX_BUNDLE ${companion9x_SRCS} ${companion9x_QM} ) + ADD_EXECUTABLE( ${PROJECT_NAME} MACOSX_BUNDLE ${companion_SRCS} ${companion_QM} ) ELSE( ) - ADD_EXECUTABLE( ${PROJECT_NAME} WIN32 ${companion9x_SRCS} ${companion9x_QM} ) + ADD_EXECUTABLE( ${PROJECT_NAME} WIN32 ${companion_SRCS} ${companion_QM} ) ENDIF( ) -TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${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} ) + +############# Standalone simu ############### + +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_SRCS + eeprominterface.cpp + firmwares/th9x/th9xeeprom.cpp # TODO not needed + firmwares/th9x/th9xinterface.cpp + ${TH9X_CHECKOUT_DIRECTORY}/th9xsimulator.cpp + firmwares/er9x/er9xeeprom.cpp # TODO not needed + firmwares/er9x/er9xinterface.cpp + ${ER9X_CHECKOUT_DIRECTORY}/er9xsimulator.cpp + firmwares/gruvin9x/gruvin9xeeprom.cpp # TODO not needed + firmwares/gruvin9x/gruvin9xinterface.cpp + firmwares/opentx/opentxeeprom.cpp # TODO not needed + firmwares/opentx/open9xStockeeprom.cpp # TODO not needed + firmwares/opentx/open9xGruvin9xeeprom.cpp # TODO not needed + firmwares/opentx/open9xSky9xeeprom.cpp # TODO not needed + firmwares/opentx/opentxinterface.cpp + firmwares/opentx/opentxTaranisSimulator.cpp + firmwares/opentx/opentxSky9xsimulator.cpp + firmwares/opentx/opentxGruvin9xsimulator.cpp + firmwares/opentx/opentxM128simulator.cpp + firmwares/opentx/opentxsimulator.cpp + firmwares/ersky9x/ersky9xeeprom.cpp # TODO not needed + firmwares/ersky9x/ersky9xinterface.cpp + ${ERSKY9X_CHECKOUT_DIRECTORY}/ersky9xsimulator.cpp + ${RADIO_SRC_DIRECTORY}/bitmaps/sticks.lbm + ${RADIO_SRC_DIRECTORY}/translations/en.h + file.cpp # TODO not needed + modeledit/node.cpp + modeledit/edge.cpp # TODO not needed + appdata.cpp + simulator.cpp +) + +set(simu_HDRS + modeledit/node.h +) + +qt4_wrap_cpp(simu_SRCS ${simu_HDRS} ) +qt4_add_resources(simu_SRCS companion.qrc) # TODO not needed + +if(WIN32) + set(simu_SRCS ${simu_SRCS} icon.rc) +endif() + +add_executable(simulator WIN32 ${simu_SRCS}) + +if(SDL_FOUND) + target_link_libraries(simulator simulation ${QT_LIBRARIES} ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${PHONON_LIBS}) +else() + target_link_libraries(simulator simulation ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY} ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${PHONON_LIBS}) +endif() + +############# Packaging #################### IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux") INSTALL( TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin ) - INSTALL( FILES companion9x.desktop DESTINATION share/applications ) - INSTALL( FILES companion9x.png DESTINATION share/icons ) + INSTALL( FILES companion.desktop DESTINATION share/applications ) + INSTALL( FILES images/linuxicons/16x16/companion.png DESTINATION /usr/share/icons/hicolor/16x16/apps ) + INSTALL( FILES images/linuxicons/22x22/companion.png DESTINATION /usr/share/icons/hicolor/22x22/apps ) + INSTALL( FILES images/linuxicons/24x24/companion.png DESTINATION /usr/share/icons/hicolor/24x24/apps ) + INSTALL( FILES images/linuxicons/32x32/companion.png DESTINATION /usr/share/icons/hicolor/32x32/apps ) + INSTALL( FILES images/linuxicons/48x48/companion.png DESTINATION /usr/share/icons/hicolor/48x48/apps ) + INSTALL( FILES images/linuxicons/128x128/companion.png DESTINATION /usr/share/icons/hicolor/128x128/apps ) + INSTALL( FILES images/linuxicons/256x256/companion.png DESTINATION /usr/share/icons/hicolor/256x256/apps ) + INSTALL( FILES images/linuxicons/512x512/companion.png DESTINATION /usr/share/icons/hicolor/512x512/apps ) + INSTALL( FILES images/linuxicons/scalable/companion.svg DESTINATION /usr/share/icons/hicolor/scalable/apps ) INSTALL( FILES ../targets/linux/45-taranis.rules DESTINATION /etc/udev/rules.d/ ) # Linux specific code SET(OperatingSystem "Linux") @@ -329,13 +371,13 @@ ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux") IF( WIN32 ) IF( MSVC ) - SET( NSI_IN_FILE companion9x-vs.nsi.in ) + SET( NSI_IN_FILE companion-vs.nsi.in ) ELSE( ) - SET( NSI_IN_FILE companion9x-msys.nsi.in ) + SET( NSI_IN_FILE companion-msys.nsi.in ) ENDIF( ) SET( SYSDIR "$ENV{windir}/system32" ) - CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/../targets/windows/${NSI_IN_FILE} ${CMAKE_CURRENT_BINARY_DIR}/companion9x.nsi @ONLY) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/../targets/windows/${NSI_IN_FILE} ${CMAKE_CURRENT_BINARY_DIR}/companion.nsi @ONLY) FIND_PROGRAM(NSIS_EXE makensis.exe PATHS "C:/Program Files/NSIS" @@ -343,14 +385,15 @@ IF( WIN32 ) "C:/Programs/NSIS" ) - ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/companion9xInstall.exe - COMMAND "${NSIS_EXE}" ARGS companion9x.nsi - DEPENDS ${PROJECT_NAME} ${PROJECT_BINARY_DIR}/companion9x.nsi + ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/companionInstall.exe + COMMAND "${NSIS_EXE}" ARGS companion.nsi + DEPENDS ${PROJECT_NAME} ${PROJECT_BINARY_DIR}/companion.nsi COMMENT "Windows NSIS Installer") ADD_CUSTOM_TARGET( installer - DEPENDS ${PROJECT_BINARY_DIR}/companion9xInstall.exe - SOURCES ${PROJECT_BINARY_DIR}/companion9x.nsi) + DEPENDS ${PROJECT_BINARY_DIR}/companionInstall.exe + SOURCES ${PROJECT_BINARY_DIR}/companion.nsi + ) ENDIF( ) IF( APPLE ) @@ -362,36 +405,36 @@ IF( APPLE ) ENDIF() ADD_CUSTOM_TARGET( addframeworks ALL - COMMAND mkdir -p companion9x.app/Contents/Frameworks - COMMAND mkdir -p companion9x.app/Contents/Resources - COMMAND mkdir -p companion9x.app/Contents/translations - COMMAND rsync ${PROJECT_SOURCE_DIR}/images/${MACOSX_BUNDLE_ICON_FILE} companion9x.app/Contents/Resources/${MACOSX_BUNDLE_ICON_FILE} # Copy the icon files - COMMAND rsync ${PROJECT_SOURCE_DIR}/../macbuild/lib* companion9x.app/Contents/Frameworks - #COMMAND rsync ${PROJECT_SOURCE_DIR}/../macbuild/libcrypto.1.0.0.dylib companion9x.app/Contents/Frameworks - COMMAND rsync -r --exclude=.svn ${PROJECT_SOURCE_DIR}/../macbuild/qt_menu.nib companion9x.app/Contents/Resources/ - COMMAND rsync ${PROJECT_BINARY_DIR}/*.qm companion9x.app/Contents/translations - COMMAND ${QT_BINARY_DIR}/macdeployqt companion9x.app + COMMAND mkdir -p companion.app/Contents/Frameworks + COMMAND mkdir -p companion.app/Contents/Resources + COMMAND mkdir -p companion.app/Contents/translations + COMMAND rsync ${PROJECT_SOURCE_DIR}/images/${MACOSX_BUNDLE_ICON_FILE} companion.app/Contents/Resources/${MACOSX_BUNDLE_ICON_FILE} # Copy the icon files + COMMAND rsync ${PROJECT_SOURCE_DIR}/../targets/mac/lib* companion.app/Contents/Frameworks + #COMMAND rsync ${PROJECT_SOURCE_DIR}/../targets/mac/libcrypto.1.0.0.dylib companion.app/Contents/Frameworks + COMMAND rsync -r --exclude=.svn ${PROJECT_SOURCE_DIR}/../targets/mac/qt_menu.nib companion.app/Contents/Resources/ + COMMAND rsync ${PROJECT_BINARY_DIR}/*.qm companion.app/Contents/translations + COMMAND ${QT_BINARY_DIR}/macdeployqt companion.app WORKING_DIRECTORY ${WORK_DIR} DEPENDS ${PROJECT_NAME} ) ADD_CUSTOM_TARGET( makedmg - COMMAND ${QT_BINARY_DIR}/macdeployqt companion9x.app -dmg -no-plugins + COMMAND ${QT_BINARY_DIR}/macdeployqt companion.app -dmg -no-plugins WORKING_DIRECTORY ${WORK_DIR} DEPENDS addframeworks ) ENDIF( ) ADD_CUSTOM_TARGET( stamp - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/version.h ${CMAKE_SOURCE_DIR}/../companion9x.stamp + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/version.h ${CMAKE_SOURCE_DIR}/../companion.stamp DEPENDS ${CMAKE_BINARY_DIR}/version.h ) ADD_CUSTOM_TARGET( translations WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMAND lupdate-qt4 ${CMAKE_SOURCE_DIR} -ts ${companion9x_TS} ) + COMMAND lupdate-qt4 ${CMAKE_SOURCE_DIR} -ts ${companion_TS} ) -SET(CPACK_PACKAGE_NAME "COMPANION9X") -SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "EEPROM Editor for the openTx open source firmware") +SET(CPACK_PACKAGE_NAME "COMPANION") +SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Models and settings editor for the OpenTx open source firmware") string(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_PACKAGE_NAME_LOWERCASE) find_program(DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems") if(DPKG_PROGRAM) diff --git a/companion/src/appdata.cpp b/companion/src/appdata.cpp new file mode 100644 index 000000000..ec634da4d --- /dev/null +++ b/companion/src/appdata.cpp @@ -0,0 +1,678 @@ +// Companion Application Data Class Definition. +// Author Kjell Kernen + +#include "appdata.h" + +// Global data and storage object +AppData g; + +// ** CompStoreObj class******************** +void CompStoreObj::clear (const QString tag1, const QString tag2, const QString tag3) +{ + QSettings settings(PRODUCT, COMPANY); + if (tag2.isEmpty()) + { + settings.remove(tag1); + } + else if (tag3.isEmpty()) + { + settings.beginGroup(tag1); + settings.remove(tag2); + settings.endGroup(); + } + else + { + settings.beginGroup(tag1); + settings.beginGroup(tag2); + settings.remove(tag3); + settings.endGroup(); + settings.endGroup(); + } +} + +void CompStoreObj::store(const QByteArray newArray, QByteArray &array, const QString tag, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + settings.setValue(tag, newArray); + array = newArray; + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +void CompStoreObj::store(const QStringList newSList, QStringList &stringList, const QString tag, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + settings.setValue(tag, newSList); + stringList = newSList; + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +void CompStoreObj::store(const QString newString, QString &string, const QString tag, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + settings.setValue(tag, newString); + string = newString; + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +void CompStoreObj::store(const bool newTruth, bool &truth, const QString tag, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + settings.setValue(tag, newTruth); + truth = newTruth; + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +void CompStoreObj::store(const int newNumber, int &number, const QString tag, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + settings.setValue(tag, newNumber); + number = newNumber; + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +// Retrieval functions +void CompStoreObj::retrieve( QByteArray &array, const QString tag, const QString def, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + array = settings.value(tag, def).toByteArray(); + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +void CompStoreObj::retrieve( QStringList &stringList, const QString tag, const QString def, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + stringList = settings.value(tag, def).toStringList(); + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +void CompStoreObj::retrieve( QString &string, const QString tag, const QString def, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + string = settings.value(tag, def).toString(); + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +void CompStoreObj::retrieve( bool &truth, const QString tag, const bool def, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + truth = settings.value(tag, def).toBool(); + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +void CompStoreObj::retrieve( int &number, const QString tag, const int def, const QString group1, const QString group2 ) +{ + QSettings settings(PRODUCT, COMPANY); + if (!group1.isEmpty()) settings.beginGroup(group1); + if (!group2.isEmpty()) settings.beginGroup(group2); + + number = settings.value(tag, def).toInt(); + + if (!group1.isEmpty()) settings.endGroup(); + if (!group2.isEmpty()) settings.endGroup(); +} + +// Retrieve and Store functions +void CompStoreObj::getset( QByteArray &array, const QString tag, const QString def, const QString group1, const QString group2 ) +{ + retrieve( array, tag, def, group1, group2); + store(array, array, tag, group1, group2); +} + +void CompStoreObj::getset( QStringList &stringList, const QString tag, const QString def, const QString group1, const QString group2 ) +{ + retrieve( stringList, tag, def, group1, group2); + store(stringList, stringList, tag, group1, group2); +} + +void CompStoreObj::getset( QString &string, const QString tag, const QString def, const QString group1, const QString group2 ) +{ + retrieve( string, tag, def, group1, group2); + store(string, string, tag, group1, group2); +} + +void CompStoreObj::getset( bool &truth, const QString tag, const bool def, const QString group1, const QString group2 ) +{ + retrieve( truth, tag, def, group1, group2); + store(truth, truth, tag, group1, group2); +} + +void CompStoreObj::getset( int &number, const QString tag, const int def, const QString group1, const QString group2 ) +{ + retrieve( number, tag, def, group1, group2); + store(number, number, tag, group1, group2); +} + +// ** FwRevision class******************** +int FwRevision::get( const QString fwType ) +{ + QString result; + retrieve( result, fwType, "", "FwRevisions" ); + return result.toInt(); +} + +void FwRevision::set( const QString fwType, const int fwRevision ) +{ + QString tempString= QString("%1").arg(fwRevision); + store( tempString, tempString, fwType, "FwRevisions" ); +} + +void FwRevision::remove( const QString tag ) +{ + clear( "FwRevisions", tag ); +} + +// ** JStickData class******************** +// Get declarations +int JStickData::stick_axe() { return _stickAxe; } +int JStickData::stick_min() { return _stickMin; } +int JStickData::stick_med() { return _stickMed; } +int JStickData::stick_max() { return _stickMax; } +int JStickData::stick_inv() { return _stickInv; } + +// Set declarations +void JStickData::stick_axe(const int it) { store( it, _stickAxe, QString("stick%1_axe").arg(index), "JsCalibration" );} +void JStickData::stick_min(const int it) { store( it, _stickMin, QString("stick%1_min").arg(index), "JsCalibration" );} +void JStickData::stick_med(const int it) { store( it, _stickMed, QString("stick%1_med").arg(index), "JsCalibration" );} +void JStickData::stick_max(const int it) { store( it, _stickMax, QString("stick%1_max").arg(index), "JsCalibration" );} +void JStickData::stick_inv(const int it) { store( it, _stickInv, QString("stick%1_inv").arg(index), "JsCalibration" );} + +// Constructor +JStickData::JStickData() +{ + index = -1; +} + +void JStickData::remove() +{ + // Remove all JStickData values from settings file + QSettings settings(PRODUCT, COMPANY); + settings.beginGroup( "JsCalibration" ); + settings.remove( QString( "stick%1_axe").arg(index) ); + settings.remove( QString( "stick%1_min").arg(index) ); + settings.remove( QString( "stick%1_med").arg(index) ); + settings.remove( QString( "stick%1_max").arg(index) ); + settings.remove( QString( "stick%1_inv").arg(index) ); + settings.endGroup(); + + // Reset all JStickData variables to initial values + init(index); +} + +bool JStickData::existsOnDisk() +{ + QSettings settings(PRODUCT, COMPANY); + settings.beginGroup("JsCalibration"); + int axe = settings.value( QString("stick%1_axe").arg(index), -1 ).toInt(); + settings.endGroup(); + + return (axe > -1); +} + +void JStickData::init(int newIndex) +{ + index = newIndex; + _stickAxe = -1; + _stickMin = -32767; + _stickMed = 0; + _stickMax = 0; + _stickInv = 0; + + // Do not write empty joystick calibrations to disk. + if ( !existsOnDisk() ) + return; + + flush(); +} + +void JStickData::flush() +{ + getset( _stickAxe, QString("stick%1_axe").arg(index), -1, "JsCalibration" ); + getset( _stickMin, QString("stick%1_min").arg(index), -32767, "JsCalibration" ); + getset( _stickMed, QString("stick%1_med").arg(index), 0, "JsCalibration" ); + getset( _stickMax, QString("stick%1_max").arg(index), 0, "JsCalibration" ); + getset( _stickInv, QString("stick%1_inv").arg(index), 0, "JsCalibration" ); +} + +// ** Profile class******************** +// Get declarations +QString Profile::fwName() const { return _fwName; } +QString Profile::fwType() const { return _fwType; } +QString Profile::name() const { return _name; } +QString Profile::sdPath() const { return _sdPath; } +QString Profile::splashFile() const { return _splashFile; } +bool Profile::burnFirmware() const { return _burnFirmware; } +bool Profile::renameFwFiles() const { return _renameFwFiles; } +int Profile::channelOrder() const { return _channelOrder; } +int Profile::defaultMode() const { return _defaultMode; } + +QString Profile::beeper() const { return _beeper; } +QString Profile::countryCode() const { return _countryCode; } +QString Profile::display() const { return _display; } +QString Profile::haptic() const { return _haptic; } +QString Profile::speaker() const { return _speaker; } +QString Profile::stickPotCalib() const { return _stickPotCalib; } +QString Profile::trainerCalib() const { return _trainerCalib; } +int Profile::currentCalib() const { return _currentCalib; } +int Profile::gsStickMode() const { return _gsStickMode; } +int Profile::ppmMultiplier() const { return _ppmMultiplier; } +int Profile::vBatCalib() const { return _vBatCalib; } +int Profile::vBatWarn() const { return _vBatWarn; } + +// Set declarations +void Profile::name (const QString x) { store(x, _name, "Name" ,"Profiles", QString("profile%1").arg(index));} +void Profile::fwName (const QString x) { store(x, _fwName, "fwName" ,"Profiles", QString("profile%1").arg(index));} +void Profile::fwType (const QString x) { store(x, _fwType, "fwType" ,"Profiles", QString("profile%1").arg(index));} +void Profile::sdPath (const QString x) { store(x, _sdPath, "sdPath" ,"Profiles", QString("profile%1").arg(index));} +void Profile::splashFile (const QString x) { store(x, _splashFile, "SplashFileName" ,"Profiles", QString("profile%1").arg(index));} +void Profile::burnFirmware (const bool x) { store(x, _burnFirmware, "burnFirmware" ,"Profiles", QString("profile%1").arg(index));} +void Profile::renameFwFiles (const bool x) { store(x, _renameFwFiles, "rename_firmware_files" ,"Profiles", QString("profile%1").arg(index));} +void Profile::channelOrder (const int x) { store(x, _channelOrder, "default_channel_order" ,"Profiles", QString("profile%1").arg(index));} +void Profile::defaultMode (const int x) { store(x, _defaultMode, "default_mode" ,"Profiles", QString("profile%1").arg(index));} + +void Profile::beeper (const QString x) { store(x, _beeper, "Beeper" ,"Profiles", QString("profile%1").arg(index));} +void Profile::countryCode (const QString x) { store(x, _countryCode, "countryCode" ,"Profiles", QString("profile%1").arg(index));} +void Profile::display (const QString x) { store(x, _display, "Display" ,"Profiles", QString("profile%1").arg(index));} +void Profile::haptic (const QString x) { store(x, _haptic, "Haptic" ,"Profiles", QString("profile%1").arg(index));} +void Profile::speaker (const QString x) { store(x, _speaker, "Speaker" ,"Profiles", QString("profile%1").arg(index));} +void Profile::stickPotCalib (const QString x) { store(x, _stickPotCalib, "StickPotCalib" ,"Profiles", QString("profile%1").arg(index));} +void Profile::trainerCalib (const QString x) { store(x, _trainerCalib, "TrainerCalib" ,"Profiles", QString("profile%1").arg(index));} +void Profile::currentCalib (const int x) { store(x, _currentCalib, "currentCalib" ,"Profiles", QString("profile%1").arg(index));} +void Profile::gsStickMode (const int x) { store(x, _gsStickMode, "GSStickMode" ,"Profiles", QString("profile%1").arg(index));} +void Profile::ppmMultiplier (const int x) { store(x, _ppmMultiplier, "PPM_Multiplier" ,"Profiles", QString("profile%1").arg(index));} +void Profile::vBatCalib (const int x) { store(x, _vBatCalib, "VbatCalib" ,"Profiles", QString("profile%1").arg(index));} +void Profile::vBatWarn (const int x) { store(x, _vBatWarn, "vBatWarn" ,"Profiles", QString("profile%1").arg(index));} + +// Constructor +Profile::Profile() +{ + index = -1; +} + +// The default copy operator can not be used since the index variable would be destroyed +Profile& Profile::operator=(const Profile& rhs) +{ + name ( rhs.name() ); + fwName ( rhs.fwName() ); + fwType ( rhs.fwType() ); + sdPath ( rhs.sdPath() ); + splashFile ( rhs.splashFile() ); + burnFirmware ( rhs.burnFirmware() ); + renameFwFiles( rhs.renameFwFiles() ); + channelOrder ( rhs.channelOrder() ); + defaultMode ( rhs.defaultMode() ); + beeper ( rhs.beeper() ); + countryCode ( rhs.countryCode() ); + display ( rhs.display() ); + haptic ( rhs.haptic() ); + speaker ( rhs.speaker() ); + stickPotCalib( rhs.stickPotCalib() ); + trainerCalib ( rhs.trainerCalib() ); + currentCalib ( rhs.currentCalib() ); + gsStickMode ( rhs.gsStickMode() ); + ppmMultiplier( rhs.ppmMultiplier() ); + vBatCalib ( rhs.vBatCalib() ); + vBatWarn ( rhs.vBatWarn() ); + + return *this; +} + +void Profile::remove() +{ + // Remove all profile values from settings file + QSettings settings(PRODUCT, COMPANY); + settings.beginGroup("Profiles"); + settings.remove(QString("profile%1").arg(index)); + settings.endGroup(); + + // Reset all profile variables to initial values + init(index); +} + +bool Profile::existsOnDisk() +{ + QSettings settings(PRODUCT, COMPANY); + settings.beginGroup("Profiles"); + settings.beginGroup(QString("profile%1").arg(index)); + QStringList keyList = settings.allKeys(); + settings.endGroup(); + settings.endGroup(); + + return (keyList.length() > 0); +} + +void Profile::init(int newIndex) +{ + index = newIndex; + + _fwName = ""; + _fwType = ""; + _name = ""; + _sdPath = ""; + _splashFile = ""; + _burnFirmware = false; + _renameFwFiles = false; + _channelOrder = 0; + _defaultMode = 1; + + _beeper = ""; + _countryCode = ""; + _display = ""; + _haptic = ""; + _speaker = ""; + _stickPotCalib = ""; + _trainerCalib = ""; + + _currentCalib = 0; + _gsStickMode = 0; + _ppmMultiplier = 0; + _vBatCalib = 0; + _vBatWarn = 0; + + // Do not write empty profiles to disk except the default (0) profile. + if ( index > 0 && !existsOnDisk()) + return; + + flush(); +} + +void Profile::flush() +{ + // Load and store all variables. Use default values if setting values are missing + getset( _fwName, "fwName" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _fwType, "fwType" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _name, "Name" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _sdPath, "sdPath" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _splashFile, "SplashFileName" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _burnFirmware, "burnFirmware" ,false ,"Profiles", QString("profile%1").arg(index)); + getset( _renameFwFiles, "rename_firmware_files" ,false ,"Profiles", QString("profile%1").arg(index)); + getset( _channelOrder, "default_channel_order" ,0 ,"Profiles", QString("profile%1").arg(index)); + getset( _defaultMode, "default_mode" ,1 ,"Profiles", QString("profile%1").arg(index)); + + getset( _beeper, "Beeper" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _countryCode, "countryCode" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _display, "Display" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _haptic, "Haptic" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _speaker, "Speaker" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _stickPotCalib, "StickPotCalib" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _trainerCalib, "TrainerCalib" ,"" ,"Profiles", QString("profile%1").arg(index)); + getset( _currentCalib, "currentCalib" ,0 ,"Profiles", QString("profile%1").arg(index)); + getset( _gsStickMode, "GSStickMode" ,0 ,"Profiles", QString("profile%1").arg(index)); + getset( _ppmMultiplier, "PPM_Multiplier" ,0 ,"Profiles", QString("profile%1").arg(index)); + getset( _vBatCalib, "VbatCalib" ,0 ,"Profiles", QString("profile%1").arg(index)); + getset( _vBatWarn, "vBatWarn" ,0 ,"Profiles", QString("profile%1").arg(index)); +} + + +// ** AppData class******************** + +// Get declarations +QStringList AppData::recentFiles() { return _recentFiles; } +QByteArray AppData::mainWinGeo() { return _mainWinGeo; } +QByteArray AppData::mainWinState() { return _mainWinState; } +QByteArray AppData::modelEditGeo() { return _modelEditGeo; } + +QString AppData::armMcu() { return _armMcu; } +QString AppData::avrArguments() { return _avrArguments; } +QString AppData::avrPort() { return _avrPort; } +QString AppData::avrdudeLocation() { return _avrdudeLocation; } +QString AppData::compileServer() { return _compileServer; } +QString AppData::cpuId() { return _cpuId; } +QString AppData::dfuArguments() { return _dfuArguments; } +QString AppData::dfuLocation() { return _dfuLocation; } +QString AppData::locale() { return _locale; } +QString AppData::mcu() { return _mcu; } +QString AppData::programmer() { return _programmer; } +QString AppData::sambaLocation() { return _sambaLocation; } +QString AppData::sambaPort() { return _sambaPort; } + +QString AppData::backupDir() { return _backupDir; } +QString AppData::gePath() { return _gePath; } +QString AppData::eepromDir() { return _eepromDir; } +QString AppData::flashDir() { return _flashDir; } +QString AppData::imagesDir() { return _imagesDir; } +QString AppData::logDir() { return _logDir; } +QString AppData::libDir() { return _libDir; } +QString AppData::snapshotDir() { return _snapshotDir; } +QString AppData::updatesDir() { return _updatesDir; } + +bool AppData::enableBackup() { return _enableBackup; } +bool AppData::backupOnFlash() { return _backupOnFlash; } +bool AppData::jsSupport() { return _jsSupport; } +bool AppData::rev4aSupport() { return _rev4aSupport; } +bool AppData::maximized() { return _maximized; } +bool AppData::showSplash() { return _showSplash; } +bool AppData::snapToClpbrd() { return _snapToClpbrd; } +bool AppData::autoCheckApp() { return _autoCheckApp; } +bool AppData::autoCheckFw() { return _autoCheckFw; } +bool AppData::simuSW() { return _simuSW; } +bool AppData::enableWizard() { return _enableWizard; } + +int AppData::backLight() { return _backLight; } +int AppData::embedSplashes() { return _embedSplashes; } +int AppData::fwServerFails() { return _fwServerFails; } +int AppData::generalEditTab() { return _generalEditTab; } +int AppData::iconSize() { return _iconSize; } +int AppData::historySize() { return _historySize; } +int AppData::jsCtrl() { return _jsCtrl; } +int AppData::modelEditTab() { return _modelEditTab; } +int AppData::id() { return _id; } +int AppData::theme() { return _theme; } +int AppData::warningId() { return _warningId; } + +// Set declarations +void AppData::recentFiles (const QStringList x) { store(x, _recentFiles, "recentFileList" );} +void AppData::mainWinGeo (const QByteArray x) { store(x, _mainWinGeo, "mainWindowGeometry" );} +void AppData::mainWinState (const QByteArray x) { store(x, _mainWinState, "mainWindowState" );} +void AppData::modelEditGeo (const QByteArray x) { store(x, _modelEditGeo, "modelEditGeometry" );} + +void AppData::armMcu (const QString x) { store(x, _armMcu, "arm_mcu" );} +void AppData::avrArguments (const QString x) { store(x, _avrArguments, "avr_arguments" );} +void AppData::avrPort (const QString x) { store(x, _avrPort, "avr_port" );} +void AppData::avrdudeLocation (const QString x) { store(x, _avrdudeLocation, "avrdudeLocation" );} +void AppData::compileServer (const QString x) { store(x, _compileServer, "compilation-server" );} +void AppData::cpuId (const QString x) { store(x, _cpuId, "cpu_id" );} +void AppData::dfuArguments (const QString x) { store(x, _dfuArguments, "dfu_arguments" );} +void AppData::dfuLocation (const QString x) { store(x, _dfuLocation, "dfu_location" );} +void AppData::locale (const QString x) { store(x, _locale, "locale" );} +void AppData::mcu (const QString x) { store(x, _mcu, "mcu" );} +void AppData::programmer (const QString x) { store(x, _programmer, "programmer" );} +void AppData::sambaLocation (const QString x) { store(x, _sambaLocation, "samba_location" );} +void AppData::sambaPort (const QString x) { store(x, _sambaPort, "samba_port" );} + +void AppData::backupDir (const QString x) { store(x, _backupDir, "backupPath" );} +void AppData::gePath (const QString x) { store(x, _gePath, "gePath" );} +void AppData::eepromDir (const QString x) { store(x, _eepromDir, "lastDir" );} +void AppData::flashDir (const QString x) { store(x, _flashDir, "lastFlashDir" );} +void AppData::imagesDir (const QString x) { store(x, _imagesDir, "lastImagesDir" );} +void AppData::logDir (const QString x) { store(x, _logDir, "lastLogDir" );} +void AppData::libDir (const QString x) { store(x, _libDir, "libraryPath" );} +void AppData::snapshotDir (const QString x) { store(x, _snapshotDir, "snapshotpath" );} +void AppData::updatesDir (const QString x) { store(x, _updatesDir, "lastUpdatesDir" );} + +void AppData::enableBackup (const bool x) { store(x, _enableBackup, "backupEnable" );} +void AppData::backupOnFlash (const bool x) { store(x, _backupOnFlash, "backupOnFlash" );} +void AppData::maximized (const bool x) { store(x, _maximized, "maximized" );} +void AppData::jsSupport (const bool x) { store(x, _jsSupport, "js_support" );} +void AppData::rev4aSupport (const bool x) { store(x, _rev4aSupport, "rev4asupport" );} +void AppData::showSplash (const bool x) { store(x, _showSplash, "show_splash" );} +void AppData::snapToClpbrd (const bool x) { store(x, _snapToClpbrd, "snapshot_to_clipboard" );} +void AppData::autoCheckApp (const bool x) { store(x, _autoCheckApp, "startup_check_companion" );} +void AppData::autoCheckFw (const bool x) { store(x, _autoCheckFw, "startup_check_fw" );} +void AppData::simuSW (const bool x) { store(x, _simuSW, "simuSW" );} +void AppData::enableWizard (const bool x) { store(x, _enableWizard, "wizardEnable" );} + +void AppData::backLight (const int x) { store(x, _backLight, "backLight" );} +void AppData::embedSplashes (const int x) { store(x, _embedSplashes, "embedded_splashes" );} +void AppData::fwServerFails (const int x) { store(x, _fwServerFails, "fwserver" );} +void AppData::generalEditTab (const int x) { store(x, _generalEditTab, "generalEditTab" );} +void AppData::iconSize (const int x) { store(x, _iconSize, "icon_size" );} +void AppData::historySize (const int x) { store(x, _historySize, "history_size" );} +void AppData::jsCtrl (const int x) { store(x, _jsCtrl, "js_ctrl" );} +void AppData::modelEditTab (const int x) { store(x, _modelEditTab, "modelEditTab" );} +void AppData::id (const int x) { store(x, _id, "profileId" );} +void AppData::theme (const int x) { store(x, _theme, "theme" );} +void AppData::warningId (const int x) { store(x, _warningId, "warningId" );} + +// Constructor +AppData::AppData() +{ + //Initialize the profiles + for (int i=0; i +#include +#include +#include + +#define COMPANY "OpenTX Companion" +#define PRODUCT "OpenTX" + +#define MAX_PROFILES 15 +#define MAX_JOYSTICKS 8 + +class CompStoreObj +{ + public: + void clear (const QString tag1="", const QString tag2="", const QString tag3=""); + void store(const QByteArray newArray, QByteArray &array, const QString tag, const QString group1="", const QString group2="" ); + void store(const QStringList newSList, QStringList &stringList, const QString tag, const QString group1="", const QString group2="" ); + void store(const QString newString, QString &string, const QString tag, const QString group1="", const QString group2="" ); + void store(const bool newTruth, bool &truth, const QString tag, const QString group1="", const QString group2="" ); + void store(const int newNumber, int &number, const QString tag, const QString group1="", const QString group2="" ); + + // Retrieval functions + void retrieve( QByteArray &array, const QString tag, const QString def, const QString group1="", const QString group2="" ); + void retrieve( QStringList &stringList, const QString tag, const QString def, const QString group1="", const QString group2="" ); + void retrieve( QString &string, const QString tag, const QString def, const QString group1="", const QString group2="" ); + void retrieve( bool &truth, const QString tag, const bool def, const QString group1="", const QString group2="" ); + void retrieve( int &number, const QString tag, const int def, const QString group1="", const QString group2="" ); + + // Retrieve and Store functions + void getset( QByteArray &array, const QString tag, const QString def, const QString group1="", const QString group2="" ); + void getset( QStringList &stringList, const QString tag, const QString def, const QString group1="", const QString group2="" ); + void getset( QString &string, const QString tag, const QString def, const QString group1="", const QString group2="" ); + void getset( bool &truth, const QString tag, const bool def, const QString group1="", const QString group2="" ); + void getset( int &number, const QString tag, const int def, const QString group1="", const QString group2="" ); +}; + +class FwRevision: protected CompStoreObj +{ + public: + int get( const QString); + void set( const QString, const int ); + void remove( const QString ); +}; + +class JStickData: protected CompStoreObj +{ + private: + int index; + + int _stickAxe; + int _stickMin; + int _stickMed; + int _stickMax; + int _stickInv; + + public: + // All the get definitions + int stick_axe(); + int stick_min(); + int stick_med(); + int stick_max(); + int stick_inv(); + + // All the set definitions + void stick_axe(const int); + void stick_min(const int); + void stick_med(const int); + void stick_max(const int); + void stick_inv(const int); + + JStickData(); + void remove(); + bool existsOnDisk(); + void init(int index); + void flush(); +}; + +class Profile: protected CompStoreObj +{ + private: + // Class Internal Variable + int index; + + // Application Variables + QString _fwName; + QString _fwType; + QString _name; + QString _sdPath; + QString _splashFile; + bool _burnFirmware; + bool _renameFwFiles; + int _channelOrder; + int _defaultMode; + + // Firmware Variables + QString _beeper; + QString _countryCode; + QString _display; + QString _haptic; + QString _speaker; + QString _stickPotCalib; + QString _trainerCalib; + int _currentCalib; + int _gsStickMode; + int _ppmMultiplier; + int _vBatCalib; + int _vBatWarn; + + public: + // All the get definitions + QString fwName() const; + QString fwType() const; + QString name() const; + QString sdPath() const; + QString splashFile() const; + bool burnFirmware() const; + bool renameFwFiles() const; + int channelOrder() const; + int defaultMode() const; + + QString beeper() const; + QString countryCode() const; + QString display() const; + QString haptic() const; + QString speaker() const; + QString stickPotCalib() const; + QString trainerCalib() const; + int currentCalib() const; + int gsStickMode() const; + int ppmMultiplier() const; + int vBatCalib() const; + int vBatWarn() const; + + // All the set definitions + void name (const QString); + void fwName (const QString); + void fwType (const QString); + void sdPath (const QString); + void splashFile (const QString); + void burnFirmware (const bool); + void renameFwFiles (const bool); + void channelOrder (const int); + void defaultMode (const int); + + void beeper (const QString); + void countryCode (const QString); + void display (const QString); + void haptic (const QString); + void speaker (const QString); + void stickPotCalib (const QString); + void trainerCalib (const QString); + void currentCalib (const int); + void gsStickMode (const int); + void ppmMultiplier (const int); + void vBatCalib (const int); + void vBatWarn (const int); + + Profile(); + Profile& operator=(const Profile&); + void remove(); + bool existsOnDisk(); + void init(int newIndex); + void flush(); +}; + +class AppData: protected CompStoreObj +{ + // All the global variables + public: + Profile profile[MAX_PROFILES]; + JStickData joystick[MAX_JOYSTICKS]; + FwRevision fwRev; + + private: + QStringList _recentFiles; + QByteArray _mainWinGeo; + QByteArray _mainWinState; + QByteArray _modelEditGeo; + + QString _armMcu; + QString _avrArguments; + QString _avrPort; + QString _avrdudeLocation; + QString _compileServer; + QString _cpuId; + QString _dfuArguments; + QString _dfuLocation; + QString _locale; + QString _mcu; + QString _programmer; + QString _sambaLocation; + QString _sambaPort; + + QString _backupDir; + QString _gePath; + QString _eepromDir; + QString _flashDir; + QString _imagesDir; + QString _logDir; + QString _libDir; + QString _snapshotDir; + QString _updatesDir; + + bool _enableBackup; + bool _backupOnFlash; + bool _maximized; + bool _jsSupport; + bool _rev4aSupport; + bool _showSplash; + bool _snapToClpbrd; + bool _autoCheckApp; + bool _autoCheckFw; + bool _simuSW; + bool _enableWizard; + + int _backLight; + int _embedSplashes; + int _fwServerFails; + int _generalEditTab; + int _iconSize; + int _jsCtrl; + int _historySize; + int _modelEditTab; + int _id; + int _theme; + int _warningId; + + public: + // All the get definitions + QStringList recentFiles(); + QByteArray mainWinGeo(); + QByteArray mainWinState(); + QByteArray modelEditGeo(); + + QString armMcu(); + QString avrArguments(); + QString avrPort(); + QString avrdudeLocation(); + QString compileServer(); + QString cpuId(); + QString dfuArguments(); + QString dfuLocation(); + QString lastFw(); + QString locale(); + QString mcu(); + QString programmer(); + QString sambaLocation(); + QString sambaPort(); + + QString backupDir(); + QString gePath(); + QString eepromDir(); + QString flashDir(); + QString imagesDir(); + QString logDir(); + QString libDir(); + QString snapshotDir(); + QString updatesDir(); + + bool enableBackup(); + bool backupOnFlash(); + bool jsSupport(); + bool rev4aSupport(); + bool maximized(); + bool showSplash(); + bool snapToClpbrd(); + bool autoCheckApp(); + bool autoCheckFw(); + bool simuSW(); + bool enableWizard(); + + int backLight(); + int embedSplashes(); + int fwServerFails(); + int generalEditTab(); + int iconSize(); + int historySize(); + int jsCtrl(); + int modelEditTab(); // This variable is unused an can be removed + int id(); + int theme(); + int warningId(); + + // All the set definitions + void recentFiles (const QStringList x); + void mainWinGeo (const QByteArray); + void mainWinState (const QByteArray); + void modelEditGeo (const QByteArray); + + void armMcu (const QString); + void avrArguments (const QString); + void avrPort (const QString); + void avrdudeLocation (const QString); + void compileServer (const QString); + void cpuId (const QString); + void dfuArguments (const QString); + void dfuLocation (const QString); + void lastFw (const QString); + void locale (const QString); + void mcu (const QString); + void programmer (const QString); + void sambaLocation (const QString); + void sambaPort (const QString); + + void backupDir (const QString); + void gePath (const QString); + void eepromDir (const QString); + void flashDir (const QString); + void imagesDir (const QString); + void logDir (const QString); + void libDir (const QString); + void snapshotDir (const QString); + void updatesDir (const QString); + + void enableBackup (const bool); + void backupOnFlash (const bool); + void maximized (const bool); + void jsSupport (const bool); + void rev4aSupport (const bool); + void showSplash (const bool); + void snapToClpbrd (const bool); + void autoCheckApp (const bool); + void autoCheckFw (const bool); + void simuSW (const bool); + void enableWizard (const bool); + + void backLight (const int); + void embedSplashes (const int); + void fwServerFails (const int); + void generalEditTab (const int); + void iconSize (const int); + void historySize (const int); + void jsCtrl (const int); + void modelEditTab (const int); + void id (const int); + void theme (const int); + void warningId (const int); + + // Constructor + AppData(); +}; + +extern AppData g; + +#endif // COMPANION_APPDATA_H diff --git a/companion/src/apppreferencesdialog.cpp b/companion/src/apppreferencesdialog.cpp new file mode 100644 index 000000000..17787f9c0 --- /dev/null +++ b/companion/src/apppreferencesdialog.cpp @@ -0,0 +1,307 @@ +#include "apppreferencesdialog.h" +#include "ui_apppreferencesdialog.h" +#include "mainwindow.h" +#include "appdata.h" +#include "helpers.h" +#include "flashinterface.h" +#ifdef JOYSTICKS +#include "joystick.h" +#include "joystickdialog.h" +#endif +#include +#include + +appPreferencesDialog::appPreferencesDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::appPreferencesDialog) +{ + ui->setupUi(this); + setWindowIcon(CompanionIcon("apppreferences.png")); + initSettings(); + connect(this, SIGNAL(accepted()), this, SLOT(writeValues())); +#ifndef JOYSTICKS + ui->joystickCB->hide(); + ui->joystickCB->setDisabled(true); + ui->joystickcalButton->hide(); + ui->joystickChkB->hide(); + ui->label_11->hide(); +#endif + resize(0,0); +} + +appPreferencesDialog::~appPreferencesDialog() +{ + delete ui; +} + +void appPreferencesDialog::writeValues() +{ + g.autoCheckApp(ui->startupCheck_companion9x->isChecked()); + g.autoCheckFw(ui->startupCheck_fw->isChecked()); + g.enableWizard(ui->wizardEnable_ChkB->isChecked()); + g.showSplash(ui->showSplash->isChecked()); + g.simuSW(ui->simuSW->isChecked()); + g.historySize(ui->historySize->value()); + g.backLight(ui->backLightColor->currentIndex()); + g.libDir(ui->libraryPath->text()); + g.gePath(ui->ge_lineedit->text()); + g.embedSplashes(ui->splashincludeCB->currentIndex()); + g.enableBackup(ui->backupEnable->isChecked()); + + if (ui->joystickChkB ->isChecked() && ui->joystickCB->isEnabled()) { + g.jsSupport(ui->joystickChkB ->isChecked()); + g.jsCtrl(ui->joystickCB ->currentIndex()); + } + else { + g.jsSupport(false); + g.jsCtrl(0); + } + g.profile[g.id()].channelOrder(ui->channelorderCB->currentIndex()); + g.profile[g.id()].defaultMode(ui->stickmodeCB->currentIndex()); + g.profile[g.id()].renameFwFiles(ui->renameFirmware->isChecked()); + g.profile[g.id()].burnFirmware(ui->burnFirmware->isChecked()); + g.profile[g.id()].sdPath(ui->sdPath->text()); + g.profile[g.id()].splashFile(ui->SplashFileName->text()); + + // The profile name may NEVER be empty + if (ui->profileNameLE->text().isEmpty()) + g.profile[g.id()].name(tr("My Radio")); + else + g.profile[g.id()].name(ui->profileNameLE->text()); + + // If a new radio type has been choosen, several things need to change + if ( initialRadioType != ui->radioCB->currentIndex()) + { + g.profile[g.id()].fwName(""); + g.profile[g.id()].fwType(getDefaultFwType(ui->radioCB->currentIndex())); + current_firmware_variant = GetFirmwareVariant(g.profile[g.id()].fwType()); + } +} + +void appPreferencesDialog::on_snapshotPathButton_clicked() +{ + QString fileName = QFileDialog::getExistingDirectory(this,tr("Select your snapshot folder"), g.snapshotDir()); + if (!fileName.isEmpty()) { + g.snapshotDir(fileName); + g.snapToClpbrd(false); + ui->snapshotPath->setText(fileName); + } +} + +void appPreferencesDialog::initSettings() +{ + ui->snapshotClipboardCKB->setChecked(g.snapToClpbrd()); + ui->burnFirmware->setChecked(g.profile[g.id()].burnFirmware()); + ui->snapshotPath->setText(g.snapshotDir()); + ui->snapshotPath->setReadOnly(true); + if (ui->snapshotClipboardCKB->isChecked()) + { + ui->snapshotPath->setDisabled(true); + ui->snapshotPathButton->setDisabled(true); + } + ui->startupCheck_companion9x->setChecked(g.autoCheckApp()); + ui->startupCheck_fw->setChecked(g.autoCheckFw()); + ui->wizardEnable_ChkB->setChecked(g.enableWizard()); + ui->showSplash->setChecked(g.showSplash()); + ui->historySize->setValue(g.historySize()); + ui->backLightColor->setCurrentIndex(g.backLight()); + ui->simuSW->setChecked(g.simuSW()); + ui->libraryPath->setText(g.libDir()); + ui->ge_lineedit->setText(g.gePath()); + + if (!g.backupDir().isEmpty()) { + if (QDir(g.backupDir()).exists()) { + ui->backupPath->setText(g.backupDir()); + ui->backupEnable->setEnabled(true); + ui->backupEnable->setChecked(g.enableBackup()); + } else { + ui->backupEnable->setDisabled(true); + } + } else { + ui->backupEnable->setDisabled(true); + } + ui->splashincludeCB->setCurrentIndex(g.embedSplashes()); + +#ifdef JOYSTICKS + ui->joystickChkB->setChecked(g.jsSupport()); + if (ui->joystickChkB->isChecked()) { + QStringList joystickNames; + joystickNames << tr("No joysticks found"); + joystick = new Joystick(0,false,0,0); + ui->joystickcalButton->setDisabled(true); + ui->joystickCB->setDisabled(true); + + if ( joystick ) { + if ( joystick->joystickNames.count() > 0 ) { + joystickNames = joystick->joystickNames; + ui->joystickCB->setEnabled(true); + ui->joystickcalButton->setEnabled(true); + } + joystick->close(); + } + ui->joystickCB->clear(); + ui->joystickCB->insertItems(0, joystickNames); + ui->joystickCB->setCurrentIndex(g.jsCtrl()); + } + else { + ui->joystickCB->clear(); + ui->joystickCB->setDisabled(true); + ui->joystickcalButton->setDisabled(true); + } +#endif +// Profile Tab Inits + ui->channelorderCB->setCurrentIndex(g.profile[g.id()].channelOrder()); + ui->stickmodeCB->setCurrentIndex(g.profile[g.id()].defaultMode()); + ui->renameFirmware->setChecked(g.profile[g.id()].renameFwFiles()); + ui->sdPath->setText(g.profile[g.id()].sdPath()); + ui->profileNameLE->setText(g.profile[g.id()].name()); + ui->SplashFileName->setText(g.profile[g.id()].splashFile()); + + initialRadioType = getRadioType(g.profile[g.id()].fwType()); + ui->radioCB->setCurrentIndex(initialRadioType); + + displayImage( g.profile[g.id()].splashFile() ); +} + +void appPreferencesDialog::on_libraryPathButton_clicked() +{ + QString fileName = QFileDialog::getExistingDirectory(this,tr("Select your library folder"), g.libDir()); + if (!fileName.isEmpty()) { + g.libDir(fileName); + ui->libraryPath->setText(fileName); + } +} + +void appPreferencesDialog::on_snapshotClipboardCKB_clicked() +{ + if (ui->snapshotClipboardCKB->isChecked()) { + ui->snapshotPath->setDisabled(true); + ui->snapshotPathButton->setDisabled(true); + g.snapToClpbrd(true); + } else { + ui->snapshotPath->setEnabled(true); + ui->snapshotPath->setReadOnly(true); + ui->snapshotPathButton->setEnabled(true); + g.snapToClpbrd(false); + } +} + +void appPreferencesDialog::on_backupPathButton_clicked() +{ + QString fileName = QFileDialog::getExistingDirectory(this,tr("Select your Models and Settings backup folder"), g.backupDir()); + if (!fileName.isEmpty()) { + g.backupDir(fileName); + ui->backupPath->setText(fileName); + } + ui->backupEnable->setEnabled(true); +} + +void appPreferencesDialog::on_ge_pathButton_clicked() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Select Google Earth executable"),ui->ge_lineedit->text()); + if (!fileName.isEmpty()) { + ui->ge_lineedit->setText(fileName); + } +} + +#ifdef JOYSTICKS +void appPreferencesDialog::on_joystickChkB_clicked() { + if (ui->joystickChkB->isChecked()) { + QStringList joystickNames; + joystickNames << tr("No joysticks found"); + joystick = new Joystick(0,false,0,0); + ui->joystickcalButton->setDisabled(true); + ui->joystickCB->setDisabled(true); + + if ( joystick ) { + if ( joystick->joystickNames.count() > 0 ) { + joystickNames = joystick->joystickNames; + ui->joystickCB->setEnabled(true); + ui->joystickcalButton->setEnabled(true); + } + joystick->close(); + } + ui->joystickCB->clear(); + ui->joystickCB->insertItems(0, joystickNames); + } + else { + ui->joystickCB->clear(); + ui->joystickCB->setDisabled(true); + ui->joystickcalButton->setDisabled(true); + } +} + +void appPreferencesDialog::on_joystickcalButton_clicked() { + joystickDialog * jd=new joystickDialog(this, ui->joystickCB->currentIndex()); + jd->exec(); +} +#endif + +// ******** Profile tab functions + +void appPreferencesDialog::on_sdPathButton_clicked() +{ + QString fileName = QFileDialog::getExistingDirectory(this,tr("Select the folder replicating your SD structure"), g.profile[g.id()].sdPath()); + if (!fileName.isEmpty()) { + ui->sdPath->setText(fileName); + } +} + +void appPreferencesDialog::on_removeProfileButton_clicked() +{ + if ( g.id() == 0 ) + QMessageBox::information(this, tr("Not possible to remove profile"), tr("The default profile can not be removed.")); + else + { + g.profile[g.id()].remove(); + g.id( 0 ); + initSettings(); + } +} + + +bool appPreferencesDialog::displayImage( QString fileName ) +{ + // Start by clearing the pixmap + ui->imageLabel->setPixmap(QPixmap()); + + QImage image(fileName); + if (image.isNull()) + return false; + + // Use the firmware name to determine splash width + int width = SPLASH_WIDTH; + if (g.profile[g.id()].fwType().contains("taranis")) + width = SPLASHX9D_WIDTH; + + ui->imageLabel->setPixmap( makePixMap( image, g.profile[g.id()].fwType())); + ui->imageLabel->setFixedSize(width, SPLASH_HEIGHT); + return true; +} + +void appPreferencesDialog::on_SplashSelect_clicked() +{ + QString supportedImageFormats; + for (int formatIndex = 0; formatIndex < QImageReader::supportedImageFormats().count(); formatIndex++) { + supportedImageFormats += QLatin1String(" *.") + QImageReader::supportedImageFormats()[formatIndex]; + } + + QString fileName = QFileDialog::getOpenFileName(this, + tr("Open Image to load"), g.imagesDir(), tr("Images (%1)").arg(supportedImageFormats)); + + if (!fileName.isEmpty()){ + g.imagesDir(QFileInfo(fileName).dir().absolutePath()); + + displayImage(fileName); + ui->SplashFileName->setText(fileName); + } +} + +void appPreferencesDialog::on_clearImageButton_clicked() { + ui->imageLabel->clear(); + ui->SplashFileName->clear(); +} + + + + diff --git a/companion/src/apppreferencesdialog.h b/companion/src/apppreferencesdialog.h new file mode 100644 index 000000000..46bdf3156 --- /dev/null +++ b/companion/src/apppreferencesdialog.h @@ -0,0 +1,50 @@ +#ifndef APPPREFERENCESDIALOG_H +#define APPPREFERENCESDIALOG_H + +#include +#include +#include "eeprominterface.h" + +namespace Ui { + class appPreferencesDialog; +} + +class Joystick; + +class appPreferencesDialog : public QDialog +{ + Q_OBJECT + +public: + explicit appPreferencesDialog(QWidget *parent = 0); + ~appPreferencesDialog(); + Joystick *joystick; + +private: + int initialRadioType; + Ui::appPreferencesDialog *ui; + void initSettings(); + bool displayImage( QString fileName ); + void loadProfileString(QString profile, QString label); + void loadFromProfile(); + +private slots: + void writeValues(); + void on_libraryPathButton_clicked(); + void on_snapshotPathButton_clicked(); + void on_snapshotClipboardCKB_clicked(); + void on_backupPathButton_clicked(); + void on_ge_pathButton_clicked(); + + void on_sdPathButton_clicked(); + void on_removeProfileButton_clicked(); + void on_SplashSelect_clicked(); + void on_clearImageButton_clicked(); + +#ifdef JOYSTICKS + void on_joystickChkB_clicked(); + void on_joystickcalButton_clicked(); +#endif +}; + +#endif // APPPREFERENCESDIALOG_H diff --git a/companion/src/apppreferencesdialog.ui b/companion/src/apppreferencesdialog.ui new file mode 100644 index 000000000..f5d4b9deb --- /dev/null +++ b/companion/src/apppreferencesdialog.ui @@ -0,0 +1,1064 @@ + + + appPreferencesDialog + + + + 0 + 0 + 685 + 462 + + + + + 0 + 0 + + + + + 685 + 0 + + + + Edit Settings + + + + 2 + + + 6 + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + 0 + + + + Application Settings + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Automatic Backup Folder + + + + + + + + 40 + 0 + + + + + 50 + 16777215 + + + + 15 + + + 10 + + + + + + + + 0 + 0 + + + + User Splash Screens + + + + + + + + 0 + 0 + + + + + Only show user splash images + + + + + Show user and companion splash images + + + + + + + + Google Earth Executable + + + + + + + Automatic check for OpenTX firmware updates + + + true + + + + + + + + 350 + 0 + + + + true + + + + + + + Open Folder + + + + + + + Qt::Horizontal + + + + + + + + 350 + 0 + + + + true + + + + + + + Find Executable + + + + + + + + 0 + 0 + + + + Files to keep + + + + + + + + 0 + 0 + + + + Splash Screen Library + + + + + + + Enable automatic backup before writing firmware + + + + + + + Open Folder + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + + + + Automatic check for Companion updates + + + true + + + + + + + Qt::Horizontal + + + + + + + Offer to use wizard for new models + + + true + + + + + + + Show splash screen when Companion starts + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + true + + + + + + + + Simulator Settings + + + + + + + 0 + 0 + + + + Simulator BackLight + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Enable + + + + + + + Open Folder + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 100 + 16777215 + + + + + Blue + + + + + Green + + + + + Red + + + + + Orange + + + + + Yellow + + + + + + + + + 0 + 0 + + + + Joystick + + + + + + + Only capture to clipboard + + + + + + + + 0 + 0 + + + + + + + + Calibrate + + + + + + + Remember simulator switch values + + + + + + + Simulator capture folder + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + true + + + + 350 + 0 + + + + true + + + + + + + + Radio Settings Profile + + + + + + + 16777215 + 16777215 + + + + Mode selection: + +Mode 1: + Left stick: Elevator, Rudder + Right stick: Throttle, Aileron + +Mode 2: + Left stick: Throttle, Rudder + Right stick: Elevator, Aileron + +Mode 3: + Left stick: Elevator, Aileron + Right stick: Throttle, Rudder + +Mode 4: + Left stick: Throttle, Aileron + Right stick: Elevator, Rudder + + + + + 1 + + + + Mode 1 (RUD ELE THR AIL) + + + + + Mode 2 (RUD THR ELE AIL) + + + + + Mode 3 (AIL ELE THR RUD) + + + + + Mode 4 (AIL THR ELE RUD) + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Channel order + +This is used by the templated to determine which channel goes to what number output. + + + 0 + + + + R E T A + + + + + R E A T + + + + + R T E A + + + + + R T A E + + + + + R A E T + + + + + R A T E + + + + + E R T A + + + + + E R A T + + + + + E T R A + + + + + E T A R + + + + + E A R T + + + + + E A T R + + + + + T R E A + + + + + T R A E + + + + + T E R A + + + + + T E A R + + + + + T A R E + + + + + T A E R + + + + + A R E T + + + + + A R T E + + + + + A E R T + + + + + A E T R + + + + + A T R E + + + + + A T E R + + + + + + + + + 0 + 0 + + + + Default Stick Mode + + + + + + + Profile Name + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Splash Screen + + + + + + + + 0 + 0 + + + + Channel Order + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Append version number to FW file name + + + + + + + + 0 + 0 + + + + SD Structure path + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + true + + + + 350 + 0 + + + + + 350 + 16777215 + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Offer to write FW to Tx after download + + + + + + + Remove Profile + + + + + + + Open Folder + + + + + + + Qt::Horizontal + + + + + + + true + + + + 350 + 0 + + + + + 350 + 16777215 + + + + true + + + + + + + Select Image + + + + + + + Radio Type + + + + + + + Clear Image + + + + + + + Qt::Horizontal + + + + + + + + 350 + 0 + + + + + 350 + 16777215 + + + + + + + + + 0 + 0 + + + + + 128 + 64 + + + + + 212 + 64 + + + + QFrame::Panel + + + QFrame::Plain + + + 1 + + + + + + true + + + + + + + + 9X + + + + + 9X with m128 + + + + + 9XR + + + + + 9XR with m128 + + + + + Gruvin9x Board + + + + + Sky9x Board + + + + + Taranis + + + + + + + + + + + + tabWidget + ge_lineedit + ge_pathButton + historySize + showSplash + startupCheck_fw + startupCheck_companion9x + wizardEnable_ChkB + backupPath + backupPathButton + backupEnable + splashincludeCB + libraryPath + libraryPathButton + buttonBox + snapshotPath + snapshotPathButton + snapshotClipboardCKB + simuSW + backLightColor + joystickCB + joystickChkB + joystickcalButton + sdPath + SplashFileName + stickmodeCB + channelorderCB + renameFirmware + burnFirmware + + + + + + + buttonBox + accepted() + appPreferencesDialog + accept() + + + 382 + 455 + + + 157 + 274 + + + + + buttonBox + rejected() + appPreferencesDialog + reject() + + + 402 + 455 + + + 286 + 274 + + + + + diff --git a/companion/src/avroutputdialog.cpp b/companion/src/avroutputdialog.cpp index c31ce0b09..df96592e8 100644 --- a/companion/src/avroutputdialog.cpp +++ b/companion/src/avroutputdialog.cpp @@ -38,7 +38,8 @@ avrOutputDialog::avrOutputDialog(QWidget *parent, QString prog, QStringList arg, if (arg.count()<2) { closeOpt = AVR_DIALOG_FORCE_CLOSE; QTimer::singleShot(0, this, SLOT(forceClose())); - } else { + } + else { sourceFile=arg.at(0); destFile=arg.at(1); if (!displayDetails) { @@ -58,7 +59,7 @@ avrOutputDialog::avrOutputDialog(QWidget *parent, QString prog, QStringList arg, QFile exec; winTitle=wTitle; if (!(exec.exists(prog))) { - QMessageBox::critical(this, "companion9x", getProgrammer() + " " + tr("executable not found")); + QMessageBox::critical(this, "Companion", getProgrammer() + " " + tr("executable not found")); closeOpt = AVR_DIALOG_FORCE_CLOSE; QTimer::singleShot(0, this, SLOT(forceClose())); } else { @@ -68,7 +69,6 @@ avrOutputDialog::avrOutputDialog(QWidget *parent, QString prog, QStringList arg, efuse = 0; phase=0; currLine.clear(); - prevLine.clear(); if (!displayDetails) { ui->plainTextEdit->hide(); QTimer::singleShot(0, this, SLOT(shrink())); @@ -132,11 +132,12 @@ void avrOutputDialog::doCopy() char * pointer=buf; QFile source(sourceFile); int blocks=(source.size()/BLKSIZE); - ui->progressBar->setMaximum(blocks-1); + ui->progressBar->setMaximum(blocks-1); if (!source.open(QIODevice::ReadOnly)) { QMessageBox::warning(this, tr("Error"),tr("Cannot open source file")); hasErrors=true; - } else { + } + else { source.read(buf,READBUF); source.close(); QFile dest(destFile); @@ -183,7 +184,6 @@ void avrOutputDialog::runAgain(QString prog, QStringList arg, int closeBehaviour foreach(QString str, arg) cmdLine.append(" " + str); closeOpt = closeBehaviour; currLine.clear(); - prevLine.clear(); process->start(prog,arg); } @@ -194,12 +194,18 @@ void avrOutputDialog::waitForFinish() void avrOutputDialog::addText(const QString &text) { - int val = ui->plainTextEdit->verticalScrollBar()->maximum(); - ui->plainTextEdit->insertPlainText(text); - if(val!=ui->plainTextEdit->verticalScrollBar()->maximum()) - ui->plainTextEdit->verticalScrollBar()->setValue(ui->plainTextEdit->verticalScrollBar()->maximum()); -} + QTextCursor cursor(ui->plainTextEdit->textCursor()); + // is the scrollbar at the end? + bool atEnd = (ui->plainTextEdit->verticalScrollBar()->value() == ui->plainTextEdit->verticalScrollBar()->maximum()); + + cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor, 1); + cursor.insertText(text); + + if (atEnd) { + ui->plainTextEdit->verticalScrollBar()->triggerAction(QAbstractSlider::SliderToMaximum); + } +} void avrOutputDialog::doAddTextStdOut() { @@ -209,31 +215,30 @@ void avrOutputDialog::doAddTextStdOut() int nlPos, pos, size; addText(text); + currStdLine.append(text); if (currStdLine.contains("size = ")) { - pos=currStdLine.lastIndexOf("size = "); - temp=currStdLine.mid(pos+7); - pos=temp.lastIndexOf("\n"); - size=temp.left(pos).toInt(); + pos = currStdLine.lastIndexOf("size = "); + temp = currStdLine.mid(pos+7); + pos = temp.lastIndexOf("\n"); + size = temp.left(pos).toInt(); ui->progressBar->setMaximum(size/2048); } if (currStdLine.contains("\n")) { - nlPos=currStdLine.lastIndexOf("\n"); - prevStdLine=currStdLine.left(nlPos).trimmed(); - currStdLine=currStdLine.mid(nlPos+1); + nlPos = currStdLine.lastIndexOf("\n"); + currStdLine = currStdLine.mid(nlPos+1); } if (!currStdLine.isEmpty()) { - if (currStdLine.at(0)==QChar('.')) { - pos=currStdLine.lastIndexOf("."); + if (currStdLine.at(0) == QChar('.')) { + pos = currStdLine.lastIndexOf("."); ui->progressBar->setValue(pos); } - } - if (!currStdLine.isEmpty()) { - if (currStdLine.startsWith("Starting upload: [")) { - pos=(currStdLine.lastIndexOf("#")-19)/(MAX_FSIZE/204800.0); + else if (currStdLine.startsWith("Starting upload: [")) { + pos = (currStdLine.lastIndexOf("#")-19)/(MAX_FSIZE/204800.0); ui->progressBar->setValue(pos); } } + if (text.contains("Complete ")) { #if !__GNUC__ if (kill_timer) { @@ -250,19 +255,15 @@ void avrOutputDialog::doAddTextStdOut() } } - //addText("\n=====\n" + text + "\n=====\n"); - - if(text.contains(":010000")) //contains fuse info - { - QStringList stl = text.split(":01000000"); - - foreach (QString t, stl) - { - bool ok = false; - if(!lfuse) lfuse = t.left(2).toInt(&ok,16); - if(!hfuse && !ok) hfuse = t.left(2).toInt(&ok,16); - if(!efuse && !ok) efuse = t.left(2).toInt(&ok,16); - } + if (text.contains(":010000")) { + //contains fuse info + QStringList stl = text.split(":01000000"); + foreach (QString t, stl) { + bool ok = false; + if (!lfuse) lfuse = t.left(2).toInt(&ok,16); + if (!hfuse && !ok) hfuse = t.left(2).toInt(&ok,16); + if (!efuse && !ok) efuse = t.left(2).toInt(&ok,16); + } } if (text.contains("-E-")) { @@ -276,9 +277,11 @@ QString avrOutputDialog::getProgrammer() EEPROMInterface *eepromInterface = GetEepromInterface(); if (IS_TARANIS(eepromInterface->getBoard())) { return "DFU Util"; - } else if IS_SKY9X(eepromInterface->getBoard()) { + } + else if IS_SKY9X(eepromInterface->getBoard()) { return "SAM-BA"; - } else { + } + else { return "AVRDUDE"; } } @@ -298,27 +301,33 @@ void avrOutputDialog::errorWizard() DeviceStr="Atmega 64"; FwStr="\n"+tr("ie: OpenTX for 9X board or OpenTX for 9XR board"); fwexist=true; - } else if (DeviceId=="0x1e9702") { + } + else if (DeviceId=="0x1e9702") { DeviceStr="Atmega 128"; FwStr="\n"+tr("ie: OpenTX for M128 / 9X board or OpenTX for 9XR board with M128 chip"); fwexist=true; - } else if (DeviceId=="0x1e9703") { + } + else if (DeviceId=="0x1e9703") { DeviceStr="Atmega 1280"; - } else if (DeviceId=="0x1e9704") { + } + else if (DeviceId=="0x1e9704") { DeviceStr="Atmega 1281"; - } else if (DeviceId=="0x1e9801") { + } + else if (DeviceId=="0x1e9801") { DeviceStr="Atmega 2560"; FwStr="\n"+tr("ie: OpenTX for Gruvin9X board"); fwexist=true; - } else if (DeviceId=="0x1e9802") { + } + else if (DeviceId=="0x1e9802") { DeviceStr="Atmega 2561"; } } if (fwexist==false) { - QMessageBox::warning(this, "companion9x - Tip of the day", tr("Your radio uses a %1 CPU!!!\n\nPlease check advanced burn options to set the correct cpu type.").arg(DeviceStr)); - } else { + QMessageBox::warning(this, "Companion - Tip of the day", tr("Your radio uses a %1 CPU!!!\n\nPlease check advanced burn options to set the correct cpu type.").arg(DeviceStr)); + } + else { FirmwareInfo *firmware = GetCurrentFirmware(); - QMessageBox::warning(this, "companion9x - Tip of the day", tr("Your radio uses a %1 CPU!!!\n\nPlease select an appropriate firmware type to program it.").arg(DeviceStr)+FwStr+tr("\nYou are currently using:\n %1").arg(firmware->name)); + QMessageBox::warning(this, "Companion - Tip of the day", tr("Your radio uses a %1 CPU!!!\n\nPlease select an appropriate firmware type to program it.").arg(DeviceStr)+FwStr+tr("\nYou are currently using:\n %1").arg(firmware->name)); } } } @@ -333,7 +342,7 @@ void avrOutputDialog::doAddTextStdErr() currLine.append(text); if (currLine.contains("#")) { - avrphase=currLine.left(1).toLower(); + avrphase = currLine.left(1).toLower(); if (avrphase=="w") { ui->progressBar->setStyleSheet("QProgressBar {text-align: center;} QProgressBar::chunk { background-color: #ff0000; text-align:center;}:"); phase=1; @@ -344,14 +353,15 @@ void avrOutputDialog::doAddTextStdErr() pbvalue=currLine.count("#")*2; ui->progressBar->setValue(pbvalue); } - if (avrphase=="r") { + else if (avrphase=="r") { if (phase==0) { ui->progressBar->setStyleSheet("QProgressBar {text-align: center;} QProgressBar::chunk { background-color: #00ff00; text-align:center;}:"); if(winTitle.isEmpty()) setWindowTitle(getProgrammer() + " - " + tr("Reading")); else setWindowTitle(getProgrammer() + " - " + winTitle + " - " + tr("Reading")); - } else { + } + else { ui->progressBar->setStyleSheet("QProgressBar {text-align: center;} QProgressBar::chunk { background-color: #0000ff; text-align:center;}:"); phase=2; if(winTitle.isEmpty()) @@ -363,11 +373,12 @@ void avrOutputDialog::doAddTextStdErr() ui->progressBar->setValue(pbvalue); } } + if (currLine.contains("\n")) { - nlPos=currLine.lastIndexOf("\n"); - prevLine=currLine.left(nlPos).trimmed(); - currLine=currLine.mid(nlPos+1); + nlPos = currLine.lastIndexOf("\n"); + currLine = currLine.mid(nlPos+1); } + if (text.contains("-E-") && !text.contains("-E- No receive file name")) { hasErrors = true; } @@ -376,6 +387,7 @@ void avrOutputDialog::doAddTextStdErr() } #define HLINE_SEPARATOR "=================================================================================" + void avrOutputDialog::doFinished(int code=0) { addText("\n" HLINE_SEPARATOR); @@ -385,17 +397,22 @@ void avrOutputDialog::doFinished(int code=0) if (code) { ui->checkBox->setChecked(true); addText("\n" + getProgrammer() + " " + tr("done - exit code %1").arg(code)); - } else if (hasErrors) { + } + else if (hasErrors) { ui->checkBox->setChecked(true); addText("\n" + getProgrammer() + " " + tr("done with errors")); - } else if (!cmdLine.isEmpty()) { + } + else if (!cmdLine.isEmpty()) { addText("\n" + getProgrammer() + " " + tr("done - SUCCESSFUL")); - } else { + } + else { addText(tr("done - SUCCESSFUL")); } addText("\n" HLINE_SEPARATOR "\n"); - if(lfuse || hfuse || efuse) addReadFuses(); + if(lfuse || hfuse || efuse) { + addReadFuses(); + } switch(closeOpt) { @@ -416,24 +433,27 @@ void avrOutputDialog::doFinished(int code=0) if (hasErrors || code) { if (!cmdLine.isEmpty()) { if (getProgrammer()!="AVRDUDE") { - QMessageBox::critical(this, "companion9x", getProgrammer() + " " + tr("did not finish correctly")); - } else { - int res = QMessageBox::question(this, "companion9x",getProgrammer() + " " + tr("did not finish correctly!\nDo you want some help ?"),QMessageBox::Yes | QMessageBox::No); + QMessageBox::critical(this, "Companion", getProgrammer() + " " + tr("did not finish correctly")); + } + else { + int res = QMessageBox::question(this, "Companion",getProgrammer() + " " + tr("did not finish correctly!\nDo you want some help ?"),QMessageBox::Yes | QMessageBox::No); if (res != QMessageBox::No) { errorWizard(); } } } else { - QMessageBox::critical(this, "companion9x", tr("Copy did not finish correctly")); + QMessageBox::critical(this, "Companion", tr("Copy did not finish correctly")); } // reject(); - } else { + } + else { if (!cmdLine.isEmpty()) { - ui->progressBar->setValue(100); - QMessageBox::information(this, "companion9x", getProgrammer() + " " + tr("finished correctly")); + ui->progressBar->setValue(ui->progressBar->maximum()); + QMessageBox::information(this, "Companion", getProgrammer() + " " + tr("finished correctly")); accept(); - } else { - QMessageBox::information(this, "companion9x", tr("Copy finished correctly")); + } + else { + QMessageBox::information(this, "Companion", tr("Copy finished correctly")); accept(); } } @@ -454,8 +474,6 @@ void avrOutputDialog::doProcessStarted() addText("\n" HLINE_SEPARATOR "\n"); } - - void avrOutputDialog::addReadFuses() { addText(HLINE_SEPARATOR "\n"); @@ -463,19 +481,23 @@ void avrOutputDialog::addReadFuses() addText("\n" HLINE_SEPARATOR "\n"); } -void avrOutputDialog::on_checkBox_toggled(bool checked) { +void avrOutputDialog::on_checkBox_toggled(bool checked) +{ if (checked) { - ui->plainTextEdit->show(); - } else { - ui->plainTextEdit->hide(); - QTimer::singleShot(0, this, SLOT(shrink())); + ui->plainTextEdit->show(); + } + else { + ui->plainTextEdit->hide(); + QTimer::singleShot(0, this, SLOT(shrink())); } } -void avrOutputDialog::shrink() { +void avrOutputDialog::shrink() +{ resize(0,0); } -void avrOutputDialog::forceClose() { - accept();; +void avrOutputDialog::forceClose() +{ + accept(); } diff --git a/companion/src/avroutputdialog.h b/companion/src/avroutputdialog.h index 0eedabcc2..b62a69cef 100644 --- a/companion/src/avroutputdialog.h +++ b/companion/src/avroutputdialog.h @@ -52,9 +52,7 @@ private: quint8 lfuse; quint8 hfuse; quint8 efuse; - QString prevLine; QString currLine; - QString prevStdLine; QString currStdLine; int phase; QString winTitle; diff --git a/companion/src/avroutputdialog.ui b/companion/src/avroutputdialog.ui index 54ecf8d74..ded09363e 100644 --- a/companion/src/avroutputdialog.ui +++ b/companion/src/avroutputdialog.ui @@ -32,7 +32,7 @@ Dialog - + :/icon.png:/icon.png @@ -109,7 +109,7 @@ - + diff --git a/companion/src/burnconfigdialog.cpp b/companion/src/burnconfigdialog.cpp index d7f2b53f7..460a68398 100644 --- a/companion/src/burnconfigdialog.cpp +++ b/companion/src/burnconfigdialog.cpp @@ -2,6 +2,8 @@ #include "ui_burnconfigdialog.h" #include "avroutputdialog.h" #include "eeprominterface.h" +#include "helpers.h" +#include "appdata.h" #include #if !defined WIN32 && defined __GNUC__ @@ -36,7 +38,8 @@ burnConfigDialog::burnConfigDialog(QWidget *parent) : ui->samba_location->hide(); ui->samba_port->hide(); ui->sb_browse->hide(); - } else if (IS_SKY9X(eepromInterface->getBoard())) { + } + else if (IS_SKY9X(eepromInterface->getBoard())) { setWindowTitle(tr("SAM-BA Configuration")); ui->avrArgs->hide(); ui->avrdude_location->hide(); @@ -52,7 +55,8 @@ burnConfigDialog::burnConfigDialog(QWidget *parent) : ui->label_dfu1->hide(); ui->dfu_location->hide(); ui->dfu_browse->hide(); - } else { + } + else { setWindowTitle(tr("AVRDUDE Configuration")); ui->label_sb1->hide(); ui->label_sb3->hide(); @@ -82,37 +86,41 @@ burnConfigDialog::~burnConfigDialog() void burnConfigDialog::getSettings() { - QSettings settings("companion9x", "companion9x"); + avrLoc = g.avrdudeLocation(); + sambaLoc = g.sambaLocation(); + dfuLoc = g.dfuLocation(); + #if defined WIN32 || !defined __GNUC__ - avrLoc = settings.value("avrdude_location", QFileInfo("avrdude.exe").absoluteFilePath()).toString(); - sambaLoc = settings.value("samba_location", QFileInfo("sam-ba.exe").absoluteFilePath()).toString(); - dfuLoc = settings.value("dfu_location", QFileInfo("dfu-util.exe").absoluteFilePath()).toString(); + if ( avrLoc.isEmpty()) + avrLoc = QFileInfo("avrdude.exe").absoluteFilePath(); + if ( sambaLoc.isEmpty()) + sambaLoc = QFileInfo("sam-ba.exe").absoluteFilePath(); + if ( dfuLoc.isEmpty()) + dfuLoc = QFileInfo("dfu-util.exe").absoluteFilePath(); #elif defined __APPLE__ - avrLoc = settings.value("avrdude_location", "/usr/local/bin/avrdude").toString(); - sambaLoc = settings.value("samba_location", "/usr/local/bin/sam-ba").toString(); - dfuLoc = settings.value("dfu_location", QFileInfo("/opt/local/bin/dfu-util").absoluteFilePath()).toString(); + if ( avrLoc.isEmpty()) + avrLoc = "/usr/local/bin/avrdude"; + if ( sambaLoc.isEmpty()) + sambaLoc = "/usr/local/bin/sam-ba"; + if ( dfuLoc.isEmpty()) + dfuLoc = QFileInfo("/opt/local/bin/dfu-util").absoluteFilePath(); #else - avrLoc = settings.value("avrdude_location", "/usr/bin/avrdude").toString(); - sambaLoc = settings.value("samba_location", "/usr/bin/sam-ba").toString(); - dfuLoc = settings.value("dfu_location", QFileInfo("/usr/bin/dfu-util").absoluteFilePath()).toString(); + if ( avrLoc.isEmpty()) + avrLoc = "/usr/bin/avrdude"; + if ( sambaLoc.isEmpty()) + sambaLoc = "/usr/bin/sam-ba"; + if ( dfuLoc.isEmpty()) + dfuLoc = QFileInfo("/usr/bin/dfu-util").absoluteFilePath(); #endif - QString str = settings.value("avr_arguments").toString(); - avrArgs = str.split(" ", QString::SkipEmptyParts); - avrProgrammer = settings.value("programmer", QString("usbasp")).toString(); + dfuArgs = g.dfuArguments().split(" ", QString::SkipEmptyParts); + avrArgs = g.avrArguments().split(" ", QString::SkipEmptyParts); + avrProgrammer = g.programmer(); + avrPort = g.avrPort(); + avrMCU = g.mcu(); + armMCU = g.armMcu(); + sambaPort = g.sambaPort(); - avrMCU = settings.value("mcu", QString("m64")).toString(); - if (GetEepromInterface()->getBoard()==BOARD_SKY9X) { - armMCU = settings.value("arm_mcu", QString("at91sam3s4-9x")).toString(); - } else { - armMCU = settings.value("arm_mcu", QString("at91sam3s8-9xr")).toString(); - } - - avrPort = settings.value("avr_port", "").toString(); - sambaPort = settings.value("samba_port", "\\USBserial\\COM23").toString(); - - str = settings.value("dfu_arguments", "-a 0").toString(); - dfuArgs = str.split(" ", QString::SkipEmptyParts); ui->avrdude_location->setText(getAVRDUDE()); ui->avrArgs->setText(getAVRArgs().join(" ")); @@ -140,17 +148,16 @@ void burnConfigDialog::getSettings() void burnConfigDialog::putSettings() { - QSettings settings("companion9x", "companion9x"); - settings.setValue("avrdude_location", avrLoc); - settings.setValue("programmer", avrProgrammer); - settings.setValue("mcu", avrMCU); - settings.setValue("avr_port", avrPort); - settings.setValue("avr_arguments", avrArgs.join(" ")); - settings.setValue("samba_location", sambaLoc); - settings.setValue("samba_port", sambaPort); - settings.setValue("arm_mcu", armMCU); - settings.setValue("dfu_location", dfuLoc); - settings.setValue("dfu_arguments", dfuArgs.join(" ")); + g.avrdudeLocation( avrLoc ); + g.programmer( avrProgrammer); + g.mcu( avrMCU ); + g.avrPort( avrPort ); + g.avrArguments( avrArgs.join(" ") ); + g.sambaLocation( sambaLoc ); + g.sambaPort( sambaPort ); + g.armMcu( armMCU ); + g.dfuLocation( dfuLoc ); + g.dfuArguments( dfuArgs.join(" ") ); } void burnConfigDialog::populateProgrammers() @@ -282,8 +289,9 @@ void burnConfigDialog::listProgrammers() QStringList arguments; arguments << "-c?"; avrOutputDialog *ad = new avrOutputDialog(this, ui->avrdude_location->text(), arguments, "List available programmers", AVR_DIALOG_KEEP_OPEN, TRUE); - ad->setWindowIcon(QIcon(":/images/list.png")); + ad->setWindowIcon(CompanionIcon("list.png")); ad->show(); + delete ad; } void burnConfigDialog::on_pushButton_3_clicked() @@ -299,8 +307,9 @@ void burnConfigDialog::on_pushButton_4_clicked() arguments << "-?"; avrOutputDialog *ad = new avrOutputDialog(this, ui->avrdude_location->text(), arguments, "Show help", AVR_DIALOG_KEEP_OPEN,TRUE); - ad->setWindowIcon(QIcon(":/images/configure.png")); + ad->setWindowIcon(CompanionIcon("configure.png")); ad->show(); + delete ad; } @@ -316,8 +325,9 @@ void burnConfigDialog::readFuses() arguments << "-c" << avrProgrammer << "-p" << avrMCU << args << str; avrOutputDialog *ad = new avrOutputDialog(this, avrLoc, arguments, "Read Fuses",AVR_DIALOG_KEEP_OPEN,TRUE); - ad->setWindowIcon(QIcon(":/images/fuses.png")); + ad->setWindowIcon(CompanionIcon("fuses.png")); ad->show(); + delete ad; } void burnConfigDialog::restFuses(bool eeProtect) @@ -328,8 +338,7 @@ void burnConfigDialog::restFuses(bool eeProtect) //avrdude -c usbasp -p m64 -U efuse:w:<0xFF>:m QMessageBox::StandardButton ret = QMessageBox::No; - - ret = QMessageBox::warning(this, tr("companion9x"), + ret = QMessageBox::warning(this, tr("Companion"), tr("WARNING!
This will reset the fuses of %1 to the factory settings.
Writing fuses can mess up your radio.
Do this only if you are sure they are wrong!
Are you sure you want to continue?").arg(avrMCU), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) @@ -342,7 +351,8 @@ void burnConfigDialog::restFuses(bool eeProtect) QString erStr = eeProtect ? "hfuse:w:0x11:m" : "hfuse:w:0x19:m"; str << "-U" << "lfuse:w:0xD7:m" << "-U" << erStr << "-U" << "efuse:w:0xFC:m"; //use hfuse = 0x81 to prevent eeprom being erased with every flashing - } else { + } + else { QString tempDir = QDir::tempPath(); QString tempFile; QString lfuses; @@ -350,8 +360,9 @@ void burnConfigDialog::restFuses(bool eeProtect) QStringList argread; argread << "-c" << avrProgrammer << "-p" << avrMCU << args <<"-U" << "lfuse:r:"+tempFile+":r" ; avrOutputDialog *ad = new avrOutputDialog(this, avrLoc, argread, "Reset Fuses",AVR_DIALOG_CLOSE_IF_SUCCESSFUL,FALSE); - ad->setWindowIcon(QIcon(":/images/fuses.png")); + ad->setWindowIcon(CompanionIcon("fuses.png")); ad->exec(); + delete ad; QFile file(tempFile); if (file.exists() && file.size()==1) { file.open(QIODevice::ReadOnly); @@ -359,12 +370,14 @@ void burnConfigDialog::restFuses(bool eeProtect) file.read(bin_flash, 1); if (bin_flash[0]==0x0E) { lfuses="lfuse:w:0x0E:m"; - } else { + } + else { lfuses="lfuse:w:0x3F:m"; } file.close(); unlink(tempFile.toAscii()); - } else { + } + else { lfuses="lfuse:w:0x3F:m"; } @@ -375,12 +388,14 @@ void burnConfigDialog::restFuses(bool eeProtect) QStringList arguments; if (avrMCU=="m2560") { arguments << "-c" << avrProgrammer << "-p" << avrMCU << args << "-u" << str; - } else { + } + else { arguments << "-c" << avrProgrammer << "-p" << avrMCU << args << "-B" << "100" << "-u" << str; } avrOutputDialog *ad = new avrOutputDialog(this, avrLoc, arguments, "Reset Fuses",AVR_DIALOG_KEEP_OPEN,TRUE); - ad->setWindowIcon(QIcon(":/images/fuses.png")); + ad->setWindowIcon(CompanionIcon("fuses.png")); ad->show(); + delete ad; } } @@ -392,24 +407,29 @@ void burnConfigDialog::on_advCtrChkB_toggled(bool checked) if (IS_TARANIS(eepromInterface->getBoard())) { ui->label_dfu2->show(); ui->dfuArgs->show(); - } else if (IS_SKY9X(eepromInterface->getBoard())) { + } + else if (IS_SKY9X(eepromInterface->getBoard())) { ui->label_sb2->show(); ui->arm_mcu->show(); - } else { + } + else { ui->label_av3->show(); ui->avrdude_mcu->show(); - QMessageBox::warning(this, tr("companion9x"), + QMessageBox::warning(this, tr("Companion"), tr("WARNING!
Normally CPU type is automatically selected according to the chosen firmware.
If you change the CPU type the resulting eeprom could be inconsistent."), QMessageBox::Ok); } - } else { + } + else { if (IS_TARANIS(eepromInterface->getBoard())) { ui->label_dfu2->hide(); ui->dfuArgs->hide(); - } else if (IS_SKY9X(eepromInterface->getBoard())) { + } + else if (IS_SKY9X(eepromInterface->getBoard())) { ui->label_sb2->hide(); ui->arm_mcu->hide(); - } else { + } + else { ui->label_av3->hide(); ui->avrdude_mcu->hide(); } diff --git a/companion/src/burnconfigdialog.ui b/companion/src/burnconfigdialog.ui index dd6d031ff..2a439e6dc 100644 --- a/companion/src/burnconfigdialog.ui +++ b/companion/src/burnconfigdialog.ui @@ -26,8 +26,8 @@ Programmer Configuration - - :/images/configure.png:/images/configure.png + + :/icon.png:/icon.png @@ -765,7 +765,7 @@ Please only use this if you know what you are doing. There are no error checks buttonBox - + diff --git a/companion/src/burndialog.cpp b/companion/src/burndialog.cpp index 54b37d7a2..617c7ea9e 100644 --- a/companion/src/burndialog.cpp +++ b/companion/src/burndialog.cpp @@ -7,7 +7,9 @@ #include "splashlibrary.h" #include "flashinterface.h" #include "hexinterface.h" +#include "appdata.h" +// Type 1 = Burn EEPROM, Type 2= Burn Flash burnDialog::burnDialog(QWidget *parent, int Type, QString * fileName, bool * backupEE, QString DocName): QDialog(parent), ui(new Ui::burnDialog), @@ -16,32 +18,37 @@ burnDialog::burnDialog(QWidget *parent, int Type, QString * fileName, bool * bac hexType(Type) { ui->setupUi(this); + + if(!g.profile[g.id()].splashFile().isEmpty()){ + imageSource=PROFILE; + imageFile=g.profile[g.id()].splashFile(); + } + else{ + ui->useProfileImageCB->setDisabled(true); + imageSource=FIRMWARE; + imageFile=""; + } ui->SplashFrame->hide(); ui->FramFWInfo->hide(); ui->EEbackupCB->hide(); ui->EEbackupCB->setCheckState(*backup ? Qt::Checked : Qt::Unchecked); - if (Type == 2) { + if (Type == FLASH_FILE_TYPE ) { ui->EEpromCB->hide(); ui->profile_label->hide(); ui->patchcalib_CB->hide(); ui->patchhw_CB->hide(); - ui->InvertColorButton->setDisabled(true); - this->setWindowTitle(tr("Write firmware to TX")); + setWindowTitle(tr("Write firmware to TX")); if (IS_TARANIS(GetEepromInterface()->getBoard())) { ui->EEbackupCB->hide(); } - } else { + } + else { ui->FlashLoadButton->setText(tr("Browse for file")); ui->profile_label->hide(); ui->patchcalib_CB->hide(); ui->patchhw_CB->hide(); ui->EEpromCB->hide(); - ui->ImageLoadButton->setDisabled(true); - ui->libraryButton->setDisabled(true); - ui->InvertColorButton->setDisabled(true); ui->BurnFlashButton->setDisabled(true); - ui->ImageFileName->clear(); - ui->FwImage->clear(); ui->FWFileName->clear(); ui->DateField->clear(); ui->SVNField->clear(); @@ -51,41 +58,28 @@ burnDialog::burnDialog(QWidget *parent, int Type, QString * fileName, bool * bac ui->BurnFlashButton->setDisabled(true); ui->EEbackupCB->hide(); if (DocName.isEmpty()) { - this->setWindowTitle(tr("Write Models and Settings to TX")); - } else { - this->setWindowTitle(tr("Write Models and Settings in %1 to TX").arg(DocName)); + setWindowTitle(tr("Write Models and Settings to TX")); } - QSettings settings("companion9x", "companion9x"); - int profileid=settings.value("profileId", 1).toInt(); - settings.beginGroup("Profiles"); - QString profile=QString("profile%1").arg(profileid); - settings.beginGroup(profile); - QString Name=settings.value("Name","").toString(); - settings.endGroup(); - settings.endGroup(); - ui->profile_label->setText(tr("Current profile")+QString(": ")+Name); + else { + setWindowTitle(tr("Write Models and Settings in %1 to TX").arg(DocName)); + } + ui->profile_label->setText(tr("Current profile")+QString(": ")+g.profile[g.id()].name()); } if (!hexfileName->isEmpty()) { ui->FWFileName->setText(*hexfileName); - if (Type==2) { + if (Type==FLASH_FILE_TYPE) { checkFw(*hexfileName); - } else { + } + else { burnraw=false; if (checkeEprom(*hexfileName)) { - QSettings settings("companion9x", "companion9x"); - int profileid=settings.value("profileId", 1).toInt(); - settings.beginGroup("Profiles"); - QString profile=QString("profile%1").arg(profileid); - settings.beginGroup(profile); - QString Name=settings.value("Name","").toString(); - QString calib=settings.value("StickPotCalib","").toString(); - QString trainercalib=settings.value("TrainerCalib","").toString(); - QString DisplaySet=settings.value("Display","").toString(); - QString BeeperSet=settings.value("Beeper","").toString(); - QString HapticSet=settings.value("Haptic","").toString(); - QString SpeakerSet=settings.value("Speaker","").toString(); - settings.endGroup(); - settings.endGroup(); + QString Name = g.profile[g.id()].name(); + QString calib = g.profile[g.id()].stickPotCalib(); + QString trainercalib = g.profile[g.id()].trainerCalib(); + QString DisplaySet = g.profile[g.id()].display(); + QString BeeperSet = g.profile[g.id()].beeper(); + QString HapticSet = g.profile[g.id()].haptic(); + QString SpeakerSet = g.profile[g.id()].speaker(); if (!Name.isEmpty()) { ui->profile_label->show(); ui->patchcalib_CB->show(); @@ -97,12 +91,14 @@ burnDialog::burnDialog(QWidget *parent, int Type, QString * fileName, bool * bac if (!((DisplaySet.length()==6) && (BeeperSet.length()==4) && (HapticSet.length()==6) && (SpeakerSet.length()==6))) { ui->patchhw_CB->setDisabled(true); } - } else { + } + else { ui->profile_label->hide(); } if (!IS_TARANIS(GetEepromInterface()->getBoard())) { ui->EEpromCB->show(); - } else { + } + else { ui->EEpromCB->setChecked(false); } ui->BurnFlashButton->setEnabled(true); @@ -112,32 +108,27 @@ burnDialog::burnDialog(QWidget *parent, int Type, QString * fileName, bool * bac ui->FlashLoadButton->hide(); hexfileName->clear(); } - else if (Type==2) { - QSettings settings("companion9x", "companion9x"); - QString FileName; - FileName = settings.value("lastFw").toString(); + else if (Type==FLASH_FILE_TYPE) { + QString FileName = g.profile[g.id()].fwName(); QFile file(FileName); if (file.exists()) { checkFw(FileName); } } + updateUI(); resize(0, 0); } -burnDialog::~burnDialog() { +burnDialog::~burnDialog() +{ delete ui; } void burnDialog::on_FlashLoadButton_clicked() { QString fileName; - QSettings settings("companion9x", "companion9x"); - ui->ImageLoadButton->setDisabled(true); - ui->libraryButton->setDisabled(true); - ui->InvertColorButton->setDisabled(true); + ui->BurnFlashButton->setDisabled(true); - ui->ImageFileName->clear(); - ui->FwImage->clear(); ui->FWFileName->clear(); ui->DateField->clear(); ui->SVNField->clear(); @@ -147,11 +138,14 @@ void burnDialog::on_FlashLoadButton_clicked() ui->BurnFlashButton->setDisabled(true); ui->EEbackupCB->hide(); QTimer::singleShot(0, this, SLOT(shrink())); - if (hexType==2) { - fileName = QFileDialog::getOpenFileName(this, tr("Open"), settings.value("lastFlashDir").toString(), FLASH_FILES_FILTER); + if (hexType==FLASH_FILE_TYPE) { + fileName = QFileDialog::getOpenFileName(this, tr("Open Firmware File"), g.flashDir(), FLASH_FILES_FILTER); + if(fileName.isEmpty()) + return; checkFw(fileName); - } else { - QString fileName = QFileDialog::getOpenFileName(this,tr("Choose file to load Models and Settings from"), settings.value("lastDir").toString(), tr(EXTERNAL_EEPROM_FILES_FILTER)); + } + else { + QString fileName = QFileDialog::getOpenFileName(this,tr("Choose file to load Models and Settings from"), g.eepromDir(), tr(EXTERNAL_EEPROM_FILES_FILTER)); if (checkeEprom(fileName)) { if (burnraw==false) { ui->BurnFlashButton->setEnabled(true); @@ -160,10 +154,12 @@ void burnDialog::on_FlashLoadButton_clicked() ui->patchhw_CB->show(); if (!IS_TARANIS(GetEepromInterface()->getBoard())) { ui->EEpromCB->show(); - } else { + } + else { ui->EEpromCB->setChecked(false); } - } else { + } + else { ui->BurnFlashButton->setEnabled(true); ui->profile_label->hide(); ui->patchcalib_CB->setChecked(false); @@ -174,6 +170,7 @@ void burnDialog::on_FlashLoadButton_clicked() QTimer::singleShot(0, this, SLOT(shrink())); } } + updateUI(); } void burnDialog::checkFw(QString fileName) @@ -181,10 +178,11 @@ void burnDialog::checkFw(QString fileName) if (fileName.isEmpty()) { return; } - QSettings settings("companion9x", "companion9x"); + if (!IS_TARANIS(GetEepromInterface()->getBoard())) { ui->EEbackupCB->show(); - } else { + } + else { ui->EEbackupCB->setChecked(false); *backup=false; } @@ -195,57 +193,19 @@ void burnDialog::checkFw(QString fileName) ui->DateField->setText(flash.getDate() + " " + flash.getTime()); ui->SVNField->setText(flash.getSvn()); ui->ModField->setText(flash.getBuild()); - ui->BurnFlashButton->setEnabled(true); - ui->BurnFlashButton->setText(tr("Write to TX")); + + ui->SplashFrame->hide(); if (flash.hasSplash()) { ui->SplashFrame->show(); - ui->ImageLoadButton->setEnabled(true); - ui->libraryButton->setEnabled(true); - ui->FwImage->setFixedSize(flash.getSplashWidth(),flash.getSplashHeight()); - ui->imageLabel->setFixedSize(flash.getSplashWidth(),flash.getSplashHeight()); - ui->FwImage->show(); - ui->FwImage->setPixmap(QPixmap::fromImage(flash.getSplash())); - QString ImageStr = settings.value("SplashImage", "").toString(); - bool PatchFwCB = settings.value("patchImage", false).toBool(); - if (!ImageStr.isEmpty()) { - QImage Image = qstring2image(ImageStr); - ui->imageLabel->setPixmap(QPixmap::fromImage(Image.convertToFormat(flash.getSplashFormat()))); - ui->InvertColorButton->setEnabled(true); - ui->PreferredImageCB->setChecked(true); - ui->PatchFWCB->setChecked(PatchFwCB); - } - else { - QString fileName=ui->ImageFileName->text(); - if (!fileName.isEmpty()) { - QImage image(fileName); - if (!image.isNull()) { - ui->InvertColorButton->setEnabled(true); - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width(), ui->imageLabel->height()).convertToFormat(flash.getSplashFormat()))); - ui->PatchFWCB->setEnabled(true); - ui->PatchFWCB->setChecked(PatchFwCB); - } else { - ui->PatchFWCB->setDisabled(true); - ui->PatchFWCB->setChecked(false); - ui->PreferredImageCB->setDisabled(true); - } - } else { - ui->PatchFWCB->setDisabled(true); - ui->PatchFWCB->setChecked(false); - ui->PreferredImageCB->setDisabled(true); - } - } - } else { - ui->FwImage->hide(); - ui->ImageFileName->setText(""); - ui->SplashFrame->hide(); + ui->imageLabel->setFixedSize(flash.getSplashWidth(), flash.getSplashHeight()); } - } else { - QMessageBox::warning(this, tr("Warning"), tr("%1 is not a known firmware").arg(fileName)); - ui->BurnFlashButton->setText(tr("Burn anyway !")); - ui->BurnFlashButton->setEnabled(true); + } + else { + QMessageBox::warning(this, tr("Warning"), tr("%1 may not be a valid firmware file").arg(fileName)); } + ui->BurnFlashButton->setEnabled(true); QTimer::singleShot(0, this, SLOT(shrink())); - settings.setValue("lastFlashDir", QFileInfo(fileName).dir().absolutePath()); + g.flashDir( QFileInfo(fileName).dir().absolutePath() ); } bool burnDialog::checkeEprom(QString fileName) @@ -267,7 +227,8 @@ bool burnDialog::checkeEprom(QString fileName) } QTextStream inputStream(&file); XmlInterface(inputStream).load(radioData); - } else if (fileType==FILE_TYPE_HEX || fileType==FILE_TYPE_EEPE) { //read HEX file + } + else if (fileType==FILE_TYPE_HEX || fileType==FILE_TYPE_EEPE) { //read HEX file if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //reading HEX TEXT file QMessageBox::critical(this, tr("Error"),tr("Error opening file %1:\n%2.").arg(fileName).arg(file.errorString())); return false; @@ -292,7 +253,7 @@ bool burnDialog::checkeEprom(QString fileName) uint8_t eeprom[EESIZE_RLC_MAX]; int eeprom_size = HexInterface(inputStream).load(eeprom, EESIZE_RLC_MAX); if (!eeprom_size) { - int res = QMessageBox::question(this, "companion9x",tr("Invalid binary Models and Settings File %1, Proceed anyway ?").arg(fileName),QMessageBox::Yes | QMessageBox::No); + int res = QMessageBox::question(this, "Companion",tr("Invalid binary Models and Settings File %1, Proceed anyway ?").arg(fileName),QMessageBox::Yes | QMessageBox::No); if (res == QMessageBox::No) { return false; } @@ -302,7 +263,7 @@ bool burnDialog::checkeEprom(QString fileName) } file.close(); if (!LoadEeprom(radioData, eeprom, eeprom_size)) { - int res = QMessageBox::question(this, "companion9x",tr("Invalid binary Models and Settings File %1, Proceed anyway ?").arg(fileName),QMessageBox::Yes | QMessageBox::No); + int res = QMessageBox::question(this, "Companion",tr("Invalid binary Models and Settings File %1, Proceed anyway ?").arg(fileName),QMessageBox::Yes | QMessageBox::No); if (res == QMessageBox::No) { return false; } @@ -310,7 +271,8 @@ bool burnDialog::checkeEprom(QString fileName) ui->FWFileName->setText(fileName); return true; } - } else if (fileType==FILE_TYPE_BIN) { //read binary + } + else if (fileType==FILE_TYPE_BIN) { //read binary int eeprom_size = file.size(); if (!file.open(QFile::ReadOnly)) { //reading binary file - TODO HEX support QMessageBox::critical(this, tr("Error"),tr("Error opening file %1:\n%2.").arg(fileName).arg(file.errorString())); @@ -325,7 +287,7 @@ bool burnDialog::checkeEprom(QString fileName) return false; } if (!LoadEeprom(radioData, eeprom, eeprom_size)) { - int res = QMessageBox::question(this, "companion9x",tr("Invalid binary Models and Settings File %1, Proceed anyway ?").arg(fileName),QMessageBox::Yes | QMessageBox::No); + int res = QMessageBox::question(this, "Companion",tr("Invalid binary Models and Settings File %1, Proceed anyway ?").arg(fileName),QMessageBox::Yes | QMessageBox::No); if (res == QMessageBox::No) { return false; } @@ -336,53 +298,92 @@ bool burnDialog::checkeEprom(QString fileName) return true; } -void burnDialog::on_ImageLoadButton_clicked() +void burnDialog::displaySplash() +{ + QImage image; + if (imageSource == FIRMWARE){ + FlashInterface flash(ui->FWFileName->text()); + image = flash.getSplash(); + } + else{ + image.load(imageFile); + } + if (image.isNull()) { + return; + } + ui->imageLabel->setPixmap( makePixMap( image, g.profile[g.id()].fwType())); +} + +void burnDialog::updateUI() +{ + if (hexType==EEPROM_FILE_TYPE) + return; + + ui->useProfileImageCB->setChecked( imageSource == PROFILE ); + ui->useFwImageCB->setChecked( imageSource == FIRMWARE ); + ui->useLibraryImageCB->setChecked( imageSource == LIBRARY ); + ui->useAnotherImageCB->setChecked( imageSource == ANOTHER ); + + displaySplash(); +} + +void burnDialog::on_useFwImageCB_clicked() +{ + QString fileName = ui->FWFileName->text(); + FlashInterface flash(fileName); + if (!flash.isValid()) { + QMessageBox::critical(this, tr("Error"), tr( "The firmware file is not valid." )); + } + else { + if (!flash.hasSplash()) { + QMessageBox::critical(this, tr("Error"), tr( "There is no start screen image in the firmware file." )); + } + else{ + imageSource = FIRMWARE; + imageFile = fileName; + } + } + updateUI(); +} + +void burnDialog::on_useProfileImageCB_clicked() +{ + QString fileName = g.profile[g.id()].splashFile(); + if (!fileName.isEmpty()){ + QImage image(fileName); + if (image.isNull()) { + QMessageBox::critical(this, tr("Error"), tr("The profile image %1 does not contain an image.").arg(fileName)); + } + else { + imageSource = PROFILE; + imageFile = fileName; + } + } + updateUI(); +} + +void burnDialog::on_useAnotherImageCB_clicked() { QString supportedImageFormats; for (int formatIndex = 0; formatIndex < QImageReader::supportedImageFormats().count(); formatIndex++) { supportedImageFormats += QLatin1String(" *.") + QImageReader::supportedImageFormats()[formatIndex]; } - - QSettings settings("companion9x", "companion9x"); - QString fileName = QFileDialog::getOpenFileName(this, - tr("Open Image to load"), settings.value("lastImagesDir").toString(), tr("Images (%1)").arg(supportedImageFormats)); - - if (!fileName.isEmpty()) { - settings.setValue("lastImagesDir", QFileInfo(fileName).dir().absolutePath()); + QString fileName = QFileDialog::getOpenFileName(this, tr("Open image file to use as Tx start screen"), g.imagesDir(), tr("Images (%1)").arg(supportedImageFormats)); + if (!fileName.isEmpty()){ + g.imagesDir( QFileInfo(fileName).dir().absolutePath() ); QImage image(fileName); if (image.isNull()) { - QMessageBox::critical(this, tr("Error"), tr("Cannot load %1.").arg(fileName)); - ui->PatchFWCB->setDisabled(true); - ui->PatchFWCB->setChecked(false); - ui->InvertColorButton->setDisabled(true); - return; + QMessageBox::critical(this, tr("Error"), tr("Image could not be loaded from %1").arg(fileName)); } - ui->ImageFileName->setText(fileName); - ui->InvertColorButton->setEnabled(true); - if (ui->imageLabel->width()!=128) { - image=image.convertToFormat(QImage::Format_RGB32); - QRgb col; - int gray; - int width = image.width(); - int height = image.height(); - for (int i = 0; i < width; ++i) - { - for (int j = 0; j < height; ++j) - { - col = image.pixel(i, j); - gray = qGray(col); - image.setPixel(i, j, qRgb(gray, gray, gray)); - } - } - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width(), ui->imageLabel->height()))); - } else { - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width(), ui->imageLabel->height()).convertToFormat(QImage::Format_Mono))); - } - ui->PatchFWCB->setEnabled(true); + else{ + imageSource = ANOTHER; + imageFile = fileName; + } } + updateUI(); } -void burnDialog::on_libraryButton_clicked() +void burnDialog::on_useLibraryImageCB_clicked() { QString fileName; splashLibrary *ld = new splashLibrary(this,&fileName); @@ -390,50 +391,26 @@ void burnDialog::on_libraryButton_clicked() if (!fileName.isEmpty()) { QImage image(fileName); if (image.isNull()) { - QMessageBox::critical(this, tr("Error"), tr("Cannot load %1.").arg(fileName)); - ui->PatchFWCB->setDisabled(true); - ui->PatchFWCB->setChecked(false); - ui->InvertColorButton->setDisabled(true); - return; + QMessageBox::critical(this, tr("Error"), tr("The library image could not be loaded")); } - ui->ImageFileName->setText(fileName); - ui->InvertColorButton->setEnabled(true); - if (ui->imageLabel->width()!=128) { - image=image.convertToFormat(QImage::Format_RGB32); - QRgb col; - int gray; - int width = image.width(); - int height = image.height(); - for (int i = 0; i < width; ++i) - { - for (int j = 0; j < height; ++j) - { - col = image.pixel(i, j); - gray = qGray(col); - image.setPixel(i, j, qRgb(gray, gray, gray)); - } - } - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width(), ui->imageLabel->height()))); - } else { - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width(), ui->imageLabel->height()).convertToFormat(QImage::Format_Mono))); + else{ + imageSource = LIBRARY; + imageFile = fileName; } - ui->PatchFWCB->setEnabled(true); } + updateUI(); } void burnDialog::on_BurnFlashButton_clicked() { - if (hexType==2) { + if (hexType==FLASH_FILE_TYPE) { QString fileName=ui->FWFileName->text(); if (!fileName.isEmpty()) { - QSettings settings("companion9x", "companion9x"); - settings.setValue("lastFlashDir", QFileInfo(fileName).dir().absolutePath()); - settings.setValue("lastFw", fileName); - if (ui->PatchFWCB->isChecked()) { - settings.setValue("patchImage", true); + g.flashDir( QFileInfo(fileName).dir().absolutePath() ); + if (!ui->useFwImageCB->isChecked()) { QImage image = ui->imageLabel->pixmap()->toImage().scaled(ui->imageLabel->width(), ui->imageLabel->height()); if (!image.isNull()) { - QString tempDir = QDir::tempPath(); + QString tempDir = QDir::tempPath(); QString tempFile; if (getFileType(fileName) == FILE_TYPE_HEX) tempFile = tempDir + "/flash.hex"; @@ -453,7 +430,6 @@ void burnDialog::on_BurnFlashButton_clicked() QMessageBox::critical(this, tr("Warning"), tr("Custom image not found")); } } else { - settings.setValue("patchImage", false); hexfileName->clear(); hexfileName->append(fileName); } @@ -462,27 +438,20 @@ void burnDialog::on_BurnFlashButton_clicked() hexfileName->clear(); } } - if (hexType==1) { - QSettings settings("companion9x", "companion9x"); - int profileid=settings.value("profileId", 1).toInt(); - settings.beginGroup("Profiles"); - QString profile=QString("profile%1").arg(profileid); - settings.beginGroup(profile); - QString calib=settings.value("StickPotCalib","").toString(); - QString trainercalib=settings.value("TrainerCalib","").toString(); + if (hexType==EEPROM_FILE_TYPE) { + QString calib = g.profile[g.id()].stickPotCalib(); + QString trainercalib = g.profile[g.id()].trainerCalib(); int potsnum=GetEepromInterface()->getCapability(Pots); - int8_t vBatCalib=(int8_t)settings.value("VbatCalib", radioData.generalSettings.vBatCalib).toInt(); - int8_t currentCalib=(int8_t)settings.value("currentCalib", radioData.generalSettings.currentCalib).toInt(); - int8_t PPM_Multiplier=(int8_t)settings.value("PPM_Multiplier", radioData.generalSettings.PPM_Multiplier).toInt(); - uint8_t GSStickMode=(uint8_t)settings.value("GSStickMode", radioData.generalSettings.stickMode).toUInt(); - uint8_t vBatWarn=(uint8_t)settings.value("vBatWarn",radioData.generalSettings.vBatWarn).toUInt(); + int8_t vBatCalib=(int8_t) g.profile[g.id()].vBatCalib(); + int8_t currentCalib=(int8_t) g.profile[g.id()].currentCalib(); + int8_t PPM_Multiplier=(int8_t) g.profile[g.id()].ppmMultiplier(); + uint8_t GSStickMode=(uint8_t) g.profile[g.id()].gsStickMode(); + uint8_t vBatWarn=(uint8_t) g.profile[g.id()].vBatWarn(); - QString DisplaySet=settings.value("Display","").toString(); - QString BeeperSet=settings.value("Beeper","").toString(); - QString HapticSet=settings.value("Haptic","").toString(); - QString SpeakerSet=settings.value("Speaker","").toString(); - settings.endGroup(); - settings.endGroup(); + QString DisplaySet= g.profile[g.id()].display(); + QString BeeperSet= g.profile[g.id()].beeper(); + QString HapticSet= g.profile[g.id()].haptic(); + QString SpeakerSet= g.profile[g.id()].speaker(); bool patch=false; if (ui->patchcalib_CB->isChecked()) { if ((calib.length()==(NUM_STICKS+potsnum)*12) && (trainercalib.length()==16)) { @@ -618,99 +587,9 @@ void burnDialog::on_cancelButton_clicked() this->close(); } -void burnDialog::on_InvertColorButton_clicked() -{ - if (ui->imageLabel->pixmap()) { - QImage image = ui->imageLabel->pixmap()->toImage(); - image.invertPixels(); - ui->imageLabel->setPixmap(QPixmap::fromImage(image)); - } -} - void burnDialog::on_EEpromCB_toggled(bool checked) { - if (ui->EEpromCB->isChecked()) { - *backup=true; - } else { - *backup=false; - } -} - -void burnDialog::on_PreferredImageCB_toggled(bool checked) -{ - QString tmpFileName; - if (checked) { - QSettings settings("companion9x", "companion9x"); - QString ImageStr = settings.value("SplashImage", "").toString(); - if (!ImageStr.isEmpty()) { - QImage Image = qstring2image(ImageStr); - if (ui->imageLabel->width()!=128) { - Image=Image.convertToFormat(QImage::Format_RGB32); - QRgb col; - int gray; - int width = Image.width(); - int height = Image.height(); - for (int i = 0; i < width; ++i) - { - for (int j = 0; j < height; ++j) - { - col = Image.pixel(i, j); - gray = qGray(col); - Image.setPixel(i, j, qRgb(gray, gray, gray)); - } - } - } else { - Image=Image.convertToFormat(QImage::Format_Mono); - } - ui->imageLabel->setPixmap(QPixmap::fromImage(Image)); - ui->InvertColorButton->setEnabled(true); - ui->PreferredImageCB->setChecked(true); - ui->ImageFileName->setDisabled(true); - ui->ImageLoadButton->setDisabled(true); - ui->libraryButton->setDisabled(true); - ui->PatchFWCB->setEnabled(true); - } - } else { - ui->imageLabel->clear(); - ui->ImageLoadButton->setEnabled(true); - ui->libraryButton->setEnabled(true); - tmpFileName = ui->ImageFileName->text(); - if (!tmpFileName.isEmpty()) { - QImage image(tmpFileName); - if (!image.isNull()) { - if (ui->imageLabel->width()!=128) { - image=image.convertToFormat(QImage::Format_RGB32); - QRgb col; - int gray; - int width = image.width(); - int height = image.height(); - for (int i = 0; i < width; ++i) - { - for (int j = 0; j < height; ++j) - { - col = image.pixel(i, j); - gray = qGray(col); - image.setPixel(i, j, qRgb(gray, gray, gray)); - } - } - } else { - image=image.convertToFormat(QImage::Format_Mono); - } - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width(), ui->imageLabel->height()))); - ui->InvertColorButton->setEnabled(true); - ui->ImageFileName->setEnabled(true); - ui->PatchFWCB->setDisabled(false); - } else { - ui->InvertColorButton->setDisabled(true); - ui->PatchFWCB->setDisabled(true); - ui->PatchFWCB->setChecked(false); - } - } else { - ui->InvertColorButton->setDisabled(true); - ui->PatchFWCB->setDisabled(true); - ui->PatchFWCB->setChecked(false); - } - } + *backup = ui->EEpromCB->isChecked(); } void burnDialog::shrink() @@ -720,9 +599,5 @@ void burnDialog::shrink() void burnDialog::on_EEbackupCB_clicked() { - if (ui->EEbackupCB->isChecked()) { - *backup=true; - } else { - *backup=false; - } + *backup = ui->EEbackupCB->isChecked(); } diff --git a/companion/src/burndialog.h b/companion/src/burndialog.h index 40068f3ac..1ffac2b92 100644 --- a/companion/src/burndialog.h +++ b/companion/src/burndialog.h @@ -19,6 +19,8 @@ #define ER9X_EEPROM_FILE_TYPE "ER9X_EEPROM_FILE" #define EEPE_EEPROM_FILE_HEADER "EEPE EEPROM FILE" #define EEPE_MODEL_FILE_HEADER "EEPE MODEL FILE" +#define EEPROM_FILE_TYPE 1 +#define FLASH_FILE_TYPE 2 namespace Ui @@ -36,18 +38,22 @@ public: private slots: void on_FlashLoadButton_clicked(); - void on_ImageLoadButton_clicked(); - void on_libraryButton_clicked(); void on_BurnFlashButton_clicked(); void on_cancelButton_clicked(); - void on_InvertColorButton_clicked(); void on_EEbackupCB_clicked(); - void on_PreferredImageCB_toggled(bool checked); - void on_EEpromCB_toggled(bool checked); - void checkFw(QString fileName); + void on_EEpromCB_toggled(bool checked); bool checkeEprom(QString fileName); + void on_useProfileImageCB_clicked(); + void on_useFwImageCB_clicked(); + void on_useLibraryImageCB_clicked(); + void on_useAnotherImageCB_clicked(); + + void checkFw(QString fileName); + void displaySplash(); + void updateUI(); void shrink(); + private: Ui::burnDialog *ui; QString * hexfileName; @@ -55,6 +61,9 @@ private: int hexType; RadioData radioData; bool burnraw; + enum ImageSource {FIRMWARE, PROFILE, LIBRARY, ANOTHER}; + ImageSource imageSource; + QString imageFile; }; #endif // BURNDIALOG_H diff --git a/companion/src/burndialog.ui b/companion/src/burndialog.ui index d9c51ec35..772304390 100644 --- a/companion/src/burndialog.ui +++ b/companion/src/burndialog.ui @@ -7,7 +7,7 @@ 0 0 440 - 418 + 423 @@ -26,25 +26,12 @@ Customize Splash - - :/images/c_home.png:/images/c_home.png + + :/icon.png:/icon.png - + - - - - Qt::Vertical - - - - 20 - 0 - - - - @@ -71,19 +58,6 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - @@ -100,19 +74,6 @@ - - - - Qt::Horizontal - - - - 48 - 20 - - - - @@ -152,56 +113,22 @@ QFrame::Raised - - - - - 0 - 0 - - - - - 128 - 64 - - - - - 212 - 64 - - - - QFrame::Panel - - - QFrame::Raised - - - - - - true - - - - - + + true - - + + - Date & Time + Variant - - + + true @@ -214,17 +141,17 @@ - - - - true + + + + Date & Time - - - - Variant + + + + true @@ -273,7 +200,7 @@ - Allows companion9x to write to older version of the firmware + Allows Companion to write to older version of the firmware Check Firmware compatibility @@ -325,17 +252,10 @@ - - - - - - - Invert Color - - - - + + + + @@ -359,7 +279,7 @@ QFrame::Panel - QFrame::Raised + QFrame::Plain @@ -369,10 +289,50 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + - + + + Use firmware start screen + + + + + + + Use another start screen + + + + + 0 @@ -380,90 +340,14 @@ - Use image in settings - - - - - - - Substitute image in firmware + Use profile start screen - - - Qt::Vertical - - - - 20 - 13 - - - - - - - - Qt::Vertical - - - - 20 - 13 - - - - - - - - - - - - true - - - - 0 - 0 - - - - true - - - - - - - false - + - Load Image - - - - - - - Open Splash Library - - - ... - - - - :/images/library.png:/images/library.png - - - - 16 - 16 - + Use library start screen @@ -474,21 +358,40 @@ + + + + Qt::Vertical + + + + 20 + 0 + + + + + BurnFlashButton FWFileName FlashLoadButton - ImageFileName - ImageLoadButton - libraryButton + DateField + SVNField + ModField + useProfileImageCB + useFwImageCB + useLibraryImageCB + useAnotherImageCB EEbackupCB + patchcalib_CB + patchhw_CB EEpromCB cancelButton - BurnFlashButton - + diff --git a/companion/src/main.cpp b/companion/src/companion.cpp similarity index 58% rename from companion/src/main.cpp rename to companion/src/companion.cpp index 700536602..37a988273 100644 --- a/companion/src/main.cpp +++ b/companion/src/companion.cpp @@ -45,12 +45,12 @@ #include #include #include -#include #include #include #include #include "mainwindow.h" #include "eeprominterface.h" +#include "appdata.h" #if defined WIN32 || !defined __GNUC__ #include @@ -76,54 +76,52 @@ class MyProxyStyle : public QProxyStyle int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(companion9x); - QApplication app(argc, argv); - app.setApplicationName("Companion9x"); + Q_INIT_RESOURCE(companion); + QApplication app(argc, argv); + app.setApplicationName("OpenTX Companion"); + app.setOrganizationName("OpenTX"); + app.setOrganizationDomain("open-tx.org"); + #ifdef __APPLE__ - app.setStyle(new MyProxyStyle); + app.setStyle(new MyProxyStyle); #endif - QString dir; - if(argc) dir = QFileInfo(argv[0]).canonicalPath() + "/lang"; - QSettings settings("companion9x", "companion9x"); - QString locale = settings.value("locale",QLocale::system().name()).toString(); - bool showSplash = settings.value("show_splash", true).toBool(); + QTranslator companionTranslator; + companionTranslator.load(":/companion_" + g.locale()); + QTranslator qtTranslator; + qtTranslator.load((QString)"qt_" + g.locale().left(2), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + app.installTranslator(&companionTranslator); + app.installTranslator(&qtTranslator); - QTranslator companion9xTranslator; - companion9xTranslator.load(":/companion9x_" + locale); - QTranslator qtTranslator; - qtTranslator.load((QString)"qt_" + locale.left(2), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); -// qDebug() << locale; -// qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); - app.installTranslator(&companion9xTranslator); - app.installTranslator(&qtTranslator); + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); - QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + if (g.profile[g.id()].fwType().isEmpty()){ + g.profile[g.id()].fwType(default_firmware_variant.id); + g.profile[g.id()].fwName(""); + } + - QString firmware_id = settings.value("firmware", default_firmware_variant.id).toString(); - firmware_id.replace("open9x", "opentx"); - firmware_id.replace("x9da", "taranis"); - QPixmap pixmap; - if (firmware_id.contains("taranis")) - pixmap = QPixmap(":/images/splasht.png"); - else - pixmap = QPixmap(":/images/splash.png"); - QSplashScreen *splash = new QSplashScreen(pixmap); + QPixmap pixmap = QPixmap(g.profile[g.id()].fwType().contains("taranis") ? ":/images/splasht.png" : ":/images/splash.png"); + QSplashScreen *splash = new QSplashScreen(pixmap); - RegisterFirmwares(); + RegisterFirmwares(); - settings.setValue("firmware", firmware_id); - current_firmware_variant = GetFirmwareVariant(firmware_id); - // qDebug() << current_firmware_variant; + current_firmware_variant = GetFirmwareVariant(g.profile[g.id()].fwType()); - if (showSplash) { - splash->show(); - splash->showMessage(QObject::tr("")); - sleep(SPLASH_TIME); - } + MainWindow *mainWin = new MainWindow(); + if (g.showSplash()) { + splash->show(); + QTimer::singleShot(1000*SPLASH_TIME, splash, SLOT(close())); + QTimer::singleShot(1000*SPLASH_TIME, mainWin, SLOT(show())); + } + else { + mainWin->show(); + } - MainWindow mainWin; - mainWin.show(); - splash->finish(&mainWin); - return app.exec(); + int result = app.exec(); + + delete splash; + delete mainWin; + + return result; } diff --git a/companion/src/companion.desktop b/companion/src/companion.desktop new file mode 100644 index 000000000..df19a4a80 --- /dev/null +++ b/companion/src/companion.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=Companion +GenericName=Transmitter Companion App +Comment=The Ultimate Transmitter Companion +Icon=companion +Exec='companion' +Terminal=false +StartupNotify=false +Categories=Application diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc new file mode 100644 index 000000000..dcb97f0b3 --- /dev/null +++ b/companion/src/companion.qrc @@ -0,0 +1,1096 @@ + + + images/customize.png + icon.png + ../../CREDITS.txt + ../../DONATIONS.txt + ../releasenotes.txt + images/9xdb.png + images/9xdl.png + images/9xdr.png + images/9xdt.png + images/9xdb-bl.png + images/9xdl-bl.png + images/9xdr-bl.png + images/9xdt-bl.png + images/9xdb-gr.png + images/9xdl-gr.png + images/9xdr-gr.png + images/9xdt-gr.png + images/9xdb-or.png + images/9xdl-or.png + images/9xdr-or.png + images/9xdt-or.png + images/9xdb-yl.png + images/9xdl-yl.png + images/9xdr-yl.png + images/9xdt-yl.png + images/9xdb-rd.png + images/9xdl-rd.png + images/9xdr-rd.png + images/9xdt-rd.png + images/9xmenu.png + images/9xmenumenu.png + images/9xmenuexit.png + images/9xcurs.png + images/9xcursup.png + images/9xcursplus.png + images/9xcursmin.png + images/9xcursdown.png + images/9xcursphoto.png + images/screenshot.png + images/splash.png + images/splasht.png + images/companion-title.png + images/maps.png + images/track.png + images/track0.png + images/x9b0.png + images/x9l0.png + images/x9l1.png + images/x9l2.png + images/x9l3.png + images/x9l4.png + images/x9r0.png + images/x9r1.png + images/x9r2.png + images/x9r3.png + images/x9s0.png + images/x9t0.png + images/mcw/aicon.png + images/mcw/dicon.png + images/mcw/gicon.png + images/mcw/hicon.png + images/mcw/at1e1r.png + images/mcw/at2e1r.png + images/mcw/atailv.png + images/mcw/aw0a0f.png + images/mcw/aw1a0f.png + images/mcw/aw1a1f.png + images/mcw/aw1a2f.png + images/mcw/aw2a0f.png + images/mcw/aw2a1f.png + images/mcw/aw2a2f.png + images/mcw/h90.png + images/mcw/h120.png + images/mcw/h120x.png + images/mcw/h140.png + images/mcw/hfbl.png + images/mcw/htailg.png + images/mcw/htailng.png + images/mcw/htailfblg.png + images/mcw/htailfblng.png + images/mcw/gt1e1r.png + images/mcw/gt2e1r.png + images/mcw/gtailv.png + images/mcw/gw0t0a0f0s.png + images/mcw/gw0t1a0f0s.png + images/mcw/gw0t1a0f1s.png + images/mcw/gw0t1a0f2s.png + images/mcw/gw0t1a1f0s.png + images/mcw/gw0t1a1f1s.png + images/mcw/gw0t1a1f2s.png + images/mcw/gw0t1a2f0s.png + images/mcw/gw0t1a2f1s.png + images/mcw/gw0t1a2f2s.png + images/mcw/gw0t2a0f0s.png + images/mcw/gw0t2a0f1s.png + images/mcw/gw0t2a0f2s.png + images/mcw/gw0t2a1f0s.png + images/mcw/gw0t2a1f1s.png + images/mcw/gw0t2a1f2s.png + images/mcw/gw0t2a2f0s.png + images/mcw/gw0t2a2f1s.png + images/mcw/gw0t2a2f2s.png + images/mcw/gw1t0a0f0s.png + images/mcw/gw1t1a0f0s.png + images/mcw/gw1t1a0f1s.png + images/mcw/gw1t1a0f2s.png + images/mcw/gw1t1a1f0s.png + images/mcw/gw1t1a1f1s.png + images/mcw/gw1t1a1f2s.png + images/mcw/gw1t1a2f0s.png + images/mcw/gw1t1a2f1s.png + images/mcw/gw1t1a2f2s.png + images/mcw/gw1t2a0f0s.png + images/mcw/gw1t2a0f1s.png + images/mcw/gw1t2a0f2s.png + images/mcw/gw1t2a1f0s.png + images/mcw/gw1t2a1f1s.png + images/mcw/gw1t2a1f2s.png + images/mcw/gw1t2a2f0s.png + images/mcw/gw1t2a2f1s.png + images/mcw/gw1t2a2f2s.png + images/mcw/db0t2e0f0r.png + images/mcw/db0t2e0f1r.png + images/mcw/db0t2e0f2r.png + images/mcw/db0t2e1f0r.png + images/mcw/db0t2e1f1r.png + images/mcw/db0t2e1f2r.png + images/mcw/db0t2e2f0r.png + images/mcw/db0t2e2f1r.png + images/mcw/db0t2e2f2r.png + images/mcw/db1t2e0f0r.png + images/mcw/db1t2e0f1r.png + images/mcw/db1t2e0f2r.png + images/mcw/db1t2e1f0r.png + images/mcw/db1t2e1f1r.png + images/mcw/db1t2e1f2r.png + images/mcw/db1t2e2f0r.png + images/mcw/db1t2e2f1r.png + images/mcw/db1t2e2f2r.png + images/mcw/dt0t2e0f0r.png + images/mcw/dt0t2e0f1r.png + images/mcw/dt0t2e0f2r.png + images/mcw/dt0t2e1f0r.png + images/mcw/dt0t2e1f1r.png + images/mcw/dt0t2e1f2r.png + images/mcw/dt0t2e2f0r.png + images/mcw/dt0t2e2f1r.png + images/mcw/dt0t2e2f2r.png + images/mcw/dt1t2e0f0r.png + images/mcw/dt1t2e0f1r.png + images/mcw/dt1t2e0f2r.png + images/mcw/dt1t2e1f0r.png + images/mcw/dt1t2e1f1r.png + images/mcw/dt1t2e1f2r.png + images/mcw/dt1t2e2f0r.png + images/mcw/dt1t2e2f1r.png + images/mcw/dt1t2e2f2r.png + images/library/00001.png + images/library/00002.png + images/library/00003.png + images/library/00004.png + images/library/00005.png + images/library/00006.png + images/library/00007.png + images/library/00008.png + images/library/00009.png + images/library/00010.png + images/library/00011.png + images/library/00012.png + images/library/00013.png + images/library/00014.png + images/library/00015.png + images/library/00016.png + images/library/00017.png + images/library/00018.png + images/library/00019.png + images/library/00020.png + images/library/00050.png + images/library/00051.png + images/library/00052.png + images/library/00053.png + images/library/00054.png + images/library/00055.png + images/library/00056.png + images/library/00057.png + images/library/00058.png + images/library/00059.png + images/library/00060.png + images/library/00061.png + images/library/00062.png + images/library/00063.png + images/library/00064.png + images/library/00065.png + images/library/00066.png + images/library/00100.png + images/library/00101.png + images/library/00102.png + images/library/00103.png + images/library/00104.png + images/library/00105.png + images/library/00106.png + images/library/00201.png + images/library/00202.png + images/library/00203.png + images/library/00204.png + images/library/00301.png + images/library/00302.png + images/library/00303.png + images/library/00304.png + images/library/00401.png + images/library/00402.png + images/library/00403.png + images/library/00404.png + images/library/00501.png + images/library/10001.png + images/library/10002.png + images/library/10003.png + images/library/10101.png + images/library/10102.png + images/library/10103.png + images/library/10501.png + images/library/10502.png + images/library/10503.png + images/library/10504.png + images/library/10505.png + images/library/10506.png + images/library/10508.png + images/library/10601.png + images/library/10701.png + images/library/10702.png + images/library/10801.png + images/library/10802.png + themes/monochrome/16/paintbrush.png + themes/monochrome/16/open.png + themes/monochrome/16/edit.png + themes/monochrome/16/information.png + themes/monochrome/16/configure.png + themes/monochrome/16/list.png + themes/monochrome/16/wizard.png + themes/monochrome/16/logs.png + themes/monochrome/16/new.png + themes/monochrome/16/save.png + themes/monochrome/16/recentdocument.png + themes/monochrome/16/simulate.png + themes/monochrome/16/changelog.png + themes/monochrome/16/copy.png + themes/monochrome/16/write_flash.png + themes/monochrome/16/read_eeprom_file.png + themes/monochrome/16/clear.png + themes/monochrome/16/play.png + themes/monochrome/16/fuses.png + themes/monochrome/16/arrow-right.png + themes/monochrome/16/exit.png + themes/monochrome/16/moveup.png + themes/monochrome/16/read_eeprom.png + themes/monochrome/16/cut.png + themes/monochrome/16/arrow-left.png + themes/monochrome/16/write_eeprom_file.png + themes/monochrome/16/library.png + themes/monochrome/16/profiles.png + themes/monochrome/16/paste.png + themes/monochrome/16/print.png + themes/monochrome/16/compare.png + themes/monochrome/16/saveas.png + themes/monochrome/16/apppreferences.png + themes/monochrome/16/fwpreferences.png + themes/monochrome/16/movedown.png + themes/monochrome/16/currentmodel.png + themes/monochrome/16/read_flash.png + themes/monochrome/16/duplicate.png + themes/monochrome/16/add.png + themes/monochrome/16/update.png + themes/monochrome/16/contributors.png + themes/monochrome/16/stop.png + themes/monochrome/16/write_eeprom.png + themes/monochrome/24/paintbrush.png + themes/monochrome/24/open.png + themes/monochrome/24/edit.png + themes/monochrome/24/information.png + themes/monochrome/24/configure.png + themes/monochrome/24/list.png + themes/monochrome/24/wizard.png + themes/monochrome/24/logs.png + themes/monochrome/24/new.png + themes/monochrome/24/save.png + themes/monochrome/24/recentdocument.png + themes/monochrome/24/simulate.png + themes/monochrome/24/changelog.png + themes/monochrome/24/copy.png + themes/monochrome/24/write_flash.png + themes/monochrome/24/read_eeprom_file.png + themes/monochrome/24/clear.png + themes/monochrome/24/play.png + themes/monochrome/24/fuses.png + themes/monochrome/24/arrow-right.png + themes/monochrome/24/exit.png + themes/monochrome/24/moveup.png + themes/monochrome/24/read_eeprom.png + themes/monochrome/24/cut.png + themes/monochrome/24/arrow-left.png + themes/monochrome/24/write_eeprom_file.png + themes/monochrome/24/library.png + themes/monochrome/24/profiles.png + themes/monochrome/24/paste.png + themes/monochrome/24/print.png + themes/monochrome/24/compare.png + themes/monochrome/24/saveas.png + themes/monochrome/24/apppreferences.png + themes/monochrome/24/fwpreferences.png + themes/monochrome/24/movedown.png + themes/monochrome/24/currentmodel.png + themes/monochrome/24/read_flash.png + themes/monochrome/24/duplicate.png + themes/monochrome/24/add.png + themes/monochrome/24/update.png + themes/monochrome/24/contributors.png + themes/monochrome/24/stop.png + themes/monochrome/24/write_eeprom.png + themes/monochrome/32/paintbrush.png + themes/monochrome/32/open.png + themes/monochrome/32/edit.png + themes/monochrome/32/information.png + themes/monochrome/32/configure.png + themes/monochrome/32/list.png + themes/monochrome/32/wizard.png + themes/monochrome/32/logs.png + themes/monochrome/32/new.png + themes/monochrome/32/save.png + themes/monochrome/32/recentdocument.png + themes/monochrome/32/simulate.png + themes/monochrome/32/changelog.png + themes/monochrome/32/copy.png + themes/monochrome/32/write_flash.png + themes/monochrome/32/read_eeprom_file.png + themes/monochrome/32/clear.png + themes/monochrome/32/play.png + themes/monochrome/32/fuses.png + themes/monochrome/32/arrow-right.png + themes/monochrome/32/exit.png + themes/monochrome/32/moveup.png + themes/monochrome/32/read_eeprom.png + themes/monochrome/32/cut.png + themes/monochrome/32/arrow-left.png + themes/monochrome/32/write_eeprom_file.png + themes/monochrome/32/library.png + themes/monochrome/32/profiles.png + themes/monochrome/32/paste.png + themes/monochrome/32/print.png + themes/monochrome/32/compare.png + themes/monochrome/32/saveas.png + themes/monochrome/32/apppreferences.png + themes/monochrome/32/fwpreferences.png + themes/monochrome/32/movedown.png + themes/monochrome/32/currentmodel.png + themes/monochrome/32/read_flash.png + themes/monochrome/32/duplicate.png + themes/monochrome/32/add.png + themes/monochrome/32/update.png + themes/monochrome/32/contributors.png + themes/monochrome/32/stop.png + themes/monochrome/32/write_eeprom.png + themes/monochrome/48/paintbrush.png + themes/monochrome/48/open.png + themes/monochrome/48/edit.png + themes/monochrome/48/information.png + themes/monochrome/48/configure.png + themes/monochrome/48/list.png + themes/monochrome/48/wizard.png + themes/monochrome/48/logs.png + themes/monochrome/48/new.png + themes/monochrome/48/save.png + themes/monochrome/48/recentdocument.png + themes/monochrome/48/simulate.png + themes/monochrome/48/changelog.png + themes/monochrome/48/copy.png + themes/monochrome/48/write_flash.png + themes/monochrome/48/read_eeprom_file.png + themes/monochrome/48/clear.png + themes/monochrome/48/play.png + themes/monochrome/48/fuses.png + themes/monochrome/48/arrow-right.png + themes/monochrome/48/exit.png + themes/monochrome/48/moveup.png + themes/monochrome/48/read_eeprom.png + themes/monochrome/48/cut.png + themes/monochrome/48/arrow-left.png + themes/monochrome/48/write_eeprom_file.png + themes/monochrome/48/library.png + themes/monochrome/48/profiles.png + themes/monochrome/48/paste.png + themes/monochrome/48/print.png + themes/monochrome/48/compare.png + themes/monochrome/48/saveas.png + themes/monochrome/48/apppreferences.png + themes/monochrome/48/fwpreferences.png + themes/monochrome/48/movedown.png + themes/monochrome/48/currentmodel.png + themes/monochrome/48/read_flash.png + themes/monochrome/48/duplicate.png + themes/monochrome/48/add.png + themes/monochrome/48/update.png + themes/monochrome/48/contributors.png + themes/monochrome/48/stop.png + themes/monochrome/48/write_eeprom.png + themes/classic/16/paintbrush.png + themes/classic/16/open.png + themes/classic/16/edit.png + themes/classic/16/information.png + themes/classic/16/configure.png + themes/classic/16/list.png + themes/classic/16/wizard.png + themes/classic/16/logs.png + themes/classic/16/new.png + themes/classic/16/save.png + themes/classic/16/recentdocument.png + themes/classic/16/simulate.png + themes/classic/16/changelog.png + themes/classic/16/copy.png + themes/classic/16/write_flash.png + themes/classic/16/read_eeprom_file.png + themes/classic/16/clear.png + themes/classic/16/play.png + themes/classic/16/fuses.png + themes/classic/16/arrow-right.png + themes/classic/16/exit.png + themes/classic/16/moveup.png + themes/classic/16/read_eeprom.png + themes/classic/16/cut.png + themes/classic/16/arrow-left.png + themes/classic/16/write_eeprom_file.png + themes/classic/16/library.png + themes/classic/16/profiles.png + themes/classic/16/paste.png + themes/classic/16/print.png + themes/classic/16/compare.png + themes/classic/16/saveas.png + themes/classic/16/apppreferences.png + themes/classic/16/fwpreferences.png + themes/classic/16/movedown.png + themes/classic/16/currentmodel.png + themes/classic/16/read_flash.png + themes/classic/16/duplicate.png + themes/classic/16/add.png + themes/classic/16/update.png + themes/classic/16/contributors.png + themes/classic/16/stop.png + themes/classic/16/write_eeprom.png + themes/classic/24/paintbrush.png + themes/classic/24/open.png + themes/classic/24/edit.png + themes/classic/24/information.png + themes/classic/24/configure.png + themes/classic/24/list.png + themes/classic/24/wizard.png + themes/classic/24/logs.png + themes/classic/24/new.png + themes/classic/24/save.png + themes/classic/24/recentdocument.png + themes/classic/24/simulate.png + themes/classic/24/changelog.png + themes/classic/24/copy.png + themes/classic/24/write_flash.png + themes/classic/24/read_eeprom_file.png + themes/classic/24/clear.png + themes/classic/24/play.png + themes/classic/24/fuses.png + themes/classic/24/arrow-right.png + themes/classic/24/exit.png + themes/classic/24/moveup.png + themes/classic/24/read_eeprom.png + themes/classic/24/cut.png + themes/classic/24/arrow-left.png + themes/classic/24/write_eeprom_file.png + themes/classic/24/library.png + themes/classic/24/profiles.png + themes/classic/24/paste.png + themes/classic/24/print.png + themes/classic/24/compare.png + themes/classic/24/saveas.png + themes/classic/24/apppreferences.png + themes/classic/24/fwpreferences.png + themes/classic/24/movedown.png + themes/classic/24/currentmodel.png + themes/classic/24/read_flash.png + themes/classic/24/duplicate.png + themes/classic/24/add.png + themes/classic/24/update.png + themes/classic/24/contributors.png + themes/classic/24/stop.png + themes/classic/24/write_eeprom.png + themes/classic/32/paintbrush.png + themes/classic/32/open.png + themes/classic/32/edit.png + themes/classic/32/information.png + themes/classic/32/configure.png + themes/classic/32/list.png + themes/classic/32/wizard.png + themes/classic/32/logs.png + themes/classic/32/new.png + themes/classic/32/save.png + themes/classic/32/recentdocument.png + themes/classic/32/simulate.png + themes/classic/32/changelog.png + themes/classic/32/copy.png + themes/classic/32/write_flash.png + themes/classic/32/read_eeprom_file.png + themes/classic/32/clear.png + themes/classic/32/play.png + themes/classic/32/fuses.png + themes/classic/32/arrow-right.png + themes/classic/32/exit.png + themes/classic/32/moveup.png + themes/classic/32/read_eeprom.png + themes/classic/32/cut.png + themes/classic/32/arrow-left.png + themes/classic/32/write_eeprom_file.png + themes/classic/32/library.png + themes/classic/32/profiles.png + themes/classic/32/paste.png + themes/classic/32/print.png + themes/classic/32/compare.png + themes/classic/32/saveas.png + themes/classic/32/apppreferences.png + themes/classic/32/fwpreferences.png + themes/classic/32/movedown.png + themes/classic/32/currentmodel.png + themes/classic/32/read_flash.png + themes/classic/32/duplicate.png + themes/classic/32/add.png + themes/classic/32/update.png + themes/classic/32/contributors.png + themes/classic/32/stop.png + themes/classic/32/write_eeprom.png + themes/classic/48/paintbrush.png + themes/classic/48/open.png + themes/classic/48/edit.png + themes/classic/48/information.png + themes/classic/48/configure.png + themes/classic/48/list.png + themes/classic/48/wizard.png + themes/classic/48/logs.png + themes/classic/48/new.png + themes/classic/48/save.png + themes/classic/48/recentdocument.png + themes/classic/48/simulate.png + themes/classic/48/changelog.png + themes/classic/48/copy.png + themes/classic/48/write_flash.png + themes/classic/48/read_eeprom_file.png + themes/classic/48/clear.png + themes/classic/48/play.png + themes/classic/48/fuses.png + themes/classic/48/arrow-right.png + themes/classic/48/exit.png + themes/classic/48/moveup.png + themes/classic/48/read_eeprom.png + themes/classic/48/cut.png + themes/classic/48/arrow-left.png + themes/classic/48/write_eeprom_file.png + themes/classic/48/library.png + themes/classic/48/profiles.png + themes/classic/48/paste.png + themes/classic/48/print.png + themes/classic/48/compare.png + themes/classic/48/saveas.png + themes/classic/48/apppreferences.png + themes/classic/48/fwpreferences.png + themes/classic/48/movedown.png + themes/classic/48/currentmodel.png + themes/classic/48/read_flash.png + themes/classic/48/duplicate.png + themes/classic/48/add.png + themes/classic/48/update.png + themes/classic/48/contributors.png + themes/classic/48/stop.png + themes/classic/48/write_eeprom.png + themes/monoblue/16/paintbrush.png + themes/monoblue/16/open.png + themes/monoblue/16/edit.png + themes/monoblue/16/information.png + themes/monoblue/16/configure.png + themes/monoblue/16/list.png + themes/monoblue/16/wizard.png + themes/monoblue/16/logs.png + themes/monoblue/16/new.png + themes/monoblue/16/save.png + themes/monoblue/16/recentdocument.png + themes/monoblue/16/simulate.png + themes/monoblue/16/changelog.png + themes/monoblue/16/copy.png + themes/monoblue/16/write_flash.png + themes/monoblue/16/read_eeprom_file.png + themes/monoblue/16/clear.png + themes/monoblue/16/play.png + themes/monoblue/16/fuses.png + themes/monoblue/16/arrow-right.png + themes/monoblue/16/exit.png + themes/monoblue/16/moveup.png + themes/monoblue/16/read_eeprom.png + themes/monoblue/16/cut.png + themes/monoblue/16/arrow-left.png + themes/monoblue/16/write_eeprom_file.png + themes/monoblue/16/library.png + themes/monoblue/16/profiles.png + themes/monoblue/16/paste.png + themes/monoblue/16/print.png + themes/monoblue/16/compare.png + themes/monoblue/16/saveas.png + themes/monoblue/16/apppreferences.png + themes/monoblue/16/fwpreferences.png + themes/monoblue/16/movedown.png + themes/monoblue/16/currentmodel.png + themes/monoblue/16/read_flash.png + themes/monoblue/16/duplicate.png + themes/monoblue/16/add.png + themes/monoblue/16/update.png + themes/monoblue/16/contributors.png + themes/monoblue/16/stop.png + themes/monoblue/16/write_eeprom.png + themes/monoblue/24/paintbrush.png + themes/monoblue/24/open.png + themes/monoblue/24/edit.png + themes/monoblue/24/information.png + themes/monoblue/24/configure.png + themes/monoblue/24/list.png + themes/monoblue/24/wizard.png + themes/monoblue/24/logs.png + themes/monoblue/24/new.png + themes/monoblue/24/save.png + themes/monoblue/24/recentdocument.png + themes/monoblue/24/simulate.png + themes/monoblue/24/changelog.png + themes/monoblue/24/copy.png + themes/monoblue/24/write_flash.png + themes/monoblue/24/read_eeprom_file.png + themes/monoblue/24/clear.png + themes/monoblue/24/play.png + themes/monoblue/24/fuses.png + themes/monoblue/24/arrow-right.png + themes/monoblue/24/exit.png + themes/monoblue/24/moveup.png + themes/monoblue/24/read_eeprom.png + themes/monoblue/24/cut.png + themes/monoblue/24/arrow-left.png + themes/monoblue/24/write_eeprom_file.png + themes/monoblue/24/library.png + themes/monoblue/24/profiles.png + themes/monoblue/24/paste.png + themes/monoblue/24/print.png + themes/monoblue/24/compare.png + themes/monoblue/24/saveas.png + themes/monoblue/24/apppreferences.png + themes/monoblue/24/fwpreferences.png + themes/monoblue/24/movedown.png + themes/monoblue/24/currentmodel.png + themes/monoblue/24/read_flash.png + themes/monoblue/24/duplicate.png + themes/monoblue/24/add.png + themes/monoblue/24/update.png + themes/monoblue/24/contributors.png + themes/monoblue/24/stop.png + themes/monoblue/24/write_eeprom.png + themes/monoblue/32/paintbrush.png + themes/monoblue/32/open.png + themes/monoblue/32/edit.png + themes/monoblue/32/information.png + themes/monoblue/32/configure.png + themes/monoblue/32/list.png + themes/monoblue/32/wizard.png + themes/monoblue/32/logs.png + themes/monoblue/32/new.png + themes/monoblue/32/save.png + themes/monoblue/32/recentdocument.png + themes/monoblue/32/simulate.png + themes/monoblue/32/changelog.png + themes/monoblue/32/copy.png + themes/monoblue/32/write_flash.png + themes/monoblue/32/read_eeprom_file.png + themes/monoblue/32/clear.png + themes/monoblue/32/play.png + themes/monoblue/32/fuses.png + themes/monoblue/32/arrow-right.png + themes/monoblue/32/exit.png + themes/monoblue/32/moveup.png + themes/monoblue/32/read_eeprom.png + themes/monoblue/32/cut.png + themes/monoblue/32/arrow-left.png + themes/monoblue/32/write_eeprom_file.png + themes/monoblue/32/library.png + themes/monoblue/32/profiles.png + themes/monoblue/32/paste.png + themes/monoblue/32/print.png + themes/monoblue/32/compare.png + themes/monoblue/32/saveas.png + themes/monoblue/32/apppreferences.png + themes/monoblue/32/fwpreferences.png + themes/monoblue/32/movedown.png + themes/monoblue/32/currentmodel.png + themes/monoblue/32/read_flash.png + themes/monoblue/32/duplicate.png + themes/monoblue/32/add.png + themes/monoblue/32/update.png + themes/monoblue/32/contributors.png + themes/monoblue/32/stop.png + themes/monoblue/32/write_eeprom.png + themes/monoblue/48/paintbrush.png + themes/monoblue/48/open.png + themes/monoblue/48/edit.png + themes/monoblue/48/information.png + themes/monoblue/48/configure.png + themes/monoblue/48/list.png + themes/monoblue/48/wizard.png + themes/monoblue/48/logs.png + themes/monoblue/48/new.png + themes/monoblue/48/save.png + themes/monoblue/48/recentdocument.png + themes/monoblue/48/simulate.png + themes/monoblue/48/changelog.png + themes/monoblue/48/copy.png + themes/monoblue/48/write_flash.png + themes/monoblue/48/read_eeprom_file.png + themes/monoblue/48/clear.png + themes/monoblue/48/play.png + themes/monoblue/48/fuses.png + themes/monoblue/48/arrow-right.png + themes/monoblue/48/exit.png + themes/monoblue/48/moveup.png + themes/monoblue/48/read_eeprom.png + themes/monoblue/48/cut.png + themes/monoblue/48/arrow-left.png + themes/monoblue/48/write_eeprom_file.png + themes/monoblue/48/library.png + themes/monoblue/48/profiles.png + themes/monoblue/48/paste.png + themes/monoblue/48/print.png + themes/monoblue/48/compare.png + themes/monoblue/48/saveas.png + themes/monoblue/48/apppreferences.png + themes/monoblue/48/fwpreferences.png + themes/monoblue/48/movedown.png + themes/monoblue/48/currentmodel.png + themes/monoblue/48/read_flash.png + themes/monoblue/48/duplicate.png + themes/monoblue/48/add.png + themes/monoblue/48/update.png + themes/monoblue/48/contributors.png + themes/monoblue/48/stop.png + themes/monoblue/48/write_eeprom.png + themes/monowhite/16/paintbrush.png + themes/monowhite/16/open.png + themes/monowhite/16/edit.png + themes/monowhite/16/information.png + themes/monowhite/16/configure.png + themes/monowhite/16/list.png + themes/monowhite/16/wizard.png + themes/monowhite/16/logs.png + themes/monowhite/16/new.png + themes/monowhite/16/save.png + themes/monowhite/16/recentdocument.png + themes/monowhite/16/simulate.png + themes/monowhite/16/changelog.png + themes/monowhite/16/copy.png + themes/monowhite/16/write_flash.png + themes/monowhite/16/read_eeprom_file.png + themes/monowhite/16/clear.png + themes/monowhite/16/play.png + themes/monowhite/16/fuses.png + themes/monowhite/16/arrow-right.png + themes/monowhite/16/exit.png + themes/monowhite/16/moveup.png + themes/monowhite/16/read_eeprom.png + themes/monowhite/16/cut.png + themes/monowhite/16/arrow-left.png + themes/monowhite/16/write_eeprom_file.png + themes/monowhite/16/library.png + themes/monowhite/16/profiles.png + themes/monowhite/16/paste.png + themes/monowhite/16/print.png + themes/monowhite/16/compare.png + themes/monowhite/16/saveas.png + themes/monowhite/16/apppreferences.png + themes/monowhite/16/fwpreferences.png + themes/monowhite/16/movedown.png + themes/monowhite/16/currentmodel.png + themes/monowhite/16/read_flash.png + themes/monowhite/16/duplicate.png + themes/monowhite/16/add.png + themes/monowhite/16/update.png + themes/monowhite/16/contributors.png + themes/monowhite/16/stop.png + themes/monowhite/16/write_eeprom.png + themes/monowhite/24/paintbrush.png + themes/monowhite/24/open.png + themes/monowhite/24/edit.png + themes/monowhite/24/information.png + themes/monowhite/24/configure.png + themes/monowhite/24/list.png + themes/monowhite/24/wizard.png + themes/monowhite/24/logs.png + themes/monowhite/24/new.png + themes/monowhite/24/save.png + themes/monowhite/24/recentdocument.png + themes/monowhite/24/simulate.png + themes/monowhite/24/changelog.png + themes/monowhite/24/copy.png + themes/monowhite/24/write_flash.png + themes/monowhite/24/read_eeprom_file.png + themes/monowhite/24/clear.png + themes/monowhite/24/play.png + themes/monowhite/24/fuses.png + themes/monowhite/24/arrow-right.png + themes/monowhite/24/exit.png + themes/monowhite/24/moveup.png + themes/monowhite/24/read_eeprom.png + themes/monowhite/24/cut.png + themes/monowhite/24/arrow-left.png + themes/monowhite/24/write_eeprom_file.png + themes/monowhite/24/library.png + themes/monowhite/24/profiles.png + themes/monowhite/24/paste.png + themes/monowhite/24/print.png + themes/monowhite/24/compare.png + themes/monowhite/24/saveas.png + themes/monowhite/24/apppreferences.png + themes/monowhite/24/fwpreferences.png + themes/monowhite/24/movedown.png + themes/monowhite/24/currentmodel.png + themes/monowhite/24/read_flash.png + themes/monowhite/24/duplicate.png + themes/monowhite/24/add.png + themes/monowhite/24/update.png + themes/monowhite/24/contributors.png + themes/monowhite/24/stop.png + themes/monowhite/24/write_eeprom.png + themes/monowhite/32/paintbrush.png + themes/monowhite/32/open.png + themes/monowhite/32/edit.png + themes/monowhite/32/information.png + themes/monowhite/32/configure.png + themes/monowhite/32/list.png + themes/monowhite/32/wizard.png + themes/monowhite/32/logs.png + themes/monowhite/32/new.png + themes/monowhite/32/save.png + themes/monowhite/32/recentdocument.png + themes/monowhite/32/simulate.png + themes/monowhite/32/changelog.png + themes/monowhite/32/copy.png + themes/monowhite/32/write_flash.png + themes/monowhite/32/read_eeprom_file.png + themes/monowhite/32/clear.png + themes/monowhite/32/play.png + themes/monowhite/32/fuses.png + themes/monowhite/32/arrow-right.png + themes/monowhite/32/exit.png + themes/monowhite/32/moveup.png + themes/monowhite/32/read_eeprom.png + themes/monowhite/32/cut.png + themes/monowhite/32/arrow-left.png + themes/monowhite/32/write_eeprom_file.png + themes/monowhite/32/library.png + themes/monowhite/32/profiles.png + themes/monowhite/32/paste.png + themes/monowhite/32/print.png + themes/monowhite/32/compare.png + themes/monowhite/32/saveas.png + themes/monowhite/32/apppreferences.png + themes/monowhite/32/fwpreferences.png + themes/monowhite/32/movedown.png + themes/monowhite/32/currentmodel.png + themes/monowhite/32/read_flash.png + themes/monowhite/32/duplicate.png + themes/monowhite/32/add.png + themes/monowhite/32/update.png + themes/monowhite/32/contributors.png + themes/monowhite/32/stop.png + themes/monowhite/32/write_eeprom.png + themes/monowhite/48/paintbrush.png + themes/monowhite/48/open.png + themes/monowhite/48/edit.png + themes/monowhite/48/information.png + themes/monowhite/48/configure.png + themes/monowhite/48/list.png + themes/monowhite/48/wizard.png + themes/monowhite/48/logs.png + themes/monowhite/48/new.png + themes/monowhite/48/save.png + themes/monowhite/48/recentdocument.png + themes/monowhite/48/simulate.png + themes/monowhite/48/changelog.png + themes/monowhite/48/copy.png + themes/monowhite/48/write_flash.png + themes/monowhite/48/read_eeprom_file.png + themes/monowhite/48/clear.png + themes/monowhite/48/play.png + themes/monowhite/48/fuses.png + themes/monowhite/48/arrow-right.png + themes/monowhite/48/exit.png + themes/monowhite/48/moveup.png + themes/monowhite/48/read_eeprom.png + themes/monowhite/48/cut.png + themes/monowhite/48/arrow-left.png + themes/monowhite/48/write_eeprom_file.png + themes/monowhite/48/library.png + themes/monowhite/48/profiles.png + themes/monowhite/48/paste.png + themes/monowhite/48/print.png + themes/monowhite/48/compare.png + themes/monowhite/48/saveas.png + themes/monowhite/48/apppreferences.png + themes/monowhite/48/fwpreferences.png + themes/monowhite/48/movedown.png + themes/monowhite/48/currentmodel.png + themes/monowhite/48/read_flash.png + themes/monowhite/48/duplicate.png + themes/monowhite/48/add.png + themes/monowhite/48/update.png + themes/monowhite/48/contributors.png + themes/monowhite/48/stop.png + themes/monowhite/48/write_eeprom.png + themes/yerico/16/paintbrush.png + themes/yerico/16/open.png + themes/yerico/16/edit.png + themes/yerico/16/information.png + themes/yerico/16/configure.png + themes/yerico/16/list.png + themes/yerico/16/wizard.png + themes/yerico/16/logs.png + themes/yerico/16/new.png + themes/yerico/16/save.png + themes/yerico/16/recentdocument.png + themes/yerico/16/simulate.png + themes/yerico/16/changelog.png + themes/yerico/16/copy.png + themes/yerico/16/write_flash.png + themes/yerico/16/read_eeprom_file.png + themes/yerico/16/clear.png + themes/yerico/16/play.png + themes/yerico/16/fuses.png + themes/yerico/16/arrow-right.png + themes/yerico/16/exit.png + themes/yerico/16/moveup.png + themes/yerico/16/read_eeprom.png + themes/yerico/16/cut.png + themes/yerico/16/arrow-left.png + themes/yerico/16/write_eeprom_file.png + themes/yerico/16/library.png + themes/yerico/16/profiles.png + themes/yerico/16/paste.png + themes/yerico/16/print.png + themes/yerico/16/compare.png + themes/yerico/16/saveas.png + themes/yerico/16/apppreferences.png + themes/yerico/16/fwpreferences.png + themes/yerico/16/movedown.png + themes/yerico/16/currentmodel.png + themes/yerico/16/read_flash.png + themes/yerico/16/duplicate.png + themes/yerico/16/add.png + themes/yerico/16/update.png + themes/yerico/16/contributors.png + themes/yerico/16/stop.png + themes/yerico/16/write_eeprom.png + themes/yerico/24/paintbrush.png + themes/yerico/24/open.png + themes/yerico/24/edit.png + themes/yerico/24/information.png + themes/yerico/24/configure.png + themes/yerico/24/list.png + themes/yerico/24/wizard.png + themes/yerico/24/logs.png + themes/yerico/24/new.png + themes/yerico/24/save.png + themes/yerico/24/recentdocument.png + themes/yerico/24/simulate.png + themes/yerico/24/changelog.png + themes/yerico/24/copy.png + themes/yerico/24/write_flash.png + themes/yerico/24/read_eeprom_file.png + themes/yerico/24/clear.png + themes/yerico/24/play.png + themes/yerico/24/fuses.png + themes/yerico/24/arrow-right.png + themes/yerico/24/exit.png + themes/yerico/24/moveup.png + themes/yerico/24/read_eeprom.png + themes/yerico/24/cut.png + themes/yerico/24/arrow-left.png + themes/yerico/24/write_eeprom_file.png + themes/yerico/24/library.png + themes/yerico/24/profiles.png + themes/yerico/24/paste.png + themes/yerico/24/print.png + themes/yerico/24/compare.png + themes/yerico/24/saveas.png + themes/yerico/24/apppreferences.png + themes/yerico/24/fwpreferences.png + themes/yerico/24/movedown.png + themes/yerico/24/currentmodel.png + themes/yerico/24/read_flash.png + themes/yerico/24/duplicate.png + themes/yerico/24/add.png + themes/yerico/24/update.png + themes/yerico/24/contributors.png + themes/yerico/24/stop.png + themes/yerico/24/write_eeprom.png + themes/yerico/32/paintbrush.png + themes/yerico/32/open.png + themes/yerico/32/edit.png + themes/yerico/32/information.png + themes/yerico/32/configure.png + themes/yerico/32/list.png + themes/yerico/32/wizard.png + themes/yerico/32/logs.png + themes/yerico/32/new.png + themes/yerico/32/save.png + themes/yerico/32/recentdocument.png + themes/yerico/32/simulate.png + themes/yerico/32/changelog.png + themes/yerico/32/copy.png + themes/yerico/32/write_flash.png + themes/yerico/32/read_eeprom_file.png + themes/yerico/32/clear.png + themes/yerico/32/play.png + themes/yerico/32/fuses.png + themes/yerico/32/arrow-right.png + themes/yerico/32/exit.png + themes/yerico/32/moveup.png + themes/yerico/32/read_eeprom.png + themes/yerico/32/cut.png + themes/yerico/32/arrow-left.png + themes/yerico/32/write_eeprom_file.png + themes/yerico/32/library.png + themes/yerico/32/profiles.png + themes/yerico/32/paste.png + themes/yerico/32/print.png + themes/yerico/32/compare.png + themes/yerico/32/saveas.png + themes/yerico/32/apppreferences.png + themes/yerico/32/fwpreferences.png + themes/yerico/32/movedown.png + themes/yerico/32/currentmodel.png + themes/yerico/32/read_flash.png + themes/yerico/32/duplicate.png + themes/yerico/32/add.png + themes/yerico/32/update.png + themes/yerico/32/contributors.png + themes/yerico/32/stop.png + themes/yerico/32/write_eeprom.png + themes/yerico/48/paintbrush.png + themes/yerico/48/open.png + themes/yerico/48/edit.png + themes/yerico/48/information.png + themes/yerico/48/configure.png + themes/yerico/48/list.png + themes/yerico/48/wizard.png + themes/yerico/48/logs.png + themes/yerico/48/new.png + themes/yerico/48/save.png + themes/yerico/48/recentdocument.png + themes/yerico/48/simulate.png + themes/yerico/48/changelog.png + themes/yerico/48/copy.png + themes/yerico/48/write_flash.png + themes/yerico/48/read_eeprom_file.png + themes/yerico/48/clear.png + themes/yerico/48/play.png + themes/yerico/48/fuses.png + themes/yerico/48/arrow-right.png + themes/yerico/48/exit.png + themes/yerico/48/moveup.png + themes/yerico/48/read_eeprom.png + themes/yerico/48/cut.png + themes/yerico/48/arrow-left.png + themes/yerico/48/write_eeprom_file.png + themes/yerico/48/library.png + themes/yerico/48/profiles.png + themes/yerico/48/paste.png + themes/yerico/48/print.png + themes/yerico/48/compare.png + themes/yerico/48/saveas.png + themes/yerico/48/apppreferences.png + themes/yerico/48/fwpreferences.png + themes/yerico/48/movedown.png + themes/yerico/48/currentmodel.png + themes/yerico/48/read_flash.png + themes/yerico/48/duplicate.png + themes/yerico/48/add.png + themes/yerico/48/update.png + themes/yerico/48/contributors.png + themes/yerico/48/stop.png + themes/yerico/48/write_eeprom.png + + diff --git a/companion/src/companion9x.desktop b/companion/src/companion9x.desktop deleted file mode 100644 index e50e1551a..000000000 --- a/companion/src/companion9x.desktop +++ /dev/null @@ -1,11 +0,0 @@ -[Desktop Entry] -Type=Application -Encoding=UTF-8 -Name=companion9x -GenericName=COMPANION9X -Comment=9x EeProm Editor -Icon=/usr/share/icons/companion9x.png -Exec='companion9x' -Terminal=false -StartupNotify=false -Categories=Application \ No newline at end of file diff --git a/companion/src/companion9x.png b/companion/src/companion9x.png deleted file mode 100644 index 90a961731..000000000 Binary files a/companion/src/companion9x.png and /dev/null differ diff --git a/companion/src/companion9x.qrc b/companion/src/companion9x.qrc deleted file mode 100644 index 103a05dee..000000000 --- a/companion/src/companion9x.qrc +++ /dev/null @@ -1,335 +0,0 @@ - - - icon.png - ../../CREDITS.txt - ../../DONATIONS.txt - ../releasenotes.txt - images/9xdb.png - images/9xdl.png - images/9xdr.png - images/9xdt.png - images/9xdb-bl.png - images/9xdl-bl.png - images/9xdr-bl.png - images/9xdt-bl.png - images/9xdb-gr.png - images/9xdl-gr.png - images/9xdr-gr.png - images/9xdt-gr.png - images/9xdb-or.png - images/9xdl-or.png - images/9xdr-or.png - images/9xdt-or.png - images/9xdb-yl.png - images/9xdl-yl.png - images/9xdr-yl.png - images/9xdt-yl.png - images/9xdb-rd.png - images/9xdl-rd.png - images/9xdr-rd.png - images/9xdt-rd.png - images/9xmenu.png - images/9xmenumenu.png - images/9xmenuexit.png - images/9xcurs.png - images/9xcursup.png - images/9xcursplus.png - images/9xcursmin.png - images/9xcursdown.png - images/9xcursphoto.png - images/copy.png - images/cut.png - images/currentmodel.png - images/new.png - images/open.png - images/paste.png - images/save.png - images/saveas.png - images/screenshot.png - images/splash.png - images/splasht.png - images/companion9x-title.png - images/read_eeprom.png - images/write_eeprom.png - images/write_flash.png - images/read_flash.png - images/simulate.png - images/configure.png - images/customize.png - images/print.png - images/clear.png - images/add.png - images/edit.png - images/wizard.png - images/duplicate.png - images/fuses.png - images/list.png - images/play.png - images/stop.png - images/read_eeprom_file.png - images/write_eeprom_file.png - images/moveup.png - images/movedown.png - images/update.png - images/contributors.png - images/changelog.png - images/preferences.png - images/switch_dir.png - images/exit.png - images/recentdocument.png - images/profiles.png - images/library.png - images/logs.png - images/arrow-left.png - images/arrow-right.png - images/compare.png - images/x9b0.png - images/x9l0.png - images/x9l1.png - images/x9l2.png - images/x9l3.png - images/x9l4.png - images/x9r0.png - images/x9r1.png - images/x9r2.png - images/x9r3.png - images/x9s0.png - images/x9t0.png - images/mcw/aicon.png - images/mcw/dicon.png - images/mcw/gicon.png - images/mcw/hicon.png - images/mcw/at1e1r.png - images/mcw/at2e1r.png - images/mcw/atailv.png - images/mcw/aw0a0f.png - images/mcw/aw1a0f.png - images/mcw/aw1a1f.png - images/mcw/aw1a2f.png - images/mcw/aw2a0f.png - images/mcw/aw2a1f.png - images/mcw/aw2a2f.png - images/mcw/h90.png - images/mcw/h120.png - images/mcw/h120x.png - images/mcw/h140.png - images/mcw/hfbl.png - images/mcw/htailg.png - images/mcw/htailng.png - images/mcw/htailfblg.png - images/mcw/htailfblng.png - images/mcw/gt1e1r.png - images/mcw/gt2e1r.png - images/mcw/gtailv.png - images/mcw/gw0t0a0f0s.png - images/mcw/gw0t1a0f0s.png - images/mcw/gw0t1a0f1s.png - images/mcw/gw0t1a0f2s.png - images/mcw/gw0t1a1f0s.png - images/mcw/gw0t1a1f1s.png - images/mcw/gw0t1a1f2s.png - images/mcw/gw0t1a2f0s.png - images/mcw/gw0t1a2f1s.png - images/mcw/gw0t1a2f2s.png - images/mcw/gw0t2a0f0s.png - images/mcw/gw0t2a0f1s.png - images/mcw/gw0t2a0f2s.png - images/mcw/gw0t2a1f0s.png - images/mcw/gw0t2a1f1s.png - images/mcw/gw0t2a1f2s.png - images/mcw/gw0t2a2f0s.png - images/mcw/gw0t2a2f1s.png - images/mcw/gw0t2a2f2s.png - images/mcw/gw1t0a0f0s.png - images/mcw/gw1t1a0f0s.png - images/mcw/gw1t1a0f1s.png - images/mcw/gw1t1a0f2s.png - images/mcw/gw1t1a1f0s.png - images/mcw/gw1t1a1f1s.png - images/mcw/gw1t1a1f2s.png - images/mcw/gw1t1a2f0s.png - images/mcw/gw1t1a2f1s.png - images/mcw/gw1t1a2f2s.png - images/mcw/gw1t2a0f0s.png - images/mcw/gw1t2a0f1s.png - images/mcw/gw1t2a0f2s.png - images/mcw/gw1t2a1f0s.png - images/mcw/gw1t2a1f1s.png - images/mcw/gw1t2a1f2s.png - images/mcw/gw1t2a2f0s.png - images/mcw/gw1t2a2f1s.png - images/mcw/gw1t2a2f2s.png - images/mcw/db0t2e0f0r.png - images/mcw/db0t2e0f1r.png - images/mcw/db0t2e0f2r.png - images/mcw/db0t2e1f0r.png - images/mcw/db0t2e1f1r.png - images/mcw/db0t2e1f2r.png - images/mcw/db0t2e2f0r.png - images/mcw/db0t2e2f1r.png - images/mcw/db0t2e2f2r.png - images/mcw/db1t2e0f0r.png - images/mcw/db1t2e0f1r.png - images/mcw/db1t2e0f2r.png - images/mcw/db1t2e1f0r.png - images/mcw/db1t2e1f1r.png - images/mcw/db1t2e1f2r.png - images/mcw/db1t2e2f0r.png - images/mcw/db1t2e2f1r.png - images/mcw/db1t2e2f2r.png - images/mcw/dt0t2e0f0r.png - images/mcw/dt0t2e0f1r.png - images/mcw/dt0t2e0f2r.png - images/mcw/dt0t2e1f0r.png - images/mcw/dt0t2e1f1r.png - images/mcw/dt0t2e1f2r.png - images/mcw/dt0t2e2f0r.png - images/mcw/dt0t2e2f1r.png - images/mcw/dt0t2e2f2r.png - images/mcw/dt1t2e0f0r.png - images/mcw/dt1t2e0f1r.png - images/mcw/dt1t2e0f2r.png - images/mcw/dt1t2e1f0r.png - images/mcw/dt1t2e1f1r.png - images/mcw/dt1t2e1f2r.png - images/mcw/dt1t2e2f0r.png - images/mcw/dt1t2e2f1r.png - images/mcw/dt1t2e2f2r.png - images/library/00001.png - images/library/00002.png - images/library/00003.png - images/library/00004.png - images/library/00005.png - images/library/00006.png - images/library/00007.png - images/library/00008.png - images/library/00009.png - images/library/00010.png - images/library/00011.png - images/library/00012.png - images/library/00013.png - images/library/00014.png - images/library/00015.png - images/library/00016.png - images/library/01001.png - images/library/01002.png - images/library/01003.png - images/library/01004.png - images/library/01005.png - images/library/01006.png - images/library/01007.png - images/library/01008.png - images/library/10001.png - images/library/10002.png - images/library/10003.png - images/library/10004.png - images/library/10005.png - images/library/10006.png - images/library/10007.png - images/library/10008.png - images/library/10009.png - images/library/10010.png - images/library/10011.png - images/library/10012.png - images/library/10013.png - images/library/10014.png - images/library/10015.png - images/library/10016.png - images/library/10017.png - images/library/10018.png - images/library/10019.png - images/library/10020.png - images/library/10021.png - images/library/10022.png - images/library/10023.png - images/library/10024.png - images/library/10033.png - images/library/10034.png - images/library/10035.png - images/library/10036.png - images/library/10049.png - images/library/10050.png - images/library/10051.png - images/library/10052.png - images/library/10037.png - images/library/10038.png - images/library/10039.png - images/library/10040.png - images/library/10053.png - images/library/10054.png - images/library/10055.png - images/library/10056.png - images/library/10025.png - images/library/10026.png - images/library/10027.png - images/library/10028.png - images/library/10029.png - images/library/10030.png - images/library/10031.png - images/library/10032.png - images/library/10041.png - images/library/10042.png - images/library/10043.png - images/library/10044.png - images/library/10057.png - images/library/10058.png - images/library/10059.png - images/library/10060.png - images/library/10045.png - images/library/10046.png - images/library/10047.png - images/library/10048.png - images/library/10061.png - images/library/10062.png - images/library/10063.png - images/library/10064.png - images/library/10065.png - images/library/10066.png - images/library/10067.png - images/library/10068.png - images/library/10081.png - images/library/10082.png - images/library/10083.png - images/library/10084.png - images/library/10069.png - images/library/10070.png - images/library/10071.png - images/library/10072.png - images/library/10085.png - images/library/10086.png - images/library/10087.png - images/library/10088.png - images/library/10073.png - images/library/10074.png - images/library/10075.png - images/library/10076.png - images/library/10089.png - images/library/10090.png - images/library/10091.png - images/library/10092.png - images/library/10077.png - images/library/10078.png - images/library/10079.png - images/library/10080.png - images/library/10093.png - images/library/10094.png - images/library/10095.png - images/library/10096.png - images/library/10097.png - images/library/10098.png - images/library/10099.png - images/library/10100.png - images/library/10101.png - images/library/10102.png - images/library/10103.png - images/library/10104.png - images/library/20001.png - images/library/20002.png - images/library/20003.png - images/library/20004.png - images/library/30001.png - images/library/30002.png - images/library/30003.png - images/library/30004.png - - diff --git a/companion/src/comparedialog.cpp b/companion/src/comparedialog.cpp index ded52c41c..3465037e8 100644 --- a/companion/src/comparedialog.cpp +++ b/companion/src/comparedialog.cpp @@ -21,7 +21,7 @@ public: } bool general_settings; uint8_t models_count; - uint8_t models[C9XMAX_MODELS]; + uint8_t models[C9X_MAX_MODELS]; }; compareDialog::compareDialog(QWidget *parent, GeneralSettings *gg) : @@ -29,6 +29,7 @@ compareDialog::compareDialog(QWidget *parent, GeneralSettings *gg) : ui(new Ui::compareDialog) { ui->setupUi(this); + this->setWindowIcon(CompanionIcon("compare.png")); g_eeGeneral = gg; eepromInterface = GetEepromInterface(); te = ui->textEdit; @@ -48,7 +49,7 @@ compareDialog::compareDialog(QWidget *parent, GeneralSettings *gg) : void compareDialog::dragMoveEvent(QDragMoveEvent *event) { - if (event->mimeData()->hasFormat("application/x-companion9x")) { + if (event->mimeData()->hasFormat("application/x-companion")) { event->acceptProposedAction(); } else { event->ignore(); @@ -58,7 +59,7 @@ void compareDialog::dragMoveEvent(QDragMoveEvent *event) void compareDialog::dragEnterEvent(QDragEnterEvent *event) { // accept just text/uri-list mime format - if (event->mimeData()->hasFormat("application/x-companion9x")) { + if (event->mimeData()->hasFormat("application/x-companion")) { event->acceptProposedAction(); } else { event->ignore(); @@ -83,7 +84,6 @@ void compareDialog::printDiff() printCurves(); printGvars(); printSwitches(); - printSafetySwitches(); printFSwitches(); printFrSky(); te->scrollToAnchor("1"); @@ -95,8 +95,8 @@ void compareDialog::dropEvent(QDropEvent *event) const QMimeData *mimeData = event->mimeData(); if (child) { if (child->objectName().contains("label_1")) { - if(mimeData->hasFormat("application/x-companion9x")) { - QByteArray gmData = mimeData->data("application/x-companion9x"); + if(mimeData->hasFormat("application/x-companion")) { + QByteArray gmData = mimeData->data("application/x-companion"); DragDropHeader *header = (DragDropHeader *)gmData.data(); if (!header->general_settings) { char *gData = gmData.data()+sizeof(DragDropHeader);//new char[gmData.size() + 1]; @@ -120,8 +120,8 @@ void compareDialog::dropEvent(QDropEvent *event) } } else if (child->objectName().contains("label_2")) { - if(mimeData->hasFormat("application/x-companion9x")) { - QByteArray gmData = mimeData->data("application/x-companion9x"); + if(mimeData->hasFormat("application/x-companion")) { + QByteArray gmData = mimeData->data("application/x-companion"); DragDropHeader *header = (DragDropHeader *)gmData.data(); if (!header->general_settings) { char *gData = gmData.data()+sizeof(DragDropHeader);//new char[gmData.size() + 1]; @@ -305,7 +305,7 @@ void compareDialog::printPhases() str.append(""+tr("Switch")+""+tr("Flight mode name")); str.append(""+tr("IN")+""+tr("OUT")+""); for (i=0; i<4; i++) { - str.append(QString("%1").arg(getStickStr(i))); + str.append(QString("%1").arg(getInputStr(*g_model1, i))); } str.append(""); for (i=0; igetCapability(FlightPhases); i++) { @@ -342,7 +342,7 @@ void compareDialog::printPhases() gvars=1; } if (gvars==1) { - gvarnum=GetEepromInterface()->getCapability(GvarsNum); + gvarnum=GetEepromInterface()->getCapability(Gvars); } if ((gvars==1 && GetEepromInterface()->getCapability(GvarsFlightPhases)) || GetEepromInterface()->getCapability(RotaryEncoders)) { str.append("
"); @@ -406,7 +406,7 @@ void compareDialog::printPhases() str.append(""); for (i=0; i<4; i++) { - str.append(QString("").arg(getStickStr(i))); + str.append(QString("").arg(getInputStr(*g_model1, i))); } str.append(""); for (i=0; igetCapability(FlightPhases); i++) { @@ -564,7 +564,7 @@ void compareDialog::printGvars() int gvarnum=0; if ((GetCurrentFirmwareVariant() & GVARS_VARIANT ) || (!GetEepromInterface()->getCapability(HasVariants) && GetEepromInterface()->getCapability(Gvars))) { gvars=1; - gvarnum=GetEepromInterface()->getCapability(GvarsNum); + gvarnum=GetEepromInterface()->getCapability(Gvars); } if (!GetEepromInterface()->getCapability(GvarsFlightPhases) && (gvars==1 && GetEepromInterface()->getCapability(Gvars))) { @@ -649,7 +649,8 @@ void compareDialog::printExpos() }; str += tr("Weight") + QString("%1").arg(getGVarString(ed->weight)).rightJustified(6, ' '); - str += " " + tr("Expo") + QString("%1").arg(getGVarString(ed->expo)).rightJustified(7, ' '); + str += ed->curve.toString().replace("<", "<").replace(">", ">"); + if (GetEepromInterface()->getCapability(FlightPhases)) { if(ed->phases) { if (ed->phases!=(unsigned int)(1<getCapability(FlightPhases))-1) { @@ -681,21 +682,19 @@ void compareDialog::printExpos() mask <<=1; } str += QString(")"); - } else { + } + else { str += tr("DISABLED")+QString(" !!!"); } } } if (ed->swtch.type) str += " " + tr("Switch") + QString("(%1)").arg(ed->swtch.toString()); - if (ed->curveMode) - if (ed->curveParam) - str += " " + tr("Curve") + QString("(%1)").arg(getCurveStr(ed->curveParam).replace("<", "<").replace(">", ">")); str += ""; } } str.append("
"+tr("Switch")+"
"+tr("Flight mode name")); str.append(""+tr("IN")+""+tr("OUT")+"%1%1
"); - str.append(""+getStickStr(i)+""); + str.append(""+getInputStr(*g_model2, i)+""); str.append(""); str.append(""); for (int j=0; jweight)).rightJustified(6, ' '); - str += " " + tr("Expo") + QString("%1").arg(getGVarString(ed->expo)).rightJustified(7, ' '); + str += ed->curve.toString().replace("<", "<").replace(">", ">"); + if (GetEepromInterface()->getCapability(FlightPhases)) { if(ed->phases) { if (ed->phases!=(unsigned int)(1<getCapability(FlightPhases))-1) { @@ -767,9 +767,7 @@ void compareDialog::printExpos() } if (ed->swtch.type) str += " " + tr("Switch") + QString("(%1)").arg(ed->swtch.toString()); - if (ed->curveMode) - if (ed->curveParam) - str += " " + tr("Curve") + QString("(%1)").arg(getCurveStr(ed->curveParam).replace("<", "<").replace(">", ">")); + str += ""; } } @@ -824,13 +822,8 @@ void compareDialog::printMixers() str += md->srcRaw.toString(); if (md->swtch.type) str += " " + tr("Switch") + QString("(%1)").arg(md->swtch.toString()); if (md->carryTrim) str += " " + tr("noTrim"); - if(GetEepromInterface()->getCapability(MixFmTrim) && md->enableFmTrim==1){ - if (md->sOffset) str += " "+ tr("FMTrim") + QString(" (%1%)").arg(md->sOffset); - } else { - if (md->sOffset) str += " "+ tr("Offset") + QString(" (%1%)").arg(getGVarString(md->sOffset)); - } - if (md->differential) str += " "+ tr("Diff") + QString(" (%1%)").arg(getGVarString(md->differential)); - if (md->curve) str += " " + tr("Curve") + QString("(%1)").arg(getCurveStr(md->curve).replace("<", "<").replace(">", ">")); + if (md->sOffset) str += " "+ tr("Offset") + QString(" (%1%)").arg(getGVarString(md->sOffset)); + str += md->curve.toString().replace("<", "<").replace(">", ">"); if (md->delayDown || md->delayUp) str += tr(" Delay(u%1:d%2)").arg(md->delayUp/scale).arg(md->delayDown/scale); if (md->speedDown || md->speedUp) str += tr(" Slow(u%1:d%2)").arg(md->speedUp/scale).arg(md->speedDown/scale); if (md->mixWarn) str += " "+tr("Warn")+QString("(%1)").arg(md->mixWarn); @@ -907,13 +900,9 @@ void compareDialog::printMixers() str += md->srcRaw.toString(); if (md->swtch.type) str += " " + tr("Switch") + QString("(%1)").arg(md->swtch.toString()); if (md->carryTrim) str += " " + tr("noTrim"); - if(GetEepromInterface()->getCapability(MixFmTrim) && md->enableFmTrim==1){ - if (md->sOffset) str += " "+ tr("FMTrim") + QString(" (%1%)").arg(getGVarString(md->sOffset)); - } else { - if (md->sOffset) str += " "+ tr("Offset") + QString(" (%1%)").arg(getGVarString(md->sOffset)); - } - if (md->differential) str += " "+ tr("Diff") + QString(" (%1%)").arg(getGVarString(md->differential)); - if (md->curve) str += " " + tr("Curve") + QString("(%1)").arg(getCurveStr(md->curve).replace("<", "<").replace(">", ">")); + if (md->sOffset) str += " "+ tr("Offset") + QString(" (%1%)").arg(getGVarString(md->sOffset)); + // TODO if (md->differential) str += " "+ tr("Diff") + QString(" (%1%)").arg(getGVarString(md->differential)); + // TODO if (md->curve) str += " " + tr("Curve") + QString("(%1)").arg(getCurveStr(md->curve).replace("<", "<").replace(">", ">")); if (md->delayDown || md->delayUp) str += tr(" Delay(u%1:d%2)").arg(md->delayUp/scale).arg(md->delayDown/scale); if (md->speedDown || md->speedUp) str += tr(" Slow(u%1:d%2)").arg(md->speedUp/scale).arg(md->speedDown/scale); if (md->mixWarn) str += " "+tr("Warn")+QString("(%1)").arg(md->mixWarn); @@ -1049,19 +1038,19 @@ void compareDialog::printSwitches() int sc=0; QString color; QString str = "
"; - str.append(""); + str.append(""); str.append(""); - value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMin,fd1); - value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMin,fd2); + // TODO value1 = getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMin,fd1); + // TODO value2 = getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMin,fd2); if (fd1->screens[0].type==fd2->screens[0].type) color=getColor1(value1,value2); str.append(""); - value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMax,fd1); - value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMax,fd2); + // TODO value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMax,fd1); + // TODO value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMax,fd2); if (fd1->screens[0].type==fd2->screens[0].type) color=getColor1(value1,value2); str.append(""); @@ -1326,6 +1267,7 @@ void compareDialog::printFrSky() } } } +#endif str.append(""); - value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMin,fd1); - value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMin,fd2); + // TODO value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMin,fd1); + // TODO value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMin,fd2); if (fd1->screens[0].type==fd2->screens[0].type) color=getColor2(value1,value2); str.append(""); - value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMax,fd1); - value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMax,fd2); + // TODO value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMax,fd1); + // TODO value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMax,fd2); if (fd1->screens[0].type==fd2->screens[0].type) color=getColor2(value1,value2); str.append(""); @@ -1444,6 +1386,7 @@ void compareDialog::printFrSky() } } } +#endif str.append("

"+tr("Custom Switches")+"

"+tr("Logical Switches")+"

"); - for (int i=0; igetCapability(CustomSwitches); i++) { - QString sw1 = getCustomSwitchStr(&g_model1->customSw[i], *g_model1); - QString sw2 = getCustomSwitchStr(&g_model2->customSw[i], *g_model2); + for (int i=0; igetCapability(LogicalSwitches); i++) { + QString sw1 = g_model1->customSw[i].toString(*g_model1); + QString sw2 = g_model2->customSw[i].toString(*g_model2); if (!(sw1.isEmpty() && sw2.isEmpty())) { str.append(""); color=getColor1(sw1,sw2); str.append(QString(""); if (i<9) { - str.append("").arg(i+1)); + str.append("").arg(i+1)); } else { - str.append(""); + str.append(""); } color=getColor2(sw1,sw2); str.append(QString(""); @@ -1080,7 +1069,7 @@ void compareDialog::printFSwitches() QString color2; int sc=0; QString str = "
").arg(color)+sw1+""+tr("CS")+QString("%1"+tr("LS")+QString("%1"+tr("CS")+('A'+(i-9))+""+tr("LS")+('A'+(i-9))+"").arg(color)+sw2+"
"; - str.append(""); + str.append(""); str.append(""); str.append("

"+tr("Custom Functions")+"

"+tr("Switch Assignment")+"

"); str.append(""); str.append(""); @@ -1107,8 +1096,8 @@ void compareDialog::printFSwitches() str.append(""); if (g_model1->funcSw[i].swtch.type) { str.append(doTC(g_model1->funcSw[i].swtch.toString(),color1)); - str.append(doTC(getFuncName(g_model1->funcSw[i].func),color1)); - str.append(doTC(FuncParam(g_model1->funcSw[i].func,g_model1->funcSw[i].param,g_model1->funcSw[i].paramarm, g_model1->funcSw[i].adjustMode),color1)); + str.append(doTC(g_model1->funcSw[i].funcToString(),color1)); + str.append(doTC(g_model1->funcSw[i].paramToString(),color1)); int index=g_model1->funcSw[i].func; if (index==FuncPlaySound || index==FuncPlayHaptic || index==FuncPlayValue || index==FuncPlayPrompt || index==FuncPlayBoth || index==FuncBackgroundMusic) { str.append(doTC(QString("%1").arg(g_model1->funcSw[i].repeatParam),color1)); @@ -1126,8 +1115,8 @@ void compareDialog::printFSwitches() str.append(doTC(tr("CF")+QString("%1").arg(i+1),"",true)); if (g_model2->funcSw[i].swtch.type) { str.append(doTC(g_model2->funcSw[i].swtch.toString(),color2)); - str.append(doTC(getFuncName(g_model2->funcSw[i].func),color2)); - str.append(doTC(FuncParam(g_model2->funcSw[i].func,g_model2->funcSw[i].param,g_model2->funcSw[i].paramarm, g_model2->funcSw[i].adjustMode),color2)); + str.append(doTC(g_model2->funcSw[i].funcToString(),color2)); + str.append(doTC(g_model2->funcSw[i].paramToString(),color2)); int index=g_model2->funcSw[i].func; if (index==FuncPlaySound || index==FuncPlayHaptic || index==FuncPlayValue || index==FuncPlayPrompt || index==FuncPlayBoth || index==FuncBackgroundMusic) { str.append(doTC(QString("%1").arg(g_model2->funcSw[i].repeatParam),color2)); @@ -1153,55 +1142,6 @@ void compareDialog::printFSwitches() te->append(str); } -void compareDialog::printSafetySwitches() -{ - QString color1; - QString color2; - int sc=0; - QString str = "
"+tr("Switch")+""+tr("Function")+"
"; - str.append(""); - str.append("

"+tr("Safety Switches")+"

"); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - for(int i=0; igetCapability(Outputs); i++) - { - if ((g_model1->safetySw[i].swtch.type!=SWITCH_TYPE_NONE)||(g_model2->safetySw[i].swtch.type!=SWITCH_TYPE_NONE)) { - if ((g_model1->safetySw[i].swtch!=g_model2->safetySw[i].swtch)||(g_model1->safetySw[i].val!=g_model2->safetySw[i].val)) { - color1="green"; - color2="red"; - } else { - color1="grey"; - color2="grey"; - } - str.append(""); - if (g_model1->safetySw[i].swtch.type) { - str.append(doTC(g_model1->safetySw[i].swtch.toString(),color1)); - str.append(doTC(QString::number(g_model1->safetySw[i].val),color1)); - } - else { - str.append(""); - } - str.append(doTC(tr("CH")+QString("%1").arg(i+1),"",true)); - if (g_model2->safetySw[i].swtch.type) { - str.append(doTC(g_model2->safetySw[i].swtch.toString(),color2)); - str.append(doTC(QString::number(g_model2->safetySw[i].val),color2)); - } else { - str.append(""); - } - str.append(""); - sc++; - } -} - str.append("
"+tr("Switch")+""+tr("Value")+" "+tr("Switch")+""+tr("Value")+"
    
"); - str.append("
"); - if (sc!=0) - te->append(str); -} - void compareDialog::printFrSky() { QString color; @@ -1271,6 +1211,7 @@ void compareDialog::printFrSky() color=getColor1(fd1->rssiAlarms[1].value,fd2->rssiAlarms[1].value); str.append("
"+QString::number(fd1->rssiAlarms[1].value,10)+"
"); +#if 0 if (GetEepromInterface()->getCapability(TelemetryBars) || GetEepromInterface()->getCapability(TelemetryCSFields)) { int cols=GetEepromInterface()->getCapability(TelemetryColsCSFields); if (cols==0) cols=2; @@ -1311,13 +1252,13 @@ void compareDialog::printFrSky() if (fd1->screens[0].type==fd2->screens[0].type) color=getColor1(fd1->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].source); str.append("
"+getFrSkySrc(fd1->screens[0].body.bars[i].source)+""+QString::number(value1)+""+QString::number(value1)+"
"); str.append(""); @@ -1388,7 +1330,7 @@ void compareDialog::printFrSky() color=getColor2(fd1->rssiAlarms[1].value,fd2->rssiAlarms[1].value); str.append(""); str.append("
"+QString::number(fd2->rssiAlarms[1].value,10)+"

"); - +#if 0 if (GetEepromInterface()->getCapability(TelemetryBars) || GetEepromInterface()->getCapability(TelemetryCSFields)) { int cols=GetEepromInterface()->getCapability(TelemetryColsCSFields); if (cols==0) cols=2; @@ -1429,13 +1371,13 @@ void compareDialog::printFrSky() if (fd1->screens[0].type==fd2->screens[0].type) color=getColor2(fd1->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].source); str.append("
"+getFrSkySrc(fd2->screens[0].body.bars[i].source)+""+QString::number(value2)+""+QString::number(value2)+"
"); te->append(str); } diff --git a/companion/src/comparedialog.ui b/companion/src/comparedialog.ui index 456d1db87..4a26482b0 100644 --- a/companion/src/comparedialog.ui +++ b/companion/src/comparedialog.ui @@ -26,11 +26,7 @@ false
- Dialog - - - - :/images/print.png:/images/print.png + Compare Models @@ -129,7 +125,7 @@
- + diff --git a/companion/src/contributorsdialog.cpp b/companion/src/contributorsdialog.cpp index d60a682db..8aefa222b 100644 --- a/companion/src/contributorsdialog.cpp +++ b/companion/src/contributorsdialog.cpp @@ -1,7 +1,7 @@ #include "contributorsdialog.h" #include "ui_contributorsdialog.h" #include -#define CLINESEP "=====================================================\n" +#include "helpers.h" contributorsDialog::contributorsDialog(QWidget *parent, int contest, QString rnurl) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), @@ -9,44 +9,92 @@ contributorsDialog::contributorsDialog(QWidget *parent, int contest, QString rnu { ui->setupUi(this); switch (contest) { - case 0: { - ui->textBrowser->insertPlainText(CLINESEP); - ui->textBrowser->insertPlainText(tr("People who have contributed to this project")+"\n"); - ui->textBrowser->insertPlainText(CLINESEP); - QFile file(":/contributors"); - if(file.open( QIODevice::ReadOnly | QIODevice::Text ) ) { - ui->textBrowser->insertPlainText(file.readAll()); + case 0: + { + this->setWindowIcon(CompanionIcon("contributors.png")); + QFile file(":/DONATIONS.txt"); + QString str; + str.append(""); + str.append("\n"); + str.append(""); + str.append("
"+tr("People who have contributed to this project")+"
"); + str.append(""); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + int columns=6; + float cwidth=100.0/columns; + while (!file.atEnd()) { + str.append(""); + for (int i=0; i"); + } else { + str.append("class=\"mycss\">"); + } + str.append(line.trimmed()+""); + } else { + str.append("class=\"mycss\"> "); + } + } + str.append(""); + } } - ui->textBrowser->insertPlainText("\n"); - ui->textBrowser->insertPlainText(CLINESEP); - ui->textBrowser->insertPlainText(tr("Coders")+"\n"); - ui->textBrowser->insertPlainText(CLINESEP); - QFile file2(":/coders"); + str.append("
"); + QFile file2(":/CREDITS.txt"); + str.append(""); + str.append(""); + str.append(""); + str.append("
 
"+tr("Coders")+"
"); + str.append(""); if(file2.open( QIODevice::ReadOnly | QIODevice::Text ) ) { - ui->textBrowser->insertPlainText(file2.readAll()); - } - ui->textBrowser->insertPlainText("\n\n\n"); - ui->textBrowser->insertPlainText(tr("Honors go to Rafal Tomczak (RadioClone) and Thomas Husterer (th9x) \nof course. Also to Erez Raviv (er9x) and it's fantastic eePe, from which\ncompanion9x was forked out.")); - ui->textBrowser->insertPlainText("\n\n"); - ui->textBrowser->insertPlainText(tr("Thank you all !!!")); - ui->textBrowser->setReadOnly(true); - ui->textBrowser->verticalScrollBar()->setValue(0); - this->setWindowTitle(tr("Contributors")); + while (!file2.atEnd()) { + str.append(""); + for (int i=0; i<3; i++) { + str.append(""); + } + str.append(""); + } } + str.append(""); + str.append(""); + str.append(""); + str.append("
"); + if (!file2.atEnd()) { + QByteArray line = file2.readLine(); + str.append(line.trimmed()); + } else { + str.append(" "); + } + str.append("
 
" + tr("Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe)") + "
" + tr("Thank you all !!!") + "
"); + str.append(""); + ui->textEditor->setHtml(str); + ui->textEditor->scroll(0, 0); + setWindowTitle(tr("Contributors")); break; + } - case 1:{ - QFile file(":/releasenotes"); + case 1: + { + this->setWindowIcon(CompanionIcon("changelog.png")); + QFile file(":/releasenotes.txt"); if(file.open( QIODevice::ReadOnly | QIODevice::Text ) ) { - ui->textBrowser->insertHtml(file.readAll()); - } - ui->textBrowser->setReadOnly(true); - ui->textBrowser->verticalScrollBar()->setValue(0); - this->setWindowTitle(tr("Companion9x Release Notes")); + ui->textEditor->setHtml(file.readAll()); } + ui->textEditor->scroll(0,0); + setWindowTitle(tr("Companion Release Notes")); break; - case 2:{ + } + + case 2: + { if (!rnurl.isEmpty()) { + this->setWindowIcon(CompanionIcon("changelog.png")); this->setWindowTitle(tr("OpenTX Release Notes")); manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); @@ -54,7 +102,8 @@ contributorsDialog::contributorsDialog(QWidget *parent, int contest, QString rnu QNetworkRequest request(url); request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); manager->get(request); - } else { + } + else { QTimer::singleShot(0, this, SLOT(forceClose())); } break; @@ -64,7 +113,7 @@ contributorsDialog::contributorsDialog(QWidget *parent, int contest, QString rnu void contributorsDialog::showEvent ( QShowEvent * ) { - ui->textBrowser->verticalScrollBar()->setValue(0); + ui->textEditor->scroll(0, 0); } contributorsDialog::~contributorsDialog() @@ -74,9 +123,10 @@ contributorsDialog::~contributorsDialog() void contributorsDialog::replyFinished(QNetworkReply * reply) { - ui->textBrowser->insertHtml(reply->readAll()); + ui->textEditor->setHtml(reply->readAll()); } -void contributorsDialog::forceClose() { +void contributorsDialog::forceClose() +{ accept();; } diff --git a/companion/src/contributorsdialog.ui b/companion/src/contributorsdialog.ui index 1c09ba66d..5d7d670c1 100644 --- a/companion/src/contributorsdialog.ui +++ b/companion/src/contributorsdialog.ui @@ -6,25 +6,21 @@ 0 0 - 926 - 333 + 788 + 528 Dialog - - - :/icon.png:/icon.png - - +
- + diff --git a/companion/src/customizesplashdialog.cpp b/companion/src/customizesplashdialog.cpp index 2358e1c7a..42bf463da 100644 --- a/companion/src/customizesplashdialog.cpp +++ b/companion/src/customizesplashdialog.cpp @@ -2,186 +2,268 @@ #include "ui_customizesplashdialog.h" #include +#include "appdata.h" #include "helpers.h" #include "burndialog.h" #include "splashlibrary.h" #include "flashinterface.h" -customizeSplashDialog::customizeSplashDialog(QWidget *parent) : -QDialog(parent), -ui(new Ui::customizeSplashDialog) { - ui->setupUi(this); - ui->HowToLabel->clear(); - ui->HowToLabel->append("
" + tr("Select an original firmware file") + "
"); +//*** Side Class *** + +Side::Side(){ + imageLabel = 0; + fileNameEdit = 0; + saveButton = 0; + loadFwButton=0; + loadPictButton = 0; + loadProfileButton = 0; + saveToFileName = new QString(""); + source = new Source(UNDEFINED); + format = new LCDFormat(LCDTARANIS); } -customizeSplashDialog::~customizeSplashDialog() { +void Side::markSourceButton() +{ + loadFwButton->setChecked(*source == FW ? true : false ); + loadPictButton->setChecked(*source == PICT ? true : false ); + loadProfileButton->setChecked(*source == PROFILE ? true : false ); +} + +void Side::copyImage( Side side ) +{ + if ((*source!=UNDEFINED) && (*side.source!=UNDEFINED)) + imageLabel->setPixmap(*side.imageLabel->pixmap()); +} + +bool Side::displayImage( QString fileName, Source pictSource ) +{ + QImage image; + + if (fileName.isEmpty()) + return false; + + // Determine which picture format to use + if (pictSource == FW ){ + FlashInterface flash(fileName); + if (!flash.hasSplash()) + return false; + else + image = flash.getSplash(); + *format = (flash.getSplashWidth()==WIDTH_TARANIS ? LCDTARANIS : LCD9X); + } + else { + image.load(fileName); + if (pictSource== PICT) + *format = image.width()>WIDTH_9X ? LCDTARANIS : LCD9X; + else if (pictSource == PROFILE) + *format = (g.profile[g.id()].fwType().contains("taranis")) ? LCDTARANIS : LCD9X; + } + if (image.isNull()) { + return false; + } + // Load image + if (*format==LCDTARANIS) { + imageLabel->setPixmap( makePixMap( image, "taranis" )); + imageLabel->setFixedSize(WIDTH_TARANIS*2, HEIGHT_TARANIS*2); + } + else { + imageLabel->setPixmap( makePixMap( image, "9x" )); + imageLabel->setFixedSize(WIDTH_9X*2, HEIGHT_9X*2); + } + + switch (pictSource){ + case FW: + fileNameEdit->setText(QObject::tr("FW: %1").arg(fileName)); + *saveToFileName = fileName; + *source=FW; + break; + case PICT: + fileNameEdit->setText(QObject::tr("Pict: %1").arg(fileName)); + *saveToFileName = fileName; + *source=PICT; + break; + case PROFILE: + fileNameEdit->setText(QObject::tr("Profile image")); + *saveToFileName = fileName; + *source=PROFILE; + break; + default: + break; + } + saveButton->setEnabled(true); + libraryButton->setEnabled(true); + invertButton->setEnabled(true); + return true; +} + +bool Side::refreshImage() +{ + return displayImage( *saveToFileName, *source ); +} + +bool Side::saveImage() +{ + if (*source == FW ) + { + FlashInterface flash(*saveToFileName); + if (!flash.hasSplash()) { + return false; + } + QImage image = imageLabel->pixmap()->toImage().scaled(flash.getSplashWidth(), flash.getSplashHeight()); + if (flash.setSplash(image) && (flash.saveFlash(*saveToFileName) > 0)) { + g.flashDir( QFileInfo(*saveToFileName).dir().absolutePath() ); + } + else { + return false; + } + } + else if (*source == PICT) { + QImage image = imageLabel->pixmap()->toImage().scaled(imageLabel->width()/2, imageLabel->height()/2).convertToFormat(QImage::Format_Indexed8); + if (image.save(*saveToFileName)) { + g.imagesDir( QFileInfo(*saveToFileName).dir().absolutePath() ); + } + else { + return false; + } + } + else if (*source == PROFILE) { + QImage image = imageLabel->pixmap()->toImage().scaled(imageLabel->width()/2, imageLabel->height()/2).convertToFormat(QImage::Format_Indexed8); + if (!image.save(*saveToFileName)) { + return false; + } + } + return true; +} + +//*** customizeSplashDialog Class *** + +customizeSplashDialog::customizeSplashDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::customizeSplashDialog) +{ + ui->setupUi(this); + this->setWindowIcon(CompanionIcon("paint.png")); + ui->leftLibraryButton->setIcon(CompanionIcon("library.png")); + ui->rightLibraryButton->setIcon(CompanionIcon("library.png")); + + left.imageLabel = ui->leftImageLabel; + right.imageLabel = ui->rightImageLabel; + left.fileNameEdit = ui->leftFileNameEdit; + right.fileNameEdit = ui->rightFileNameEdit; + left.saveButton = ui->leftSaveButton; + right.saveButton = ui->rightSaveButton; + left.libraryButton = ui->leftLibraryButton; + right.libraryButton = ui->rightLibraryButton; + left.invertButton = ui->leftInvertButton; + right.invertButton = ui->rightInvertButton; + + left.loadFwButton = ui->leftLoadFwButton; + right.loadFwButton = ui->rightLoadFwButton; + left.loadPictButton = ui->leftLoadPictButton; + right.loadPictButton = ui->rightLoadPictButton; + left.loadProfileButton = ui->leftLoadProfileButton; + right.loadProfileButton = ui->rightLoadProfileButton; + + loadProfile(left); + left.markSourceButton(); + + resize(0,0); +} + +customizeSplashDialog::~customizeSplashDialog() +{ delete ui; } -void customizeSplashDialog::on_FlashLoadButton_clicked() -{ - QString fileName; - QSettings settings("companion9x", "companion9x"); - ui->ImageLoadButton->setDisabled(true); - ui->libraryButton->setDisabled(true); - ui->SaveFlashButton->setDisabled(true); - ui->SaveImageButton->setDisabled(true); - ui->ImageFileName->clear(); - ui->imageLabel->clear(); - ui->HowToLabel->clear(); - ui->HowToLabel->setStyleSheet("background:rgb(255, 255, 0)"); - fileName = QFileDialog::getOpenFileName(this, tr("Open"), settings.value("lastFlashDir").toString(), FLASH_FILES_FILTER); - QFile file(fileName); - if (!file.exists()) { - ui->FWFileName->clear(); - ui->HowToLabel->append("
" + tr("Select an original firmware file") + "
"); - return; - } - if (fileName.isEmpty()) { - ui->FWFileName->clear(); - ui->HowToLabel->append("
" + tr("Select an original firmware file") + "
"); - return; - } - - ui->FWFileName->setText(fileName); - FlashInterface flash(fileName); - if (flash.hasSplash()) { - ui->HowToLabel->append("
" + tr("Select an image to customize your splash
or save actual firmware splash") + "
"); - ui->ImageLoadButton->setEnabled(true); - ui->libraryButton->setEnabled(true); - ui->SaveImageButton->setEnabled(true); - ui->imageLabel->setPixmap(QPixmap::fromImage(flash.getSplash())); - ui->imageLabel->setFixedSize(flash.getSplashWidth()*2,flash.getSplashHeight()*2); - } else { - QMessageBox::information(this, tr("Error"), tr("Could not find bitmap to replace in file")); - return; - } - settings.setValue("lastFlashDir", QFileInfo(fileName).dir().absolutePath()); +void customizeSplashDialog::on_copyRightToLeftButton_clicked() { + left.copyImage(right); +} +void customizeSplashDialog::on_copyLeftToRightButton_clicked() { +right.copyImage(left); } -void customizeSplashDialog::on_ImageLoadButton_clicked() { + +void customizeSplashDialog::on_leftLoadFwButton_clicked() {loadFirmware(left);} +void customizeSplashDialog::on_rightLoadFwButton_clicked() {loadFirmware(right);} +void customizeSplashDialog::loadFirmware(Side side) +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Firmware File"), g.flashDir(), FLASH_FILES_FILTER); + if (!fileName.isEmpty()) { + if (!side.displayImage( fileName, FW )) + QMessageBox::critical(this, tr("Error"), tr("Can not load embedded image from firmware file %1.").arg(fileName)); + else + g.flashDir( QFileInfo(fileName).dir().absolutePath() ); + } + side.markSourceButton(); +} + +void customizeSplashDialog::on_leftLoadPictButton_clicked() {loadPicture(left);} +void customizeSplashDialog::on_rightLoadPictButton_clicked() {loadPicture(right);} +void customizeSplashDialog::loadPicture(Side side) +{ QString supportedImageFormats; for (int formatIndex = 0; formatIndex < QImageReader::supportedImageFormats().count(); formatIndex++) { supportedImageFormats += QLatin1String(" *.") + QImageReader::supportedImageFormats()[formatIndex]; } - - QSettings settings("companion9x", "companion9x"); QString fileName = QFileDialog::getOpenFileName(this, - tr("Open Image to load"), settings.value("lastImagesDir").toString(), tr("Images (%1)").arg(supportedImageFormats)); + tr("Open Image to load"), g.imagesDir(), tr("Images (%1)").arg(supportedImageFormats)); if (!fileName.isEmpty()) { - settings.setValue("lastImagesDir", QFileInfo(fileName).dir().absolutePath()); - QImage image(fileName); - if (image.isNull()) { - QMessageBox::critical(this, tr("Error"), tr("Cannot load %1.").arg(fileName)); - return; - } - ui->HowToLabel->clear(); - ui->ImageFileName->setText(fileName); - if (ui->imageLabel->width()==424) { - image=image.convertToFormat(QImage::Format_RGB32); - QRgb col; - int gray; - int width = image.width(); - int height = image.height(); - for (int i = 0; i < width; ++i) - { - for (int j = 0; j < height; ++j) - { - col = image.pixel(i, j); - gray = qGray(col); - image.setPixel(i, j, qRgb(gray, gray, gray)); - } - } - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width()/2, ui->imageLabel->height()/2))); - } else { - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width()/2, ui->imageLabel->height()/2).convertToFormat(QImage::Format_Mono))); - } - ui->SaveFlashButton->setEnabled(true); - ui->HowToLabel->append("
" + tr("Save your custimized firmware") + "
"); + if (!side.displayImage( fileName, PICT )) + QMessageBox::critical(this, tr("Error"), tr("Cannot load the image file %1.").arg(fileName)); + else + g.imagesDir( QFileInfo(fileName).dir().absolutePath() ); } + side.markSourceButton(); } -void customizeSplashDialog::on_libraryButton_clicked() { +void customizeSplashDialog::on_leftLoadProfileButton_clicked() {loadProfile(left);} +void customizeSplashDialog::on_rightLoadProfileButton_clicked() {loadProfile(right);} +void customizeSplashDialog::loadProfile(Side side) +{ + QString fileName=g.profile[g.id()].splashFile(); + + if (!fileName.isEmpty()) { + if (!side.displayImage( fileName, PROFILE )) + QMessageBox::critical(this, tr("Error"), tr("Cannot load the profile image %1.").arg(fileName)); + } + side.markSourceButton(); +} + +void customizeSplashDialog::on_leftLibraryButton_clicked(){libraryButton_clicked(left);} +void customizeSplashDialog::on_rightLibraryButton_clicked(){libraryButton_clicked(right);} +void customizeSplashDialog::libraryButton_clicked( Side side ) +{ QString fileName; - splashLibrary *ld = new splashLibrary(this,&fileName); ld->exec(); if (!fileName.isEmpty()) { - QImage image(fileName); - if (image.isNull()) { - QMessageBox::critical(this, tr("Error"), tr("Cannot load %1.").arg(fileName)); - return; - } - ui->HowToLabel->clear(); - ui->ImageFileName->setText(fileName); - if (ui->imageLabel->width()==424) { - image=image.convertToFormat(QImage::Format_RGB32); - QRgb col; - int gray; - int width = image.width(); - int height = image.height(); - for (int i = 0; i < width; ++i) - { - for (int j = 0; j < height; ++j) - { - col = image.pixel(i, j); - gray = qGray(col); - image.setPixel(i, j, qRgb(gray, gray, gray)); - } - } - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width()/2, ui->imageLabel->height()/2))); - } else { - ui->imageLabel->setPixmap(QPixmap::fromImage(image.scaled(ui->imageLabel->width()/2, ui->imageLabel->height()/2).convertToFormat(QImage::Format_Mono))); - } - ui->SaveFlashButton->setEnabled(true); - ui->HowToLabel->append("
" + tr("Save your custimized firmware") + "
"); + if (!side.displayImage( fileName, UNDEFINED )) + QMessageBox::critical(this, tr("Error"), tr("Cannot load the library image %1.").arg(fileName)); } } -void customizeSplashDialog::on_SaveFlashButton_clicked() +void customizeSplashDialog::on_leftSaveButton_clicked(){saveButton_clicked(left);} +void customizeSplashDialog::on_rightSaveButton_clicked(){saveButton_clicked(right);} +void customizeSplashDialog::saveButton_clicked( Side side ) { - QString fileName; - QSettings settings("companion9x", "companion9x"); - ui->HowToLabel->clear(); - fileName = QFileDialog::getSaveFileName(this, tr("Write to file"), settings.value("lastFlashDir").toString(), FLASH_FILES_FILTER, 0, QFileDialog::DontConfirmOverwrite); - if (fileName.isEmpty()) { - return; - } - FlashInterface flash(ui->FWFileName->text()); - if (!flash.hasSplash()) { - QMessageBox::critical(this, tr("Error"), tr("Error reading file %1").arg(fileName)); - return; - } - settings.setValue("lastFlashDir", QFileInfo(fileName).dir().absolutePath()); - QImage image = ui->imageLabel->pixmap()->toImage().scaled(flash.getSplashWidth(), flash.getSplashHeight()); - flash.setSplash(image); - if (flash.saveFlash(fileName) > 0) { - ui->HowToLabel->setStyleSheet("background:rgb(0,255.0);"); - ui->HowToLabel->append("
" + tr("Firmware correctly saved.") + "
"); - } else { - ui->HowToLabel->setStyleSheet("background:rgb(255.0.0);"); - ui->HowToLabel->append("
" + tr("Firmware not saved.") + "
"); + if (side.saveImage()){ + QMessageBox::information(this, tr("File Saved"), tr("The image was saved to the file %1").arg(*side.saveToFileName)); + if ( !side.refreshImage()){ + QMessageBox::critical(this, tr("Image Refresh Error"), tr("Failed to refresh image from file %1").arg(*side.saveToFileName)); + } } + else + QMessageBox::critical(this, tr("File Save Error"), tr("Failed to write image to %1").arg(*side.saveToFileName)); } -void customizeSplashDialog::on_InvertColorButton_clicked() +void customizeSplashDialog::on_leftInvertButton_clicked(){invertButton_clicked(left);} +void customizeSplashDialog::on_rightInvertButton_clicked(){invertButton_clicked(right);} +void customizeSplashDialog::invertButton_clicked(Side side) { - QImage image = ui->imageLabel->pixmap()->toImage(); + QImage image = side.imageLabel->pixmap()->toImage(); image.invertPixels(); - ui->imageLabel->setPixmap(QPixmap::fromImage(image)); + side.imageLabel->setPixmap(QPixmap::fromImage(image)); } -void customizeSplashDialog::on_SaveImageButton_clicked() -{ - QString fileName; - QSettings settings("companion9x", "companion9x"); - fileName = QFileDialog::getSaveFileName(this, tr("Write to file"), settings.value("lastImagesDir").toString(), tr("PNG images (*.png);;"), 0, QFileDialog::DontConfirmOverwrite); - if (!fileName.isEmpty()) { - settings.setValue("lastImagesDir", QFileInfo(fileName).dir().absolutePath()); - QImage image = ui->imageLabel->pixmap()->toImage().scaled(ui->imageLabel->width()/2, ui->imageLabel->height()/2).convertToFormat(QImage::Format_Indexed8); - image.save(fileName, "PNG"); - } -} diff --git a/companion/src/customizesplashdialog.h b/companion/src/customizesplashdialog.h index f5a7acd6d..c931005b2 100644 --- a/companion/src/customizesplashdialog.h +++ b/companion/src/customizesplashdialog.h @@ -10,24 +10,78 @@ namespace Ui class customizeSplashDialog; } +const int WIDTH_TARANIS = 212; +const int HEIGHT_TARANIS = 64; +const int WIDTH_9X = 128; +const int HEIGHT_9X = 64; + +enum Source {FW, PICT, PROFILE, UNDEFINED}; +enum LCDFormat {LCD9X, LCDTARANIS}; + +class Side +{ +public: + Side(); + void markSourceButton(); + void copyImage( Side ); + bool displayImage( QString fileName, Source source ); + bool saveImage(); + bool refreshImage(); + + QLabel *imageLabel; + QLineEdit *fileNameEdit; + QPushButton *saveButton; + QPushButton *invertButton; + QToolButton *libraryButton; + QPushButton *loadFwButton; + QPushButton *loadPictButton; + QPushButton *loadProfileButton; + + QString *saveToFileName; + +private: + Source *source; + LCDFormat *format; +}; + class customizeSplashDialog : public QDialog { Q_OBJECT + Side left; + Side right; public: explicit customizeSplashDialog(QWidget *parent = 0); ~customizeSplashDialog(); private slots: - void on_FlashLoadButton_clicked(); - void on_ImageLoadButton_clicked(); - void on_libraryButton_clicked(); - void on_SaveFlashButton_clicked(); - void on_InvertColorButton_clicked(); - void on_SaveImageButton_clicked(); + void on_leftLoadFwButton_clicked(); + void on_leftLoadPictButton_clicked(); + void on_leftLoadProfileButton_clicked(); + void on_leftLibraryButton_clicked(); + void on_leftSaveButton_clicked(); + void on_leftInvertButton_clicked(); + + void on_rightLoadFwButton_clicked(); + void on_rightLoadPictButton_clicked(); + void on_rightLoadProfileButton_clicked(); + void on_rightLibraryButton_clicked(); + void on_rightSaveButton_clicked(); + void on_rightInvertButton_clicked(); + + void on_copyRightToLeftButton_clicked(); + void on_copyLeftToRightButton_clicked(); private: + void loadFirmware( Side ); + void loadPicture( Side ); + void loadProfile( Side ); + void libraryButton_clicked( Side ); + void saveButton_clicked( Side ); + void invertButton_clicked( Side ); + Ui::customizeSplashDialog *ui; + enum sideEnum { LEFT, RIGHT }; }; #endif // CUSTOMIZESPLASHDIALOG_H diff --git a/companion/src/customizesplashdialog.ui b/companion/src/customizesplashdialog.ui index 69762f1ba..72b241276 100644 --- a/companion/src/customizesplashdialog.ui +++ b/companion/src/customizesplashdialog.ui @@ -2,88 +2,513 @@ customizeSplashDialog + + true + 0 0 - 366 - 303 + 1087 + 285 - + 0 0 - Customize Splash + Transmitter Splash Screen Editor - - - :/images/c_home.png:/images/c_home.png - - - - + + + 6 + + + 3 + + + 0 + + + 3 + + + 3 + + + + + 0 + - + - Qt::Horizontal + Qt::Vertical - - - 40 - 20 - - - +
- + - - - - 0 - 0 - - - - - 256 - 128 - - - - - 424 - 128 - - - - QFrame::Panel - - - QFrame::Raised - - - - - - :/images/customize.png - - - true + + + Qt::Horizontal - + + + 6 + - + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + + 424 + 0 + + + + + 426 + 16777215 + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 424 + 128 + + + + + 424 + 128 + + + + QFrame::Panel + + + QFrame::Plain + - Save Image + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + + + false + + + Invert + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Open Splash Library + + + ... + + + + 24 + 24 + + + + + + + + + + Qt::Horizontal + + + + + + + + + true + + + Load Profile + + + true + + + + + + + Load FW + + + true + + + + + + + Load Pict + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Save + + + + + + + + + Qt::Horizontal + + + + + + + + + Qt::Vertical + + + + + + + + + ... + + + Qt::LeftArrow + + + + + + + ... + + + Qt::RightArrow + + + + + + + + + Qt::Vertical + + + + + + + + + Qt::Horizontal + + + + + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + + 426 + 0 + + + + + 424 + 16777215 + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 424 + 128 + + + + + 424 + 128 + + + + QFrame::Panel + + + QFrame::Plain + + + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + + + false + + + Invert @@ -101,170 +526,136 @@ - + + + false + + + Open Splash Library + - Invert Color + ... + + + + 24 + 24 + + + + + Qt::Horizontal + + + + + + + + + true + + + Load Profile + + + true + + + + + + + true + + + Load FW + + + true + + + + + + + Load Pict + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Save + + + + + + + + + Qt::Horizontal + + +
- + - Qt::Horizontal - - - - 50 - 20 - - - - -
-
- - - - - 0 - 0 - - - - - 16777215 - 40 - - - - background:rgb(255, 255, 0); - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - true - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - true - - - - - - - - - true - - - true - - - - - - - Load Firmware - - - - - - - true - - - true - - - - - - - false - - - Load Image - - - - - - - Open Splash Library - - - ... - - - - :/images/library.png:/images/library.png - - - - 16 - 16 - - - - - - - - Qt::Horizontal - - - - 208 - 20 - - - - - - - - false - - - Save Firmware + Qt::Vertical - - - - Qt::Vertical - - - - 20 - 1 - - - -
+ + leftFileNameEdit + leftInvertButton + leftLibraryButton + leftLoadProfileButton + leftLoadFwButton + leftLoadPictButton + leftSaveButton + copyLeftToRightButton + copyRightToLeftButton + rightFileNameEdit + rightInvertButton + rightLibraryButton + rightLoadProfileButton + rightLoadFwButton + rightLoadPictButton + rightSaveButton + - + diff --git a/companion/src/downloaddialog.cpp b/companion/src/downloaddialog.cpp index 83da451bd..794dbbcd1 100644 --- a/companion/src/downloaddialog.cpp +++ b/companion/src/downloaddialog.cpp @@ -2,13 +2,14 @@ #include "ui_downloaddialog.h" #include #include +#include "helpers.h" downloadDialog::downloadDialog(QWidget *parent, QString src, QString tgt) : QDialog(parent), ui(new Ui::downloadDialog) { ui->setupUi(this); - + this->setWindowIcon(CompanionIcon("fwpreferences.png")); ui->progressBar->setValue(1); ui->progressBar->setMinimum(0); ui->progressBar->setMaximum(0); @@ -21,7 +22,7 @@ downloadDialog::downloadDialog(QWidget *parent, QString src, QString tgt) : file = new QFile(tgt); if (!file->open(QIODevice::WriteOnly)) { - QMessageBox::critical(this, "companion9x", + QMessageBox::critical(this, "Companion", tr("Unable to save the file %1: %2.") .arg(tgt).arg(file->errorString())); QTimer::singleShot(0, this, SLOT(fileError())); @@ -51,7 +52,7 @@ void downloadDialog::httpFinished() if (reply->error()) { file->remove(); - QMessageBox::information(this, tr("companion9x"), + QMessageBox::information(this, tr("Companion"), tr("Download failed: %1.") .arg(reply->errorString())); ok = false; diff --git a/companion/src/downloaddialog.ui b/companion/src/downloaddialog.ui index 9f5681542..f51dfd085 100644 --- a/companion/src/downloaddialog.ui +++ b/companion/src/downloaddialog.ui @@ -13,10 +13,6 @@ Downloading: - - - :/icon.png:/icon.png - @@ -51,7 +47,7 @@ - + diff --git a/companion/src/eepromimportexport.h b/companion/src/eepromimportexport.h index 370287851..242c1f7f7 100644 --- a/companion/src/eepromimportexport.h +++ b/companion/src/eepromimportexport.h @@ -74,7 +74,10 @@ class DataField { QByteArray bytes = bitsToBytes(bits); int result = (offset+bits.count()) % 8; for (int i=0; i class UnsignedField: public DataField { public: @@ -270,9 +284,10 @@ class SpareBitsField: public UnsignedField { template class CharField: public DataField { public: - CharField(char *field): + CharField(char *field, bool truncate=true): DataField("Char"), - field(field) + field(field), + truncate(truncate) { } @@ -280,7 +295,7 @@ class CharField: public DataField { { output.resize(N*8); int b = 0; - int len = strlen(field); + int len = truncate ? strlen(field) : N; for (int i=0; i=len ? 0 : field[i]); for (int j=0; j<8; j++, b++) { @@ -310,6 +325,7 @@ class CharField: public DataField { protected: char * field; + bool truncate; }; int8_t char2idx(char c); @@ -422,7 +438,7 @@ class StructField: public DataField { virtual int Dump(int level=0, int offset=0) { for (int i=0; iDump(level+1, offset); } @@ -547,6 +563,7 @@ class ConversionField: public TransformedField { _field(0), table(table), shift(0), + scale(1), min(INT_MIN), max(INT_MAX), exportFunc(NULL), @@ -562,6 +579,7 @@ class ConversionField: public TransformedField { _field(0), table(table), shift(0), + scale(0), min(INT_MIN), max(INT_MAX), exportFunc(NULL), @@ -577,6 +595,7 @@ class ConversionField: public TransformedField { _field(0), table(NULL), shift(0), + scale(0), min(INT_MIN), max(INT_MAX), exportFunc(exportFunc), @@ -585,13 +604,14 @@ class ConversionField: public TransformedField { { } - ConversionField(int & field, int shift, int min=INT_MIN, int max=INT_MAX, const char *name = "Signed shifted"): + ConversionField(int & field, int shift, int scale=0, int min=INT_MIN, int max=INT_MAX, const char *name = "Signed shifted"): TransformedField(internalField), internalField(_field, name), field(field), _field(0), table(NULL), shift(shift), + scale(scale), min(min), max(max), exportFunc(NULL), @@ -600,13 +620,14 @@ class ConversionField: public TransformedField { { } - ConversionField(unsigned int & field, int shift): + ConversionField(unsigned int & field, int shift, int scale=0): TransformedField(internalField), internalField((unsigned int &)_field), field((int &)field), _field(0), table(NULL), shift(shift), + scale(scale), min(INT_MIN), max(INT_MAX), exportFunc(NULL), @@ -617,19 +638,27 @@ class ConversionField: public TransformedField { virtual void beforeExport() { + int val = field; + + if (scale) { + val /= scale; + } + if (table) { - if (table->exportValue(field, _field)) + if (table->exportValue(val, _field)) return; if (!error.isEmpty()) EEPROMWarnings += error + "\n"; } - else if (shift) { - if (field < min) _field = min + shift; - else if (field > max) _field = max + shift; - else _field = field + shift; + + if (shift) { + if (val < min) _field = min + shift; + else if (val > max) _field = max + shift; + else _field = val + shift; } - else { - _field = exportFunc(field); + + if (exportFunc) { + _field = exportFunc(val); } } @@ -639,12 +668,16 @@ class ConversionField: public TransformedField { if (table->importValue(_field, field)) return; } - else if (shift) { - field = _field - shift; - } - else { + + field = _field - shift; + + if (importFunc) { field = importFunc(_field); } + + if (scale) { + field *= scale; + } } protected: @@ -653,6 +686,7 @@ class ConversionField: public TransformedField { int _field; ConversionTable * table; int shift; + int scale; int min; int max; int (*exportFunc)(int); diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index 1325be6b3..c05a3bcec 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -4,12 +4,16 @@ #include "firmwares/er9x/er9xinterface.h" #include "firmwares/th9x/th9xinterface.h" #include "firmwares/gruvin9x/gruvin9xinterface.h" -#include "firmwares/opentx/open9xinterface.h" +#include "firmwares/opentx/opentxinterface.h" #include "firmwares/ersky9x/ersky9xinterface.h" -#include "qsettings.h" +#include "appdata.h" +#include "helpers.h" QString EEPROMWarnings; +const char * switches9X[] = { "3POS", "THR", "RUD", "ELE", "AIL", "GEA", "TRN" }; +const char * switchesX9D[] = { "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH" }; + void setEEPROMString(char *dst, const char *src, int size) { memcpy(dst, src, size); @@ -33,265 +37,224 @@ void getEEPROMString(char *dst, const char *src, int size) } } -int RawSource::getDecimals(const ModelData & Model) +float ValToTim(int value) { - if(type==SOURCE_TYPE_TELEMETRY) { - switch (index) { - case TELEMETRY_SOURCE_A1: - case TELEMETRY_SOURCE_A2: - return (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].type==0 ? 2: 0); - case TELEMETRY_SOURCE_CELL: - return 2; - case TELEMETRY_SOURCE_CELLS_SUM: - case TELEMETRY_SOURCE_VFAS: - case TELEMETRY_SOURCE_CURRENT: - return 1; - default: - return 0; - } - } - return 0; + return ((value < -109 ? 129+value : (value < 7 ? (113+value)*5 : (53+value)*10))/10.0); } -double RawSource::getMin(const ModelData & Model) +int TimToVal(float value) { + int temp; + if (value>60) { + temp=136+round((value-60)); + } + else if (value>2) { + temp=20+round((value-2.0)*2.0); + } + else { + temp=round(value*10.0); + } + return (temp-129); +} + +QString getSignedStr(int value) +{ + return value > 0 ? QString("+%1").arg(value) : QString("%1").arg(value); +} + +QString getGVarString(int16_t val, bool sign) +{ + if (val >= -10000 && val <= 10000) { + if (sign) + return QString("%1%").arg(getSignedStr(val)); + else + return QString("%1%").arg(val); + } + else { + if (val<0) + return QObject::tr("-GV%1").arg(-val-10000); + else + return QObject::tr("GV%1").arg(val-10000); + } +} + +RawSourceRange RawSource::getRange(bool singleprec) +{ + RawSourceRange result; + + int board = GetEepromInterface()->getBoard(); + + if (!singleprec && !IS_TARANIS(board)) { + singleprec = true; + } + switch (type) { case SOURCE_TYPE_TELEMETRY: switch (index) { - /*case TELEMETRY_SOURCE_NONE: case TELEMETRY_SOURCE_TX_BATT: + result.step = 0.1; + result.decimals = 1; + result.max = 25.5; + break; case TELEMETRY_SOURCE_TIMER1: case TELEMETRY_SOURCE_TIMER2: - return 0; */ - case TELEMETRY_SOURCE_A1: - case TELEMETRY_SOURCE_A2: - if (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].type==0) { - return (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].offset*Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio)/2550.0; - } - else { - return (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].offset*Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio)/255.0; - } - case TELEMETRY_SOURCE_ALT: - case TELEMETRY_SOURCE_GPS_ALT: - return -500; - case TELEMETRY_SOURCE_T1: - case TELEMETRY_SOURCE_T2: - return -30; - default: - return 0; - } - break; - default: - return (Model.extendedLimits ? -125 :-100); - } -} - -double RawSource::getMax(const ModelData & Model) -{ - switch (type) { - case SOURCE_TYPE_TELEMETRY: - switch (index) { - case TELEMETRY_SOURCE_TIMER1: - case TELEMETRY_SOURCE_TIMER2: - return 765; + result.step = singleprec ? 5 : 1; + result.max = singleprec ? 255*5 : 7200; + break; case TELEMETRY_SOURCE_RSSI_TX: case TELEMETRY_SOURCE_RSSI_RX: - return 100; + result.max = 100; + break; case TELEMETRY_SOURCE_A1: case TELEMETRY_SOURCE_A2: - if (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].type==0) { - return (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio-(Model.frsky.channels[index-TELEMETRY_SOURCE_A1].offset*Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio)/255.0)/10; - } else { - return Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio-(Model.frsky.channels[index-TELEMETRY_SOURCE_A1].offset*Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio)/255.0; + if (model) { + const FrSkyChannelData & channel = model->frsky.channels[index-TELEMETRY_SOURCE_A1]; + float ratio = channel.getRatio(); + if (channel.type==0 || channel.type==1 || channel.type==2) + result.decimals = 2; + else + result.decimals = 0; + result.step = ratio / 255; + result.min = channel.offset * result.step; + result.max = ratio + result.min; } + break; case TELEMETRY_SOURCE_ALT: case TELEMETRY_SOURCE_GPS_ALT: - return 1540; - case TELEMETRY_SOURCE_RPM: - return 12750; - case TELEMETRY_SOURCE_FUEL: - return 100; + result.step = singleprec ? 8 : 1; + result.min = -500; + result.max = singleprec ? 1540 : 3000; + break; case TELEMETRY_SOURCE_T1: case TELEMETRY_SOURCE_T2: - return 225; - case TELEMETRY_SOURCE_SPEED: - return 944; - case TELEMETRY_SOURCE_DIST: - return 2040; - case TELEMETRY_SOURCE_CELL: - return 5.1; - case TELEMETRY_SOURCE_CELLS_SUM: - case TELEMETRY_SOURCE_VFAS: - return 25.5; - case TELEMETRY_SOURCE_CURRENT: - return 127.5; - case TELEMETRY_SOURCE_CONSUMPTION: - return 5100; - case TELEMETRY_SOURCE_POWER: - return 1275; - default: - return 125; - } - break; - default: - return (Model.extendedLimits ? 125 :100); - } -} - -double RawSource::getOffset(const ModelData & Model) -{ - if (type==SOURCE_TYPE_TELEMETRY) { - switch (index) { - case TELEMETRY_SOURCE_A1: - case TELEMETRY_SOURCE_A2: - if (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].type==0) { - return (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].offset*Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio)/2550.0; - } - else { - return (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].offset*Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio)/255.0; - } - case TELEMETRY_SOURCE_ALT: - case TELEMETRY_SOURCE_GPS_ALT: - return 524; - case TELEMETRY_SOURCE_RPM: - return 6400; - case TELEMETRY_SOURCE_FUEL: - return 0; - case TELEMETRY_SOURCE_T1: - case TELEMETRY_SOURCE_T2: - return 98; - case TELEMETRY_SOURCE_SPEED: - return 474; - case TELEMETRY_SOURCE_DIST: - return 1024; - case TELEMETRY_SOURCE_CELL: - return 2.56; - default: - return 0; - } - } - return 0; -} - -int RawSource::getRawOffset(const ModelData & Model) -{ - switch (type) { - case SOURCE_TYPE_TELEMETRY: - switch (index) { - case TELEMETRY_SOURCE_TIMER1: - case TELEMETRY_SOURCE_TIMER2: - case TELEMETRY_SOURCE_RSSI_TX: - case TELEMETRY_SOURCE_RSSI_RX: - case TELEMETRY_SOURCE_A1: - case TELEMETRY_SOURCE_A2: - case TELEMETRY_SOURCE_FUEL: - case TELEMETRY_SOURCE_CELLS_SUM: - case TELEMETRY_SOURCE_VFAS: - case TELEMETRY_SOURCE_CURRENT: - case TELEMETRY_SOURCE_CONSUMPTION: - case TELEMETRY_SOURCE_POWER: - return 128; - default: - return 0; - } - default: - return 0; - } -} - -double RawSource::getStep(const ModelData & Model) -{ - switch (type) { - case SOURCE_TYPE_TELEMETRY: - switch (index) { - case TELEMETRY_SOURCE_TIMER1: - case TELEMETRY_SOURCE_TIMER2: - return 3; - case TELEMETRY_SOURCE_A1: - case TELEMETRY_SOURCE_A2: - if (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].type==0) { - return (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio/2550.0); - } - else { - return (Model.frsky.channels[index-TELEMETRY_SOURCE_A1].ratio/255.0); - } - case TELEMETRY_SOURCE_ALT: - case TELEMETRY_SOURCE_GPS_ALT: - return 8; + result.min = -30; + result.max = 225; + break; case TELEMETRY_SOURCE_RPM: - return 50; + result.step = singleprec ? 50 : 1; + result.max = singleprec ? 12750 : 20000; + break; + case TELEMETRY_SOURCE_FUEL: + result.max = 100; + break; case TELEMETRY_SOURCE_SPEED: - return 4; + result.step = singleprec ? 4 : 1; + result.max = singleprec ? 944 : 2000; + if (model && !model->frsky.imperial) { + result.step *= 1.852; + result.max *= 1.852; + } + break; case TELEMETRY_SOURCE_DIST: - return 8; + result.step = singleprec ? 8 : 1; + result.max = singleprec ? 2040 : 10000; + break; case TELEMETRY_SOURCE_CELL: - return 0.02; + result.step = singleprec ? 0.02 : 0.01; + result.max = 5.1; + result.decimals = 2; + break; case TELEMETRY_SOURCE_CELLS_SUM: case TELEMETRY_SOURCE_VFAS: - return 0.1; + result.step = 0.1; + result.max = 25.5; + result.decimals = 1; + break; case TELEMETRY_SOURCE_CURRENT: - return 0.5; + result.step = singleprec ? 0.5 : 0.1; + result.max = singleprec ? 127.5 : 200.0; + result.decimals = 1; + break; case TELEMETRY_SOURCE_CONSUMPTION: - return 20; + result.step = singleprec ? 20 : 1; + result.max = singleprec ? 5100 : 10000; + break; case TELEMETRY_SOURCE_POWER: - return 5; + result.step = singleprec ? 5 : 1; + result.max = singleprec ? 1275 : 2000; + break; default: - return 1; + result.max = 125; + break; + } + if (singleprec) { + result.offset = result.max - (127*result.step); } break; - default: - return 1; + + default: + result.max = (model && model->extendedLimits ? 125 : 100); + result.min = - result.max; + break; } + + return result; +} + +QString AnalogString(int index) +{ + static const QString sticks[] = { QObject::tr("Rud"), QObject::tr("Ele"), QObject::tr("Thr"), QObject::tr("Ail") }; + static const QString pots9X[] = { QObject::tr("P1"), QObject::tr("P2"), QObject::tr("P3") }; + static const QString potsTaranis[] = { QObject::tr("S1"), QObject::tr("S2"), QObject::tr("S3"), QObject::tr("LS"), QObject::tr("RS") }; + + if (index < 4) + return CHECK_IN_ARRAY(sticks, index); + else + return (IS_TARANIS(GetEepromInterface()->getBoard()) ? CHECK_IN_ARRAY(potsTaranis, index-4) : CHECK_IN_ARRAY(pots9X, index-4)); +} + +QString RotaryEncoderString(int index) +{ + static const QString rotary[] = { QObject::tr("REa"), QObject::tr("REb") }; + return CHECK_IN_ARRAY(rotary, index); } QString RawSource::toString() { - static const QString sticks[] = { QObject::tr("Rud"), QObject::tr("Ele"), QObject::tr("Thr"), QObject::tr("Ail") }; + static const QString trims[] = { + QObject::tr("TrmR"), QObject::tr("TrmE"), QObject::tr("TrmT"), QObject::tr("TrmA") + }; - static const QString trims[] = { QObject::tr("TrmR"), QObject::tr("TrmE"), QObject::tr("TrmT"), QObject::tr("TrmA")}; + static const QString telemetry[] = { + QObject::tr("Batt"), QObject::tr("Timer1"), QObject::tr("Timer2"), + QObject::tr("SWR"), QObject::tr("RSSI Tx"), QObject::tr("RSSI Rx"), QObject::tr("Rx Batt"), + QObject::tr("A1"), QObject::tr("A2"), QObject::tr("A3"), QObject::tr("A4"), + QObject::tr("Alt"), QObject::tr("Rpm"), QObject::tr("Fuel"), QObject::tr("T1"), QObject::tr("T2"), + QObject::tr("Speed"), QObject::tr("Dist"), QObject::tr("GPS Alt"), + QObject::tr("Cell"), QObject::tr("Cels"), QObject::tr("Vfas"), QObject::tr("Curr"), QObject::tr("Cnsp"), QObject::tr("Powr"), + QObject::tr("AccX"), QObject::tr("AccY"), QObject::tr("AccZ"), + QObject::tr("HDG "), QObject::tr("VSpd"), QObject::tr("ASpd"), QObject::tr("dTE"), + QObject::tr("A1-"), QObject::tr("A2-"), QObject::tr("A3-"), QObject::tr("A4-"), + QObject::tr("Alt-"), QObject::tr("Alt+"), QObject::tr("Rpm+"), QObject::tr("T1+"), QObject::tr("T2+"), QObject::tr("Spd+"), QObject::tr("Dst+"), + QObject::tr("Cel-"), QObject::tr("Cels-"), QObject::tr("Vfs-"), QObject::tr("Cur+"), QObject::tr("Pwr+"), + QObject::tr("ACC"), QObject::tr("Time"), + }; - static const QString pots9X[] = { QObject::tr("P1"), QObject::tr("P2"), QObject::tr("P3") }; - - static const QString potsX9D[] = { QObject::tr("S1"), QObject::tr("S2"), QObject::tr("LS"), QObject::tr("RS") }; - - static const QString rotary[] = { QObject::tr("REa"), QObject::tr("REb") }; - - static const QString switches9X[] = { QObject::tr("3POS"), - QObject::tr("THR"), QObject::tr("RUD"), QObject::tr("ELE"), - QObject::tr("AIL"), QObject::tr("GEA"), QObject::tr("TRN"), - }; - - static const QString switchesX9D[] = { QObject::tr("SA"), QObject::tr("SB"), QObject::tr("SC"), QObject::tr("SD"), - QObject::tr("SE"), QObject::tr("SF"), QObject::tr("SG"), QObject::tr("SH"), - }; - - static const QString telemetry[] = { QObject::tr("Batt"), QObject::tr("Timer1"), QObject::tr("Timer2"), - (IS_TARANIS(GetEepromInterface()->getBoard()) ? QObject::tr("SWR") : QObject::tr("Tx")), (IS_TARANIS(GetEepromInterface()->getBoard()) ? QObject::tr("RSSI") : QObject::tr("Rx")), QObject::tr("A1"), QObject::tr("A2"), QObject::tr("Alt"), QObject::tr("Rpm"), QObject::tr("Fuel"), QObject::tr("T1"), - QObject::tr("T2"), QObject::tr("Speed"), QObject::tr("Dist"), QObject::tr("GPS Alt"), QObject::tr("Cell"), QObject::tr("Cels"), QObject::tr("Vfas"), QObject::tr("Curr"), - QObject::tr("Cnsp"), QObject::tr("Powr"), QObject::tr("AccX"), QObject::tr("AccY"), QObject::tr("AccZ"), QObject::tr("HDG "), QObject::tr("VSpd"), QObject::tr("A1-"), - QObject::tr("A2-"), QObject::tr("Alt-"), QObject::tr("Alt+"), QObject::tr("Rpm+"), QObject::tr("T1+"), QObject::tr("T2+"), QObject::tr("Spd+"), QObject::tr("Dst+"), - QObject::tr("Cur+"), QObject::tr("Pwr+"), QObject::tr("ACC "), QObject::tr("Time"), - }; - - static const QString virtualSwitches[] = { QObject::tr("CS1"), QObject::tr("CS2"), QObject::tr("CS3"), QObject::tr("CS4"), QObject::tr("CS5"), QObject::tr("CS6"), QObject::tr("CS7"), QObject::tr("CS8"), QObject::tr("CS9"), QObject::tr("CSA"), - QObject::tr("CSB"), QObject::tr("CSC"), QObject::tr("CSD"), QObject::tr("CSE"), QObject::tr("CSF"), QObject::tr("CSG"), QObject::tr("CSH"), QObject::tr("CSI"), QObject::tr("CSJ"), QObject::tr("CSK"), - QObject::tr("CSL"), QObject::tr("CSM"), QObject::tr("CSN"), QObject::tr("CSO"), QObject::tr("CSP"), QObject::tr("CSQ"), QObject::tr("CSR"), QObject::tr("CSS"), QObject::tr("CST"), QObject::tr("CSU"), - QObject::tr("CSV"), QObject::tr("CSW") - }; + static const QString virtualSwitches[] = { + QObject::tr("LS1"), QObject::tr("LS2"), QObject::tr("LS3"), QObject::tr("LS4"), QObject::tr("LS5"), QObject::tr("LS6"), QObject::tr("LS7"), QObject::tr("LS8"), QObject::tr("LS9"), QObject::tr("LSA"), + QObject::tr("LSB"), QObject::tr("LSC"), QObject::tr("LSD"), QObject::tr("LSE"), QObject::tr("LSF"), QObject::tr("LSG"), QObject::tr("LSH"), QObject::tr("LSI"), QObject::tr("LSJ"), QObject::tr("LSK"), + QObject::tr("LSL"), QObject::tr("LSM"), QObject::tr("LSN"), QObject::tr("LSO"), QObject::tr("LSP"), QObject::tr("LSQ"), QObject::tr("LSR"), QObject::tr("LSS"), QObject::tr("LST"), QObject::tr("LSU"), + QObject::tr("LSV"), QObject::tr("LSW") + }; if (index<0) { return QObject::tr("----"); } - switch(type) { + switch (type) { + case SOURCE_TYPE_VIRTUAL_INPUT: + { + QString result = QObject::tr("[I%1]").arg(index+1); + if (model && strlen(model->inputNames[index]) > 0) { + result += QString(model->inputNames[index]); + } + return result; + } case SOURCE_TYPE_STICK: - if (index < 4) - return CHECK_IN_ARRAY(sticks, index); - else - return (IS_TARANIS(GetEepromInterface()->getBoard()) ? CHECK_IN_ARRAY(potsX9D, index-4) : CHECK_IN_ARRAY(pots9X, index-4)); + return AnalogString(index); case SOURCE_TYPE_TRIM: return CHECK_IN_ARRAY(trims, index); case SOURCE_TYPE_ROTARY_ENCODER: - return CHECK_IN_ARRAY(rotary, index); + return RotaryEncoderString(index); case SOURCE_TYPE_MAX: return QObject::tr("MAX"); case SOURCE_TYPE_SWITCH: @@ -330,81 +293,489 @@ QString SwitchDn(const char sw) QString RawSwitch::toString() { - static const QString switches9X[] = { QObject::tr("THR"), QObject::tr("RUD"), QObject::tr("ELE"), - QObject::tr("ID0"), QObject::tr("ID1"), QObject::tr("ID2"), - QObject::tr("AIL"), QObject::tr("GEA"), QObject::tr("TRN") - }; + static const QString switches9X[] = { + QString("THR"), QString("RUD"), QString("ELE"), + QString("ID0"), QString("ID1"), QString("ID2"), + QString("AIL"), QString("GEA"), QString("TRN") + }; - static const QString switchesX9D[] = { SwitchUp('A'), QString::fromUtf8("SA-"), SwitchDn('A'), - SwitchUp('B'), QString::fromUtf8("SB-"), SwitchDn('B'), - SwitchUp('C'), QString::fromUtf8("SC-"), SwitchDn('C'), - SwitchUp('D'), QString::fromUtf8("SD-"), SwitchDn('D'), - SwitchUp('E'), QString::fromUtf8("SE-"), SwitchDn('E'), - SwitchUp('F'), SwitchDn('F'), - SwitchUp('G'), QString::fromUtf8("SG-"), SwitchDn('G'), - SwitchUp('H'), SwitchDn('H'), - }; + static const QString switchesX9D[] = { + SwitchUp('A'), QString::fromUtf8("SA-"), SwitchDn('A'), + SwitchUp('B'), QString::fromUtf8("SB-"), SwitchDn('B'), + SwitchUp('C'), QString::fromUtf8("SC-"), SwitchDn('C'), + SwitchUp('D'), QString::fromUtf8("SD-"), SwitchDn('D'), + SwitchUp('E'), QString::fromUtf8("SE-"), SwitchDn('E'), + SwitchUp('F'), SwitchDn('F'), + SwitchUp('G'), QString::fromUtf8("SG-"), SwitchDn('G'), + SwitchUp('H'), SwitchDn('H'), + }; - static const QString virtualSwitches[] = { QObject::tr("CS1"), QObject::tr("CS2"), QObject::tr("CS3"), QObject::tr("CS4"), QObject::tr("CS5"), QObject::tr("CS6"), QObject::tr("CS7"), QObject::tr("CS8"), QObject::tr("CS9"), QObject::tr("CSA"), - QObject::tr("CSB"), QObject::tr("CSC"), QObject::tr("CSD"), QObject::tr("CSE"), QObject::tr("CSF"), QObject::tr("CSG"), QObject::tr("CSH"), QObject::tr("CSI"), QObject::tr("CSJ"), QObject::tr("CSK"), - QObject::tr("CSL"), QObject::tr("CSM"), QObject::tr("CSN"), QObject::tr("CSO"), QObject::tr("CSP"), QObject::tr("CSQ"), QObject::tr("CSR"), QObject::tr("CSS"), QObject::tr("CST"), QObject::tr("CSU"), - QObject::tr("CSV"), QObject::tr("CSW") - }; + static const QString virtualSwitches[] = { + QObject::tr("LS1"), QObject::tr("LS2"), QObject::tr("LS3"), QObject::tr("LS4"), QObject::tr("LS5"), QObject::tr("LS6"), QObject::tr("LS7"), QObject::tr("LS8"), QObject::tr("LS9"), QObject::tr("LSA"), + QObject::tr("LSB"), QObject::tr("LSC"), QObject::tr("LSD"), QObject::tr("LSE"), QObject::tr("LSF"), QObject::tr("LSG"), QObject::tr("LSH"), QObject::tr("LSI"), QObject::tr("LSJ"), QObject::tr("LSK"), + QObject::tr("LSL"), QObject::tr("LSM"), QObject::tr("LSN"), QObject::tr("LSO"), QObject::tr("LSP"), QObject::tr("LSQ"), QObject::tr("LSR"), QObject::tr("LSS"), QObject::tr("LST"), QObject::tr("LSU"), + QObject::tr("LSV"), QObject::tr("LSW") + }; - switch(type) { - case SWITCH_TYPE_SWITCH: - if (IS_TARANIS(GetEepromInterface()->getBoard())) - return index > 0 ? CHECK_IN_ARRAY(switchesX9D, index-1) : QString("!") + CHECK_IN_ARRAY(switchesX9D, -index-1); - else - return index > 0 ? CHECK_IN_ARRAY(switches9X, index-1) : QString("!") + CHECK_IN_ARRAY(switches9X, -index-1); - case SWITCH_TYPE_VIRTUAL: - return index > 0 ? CHECK_IN_ARRAY(virtualSwitches, index-1) : QString("!") + CHECK_IN_ARRAY(virtualSwitches, -index-1); - case SWITCH_TYPE_ON: - return QObject::tr("ON"); - case SWITCH_TYPE_ONM: - if (index==0) { - return QObject::tr("ONE"); - } - else if (index==1) { - return QObject::tr("!ONE"); - } - break; - case SWITCH_TYPE_TRN: - if (index==0) { - if (IS_TARANIS(GetEepromInterface()->getBoard())) - return SwitchDn('H')+"s"; + static const QString multiposPots[] = { + QObject::tr("S11"), QObject::tr("S12"), QObject::tr("S13"), QObject::tr("S14"), QObject::tr("S15"), QObject::tr("S16"), + QObject::tr("S21"), QObject::tr("S22"), QObject::tr("S23"), QObject::tr("S24"), QObject::tr("S25"), QObject::tr("S26"), + QObject::tr("S31"), QObject::tr("S32"), QObject::tr("S33"), QObject::tr("S34"), QObject::tr("S35"), QObject::tr("S36") + }; + + static const QString trimsSwitches[] = { + QObject::tr("RudTrim Left"), QObject::tr("RudTrim Right"), + QObject::tr("EleTrim Down"), QObject::tr("EleTrim Up"), + QObject::tr("ThrTrim Down"), QObject::tr("ThrTrim Up"), + QObject::tr("AilTrim Left"), QObject::tr("AilTrim Right") + }; + + static const QString rotaryEncoders[] = { + QObject::tr("REa"), QObject::tr("REb") + }; + + static const QString timerModes[] = { + QObject::tr("OFF"), QObject::tr("ABS"), + QObject::tr("THs"), QObject::tr("TH%"), QObject::tr("THt") + }; + + if (index < 0) { + return QString("!") + RawSwitch(type, -index).toString(); + } + else { + switch(type) { + case SWITCH_TYPE_SWITCH: + if (IS_TARANIS(GetEepromInterface()->getBoard())) + return CHECK_IN_ARRAY(switchesX9D, index-1); else - return QObject::tr("TRNs"); - } else if (index==1) { - if (IS_TARANIS(GetEepromInterface()->getBoard())) - return SwitchDn('H')+"l"; - else - return QObject::tr("TRNl"); - } - break; - case SWITCH_TYPE_REA: - if (index==0) { - if (IS_SKY9X(GetEepromInterface()->getBoard())) - return QObject::tr("REAs"); - } else if (index==1) { - if (IS_SKY9X(GetEepromInterface()->getBoard())) - return QObject::tr("REAl"); - } - break; - case SWITCH_TYPE_OFF: - return QObject::tr("OFF"); - case SWITCH_TYPE_MOMENT_SWITCH: - if (IS_TARANIS(GetEepromInterface()->getBoard())) - return index > 0 ? CHECK_IN_ARRAY(switchesX9D, index-1)+QString("t") : QString("!")+CHECK_IN_ARRAY(switchesX9D, -index-1)+QString("t"); - else - return index > 0 ? CHECK_IN_ARRAY(switches9X, index-1)+QString("t") : QString("!")+CHECK_IN_ARRAY(switches9X, -index-1)+QString("t"); - case SWITCH_TYPE_MOMENT_VIRTUAL: - return index > 0 ? CHECK_IN_ARRAY(virtualSwitches, index-1)+QString("t") : QString("!")+CHECK_IN_ARRAY(virtualSwitches, -index-1)+QString("t"); + return CHECK_IN_ARRAY(switches9X, index-1); + case SWITCH_TYPE_VIRTUAL: + return CHECK_IN_ARRAY(virtualSwitches, index-1); + case SWITCH_TYPE_MULTIPOS_POT: + return CHECK_IN_ARRAY(multiposPots, index-1); + case SWITCH_TYPE_TRIM: + return CHECK_IN_ARRAY(trimsSwitches, index-1); + case SWITCH_TYPE_ROTARY_ENCODER: + return CHECK_IN_ARRAY(rotaryEncoders, index-1); + case SWITCH_TYPE_ON: + return QObject::tr("ON"); + case SWITCH_TYPE_OFF: + return QObject::tr("OFF"); + case SWITCH_TYPE_NONE: + return QObject::tr("----"); + case SWITCH_TYPE_TIMER_MODE: + return CHECK_IN_ARRAY(timerModes, index); + default: + return QObject::tr("???"); + } + } +} + +QString CurveReference::toString() +{ + if (value == 0) { + return "----"; + } + else { + switch(type) { + case CURVE_REF_DIFF: + return QObject::tr("Diff(%1)").arg(getGVarString(value)); + case CURVE_REF_EXPO: + return QObject::tr("Expo(%1)").arg(getGVarString(value)); + case CURVE_REF_FUNC: + return QObject::tr("Function(%1)").arg(QString("x>0" "x<0" "|x|" "f>0" "f<0" "|f|").mid(3*(value-1), 3)); + default: + return QString(value > 0 ? QObject::tr("Curve(%1)") : QObject::tr("!Curve(%1)")).arg(abs(value)); + } + } +} + +CSFunctionFamily LogicalSwitchData::getFunctionFamily() +{ + if (func == LS_FN_STAY) + return LS_FAMILY_STAY; + else if (func == LS_FN_TIMER) + return LS_FAMILY_TIMER; + else if (func == LS_FN_STICKY) + return LS_FAMILY_STICKY; + else if (func < LS_FN_AND || func > LS_FN_ELESS) + return LS_FAMILY_VOFS; + else if (func < LS_FN_EQUAL) + return LS_FAMILY_VBOOL; + else + return LS_FAMILY_VCOMP; +} + +QString LogicalSwitchData::funcToString() +{ + switch (func) { + case LS_FN_OFF: + return QObject::tr("---"); + case LS_FN_VPOS: + return QObject::tr("a>x"); + case LS_FN_VNEG: + return QObject::tr("ax"); + case LS_FN_ANEG: + return QObject::tr("|a|b"); + case LS_FN_LESS: + return QObject::tr("a=b"); + case LS_FN_ELESS: + return QObject::tr("a<=b"); + case LS_FN_DPOS: + return QObject::tr("d>=x"); + case LS_FN_DAPOS: + return QObject::tr("|d|>=x"); + case LS_FN_VEQUAL: + return QObject::tr("a=x"); + case LS_FN_VALMOSTEQUAL: + return QObject::tr("a~x"); + case LS_FN_TIMER: + return QObject::tr("Timer"); + case LS_FN_STICKY: + return QObject::tr("Sticky"); + case LS_FN_STAY: + return QObject::tr("Stay"); default: + return QObject::tr("Unknown"); + } +} + +QString LogicalSwitchData::toString(const ModelData & model) +{ + QString result = ""; + + if (!func) + return result; + + if (andsw!=0) { + result +="( "; + } + switch (getFunctionFamily()) { + case LS_FAMILY_STAY: + result = QObject::tr("STAY(%1, [%2:%3])").arg(RawSwitch(val1).toString()).arg(ValToTim(val2)).arg(ValToTim(val2+val3)); + break; + case LS_FAMILY_STICKY: + result = QObject::tr("STICKY(%1, %2)").arg(RawSwitch(val1).toString()).arg(RawSwitch(val2).toString()); + break; + case LS_FAMILY_TIMER: + result = QObject::tr("TIMER(%1, %2)").arg(ValToTim(val1)).arg(ValToTim(val2)); + break; + case LS_FAMILY_VOFS: { + RawSource source = RawSource(val1, &model); + RawSourceRange range = source.getRange(); + if (val1) + result += source.toString(); + else + result += "0"; + result.remove(" "); + if (func == LS_FN_APOS || func == LS_FN_ANEG) + result = "|" + result + "|"; + else if (func == LS_FN_DAPOS) + result = "|d(" + result + ")|"; + else if (func == LS_FN_DPOS) result = "d(" + result + ")"; + if (func == LS_FN_APOS || func == LS_FN_VPOS || func == LS_FN_DAPOS || func == LS_FN_DPOS) + result += " > "; + else if (func == LS_FN_ANEG || func == LS_FN_VNEG) + result += " < "; + result += QString::number(range.step * (val2 /*TODO+ source.getRawOffset(model)*/) + range.offset); + break; + } + case LS_FAMILY_VBOOL: + result = RawSwitch(val1).toString(); + switch (func) { + case LS_FN_AND: + result += " AND "; + break; + case LS_FN_OR: + result += " OR "; + break; + case LS_FN_XOR: + result += " XOR "; + break; + default: + break; + } + result += RawSwitch(val2).toString(); + break; + + case LS_FAMILY_VCOMP: + if (val1) + result += RawSource(val1).toString(); + else + result += "0"; + switch (func) { + case LS_FN_EQUAL: + result += " = "; + break; + case LS_FN_NEQUAL: + result += " != "; + break; + case LS_FN_GREATER: + result += " > "; + break; + case LS_FN_LESS: + result += " < "; + break; + case LS_FN_EGREATER: + result += " >= "; + break; + case LS_FN_ELESS: + result += " <= "; + break; + default: + break; + } + if (val2) + result += RawSource(val2).toString(); + else + result += "0"; break; } - return QObject::tr("----"); + if (andsw!=0) { + result +=" ) AND "; + result += RawSwitch(andsw).toString(); + } + + if (GetEepromInterface()->getCapability(LogicalSwitchesExt)) { + if (delay) + result += QObject::tr(" Delay %1 sec").arg(delay/10.0); + if (duration) + result += QObject::tr(" Duration %1 sec").arg(duration/10.0); + } + + return result; +} + +#if 0 +QStringList FuncSwData::toStringList() +{ + QStringList result; + QStringList qs; + + result << swtch.toString(); + result << funcToString(); + + if (func < FuncInstantTrim) { + result << QString("%1").arg(param); + } + else if (func==FuncPlaySound) { + qs <<"Beep 1" << "Beep 2" << "Beep 3" << "Warn1" << "Warn2" << "Cheep" << "Ratata" << "Tick" << "Siren" << "Ring" ; + qs << "SciFi" << "Robot" << "Chirp" << "Tada" << "Crickt" << "AlmClk" ; + if (param>=0 && param<(int)qs.count()) + result << qs.at(param); + else + result << QObject::tr("Inconsistent parameter"); + } + else if (func==FuncPlayHaptic) { + qs << "0" << "1" << "2" << "3"; + if (param>=0 && param<(int)qs.count()) + result << qs.at(param); + else + result << QObject::tr("Inconsistent parameter"); + } + else if (func==FuncReset) { + qs.append( QObject::tr("Timer1")); + qs.append( QObject::tr("Timer2")); + qs.append( QObject::tr("All")); + qs.append( QObject::tr("Telemetry")); + if (param>=0 && param<(int)qs.count()) + result << qs.at(param); + else + result << QObject::tr("Inconsistent parameter"); + } + else if ((func==FuncVolume)|| (func==FuncPlayValue)) { + RawSource item(param); + result << item.toString(); + } + else if ((func==FuncPlayPrompt) || (func==FuncPlayBoth)) { + if ( GetEepromInterface()->getCapability(VoicesAsNumbers)) { + result << QString("%1").arg(param); + } else { + result << paramarm; + } + } + else if ((func>FuncBackgroundMusicPause) && (funcfuncSw[i].repeatParam),"green")); + } else { + str.append(doTC( " ","green")); + } + if ((index<=FuncInstantTrim) || (index>FuncBackgroundMusicPause)) { + str.append(doTC((g_model->funcSw[i].enabled ? "ON" : "OFF"),"green")); + } else { + str.append(doTC( "---","green")); + } + + return result; +} +#endif + +QString FuncSwData::funcToString() +{ + if (func >= FuncSafetyCh1 && func <= FuncSafetyCh32) + return QObject::tr("Safety %1").arg(RawSource(SOURCE_TYPE_CH, func).toString()); + else if (func == FuncTrainer) + return QObject::tr("Trainer"); + else if (func == FuncTrainerRUD) + return QObject::tr("Trainer RUD"); + else if (func == FuncTrainerELE) + return QObject::tr("Trainer ELE"); + else if (func == FuncTrainerTHR) + return QObject::tr("Trainer THR"); + else if (func == FuncTrainerAIL) + return QObject::tr("Trainer AIL"); + else if (func == FuncInstantTrim) + return QObject::tr("Instant Trim"); + else if (func == FuncPlaySound) + return QObject::tr("Play Sound"); + else if (func == FuncPlayHaptic) + return QObject::tr("Play Haptic"); + else if (func == FuncReset) + return QObject::tr("Reset"); + else if (func >= FuncSetTimer1 && func <= FuncSetTimer2) + return QObject::tr("Set Timer %1").arg(func-FuncSetTimer1+1); + else if (func == FuncVario) + return QObject::tr("Vario"); + else if (func == FuncPlayPrompt) + return QObject::tr("Play Track"); + else if (func == FuncPlayBoth) + return QObject::tr("Play Both"); + else if (func == FuncPlayValue) + return QObject::tr("Play Value"); + else if (func == FuncLogs) + return QObject::tr("Start Logs"); + else if (func == FuncVolume) + return QObject::tr("Volume"); + else if (func == FuncBacklight) + return QObject::tr("Backlight"); + else if (func == FuncBackgroundMusic) + return QObject::tr("Background Music"); + else if (func == FuncBackgroundMusicPause) + return QObject::tr("Background Music Pause"); + else if (func >= FuncAdjustGV1 && func <= FuncAdjustGVLast) + return QObject::tr("Adjust GV%1").arg(func-FuncAdjustGV1+1); + else { + return QString("???"); // Highlight unknown functions with output of question marks.(BTW should not happen that we do not know what a function is) + } +} + +QString FuncSwData::paramToString() +{ + QStringList qs; + if (func <= FuncInstantTrim) { + return QString("%1").arg(param); + } + else if (func==FuncPlaySound) { + qs <<"Beep 1" << "Beep 2" << "Beep 3" << "Warn1" << "Warn2" << "Cheep" << "Ratata" << "Tick" << "Siren" << "Ring" ; + qs << "SciFi" << "Robot" << "Chirp" << "Tada" << "Crickt" << "AlmClk" ; + if (param>=0 && param<(int)qs.count()) + return qs.at(param); + else + return QObject::tr("Inconsistent parameter"); + } + else if (func==FuncPlayHaptic) { + qs << "0" << "1" << "2" << "3"; + if (param>=0 && param<(int)qs.count()) + return qs.at(param); + else + return QObject::tr("Inconsistent parameter"); + } + else if (func==FuncReset) { + qs.append( QObject::tr("Timer1")); + qs.append( QObject::tr("Timer2")); + qs.append( QObject::tr("All")); + qs.append( QObject::tr("Telemetry")); + if (param>=0 && param<(int)qs.count()) + return qs.at(param); + else + return QObject::tr("Inconsistent parameter"); + } + else if ((func==FuncVolume)|| (func==FuncPlayValue)) { + RawSource item(param); + return item.toString(); + } + else if ((func==FuncPlayPrompt) || (func==FuncPlayBoth)) { + if ( GetEepromInterface()->getCapability(VoicesAsNumbers)) { + return QString("%1").arg(param); + } else { + return paramarm; + } + } + else if ((func>FuncBackgroundMusicPause) && (funcgetBoard()) ? 5 : 10; + return QObject::tr("%1 sec").arg(step*repeatParam); + } } GeneralSettings::GeneralSettings() @@ -417,34 +788,26 @@ GeneralSettings::GeneralSettings() calibSpanNeg[i] = 0x180; calibSpanPos[i] = 0x180; } - QSettings settings("companion9x", "companion9x"); - templateSetup = settings.value("default_channel_order", 0).toInt(); - stickMode = settings.value("default_mode", 1).toInt(); - int profile_id = settings.value("ActiveProfile", 0).toInt(); - if (profile_id>0) { - settings.beginGroup("Profiles"); - QString profile=QString("profile%1").arg(profile_id); - settings.beginGroup(profile); - QString t_calib=settings.value("StickPotCalib","").toString(); + templateSetup = g.profile[g.id()].channelOrder(); + stickMode = g.profile[g.id()].defaultMode(); + + QString t_calib=g.profile[g.id()].stickPotCalib(); int potsnum=GetEepromInterface()->getCapability(Pots); if (t_calib.isEmpty()) { - settings.endGroup(); - settings.endGroup(); return; - } else { - QString t_trainercalib=settings.value("TrainerCalib","").toString(); - int8_t t_vBatCalib=(int8_t)settings.value("VbatCalib", vBatCalib).toInt(); - int8_t t_currentCalib=(int8_t)settings.value("currentCalib", currentCalib).toInt(); - int8_t t_PPM_Multiplier=(int8_t)settings.value("PPM_Multiplier", PPM_Multiplier).toInt(); - uint8_t t_stickMode=(uint8_t)settings.value("GSStickMode", stickMode).toUInt(); - uint8_t t_vBatWarn=(uint8_t)settings.value("vBatWarn",vBatWarn).toUInt(); - QString t_DisplaySet=settings.value("Display","").toString(); - QString t_BeeperSet=settings.value("Beeper","").toString(); - QString t_HapticSet=settings.value("Haptic","").toString(); - QString t_SpeakerSet=settings.value("Speaker","").toString(); - QString t_CountrySet=settings.value("countryCode","").toString(); - settings.endGroup(); - settings.endGroup(); + } + else { + QString t_trainercalib=g.profile[g.id()].trainerCalib(); + int8_t t_vBatCalib=(int8_t)g.profile[g.id()].vBatCalib(); + int8_t t_currentCalib=(int8_t)g.profile[g.id()].currentCalib(); + int8_t t_PPM_Multiplier=(int8_t)g.profile[g.id()].ppmMultiplier(); + uint8_t t_stickMode=(uint8_t)g.profile[g.id()].gsStickMode(); + uint8_t t_vBatWarn=(uint8_t)g.profile[g.id()].vBatWarn(); + QString t_DisplaySet=g.profile[g.id()].display(); + QString t_BeeperSet=g.profile[g.id()].beeper(); + QString t_HapticSet=g.profile[g.id()].haptic(); + QString t_SpeakerSet=g.profile[g.id()].speaker(); + QString t_CountrySet=g.profile[g.id()].countryCode(); if ((t_calib.length()==(NUM_STICKS+potsnum)*12) && (t_trainercalib.length()==16)) { QString Byte; @@ -526,7 +889,13 @@ GeneralSettings::GeneralSettings() } } } - } + +} + +RawSource GeneralSettings::getDefaultSource(unsigned int channel) +{ + unsigned int stick_index = chout_ar[4*templateSetup + channel] - 1; + return RawSource(SOURCE_TYPE_STICK, stick_index); } ModelData::ModelData() @@ -534,6 +903,31 @@ ModelData::ModelData() clear(); } +ExpoData * ModelData::insertInput(const int idx) +{ + memmove(&expoData[idx+1], &expoData[idx], (C9X_MAX_EXPOS-(idx+1))*sizeof(ExpoData)); + expoData[idx].clear(); + return &expoData[idx]; +} + +void ModelData::removeInput(const int idx) +{ + memmove(&expoData[idx], &expoData[idx+1], (C9X_MAX_EXPOS-(idx+1))*sizeof(ExpoData)); + expoData[C9X_MAX_EXPOS-1].clear(); +} + +void ModelData::clearInputs() +{ + for (int i=0; igetBoard(); + int board = GetEepromInterface()->getBoard(); if (IS_TARANIS(board)) { moduleData[0].protocol=PXX_XJT_X16; moduleData[1].protocol=OFF; - } else { + } + else { moduleData[0].protocol=PPM; moduleData[1].protocol=OFF; } for (int i=0; igetCapability(CustomCurves); - for (int i=0; i=8) - curves[i].clear(9); - else - curves[i].clear(5); - } + for (int i=0; igetBoard())) { + for (int i=0; ichn = i; + expo->mode = INPUT_MODE_BOTH; + expo->srcRaw = settings.getDefaultSource(i); + expo->weight = 100; + strncpy(inputNames[i], expo->srcRaw.toString().toLatin1().constData(), sizeof(inputNames[i])-1); + MixData * mix = &mixData[i]; + mix->destCh = i+1; + mix->weight = 100; + mix->srcRaw = RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i, this); + } + } + else { + for (int i=0; i 500) + trim = 500; + break; + } + } +} + void ModelData::removeGlobalVar(int & var) { if (var >= 126 && var <= 130) @@ -617,13 +1070,13 @@ ModelData ModelData::removeGlobalVars() for (int i=0; i eepromInterfaces; void RegisterEepromInterfaces() { - QSettings settings("companion9x", "companion9x"); - 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_9XRPRO)); - eepromInterfaces.push_back(new Open9xInterface(BOARD_TARANIS)); - if (rev4a) - eepromInterfaces.push_back(new Open9xInterface(BOARD_TARANIS_REV4a)); + 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_9XRPRO)); + eepromInterfaces.push_back(new OpenTxInterface(BOARD_TARANIS)); + if (g.rev4aSupport()) + 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()); @@ -653,30 +1104,15 @@ QList 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-stock-heli-templates-en"); - + default_firmware_variant = GetFirmwareVariant("opentx-9x-heli-templates-en"); + current_firmware_variant = default_firmware_variant; RegisterEepromInterfaces(); } -bool LoadEeprom(RadioData &radioData, uint8_t *eeprom, int size) +bool LoadEeprom(RadioData &radioData, const uint8_t *eeprom, const int size) { foreach(EEPROMInterface *eepromInterface, eepromInterfaces) { if (eepromInterface->load(radioData, eeprom, size)) @@ -713,7 +1149,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; diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 38ff94ea2..8152249f7 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -45,16 +45,20 @@ template t LIMIT(t mi, t x, t ma) { return std::min(std::max(mi, x), ma enum BoardEnum { BOARD_STOCK, BOARD_M128, + BOARD_MEGA2560, BOARD_GRUVIN9X, BOARD_SKY9X, BOARD_9XRPRO, BOARD_TARANIS, BOARD_TARANIS_REV4a }; -#define IS_STOCK(board) (board==BOARD_STOCK || board==BOARD_M128) -#define IS_ARM(board) (board==BOARD_SKY9X || board==BOARD_9XRPRO || board==BOARD_TARANIS || board==BOARD_TARANIS_REV4a) + +#define IS_9X(board) (board==BOARD_STOCK || board==BOARD_M128) +#define IS_STOCK(board) (board==BOARD_STOCK) +#define IS_2560(board) (board==BOARD_GRUVIN9X || board==BOARD_MEGA2560) +#define IS_ARM(board) (board==BOARD_SKY9X || board==BOARD_9XRPRO || board==BOARD_TARANIS || board==BOARD_TARANIS_REV4a) #define IS_SKY9X(board) (board==BOARD_SKY9X || board==BOARD_9XRPRO) -#define IS_TARANIS(board) (board==BOARD_TARANIS || board==BOARD_TARANIS_REV4a) +#define IS_TARANIS(board) (board==BOARD_TARANIS || board==BOARD_TARANIS_REV4a) const uint8_t modn12x3[4][4]= { {1, 2, 3, 4}, @@ -62,17 +66,18 @@ const uint8_t modn12x3[4][4]= { {4, 2, 3, 1}, {4, 3, 2, 1} }; -#define C9XMAX_MODELS 60 +#define C9X_MAX_MODELS 60 #define C9X_MAX_PHASES 9 #define C9X_MAX_MIXERS 64 -#define C9X_MAX_EXPOS 32 -#define C9X_MAX_CURVES 16 -#define MAX_POINTS 17 -#define C9X_MAX_GVARS 9 -#define NUM_SAFETY_CHNOUT 16 +#define C9X_MAX_INPUTS 32 +#define C9X_MAX_EXPOS 64 +#define C9X_MAX_CURVES 32 +#define C9X_MAX_POINTS 17 +#define C9X_MAX_GVARS 9 +#define C9X_MAX_ENCODERS 2 #define C9X_NUM_CHNOUT 32 // number of real output channels #define C9X_NUM_CSW 32 // number of custom switches -#define C9X_MAX_CUSTOM_FUNCTIONS 32 // number of functions assigned to switches +#define C9X_MAX_CUSTOM_FUNCTIONS 64 // number of functions assigned to switches #define C9X_NUM_MODULES 2 #define STK_RUD 1 @@ -105,10 +110,23 @@ const uint8_t modn12x3[4][4]= { #define DSW_SG2 20 const uint8_t chout_ar[] = { //First number is 0..23 -> template setup, Second is relevant channel out -1,2,3,4 , 1,2,4,3 , 1,3,2,4 , 1,3,4,2 , 1,4,2,3 , 1,4,3,2, -2,1,3,4 , 2,1,4,3 , 2,3,1,4 , 2,3,4,1 , 2,4,1,3 , 2,4,3,1, -3,1,2,4 , 3,1,4,2 , 3,2,1,4 , 3,2,4,1 , 3,4,1,2 , 3,4,2,1, -4,1,2,3 , 4,1,3,2 , 4,2,1,3 , 4,2,3,1 , 4,3,1,2 , 4,3,2,1 }; // TODO delete it? + 1,2,3,4 , 1,2,4,3 , 1,3,2,4 , 1,3,4,2 , 1,4,2,3 , 1,4,3,2, + 2,1,3,4 , 2,1,4,3 , 2,3,1,4 , 2,3,4,1 , 2,4,1,3 , 2,4,3,1, + 3,1,2,4 , 3,1,4,2 , 3,2,1,4 , 3,2,4,1 , 3,4,1,2 , 3,4,2,1, + 4,1,2,3 , 4,1,3,2 , 4,2,1,3 , 4,2,3,1 , 4,3,1,2 , 4,3,2,1 +}; // TODO delete it? + +// Beep center bits +#define BC_BIT_RUD (0x01) +#define BC_BIT_ELE (0x02) +#define BC_BIT_THR (0x04) +#define BC_BIT_AIL (0x08) +#define BC_BIT_P1 (0x10) +#define BC_BIT_P2 (0x20) +#define BC_BIT_P3 (0x40) +#define BC_BIT_P4 (0x80) +#define BC_BIT_REA (0x80) +#define BC_BIT_REB (0x100) // TODO remove this enum! enum EnumKeys { @@ -132,44 +150,6 @@ enum EnumKeys { #endif }; -enum CSFunction { - CS_FN_OFF, - CS_FN_VPOS, - CS_FN_VNEG, - CS_FN_APOS, - CS_FN_ANEG, - CS_FN_AND, - CS_FN_OR, - CS_FN_XOR, - CS_FN_EQUAL, - CS_FN_NEQUAL, - CS_FN_GREATER, - CS_FN_LESS, - CS_FN_EGREATER, - CS_FN_ELESS, - CS_FN_DPOS, - CS_FN_DAPOS, - CS_FN_VEQUAL, // added at the end to avoid everything renumbered - CS_FN_TIM, - CS_FN_MAXF -}; - -enum CSFunctionFamily { - CS_FAMILY_VOFS, - CS_FAMILY_VBOOL, - CS_FAMILY_VCOMP, - CS_FAMILY_TIMERS -}; - -inline CSFunctionFamily getCSFunctionFamily(int fn) -{ - if (fn==CS_FN_TIM) { - return (CS_FAMILY_TIMERS); - } else { - return ((fnCS_FN_ELESS) ? CS_FAMILY_VOFS : (fn= 0 ? abs(value)%65536 : -(abs(value)%65536)) + index(value >= 0 ? abs(value)%65536 : -(abs(value)%65536)), + model(model) { } - RawSource(RawSourceType type, int index=0): + RawSource(RawSourceType type, int index=0, const ModelData * model=NULL): type(type), - index(index) + index(index), + model(model) { } @@ -286,32 +310,31 @@ class RawSource { QString toString(); - int getDecimals(const ModelData & Model); - double getMin(const ModelData & Model); - double getMax(const ModelData & Model); - double getStep(const ModelData & Model); - double getOffset(const ModelData & Model); - int getRawOffset(const ModelData & Model); + RawSourceRange getRange(bool singleprec=false); - bool operator== ( const RawSource& other) { + bool operator == ( const RawSource & other) { return (this->type == other.type) && (this->index == other.index); } + bool operator != ( const RawSource & other) { + return (this->type != other.type) || (this->index != other.index); + } + RawSourceType type; int index; + const ModelData * model; }; enum RawSwitchType { SWITCH_TYPE_NONE, SWITCH_TYPE_SWITCH, SWITCH_TYPE_VIRTUAL, - SWITCH_TYPE_MOMENT_SWITCH, - SWITCH_TYPE_MOMENT_VIRTUAL, + SWITCH_TYPE_MULTIPOS_POT, + SWITCH_TYPE_TRIM, + SWITCH_TYPE_ROTARY_ENCODER, SWITCH_TYPE_ON, SWITCH_TYPE_OFF, - SWITCH_TYPE_ONM, - SWITCH_TYPE_TRN, - SWITCH_TYPE_REA, + SWITCH_TYPE_TIMER_MODE }; class RawSwitch { @@ -381,6 +404,9 @@ enum BeeperMode { class GeneralSettings { public: GeneralSettings(); + + RawSource getDefaultSource(unsigned int channel); + unsigned int version; unsigned int variant; int calibMid[NUM_STICKS+C9X_NUM_POTS]; @@ -407,7 +433,6 @@ class GeneralSettings { int timezone; bool optrexDisplay; unsigned int inactivityTimer; - bool throttleReversed; bool minuteBeep; bool preBeep; bool flashBeep; @@ -419,7 +444,7 @@ class GeneralSettings { unsigned int backlightDelay; bool blightinv; bool stickScroll; - unsigned int templateSetup; //RETA order according to chout_ar array // TODO enum + unsigned int templateSetup; //RETA order according to chout_ar array int PPM_Multiplier; int hapticLength; unsigned int reNavigation; @@ -449,22 +474,61 @@ class GeneralSettings { int beepVolume; int wavVolume; int varioVolume; + int varioPitch; + int varioRange; + int varioRepeat; int backgroundVolume; unsigned int mavbaud; unsigned int switchUnlockStates; + unsigned int hw_uartMode; + unsigned int potsType[8]; +}; + +class CurveReference { + public: + enum CurveRefType { + CURVE_REF_DIFF, + CURVE_REF_EXPO, + CURVE_REF_FUNC, + CURVE_REF_CUSTOM + }; + + CurveReference() { clear(); } + + CurveReference(CurveRefType type, int value): + type(type), + value(value) + { + } + + void clear() { memset(this, 0, sizeof(CurveReference)); } + + CurveRefType type; + int value; + + QString toString(); +}; + +enum InputMode { + INPUT_MODE_NONE, + INPUT_MODE_POS, + INPUT_MODE_NEG, + INPUT_MODE_BOTH }; class ExpoData { public: ExpoData() { clear(); } - unsigned int mode; // 0=end, 1=pos, 2=neg, 3=both + RawSource srcRaw; + unsigned int scale; + unsigned int mode; unsigned int chn; RawSwitch swtch; unsigned int phases; // -5=!FP4, 0=normal, 5=FP4 int weight; - int expo; - unsigned int curveMode; - int curveParam; + int offset; + CurveReference curve; + int carryTrim; char name[10+1]; void clear() { memset(this, 0, sizeof(ExpoData)); } }; @@ -477,11 +541,19 @@ class CurvePoint { class CurveData { public: + enum CurveType { + CURVE_TYPE_STANDARD, + CURVE_TYPE_CUSTOM, + CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM + }; + CurveData() { clear(5); } - bool custom; // 0=end, 1=pos, 2=neg, 3=both - uint8_t count; - CurvePoint points[MAX_POINTS]; - char name[6+1]; + + CurveType type; + bool smooth; + int count; + CurvePoint points[C9X_MAX_POINTS]; + char name[6+1]; void clear(int count) { memset(this, 0, sizeof(CurveData)); this->count = count; } }; @@ -495,7 +567,8 @@ class LimitData { int ppmCenter; bool symetrical; char name[6+1]; - void clear() { memset(this, 0, sizeof(LimitData)); min = -100; max = +100; } + CurveReference curve; + void clear() { memset(this, 0, sizeof(LimitData)); min = -1000; max = +1000; } }; enum MltpxValue { @@ -504,7 +577,6 @@ enum MltpxValue { MLTPX_REP=2 }; - class MixData { public: MixData() { clear(); } @@ -512,9 +584,8 @@ class MixData { RawSource srcRaw; unsigned int srcVariant; int weight; - int differential; RawSwitch swtch; - int curve; //0=symmetrisch + CurveReference curve; //0=symmetrisch unsigned int delayUp; unsigned int delayDown; unsigned int speedUp; // Servogeschwindigkeit aus Tabelle (10ms Cycle) @@ -523,39 +594,71 @@ class MixData { bool noExpo; MltpxValue mltpx; // multiplex method 0=+ 1=* 2=replace unsigned int mixWarn; // mixer warning - unsigned int enableFmTrim; unsigned int phases; // -5=!FP4, 0=normal, 5=FP4 - unsigned int lateOffset; int sOffset; char name[10+1]; void clear() { memset(this, 0, sizeof(MixData)); } }; -class CustomSwData { // Custom Switches data - public: - CustomSwData() { clear(); } - int val1; //input - int val2; //offset - unsigned int func; - unsigned int delay; - unsigned int duration; - unsigned int andsw; - void clear() { memset(this, 0, sizeof(CustomSwData)); } +enum CSFunction { + LS_FN_OFF, + LS_FN_VPOS, + LS_FN_VNEG, + LS_FN_APOS, + LS_FN_ANEG, + LS_FN_AND, + LS_FN_OR, + LS_FN_XOR, + LS_FN_EQUAL, + LS_FN_NEQUAL, + LS_FN_GREATER, + LS_FN_LESS, + LS_FN_EGREATER, + LS_FN_ELESS, + LS_FN_DPOS, + LS_FN_DAPOS, + LS_FN_VEQUAL, // added at the end to avoid everything renumbered + LS_FN_VALMOSTEQUAL, + LS_FN_TIMER, + LS_FN_STICKY, + LS_FN_STAY, + // later ... LS_FN_RANGE, + LS_FN_MAX }; -class SafetySwData { // Custom Switches data - public: - SafetySwData() { clear(); } - RawSwitch swtch; - int val; +enum CSFunctionFamily { + LS_FAMILY_VOFS, + LS_FAMILY_VBOOL, + LS_FAMILY_VCOMP, + LS_FAMILY_TIMER, + LS_FAMILY_STICKY, + LS_FAMILY_STAY, +}; - void clear() { memset(this, 0, sizeof(SafetySwData)); } +class LogicalSwitchData { // Custom Switches data + public: + LogicalSwitchData(unsigned int func=0) + { + clear(); + this->func = func; + } + unsigned int func; + int val1; + int val2; + int val3; + unsigned int delay; + unsigned int duration; + int andsw; + void clear() { memset(this, 0, sizeof(LogicalSwitchData)); } + CSFunctionFamily getFunctionFamily(); + QString funcToString(); + QString toString(const ModelData & model); }; enum AssignFunc { FuncSafetyCh1 = 0, - FuncSafetyCh16 = FuncSafetyCh1+15, + FuncSafetyCh32 = FuncSafetyCh1+C9X_NUM_CHNOUT-1, FuncTrainer, FuncTrainerRUD, FuncTrainerELE, @@ -565,6 +668,8 @@ enum AssignFunc { FuncPlaySound, FuncPlayHaptic, FuncReset, + FuncSetTimer1, + FuncSetTimer2, FuncVario, FuncPlayPrompt, FuncPlayBoth, @@ -575,38 +680,41 @@ enum AssignFunc { FuncBackgroundMusic, FuncBackgroundMusicPause, FuncAdjustGV1, - FuncAdjustGV2, - FuncAdjustGV3, - FuncAdjustGV4, - FuncAdjustGV5, - FuncCount + FuncAdjustGVLast = FuncAdjustGV1+C9X_MAX_GVARS-1, + FuncCount, + FuncReserve = -1 }; class FuncSwData { // Function Switches data public: - FuncSwData() { clear(); } + FuncSwData(AssignFunc func=FuncSafetyCh1) { clear(); this->func = func; } RawSwitch swtch; AssignFunc func; int param; char paramarm[10]; unsigned int enabled; // TODO perhaps not any more the right name unsigned int adjustMode; - unsigned int repeatParam; + int repeatParam; void clear() { memset(this, 0, sizeof(FuncSwData)); } + QString funcToString(); + QString paramToString(); + QString repeatToString(); + QStringList toStringList(); }; class PhaseData { public: PhaseData() { clear(); } - int trimRef[NUM_STICKS]; // + int trimMode[NUM_STICKS]; + int trimRef[NUM_STICKS]; int trim[NUM_STICKS]; RawSwitch swtch; char name[10+1]; unsigned int fadeIn; unsigned int fadeOut; int rotaryEncoders[2]; - int gvars[5]; - void clear() { memset(this, 0, sizeof(PhaseData)); for (int i=0; i off, abs, THs, TH%, THt, sw/!sw, !m_sw/!m_sw - int8_t modeB; - bool minuteBeep; - bool countdownBeep; - bool dir; // 0=>Count Down, 1=>Count Up + RawSwitch mode; + bool minuteBeep; + unsigned int countdownBeep; + bool dir; // 0=>Count Down, 1=>Count Up unsigned int val; - bool persistent; - int pvalue; - void clear() { memset(this, 0, sizeof(TimerData)); } + bool persistent; + int pvalue; + void clear() { memset(this, 0, sizeof(TimerData)); mode = RawSwitch(SWITCH_TYPE_TIMER_MODE, 0); } }; enum Protocol { @@ -777,16 +880,31 @@ class ModuleData { void clear() { memset(this, 0, sizeof(ModuleData)); } }; +#define C9X_MAX_SCRIPTS 7 +#define C9X_MAX_SCRIPT_INPUTS 10 +class ScriptData { + public: + ScriptData() { clear(); } + char filename[10+1]; + char name[10+1]; + int inputs[C9X_MAX_SCRIPT_INPUTS]; + void clear() { memset(this, 0, sizeof(ScriptData)); } +}; + class ModelData { public: ModelData(); + + ExpoData * insertInput(const int idx); + void removeInput(const int idx); + bool used; char name[12+1]; uint8_t modelVoice; TimerData timers[2]; bool thrTrim; // Enable Throttle Trim bool thrExpo; // Enable Throttle Expo - unsigned int trimInc; // Trim Increments + int trimInc; // Trim Increments bool disableThrottleWarning; unsigned int beepANACenter; // 1<<0->A1.. 1<<6->A7 @@ -797,18 +915,25 @@ class ModelData { PhaseData phaseData[C9X_MAX_PHASES]; MixData mixData[C9X_MAX_MIXERS]; LimitData limitData[C9X_NUM_CHNOUT]; + + char inputNames[C9X_MAX_INPUTS][4+1]; ExpoData expoData[C9X_MAX_EXPOS]; + CurveData curves[C9X_MAX_CURVES]; - CustomSwData customSw[C9X_NUM_CSW]; + LogicalSwitchData customSw[C9X_NUM_CSW]; FuncSwData funcSw[C9X_MAX_CUSTOM_FUNCTIONS]; - SafetySwData safetySw[C9X_NUM_CHNOUT]; SwashRingData swashRingData; unsigned int thrTraceSrc; int8_t traineron; // 0 disable trainer, 1 allow trainer - int8_t t2throttle; // Start timer2 using throttle - unsigned int modelId; + unsigned int modelId; unsigned int switchWarningStates; + unsigned int nSwToWarn; + unsigned int nPotsToWarn; + int potPosition[C9X_NUM_POTS]; + bool displayText; + // TODO structure char gvars_names[C9X_MAX_GVARS][6+1]; + bool gvars_popups[C9X_MAX_GVARS]; uint8_t gvsource[5]; uint8_t bt_telemetry; uint8_t numVoice; @@ -824,13 +949,20 @@ class ModelData { ModuleData moduleData[C9X_NUM_MODULES+1/*trainer*/]; + ScriptData scriptData[C9X_MAX_SCRIPTS]; + void clear(); bool isempty(); - void setDefault(uint8_t id); - unsigned int getTrimFlightPhase(uint8_t idx, int8_t phase); + void setDefaultMixes(GeneralSettings & settings); + void setDefaultValues(unsigned int id, GeneralSettings & settings); + int getTrimValue(int phaseIdx, int trimIdx); + void setTrimValue(int phaseIdx, int trimIdx, int value); ModelData removeGlobalVars(); + void clearMixes(); + void clearInputs(); + protected: void removeGlobalVar(int & var); }; @@ -838,52 +970,39 @@ class ModelData { class RadioData { public: GeneralSettings generalSettings; - ModelData models[C9XMAX_MODELS]; + ModelData models[C9X_MAX_MODELS]; }; +// TODO rename FlightPhase to FlightMode enum Capability { OwnerName, FlightPhases, - FlightPhasesAreNamed, + FlightModesName, FlightPhasesHaveFades, - SimulatorType, Mixes, MixesWithoutExpo, Timers, - TimerTriggerB, TimeDivisions, - minuteBeep, - countdownBeep, CustomFunctions, VoicesAsNumbers, VoicesMaxLength, ModelVoice, MultiLangVoice, ModelImage, - InstantTrimSW, Pots, Switches, SwitchesPositions, - CustomSwitches, + LogicalSwitches, CustomAndSwitches, HasNegAndSwitches, - CustomSwitchesExt, + LogicalSwitchesExt, RotaryEncoders, Outputs, + ChannelsName, ExtraChannels, ExtraInputs, - ExtraTrims, ExtendedTrims, - HasNegCurves, HasInputFilter, - HasExpoCurves, - ExpoIsCurve, - ExpoCurve5, - ExpoCurve9, - CustomCurves, - NumCurves3, - NumCurves5, - NumCurves9, NumCurves, NumCurvePoints, OffsetWeight, @@ -903,7 +1022,6 @@ enum Capability { TrainerSwitch, ModelTrainerEnable, Timer2ThrTrig, - HasTTrace, HasExpoNames, HasMixerNames, HasChNames, @@ -913,14 +1031,10 @@ enum Capability { HasPPMStart, HasGeneralUnits, HasFAIMode, - NoTimerDirs, - NoThrExpo, OptrexDisplay, PPMExtCtrl, PPMFrameLength, - MixFmTrim, gsSwitchMask, - pmSwitchMask, BLonStickMove, DSM2Indexes, Telemetry, @@ -931,14 +1045,10 @@ enum Capability { GvarsInCS, GvarsAreNamed, GvarsFlightPhases, - GvarsHaveSources, - GvarsAsSources, - GvarsAsWeight, - GvarsNum, - GvarsOfsNum, + GvarsName, NoTelemetryProtocol, - TelemetryCSFields, - TelemetryColsCSFields, + TelemetryCustomScreens, + TelemetryCustomScreensFieldsPerLine, TelemetryRSSIModel, TelemetryAlarm, TelemetryInternalAlarm, @@ -952,11 +1062,8 @@ enum Capability { HasPPMSim, HasCrossTrims, HasStickScroll, - HasFixOffset, HasSoundMixer, NumModules, - FSSwitch, - DiffMixers, PPMCenter, SYMLimits, HasCurrentCalibration, @@ -964,8 +1071,6 @@ enum Capability { HasBrightness, HasContrast, PerModelTimers, - PerModelThrottleWarning, - PerModelThrottleInvert, SlowScale, SlowRange, PermTimers, @@ -973,14 +1078,18 @@ enum Capability { CSFunc, LCDWidth, GetThrSwitch, -}; - -enum UseContext { - DefaultContext, - TimerContext, - FlightPhaseContext, - MixerContext, - ExpoContext, + HasDisplayText, + VirtualInputs, + TrainerInputs, + LuaInputs, + LimitsPer1000, + EnhancedCurves, + TelemetryInternalAlarms, + HasFasOffset, + HasMahPersistent, + MultiposPots, + MultiposPotsPositions, + SimulatorVariant, }; class SimulatorInterface; @@ -999,7 +1108,7 @@ class EEPROMInterface inline BoardEnum getBoard() { return board; } - virtual bool load(RadioData &radioData, uint8_t *eeprom, int size) = 0; + virtual bool load(RadioData &radioData, const uint8_t *eeprom, int size) = 0; virtual bool loadBackup(RadioData &radioData, uint8_t *eeprom, int esize, int index) = 0; @@ -1015,11 +1124,7 @@ class EEPROMInterface virtual int isAvailable(Protocol proto, int port=0) = 0; - virtual bool isAvailable(const RawSwitch & swtch, UseContext context) { return true; } - - virtual bool isAvailable(const RawSource & source, UseContext context) { return true; } - - virtual SimulatorInterface * getSimulator() = 0; + virtual SimulatorInterface * getSimulator() { return NULL; } virtual const int getEEpromSize() = 0; @@ -1041,6 +1146,12 @@ extern QString EEPROMWarnings; void setEEPROMString(char *dst, const char *src, int size); void getEEPROMString(char *dst, const char *src, int size); +float ValToTim(int value); +int TimToVal(float value); + +QString getSignedStr(int value); +QString getGVarString(int16_t val, bool sign=false); + inline int applyStickMode(int stick, unsigned int mode) { if (mode == 0 || mode > 4) { @@ -1100,14 +1211,14 @@ inline void applyStickModeToModel(ModelData &model, unsigned int mode) // virtual switches for (int i=0; isetupUi(this); - QLabel * lb_fp[] = {ui->lb_FP0,ui->lb_FP1,ui->lb_FP2,ui->lb_FP3,ui->lb_FP4,ui->lb_FP5,ui->lb_FP6,ui->lb_FP7,ui->lb_FP8 }; - QCheckBox * cb_fp[] = {ui->cb_FP0,ui->cb_FP1,ui->cb_FP2,ui->cb_FP3,ui->cb_FP4,ui->cb_FP5,ui->cb_FP6,ui->cb_FP7,ui->cb_FP8 }; - - setWindowTitle(tr("DEST -> %1").arg(getStickStr(ed->chn))); - QRegExp rx(CHAR_FOR_NAMES_REGEX); - - if (GetEepromInterface()->getCapability(GvarsAsWeight)) { - int gvars=0; - if (GetEepromInterface()->getCapability(HasVariants)) { - if ((GetCurrentFirmwareVariant() & GVARS_VARIANT)) { - gvars=1; - } - } else { - gvars=1; - } - if (gvars==0) { - ui->expoGV->setDisabled(true); - ui->weightGV->setDisabled(true); - ui->expoCurveGV->setDisabled(true); - if (ed->expo>100) { - ed->expo=0; - } - if (ed->weight>100 || ed->weight<-100) { - ed->weight=100; - } - if (ed->curveParam>100 || ed->curveParam<-100) { - ed->curveParam=0; - } - } - populateGVCB(ui->expoCB,ed->expo); - populateGVCB(ui->weightCB,ed->weight); - populateGVCB(ui->expoCurveCB,ed->curveParam); - - ui->weightSB->setMinimum(0); - ui->weightSB->setMaximum(100); - if (ed->weight>100 || ed->weight<0) { - ui->weightGV->setChecked(true); - ui->weightSB->hide(); - ui->weightCB->show(); - } else { - ui->weightGV->setChecked(false); - ui->weightSB->setValue(ed->weight); - ui->weightSB->show(); - ui->weightCB->hide(); - } - - ui->expoSB->setMinimum(-100); - ui->expoSB->setMaximum(100); - if (ed->expo>100 || ed->expo<-100) { - ui->expoGV->setChecked(true); - ui->expoSB->hide(); - ui->expoCB->show(); - } else { - ui->expoGV->setChecked(false); - ui->expoSB->setValue(ed->expo); - ui->expoSB->show(); - ui->expoCB->hide(); - } - - ui->expoCurveSB->setMinimum(-100); - ui->expoCurveSB->setMaximum(100); - if (ed->curveParam>100 || ed->curveParam<-100) { - ui->expoCurveGV->setChecked(true); - ui->expoCurveSB->hide(); - ui->expoCurveCB->show(); - } else { - ui->expoCurveGV->setChecked(false); - ui->expoCurveSB->setValue(ed->curveParam); - ui->expoCurveSB->show(); - ui->expoCurveCB->hide(); - } - } else { - ui->expoGV->hide(); - ui->weightGV->hide(); - ui->expoCurveGV->hide(); - ui->expoSB->setMinimum(-100); - ui->expoSB->setMaximum(100); - ui->expoSB->setValue(ed->expo); - ui->expoCurveSB->setMinimum(-100); - ui->expoCurveSB->setMaximum(100); - ui->expoCurveSB->setValue(ed->curveParam); - ui->weightSB->setMinimum(0); - ui->weightSB->setMaximum(100); - ui->weightSB->setValue(ed->weight); - } - populateSwitchCB(ui->switchesCB,ed->swtch); - if (ed->curveMode==0) { - populateExpoCurvesCB(ui->curvesCB,0); // TODO capacity for er9x - } else { - populateExpoCurvesCB(ui->curvesCB,ed->curveParam); // TODO capacity for er9x - } - ui->modeCB->setCurrentIndex(ed->mode-1); - if (!GetEepromInterface()->getCapability(HasExpoCurves)) { - ui->label_curves->hide(); - ui->curvesCB->hide(); - ed->curveMode=1; - } - if (!GetEepromInterface()->getCapability(ExpoIsCurve)) { - ui->expoCurveCB->hide(); - ui->expoCurveSB->hide(); - ui->expoCurveGV->hide(); - ui->label_curves->setText(tr("Curve")); - } else { - ui->label_expo->hide(); - ui->expoCB->hide(); - ui->expoGV->hide(); - ui->expoSB->hide(); - } - if (!GetEepromInterface()->getCapability(FlightPhases)) { - ui->label_phases->hide(); - for (int i=0; i<9; i++) { - lb_fp[i]->hide(); - cb_fp[i]->hide(); - } - } else { - int mask=1; - for (int i=0; i<9 ; i++) { - if ((ed->phases & mask)==0) { - cb_fp[i]->setChecked(true); - } - mask <<= 1; - } - for (int i=GetEepromInterface()->getCapability(FlightPhases); i<9;i++) { - lb_fp[i]->hide(); - cb_fp[i]->hide(); - } - } - int expolength=GetEepromInterface()->getCapability(HasExpoNames); - if (!expolength) { - ui->label_name->hide(); - ui->expoName->hide(); - } else { - ui->expoName->setMaxLength(expolength); - } - ui->expoName->setValidator(new QRegExpValidator(rx, this)); - ui->expoName->setText(ed->name); - valuesChanged(); - connect(ui->expoName,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); - connect(ui->expoCB,SIGNAL(currentIndexChanged(int)),this,SLOT(valuesChanged())); - connect(ui->expoSB,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); - connect(ui->expoCurveCB,SIGNAL(currentIndexChanged(int)),this,SLOT(valuesChanged())); - connect(ui->expoCurveSB,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); - connect(ui->weightCB,SIGNAL(currentIndexChanged(int)),this,SLOT(valuesChanged())); - connect(ui->weightSB,SIGNAL(editingFinished()),this,SLOT(valuesChanged())); - connect(ui->switchesCB,SIGNAL(currentIndexChanged(int)),this,SLOT(valuesChanged())); - connect(ui->curvesCB,SIGNAL(currentIndexChanged(int)),this,SLOT(valuesChanged())); - connect(ui->modeCB,SIGNAL(currentIndexChanged(int)),this,SLOT(valuesChanged())); - connect(ui->expoGV,SIGNAL(stateChanged(int)),this,SLOT(widgetChanged())); - connect(ui->expoCurveGV,SIGNAL(stateChanged(int)),this,SLOT(widgetChanged())); - connect(ui->weightGV,SIGNAL(stateChanged(int)),this,SLOT(widgetChanged())); - for (int i=0; i<9; i++) { - connect(cb_fp[i],SIGNAL(toggled(bool)),this,SLOT(valuesChanged())); - } - QTimer::singleShot(0, this, SLOT(shrink())); -} - -ExpoDialog::~ExpoDialog() -{ - delete ui; -} - -void ExpoDialog::changeEvent(QEvent *e) -{ - QDialog::changeEvent(e); - switch (e->type()) { - case QEvent::LanguageChange: - ui->retranslateUi(this); - break; - default: - break; - } -} - -void ExpoDialog::widgetChanged() -{ - if (GetEepromInterface()->getCapability(GvarsAsWeight)) { - int gvars=0; - if (GetEepromInterface()->getCapability(HasVariants)) { - if ((GetCurrentFirmwareVariant() & GVARS_VARIANT)) { - gvars=1; - } - } else { - gvars=1; - } - if (gvars==1) { - if (!GetEepromInterface()->getCapability(ExpoIsCurve)) { - if (ui->expoGV->isChecked()) { - ui->expoCB->show(); - ui->expoSB->hide(); - } else { - ui->expoCB->hide(); - ui->expoSB->show(); - } - } else { - if (ui->expoCurveGV->isChecked()) { - ui->expoCurveCB->show(); - ui->expoCurveSB->hide(); - } else { - ui->expoCurveCB->hide(); - ui->expoCurveSB->show(); - } - } - if (ui->weightGV->isChecked()) { - ui->weightCB->show(); - ui->weightSB->hide(); - } else { - ui->weightCB->hide(); - ui->weightSB->show(); - } - } - valuesChanged(); - QTimer::singleShot(0, this, SLOT(shrink())); - } -} - - -void ExpoDialog::valuesChanged() -{ - QCheckBox * cb_fp[] = {ui->cb_FP0,ui->cb_FP1,ui->cb_FP2,ui->cb_FP3,ui->cb_FP4,ui->cb_FP5,ui->cb_FP6,ui->cb_FP7,ui->cb_FP8 }; - if (ui->curvesCB->currentIndex()==0) { - if (GetEepromInterface()->getCapability(ExpoIsCurve)) { - ed->curveMode = 0; - ui->expoCurveGV->show(); - if (ui->expoCurveGV->isChecked()) { - ui->expoCurveCB->show(); - ui->expoCurveSB->hide(); - ed->curveParam = ui->expoCurveCB->itemData(ui->expoCurveCB->currentIndex()).toInt(); - } else { - ui->expoCurveCB->hide(); - ui->expoCurveSB->show(); - ed->curveParam = ui->expoCurveSB->value(); - } - ed->expo = ed->curveParam; - } else { - ui->expoCurveCB->hide(); - ui->expoCurveSB->hide(); - ui->expoCurveGV->hide(); - ed->curveMode = 0; - if (ui->expoGV->isChecked()) { - ed->expo = ui->expoCB->itemData(ui->expoCB->currentIndex()).toInt(); - } else { - ed->expo = ui->expoSB->value(); - } - ed->curveParam = ed->expo; - } - } else { - if (!GetEepromInterface()->getCapability(ExpoIsCurve)) { - ed->curveMode = 1; - ed->curveParam = ui->curvesCB->currentIndex(); - if (ui->expoGV->isChecked()) { - ed->expo = ui->expoCB->itemData(ui->expoCB->currentIndex()).toInt(); - } else { - ed->expo = ui->expoSB->value(); - } - } else { - ed->curveMode = 1; - ed->curveParam = ui->curvesCB->currentIndex(); - ed->expo = 0; - } - ui->expoCurveCB->hide(); - ui->expoCurveSB->hide(); - ui->expoCurveGV->hide(); - } - if (ui->weightGV->isChecked()) { - ed->weight = ui->weightCB->itemData(ui->weightCB->currentIndex()).toInt(); - } else { - ed->weight = ui->weightSB->value(); - } - ed->swtch = RawSwitch(ui->switchesCB->itemData(ui->switchesCB->currentIndex()).toInt()); - ed->mode = ui->modeCB->currentIndex() + 1; - int i=0; - for (i=0; iexpoName->text().toAscii().length(); i++) { - ed->name[i]=ui->expoName->text().toAscii().at(i); - } - ed->name[i]=0; - ed->phases=0; - for (int i=8; i>=0 ; i--) { - if (!cb_fp[i]->checkState()) { - ed->phases+=1; - } - ed->phases<<=1; - } - ed->phases>>=1; - if (GetEepromInterface()->getCapability(FlightPhases)) { - int zeros=0; - int ones=0; - int phtemp=ed->phases; - for (int i=0; igetCapability(FlightPhases); i++) { - if (phtemp & 1) { - ones++; - } - else { - zeros++; - } - phtemp >>=1; - } - if (zeros==1) { - phtemp=ed->phases; - for (int i=0; igetCapability(FlightPhases); i++) { - if ((phtemp & 1)==0) { - break; - } - phtemp >>=1; - } - } - else if (ones==1) { - phtemp=ed->phases; - for (int i=0; igetCapability(FlightPhases); i++) { - if (phtemp & 1) { - break; - } - phtemp >>=1; - } - } - } else { - ed->phases=0; - } -} - -void ExpoDialog::shrink() -{ - resize(0,0); -} diff --git a/companion/src/expodialog.h b/companion/src/expodialog.h deleted file mode 100644 index a7630cc87..000000000 --- a/companion/src/expodialog.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef EXPODIALOG_H -#define EXPODIALOG_H - -#include -#include "eeprominterface.h" - -namespace Ui { - class ExpoDialog; -} - -class ExpoDialog : public QDialog { - Q_OBJECT -public: - ExpoDialog(QWidget *parent, ExpoData *mixdata, int stickMode); - ~ExpoDialog(); - -protected: - void changeEvent(QEvent *e); - -private slots: - void valuesChanged(); - void widgetChanged(); - void shrink(); - -private: - Ui::ExpoDialog *ui; - ExpoData *ed; -}; - -#endif // EXPODIALOG_H diff --git a/companion/src/file.cpp b/companion/src/file.cpp index 9533db249..390bd2685 100644 --- a/companion/src/file.cpp +++ b/companion/src/file.cpp @@ -323,7 +323,10 @@ unsigned int EFile::readRlc12(uint8_t *buf, unsigned int i_len, bool rlc2) if (read(&m_bRlc, 1) !=1) break; //read how many bytes to read - assert(m_bRlc & 0x7f); + if (!(m_bRlc & 0x7f)) { + qDebug() << "RLC decoding error!"; + return 0; + } if (rlc2) { if(m_bRlc&0x80){ // if contains high byte diff --git a/companion/src/firmwares/er9x/er9xeeprom.cpp b/companion/src/firmwares/er9x/er9xeeprom.cpp index 335121706..8cf91d022 100644 --- a/companion/src/firmwares/er9x/er9xeeprom.cpp +++ b/companion/src/firmwares/er9x/er9xeeprom.cpp @@ -3,26 +3,6 @@ #include "helpers.h" #include -int8_t er9xFromSwitch(const RawSwitch & sw) -{ - switch (sw.type) { - case SWITCH_TYPE_SWITCH: - return sw.index; - case SWITCH_TYPE_VIRTUAL: - return sw.index > 0 ? (9 + sw.index) : (-9 + sw.index); - case SWITCH_TYPE_ON: - return 22; - case SWITCH_TYPE_OFF: - return -22; - case SWITCH_TYPE_MOMENT_SWITCH: - return sw.index > 0 ? (22 + sw.index) : (-22 + sw.index); - case SWITCH_TYPE_MOMENT_VIRTUAL: - return sw.index > 0 ? (31 + sw.index) : (-31 + sw.index); - default: - return 0; - } -} - RawSwitch er9xToSwitch(int8_t sw) { uint8_t swa = abs(sw); @@ -37,9 +17,9 @@ RawSwitch er9xToSwitch(int8_t sw) else if (sw == -22) return RawSwitch(SWITCH_TYPE_OFF); else if (swa <= 22+9) - return RawSwitch(SWITCH_TYPE_MOMENT_SWITCH, sw > 0 ? sw-22 : sw+22); + return RawSwitch(SWITCH_TYPE_SWITCH, sw > 0 ? sw-22 : sw+22); else - return RawSwitch(SWITCH_TYPE_MOMENT_VIRTUAL, sw > 0 ? sw-22-9 : sw+22+9); + return RawSwitch(SWITCH_TYPE_VIRTUAL, sw > 0 ? sw-22-9 : sw+22+9); } t_Er9xTrainerMix::t_Er9xTrainerMix() @@ -47,15 +27,6 @@ t_Er9xTrainerMix::t_Er9xTrainerMix() memset(this, 0, sizeof(t_Er9xTrainerMix)); } -t_Er9xTrainerMix::t_Er9xTrainerMix(TrainerMix &c9x) -{ - memset(this, 0, sizeof(t_Er9xTrainerMix)); - srcChn = c9x.src; - swtch = er9xFromSwitch(c9x.swtch); - studWeight = (8 * c9x.weight) / 25; - mode = c9x.mode; -} - t_Er9xTrainerMix::operator TrainerMix() { TrainerMix c9x; @@ -71,15 +42,6 @@ t_Er9xTrainerData::t_Er9xTrainerData() memset(this, 0, sizeof(t_Er9xTrainerData)); } -t_Er9xTrainerData::t_Er9xTrainerData(TrainerData &c9x) -{ - memset(this, 0, sizeof(t_Er9xTrainerData)); - for (int i=0; i125) { - if (c9x.weight>0) { - int index=abs(c9x.weight)-10000; - int gvar=125+index; - if (gvar>127) { - gvar-=256; - } - weight = gvar; - } else { - EEPROMWarnings += ::QObject::tr("er9x doesn't have negative gvars as weight") + "\n"; - weight=0; - } - } else { - weight = c9x.weight; - } - - if (abs(c9x.sOffset)>125) { - if (c9x.sOffset>0) { - int index=abs(c9x.sOffset)-10000; - int gvar=125+index; - if (gvar>127) { - gvar-=256; - } - sOffset = gvar; - } else { - EEPROMWarnings += ::QObject::tr("er9x doesn't have negative gvars as offset") + "\n"; - sOffset=0; - } - } else { - sOffset = c9x.sOffset; - } - - if (c9x.curve!=0) { - curve = c9x.curve; - differential=0; - } else { - if (c9x.differential!=0) { - curve=c9x.differential; - differential=1; - } else { - curve=0; - differential=0; - } - } - lateOffset=c9x.lateOffset; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - if (c9x.carryTrim<0) { - EEPROMWarnings += ::QObject::tr("er9x doesn't have swappable trims") + "\n"; - carryTrim=1; - } else { - carryTrim = c9x.carryTrim; - } - mltpx = (MltpxValue)c9x.mltpx; - mixWarn = c9x.mixWarn; - enableFmTrim=c9x.enableFmTrim; - -} - t_Er9xMixData::operator MixData () { MixData c9x; @@ -434,14 +215,21 @@ t_Er9xMixData::operator MixData () else { c9x.srcRaw = RawSource(SOURCE_TYPE_GVAR, srcRaw-38); } + if (differential==1) { - c9x.differential=curve; - c9x.curve=0; - } else { - c9x.differential=0; - c9x.curve=curve; + c9x.curve.type = CurveReference::CURVE_REF_DIFF; + c9x.curve.value = differential; } - c9x.lateOffset=lateOffset; + else if (curve > 6) { + c9x.curve.type = CurveReference::CURVE_REF_CUSTOM; + c9x.curve.value = curve - 6; + } + else if (curve > 0) { + c9x.curve.type = CurveReference::CURVE_REF_FUNC; + c9x.curve.value = curve; + } + + // c9x.lateOffset=lateOffset; c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -449,32 +237,10 @@ t_Er9xMixData::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - c9x.enableFmTrim=enableFmTrim; + // c9x.enableFmTrim=enableFmTrim; return c9x; } -int8_t er9xFromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("er9x on this board doesn't have Rotary Encoders") + "\n"; - v1 = 5+source.index; - } - else if (source.type == SOURCE_TYPE_MAX) - v1 = 8; - else if (source.type == SOURCE_TYPE_CYC) - v1 = 10+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 13+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 21+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 36+source.index; - return v1; -} - RawSource er9xToSource(int8_t value) { if (value == 0) { @@ -503,49 +269,22 @@ RawSource er9xToSource(int8_t value) } } -t_Er9xCustomSwData::t_Er9xCustomSwData(CustomSwData &c9x) +Er9xLogicalSwitchData::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = er9xFromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - v2 = er9xFromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = er9xFromSwitch(RawSwitch(c9x.val1)); - v2 = er9xFromSwitch(RawSwitch(c9x.val2)); - } - - if (func>ER9X_MAX_CSFUNC ) { - EEPROMWarnings += ::QObject::tr("er9x does not support Custom Switch function %1").arg(getFuncName(func)) + "\n"; - func=0; - v1=0; - v2=0; - } -} - -Er9xCustomSwData::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = er9xToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = er9xToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = er9xToSwitch(v1).toValue(); c9x.val2 = er9xToSwitch(v2).toValue(); } @@ -559,50 +298,11 @@ t_Er9xSafetySwData::t_Er9xSafetySwData() memset(this, 0, sizeof(t_Er9xSafetySwData)); } -t_Er9xSafetySwData::t_Er9xSafetySwData(SafetySwData &c9x) -{ - memset(this, 0, sizeof(t_Er9xSafetySwData)); - swtch = er9xFromSwitch(c9x.swtch); - val = c9x.val; -} - -t_Er9xSafetySwData::operator SafetySwData () -{ - SafetySwData c9x; - c9x.swtch = er9xToSwitch(swtch); - c9x.val = val; - return c9x; -} - - t_Er9xFrSkyChannelData::t_Er9xFrSkyChannelData() { memset(this, 0, sizeof(t_Er9xFrSkyChannelData)); } -t_Er9xFrSkyChannelData::t_Er9xFrSkyChannelData(FrSkyChannelData &c9x) -{ - memset(this, 0, sizeof(t_Er9xFrSkyChannelData)); - ratio = c9x.ratio; - alarms_value[0] = c9x.alarms[0].value; - alarms_value[1] = c9x.alarms[1].value; - alarms_level = (c9x.alarms[1].level << 2) + c9x.alarms[0].level; - alarms_greater = (c9x.alarms[1].greater << 1) + c9x.alarms[0].greater; - if (c9x.type==0) { - if (c9x.multiplier==0) { - type = 0; - } else if (c9x.multiplier==1) { - type = 2; - } else { - EEPROMWarnings += ::QObject::tr("er9x does not support this range for A1/A2") + "\n"; - } - } else if (c9x.type==1 || c9x.type==3) { - type=c9x.type; - } else { - EEPROMWarnings += ::QObject::tr("er9x does not support this telemetry units") + "\n"; - } -} - t_Er9xFrSkyChannelData::operator FrSkyChannelData () { FrSkyChannelData c9x; @@ -622,19 +322,11 @@ t_Er9xFrSkyChannelData::operator FrSkyChannelData () return c9x; } - t_Er9xFrSkyData::t_Er9xFrSkyData() { memset(this, 0, sizeof(t_Er9xFrSkyData)); } -t_Er9xFrSkyData::t_Er9xFrSkyData(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Er9xFrSkyData)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; -} - t_Er9xFrSkyData::operator FrSkyData () { FrSkyData c9x; @@ -643,28 +335,11 @@ t_Er9xFrSkyData::operator FrSkyData () return c9x; } -int setEr9xTimerMode(TimerMode mode) -{ - if (mode == TMRMODE_OFF || mode == TMRMODE_ABS) - return mode; - else if (mode == TMRMODE_THs || mode == TMRMODE_THp) - return mode + 4; - else if (mode >= TMRMODE_FIRST_MOMENT_SWITCH) - return 37+mode-TMRMODE_FIRST_MOMENT_SWITCH; - else if (mode >= TMRMODE_FIRST_SWITCH) - return 16+mode-TMRMODE_FIRST_SWITCH; - else if (mode <= TMRMODE_FIRST_NEG_MOMENT_SWITCH) - return -37+mode-TMRMODE_FIRST_NEG_MOMENT_SWITCH; - else if (mode <= TMRMODE_FIRST_NEG_SWITCH) - return -16+mode-TMRMODE_FIRST_NEG_SWITCH; - else - return 0; -} - -TimerMode getEr9xTimerMode(int mode) +RawSwitch getEr9xTimerMode(int mode) { + /* if (mode <= -33) - return TimerMode(TMRMODE_FIRST_NEG_MOMENT_SWITCH+(mode+33)); + return TimerMode(TMRMODE_FIRST_NEG_SWITCH+(mode+33)); else if (mode <= -1) return TimerMode(TMRMODE_FIRST_NEG_SWITCH+(mode+1)); else if (mode < 16) @@ -672,163 +347,9 @@ TimerMode getEr9xTimerMode(int mode) else if (mode < 16+21) return TimerMode(TMRMODE_FIRST_SWITCH+(mode-16)); else - return TimerMode(TMRMODE_FIRST_MOMENT_SWITCH+(mode-16-21)); -} - -t_Er9xModelData::t_Er9xModelData(ModelData &c9x) -{ - memset(this, 0, sizeof(t_Er9xModelData)); - - if (c9x.used) { - setEEPROMString(name, c9x.name, sizeof(name)); - modelVoice=c9x.modelVoice; - tmrMode = setEr9xTimerMode(c9x.timers[0].mode); - tmrModeB = c9x.timers[0].modeB; - tmrDir = c9x.timers[0].dir; - tmrVal = c9x.timers[0].val; - switch(c9x.moduleData[0].protocol) { - case PPM: - protocol = 0; - break; - case PXX_DJT: - protocol = 1; - break; - case DSM2: - protocol = 2; - break; - case PPM16: - protocol = 3; - break; - default: - protocol = 0; - EEPROMWarnings += QObject::tr("Er9x doesn't accept this protocol") + "\n"; - // TODO more explicit warning for each protocol - break; - } - traineron = c9x.traineron; - t2throttle = c9x.t2throttle; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - ppmNCH = (c9x.moduleData[0].channelsCount - 8) / 2; - thrTrim = c9x.thrTrim; - thrExpo = c9x.thrExpo; - trimInc = c9x.trimInc; - ppmDelay = (c9x.moduleData[0].ppmDelay - 300) / 50; - for (unsigned int i=0; iEeFsOpen(eeprom, size, BOARD_STOCK)) { + if (!efile->EeFsOpen((uint8_t *)eeprom, size, BOARD_STOCK)) { std::cout << "wrong file system\n"; return false; } @@ -184,57 +184,20 @@ bool Er9xInterface::loadBackup(RadioData &radioData, uint8_t *eeprom, int esize, int Er9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t variant, uint8_t version) { - EEPROMWarnings.clear(); + std::cout << "NO!\n"; + // TODO an error - efile->EeFsCreate(eeprom, getEEpromSize(), BOARD_STOCK); - - Er9xGeneral er9xGeneral(radioData.generalSettings); - int sz = efile->writeRlc1(FILE_GENERAL, FILE_TYP_GENERAL, (uint8_t*)&er9xGeneral, sizeof(Er9xGeneral)); - if(sz != sizeof(Er9xGeneral)) { - return 0; - } - - for (int i=0; iwriteRlc1(FILE_MODEL(i), FILE_TYP_MODEL, (uint8_t*)&er9xModel, sizeof(Er9xModelData)); - if(sz != sizeof(Er9xModelData)) { - return 0; - } - } - } - - return getEEpromSize(); + return 0; } int Er9xInterface::getSize(ModelData &model) { - if (model.isempty()) - return 0; - - uint8_t tmp[2*EESIZE_STOCK]; - efile->EeFsCreate(tmp, getEEpromSize(), BOARD_STOCK); - - Er9xModelData er9xModel(model); - int sz = efile->writeRlc1(0, FILE_TYP_MODEL, (uint8_t*)&er9xModel, sizeof(Er9xModelData)); - if(sz != sizeof(Er9xModelData)) { - return -1; - } - return efile->size(0); + return 0; } int Er9xInterface::getSize(GeneralSettings &settings) { - uint8_t tmp[2*EESIZE_STOCK]; - efile->EeFsCreate(tmp, getEEpromSize(), BOARD_STOCK); - - Er9xGeneral er9xGeneral(settings); - int sz = efile->writeRlc1(0, FILE_TYP_GENERAL, (uint8_t*)&er9xGeneral, sizeof(Er9xGeneral)); - if(sz != sizeof(Er9xGeneral)) { - return -1; - } - return efile->size(0); + return 0; } int Er9xInterface::getCapability(const Capability capability) @@ -244,12 +207,6 @@ int Er9xInterface::getCapability(const Capability capability) return 4; case Mixes: return ER9X_MAX_MIXERS; - case NumCurves5: - return ER9X_MAX_CURVE5; - case NumCurves9: - return ER9X_MAX_CURVE5; - case MixFmTrim: - return 1; case PPMExtCtrl: return 1; case ModelTrainerEnable: @@ -282,14 +239,10 @@ int Er9xInterface::getCapability(const Capability capability) return 9; case CustomFunctions: return 0; - case CustomSwitches: + case LogicalSwitches: return 12; case CustomAndSwitches: return 5; - case GvarsNum: - return 7; - case GvarsOfsNum: - return 5; case CSFunc: return 13; case Outputs: @@ -306,8 +259,6 @@ int Er9xInterface::getCapability(const Capability capability) return TM_HASTELEMETRY|TM_HASWSHH; case TelemetryUnits: return 1; - case TimerTriggerB: - return 1; case TelemetryMaxMultiplier: return 2; case MaxVolume: @@ -325,18 +276,11 @@ int Er9xInterface::getCapability(const Capability capability) case HasStickScroll: case HasAltitudeSel: case HasContrast: - case InstantTrimSW: case HasVolume: case HasBlInvert: case ModelVoice: - case DiffMixers: - case HasNegCurves: - case HasFixOffset: case Gvars: - case GvarsHaveSources: - case GvarsAsSources: - case GvarsAsWeight: - return 1; + return 7; case GetThrSwitch: return DSW_THR; default: @@ -359,7 +303,7 @@ int Er9xInterface::isAvailable(Protocol prot, int port) SimulatorInterface * Er9xInterface::getSimulator() { - return new Er9xSimulator(this); + return NULL; // new Er9xSimulator(this); } diff --git a/companion/src/firmwares/er9x/er9xinterface.h b/companion/src/firmwares/er9x/er9xinterface.h index e6d60b6ee..9ea4854be 100644 --- a/companion/src/firmwares/er9x/er9xinterface.h +++ b/companion/src/firmwares/er9x/er9xinterface.h @@ -34,7 +34,7 @@ class Er9xInterface : public EEPROMInterface virtual const int getMaxModels(); - virtual bool load(RadioData &, uint8_t * eeprom, int size); + virtual bool load(RadioData &, const uint8_t * eeprom, int size); virtual bool loadBackup(RadioData &, uint8_t * eeprom, int esize, int index); diff --git a/companion/src/firmwares/ersky9x/ersky9xeeprom.cpp b/companion/src/firmwares/ersky9x/ersky9xeeprom.cpp index f21688f20..2d506243d 100644 --- a/companion/src/firmwares/ersky9x/ersky9xeeprom.cpp +++ b/companion/src/firmwares/ersky9x/ersky9xeeprom.cpp @@ -3,47 +3,14 @@ #include "ersky9xeeprom.h" #include -extern int8_t er9xFromSwitch(const RawSwitch & sw); extern RawSwitch er9xToSwitch(int8_t sw); -int setErSky9xTimerMode(TimerMode mode) -{ - if (mode == TMRMODE_OFF || mode == TMRMODE_ABS || mode == TMRMODE_THs || mode == TMRMODE_THp) - return mode; - else if (mode >= TMRMODE_FIRST_CHPERC) - return 4+mode-TMRMODE_FIRST_CHPERC; - else - return 0; -} - -TimerMode getErSky9xTimerMode(int mode) +RawSwitch getErSky9xTimerMode(int mode) { if (mode<4) - return TimerMode(mode); - else if (mode < 20) - return TimerMode(TMRMODE_FIRST_CHPERC+(mode-4)); + return RawSwitch(SWITCH_TYPE_TIMER_MODE, mode); else - return TimerMode(0); -} - -int8_t ersky9xFromSwitch(const RawSwitch & sw) -{ - switch (sw.type) { - case SWITCH_TYPE_SWITCH: - return sw.index; - case SWITCH_TYPE_VIRTUAL: - return sw.index > 0 ? (9 + sw.index) : (-9 + sw.index); - case SWITCH_TYPE_ON: - return 34; - case SWITCH_TYPE_OFF: - return -34; - case SWITCH_TYPE_MOMENT_SWITCH: - return sw.index > 0 ? (34 + sw.index) : (-34 + sw.index); - case SWITCH_TYPE_MOMENT_VIRTUAL: - return sw.index > 0 ? (31 + sw.index) : (-31 + sw.index); - default: - return 0; - } + return RawSwitch(); } RawSwitch ersky9xToSwitch(int8_t sw) @@ -60,26 +27,16 @@ RawSwitch ersky9xToSwitch(int8_t sw) else if (sw == -34) return RawSwitch(SWITCH_TYPE_OFF); else if (swa <= 34+9) - return RawSwitch(SWITCH_TYPE_MOMENT_SWITCH, sw > 0 ? sw-34 : sw+34); + return RawSwitch(SWITCH_TYPE_SWITCH, sw > 0 ? sw-34 : sw+34); else - return RawSwitch(SWITCH_TYPE_MOMENT_VIRTUAL, sw > 0 ? sw-34-9 : sw+34+9); + return RawSwitch(SWITCH_TYPE_VIRTUAL, sw > 0 ? sw-34-9 : sw+34+9); } - t_Ersky9xTrainerMix::t_Ersky9xTrainerMix() { memset(this, 0, sizeof(t_Ersky9xTrainerMix)); } -t_Ersky9xTrainerMix::t_Ersky9xTrainerMix(TrainerMix &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xTrainerMix)); - srcChn = c9x.src; - swtch = er9xFromSwitch(c9x.swtch); - studWeight = (8 * c9x.weight) / 25; - mode = c9x.mode; -} - t_Ersky9xTrainerMix::operator TrainerMix() { TrainerMix c9x; @@ -95,15 +52,6 @@ t_Ersky9xTrainerData::t_Ersky9xTrainerData() memset(this, 0, sizeof(t_Ersky9xTrainerData)); } -t_Ersky9xTrainerData::t_Ersky9xTrainerData(TrainerData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xTrainerData)); - for (int i=0; i 6) { + c9x.curve.type = CurveReference::CURVE_REF_CUSTOM; + c9x.curve.value = curve - 6; + } + else if (curve > 0) { + c9x.curve.type = CurveReference::CURVE_REF_FUNC; + c9x.curve.value = curve; + } + c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -398,7 +219,7 @@ t_Ersky9xMixData_v10::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - c9x.enableFmTrim=enableFmTrim; + // c9x.enableFmTrim=enableFmTrim; c9x.sOffset = sOffset; return c9x; } @@ -409,67 +230,6 @@ t_Ersky9xMixData_v11::t_Ersky9xMixData_v11() memset(this, 0, sizeof(t_Ersky9xMixData_v11)); } -t_Ersky9xMixData_v11::t_Ersky9xMixData_v11(MixData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xMixData_v11)); - destCh = c9x.destCh; - swtch = ersky9xFromSwitch(c9x.swtch); - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("ersky9x doesn't have Rotary Encoders") + "\n"; - srcRaw = 5 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 8; // MAX - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 45; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_GVAR) { - srcRaw = 46+c9x.srcRaw.index; // MAX - } - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 9; // FULL - swtch = ersky9xFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 10 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 13 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 21 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - EEPROMWarnings += ::QObject::tr("ersky9x doesn't have trims as source") + "\n"; - srcRaw = 0; // use pots instead - } - - weight = c9x.weight; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - if (c9x.carryTrim<0) { - EEPROMWarnings += ::QObject::tr("er9x doesn't have swappable trims") + "\n"; - carryTrim=1; - } else { - carryTrim = c9x.carryTrim; - } - mltpx = (MltpxValue)c9x.mltpx; - mixWarn = c9x.mixWarn; - enableFmTrim=c9x.enableFmTrim; - sOffset = c9x.sOffset; -} - t_Ersky9xMixData_v11::operator MixData () { MixData c9x; @@ -516,7 +276,15 @@ t_Ersky9xMixData_v11::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-21); } - c9x.curve = curve; + if (curve > 6) { + c9x.curve.type = CurveReference::CURVE_REF_CUSTOM; + c9x.curve.value = curve - 6; + } + else if (curve > 0) { + c9x.curve.type = CurveReference::CURVE_REF_FUNC; + c9x.curve.value = curve; + } + c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -524,60 +292,11 @@ t_Ersky9xMixData_v11::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - c9x.enableFmTrim=enableFmTrim; + // c9x.enableFmTrim=enableFmTrim; c9x.sOffset = sOffset; return c9x; } -int8_t ersky9xFromSource_v10(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("er9x on this board doesn't have Rotary Encoders") + "\n"; - v1 = 5+source.index; - } - else if (source.type == SOURCE_TYPE_MAX) - v1 = 8; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 0; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 10+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 13+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 21+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 36+source.index; - return v1; -} - -int8_t ersky9xFromSource_v11(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("er9x on this board doesn't have Rotary Encoders") + "\n"; - v1 = 5+source.index; - } - else if (source.type == SOURCE_TYPE_MAX) - v1 = 8; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 0; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 10+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 13+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 21+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 36+source.index; - return v1; -} - - RawSource ersky9xToSource_v10(int8_t value) { if (value == 0) { @@ -634,49 +353,22 @@ RawSource ersky9xToSource_v11(int8_t value) } } -t_Ersky9xCustomSwData_v10::t_Ersky9xCustomSwData_v10(CustomSwData &c9x) +Ersky9xLogicalSwitchData_v10::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = ersky9xFromSource_v10(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - v2 = ersky9xFromSource_v10(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = er9xFromSwitch(RawSwitch(c9x.val1)); - v2 = er9xFromSwitch(RawSwitch(c9x.val2)); - } - - if (func>ERSKY9X_MAX_CSFUNC ) { - EEPROMWarnings += ::QObject::tr("ersky9x does not support Custom Switch function %1").arg(getFuncName(func)) + "\n"; - func=0; - v1=0; - v2=0; - } -} - -Ersky9xCustomSwData_v10::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = ersky9xToSource_v10(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = ersky9xToSource_v10(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = er9xToSwitch(v1).toValue(); c9x.val2 = er9xToSwitch(v2).toValue(); } @@ -684,49 +376,22 @@ Ersky9xCustomSwData_v10::operator CustomSwData () return c9x; } -t_Ersky9xCustomSwData_v11::t_Ersky9xCustomSwData_v11(CustomSwData &c9x) +Ersky9xLogicalSwitchData_v11::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = ersky9xFromSource_v11(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - v2 = ersky9xFromSource_v11(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = er9xFromSwitch(RawSwitch(c9x.val1)); - v2 = er9xFromSwitch(RawSwitch(c9x.val2)); - } - - if (func>ERSKY9X_MAX_CSFUNC ) { - EEPROMWarnings += ::QObject::tr("ersky9x does not support Custom Switch function %1").arg(getFuncName(func)) + "\n"; - func=0; - v1=0; - v2=0; - } -} - -Ersky9xCustomSwData_v11::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = ersky9xToSource_v11(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = ersky9xToSource_v11(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = er9xToSwitch(v1).toValue(); c9x.val2 = er9xToSwitch(v2).toValue(); } @@ -739,69 +404,16 @@ t_Ersky9xSafetySwData_v10::t_Ersky9xSafetySwData_v10() memset(this, 0, sizeof(t_Ersky9xSafetySwData_v10)); } -t_Ersky9xSafetySwData_v10::t_Ersky9xSafetySwData_v10(SafetySwData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xSafetySwData_v10)); - swtch = er9xFromSwitch(c9x.swtch); - val = c9x.val; -} - -t_Ersky9xSafetySwData_v10::operator SafetySwData () -{ - SafetySwData c9x; - c9x.swtch = er9xToSwitch(swtch); - c9x.val = val; - return c9x; -} - t_Ersky9xSafetySwData_v11::t_Ersky9xSafetySwData_v11() { memset(this, 0, sizeof(t_Ersky9xSafetySwData_v11)); } -t_Ersky9xSafetySwData_v11::t_Ersky9xSafetySwData_v11(SafetySwData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xSafetySwData_v11)); - opt.ss.swtch = ersky9xFromSwitch(c9x.swtch); - opt.ss.val = c9x.val; -} - -t_Ersky9xSafetySwData_v11::operator SafetySwData () -{ - SafetySwData c9x; - c9x.swtch = ersky9xToSwitch(opt.ss.swtch); - c9x.val = opt.ss.val; - return c9x; -} - t_Ersky9xFrSkyChannelData_v10::t_Ersky9xFrSkyChannelData_v10() { memset(this, 0, sizeof(t_Ersky9xFrSkyChannelData_v10)); } -t_Ersky9xFrSkyChannelData_v10::t_Ersky9xFrSkyChannelData_v10(FrSkyChannelData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xFrSkyChannelData_v10)); - ratio = c9x.ratio; - alarms_value[0] = c9x.alarms[0].value; - alarms_value[1] = c9x.alarms[1].value; - alarms_level = (c9x.alarms[1].level << 2) + c9x.alarms[0].level; - alarms_greater = (c9x.alarms[1].greater << 1) + c9x.alarms[0].greater; - if (c9x.type==0) { - if (c9x.multiplier==0) { - type = 0; - } else if (c9x.multiplier==1) { - type = 2; - } else { - EEPROMWarnings += ::QObject::tr("er9x does not support this range for A1/A2") + "\n"; - } - } else if (c9x.type==1 || c9x.type==3) { - type=c9x.type; - } else { - EEPROMWarnings += ::QObject::tr("er9x does not support this telemetry units") + "\n"; - } -} - t_Ersky9xFrSkyChannelData_v10::operator FrSkyChannelData () { FrSkyChannelData c9x; @@ -826,29 +438,6 @@ t_Ersky9xFrSkyChannelData_v11::t_Ersky9xFrSkyChannelData_v11() memset(this, 0, sizeof(t_Ersky9xFrSkyChannelData_v11)); } -t_Ersky9xFrSkyChannelData_v11::t_Ersky9xFrSkyChannelData_v11(FrSkyChannelData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xFrSkyChannelData_v11)); - ratio = c9x.ratio; - alarms_value[0] = c9x.alarms[0].value; - alarms_value[1] = c9x.alarms[1].value; - alarms_level = (c9x.alarms[1].level << 2) + c9x.alarms[0].level; - alarms_greater = (c9x.alarms[1].greater << 1) + c9x.alarms[0].greater; - if (c9x.type==0) { - if (c9x.multiplier==0) { - type = 0; - } else if (c9x.multiplier==1) { - type = 2; - } else { - EEPROMWarnings += ::QObject::tr("er9x does not support this range for A1/A2") + "\n"; - } - } else if (c9x.type==1 || c9x.type==3) { - type=c9x.type; - } else { - EEPROMWarnings += ::QObject::tr("er9x does not support this telemetry units") + "\n"; - } -} - t_Ersky9xFrSkyChannelData_v11::operator FrSkyChannelData () { FrSkyChannelData c9x; @@ -873,13 +462,6 @@ t_Ersky9xFrSkyData_v10::t_Ersky9xFrSkyData_v10() memset(this, 0, sizeof(t_Ersky9xFrSkyData_v10)); } -t_Ersky9xFrSkyData_v10::t_Ersky9xFrSkyData_v10(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xFrSkyData_v10)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; -} - t_Ersky9xFrSkyData_v10::operator FrSkyData () { FrSkyData c9x; @@ -893,13 +475,6 @@ t_Ersky9xFrSkyData_v11::t_Ersky9xFrSkyData_v11() memset(this, 0, sizeof(t_Ersky9xFrSkyData_v11)); } -t_Ersky9xFrSkyData_v11::t_Ersky9xFrSkyData_v11(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xFrSkyData_v11)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; -} - t_Ersky9xFrSkyData_v11::operator FrSkyData () { FrSkyData c9x; @@ -908,168 +483,6 @@ t_Ersky9xFrSkyData_v11::operator FrSkyData () return c9x; } -t_Ersky9xModelData_v10::t_Ersky9xModelData_v10(ModelData &c9x) -{ - memset(this, 0, sizeof(t_Ersky9xModelData_v10)); - - if (c9x.used) { - setEEPROMString(name, c9x.name, sizeof(name)); - reserved_spare = 0; - spare21 = 0; - sparex = 0; - spare22 = 0; - for (int i=0; i<2; i++) { - timer[i].tmrModeA = setErSky9xTimerMode(c9x.timers[i].mode); - timer[i].tmrModeB = c9x.timers[i].modeB; - timer[i].tmrDir = c9x.timers[i].dir; - timer[i].tmrVal = c9x.timers[i].val; - } - switch(c9x.moduleData[0].protocol) { - case PPM: - protocol = 0; - break; - case PXX_DJT: - protocol = 1; - break; - case DSM2: - protocol = 2; - break; - case PPM16: - protocol = 3; - break; - default: - protocol = 0; - EEPROMWarnings += QObject::tr("Ersky9x doesn't accept this protocol") + "\n"; - // TODO more explicit warning for each protocol - break; - } - traineron = c9x.traineron; - // t2throttle = c9x.t2throttle; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - ppmNCH = (c9x.moduleData[0].channelsCount - 8) / 2; - thrTrim = c9x.thrTrim; - thrExpo = c9x.thrExpo; - trimInc = c9x.trimInc; - ppmDelay = (c9x.moduleData[0].ppmDelay - 300) / 50; - for (unsigned int i=0; i #include "eeprominterface.h" -extern TimerMode getEr9xTimerMode(int mode); -extern int setEr9xTimerMode(TimerMode mode); +extern RawSwitch getEr9xTimerMode(int mode); //eeprom data #define ERSKY9X_MAX_MIXERS_V10 32 @@ -51,8 +50,6 @@ PACK(typedef struct t_Ersky9xTrainerMix { operator TrainerMix(); t_Ersky9xTrainerMix(); - t_Ersky9xTrainerMix(TrainerMix&); - }) Ersky9xTrainerMix; // PACK(typedef struct t_Ersky9xTrainerData { @@ -61,8 +58,6 @@ PACK(typedef struct t_Ersky9xTrainerData { operator TrainerData(); t_Ersky9xTrainerData(); - t_Ersky9xTrainerData(TrainerData&); - }) Ersky9xTrainerData; PACK(typedef struct t_Ersky9xGeneral { @@ -122,8 +117,6 @@ PACK(typedef struct t_Ersky9xGeneral { uint8_t rotaryDivisor ; operator GeneralSettings(); t_Ersky9xGeneral(); - t_Ersky9xGeneral(GeneralSettings&); - }) Ersky9xGeneral; PACK(typedef struct t_Ersky9xExpoData { @@ -143,7 +136,6 @@ PACK(typedef struct t_Ersky9xLimitData { operator LimitData(); t_Ersky9xLimitData() ; - t_Ersky9xLimitData(LimitData&); }) Ersky9xLimitData; #define MLTPX_ADD 0 @@ -170,7 +162,6 @@ PACK(typedef struct t_Ersky9xMixData_v10 { operator MixData(); t_Ersky9xMixData_v10(); - t_Ersky9xMixData_v10(MixData&); }) Ersky9xMixData_v10; PACK(typedef struct t_Ersky9xMixData_v11 { @@ -192,40 +183,33 @@ PACK(typedef struct t_Ersky9xMixData_v11 { uint8_t res[4]; operator MixData(); t_Ersky9xMixData_v11(); - t_Ersky9xMixData_v11(MixData&); }) Ersky9xMixData_v11; -PACK(typedef struct t_Ersky9xCustomSwData_v10 { // Custom Switches data +PACK(typedef struct t_Ersky9xLogicalSwitchData_v10 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; - operator CustomSwData(); - t_Ersky9xCustomSwData_v10() { memset(this, 0, sizeof(t_Ersky9xCustomSwData_v10)); } - t_Ersky9xCustomSwData_v10(CustomSwData&); + operator LogicalSwitchData(); + t_Ersky9xLogicalSwitchData_v10() { memset(this, 0, sizeof(t_Ersky9xLogicalSwitchData_v10)); } +}) Ersky9xLogicalSwitchData_v10; -}) Ersky9xCustomSwData_v10; - -PACK(typedef struct t_Ersky9xCustomSwData_v11 { // Custom Switches data +PACK(typedef struct t_Ersky9xLogicalSwitchData_v11 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; uint8_t andsw; uint8_t res ; - operator CustomSwData(); - t_Ersky9xCustomSwData_v11() { memset(this, 0, sizeof(t_Ersky9xCustomSwData_v11)); } - t_Ersky9xCustomSwData_v11(CustomSwData&); - -}) Ersky9xCustomSwData_v11; + operator LogicalSwitchData(); + t_Ersky9xLogicalSwitchData_v11() { memset(this, 0, sizeof(t_Ersky9xLogicalSwitchData_v11)); } +}) Ersky9xLogicalSwitchData_v11; PACK(typedef struct t_Ersky9xSafetySwData_v10 { // Custom Switches data int8_t swtch; int8_t val; - operator SafetySwData(); t_Ersky9xSafetySwData_v10(); - t_Ersky9xSafetySwData_v10(SafetySwData&); }) Ersky9xSafetySwData_v10; PACK(typedef struct t_Ersky9xSafetySwData_v11 { // Custom Switches data @@ -244,9 +228,7 @@ PACK(typedef struct t_Ersky9xSafetySwData_v11 { // Custom Switches data } vs ; } opt ; - operator SafetySwData(); t_Ersky9xSafetySwData_v11(); - t_Ersky9xSafetySwData_v11(SafetySwData&); }) Ersky9xSafetySwData_v11; PACK(typedef struct t_Ersky9xgvar { @@ -281,7 +263,6 @@ PACK(typedef struct t_Ersky9xFrSkyChannelData_v10 { operator FrSkyChannelData(); t_Ersky9xFrSkyChannelData_v10(); - t_Ersky9xFrSkyChannelData_v10(FrSkyChannelData&); }) Ersky9xFrSkyChannelData_v10; PACK(typedef struct t_Ersky9xFrSkyData_v10 { @@ -289,7 +270,6 @@ PACK(typedef struct t_Ersky9xFrSkyData_v10 { operator FrSkyData(); t_Ersky9xFrSkyData_v10(); - t_Ersky9xFrSkyData_v10(FrSkyData&); }) Ersky9xFrSkyData_v10; PACK(typedef struct t_Ersky9xFrSkyChannelData_v11 { @@ -303,7 +283,6 @@ PACK(typedef struct t_Ersky9xFrSkyChannelData_v11 { operator FrSkyChannelData(); t_Ersky9xFrSkyChannelData_v11(); - t_Ersky9xFrSkyChannelData_v11(FrSkyChannelData&); }) Ersky9xFrSkyChannelData_v11; PACK(typedef struct t_Ersky9xFrSkyData_v11 { @@ -311,7 +290,6 @@ PACK(typedef struct t_Ersky9xFrSkyData_v11 { operator FrSkyData(); t_Ersky9xFrSkyData_v11(); - t_Ersky9xFrSkyData_v11(FrSkyData&); }) Ersky9xFrSkyData_v11; PACK(typedef struct t_Ersky9xFrSkyalarms_v11 { @@ -382,7 +360,7 @@ PACK(typedef struct t_Ersky9xModelData_v10 { int8_t trim[4]; int8_t curves5[ERSKY9X_MAX_CURVE5][5]; int8_t curves9[ERSKY9X_MAX_CURVE9][9]; - Ersky9xCustomSwData_v10 customSw[ERSKY9X_NUM_CSW_V10]; + Ersky9xLogicalSwitchData_v10 customSw[ERSKY9X_NUM_CSW_V10]; uint8_t frSkyVoltThreshold ; uint8_t res3[2]; Ersky9xSafetySwData_v10 safetySw[ERSKY9X_NUM_CHNOUT_V10]; @@ -390,7 +368,6 @@ PACK(typedef struct t_Ersky9xModelData_v10 { Ersky9xTimerMode_v10 timer[2] ; operator ModelData(); t_Ersky9xModelData_v10() { memset(this, 0, sizeof(t_Ersky9xModelData_v10)); } - t_Ersky9xModelData_v10(ModelData&); }) Ersky9xModelData_v10; PACK(typedef struct t_Ersky9xModelData_v11 { @@ -432,7 +409,7 @@ PACK(typedef struct t_Ersky9xModelData_v11 { int8_t curves5[ERSKY9X_MAX_CURVE5][5]; int8_t curves9[ERSKY9X_MAX_CURVE9][9]; int8_t curvexy[18]; - Ersky9xCustomSwData_v11 customSw[ERSKY9X_NUM_CSW_V11]; + Ersky9xLogicalSwitchData_v11 customSw[ERSKY9X_NUM_CSW_V11]; uint8_t frSkyVoltThreshold ; uint8_t bt_telemetry; uint8_t numVoice; // 0-16, rest are Safety switches @@ -449,8 +426,6 @@ PACK(typedef struct t_Ersky9xModelData_v11 { operator ModelData(); t_Ersky9xModelData_v11() { memset(this, 0, sizeof(t_Ersky9xModelData_v11)); } - t_Ersky9xModelData_v11(ModelData&); }) Ersky9xModelData_v11; #endif -/*eof*/ diff --git a/companion/src/firmwares/ersky9x/ersky9xinterface.cpp b/companion/src/firmwares/ersky9x/ersky9xinterface.cpp index 412d13520..7ff98b5a1 100644 --- a/companion/src/firmwares/ersky9x/ersky9xinterface.cpp +++ b/companion/src/firmwares/ersky9x/ersky9xinterface.cpp @@ -74,11 +74,11 @@ inline void applyStickModeToModel(Ersky9xModelData_v10 & model, unsigned int mod for (int i=0; iEeFsOpen(eeprom, size, BOARD_SKY9X)) { + if (!efile->EeFsOpen((uint8_t *)eeprom, size, BOARD_SKY9X)) { std::cout << "wrong file system\n"; return false; } @@ -228,33 +228,10 @@ bool Ersky9xInterface::loadBackup(RadioData &radioData, uint8_t *eeprom, int esi int Ersky9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t variant, uint8_t version) { - EEPROMWarnings.clear(); + std::cout << "NO!\n"; + // TODO an error - efile->EeFsCreate(eeprom, EESIZE_SKY9X, BOARD_SKY9X); - - Ersky9xGeneral ersky9xGeneral(radioData.generalSettings); - int sz = efile->writeRlc2(FILE_GENERAL, FILE_TYP_GENERAL, (uint8_t*)&ersky9xGeneral, sizeof(Ersky9xGeneral)); - if(sz != sizeof(Ersky9xGeneral)) { - return 0; - } - - for (int i=0; iwriteRlc2(FILE_MODEL(i), FILE_TYP_MODEL, (uint8_t*)&ersky9xModel, sizeof(Ersky9xModelData_v11)); - if(sz != sizeof(Ersky9xModelData_v11)) { - return 0; - } - } - } - - if (!EEPROMWarnings.isEmpty()) - QMessageBox::warning(NULL, - QObject::tr("Warning"), - QObject::tr("EEPROM saved with these warnings:") + "\n- " + EEPROMWarnings.remove(EEPROMWarnings.length()-1, 1).replace("\n", "\n- ")); - - return EESIZE_SKY9X; + return 0; } int Ersky9xInterface::getSize(ModelData &model) @@ -272,12 +249,6 @@ int Ersky9xInterface::getCapability(const Capability capability) switch (capability) { case Mixes: return ERSKY9X_MAX_MIXERS_V11; - case NumCurves5: - return ERSKY9X_MAX_CURVE5; - case NumCurves9: - return ERSKY9X_MAX_CURVE9; - case MixFmTrim: - return 1; case PPMExtCtrl: return 1; case ModelTrainerEnable: @@ -306,17 +277,15 @@ int Ersky9xInterface::getCapability(const Capability capability) return 2; case Pots: return 3; - case GvarsNum: + case Gvars: return 7; - case GvarsOfsNum: - return 5; case Switches: return 7; case SwitchesPositions: return 9; case CustomFunctions: return 0; - case CustomSwitches: + case LogicalSwitches: return ERSKY9X_NUM_CSW_V11; case CustomAndSwitches: return 1; @@ -338,8 +307,6 @@ int Ersky9xInterface::getCapability(const Capability capability) return 1; case OptrexDisplay: return 1; - case TimerTriggerB: - return 2; case HasAltitudeSel: case HasCurrentCalibration: case HasVolume: @@ -350,13 +317,6 @@ int Ersky9xInterface::getCapability(const Capability capability) return 125; case MaxVolume: return 23; - case Gvars: - case GvarsHaveSources: - case GvarsAsSources: - case GvarsAsWeight: - return 1; - case InstantTrimSW: - return 1; case TelemetryMaxMultiplier: return 2; case LCDWidth: @@ -383,7 +343,7 @@ int Ersky9xInterface::isAvailable(Protocol prot, int port) SimulatorInterface * Ersky9xInterface::getSimulator() { - return new Ersky9xSimulator(this); + return NULL; // new Ersky9xSimulator(this); } diff --git a/companion/src/firmwares/ersky9x/ersky9xinterface.h b/companion/src/firmwares/ersky9x/ersky9xinterface.h index 23473eae4..d37151c05 100644 --- a/companion/src/firmwares/ersky9x/ersky9xinterface.h +++ b/companion/src/firmwares/ersky9x/ersky9xinterface.h @@ -34,7 +34,7 @@ class Ersky9xInterface : public EEPROMInterface virtual const int getMaxModels(); - virtual bool load(RadioData &, uint8_t * eeprom, int size); + virtual bool load(RadioData &, const uint8_t * eeprom, int size); virtual bool loadBackup(RadioData &, uint8_t * eeprom, int esize, int index); diff --git a/companion/src/firmwares/gruvin9x/gruvin9xeeprom.cpp b/companion/src/firmwares/gruvin9x/gruvin9xeeprom.cpp index c1c740efb..cc42de8f8 100644 --- a/companion/src/firmwares/gruvin9x/gruvin9xeeprom.cpp +++ b/companion/src/firmwares/gruvin9x/gruvin9xeeprom.cpp @@ -6,7 +6,6 @@ #define EEPROM_VER 106 -extern void setEEPROMZString(char *dst, const char *src, int size); extern void getEEPROMZString(char *dst, const char *src, int size); RawSwitch gruvin9xToSwitch(int8_t sw) @@ -19,18 +18,6 @@ RawSwitch gruvin9xToSwitch(int8_t sw) return RawSwitch(SWITCH_TYPE_VIRTUAL, sw > 0 ? sw-9 : sw+9); } -int8_t gruvin9xFromSwitch(const RawSwitch & sw) -{ - switch (sw.type) { - case SWITCH_TYPE_SWITCH: - return sw.index; - case SWITCH_TYPE_VIRTUAL: - return sw.index > 0 ? (9 + sw.index) : (-9 + sw.index); - default: - return 0; - } -} - t_Gruvin9xTrainerMix_v103::operator TrainerMix() { TrainerMix c9x; @@ -50,14 +37,6 @@ t_Gruvin9xTrainerMix_v104::operator TrainerMix() return c9x; } -t_Gruvin9xTrainerMix_v104::t_Gruvin9xTrainerMix_v104(TrainerMix &c9x) -{ - memset(this, 0, sizeof(t_Gruvin9xTrainerMix_v104)); - srcChn = c9x.src; - studWeight = c9x.weight; - mode = c9x.mode; -} - t_Gruvin9xTrainerData_v103::operator TrainerData () { TrainerData c9x; @@ -78,16 +57,6 @@ t_Gruvin9xTrainerData_v104::operator TrainerData () return c9x; } -t_Gruvin9xTrainerData_v104::t_Gruvin9xTrainerData_v104(TrainerData &c9x) -{ - memset(this, 0, sizeof(t_Gruvin9xTrainerData_v104)); - for (int i=0; i>=1; - } - if (zeros==G9X_MAX_PHASES || zeros==0) { - phase=0; - negPhase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - negPhase=0; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=(ph+1); - negPhase=1; - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on expos not exported") + "\n"; - } - weight = c9x.weight; - expo = c9x.expo; -} - t_Gruvin9xExpoData::operator ExpoData () { ExpoData c9x; c9x.mode = mode; c9x.chn = chn; - c9x.curveParam = curve; - c9x.curveMode=1; c9x.swtch = gruvin9xToSwitch(swtch); if (negPhase) { c9x.phases= 1 << (phase -1); @@ -325,7 +180,18 @@ t_Gruvin9xExpoData::operator ExpoData () c9x.phases &= ~(1 << (phase -1)); } c9x.weight = weight; - c9x.expo = expo; + if (expo) { + c9x.curve.type = CurveReference::CURVE_REF_EXPO; + c9x.curve.value = expo; + } + else if (curve > 6) { + c9x.curve.type = CurveReference::CURVE_REF_CUSTOM; + c9x.curve.value = curve - 6; + } + else if (curve > 0) { + c9x.curve.type = CurveReference::CURVE_REF_FUNC; + c9x.curve.value = curve; + } return c9x; } @@ -334,14 +200,6 @@ t_Gruvin9xLimitData::t_Gruvin9xLimitData() memset(this, 0, sizeof(t_Gruvin9xLimitData)); } -t_Gruvin9xLimitData::t_Gruvin9xLimitData(LimitData &c9x) -{ - min = c9x.min+100; - max = c9x.max-100; - revert = c9x.revert; - offset = c9x.offset; -} - t_Gruvin9xLimitData::operator LimitData () { LimitData c9x; @@ -352,67 +210,11 @@ t_Gruvin9xLimitData::operator LimitData () return c9x; } - t_Gruvin9xMixData::t_Gruvin9xMixData() { memset(this, 0, sizeof(t_Gruvin9xMixData)); } -t_Gruvin9xMixData::t_Gruvin9xMixData(MixData &c9x) -{ - destCh = c9x.destCh; - mixWarn = c9x.mixWarn; - swtch = gruvin9xFromSwitch(c9x.swtch); - - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("Open9x on this board doesn't have Rotary Encoders") + "\n"; - srcRaw = 5 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 8; // MAX - } - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 9; // FULL - swtch = c9x.srcRaw.index+1; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 10 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 13 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 21 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - EEPROMWarnings += ::QObject::tr("gruvin9x doesn't have trims as source") + "\n"; - srcRaw = 0; // use pots instead - } - - weight = c9x.weight; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - if (c9x.carryTrim<0) { - EEPROMWarnings += ::QObject::tr("gruvin9x doesn't have swappable trims") + "\n"; - carryTrim=1; - } else { - carryTrim = c9x.carryTrim; - } - mltpx = (MltpxValue)c9x.mltpx; -// phase = c9x.phase; - sOffset = c9x.sOffset; -} - t_Gruvin9xMixData::operator MixData () { MixData c9x; @@ -450,7 +252,6 @@ t_Gruvin9xMixData::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-21); } - c9x.curve = curve; c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -458,34 +259,18 @@ t_Gruvin9xMixData::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - // c9x.phase = phase; c9x.sOffset = sOffset; - return c9x; -} - -int8_t gruvin9xFromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("gruvin9x on this board doesn't have Rotary Encoders") + "\n"; - v1 = 5+source.index; + if (curve > 6) { + c9x.curve.type = CurveReference::CURVE_REF_CUSTOM; + c9x.curve.value = curve - 6; } - else if (source.type == SOURCE_TYPE_MAX) - v1 = 8; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 0; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 10+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 13+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 21+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 36+source.index; - return v1; + else if (curve > 0) { + c9x.curve.type = CurveReference::CURVE_REF_FUNC; + c9x.curve.value = curve; + } + + return c9x; } RawSource gruvin9xToSource(int8_t value) @@ -516,49 +301,22 @@ RawSource gruvin9xToSource(int8_t value) } } -t_Gruvin9xCustomSwData::t_Gruvin9xCustomSwData(CustomSwData &c9x) +Gruvin9xLogicalSwitchData::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = gruvin9xFromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - v2 = gruvin9xFromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = gruvin9xFromSwitch(RawSwitch(c9x.val1)); - v2 = gruvin9xFromSwitch(RawSwitch(c9x.val2)); - } - - if (func>GR9X_MAX_CSFUNC ) { - EEPROMWarnings += ::QObject::tr("gruvin9x does not support Custom Switch function %1").arg(getFuncName(func)) + "\n"; - func=0; - v1=0; - v2=0; - } -} - -Gruvin9xCustomSwData::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = gruvin9xToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = gruvin9xToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = gruvin9xToSwitch(v1).toValue(); c9x.val2 = gruvin9xToSwitch(v2).toValue(); } @@ -566,12 +324,6 @@ Gruvin9xCustomSwData::operator CustomSwData () return c9x; } -t_Gruvin9xFuncSwData::t_Gruvin9xFuncSwData(FuncSwData &c9x) -{ - swtch = gruvin9xFromSwitch(c9x.swtch); - func = c9x.func - G9X_NUM_CHNOUT; -} - Gruvin9xFuncSwData::operator FuncSwData () { FuncSwData c9x; @@ -580,35 +332,11 @@ Gruvin9xFuncSwData::operator FuncSwData () return c9x; } -t_Gruvin9xSafetySwData::t_Gruvin9xSafetySwData(SafetySwData &c9x) -{ - swtch = gruvin9xFromSwitch(c9x.swtch); - val = c9x.val; -} - -t_Gruvin9xSafetySwData::operator SafetySwData () -{ - SafetySwData c9x; - c9x.swtch = gruvin9xToSwitch(swtch); - c9x.val = val; - return c9x; -} - t_Gruvin9xSwashRingData::t_Gruvin9xSwashRingData() { memset(this, 0, sizeof(t_Gruvin9xSwashRingData)); } -t_Gruvin9xSwashRingData::t_Gruvin9xSwashRingData(SwashRingData &c9x) -{ - invertELE = c9x.invertELE; - invertAIL = c9x.invertAIL; - invertCOL = c9x.invertCOL; - type = c9x.type; - collectiveSource = gruvin9xFromSource(c9x.collectiveSource); - value = c9x.value; -} - t_Gruvin9xSwashRingData::operator SwashRingData () { SwashRingData c9x; @@ -645,21 +373,7 @@ t_Gruvin9xPhaseData_v106::operator PhaseData () return c9x; } -t_Gruvin9xPhaseData_v106::t_Gruvin9xPhaseData_v106(PhaseData &c9x) -{ - trim_ext = 0; - for (int i=0; i> 2); - trim_ext = (trim_ext & ~(0x03 << (2*i))) + (((c9x.trim[i] & 0x03) << (2*i))); - } - swtch = gruvin9xFromSwitch(c9x.swtch); - setEEPROMZString(name, c9x.name, sizeof(name)); - fadeIn = c9x.fadeIn; - fadeOut = c9x.fadeOut; -} - -extern TimerMode getEr9xTimerMode(int mode); -extern int setEr9xTimerMode(TimerMode mode); +extern RawSwitch getEr9xTimerMode(int mode); t_Gruvin9xTimerData::operator TimerData () { @@ -670,29 +384,11 @@ t_Gruvin9xTimerData::operator TimerData () return c9x; } -t_Gruvin9xTimerData::t_Gruvin9xTimerData(TimerData &c9x) -{ - mode = setEr9xTimerMode(c9x.mode); - val = c9x.val; - dir = c9x.dir; -} - t_Gruvin9xFrSkyChannelData::t_Gruvin9xFrSkyChannelData() { memset(this, 0, sizeof(t_Gruvin9xFrSkyChannelData)); } -t_Gruvin9xFrSkyChannelData::t_Gruvin9xFrSkyChannelData(FrSkyChannelData &c9x) -{ - memset(this, 0, sizeof(t_Gruvin9xFrSkyChannelData)); - ratio = c9x.ratio; - alarms_value[0] = c9x.alarms[0].value; - alarms_value[1] = c9x.alarms[1].value; - alarms_level = (c9x.alarms[1].level << 2) + c9x.alarms[0].level; - alarms_greater = (c9x.alarms[1].greater << 1) + c9x.alarms[0].greater; - type = c9x.type; -} - t_Gruvin9xFrSkyChannelData::operator FrSkyChannelData () { FrSkyChannelData c9x; @@ -707,19 +403,11 @@ t_Gruvin9xFrSkyChannelData::operator FrSkyChannelData () return c9x; } - t_Gruvin9xFrSkyData::t_Gruvin9xFrSkyData() { memset(this, 0, sizeof(t_Gruvin9xFrSkyData)); } -t_Gruvin9xFrSkyData::t_Gruvin9xFrSkyData(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Gruvin9xFrSkyData)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; -} - t_Gruvin9xFrSkyData::operator FrSkyData () { FrSkyData c9x; @@ -728,7 +416,6 @@ t_Gruvin9xFrSkyData::operator FrSkyData () return c9x; } - t_Gruvin9xModelData_v102::operator ModelData () { ModelData c9x; @@ -763,7 +450,7 @@ t_Gruvin9xModelData_v102::operator ModelData () c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; c9x.thrExpo = thrExpo; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc-2; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; c9x.moduleData[0].ppmPulsePol = pulsePol; @@ -778,7 +465,6 @@ t_Gruvin9xModelData_v102::operator ModelData () c9x.expoData[i] = expoData[i]; for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - } - else { - memset(this, 0, sizeof(t_Gruvin9xModelData_v106)); - } -} - diff --git a/companion/src/firmwares/gruvin9x/gruvin9xeeprom.h b/companion/src/firmwares/gruvin9x/gruvin9xeeprom.h index f2e0cf1e2..8886c83d1 100644 --- a/companion/src/firmwares/gruvin9x/gruvin9xeeprom.h +++ b/companion/src/firmwares/gruvin9x/gruvin9xeeprom.h @@ -38,8 +38,6 @@ PACK(typedef struct t_Gruvin9xTrainerMix_v104 { operator TrainerMix(); t_Gruvin9xTrainerMix_v104() { memset(this, 0, sizeof(t_Gruvin9xTrainerMix_v104)); } - t_Gruvin9xTrainerMix_v104(TrainerMix&); - }) Gruvin9xTrainerMix_v104; // PACK(typedef struct t_Gruvin9xTrainerData_v103 { @@ -55,8 +53,6 @@ PACK(typedef struct t_Gruvin9xTrainerData_v104 { operator TrainerData(); t_Gruvin9xTrainerData_v104() { memset(this, 0, sizeof(t_Gruvin9xTrainerData_v104)); } - t_Gruvin9xTrainerData_v104(TrainerData&); - }) Gruvin9xTrainerData_v104; PACK(typedef struct t_Gruvin9xFrSkyRSSIAlarm { @@ -136,8 +132,6 @@ PACK(typedef struct t_Gruvin9xGeneral_v104 { operator GeneralSettings(); t_Gruvin9xGeneral_v104() { memset(this, 0, sizeof(t_Gruvin9xGeneral_v104)); } - t_Gruvin9xGeneral_v104(GeneralSettings&); - }) Gruvin9xGeneral_v104; typedef Gruvin9xGeneral_v104 Gruvin9xGeneral; @@ -156,8 +150,6 @@ PACK(typedef struct t_Gruvin9xExpoData { operator ExpoData(); t_Gruvin9xExpoData(); - t_Gruvin9xExpoData(ExpoData&); - }) Gruvin9xExpoData; PACK(typedef struct t_Gruvin9xLimitData { @@ -168,8 +160,6 @@ PACK(typedef struct t_Gruvin9xLimitData { operator LimitData(); t_Gruvin9xLimitData(); - t_Gruvin9xLimitData(LimitData&); - }) Gruvin9xLimitData; #define MLTPX_ADD 0 @@ -194,29 +184,22 @@ PACK(typedef struct t_Gruvin9xMixData { operator MixData(); t_Gruvin9xMixData(); - t_Gruvin9xMixData(MixData&); - }) Gruvin9xMixData; -PACK(typedef struct t_Gruvin9xCustomSwData { // Custom Switches data +PACK(typedef struct t_Gruvin9xLogicalSwitchData { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; - operator CustomSwData(); - t_Gruvin9xCustomSwData() { memset(this, 0, sizeof(t_Gruvin9xCustomSwData)); } - t_Gruvin9xCustomSwData(CustomSwData&); - -}) Gruvin9xCustomSwData; + operator LogicalSwitchData(); + t_Gruvin9xLogicalSwitchData() { memset(this, 0, sizeof(t_Gruvin9xLogicalSwitchData)); } +}) Gruvin9xLogicalSwitchData; PACK(typedef struct t_Gruvin9xSafetySwData { // Safety Switches data int8_t swtch; int8_t val; - operator SafetySwData(); t_Gruvin9xSafetySwData() { memset(this, 0, sizeof(t_Gruvin9xSafetySwData)); } - t_Gruvin9xSafetySwData(SafetySwData&); - }) Gruvin9xSafetySwData; PACK(typedef struct t_Gruvin9xFuncSwData { // Function Switches data @@ -225,8 +208,6 @@ PACK(typedef struct t_Gruvin9xFuncSwData { // Function Switches data operator FuncSwData(); t_Gruvin9xFuncSwData() { memset(this, 0, sizeof(t_Gruvin9xFuncSwData)); } - t_Gruvin9xFuncSwData(FuncSwData&); - }) Gruvin9xFuncSwData; PACK(typedef struct t_Gruvin9xFrSkyChannelData { @@ -242,17 +223,13 @@ PACK(typedef struct t_Gruvin9xFrSkyChannelData { operator FrSkyChannelData(); t_Gruvin9xFrSkyChannelData(); - t_Gruvin9xFrSkyChannelData(FrSkyChannelData&); - }) Gruvin9xFrSkyChannelData; PACK(typedef struct t_Gruvin9xFrSkyData { - Gruvin9xFrSkyChannelData channels[2]; - - operator FrSkyData(); - t_Gruvin9xFrSkyData(); - t_Gruvin9xFrSkyData(FrSkyData&); + Gruvin9xFrSkyChannelData channels[2]; + operator FrSkyData(); + t_Gruvin9xFrSkyData(); }) Gruvin9xFrSkyData; PACK(typedef struct t_Gruvin9xSwashRingData { // Swash Ring data @@ -265,8 +242,6 @@ PACK(typedef struct t_Gruvin9xSwashRingData { // Swash Ring data operator SwashRingData(); t_Gruvin9xSwashRingData(); - t_Gruvin9xSwashRingData(SwashRingData&); - }) Gruvin9xSwashRingData; PACK(typedef struct t_Gruvin9xPhaseData_v102 { @@ -291,7 +266,6 @@ PACK(typedef struct t_Gruvin9xPhaseData_v106 { operator PhaseData(); t_Gruvin9xPhaseData_v106() { memset(this, 0, sizeof(t_Gruvin9xPhaseData_v106)); } - t_Gruvin9xPhaseData_v106(PhaseData &eepe); }) Gruvin9xPhaseData_v106; PACK(typedef struct t_Gruvin9xTimerData { @@ -301,7 +275,6 @@ PACK(typedef struct t_Gruvin9xTimerData { operator TimerData(); t_Gruvin9xTimerData() { memset(this, 0, sizeof(t_Gruvin9xTimerData)); } - t_Gruvin9xTimerData(TimerData &eepe); }) Gruvin9xTimerData; #define G9X_MAX_PHASES 5 @@ -336,7 +309,7 @@ PACK(typedef struct t_Gruvin9xModelData_v102 { Gruvin9xExpoData expoData[G9X_MAX_EXPOS]; int8_t curves5[G9X_MAX_CURVE5][5]; int8_t curves9[G9X_MAX_CURVE9][9]; - Gruvin9xCustomSwData customSw[G9X_NUM_CSW]; + Gruvin9xLogicalSwitchData customSw[G9X_NUM_CSW]; Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT]; Gruvin9xSwashRingData swashR; Gruvin9xPhaseData_v102 phaseData[G9X_MAX_PHASES]; @@ -368,7 +341,7 @@ PACK(typedef struct t_Gruvin9xModelData_v103 { Gruvin9xExpoData expoData[G9X_MAX_EXPOS]; int8_t curves5[G9X_MAX_CURVE5][5]; int8_t curves9[G9X_MAX_CURVE9][9]; - Gruvin9xCustomSwData customSw[G9X_NUM_CSW]; + Gruvin9xLogicalSwitchData customSw[G9X_NUM_CSW]; Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT]; Gruvin9xSwashRingData swashR; Gruvin9xPhaseData_v102 phaseData[G9X_MAX_PHASES]; @@ -400,7 +373,7 @@ PACK(typedef struct t_Gruvin9xModelData_v105 { Gruvin9xExpoData expoData[G9X_MAX_EXPOS]; int8_t curves5[G9X_MAX_CURVE5][5]; int8_t curves9[G9X_MAX_CURVE9][9]; - Gruvin9xCustomSwData customSw[G9X_NUM_CSW]; + Gruvin9xLogicalSwitchData customSw[G9X_NUM_CSW]; Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT]; Gruvin9xFuncSwData funcSw[G9X_NUM_FSW]; Gruvin9xSwashRingData swashR; @@ -410,8 +383,6 @@ PACK(typedef struct t_Gruvin9xModelData_v105 { operator ModelData(); t_Gruvin9xModelData_v105() { memset(this, 0, sizeof(t_Gruvin9xModelData_v105)); } - t_Gruvin9xModelData_v105(ModelData&); - }) Gruvin9xModelData_v105; PACK(typedef struct t_Gruvin9xModelData_v106 { @@ -434,7 +405,7 @@ PACK(typedef struct t_Gruvin9xModelData_v106 { Gruvin9xExpoData expoData[G9X_MAX_EXPOS]; int8_t curves5[G9X_MAX_CURVE5][5]; int8_t curves9[G9X_MAX_CURVE9][9]; - Gruvin9xCustomSwData customSw[G9X_NUM_CSW]; + Gruvin9xLogicalSwitchData customSw[G9X_NUM_CSW]; Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT]; Gruvin9xFuncSwData funcSw[G9X_NUM_FSW]; Gruvin9xSwashRingData swashR; @@ -443,11 +414,8 @@ PACK(typedef struct t_Gruvin9xModelData_v106 { operator ModelData(); t_Gruvin9xModelData_v106() { memset(this, 0, sizeof(t_Gruvin9xModelData_v106)); } - t_Gruvin9xModelData_v106(ModelData&); - }) Gruvin9xModelData_v106; typedef Gruvin9xModelData_v106 Gruvin9xModelData; #endif -/*eof*/ diff --git a/companion/src/firmwares/gruvin9x/gruvin9xinterface.cpp b/companion/src/firmwares/gruvin9x/gruvin9xinterface.cpp index 114fd3bee..7a2ce5f46 100644 --- a/companion/src/firmwares/gruvin9x/gruvin9xinterface.cpp +++ b/companion/src/firmwares/gruvin9x/gruvin9xinterface.cpp @@ -18,6 +18,7 @@ #include "gruvin9xinterface.h" #include "gruvin9xeeprom.h" #include "file.h" +#include "appdata.h" #define FILE_TYP_GENERAL 1 #define FILE_TYP_MODEL 2 @@ -47,8 +48,7 @@ const char * Gruvin9xInterface::getName() const int Gruvin9xInterface::getEEpromSize() { if (board == BOARD_STOCK) { - QSettings settings("companion9x", "companion9x"); - QString avrMCU = settings.value("mcu", QString("m64")).toString(); + QString avrMCU = g.mcu(); if (avrMCU==QString("m128")) { return EESIZE_STOCK*2; } @@ -99,7 +99,7 @@ bool Gruvin9xInterface::loadxml(RadioData &radioData, QDomDocument &doc) } -bool Gruvin9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size) +bool Gruvin9xInterface::load(RadioData &radioData, const uint8_t *eeprom, int size) { std::cout << "trying " << getName() << " import... "; @@ -108,7 +108,7 @@ bool Gruvin9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size) return false; } - if (!efile->EeFsOpen(eeprom, size, BOARD_STOCK)) { + if (!efile->EeFsOpen((uint8_t *)eeprom, size, BOARD_STOCK)) { std::cout << "wrong file system\n"; return false; } @@ -200,62 +200,20 @@ bool Gruvin9xInterface::loadBackup(RadioData &radioData, uint8_t *eeprom, int es int Gruvin9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t variant, uint8_t version) { - EEPROMWarnings.clear(); + std::cout << "NO!\n"; + // TODO an error - int size = getEEpromSize(); - - efile->EeFsCreate(eeprom, size, BOARD_STOCK); - - Gruvin9xGeneral gruvin9xGeneral(radioData.generalSettings); - int sz = efile->writeRlc2(FILE_GENERAL, FILE_TYP_GENERAL, (uint8_t*)&gruvin9xGeneral, sizeof(Gruvin9xGeneral)); - if(sz != sizeof(Gruvin9xGeneral)) { - return 0; - } - - for (int i=0; iwriteRlc2(FILE_MODEL(i), FILE_TYP_MODEL, (uint8_t*)&gruvin9xModel, sizeof(Gruvin9xModelData)); - if(sz != sizeof(Gruvin9xModelData)) { - return 0; - } - } - } - - return size; + return 0; } int Gruvin9xInterface::getSize(ModelData &model) { - if (model.isempty()) - return 0; - - uint8_t tmp[EESIZE_GRUVIN9X]; - efile->EeFsCreate(tmp, EESIZE_GRUVIN9X, BOARD_STOCK); - - Gruvin9xModelData gruvin9xModel(model); - int sz = efile->writeRlc2(0, FILE_TYP_MODEL, (uint8_t*)&gruvin9xModel, sizeof(Gruvin9xModelData)); - if(sz != sizeof(Gruvin9xModelData)) { - return -1; - } - return efile->size(0); + return 0; } int Gruvin9xInterface::getSize(GeneralSettings &settings) { - uint8_t tmp[EESIZE_GRUVIN9X]; - efile->EeFsCreate(tmp, EESIZE_GRUVIN9X, BOARD_STOCK); - - Gruvin9xGeneral gruvin9xGeneral(settings); - int sz = efile->writeRlc1(0, FILE_TYP_GENERAL, (uint8_t*)&gruvin9xGeneral, sizeof(gruvin9xGeneral)); - if(sz != sizeof(gruvin9xGeneral)) { - return -1; - } - return efile->size(0); + return 0; } int Gruvin9xInterface::getCapability(const Capability capability) @@ -263,10 +221,6 @@ int Gruvin9xInterface::getCapability(const Capability capability) switch (capability) { case OwnerName: return 0; - case NumCurves5: - return G9X_MAX_CURVE5; - case NumCurves9: - return G9X_MAX_CURVE9; case Mixes: return G9X_MAX_MIXERS; case FlightPhases: @@ -283,7 +237,7 @@ int Gruvin9xInterface::getCapability(const Capability capability) return 9; case CustomFunctions: return 12; - case CustomSwitches: + case LogicalSwitches: return 12; case CSFunc: return 13; @@ -297,7 +251,6 @@ int Gruvin9xInterface::getCapability(const Capability capability) return true; case OffsetWeight: return 125; - case HasExpoCurves: case HasContrast: return true; case Telemetry: diff --git a/companion/src/firmwares/gruvin9x/gruvin9xinterface.h b/companion/src/firmwares/gruvin9x/gruvin9xinterface.h index 7da0975e1..2c8a28dc2 100644 --- a/companion/src/firmwares/gruvin9x/gruvin9xinterface.h +++ b/companion/src/firmwares/gruvin9x/gruvin9xinterface.h @@ -35,7 +35,7 @@ class Gruvin9xInterface : public EEPROMInterface virtual const int getMaxModels(); - virtual bool load(RadioData &, uint8_t *eeprom, int size); + virtual bool load(RadioData &, const uint8_t *eeprom, int size); virtual bool loadBackup(RadioData &, uint8_t *eeprom,int esize, int index); diff --git a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp index 74d4d0074..6ec5f402d 100644 --- a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp @@ -5,10 +5,7 @@ #include #include -extern void setEEPROMZString(char *dst, const char *src, int size); extern void getEEPROMZString(char *dst, const char *src, int size); - -extern int8_t open9xStockFromSwitch(const RawSwitch & sw); extern RawSwitch open9xStockToSwitch(int8_t sw); t_Open9xGruvin9xPhaseData_v207::operator PhaseData () @@ -25,21 +22,6 @@ t_Open9xGruvin9xPhaseData_v207::operator PhaseData () return c9x; } -t_Open9xGruvin9xPhaseData_v207::t_Open9xGruvin9xPhaseData_v207(PhaseData &c9x) -{ - trim_ext = 0; - for (int i=0; i> 2); - trim_ext = (trim_ext & ~(0x03 << (2*i))) + (((c9x.trim[i] & 0x03) << (2*i))); - } - swtch = open9xStockFromSwitch(c9x.swtch); - setEEPROMZString(name, c9x.name, sizeof(name)); - fadeIn = c9x.fadeIn; - fadeOut = c9x.fadeOut; - for (int i=0; i<2; i++) - rotaryEncoders[i] = c9x.rotaryEncoders[i]; -} - t_Open9xGruvin9xPhaseData_v208::operator PhaseData () { PhaseData c9x; @@ -54,107 +36,6 @@ t_Open9xGruvin9xPhaseData_v208::operator PhaseData () return c9x; } -t_Open9xGruvin9xPhaseData_v208::t_Open9xGruvin9xPhaseData_v208(PhaseData &c9x) -{ - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight mode settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; - } - else { - memset(this, 0, sizeof(t_Open9xGruvin9xMixData_v207)); - } -} - t_Open9xGruvin9xMixData_v207::operator MixData () { MixData c9x; @@ -188,9 +69,15 @@ t_Open9xGruvin9xMixData_v207::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-44); } c9x.weight = weight; - c9x.differential = differential*2; + + if (differential) { + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, differential*2); + } + else { + // TODO c9x.curve = curve; + } + c9x.swtch = open9xStockToSwitch(swtch); - c9x.curve = curve; c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -198,12 +85,14 @@ t_Open9xGruvin9xMixData_v207::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; -// c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); - } else if (phase==0) { + } + else if (phase==0) { c9x.phases=0; - } else { + } + else { c9x.phases=63; c9x.phases &= ~(1 << (phase -1)); } @@ -212,98 +101,6 @@ t_Open9xGruvin9xMixData_v207::operator MixData () return c9x; } -t_Open9xGruvin9xMixData_v209::t_Open9xGruvin9xMixData_v209(MixData &c9x) -{ - if (c9x.destCh) { - destCh = c9x.destCh-1; - mixWarn = c9x.mixWarn; - swtch = open9xStockFromSwitch(c9x.swtch); - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - srcRaw = 8 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - srcRaw = 10 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 14; - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 15; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 15 + open9xStockFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 37 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 40 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 48 + c9x.srcRaw.index; - } - weight = c9x.weight; - differential = c9x.differential/2; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - mltpx = (MltpxValue)c9x.mltpx; - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight mode settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; - } - else { - memset(this, 0, sizeof(t_Open9xGruvin9xMixData_v207)); - } -} - t_Open9xGruvin9xMixData_v209::operator MixData () { MixData c9x; @@ -340,9 +137,15 @@ t_Open9xGruvin9xMixData_v209::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-48); } c9x.weight = weight; - c9x.differential = differential*2; + + if (differential) { + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, differential*2); + } + else { + // TODO c9x.curve = curve; + } + c9x.swtch = open9xStockToSwitch(swtch); - c9x.curve = curve; c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -350,12 +153,14 @@ t_Open9xGruvin9xMixData_v209::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - // c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); - } else if (phase==0) { + } + else if (phase==0) { c9x.phases=0; - } else { + } + else { c9x.phases=63; c9x.phases &= ~(1 << (phase -1)); } @@ -364,66 +169,6 @@ t_Open9xGruvin9xMixData_v209::operator MixData () return c9x; } -t_Open9xGruvin9xMixData_v211::t_Open9xGruvin9xMixData_v211(MixData &c9x) -{ - if (c9x.destCh) { - destCh = c9x.destCh-1; - mixWarn = c9x.mixWarn; - swtch = open9xStockFromSwitch(c9x.swtch); - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - srcRaw = 8 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - srcRaw = 10 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 14; - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 15; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 15 + open9xStockFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 37 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 40 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 48 + c9x.srcRaw.index; - } - weight = c9x.weight; - if (c9x.curve==0) { - curveMode=0; - curveParam=c9x.differential; - } else { - curveMode=1; - curveParam = c9x.curve; - } - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - noExpo = c9x.noExpo; - mltpx = (MltpxValue)c9x.mltpx; - phases = c9x.phases; - sOffset = c9x.sOffset; - } - else { - memset(this, 0, sizeof(t_Open9xGruvin9xMixData_v211)); - } -} - t_Open9xGruvin9xMixData_v211::operator MixData () { MixData c9x; @@ -461,12 +206,14 @@ t_Open9xGruvin9xMixData_v211::operator MixData () } c9x.weight = weight; c9x.swtch = open9xStockToSwitch(swtch); + if (curveMode==0) { - c9x.differential = curveParam; - c9x.curve=0; - } else { - c9x.curve=curveParam; - } + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, curveParam); + } + else { + // TODO c9x.curve = curve; + } + c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -481,28 +228,6 @@ t_Open9xGruvin9xMixData_v211::operator MixData () return c9x; } -int8_t open9xV4207FromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) - v1 = 8+source.index; - else if (source.type == SOURCE_TYPE_MAX) - v1 = 10; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 11; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 12+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 15+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 23+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 38+source.index; - return v1; -} - RawSource open9xV4207ToSource(int8_t value) { if (value == 0) { @@ -534,30 +259,6 @@ RawSource open9xV4207ToSource(int8_t value) } } -int8_t open9xV4209FromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) - v1 = 8+source.index; - if (source.type == SOURCE_TYPE_TRIM) - v1 = 10+source.index; - else if (source.type == SOURCE_TYPE_MAX) - v1 = 14; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 15; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 16+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 19+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 27+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 42+source.index; - return v1; -} - RawSource open9xV4209ToSource(int8_t value) { if (value == 0) { @@ -592,49 +293,22 @@ RawSource open9xV4209ToSource(int8_t value) } } -t_Open9xGruvin9xCustomSwData_v207::t_Open9xGruvin9xCustomSwData_v207(CustomSwData &c9x) +Open9xGruvin9xLogicalSwitchData_v207::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = open9xV4207FromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - v2 = open9xV4207FromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = open9xStockFromSwitch(RawSwitch(c9x.val1)); - v2 = open9xStockFromSwitch(RawSwitch(c9x.val2)); - } - - if (func>O9X_V4_MAX_CSFUNCOLD ) { - EEPROMWarnings += ::QObject::tr("This version of open9x does not support Custom Switch function %1").arg(getFuncName(func)) + "\n"; - func=0; - v1=0; - v2=0; - } -} - -Open9xGruvin9xCustomSwData_v207::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = open9xV4207ToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = open9xV4207ToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = open9xStockToSwitch(v1).toValue(); c9x.val2 = open9xStockToSwitch(v2).toValue(); } @@ -642,42 +316,22 @@ Open9xGruvin9xCustomSwData_v207::operator CustomSwData () return c9x; } -t_Open9xGruvin9xCustomSwData_v209::t_Open9xGruvin9xCustomSwData_v209(CustomSwData &c9x) +Open9xGruvin9xLogicalSwitchData_v209::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = open9xV4209FromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL && c9x.func <= CS_FN_ELESS) { - v2 = open9xV4209FromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = open9xStockFromSwitch(RawSwitch(c9x.val1)); - v2 = open9xStockFromSwitch(RawSwitch(c9x.val2)); - } -} - -Open9xGruvin9xCustomSwData_v209::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = open9xV4209ToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL && c9x.func <= CS_FN_ELESS) { + if (c9x.func >= LS_FN_EQUAL && c9x.func <= LS_FN_ELESS) { c9x.val2 = open9xV4209ToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = open9xStockToSwitch(v1).toValue(); c9x.val2 = open9xStockToSwitch(v2).toValue(); } @@ -685,45 +339,6 @@ Open9xGruvin9xCustomSwData_v209::operator CustomSwData () return c9x; } -t_Open9xGruvin9xFuncSwData_v203::t_Open9xGruvin9xFuncSwData_v203(FuncSwData &c9x) -{ - swtch = open9xStockFromSwitch(c9x.swtch); - if (c9x.func <= FuncSafetyCh16) { - param = ((c9x.param>>1)<<1); - param |=(c9x.enabled & 0x01); - func = c9x.func; - } else { - param = c9x.param; - if (c9x.func <= FuncTrainerAIL) - func = 16 + c9x.func - FuncTrainer; - else if (c9x.func == FuncInstantTrim) - func = 21; - else if (c9x.func == FuncPlaySound) - func = 22; - else if (c9x.func == FuncPlayHaptic) - func = 23; - else if (c9x.func == FuncReset) - func = 24; - else if (c9x.func == FuncVario) - func = 25; - else if (c9x.func == FuncPlayPrompt) - func = 26; - else if (c9x.func == FuncPlayValue) - func = 27; - else if (c9x.func == FuncLogs) - func = 28; - else if (c9x.func == FuncBacklight) - func = 29; - else if (c9x.func >= FuncAdjustGV1 && c9x.func <= FuncAdjustGV5) - func = 30 + c9x.func - FuncAdjustGV1; - else { - swtch = 0; - func = 0; - param = 0; - } - } -} - t_Open9xGruvin9xFuncSwData_v203::operator FuncSwData () { FuncSwData c9x; @@ -763,37 +378,6 @@ t_Open9xGruvin9xFuncSwData_v203::operator FuncSwData () return c9x; } -t_Open9xGruvin9xFuncSwData_v210::t_Open9xGruvin9xFuncSwData_v210(FuncSwData &c9x) -{ - swtch = open9xStockFromSwitch(c9x.swtch); - param = c9x.param; - if (c9x.func <= FuncInstantTrim) { - func = (uint8_t)c9x.func; - delay = c9x.enabled; - } - else if (c9x.func == FuncPlaySound) - func = 22; - else if (c9x.func == FuncPlayHaptic) - func = 23; - else if (c9x.func == FuncReset) - func = 24; - else if (c9x.func == FuncVario) - func = 25; - else if (c9x.func == FuncPlayPrompt) - func = 26; - else if (c9x.func == FuncPlayValue) - func = 27; - else if (c9x.func == FuncLogs) - func = 28; - else if (c9x.func == FuncBacklight) - func = 29; - else { - swtch = 0; - func = 0; - param = 0; - } -} - t_Open9xGruvin9xFuncSwData_v210::operator FuncSwData () { FuncSwData c9x; @@ -823,16 +407,6 @@ t_Open9xGruvin9xFuncSwData_v210::operator FuncSwData () return c9x; } -t_Open9xGruvin9xSwashRingData_v208::t_Open9xGruvin9xSwashRingData_v208(SwashRingData &c9x) -{ - invertELE = c9x.invertELE; - invertAIL = c9x.invertAIL; - invertCOL = c9x.invertCOL; - type = c9x.type; - collectiveSource = open9xV4207FromSource(c9x.collectiveSource); - value = c9x.value; -} - t_Open9xGruvin9xSwashRingData_v208::operator SwashRingData () { SwashRingData c9x; @@ -845,16 +419,6 @@ t_Open9xGruvin9xSwashRingData_v208::operator SwashRingData () return c9x; } -t_Open9xGruvin9xSwashRingData_v209::t_Open9xGruvin9xSwashRingData_v209(SwashRingData &c9x) -{ - invertELE = c9x.invertELE; - invertAIL = c9x.invertAIL; - invertCOL = c9x.invertCOL; - type = c9x.type; - collectiveSource = open9xV4209FromSource(c9x.collectiveSource); - value = c9x.value; -} - t_Open9xGruvin9xSwashRingData_v209::operator SwashRingData () { SwashRingData c9x; @@ -890,7 +454,7 @@ t_Open9xGruvin9xModelData_v207::operator ModelData () } c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc - 2; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; c9x.moduleData[0].ppmPulsePol = pulsePol; @@ -915,7 +479,6 @@ t_Open9xGruvin9xModelData_v207::operator ModelData () c9x.expoData[i] = expoData[i]; for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyLinesXtra=0; - for (int j=0; j<4; j++) { - frskyLines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.frsky.screens[1].body.lines[j].source[k]; - frskyLines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - frskyLinesXtra |= (value / 16) << (4*j+2*k); - } - } - } - else { - memset(this, 0, sizeof(t_Open9xGruvin9xModelData_v207)); - } -} - - t_Open9xGruvin9xModelData_v208::operator ModelData () { ModelData c9x; @@ -1079,7 +538,7 @@ t_Open9xGruvin9xModelData_v208::operator ModelData () } c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc - 2; c9x.disableThrottleWarning=disableThrottleWarning; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; @@ -1104,7 +563,6 @@ t_Open9xGruvin9xModelData_v208::operator ModelData () for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - varioSource = c9x.frsky.varioSource; - varioSpeedUpMin = c9x.frsky.varioCenterMax; - varioSpeedDownMin = c9x.frsky.varioCenterMin; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyLinesXtra=0; - for (int j=0; j<4; j++) { - frskyLines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.frsky.screens[1].body.lines[j].source[k]; - frskyLines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - frskyLinesXtra |= (value / 16) << (4*j+2*k); - } - } - for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - varioSource = c9x.frsky.varioSource; - varioSpeedUpMin = c9x.frsky.varioCenterMax; - varioSpeedDownMin = c9x.frsky.varioCenterMin; - switchWarningStates = c9x.switchWarningStates; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyLinesXtra=0; - for (int j=0; j<4; j++) { - frskyLines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.frsky.screens[1].body.lines[j].source[k]; - frskyLines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - frskyLinesXtra |= (value / 16) << (4*j+2*k); - } - } - for (int i=0; i O9X_NUM_POINTS - 5 * O9X_MAX_CURVES) { - EEPROMWarnings += ::QObject::tr("open9x only accepts %1 points in all curves").arg(O9X_NUM_POINTS) + "\n"; - break; - } - curves[i] = offset; - for (int j=0; j= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - switchWarningStates = c9x.switchWarningStates; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - for (int i=0; i O9X_NUM_POINTS - 5 * O9X_MAX_CURVES) { - EEPROMWarnings += ::QObject::tr("open9x only accepts %1 points in all curves").arg(O9X_NUM_POINTS) + "\n"; - break; - } - curves[i] = offset; - for (int j=0; j= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - switchWarningStates = c9x.switchWarningStates; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - } -} - diff --git a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.h b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.h index a37ed3d9d..214e2ef6d 100644 --- a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.h +++ b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.h @@ -32,7 +32,6 @@ PACK(typedef struct t_Open9xGruvin9xPhaseData_v207 { int16_t rotaryEncoders[2]; operator PhaseData(); t_Open9xGruvin9xPhaseData_v207() { memset(this, 0, sizeof(t_Open9xGruvin9xPhaseData_v207)); } - t_Open9xGruvin9xPhaseData_v207(PhaseData &eepe); }) Open9xGruvin9xPhaseData_v207; PACK(typedef struct t_Open9xGruvin9xPhaseData_v208 { @@ -44,7 +43,6 @@ PACK(typedef struct t_Open9xGruvin9xPhaseData_v208 { int16_t rotaryEncoders[2]; operator PhaseData(); t_Open9xGruvin9xPhaseData_v208() { memset(this, 0, sizeof(t_Open9xGruvin9xPhaseData_v208)); } - t_Open9xGruvin9xPhaseData_v208(PhaseData &eepe); }) Open9xGruvin9xPhaseData_v208; PACK(typedef struct t_Open9xGruvin9xMixData_v207 { @@ -66,8 +64,6 @@ PACK(typedef struct t_Open9xGruvin9xMixData_v207 { operator MixData(); t_Open9xGruvin9xMixData_v207() { memset(this, 0, sizeof(t_Open9xGruvin9xMixData_v207)); } - t_Open9xGruvin9xMixData_v207(MixData&); - }) Open9xGruvin9xMixData_v207; PACK(typedef struct t_Open9xGruvin9xMixData_v209 { @@ -89,8 +85,6 @@ PACK(typedef struct t_Open9xGruvin9xMixData_v209 { operator MixData(); t_Open9xGruvin9xMixData_v209() { memset(this, 0, sizeof(t_Open9xGruvin9xMixData_v209)); } - t_Open9xGruvin9xMixData_v209(MixData&); - }) Open9xGruvin9xMixData_v209; PACK(typedef struct t_Open9xGruvin9xMixData_v211 { @@ -114,35 +108,29 @@ PACK(typedef struct t_Open9xGruvin9xMixData_v211 { operator MixData(); t_Open9xGruvin9xMixData_v211() { memset(this, 0, sizeof(t_Open9xGruvin9xMixData_v211)); } - t_Open9xGruvin9xMixData_v211(MixData&); - }) Open9xGruvin9xMixData_v211; -PACK(typedef struct t_Open9xGruvin9xCustomSwData_v207 { // Custom Switches data +PACK(typedef struct t_Open9xGruvin9xLogicalSwitchData_v207 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; - operator CustomSwData(); - t_Open9xGruvin9xCustomSwData_v207() { memset(this, 0, sizeof(t_Open9xGruvin9xCustomSwData_v207)); } - t_Open9xGruvin9xCustomSwData_v207(CustomSwData&); + operator LogicalSwitchData(); + t_Open9xGruvin9xLogicalSwitchData_v207() { memset(this, 0, sizeof(t_Open9xGruvin9xLogicalSwitchData_v207)); } int8_t fromSource(RawSource source); RawSource toSource(int8_t value); +}) Open9xGruvin9xLogicalSwitchData_v207; -}) Open9xGruvin9xCustomSwData_v207; - -PACK(typedef struct t_Open9xGruvin9xCustomSwData_v209 { // Custom Switches data +PACK(typedef struct t_Open9xGruvin9xLogicalSwitchData_v209 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; - operator CustomSwData(); - t_Open9xGruvin9xCustomSwData_v209() { memset(this, 0, sizeof(t_Open9xGruvin9xCustomSwData_v209)); } - t_Open9xGruvin9xCustomSwData_v209(CustomSwData&); + operator LogicalSwitchData(); + t_Open9xGruvin9xLogicalSwitchData_v209() { memset(this, 0, sizeof(t_Open9xGruvin9xLogicalSwitchData_v209)); } int8_t fromSource(RawSource source); RawSource toSource(int8_t value); - -}) Open9xGruvin9xCustomSwData_v209; +}) Open9xGruvin9xLogicalSwitchData_v209; PACK(typedef struct t_Open9xGruvin9xFuncSwData_v203 { // Function Switches data int8_t swtch; // input @@ -151,8 +139,6 @@ PACK(typedef struct t_Open9xGruvin9xFuncSwData_v203 { // Function Switches data operator FuncSwData(); t_Open9xGruvin9xFuncSwData_v203() { memset(this, 0, sizeof(t_Open9xGruvin9xFuncSwData_v203)); } - t_Open9xGruvin9xFuncSwData_v203(FuncSwData&); - }) Open9xGruvin9xFuncSwData_v203; PACK(typedef struct t_Open9xGruvin9xFuncSwData_v210 { // Function Switches data @@ -163,8 +149,6 @@ PACK(typedef struct t_Open9xGruvin9xFuncSwData_v210 { // Function Switches data operator FuncSwData(); t_Open9xGruvin9xFuncSwData_v210() { memset(this, 0, sizeof(t_Open9xGruvin9xFuncSwData_v210)); } - t_Open9xGruvin9xFuncSwData_v210(FuncSwData&); - }) Open9xGruvin9xFuncSwData_v210; PACK(typedef struct t_Open9xGruvin9xSwashRingData_v208 { // Swash Ring data @@ -177,8 +161,6 @@ PACK(typedef struct t_Open9xGruvin9xSwashRingData_v208 { // Swash Ring data operator SwashRingData(); t_Open9xGruvin9xSwashRingData_v208() { memset(this, 0, sizeof(t_Open9xGruvin9xSwashRingData_v208)); } - t_Open9xGruvin9xSwashRingData_v208(SwashRingData&); - }) Open9xGruvin9xSwashRingData_v208; PACK(typedef struct t_Open9xGruvin9xSwashRingData_v209 { // Swash Ring data @@ -191,8 +173,6 @@ PACK(typedef struct t_Open9xGruvin9xSwashRingData_v209 { // Swash Ring data operator SwashRingData(); t_Open9xGruvin9xSwashRingData_v209() { memset(this, 0, sizeof(t_Open9xGruvin9xSwashRingData_v209)); } - t_Open9xGruvin9xSwashRingData_v209(SwashRingData&); - }) Open9xGruvin9xSwashRingData_v209; PACK(typedef struct t_Open9xGruvin9xModelData_v207 { @@ -214,7 +194,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v207 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xGruvin9xCustomSwData_v207 customSw[O9X_NUM_CSW]; + Open9xGruvin9xLogicalSwitchData_v207 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v208 swashR; Open9xGruvin9xPhaseData_v207 phaseData[O9X_MAX_PHASES]; @@ -227,8 +207,6 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v207 { operator ModelData(); t_Open9xGruvin9xModelData_v207() { memset(this, 0, sizeof(t_Open9xGruvin9xModelData_v207)); } - t_Open9xGruvin9xModelData_v207(ModelData&); - }) Open9xGruvin9xModelData_v207; PACK(typedef struct t_Open9xGruvin9xModelData_v208 { @@ -250,7 +228,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v208 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xGruvin9xCustomSwData_v207 customSw[O9X_NUM_CSW]; + Open9xGruvin9xLogicalSwitchData_v207 customSw[O9X_NUM_CSW]; Open9xGruvin9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v208 swashR; Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_PHASES]; @@ -268,8 +246,6 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v208 { operator ModelData(); t_Open9xGruvin9xModelData_v208() { memset(this, 0, sizeof(t_Open9xGruvin9xModelData_v208)); } - t_Open9xGruvin9xModelData_v208(ModelData&); - }) Open9xGruvin9xModelData_v208; PACK(typedef struct t_Open9xGruvin9xModelData_v209 { @@ -291,7 +267,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v209 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xGruvin9xCustomSwData_v209 customSw[O9X_NUM_CSW]; + Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xGruvin9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v209 swashR; Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_PHASES]; @@ -310,8 +286,6 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v209 { operator ModelData(); t_Open9xGruvin9xModelData_v209() { memset(this, 0, sizeof(t_Open9xGruvin9xModelData_v209)); } - t_Open9xGruvin9xModelData_v209(ModelData&); - }) Open9xGruvin9xModelData_v209; PACK(typedef struct t_Open9xGruvin9xModelData_v210 { @@ -333,7 +307,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v210 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves[O9X_MAX_CURVES]; int8_t points[O9X_NUM_POINTS]; - Open9xGruvin9xCustomSwData_v209 customSw[O9X_NUM_CSW]; + Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xGruvin9xFuncSwData_v210 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v209 swashR; Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_PHASES]; @@ -350,8 +324,6 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v210 { operator ModelData(); t_Open9xGruvin9xModelData_v210() { memset(this, 0, sizeof(t_Open9xGruvin9xModelData_v210)); } - t_Open9xGruvin9xModelData_v210(ModelData&); - }) Open9xGruvin9xModelData_v210; PACK(typedef struct t_Open9xGruvin9xModelData_v211 { @@ -373,7 +345,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v211 { Open9xExpoData_v211 expoData[O9X_MAX_EXPOS]; int8_t curves[O9X_MAX_CURVES]; int8_t points[O9X_NUM_POINTS]; - Open9xGruvin9xCustomSwData_v209 customSw[O9X_NUM_CSW]; + Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xGruvin9xFuncSwData_v210 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v209 swashR; Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_PHASES]; @@ -388,8 +360,6 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v211 { operator ModelData(); t_Open9xGruvin9xModelData_v211() { memset(this, 0, sizeof(t_Open9xGruvin9xModelData_v211)); } - t_Open9xGruvin9xModelData_v211(ModelData&); - }) Open9xGruvin9xModelData_v211; #endif diff --git a/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp b/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp index afa897700..36b6229ac 100644 --- a/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp @@ -5,31 +5,8 @@ #include #include -extern void setEEPROMZString(char *dst, const char *src, int size); extern void getEEPROMZString(char *dst, const char *src, int size); -int8_t open9xArmFromSwitch(const RawSwitch & sw) -{ - switch (sw.type) { - case SWITCH_TYPE_SWITCH: - return sw.index; - case SWITCH_TYPE_VIRTUAL: - return sw.index > 0 ? (9 + sw.index) : (-9 + sw.index); - case SWITCH_TYPE_ON: - return 42; - case SWITCH_TYPE_OFF: - return -42; - case SWITCH_TYPE_MOMENT_SWITCH: - return sw.index > 0 ? (42 + sw.index) : (-42 + sw.index); - case SWITCH_TYPE_MOMENT_VIRTUAL: - return sw.index > 0 ? (51 + sw.index) : (-51 + sw.index); - case SWITCH_TYPE_ONM: - return 84; - default: - return 0; - } -} - RawSwitch open9xArmToSwitch(int8_t sw) { uint8_t swa = abs(sw); @@ -42,37 +19,13 @@ RawSwitch open9xArmToSwitch(int8_t sw) else if (sw == 42) return RawSwitch(SWITCH_TYPE_ON); else if (sw == 84) - return RawSwitch(SWITCH_TYPE_ONM); + return RawSwitch(SWITCH_TYPE_ON); else if (sw == -42) return RawSwitch(SWITCH_TYPE_OFF); else if (swa <= 42+9) - return RawSwitch(SWITCH_TYPE_MOMENT_SWITCH, sw > 0 ? sw-42 : sw+42); + return RawSwitch(SWITCH_TYPE_SWITCH, sw > 0 ? sw-42 : sw+42); else - return RawSwitch(SWITCH_TYPE_MOMENT_VIRTUAL, sw > 0 ? sw-42-9 : sw+42+9); -} - -int8_t open9xArm208FromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("Open9x on this board doesn't have Rotary Encoders") + "\n"; - v1 = 5+source.index; - } - else if (source.type == SOURCE_TYPE_MAX) - v1 = 8; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 9; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 10+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 13+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 21+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 52+source.index; - return v1; + return RawSwitch(SWITCH_TYPE_VIRTUAL, sw > 0 ? sw-42-9 : sw+42+9); } RawSource open9xArm208ToSource(int8_t value) @@ -103,32 +56,6 @@ RawSource open9xArm208ToSource(int8_t value) } } -int8_t open9xArm209FromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("Open9x on this board doesn't have Rotary Encoders") + "\n"; - v1 = 5+source.index; - } - else if (source.type == SOURCE_TYPE_TRIM) - v1 = 8 + source.index; - else if (source.type == SOURCE_TYPE_MAX) - v1 = 12; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 13; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 14+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 17+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 25+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 56+source.index; - return v1; -} - RawSource open9xArm209ToSource(int8_t value) { if (value == 0) { @@ -160,30 +87,6 @@ RawSource open9xArm209ToSource(int8_t value) } } -int8_t open9xArm210FromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) - v1 = 8; - else if (source.type == SOURCE_TYPE_TRIM) - v1 = 9 + source.index; - else if (source.type == SOURCE_TYPE_MAX) - v1 = 13; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 14; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 15+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 18+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 26+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 57+source.index; - return v1; -} - RawSource open9xArm210ToSource(int8_t value) { if (value == 0) { @@ -221,9 +124,9 @@ RawSource open9xArm210ToSource(int8_t value) t_Open9xArmTimerData_v202::operator TimerData () { TimerData c9x; - +/* if (mode <= -42) - c9x.mode = TimerMode(TMRMODE_FIRST_NEG_MOMENT_SWITCH+(mode+22)); + c9x.mode = TimerMode(TMRMODE_FIRST_NEG_SWITCH+(mode+22)); else if (mode <= -1) c9x.mode = TimerMode(TMRMODE_FIRST_NEG_SWITCH+(mode+1)); else if (mode < 5) @@ -231,96 +134,14 @@ t_Open9xArmTimerData_v202::operator TimerData () else if (mode < 5+41) c9x.mode = TimerMode(TMRMODE_FIRST_SWITCH+(mode-5)); else - c9x.mode = TimerMode(TMRMODE_FIRST_MOMENT_SWITCH+(mode-5-21)); - + c9x.mode = TimerMode(TMRMODE_FIRST_SWITCH+(mode-5-21)); +*/ c9x.val = val; c9x.persistent = false; c9x.dir = (val == 0); return c9x; } -t_Open9xArmTimerData_v202::t_Open9xArmTimerData_v202(TimerData &c9x) -{ - val = c9x.val; - - if (c9x.mode >= TMRMODE_OFF && c9x.mode <= TMRMODE_THt) - mode = 0+c9x.mode-TMRMODE_OFF; - else if (c9x.mode >= TMRMODE_FIRST_MOMENT_SWITCH) - mode = 46+c9x.mode-TMRMODE_FIRST_MOMENT_SWITCH; - else if (c9x.mode >= TMRMODE_FIRST_SWITCH) - mode = 5+c9x.mode-TMRMODE_FIRST_SWITCH; - else if (c9x.mode <= TMRMODE_FIRST_NEG_MOMENT_SWITCH) - mode = -42+c9x.mode-TMRMODE_FIRST_NEG_MOMENT_SWITCH; - else if (c9x.mode <= TMRMODE_FIRST_NEG_SWITCH) - mode = -1+c9x.mode-TMRMODE_FIRST_NEG_SWITCH; - else - mode = 0; -} - -t_Open9xArmExpoData_v208::t_Open9xArmExpoData_v208(ExpoData &c9x) -{ - mode = c9x.mode; - chn = c9x.chn; - // 0=no curve, 1-6=std curves, 7-10=CV1-CV4, 11-15=CV9-CV13 - curve = 0; - expo = 0; - if (c9x.curveMode==1) { - if (c9x.curveParam >=0 && c9x.curveParam <= 10) - curve = c9x.curveParam; - else if (c9x.curveParam >= 15 && c9x.curveParam <= 19) - curve = c9x.curveParam - 4; - else - EEPROMWarnings += ::QObject::tr("Open9x doesn't allow Curve%1 in expos").arg(c9x.curveParam-6) + "\n"; - } - else { - expo=c9x.curveParam; - } - - swtch = open9xArmFromSwitch(c9x.swtch); - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on expos not exported") + "\n"; - } - - weight = c9x.weight; - expo = c9x.expo; -} - t_Open9xArmExpoData_v208::operator ExpoData () { ExpoData c9x; @@ -332,14 +153,10 @@ t_Open9xArmExpoData_v208::operator ExpoData () } else { if (curve == 0) { - c9x.curveMode=0; - c9x.curveParam=expo; - } else { - c9x.curveMode=1; - if (curve <= 10) - c9x.curveParam = curve; - else - c9x.curveParam = curve + 4; + c9x.curve = CurveReference(CurveReference::CURVE_REF_EXPO, expo); + } + else { + // TODO } } c9x.swtch = open9xArmToSwitch(swtch); @@ -355,70 +172,6 @@ t_Open9xArmExpoData_v208::operator ExpoData () return c9x; } -t_Open9xArmExpoData_v210::t_Open9xArmExpoData_v210(ExpoData &c9x) -{ - mode = c9x.mode; - chn = c9x.chn; - // 0=no curve, 1-6=std curves, 7-10=CV1-CV4, 11-15=CV9-CV13 - curve = 0; - expo = 0; - if (c9x.curveMode==1) { - if (c9x.curveParam >=0 && c9x.curveParam <= 10) - curve = c9x.curveParam; - else if (c9x.curveParam >= 15 && c9x.curveParam <= 19) - curve = c9x.curveParam - 4; - else - EEPROMWarnings += ::QObject::tr("Open9x doesn't allow Curve%1 in expos").arg(c9x.curveParam-6) + "\n"; - } - else { - expo=c9x.curveParam; - } - - swtch = open9xArmFromSwitch(c9x.swtch); - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on expos not exported") + "\n"; - } - weight = c9x.weight; - expo = c9x.expo; - setEEPROMZString(name, c9x.name, sizeof(name)); -} - t_Open9xArmExpoData_v210::operator ExpoData () { ExpoData c9x; @@ -430,53 +183,36 @@ t_Open9xArmExpoData_v210::operator ExpoData () } else { if (curve == 0) { - c9x.curveMode=0; - c9x.curveParam=expo; + c9x.curve = CurveReference(CurveReference::CURVE_REF_EXPO, expo); } else { - c9x.curveMode=1; - if (curve <= 10) - c9x.curveParam = curve; - else - c9x.curveParam = curve + 4; + // TODO } } c9x.swtch = open9xArmToSwitch(swtch); if (phase<0) { c9x.phases= 1 << (-phase -1); - } else if (phase==0) { + } + else if (phase==0) { c9x.phases=0; - } else { + } + else { c9x.phases=63; c9x.phases &= ~(1 << (phase -1)); } c9x.weight = weight; - c9x.expo = expo; getEEPROMZString(c9x.name, name, sizeof(name)); return c9x; } -t_Open9xArmExpoData_v212::t_Open9xArmExpoData_v212(ExpoData &c9x) -{ - mode = c9x.mode; - chn = c9x.chn; - // 0=no curve, 1-6=std curves, 7-10=CV1-CV4, 11-15=CV9-CV13 - curveParam=c9x.curveParam; - curveMode=c9x.curveMode; - swtch = open9xArmFromSwitch(c9x.swtch); - phases=c9x.phases; - weight = c9x.weight; - setEEPROMZString(name, c9x.name, sizeof(name)); -} - t_Open9xArmExpoData_v212::operator ExpoData () { ExpoData c9x; c9x.mode = mode; c9x.chn = chn; - c9x.curveMode=curveMode; - c9x.curveParam=curveParam; + // TODO c9x.curveMode=curveMode; + // c9x.curveParam=curveParam; c9x.swtch = open9xArmToSwitch(swtch); c9x.phases= phases; c9x.weight = weight; @@ -496,16 +232,6 @@ t_Open9xArmPhaseData_v208::operator PhaseData () return c9x; } -t_Open9xArmPhaseData_v208::t_Open9xArmPhaseData_v208(PhaseData &c9x) -{ - for (int i=0; i>=1; - } - if (zeros==O9X_ARM_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; - } - else { - memset(this, 0, sizeof(t_Open9xArmMixData_v208)); - } -} - t_Open9xArmMixData_v208::operator MixData () { MixData c9x; @@ -639,16 +268,22 @@ t_Open9xArmMixData_v208::operator MixData () else if (srcRaw <= 9+9+O9X_ARM_NUM_CSW+NUM_CYC) { c9x.srcRaw = RawSource(SOURCE_TYPE_CYC, srcRaw-10-9-O9X_ARM_NUM_CSW); } - else if (srcRaw <= 9+9+O9X_ARM_NUM_CSW+NUM_CYC+NUM_PPM) { + else if (srcRaw <= 9+9+O9X_ARM_NUM_CSW+NUM_CYC+8) { c9x.srcRaw = RawSource(SOURCE_TYPE_PPM, srcRaw-10-9-O9X_ARM_NUM_CSW-NUM_CYC); } else { - c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-10-9-O9X_ARM_NUM_CSW-NUM_CYC-NUM_PPM); + c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-10-9-O9X_ARM_NUM_CSW-NUM_CYC-8); } c9x.weight = weight; - c9x.differential = differential*2; c9x.swtch = open9xArmToSwitch(swtch); - c9x.curve = curve; + + if (differential) { + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, differential*2); + } + else { + // TODO c9x.curve = curve; + } + c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -656,109 +291,23 @@ t_Open9xArmMixData_v208::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; -// c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); - } else if (phase==0) { + } + else if (phase==0) { c9x.phases=0; - } else { + } + else { c9x.phases=511; c9x.phases &= ~(1 << (phase -1)); - } + } + c9x.sOffset = sOffset; } return c9x; } -t_Open9xArmMixData_v209::t_Open9xArmMixData_v209(MixData &c9x) -{ - if (c9x.destCh) { - destCh = c9x.destCh-1; - mixWarn = c9x.mixWarn; - swtch = open9xArmFromSwitch(c9x.swtch); - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 8; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - srcRaw = 9 + c9x.srcRaw.index; - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 13; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 13 + open9xArmFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 14+9+O9X_ARM_NUM_CSW + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 14+9+O9X_ARM_NUM_CSW+NUM_CYC + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 14+9+O9X_ARM_NUM_CSW+NUM_CYC+NUM_PPM + c9x.srcRaw.index; - } - weight = c9x.weight; - differential = c9x.differential/2; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - mltpx = (MltpxValue)c9x.mltpx; - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_ARM_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; - } - else { - memset(this, 0, sizeof(t_Open9xArmMixData_v209)); - } -} - t_Open9xArmMixData_v209::operator MixData () { MixData c9x; @@ -785,16 +334,22 @@ t_Open9xArmMixData_v209::operator MixData () else if (srcRaw <= 13+9+O9X_ARM_NUM_CSW+NUM_CYC) { c9x.srcRaw = RawSource(SOURCE_TYPE_CYC, srcRaw-14-9-O9X_ARM_NUM_CSW); } - else if (srcRaw <= 13+9+O9X_ARM_NUM_CSW+NUM_CYC+NUM_PPM) { + else if (srcRaw <= 13+9+O9X_ARM_NUM_CSW+NUM_CYC+8) { c9x.srcRaw = RawSource(SOURCE_TYPE_PPM, srcRaw-14-9-O9X_ARM_NUM_CSW-NUM_CYC); } else { - c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-14-9-O9X_ARM_NUM_CSW-NUM_CYC-NUM_PPM); + c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-14-9-O9X_ARM_NUM_CSW-NUM_CYC-8); } c9x.weight = weight; - c9x.differential = differential*2; + + if (differential) { + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, differential*2); + } + else { + // TODO c9x.curve = curve; + } + c9x.swtch = open9xArmToSwitch(swtch); - c9x.curve = curve; c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -802,110 +357,23 @@ t_Open9xArmMixData_v209::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - // c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); - } else if (phase==0) { + } + else if (phase==0) { c9x.phases=0; - } else { + } + else { c9x.phases=511; c9x.phases &= ~(1 << (phase -1)); - } + } + c9x.sOffset = sOffset; } return c9x; } -t_Open9xArmMixData_v210::t_Open9xArmMixData_v210(MixData &c9x) -{ - if (c9x.destCh) { - destCh = c9x.destCh-1; - mixWarn = c9x.mixWarn; - swtch = open9xArmFromSwitch(c9x.swtch); - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - srcRaw = 8 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 12; - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 13; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 13 + open9xArmFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 14+9+O9X_ARM_NUM_CSW + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 14+9+O9X_ARM_NUM_CSW+NUM_CYC + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 14+9+O9X_ARM_NUM_CSW+NUM_CYC+NUM_PPM + c9x.srcRaw.index; - } - weight = c9x.weight; - differential = c9x.differential/2; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - mltpx = (MltpxValue)c9x.mltpx; - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_ARM_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; - setEEPROMZString(name, c9x.name, sizeof(name)); - } - else { - memset(this, 0, sizeof(t_Open9xArmMixData_v210)); - } -} - t_Open9xArmMixData_v210::operator MixData () { MixData c9x; @@ -932,16 +400,22 @@ t_Open9xArmMixData_v210::operator MixData () else if (srcRaw <= 13+9+O9X_ARM_NUM_CSW+NUM_CYC) { c9x.srcRaw = RawSource(SOURCE_TYPE_CYC, srcRaw-14-9-O9X_ARM_NUM_CSW); } - else if (srcRaw <= 13+9+O9X_ARM_NUM_CSW+NUM_CYC+NUM_PPM) { + else if (srcRaw <= 13+9+O9X_ARM_NUM_CSW+NUM_CYC+8) { c9x.srcRaw = RawSource(SOURCE_TYPE_PPM, srcRaw-14-9-O9X_ARM_NUM_CSW-NUM_CYC); } else { - c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-14-9-O9X_ARM_NUM_CSW-NUM_CYC-NUM_PPM); + c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-14-9-O9X_ARM_NUM_CSW-NUM_CYC-8); } c9x.weight = weight; - c9x.differential = differential*2; + + if (differential) { + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, differential*2); + } + else { + // TODO c9x.curve = curve; + } + c9x.swtch = open9xArmToSwitch(swtch); - c9x.curve = curve; c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -949,82 +423,24 @@ t_Open9xArmMixData_v210::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - // c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); - } else if (phase==0) { + } + else if (phase==0) { c9x.phases=0; - } else { + } + else { c9x.phases=511; c9x.phases &= ~(1 << (phase -1)); } + c9x.sOffset = sOffset; getEEPROMZString(c9x.name, name, sizeof(name)); } return c9x; } -t_Open9xArmMixData_v212::t_Open9xArmMixData_v212(MixData &c9x) -{ - if (c9x.destCh) { - destCh = c9x.destCh-1; - mixWarn = c9x.mixWarn; - swtch = open9xArmFromSwitch(c9x.swtch); - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - srcRaw = 8; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - srcRaw = 9 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 13; - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 14; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 14 + open9xArmFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 15+9+O9X_ARM_NUM_CSW + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 15+9+O9X_ARM_NUM_CSW+NUM_CYC + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 15+9+O9X_ARM_NUM_CSW+NUM_CYC+NUM_PPM + c9x.srcRaw.index; - } - weight = c9x.weight; - if (c9x.curve==0) { - curveMode=0; - curveParam=c9x.differential; - } else { - curveMode=1; - curveParam = c9x.curve; - } - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - noExpo = c9x.noExpo; - mltpx = (MltpxValue)c9x.mltpx; - phases = c9x.phases; - sOffset = c9x.sOffset; - setEEPROMZString(name, c9x.name, sizeof(name)); - } - else { - memset(this, 0, sizeof(t_Open9xArmMixData_v210)); - } -} - t_Open9xArmMixData_v212::operator MixData () { MixData c9x; @@ -1054,19 +470,21 @@ t_Open9xArmMixData_v212::operator MixData () else if (srcRaw <= 14+9+O9X_ARM_NUM_CSW+NUM_CYC) { c9x.srcRaw = RawSource(SOURCE_TYPE_CYC, srcRaw-15-9-O9X_ARM_NUM_CSW); } - else if (srcRaw <= 14+9+O9X_ARM_NUM_CSW+NUM_CYC+NUM_PPM) { + else if (srcRaw <= 14+9+O9X_ARM_NUM_CSW+NUM_CYC+8) { c9x.srcRaw = RawSource(SOURCE_TYPE_PPM, srcRaw-15-9-O9X_ARM_NUM_CSW-NUM_CYC); } else { - c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-15-9-O9X_ARM_NUM_CSW-NUM_CYC-NUM_PPM); + c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-15-9-O9X_ARM_NUM_CSW-NUM_CYC-8); } c9x.weight = weight; + if (curveMode==0) { - c9x.differential = curveParam; - c9x.curve=0; - } else { - c9x.curve=curveParam; - } + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, curveParam); + } + else { + // TODO + } + c9x.swtch = open9xArmToSwitch(swtch); c9x.delayUp = delayUp; c9x.delayDown = delayDown; @@ -1083,49 +501,22 @@ t_Open9xArmMixData_v212::operator MixData () return c9x; } -t_Open9xArmCustomSwData_v208::t_Open9xArmCustomSwData_v208(CustomSwData &c9x) +t_Open9xArmLogicalSwitchData_v208::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = open9xArm208FromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - v2 = open9xArm208FromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = open9xArmFromSwitch(RawSwitch(c9x.val1)); - v2 = open9xArmFromSwitch(RawSwitch(c9x.val2)); - } - - if (func>O9X_ARM_MAX_CSFUNCOLD ) { - EEPROMWarnings += ::QObject::tr("This version of open9x does not support Custom Switch function %1").arg(getFuncName(func)) + "\n"; - func=0; - v1=0; - v2=0; - } -} - -t_Open9xArmCustomSwData_v208::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = open9xArm208ToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = open9xArm208ToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = open9xArmToSwitch(v1).toValue(); c9x.val2 = open9xArmToSwitch(v2).toValue(); } @@ -1133,49 +524,22 @@ t_Open9xArmCustomSwData_v208::operator CustomSwData () return c9x; } -t_Open9xArmCustomSwData_v209::t_Open9xArmCustomSwData_v209(CustomSwData &c9x) +t_Open9xArmLogicalSwitchData_v209::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = open9xArm209FromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - v2 = open9xArm209FromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = open9xArmFromSwitch(RawSwitch(c9x.val1)); - v2 = open9xArmFromSwitch(RawSwitch(c9x.val2)); - } - - if (func>O9X_ARM_MAX_CSFUNCOLD ) { - EEPROMWarnings += ::QObject::tr("This version of open9x does not support Custom Switch function %1").arg(getFuncName(func)) + "\n"; - func=0; - v1=0; - v2=0; - } -} - -t_Open9xArmCustomSwData_v209::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = open9xArm209ToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = open9xArm209ToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = open9xArmToSwitch(v1).toValue(); c9x.val2 = open9xArmToSwitch(v2).toValue(); } @@ -1183,46 +547,24 @@ t_Open9xArmCustomSwData_v209::operator CustomSwData () return c9x; } -t_Open9xArmCustomSwData_v210::t_Open9xArmCustomSwData_v210(CustomSwData &c9x) +t_Open9xArmLogicalSwitchData_v210::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - delay = c9x.delay; - duration = c9x.duration; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = open9xArm210FromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL && c9x.func <= CS_FN_ELESS) { - v2 = open9xArm210FromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = open9xArmFromSwitch(RawSwitch(c9x.val1)); - v2 = open9xArmFromSwitch(RawSwitch(c9x.val2)); - } -} - -t_Open9xArmCustomSwData_v210::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; c9x.delay = delay; c9x.duration = duration; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = open9xArm210ToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL && c9x.func <= CS_FN_ELESS) { + if (c9x.func >= LS_FN_EQUAL && c9x.func <= LS_FN_ELESS) { c9x.val2 = open9xArm210ToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = open9xArmToSwitch(v1).toValue(); c9x.val2 = open9xArmToSwitch(v2).toValue(); } @@ -1230,27 +572,12 @@ t_Open9xArmCustomSwData_v210::operator CustomSwData () return c9x; } -t_Open9xArmFuncSwData_v208::t_Open9xArmFuncSwData_v208(FuncSwData &c9x) -{ - swtch = open9xArmFromSwitch(c9x.swtch); - if (c9x.func <= FuncSafetyCh16) { - param = ((c9x.param>>1)<<1); - param |=(c9x.enabled & 0x01); - } else { - param = c9x.param; - if ((c9x.func == FuncPlayValue || c9x.func == FuncVolume) && param > 7) { - param -= -2; - } - } - func = c9x.func; -} - t_Open9xArmFuncSwData_v208::operator FuncSwData () { FuncSwData c9x; c9x.swtch = open9xArmToSwitch(swtch); c9x.func = (AssignFunc)(func); - if (c9x.func <= FuncSafetyCh16) { + if (c9x.func <= FuncSafetyCh32) { c9x.enabled=param & 0x01; c9x.param = (param>>1)<<1; } @@ -1263,29 +590,6 @@ t_Open9xArmFuncSwData_v208::operator FuncSwData () return c9x; } -t_Open9xArmFuncSwData_v210::t_Open9xArmFuncSwData_v210(FuncSwData &c9x) -{ - swtch = open9xArmFromSwitch(c9x.swtch); - uint32_t value; - if (c9x.func <= FuncInstantTrim) { - value = ((c9x.param>>1)<<1); - value |=(c9x.enabled & 0x01); - } - else { - if (c9x.func == FuncPlayPrompt || c9x.func == FuncBackgroundMusic) { - memcpy(param, c9x.paramarm, sizeof(param)); - } - else { - value = c9x.param; - if ((c9x.func == FuncPlayValue || c9x.func == FuncVolume) && value > 7) { - value-=2; - } - *((uint32_t *)param) = value; - } - } - func = c9x.func; -} - t_Open9xArmFuncSwData_v210::operator FuncSwData () { FuncSwData c9x; @@ -1310,30 +614,6 @@ t_Open9xArmFuncSwData_v210::operator FuncSwData () return c9x; } -t_Open9xArmFuncSwData_v211::t_Open9xArmFuncSwData_v211(FuncSwData &c9x) -{ - swtch = open9xArmFromSwitch(c9x.swtch); - uint32_t value; - if (c9x.func <= FuncInstantTrim) { - value = c9x.param; - *((uint32_t *)param) = value; - delay=(c9x.enabled & 0x01); - } - else { - if (c9x.func == FuncPlayPrompt || c9x.func == FuncBackgroundMusic) { - memcpy(param, c9x.paramarm, sizeof(param)); - } - else { - value = c9x.param; - if ((c9x.func == FuncPlayValue || c9x.func == FuncVolume || (c9x.func >= FuncAdjustGV1 && c9x.func <= FuncAdjustGV5)) && value > 7) { - value--; - } - *((uint32_t *)param) = value; - } - } - func = c9x.func; -} - t_Open9xArmFuncSwData_v211::operator FuncSwData () { FuncSwData c9x; @@ -1350,7 +630,7 @@ t_Open9xArmFuncSwData_v211::operator FuncSwData () } else { c9x.param = value; - if ((c9x.func == FuncPlayValue || c9x.func == FuncVolume || (c9x.func >= FuncAdjustGV1 && c9x.func <= FuncAdjustGV5)) && value > 7) { + if ((c9x.func == FuncPlayValue || c9x.func == FuncVolume || (c9x.func >= FuncAdjustGV1 && c9x.func <= FuncAdjustGVLast)) && value > 7) { c9x.param++; } } @@ -1358,16 +638,6 @@ t_Open9xArmFuncSwData_v211::operator FuncSwData () return c9x; } -t_Open9xArmSwashRingData_v208::t_Open9xArmSwashRingData_v208(SwashRingData &c9x) -{ - invertELE = c9x.invertELE; - invertAIL = c9x.invertAIL; - invertCOL = c9x.invertCOL; - type = c9x.type; - collectiveSource = open9xArm208FromSource(c9x.collectiveSource); - value = c9x.value; -} - t_Open9xArmSwashRingData_v208::operator SwashRingData () { SwashRingData c9x; @@ -1380,16 +650,6 @@ t_Open9xArmSwashRingData_v208::operator SwashRingData () return c9x; } -t_Open9xArmSwashRingData_v209::t_Open9xArmSwashRingData_v209(SwashRingData &c9x) -{ - invertELE = c9x.invertELE; - invertAIL = c9x.invertAIL; - invertCOL = c9x.invertCOL; - type = c9x.type; - collectiveSource = open9xArm209FromSource(c9x.collectiveSource); - value = c9x.value; -} - t_Open9xArmSwashRingData_v209::operator SwashRingData () { SwashRingData c9x; @@ -1402,16 +662,6 @@ t_Open9xArmSwashRingData_v209::operator SwashRingData () return c9x; } -t_Open9xArmSwashRingData_v210::t_Open9xArmSwashRingData_v210(SwashRingData &c9x) -{ - invertELE = c9x.invertELE; - invertAIL = c9x.invertAIL; - invertCOL = c9x.invertCOL; - type = c9x.type; - collectiveSource = open9xArm210FromSource(c9x.collectiveSource); - value = c9x.value; -} - t_Open9xArmSwashRingData_v210::operator SwashRingData () { SwashRingData c9x; @@ -1452,31 +702,6 @@ t_Open9xArmFrSkyData_v210::operator FrSkyData () return c9x; } -t_Open9xArmFrSkyData_v210::t_Open9xArmFrSkyData_v210(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Open9xArmFrSkyData_v210)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; - usrProto = c9x.usrProto; - voltsSource = c9x.voltsSource; - blades = c9x.blades; - currentSource=c9x.currentSource; - for (int i=0; i<4; i++) { - bars[i].source = c9x.screens[0].body.bars[i].source; - bars[i].barMin = c9x.screens[0].body.bars[i].barMin; - bars[i].barMax = c9x.screens[0].body.bars[i].barMax; - } - for (int line=0; line<4; line++) { - for (int col=0; col<2; col++) { - int i=line*2+col; - lines[i]=c9x.screens[1].body.lines[line].source[col]; - } - } - rssiAlarms[0] = Open9xFrSkyRSSIAlarm(0, c9x.rssiAlarms[0]); - rssiAlarms[1] = Open9xFrSkyRSSIAlarm(1, c9x.rssiAlarms[1]); -} - - t_Open9xArmFrSkyData_v211::operator FrSkyData () { FrSkyData c9x; @@ -1509,33 +734,6 @@ t_Open9xArmFrSkyData_v211::operator FrSkyData () return c9x; } -t_Open9xArmFrSkyData_v211::t_Open9xArmFrSkyData_v211(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Open9xArmFrSkyData_v211)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; - usrProto = c9x.usrProto; - voltsSource = c9x.voltsSource; - blades = c9x.blades; - currentSource=c9x.currentSource; - for (int i=0; i<4; i++) { - bars[i].source = c9x.screens[0].body.bars[i].source; - bars[i].barMin = c9x.screens[0].body.bars[i].barMin; - bars[i].barMax = c9x.screens[0].body.bars[i].barMax; - } - for (int line=0; line<4; line++) { - for (int col=0; col<2; col++) { - int i=line*2+col; - lines[i]=c9x.screens[1].body.lines[line].source[col]; - } - } - rssiAlarms[0] = Open9xFrSkyRSSIAlarm(0, c9x.rssiAlarms[0]); - rssiAlarms[1] = Open9xFrSkyRSSIAlarm(1, c9x.rssiAlarms[1]); - varioSource = c9x.varioSource; - varioSpeedUpMin = c9x.varioCenterMax; - varioSpeedDownMin = c9x.varioCenterMin; -} - t_Open9xArmModelData_v208::operator ModelData () { ModelData c9x; @@ -1562,7 +760,7 @@ t_Open9xArmModelData_v208::operator ModelData () } c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc - 2; c9x.disableThrottleWarning=disableThrottleWarning; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; @@ -1587,7 +785,6 @@ t_Open9xArmModelData_v208::operator ModelData () for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - varioSource = c9x.frsky.varioSource; - varioSpeedUpMin = c9x.frsky.varioCenterMax; - varioSpeedDownMin = c9x.frsky.varioCenterMin; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyLinesXtra=0; - for (int j=0; j<4; j++) { - frskyLines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.frsky.screens[1].body.lines[j].source[k]; - frskyLines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - frskyLinesXtra |= (value / 16) << (4*j+2*k); - } - } - for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - varioSource = c9x.frsky.varioSource; - varioSpeedUpMin = c9x.frsky.varioCenterMax; - varioSpeedDownMin = c9x.frsky.varioCenterMin; - switchWarningStates = c9x.switchWarningStates; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyLinesXtra=0; - for (int j=0; j<4; j++) { - frskyLines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.frsky.screens[1].body.lines[j].source[k]; - frskyLines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - frskyLinesXtra |= (value / 16) << (4*j+2*k); - } - } - for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - varioSource = c9x.frsky.varioSource; - varioSpeedUpMin = c9x.frsky.varioCenterMax; - varioSpeedDownMin = c9x.frsky.varioCenterMin; - switchWarningStates = c9x.switchWarningStates; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - - for (int i=0; i O9X_ARM_NUM_POINTS - 5 * O9X_ARM_MAX_CURVES) { - EEPROMWarnings += ::QObject::tr("open9x only accepts %1 points in all curves").arg(O9X_ARM_NUM_POINTS) + "\n"; - break; - } - curves[i] = offset; - for (int j=0; j= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - switchWarningStates = c9x.switchWarningStates; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - - for (int i=0; i O9X_ARM_NUM_POINTS - 5 * O9X_ARM_MAX_CURVES) { - EEPROMWarnings += ::QObject::tr("open9x only accepts %1 points in all curves").arg(O9X_ARM_NUM_POINTS) + "\n"; - break; - } - curves[i] = offset; - for (int j=0; j= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - switchWarningStates = c9x.switchWarningStates; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - } -} diff --git a/companion/src/firmwares/opentx/open9xSky9xeeprom.h b/companion/src/firmwares/opentx/open9xSky9xeeprom.h index 1c28d6d18..fdb3974ee 100644 --- a/companion/src/firmwares/opentx/open9xSky9xeeprom.h +++ b/companion/src/firmwares/opentx/open9xSky9xeeprom.h @@ -36,7 +36,6 @@ PACK(typedef struct t_Open9xArmTimerData_v202 { operator TimerData(); t_Open9xArmTimerData_v202() { memset(this, 0, sizeof(t_Open9xArmTimerData_v202)); } - t_Open9xArmTimerData_v202(TimerData &eepe); }) Open9xArmTimerData_v202; PACK(typedef struct t_Open9xArmExpoData_v208 { @@ -50,8 +49,6 @@ PACK(typedef struct t_Open9xArmExpoData_v208 { operator ExpoData(); t_Open9xArmExpoData_v208() { memset(this, 0, sizeof(t_Open9xArmExpoData_v208)); } - t_Open9xArmExpoData_v208(ExpoData&); - }) Open9xArmExpoData_v208; PACK(typedef struct t_Open9xArmExpoData_v210 { @@ -67,8 +64,6 @@ PACK(typedef struct t_Open9xArmExpoData_v210 { operator ExpoData(); t_Open9xArmExpoData_v210() { memset(this, 0, sizeof(t_Open9xArmExpoData_v210)); } - t_Open9xArmExpoData_v210(ExpoData&); - }) Open9xArmExpoData_v210; PACK(typedef struct t_Open9xArmExpoData_v212 { @@ -83,8 +78,6 @@ PACK(typedef struct t_Open9xArmExpoData_v212 { operator ExpoData(); t_Open9xArmExpoData_v212() { memset(this, 0, sizeof(t_Open9xArmExpoData_v212)); } - t_Open9xArmExpoData_v212(ExpoData&); - }) Open9xArmExpoData_v212; PACK(typedef struct t_Open9xArmMixData_v208 { @@ -106,8 +99,6 @@ PACK(typedef struct t_Open9xArmMixData_v208 { operator MixData(); t_Open9xArmMixData_v208() { memset(this, 0, sizeof(t_Open9xArmMixData_v208)); } - t_Open9xArmMixData_v208(MixData&); - }) Open9xArmMixData_v208; PACK(typedef struct t_Open9xArmMixData_v209 { @@ -129,8 +120,6 @@ PACK(typedef struct t_Open9xArmMixData_v209 { operator MixData(); t_Open9xArmMixData_v209() { memset(this, 0, sizeof(t_Open9xArmMixData_v209)); } - t_Open9xArmMixData_v209(MixData&); - }) Open9xArmMixData_v209; PACK(typedef struct t_Open9xArmMixData_v210 { @@ -154,8 +143,6 @@ PACK(typedef struct t_Open9xArmMixData_v210 { operator MixData(); t_Open9xArmMixData_v210() { memset(this, 0, sizeof(t_Open9xArmMixData_v210)); } - t_Open9xArmMixData_v210(MixData&); - }) Open9xArmMixData_v210; PACK(typedef struct t_Open9xArmMixData_v212 { @@ -180,8 +167,6 @@ PACK(typedef struct t_Open9xArmMixData_v212 { operator MixData(); t_Open9xArmMixData_v212() { memset(this, 0, sizeof(t_Open9xArmMixData_v212)); } - t_Open9xArmMixData_v212(MixData&); - }) Open9xArmMixData_v212; PACK(typedef struct t_Open9xArmPhaseData_v208 { @@ -192,7 +177,6 @@ PACK(typedef struct t_Open9xArmPhaseData_v208 { uint8_t fadeOut:4; operator PhaseData(); t_Open9xArmPhaseData_v208() { memset(this, 0, sizeof(t_Open9xArmPhaseData_v208)); } - t_Open9xArmPhaseData_v208(PhaseData &eepe); }) Open9xArmPhaseData_v208; PACK(typedef struct t_Open9xArmPhaseData_v212 { @@ -204,40 +188,36 @@ PACK(typedef struct t_Open9xArmPhaseData_v212 { int16_t rotaryEncoders[1]; operator PhaseData(); t_Open9xArmPhaseData_v212() { memset(this, 0, sizeof(t_Open9xArmPhaseData_v212)); } - t_Open9xArmPhaseData_v212(PhaseData &eepe); }) Open9xArmPhaseData_v212; -PACK(typedef struct t_Open9xArmCustomSwData_v208 { // Custom Switches data +PACK(typedef struct t_Open9xArmLogicalSwitchData_v208 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; - operator CustomSwData(); - t_Open9xArmCustomSwData_v208() { memset(this, 0, sizeof(t_Open9xArmCustomSwData_v208)); } - t_Open9xArmCustomSwData_v208(CustomSwData&); -}) Open9xArmCustomSwData_v208; + operator LogicalSwitchData(); + t_Open9xArmLogicalSwitchData_v208() { memset(this, 0, sizeof(t_Open9xArmLogicalSwitchData_v208)); } +}) Open9xArmLogicalSwitchData_v208; -PACK(typedef struct t_Open9xArmCustomSwData_v209 { // Custom Switches data +PACK(typedef struct t_Open9xArmLogicalSwitchData_v209 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; - operator CustomSwData(); - t_Open9xArmCustomSwData_v209() { memset(this, 0, sizeof(t_Open9xArmCustomSwData_v209)); } - t_Open9xArmCustomSwData_v209(CustomSwData&); -}) Open9xArmCustomSwData_v209; + operator LogicalSwitchData(); + t_Open9xArmLogicalSwitchData_v209() { memset(this, 0, sizeof(t_Open9xArmLogicalSwitchData_v209)); } +}) Open9xArmLogicalSwitchData_v209; -PACK(typedef struct t_Open9xArmCustomSwData_v210 { // Custom Switches data +PACK(typedef struct t_Open9xArmLogicalSwitchData_v210 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; uint8_t delay; uint8_t duration; - operator CustomSwData(); - t_Open9xArmCustomSwData_v210() { memset(this, 0, sizeof(t_Open9xArmCustomSwData_v210)); } - t_Open9xArmCustomSwData_v210(CustomSwData&); -}) Open9xArmCustomSwData_v210; + operator LogicalSwitchData(); + t_Open9xArmLogicalSwitchData_v210() { memset(this, 0, sizeof(t_Open9xArmLogicalSwitchData_v210)); } +}) Open9xArmLogicalSwitchData_v210; PACK(typedef struct t_Open9xArmFuncSwData_v208 { // Function Switches data int8_t swtch; // input @@ -246,8 +226,6 @@ PACK(typedef struct t_Open9xArmFuncSwData_v208 { // Function Switches data operator FuncSwData(); t_Open9xArmFuncSwData_v208() { memset(this, 0, sizeof(t_Open9xArmFuncSwData_v208)); } - t_Open9xArmFuncSwData_v208(FuncSwData&); - }) Open9xArmFuncSwData_v208; PACK(typedef struct t_Open9xArmFuncSwData_v210 { // Function Switches data @@ -257,8 +235,6 @@ PACK(typedef struct t_Open9xArmFuncSwData_v210 { // Function Switches data operator FuncSwData(); t_Open9xArmFuncSwData_v210() { memset(this, 0, sizeof(t_Open9xArmFuncSwData_v210)); } - t_Open9xArmFuncSwData_v210(FuncSwData&); - }) Open9xArmFuncSwData_v210; PACK(typedef struct t_Open9xArmFuncSwData_v211 { // Function Switches data @@ -270,8 +246,6 @@ PACK(typedef struct t_Open9xArmFuncSwData_v211 { // Function Switches data operator FuncSwData(); t_Open9xArmFuncSwData_v211() { memset(this, 0, sizeof(t_Open9xArmFuncSwData_v211)); } - t_Open9xArmFuncSwData_v211(FuncSwData&); - }) Open9xArmFuncSwData_v211; PACK(typedef struct t_Open9xArmSwashRingData_v208 { // Swash Ring data @@ -284,8 +258,6 @@ PACK(typedef struct t_Open9xArmSwashRingData_v208 { // Swash Ring data operator SwashRingData(); t_Open9xArmSwashRingData_v208() { memset(this, 0, sizeof(t_Open9xArmSwashRingData_v208)); } - t_Open9xArmSwashRingData_v208(SwashRingData&); - }) Open9xArmSwashRingData_v208; PACK(typedef struct t_Open9xArmSwashRingData_v209 { // Swash Ring data @@ -298,8 +270,6 @@ PACK(typedef struct t_Open9xArmSwashRingData_v209 { // Swash Ring data operator SwashRingData(); t_Open9xArmSwashRingData_v209() { memset(this, 0, sizeof(t_Open9xArmSwashRingData_v209)); } - t_Open9xArmSwashRingData_v209(SwashRingData&); - }) Open9xArmSwashRingData_v209; PACK(typedef struct t_Open9xArmSwashRingData_v210 { // Swash Ring data @@ -312,8 +282,6 @@ PACK(typedef struct t_Open9xArmSwashRingData_v210 { // Swash Ring data operator SwashRingData(); t_Open9xArmSwashRingData_v210() { memset(this, 0, sizeof(t_Open9xArmSwashRingData_v210)); } - t_Open9xArmSwashRingData_v210(SwashRingData&); - }) Open9xArmSwashRingData_v210; @@ -336,7 +304,6 @@ PACK(typedef struct t_Open9xArmFrSkyData_v210 { operator FrSkyData(); t_Open9xArmFrSkyData_v210() { memset(this, 0, sizeof(t_Open9xArmFrSkyData_v210)); } - t_Open9xArmFrSkyData_v210(FrSkyData&); }) Open9xArmFrSkyData_v210; PACK(typedef struct t_Open9xArmFrSkyData_v211 { @@ -355,7 +322,6 @@ PACK(typedef struct t_Open9xArmFrSkyData_v211 { operator FrSkyData(); t_Open9xArmFrSkyData_v211() { memset(this, 0, sizeof(t_Open9xArmFrSkyData_v211)); } - t_Open9xArmFrSkyData_v211(FrSkyData&); }) Open9xArmFrSkyData_v211; PACK(typedef struct t_Open9xArmModelData_v208 { @@ -377,7 +343,7 @@ PACK(typedef struct t_Open9xArmModelData_v208 { Open9xArmExpoData_v208 expoData[O9X_ARM_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xArmCustomSwData_v208 customSw[O9X_ARM_NUM_CSW]; + Open9xArmLogicalSwitchData_v208 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v208 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v208 swashR; Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_PHASES]; @@ -395,8 +361,6 @@ PACK(typedef struct t_Open9xArmModelData_v208 { operator ModelData(); t_Open9xArmModelData_v208() { memset(this, 0, sizeof(t_Open9xArmModelData_v208)); } - t_Open9xArmModelData_v208(ModelData&); - }) Open9xArmModelData_v208; PACK(typedef struct t_Open9xArmModelData_v209 { @@ -418,7 +382,7 @@ PACK(typedef struct t_Open9xArmModelData_v209 { Open9xArmExpoData_v208 expoData[O9X_ARM_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xArmCustomSwData_v209 customSw[O9X_ARM_NUM_CSW]; + Open9xArmLogicalSwitchData_v209 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v208 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v209 swashR; Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_PHASES]; @@ -437,8 +401,6 @@ PACK(typedef struct t_Open9xArmModelData_v209 { operator ModelData(); t_Open9xArmModelData_v209() { memset(this, 0, sizeof(t_Open9xArmModelData_v209)); } - t_Open9xArmModelData_v209(ModelData&); - }) Open9xArmModelData_v209; PACK(typedef struct t_Open9xArmModelData_v210 { @@ -460,7 +422,7 @@ PACK(typedef struct t_Open9xArmModelData_v210 { Open9xArmExpoData_v210 expoData[O9X_ARM_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xArmCustomSwData_v210 customSw[O9X_ARM_NUM_CSW]; + Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v210 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v209 swashR; Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_PHASES]; @@ -477,7 +439,6 @@ PACK(typedef struct t_Open9xArmModelData_v210 { operator ModelData(); t_Open9xArmModelData_v210() { memset(this, 0, sizeof(t_Open9xArmModelData_v210)); } - t_Open9xArmModelData_v210(ModelData&); }) Open9xArmModelData_v210; @@ -500,7 +461,7 @@ PACK(typedef struct t_Open9xArmModelData_v211 { Open9xArmExpoData_v210 expoData[O9X_ARM_MAX_EXPOS]; int16_t curves[O9X_ARM_MAX_CURVES]; int8_t points[O9X_ARM_NUM_POINTS]; - Open9xArmCustomSwData_v210 customSw[O9X_ARM_NUM_CSW]; + Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v211 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v209 swashR; Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_PHASES]; @@ -517,8 +478,6 @@ PACK(typedef struct t_Open9xArmModelData_v211 { operator ModelData(); t_Open9xArmModelData_v211() { memset(this, 0, sizeof(t_Open9xArmModelData_v211)); } - t_Open9xArmModelData_v211(ModelData&); - }) Open9xArmModelData_v211; PACK(typedef struct t_Open9xArmModelData_v212 { @@ -540,7 +499,7 @@ PACK(typedef struct t_Open9xArmModelData_v212 { Open9xArmExpoData_v212 expoData[O9X_ARM_MAX_EXPOS]; int16_t curves[O9X_ARM_MAX_CURVES]; int8_t points[O9X_ARM_NUM_POINTS]; - Open9xArmCustomSwData_v210 customSw[O9X_ARM_NUM_CSW]; + Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v211 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v210 swashR; Open9xArmPhaseData_v212 phaseData[O9X_ARM_MAX_PHASES]; @@ -555,8 +514,6 @@ PACK(typedef struct t_Open9xArmModelData_v212 { operator ModelData(); t_Open9xArmModelData_v212() { memset(this, 0, sizeof(t_Open9xArmModelData_v212)); } - t_Open9xArmModelData_v212(ModelData&); - }) Open9xArmModelData_v212; #endif diff --git a/companion/src/firmwares/opentx/open9xStockeeprom.cpp b/companion/src/firmwares/opentx/open9xStockeeprom.cpp index 274e91be9..73cb22164 100644 --- a/companion/src/firmwares/opentx/open9xStockeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xStockeeprom.cpp @@ -62,28 +62,6 @@ void getEEPROMZString(char *dst, const char *src, int size) } } -int8_t open9xStockFromSwitch(const RawSwitch & sw) -{ - switch (sw.type) { - case SWITCH_TYPE_SWITCH: - return sw.index; - case SWITCH_TYPE_VIRTUAL: - return sw.index > 0 ? (9 + sw.index) : (-9 + sw.index); - case SWITCH_TYPE_ON: - return 22; - case SWITCH_TYPE_OFF: - return -22; - case SWITCH_TYPE_MOMENT_SWITCH: - return sw.index > 0 ? (22 + sw.index) : (-22 + sw.index); - case SWITCH_TYPE_MOMENT_VIRTUAL: - return sw.index > 0 ? (31 + sw.index) : (-31 + sw.index); - case SWITCH_TYPE_ONM: - return 44; - default: - return 0; - } -} - RawSwitch open9xStockToSwitch(int8_t sw) { uint8_t swa = abs(sw); @@ -96,77 +74,13 @@ RawSwitch open9xStockToSwitch(int8_t sw) else if (sw == 22) return RawSwitch(SWITCH_TYPE_ON); else if (sw == 44) - return RawSwitch(SWITCH_TYPE_ONM); + return RawSwitch(SWITCH_TYPE_ON); else if (sw == -22) return RawSwitch(SWITCH_TYPE_OFF); else if (swa <= 22+9) - return RawSwitch(SWITCH_TYPE_MOMENT_SWITCH, sw > 0 ? sw-22 : sw+22); + return RawSwitch(SWITCH_TYPE_SWITCH, sw > 0 ? sw-22 : sw+22); else - return RawSwitch(SWITCH_TYPE_MOMENT_VIRTUAL, sw > 0 ? sw-22-9 : sw+22+9); -} - -t_Open9xExpoData_v201::t_Open9xExpoData_v201(ExpoData &c9x) -{ - mode = c9x.mode; - chn = c9x.chn; - // 0=no curve, 1-6=std curves, 7-10=CV1-CV4, 11-15=CV9-CV13 - curve = 0; - expo = 0; - if (c9x.curveMode == 1) { - if (c9x.curveParam >=0 && c9x.curveParam <= 10) - curve = c9x.curveParam; - else if (c9x.curveParam >= 15 && c9x.curveParam <= 19) - curve = c9x.curveParam - 4; - else - EEPROMWarnings += ::QObject::tr("Open9x doesn't allow Curve%1 in expos").arg(c9x.curveParam-6) + "\n"; - } - else { - expo=c9x.expo; - } - swtch = open9xStockFromSwitch(c9x.swtch); - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - negPhase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - negPhase=0; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=(ph+1); - negPhase=1; - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on expos not exported") + "\n"; - } - weight = c9x.weight; + return RawSwitch(SWITCH_TYPE_VIRTUAL, sw > 0 ? sw-22-9 : sw+22+9); } t_Open9xExpoData_v201::operator ExpoData () @@ -179,15 +93,10 @@ t_Open9xExpoData_v201::operator ExpoData () } else { if (curve == 0) { - c9x.curveMode = 0; - c9x.curveParam = expo; + c9x.curve = CurveReference(CurveReference::CURVE_REF_EXPO, expo); } else { - c9x.curveMode = 1; - if (curve <= 10) - c9x.curveParam = curve; - else - c9x.curveParam = curve + 4; + // TODO } } c9x.swtch = open9xStockToSwitch(swtch); @@ -205,40 +114,18 @@ t_Open9xExpoData_v201::operator ExpoData () return c9x; } -t_Open9xExpoData_v211::t_Open9xExpoData_v211(ExpoData &c9x) -{ - mode = c9x.mode; - chn = c9x.chn; - // 0=no curve, 1-6=std curves, 7-10=CV1-CV4, 11-15=CV9-CV13 - - swtch = open9xStockFromSwitch(c9x.swtch); - phases = c9x.phases; - weight = c9x.weight; - curveMode = c9x.curveMode; - curveParam = c9x.curveParam; -} - t_Open9xExpoData_v211::operator ExpoData () { ExpoData c9x; c9x.mode = mode; c9x.chn = chn; - c9x.curveMode = curveMode; - c9x.curveParam = curveParam; + // TODO c9x.curve c9x.swtch = open9xStockToSwitch(swtch); c9x.phases = phases; c9x.weight = weight; return c9x; } -t_Open9xLimitData_v201::t_Open9xLimitData_v201(LimitData &c9x) -{ - min = c9x.min+100; - max = c9x.max-100; - revert = c9x.revert; - offset = c9x.offset; -} - t_Open9xLimitData_v201::operator LimitData () { LimitData c9x; @@ -249,16 +136,6 @@ t_Open9xLimitData_v201::operator LimitData () return c9x; } -t_Open9xLimitData_v211::t_Open9xLimitData_v211(LimitData &c9x) -{ - min = c9x.min+100; - max = c9x.max-100; - revert = c9x.revert; - offset = c9x.offset; - ppmCenter = c9x.ppmCenter; - symetrical = c9x.symetrical; -} - t_Open9xLimitData_v211::operator LimitData () { LimitData c9x; @@ -271,90 +148,6 @@ t_Open9xLimitData_v211::operator LimitData () return c9x; } -t_Open9xMixData_v201::t_Open9xMixData_v201(MixData &c9x) -{ - destCh = c9x.destCh; - mixWarn = c9x.mixWarn; - swtch = open9xStockFromSwitch(c9x.swtch); - - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("open9x on this board doesn't have Rotary Encoders") + "\n"; - srcRaw = 5 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 8; // MAX - } - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 9; // FULL - swtch = open9xStockFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 10 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 13 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 21 + c9x.srcRaw.index; - } - - weight = c9x.weight; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - mltpx = (MltpxValue)c9x.mltpx; - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; -} - t_Open9xMixData_v201::operator MixData () { MixData c9x; @@ -395,7 +188,7 @@ t_Open9xMixData_v201::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-21); } - c9x.curve = curve; + // TODO c9x.curve = curve; c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -403,7 +196,7 @@ t_Open9xMixData_v201::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; -// c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); } else if (phase==0) { @@ -416,90 +209,6 @@ t_Open9xMixData_v201::operator MixData () return c9x; } -t_Open9xMixData_v203::t_Open9xMixData_v203(MixData &c9x) -{ - destCh = c9x.destCh; - mixWarn = c9x.mixWarn; - swtch = open9xStockFromSwitch(c9x.swtch); - - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("open9x on this board doesn't have Rotary Encoders") + "\n"; - srcRaw = 5 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 8; // MAX - } - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 9; // FULL - swtch = open9xStockFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 10 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 13 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 21 + c9x.srcRaw.index; - } - - weight = c9x.weight; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - mltpx = (MltpxValue)c9x.mltpx; - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; -} - t_Open9xMixData_v203::operator MixData () { MixData c9x; @@ -540,7 +249,7 @@ t_Open9xMixData_v203::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-21); } - c9x.curve = curve; + // TODO c9x.curve = curve; c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -548,7 +257,7 @@ t_Open9xMixData_v203::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - // c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); } else if (phase==0) { @@ -561,98 +270,6 @@ t_Open9xMixData_v203::operator MixData () return c9x; } -t_Open9xMixData_v205::t_Open9xMixData_v205(MixData &c9x) -{ - if (c9x.destCh) { - destCh = c9x.destCh-1; - mixWarn = c9x.mixWarn; - swtch = open9xStockFromSwitch(c9x.swtch); - - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("Open9x on this board doesn't have Rotary Encoders") + "\n"; - srcRaw = 5 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 8; // MAX - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 9; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 9 + open9xStockFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 31 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 34 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 42 + c9x.srcRaw.index; - } - - weight = c9x.weight; - differential = c9x.differential/2; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - mltpx = (MltpxValue)c9x.mltpx; - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; - } - else { - memset(this, 0, sizeof(t_Open9xMixData_v205)); - } -} - t_Open9xMixData_v205::operator MixData () { MixData c9x; @@ -686,8 +303,14 @@ t_Open9xMixData_v205::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-42); } c9x.weight = weight; - c9x.differential = differential*2; - c9x.curve = curve; + + if (differential) { + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, differential*2); + } + else { + // TODO c9x.curve = curve; + } + c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -695,12 +318,14 @@ t_Open9xMixData_v205::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - // c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); - } else if (phase==0) { + } + else if (phase==0) { c9x.phases=0; - } else { + } + else { c9x.phases=63; c9x.phases &= ~(1 << (phase -1)); } @@ -709,101 +334,6 @@ t_Open9xMixData_v205::operator MixData () return c9x; } -t_Open9xMixData_v209::t_Open9xMixData_v209(MixData &c9x) -{ - if (c9x.destCh) { - destCh = c9x.destCh-1; - mixWarn = c9x.mixWarn; - swtch = open9xStockFromSwitch(c9x.swtch); - - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("Open9x on this board doesn't have Rotary Encoders") + "\n"; - srcRaw = 5 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - srcRaw = 8 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 12; // MAX - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 13; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 13 + open9xStockFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 35 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 38 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 46 + c9x.srcRaw.index; - } - - weight = c9x.weight; - differential = c9x.differential/2; - curve = c9x.curve; - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - mltpx = (MltpxValue)c9x.mltpx; - int zeros=0; - int ones=0; - int phtemp=c9x.phases; - for (int i=0; i>=1; - } - if (zeros==O9X_MAX_PHASES || zeros==0) { - phase=0; - } else if (zeros==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=ph+1; - } else if (ones==1) { - int phtemp=c9x.phases; - int ph=0; - for (int i=0; i>=1; - } - phase=-(ph+1); - } else { - phase=0; - EEPROMWarnings += ::QObject::tr("Flight modes settings on mixers not exported") + "\n"; - } - sOffset = c9x.sOffset; - } - else { - memset(this, 0, sizeof(t_Open9xMixData_v209)); - } -} - t_Open9xMixData_v209::operator MixData () { MixData c9x; @@ -840,8 +370,14 @@ t_Open9xMixData_v209::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-46); } c9x.weight = weight; - c9x.differential = differential*2; - c9x.curve = curve; + + if (differential) { + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, differential*2); + } + else { + // TODO c9x.curve = curve; + } + c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -849,12 +385,14 @@ t_Open9xMixData_v209::operator MixData () c9x.carryTrim = carryTrim; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - // c9x.phase = phase; + if (phase<0) { c9x.phases= 1 << (-phase -1); - } else if (phase==0) { + } + else if (phase==0) { c9x.phases=0; - } else { + } + else { c9x.phases=63; c9x.phases &= ~(1 << (phase -1)); } @@ -863,70 +401,6 @@ t_Open9xMixData_v209::operator MixData () return c9x; } -t_Open9xMixData_v211::t_Open9xMixData_v211(MixData &c9x) -{ - if (c9x.destCh) { - destCh = c9x.destCh-1; - mixWarn = c9x.mixWarn; - swtch = open9xStockFromSwitch(c9x.swtch); - - if (c9x.srcRaw.type == SOURCE_TYPE_NONE) { - srcRaw = 0; - swtch = 0; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_STICK) { - srcRaw = 1 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("Open9x on this board doesn't have Rotary Encoders") + "\n"; - srcRaw = 5 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_TRIM) { - srcRaw = 8 + c9x.srcRaw.index; // use pots instead - } - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) { - srcRaw = 12; // MAX - } - /* else if (c9x.srcRaw.type == SOURCE_TYPE_3POS) { - srcRaw = 13; - } */ - else if (c9x.srcRaw.type == SOURCE_TYPE_SWITCH) { - srcRaw = 13 + open9xStockFromSwitch(RawSwitch(c9x.srcRaw.index)); - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CYC) { - srcRaw = 35 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) { - srcRaw = 38 + c9x.srcRaw.index; - } - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) { - srcRaw = 46 + c9x.srcRaw.index; - } - - weight = c9x.weight; - if (c9x.curve==0) { - curveMode = 0; - curveParam = c9x.differential; - } - else { - curveMode = 1; - curveParam = c9x.curve; - } - delayUp = c9x.delayUp; - delayDown = c9x.delayDown; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; - carryTrim = c9x.carryTrim; - noExpo = c9x.noExpo; - mltpx = (MltpxValue)c9x.mltpx; - phases = c9x.phases; - sOffset = c9x.sOffset; - } - else { - memset(this, 0, sizeof(t_Open9xMixData_v211)); - } -} - t_Open9xMixData_v211::operator MixData () { MixData c9x; @@ -963,12 +437,14 @@ t_Open9xMixData_v211::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_CH, srcRaw-46); } c9x.weight = weight; + if (curveMode==0) { - c9x.differential = curveParam; - c9x.curve=0; - } else { - c9x.curve=curveParam; + c9x.curve = CurveReference(CurveReference::CURVE_REF_DIFF, curveParam); + } + else { + // TODO c9x.curve = curve; } + c9x.delayUp = delayUp; c9x.delayDown = delayDown; c9x.speedUp = speedUp; @@ -983,30 +459,6 @@ t_Open9xMixData_v211::operator MixData () return c9x; } -int8_t open9x208FromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("Open9x on this board doesn't have Rotary Encoders") + "\n"; - v1 = 5+source.index; - } - else if (source.type == SOURCE_TYPE_MAX) - v1 = 8; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 9; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 10+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 13+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 21+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 36+source.index; - return v1; -} - RawSource open9x208ToSource(int8_t value) { if (value == 0) { @@ -1035,32 +487,6 @@ RawSource open9x208ToSource(int8_t value) } } -int8_t open9xStock209FromSource(RawSource source) -{ - int v1 = 0; - if (source.type == SOURCE_TYPE_STICK) - v1 = 1+source.index; - else if (source.type == SOURCE_TYPE_ROTARY_ENCODER) { - EEPROMWarnings += ::QObject::tr("Open9x on this board doesn't have Rotary Encoders") + "\n"; - v1 = 5+source.index; - } - else if (source.type == SOURCE_TYPE_TRIM) - v1 = 8+source.index; - else if (source.type == SOURCE_TYPE_MAX) - v1 = 12; - /* else if (source.type == SOURCE_TYPE_3POS) - v1 = 13; */ - else if (source.type == SOURCE_TYPE_CYC) - v1 = 14+source.index; - else if (source.type == SOURCE_TYPE_PPM) - v1 = 17+source.index; - else if (source.type == SOURCE_TYPE_CH) - v1 = 25+source.index; - else if (source.type == SOURCE_TYPE_TELEMETRY) - v1 = 40+source.index; - return v1; -} - RawSource open9xStock209ToSource(int8_t value) { if (value == 0) { @@ -1092,49 +518,22 @@ RawSource open9xStock209ToSource(int8_t value) } } -t_Open9xCustomSwData_v208::t_Open9xCustomSwData_v208(CustomSwData &c9x) +Open9xLogicalSwitchData_v208::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = open9x208FromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - v2 = open9x208FromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = open9xStockFromSwitch(RawSwitch(c9x.val1)); - v2 = open9xStockFromSwitch(RawSwitch(c9x.val2)); - } - - if (func>O9X_MAX_CSFUNCOLD ) { - EEPROMWarnings += ::QObject::tr("This version of open9x does not support Custom Switch function %1").arg(getFuncName(func)) + "\n"; - func=0; - v1=0; - v2=0; - } -} - -Open9xCustomSwData_v208::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = open9x208ToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = open9x208ToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = open9xStockToSwitch(v1).toValue(); c9x.val2 = open9xStockToSwitch(v2).toValue(); } @@ -1142,42 +541,22 @@ Open9xCustomSwData_v208::operator CustomSwData () return c9x; } -t_Open9xCustomSwData_v209::t_Open9xCustomSwData_v209(CustomSwData &c9x) +Open9xLogicalSwitchData_v209::operator LogicalSwitchData () { - func = c9x.func; - v1 = c9x.val1; - v2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - v1 = open9xStock209FromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL && c9x.func <= CS_FN_ELESS) { - v2 = open9xStock209FromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - v1 = open9xStockFromSwitch(RawSwitch(c9x.val1)); - v2 = open9xStockFromSwitch(RawSwitch(c9x.val2)); - } -} - -Open9xCustomSwData_v209::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = func; c9x.val1 = v1; c9x.val2 = v2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = open9xStock209ToSource(v1).toValue(); } - if (c9x.func >= CS_FN_EQUAL && c9x.func <= CS_FN_ELESS) { + if (c9x.func >= LS_FN_EQUAL && c9x.func <= LS_FN_ELESS) { c9x.val2 = open9xStock209ToSource(v2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = open9xStockToSwitch(v1).toValue(); c9x.val2 = open9xStockToSwitch(v2).toValue(); } @@ -1185,12 +564,6 @@ Open9xCustomSwData_v209::operator CustomSwData () return c9x; } -t_Open9xFuncSwData_v201::t_Open9xFuncSwData_v201(FuncSwData &c9x) -{ - swtch = open9xStockFromSwitch(c9x.swtch); - func = c9x.func - O9X_NUM_CHNOUT; -} - t_Open9xFuncSwData_v201::operator FuncSwData () { FuncSwData c9x; @@ -1220,42 +593,11 @@ enum Functions { #endif FUNC_BACKLIGHT, #if defined(DEBUG) - FUNC_TEST, // should remain the last before MAX as not added in companion9x + FUNC_TEST, // should remain the last before MAX as not added in companion #endif FUNC_MAX }; -t_Open9xFuncSwData_v203::t_Open9xFuncSwData_v203(FuncSwData &c9x) -{ - swtch = open9xStockFromSwitch(c9x.swtch); - if (c9x.func <= FuncSafetyCh16) { - param = ((c9x.param>>1)<<1); - param |=(c9x.enabled & 0x01); - func = c9x.func; - } else { - param = c9x.param;; - if (c9x.func <= FuncTrainerAIL) - func = 16 + c9x.func - FuncTrainer; - else if (c9x.func == FuncInstantTrim) - func = 21; - else if (c9x.func == FuncPlaySound) - func = 22; - else if (c9x.func == FuncPlayHaptic) - func = 23; - else if (c9x.func == FuncReset) - func = 24; - else if (c9x.func == FuncVario) - func = 25; - else if (c9x.func == FuncBacklight) - func = 26; - else { - swtch = 0; - func = 0; - param = 0; - } - } -} - t_Open9xFuncSwData_v203::operator FuncSwData () { FuncSwData c9x; @@ -1286,38 +628,6 @@ t_Open9xFuncSwData_v203::operator FuncSwData () return c9x; } -t_Open9xFuncSwData_v210::t_Open9xFuncSwData_v210(FuncSwData &c9x) -{ - swtch = open9xStockFromSwitch(c9x.swtch); - param = c9x.param; - if (c9x.func <= FuncInstantTrim) { - delay = c9x.enabled; - func = (uint8_t)c9x.func; - } - else if (c9x.func == FuncPlaySound) - func = 22; - else if (c9x.func == FuncPlayHaptic) - func = 23; - else if (c9x.func == FuncReset) - func = 24; - else if (c9x.func == FuncVario) - func = 25; - else if (c9x.func == FuncPlayPrompt) - func = 26; - else if (c9x.func == FuncPlayValue) { - func = 27; - if (c9x.param > 7) { - param -= 2; - } - } else if (c9x.func == FuncBacklight) - func = 28; - else { - swtch = 0; - func = 0; - param = 0; - } -} - t_Open9xFuncSwData_v210::operator FuncSwData () { FuncSwData c9x; @@ -1352,30 +662,6 @@ t_Open9xFuncSwData_v210::operator FuncSwData () return c9x; } -t_Open9xSafetySwData::t_Open9xSafetySwData(SafetySwData &c9x) -{ - swtch = open9xStockFromSwitch(c9x.swtch); - val = c9x.val; -} - -t_Open9xSafetySwData::operator SafetySwData () -{ - SafetySwData c9x; - c9x.swtch = open9xStockToSwitch(swtch); - c9x.val = val; - return c9x; -} - -t_Open9xSwashRingData_v208::t_Open9xSwashRingData_v208(SwashRingData &c9x) -{ - invertELE = c9x.invertELE; - invertAIL = c9x.invertAIL; - invertCOL = c9x.invertCOL; - type = c9x.type; - collectiveSource = open9x208FromSource(c9x.collectiveSource); - value = c9x.value; -} - t_Open9xSwashRingData_v208::operator SwashRingData () { SwashRingData c9x; @@ -1388,16 +674,6 @@ t_Open9xSwashRingData_v208::operator SwashRingData () return c9x; } -t_Open9xSwashRingData_v209::t_Open9xSwashRingData_v209(SwashRingData &c9x) -{ - invertELE = c9x.invertELE; - invertAIL = c9x.invertAIL; - invertCOL = c9x.invertCOL; - type = c9x.type; - collectiveSource = open9xStock209FromSource(c9x.collectiveSource); - value = c9x.value; -} - t_Open9xSwashRingData_v209::operator SwashRingData () { SwashRingData c9x; @@ -1422,23 +698,10 @@ t_Open9xPhaseData_v201::operator PhaseData () return c9x; } -t_Open9xPhaseData_v201::t_Open9xPhaseData_v201(PhaseData &c9x) -{ - trim_ext = 0; - for (int i=0; i> 2); - trim_ext = (trim_ext & ~(0x03 << (2*i))) + (((c9x.trim[i] & 0x03) << (2*i))); - } - swtch = open9xStockFromSwitch(c9x.swtch); - setEEPROMZString(name, c9x.name, sizeof(name)); - fadeIn = c9x.fadeIn; - fadeOut = c9x.fadeOut; -} - t_Open9xTimerData_v201::operator TimerData () { TimerData c9x; - c9x.mode = TMRMODE_OFF; + // c9x.mode = TMRMODE_OFF; c9x.val = val; c9x.persistent = persistent; c9x.dir = dir; @@ -1448,9 +711,9 @@ t_Open9xTimerData_v201::operator TimerData () t_Open9xTimerData_v202::operator TimerData () { TimerData c9x; - +/* if (mode <= -22) - c9x.mode = TimerMode(TMRMODE_FIRST_NEG_MOMENT_SWITCH+(mode+22)); + c9x.mode = TimerMode(TMRMODE_FIRST_NEG_SWITCH+(mode+22)); else if (mode <= -1) c9x.mode = TimerMode(TMRMODE_FIRST_NEG_SWITCH+(mode+1)); else if (mode < 5) @@ -1458,32 +721,14 @@ t_Open9xTimerData_v202::operator TimerData () else if (mode < 5+21) c9x.mode = TimerMode(TMRMODE_FIRST_SWITCH+(mode-5)); else - c9x.mode = TimerMode(TMRMODE_FIRST_MOMENT_SWITCH+(mode-5-21)); - + c9x.mode = TimerMode(TMRMODE_FIRST_SWITCH+(mode-5-21)); +*/ c9x.val = val; c9x.persistent = false; c9x.dir = (val == 0); return c9x; } -t_Open9xTimerData_v202::t_Open9xTimerData_v202(TimerData &c9x) -{ - val = c9x.val; - - if (c9x.mode >= TMRMODE_OFF && c9x.mode <= TMRMODE_THt) - mode = 0+c9x.mode-TMRMODE_OFF; - else if (c9x.mode >= TMRMODE_FIRST_MOMENT_SWITCH) - mode = 26+c9x.mode-TMRMODE_FIRST_MOMENT_SWITCH; - else if (c9x.mode >= TMRMODE_FIRST_SWITCH) - mode = 5+c9x.mode-TMRMODE_FIRST_SWITCH; - else if (c9x.mode <= TMRMODE_FIRST_NEG_MOMENT_SWITCH) - mode = -22+c9x.mode-TMRMODE_FIRST_NEG_MOMENT_SWITCH; - else if (c9x.mode <= TMRMODE_FIRST_NEG_SWITCH) - mode = -1+c9x.mode-TMRMODE_FIRST_NEG_SWITCH; - else - mode = 0; -} - FrSkyRSSIAlarm t_Open9xFrSkyRSSIAlarm::get(int index) { FrSkyRSSIAlarm c9x; @@ -1492,25 +737,6 @@ FrSkyRSSIAlarm t_Open9xFrSkyRSSIAlarm::get(int index) return c9x; } -t_Open9xFrSkyRSSIAlarm::t_Open9xFrSkyRSSIAlarm(int index, FrSkyRSSIAlarm &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyRSSIAlarm)); - level = (2+c9x.level-index) % 4; - value = c9x.value - 50; -} - -t_Open9xFrSkyChannelData_v201::t_Open9xFrSkyChannelData_v201(FrSkyChannelData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyChannelData_v201)); - ratio = c9x.ratio; - alarms_value[0] = c9x.alarms[0].value; - alarms_value[1] = c9x.alarms[1].value; - alarms_level = (c9x.alarms[1].level << 2) + c9x.alarms[0].level; - alarms_greater = (c9x.alarms[1].greater << 1) + c9x.alarms[0].greater; - type = c9x.type; - offset = LIMIT(-8, c9x.offset, +7); -} - t_Open9xFrSkyChannelData_v201::operator FrSkyChannelData () { FrSkyChannelData c9x; @@ -1526,18 +752,6 @@ t_Open9xFrSkyChannelData_v201::operator FrSkyChannelData () return c9x; } -t_Open9xFrSkyChannelData_v203::t_Open9xFrSkyChannelData_v203(FrSkyChannelData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyChannelData_v203)); - ratio = c9x.ratio; - alarms_value[0] = c9x.alarms[0].value; - alarms_value[1] = c9x.alarms[1].value; - alarms_level = (c9x.alarms[1].level << 2) + c9x.alarms[0].level; - alarms_greater = (c9x.alarms[1].greater << 1) + c9x.alarms[0].greater; - type = c9x.type; - offset = c9x.offset; -} - t_Open9xFrSkyChannelData_v203::operator FrSkyChannelData () { FrSkyChannelData c9x; @@ -1553,20 +767,6 @@ t_Open9xFrSkyChannelData_v203::operator FrSkyChannelData () return c9x; } -t_Open9xFrSkyChannelData_v204::t_Open9xFrSkyChannelData_v204(FrSkyChannelData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyChannelData_v204)); - ratio = c9x.ratio; - type = c9x.type; - multiplier = c9x.multiplier; - alarms_value[0] = c9x.alarms[0].value; - alarms_value[1] = c9x.alarms[1].value; - alarms_level = (c9x.alarms[1].level << 2) + c9x.alarms[0].level; - alarms_greater = (c9x.alarms[1].greater << 1) + c9x.alarms[0].greater; - // TODO multiplier = c9x.multiplier; - offset = c9x.offset; -} - t_Open9xFrSkyChannelData_v204::operator FrSkyChannelData () { FrSkyChannelData c9x; @@ -1584,20 +784,6 @@ t_Open9xFrSkyChannelData_v204::operator FrSkyChannelData () return c9x; } -t_Open9xFrSkyChannelData_v208::t_Open9xFrSkyChannelData_v208(FrSkyChannelData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyChannelData_v208)); - ratio = c9x.ratio; - type = c9x.type; - multiplier = c9x.multiplier; - alarms_value[0] = c9x.alarms[0].value; - alarms_value[1] = c9x.alarms[1].value; - alarms_level = (c9x.alarms[1].level << 2) + c9x.alarms[0].level; - alarms_greater = (c9x.alarms[1].greater << 1) + c9x.alarms[0].greater; - // TODO multiplier = c9x.multiplier; - offset = c9x.offset; -} - t_Open9xFrSkyChannelData_v208::operator FrSkyChannelData () { FrSkyChannelData c9x; @@ -1632,14 +818,6 @@ t_Open9xFrSkyData_v202::operator FrSkyData () return c9x; } -t_Open9xFrSkyData_v202::t_Open9xFrSkyData_v202(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyData_v202)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; - usrProto = c9x.usrProto; -} - t_Open9xFrSkyData_v203::operator FrSkyData () { FrSkyData c9x; @@ -1649,14 +827,6 @@ t_Open9xFrSkyData_v203::operator FrSkyData () return c9x; } -t_Open9xFrSkyData_v203::t_Open9xFrSkyData_v203(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyData_v203)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; - usrProto = c9x.usrProto; -} - t_Open9xFrSkyBarData_v204::operator FrSkyBarData () { FrSkyBarData c9x; @@ -1666,14 +836,6 @@ t_Open9xFrSkyBarData_v204::operator FrSkyBarData () return c9x; } -t_Open9xFrSkyBarData_v204::t_Open9xFrSkyBarData_v204(FrSkyBarData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyBarData_v204)); - source = c9x.source; - barMin = c9x.barMin; - barMax = c9x.barMax; -} - t_Open9xFrSkyData_v204::operator FrSkyData () { FrSkyData c9x; @@ -1688,18 +850,6 @@ t_Open9xFrSkyData_v204::operator FrSkyData () return c9x; } -t_Open9xFrSkyData_v204::t_Open9xFrSkyData_v204(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyData_v204)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; - usrProto = c9x.usrProto; - imperial = c9x.imperial; - blades = c9x.blades; - for (int i=0; i<4; i++) - bars[i] = c9x.screens[0].body.bars[i]; -} - t_Open9xFrSkyData_v205::operator FrSkyData () { FrSkyData c9x; @@ -1716,21 +866,6 @@ t_Open9xFrSkyData_v205::operator FrSkyData () return c9x; } -t_Open9xFrSkyData_v205::t_Open9xFrSkyData_v205(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyData_v205)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; - usrProto = c9x.usrProto; - imperial = c9x.imperial; - blades = c9x.blades; - for (int i=0; i<4; i++) - bars[i] = c9x.screens[0].body.bars[i]; - rssiAlarms[0] = Open9xFrSkyRSSIAlarm(0, c9x.rssiAlarms[0]); - rssiAlarms[1] = Open9xFrSkyRSSIAlarm(1, c9x.rssiAlarms[1]); -} - - t_Open9xFrSkyData_v208::operator FrSkyData () { FrSkyData c9x; @@ -1748,21 +883,6 @@ t_Open9xFrSkyData_v208::operator FrSkyData () return c9x; } -t_Open9xFrSkyData_v208::t_Open9xFrSkyData_v208(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyData_v208)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; - usrProto = c9x.usrProto; - voltsSource = c9x.voltsSource; - blades = c9x.blades; - currentSource=c9x.currentSource; - for (int i=0; i<4; i++) - bars[i] = c9x.screens[0].body.bars[i]; - rssiAlarms[0] = Open9xFrSkyRSSIAlarm(0, c9x.rssiAlarms[0]); - rssiAlarms[1] = Open9xFrSkyRSSIAlarm(1, c9x.rssiAlarms[1]); -} - t_Open9xFrSkyData_v210::operator FrSkyData () { FrSkyData c9x; @@ -1798,40 +918,6 @@ t_Open9xFrSkyData_v210::operator FrSkyData () return c9x; } -t_Open9xFrSkyData_v210::t_Open9xFrSkyData_v210(FrSkyData &c9x) -{ - memset(this, 0, sizeof(t_Open9xFrSkyData_v210)); - channels[0] = c9x.channels[0]; - channels[1] = c9x.channels[1]; - usrProto = c9x.usrProto; - voltsSource = c9x.voltsSource; - blades = c9x.blades; - currentSource=c9x.currentSource; - - for (int scr=0; scr<2; scr++) { - if (c9x.screens[scr].type == 1) { - for (int i=0; i<4; i++) - bars[i] = c9x.screens[scr].body.bars[i]; - } - else { - linesXtra=0; - for (int j=0; j<4; j++) { - lines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.screens[scr].body.lines[j].source[k]; - lines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - linesXtra |= (value / 16) << (4*j+2*k); - } - } - } - } - rssiAlarms[0] = Open9xFrSkyRSSIAlarm(0, c9x.rssiAlarms[0]); - rssiAlarms[1] = Open9xFrSkyRSSIAlarm(1, c9x.rssiAlarms[1]); - varioSource = c9x.varioSource; - varioSpeedUpMin = c9x.varioCenterMax; - varioSpeedDownMin = c9x.varioCenterMin; -} - t_Open9xModelData_v201::operator ModelData () { ModelData c9x; @@ -1856,7 +942,7 @@ t_Open9xModelData_v201::operator ModelData () c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; c9x.thrExpo = thrExpo; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc - 2; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; c9x.moduleData[0].ppmPulsePol = pulsePol; @@ -1881,7 +967,6 @@ t_Open9xModelData_v201::operator ModelData () c9x.expoData[i] = expoData[i]; for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId=c9x.modelId; - } - else { - memset(this, 0, sizeof(t_Open9xModelData_v202)); - } -} - t_Open9xModelData_v203::operator ModelData () { ModelData c9x; @@ -2090,7 +1092,7 @@ t_Open9xModelData_v203::operator ModelData () } c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc - 2; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; c9x.moduleData[0].ppmPulsePol = pulsePol; @@ -2115,7 +1117,6 @@ t_Open9xModelData_v203::operator ModelData () c9x.expoData[i] = expoData[i]; for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - } - else { - memset(this, 0, sizeof(t_Open9xModelData_v203)); - } -} - t_Open9xModelData_v204::operator ModelData () { ModelData c9x; @@ -2256,7 +1166,7 @@ t_Open9xModelData_v204::operator ModelData () } c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc - 2; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; c9x.moduleData[0].ppmPulsePol = pulsePol; @@ -2281,7 +1191,6 @@ t_Open9xModelData_v204::operator ModelData () c9x.expoData[i] = expoData[i]; for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyRssiAlarms[0] = Open9xFrSkyRSSIAlarm(0, c9x.frsky.rssiAlarms[0]); - frskyRssiAlarms[1] = Open9xFrSkyRSSIAlarm(1, c9x.frsky.rssiAlarms[1]); - } - else { - memset(this, 0, sizeof(t_Open9xModelData_v204)); - } -} - t_Open9xModelData_v205::operator ModelData () { ModelData c9x; @@ -2429,7 +1245,7 @@ t_Open9xModelData_v205::operator ModelData () } c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc - 2; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; c9x.moduleData[0].ppmPulsePol = pulsePol; @@ -2454,7 +1270,6 @@ t_Open9xModelData_v205::operator ModelData () c9x.expoData[i] = expoData[i]; for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyLinesXtra=0; - for (int j=0; j<4; j++) { - frskyLines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.frsky.screens[1].body.lines[j].source[k]; - frskyLines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - frskyLinesXtra |= (value / 16) << (4*j+2*k); - } - } - } - else { - memset(this, 0, sizeof(t_Open9xModelData_v205)); - } -} - - t_Open9xModelData_v208::operator ModelData () { ModelData c9x; @@ -2620,7 +1331,7 @@ t_Open9xModelData_v208::operator ModelData () c9x.moduleData[0].channelsCount = 8 + (2 * ppmNCH); c9x.thrTrim = thrTrim; c9x.disableThrottleWarning=disableThrottleWarning; - c9x.trimInc = trimInc; + c9x.trimInc = trimInc - 2; c9x.moduleData[0].ppmDelay = 300 + 50 * ppmDelay; c9x.beepANACenter = beepANACenter; c9x.moduleData[0].ppmPulsePol = pulsePol; @@ -2645,7 +1356,6 @@ t_Open9xModelData_v208::operator ModelData () c9x.expoData[i] = expoData[i]; for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - varioSource = c9x.frsky.varioSource; - varioSpeedUpMin = c9x.frsky.varioCenterMax; - varioSpeedDownMin = c9x.frsky.varioCenterMin; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyLinesXtra=0; - for (int j=0; j<4; j++) { - frskyLines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.frsky.screens[1].body.lines[j].source[k]; - frskyLines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - frskyLinesXtra |= (value / 16) << (4*j+2*k); - } - } - - for (int i=0; i= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - varioSource = c9x.frsky.varioSource; - varioSpeedUpMin = c9x.frsky.varioCenterMax; - varioSpeedDownMin = c9x.frsky.varioCenterMin; - switchWarningStates = c9x.switchWarningStates; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - frskyLinesXtra=0; - for (int j=0; j<4; j++) { - frskyLines[j] = 0; - for (int k=0; k<2; k++) { - int value = c9x.frsky.screens[1].body.lines[j].source[k]; - frskyLines[j] |= (k==0 ? (value & 0x0f) : ((value & 0x0f) << 4)); - frskyLinesXtra |= (value / 16) << (4*j+2*k); - } - } - - for (int i=0; i O9X_NUM_POINTS - 5 * O9X_MAX_CURVES) { - EEPROMWarnings += ::QObject::tr("open9x only accepts %1 points in all curves").arg(O9X_NUM_POINTS) + "\n"; - break; - } - curves[i] = offset; - for (int j=0; j= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - - switchWarningStates = c9x.switchWarningStates; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - - for (int i=0; i O9X_NUM_POINTS - 5 * O9X_MAX_CURVES) { - EEPROMWarnings += ::QObject::tr("open9x only accepts %1 points in all curves").arg(O9X_NUM_POINTS) + "\n"; - break; - } - curves[i] = offset; - for (int j=0; j= 0) { - phase.trim[j] = 501 + phase.trimRef[j] - (phase.trimRef[j] >= i ? 1 : 0); - } - else { - phase.trim[j] = std::max(-500, std::min(500, phase.trim[j])); - } - } - phaseData[i] = phase; - } - frsky = c9x.frsky; - - switchWarningStates = c9x.switchWarningStates; - - ppmFrameLength = c9x.moduleData[0].ppmFrameLength; - thrTraceSrc = c9x.thrTraceSrc; - modelId = c9x.modelId; - } -} diff --git a/companion/src/firmwares/opentx/open9xStockeeprom.h b/companion/src/firmwares/opentx/open9xStockeeprom.h index 46178281f..8f121441e 100644 --- a/companion/src/firmwares/opentx/open9xStockeeprom.h +++ b/companion/src/firmwares/opentx/open9xStockeeprom.h @@ -65,7 +65,6 @@ PACK(typedef struct t_Open9xFrSkyRSSIAlarm { int8_t value:6; FrSkyRSSIAlarm get(int index); t_Open9xFrSkyRSSIAlarm() { memset(this, 0, sizeof(t_Open9xFrSkyRSSIAlarm)); } - t_Open9xFrSkyRSSIAlarm(int index, FrSkyRSSIAlarm&); }) Open9xFrSkyRSSIAlarm; PACK(typedef struct t_Open9xExpoData_v201 { @@ -80,8 +79,6 @@ PACK(typedef struct t_Open9xExpoData_v201 { operator ExpoData(); t_Open9xExpoData_v201() { memset(this, 0, sizeof(t_Open9xExpoData_v201)); } - t_Open9xExpoData_v201(ExpoData&); - }) Open9xExpoData_v201; PACK(typedef struct t_Open9xExpoData_v211 { @@ -95,8 +92,6 @@ PACK(typedef struct t_Open9xExpoData_v211 { operator ExpoData(); t_Open9xExpoData_v211() { memset(this, 0, sizeof(t_Open9xExpoData_v211)); } - t_Open9xExpoData_v211(ExpoData&); - }) Open9xExpoData_v211; PACK(typedef struct t_Open9xLimitData_v201 { @@ -107,8 +102,6 @@ PACK(typedef struct t_Open9xLimitData_v201 { operator LimitData(); t_Open9xLimitData_v201() { memset(this, 0, sizeof(t_Open9xLimitData_v201)); } - t_Open9xLimitData_v201(LimitData&); - }) Open9xLimitData_v201; PACK(typedef struct t_Open9xLimitData_v211 { @@ -121,8 +114,6 @@ PACK(typedef struct t_Open9xLimitData_v211 { operator LimitData(); t_Open9xLimitData_v211() { memset(this, 0, sizeof(t_Open9xLimitData_v211)); } - t_Open9xLimitData_v211(LimitData&); - }) Open9xLimitData_v211; PACK(typedef struct t_Open9xMixData_v201 { @@ -143,8 +134,6 @@ PACK(typedef struct t_Open9xMixData_v201 { operator MixData(); t_Open9xMixData_v201() { memset(this, 0, sizeof(t_Open9xMixData_v201)); } - t_Open9xMixData_v201(MixData&); - }) Open9xMixData_v201; PACK(typedef struct t_Open9xMixData_v203 { @@ -165,8 +154,6 @@ PACK(typedef struct t_Open9xMixData_v203 { operator MixData(); t_Open9xMixData_v203() { memset(this, 0, sizeof(t_Open9xMixData_v203)); } - t_Open9xMixData_v203(MixData&); - }) Open9xMixData_v203; PACK(typedef struct t_Open9xMixData_v205 { @@ -188,8 +175,6 @@ PACK(typedef struct t_Open9xMixData_v205 { operator MixData(); t_Open9xMixData_v205() { memset(this, 0, sizeof(t_Open9xMixData_v205)); } - t_Open9xMixData_v205(MixData&); - }) Open9xMixData_v205; PACK(typedef struct t_Open9xMixData_v209 { @@ -211,8 +196,6 @@ PACK(typedef struct t_Open9xMixData_v209 { operator MixData(); t_Open9xMixData_v209() { memset(this, 0, sizeof(t_Open9xMixData_v209)); } - t_Open9xMixData_v209(MixData&); - }) Open9xMixData_v209; PACK(typedef struct t_Open9xMixData_v211 { @@ -236,38 +219,32 @@ PACK(typedef struct t_Open9xMixData_v211 { operator MixData(); t_Open9xMixData_v211() { memset(this, 0, sizeof(t_Open9xMixData_v211)); } - t_Open9xMixData_v211(MixData&); - }) Open9xMixData_v211; -PACK(typedef struct t_Open9xCustomSwData_v208 { // Custom Switches data +PACK(typedef struct t_Open9xLogicalSwitchData_v208 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; - operator CustomSwData(); - t_Open9xCustomSwData_v208() { memset(this, 0, sizeof(t_Open9xCustomSwData_v208)); } - t_Open9xCustomSwData_v208(CustomSwData&); -}) Open9xCustomSwData_v208; + operator LogicalSwitchData(); + t_Open9xLogicalSwitchData_v208() { memset(this, 0, sizeof(t_Open9xLogicalSwitchData_v208)); } + t_Open9xLogicalSwitchData_v208(LogicalSwitchData&); +}) Open9xLogicalSwitchData_v208; -PACK(typedef struct t_Open9xCustomSwData_v209 { // Custom Switches data +PACK(typedef struct t_Open9xLogicalSwitchData_v209 { // Custom Switches data int8_t v1; //input int8_t v2; //offset uint8_t func; - operator CustomSwData(); - t_Open9xCustomSwData_v209() { memset(this, 0, sizeof(t_Open9xCustomSwData_v209)); } - t_Open9xCustomSwData_v209(CustomSwData&); -}) Open9xCustomSwData_v209; + operator LogicalSwitchData(); + t_Open9xLogicalSwitchData_v209() { memset(this, 0, sizeof(t_Open9xLogicalSwitchData_v209)); } +}) Open9xLogicalSwitchData_v209; PACK(typedef struct t_Open9xSafetySwData { // Safety Switches data int8_t swtch; int8_t val; - operator SafetySwData(); t_Open9xSafetySwData() { memset(this, 0, sizeof(t_Open9xSafetySwData)); } - t_Open9xSafetySwData(SafetySwData&); - }) Open9xSafetySwData; PACK(typedef struct t_Open9xFuncSwData_v201 { // Function Switches data @@ -276,8 +253,6 @@ PACK(typedef struct t_Open9xFuncSwData_v201 { // Function Switches data operator FuncSwData(); t_Open9xFuncSwData_v201() { memset(this, 0, sizeof(t_Open9xFuncSwData_v201)); } - t_Open9xFuncSwData_v201(FuncSwData&); - }) Open9xFuncSwData_v201; PACK(typedef struct t_Open9xFuncSwData_v203 { // Function Switches data @@ -287,8 +262,6 @@ PACK(typedef struct t_Open9xFuncSwData_v203 { // Function Switches data operator FuncSwData(); t_Open9xFuncSwData_v203() { memset(this, 0, sizeof(t_Open9xFuncSwData_v203)); } - t_Open9xFuncSwData_v203(FuncSwData&); - }) Open9xFuncSwData_v203; PACK(typedef struct t_Open9xFuncSwData_v210 { // Function Switches data @@ -299,8 +272,6 @@ PACK(typedef struct t_Open9xFuncSwData_v210 { // Function Switches data operator FuncSwData(); t_Open9xFuncSwData_v210() { memset(this, 0, sizeof(t_Open9xFuncSwData_v210)); } - t_Open9xFuncSwData_v210(FuncSwData&); - }) Open9xFuncSwData_v210; PACK(typedef struct t_Open9xFrSkyChannelData_v201 { @@ -316,8 +287,6 @@ PACK(typedef struct t_Open9xFrSkyChannelData_v201 { operator FrSkyChannelData(); t_Open9xFrSkyChannelData_v201() { memset(this, 0, sizeof(t_Open9xFrSkyChannelData_v201)); } - t_Open9xFrSkyChannelData_v201(FrSkyChannelData&); - }) Open9xFrSkyChannelData_v201; PACK(typedef struct t_Open9xFrSkyChannelData_v203 { @@ -333,8 +302,6 @@ PACK(typedef struct t_Open9xFrSkyChannelData_v203 { operator FrSkyChannelData(); t_Open9xFrSkyChannelData_v203() { memset(this, 0, sizeof(t_Open9xFrSkyChannelData_v203)); } - t_Open9xFrSkyChannelData_v203(FrSkyChannelData&); - }) Open9xFrSkyChannelData_v203; PACK(typedef struct t_Open9xFrSkyChannelData_v204 { @@ -348,8 +315,6 @@ PACK(typedef struct t_Open9xFrSkyChannelData_v204 { operator FrSkyChannelData(); t_Open9xFrSkyChannelData_v204() { memset(this, 0, sizeof(t_Open9xFrSkyChannelData_v204)); } - t_Open9xFrSkyChannelData_v204(FrSkyChannelData&); - }) Open9xFrSkyChannelData_v204; PACK(typedef struct t_Open9xFrSkyChannelData_v208 { @@ -363,37 +328,30 @@ PACK(typedef struct t_Open9xFrSkyChannelData_v208 { operator FrSkyChannelData(); t_Open9xFrSkyChannelData_v208() { memset(this, 0, sizeof(t_Open9xFrSkyChannelData_v208)); } - t_Open9xFrSkyChannelData_v208(FrSkyChannelData&); - }) Open9xFrSkyChannelData_v208; PACK(typedef struct t_Open9xFrSkyData_v201 { - Open9xFrSkyChannelData_v201 channels[2]; - - operator FrSkyData(); - t_Open9xFrSkyData_v201() { memset(this, 0, sizeof(t_Open9xFrSkyData_v201)); } + Open9xFrSkyChannelData_v201 channels[2]; + operator FrSkyData(); + t_Open9xFrSkyData_v201() { memset(this, 0, sizeof(t_Open9xFrSkyData_v201)); } }) Open9xFrSkyData_v201; PACK(typedef struct t_Open9xFrSkyData_v202 { - Open9xFrSkyChannelData_v201 channels[2]; - uint8_t usrProto:2; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh - uint8_t spare:6; - - operator FrSkyData(); - t_Open9xFrSkyData_v202() { memset(this, 0, sizeof(t_Open9xFrSkyData_v202)); } - t_Open9xFrSkyData_v202(FrSkyData&); + Open9xFrSkyChannelData_v201 channels[2]; + uint8_t usrProto:2; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh + uint8_t spare:6; + operator FrSkyData(); + t_Open9xFrSkyData_v202() { memset(this, 0, sizeof(t_Open9xFrSkyData_v202)); } }) Open9xFrSkyData_v202; PACK(typedef struct t_Open9xFrSkyData_v203 { - Open9xFrSkyChannelData_v203 channels[2]; - uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh - - operator FrSkyData(); - t_Open9xFrSkyData_v203() { memset(this, 0, sizeof(t_Open9xFrSkyData_v203)); } - t_Open9xFrSkyData_v203(FrSkyData&); + Open9xFrSkyChannelData_v203 channels[2]; + uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh + operator FrSkyData(); + t_Open9xFrSkyData_v203() { memset(this, 0, sizeof(t_Open9xFrSkyData_v203)); } }) Open9xFrSkyData_v203; PACK(typedef struct t_Open9xFrSkyBarData_v204 { @@ -403,8 +361,6 @@ PACK(typedef struct t_Open9xFrSkyBarData_v204 { operator FrSkyBarData(); t_Open9xFrSkyBarData_v204() { memset(this, 0, sizeof(t_Open9xFrSkyBarData_v204)); } - t_Open9xFrSkyBarData_v204(FrSkyBarData&); - }) Open9xFrSkyBarData_v204; PACK(typedef struct t_Open9xFrSkyData_v204 { @@ -417,7 +373,6 @@ PACK(typedef struct t_Open9xFrSkyData_v204 { operator FrSkyData(); t_Open9xFrSkyData_v204() { memset(this, 0, sizeof(t_Open9xFrSkyData_v204)); } - t_Open9xFrSkyData_v204(FrSkyData&); }) Open9xFrSkyData_v204; PACK(typedef struct t_Open9xFrSkyData_v205 { @@ -431,7 +386,6 @@ PACK(typedef struct t_Open9xFrSkyData_v205 { operator FrSkyData(); t_Open9xFrSkyData_v205() { memset(this, 0, sizeof(t_Open9xFrSkyData_v205)); } - t_Open9xFrSkyData_v205(FrSkyData&); }) Open9xFrSkyData_v205; PACK(typedef struct t_Open9xFrSkyData_v208 { @@ -445,7 +399,6 @@ PACK(typedef struct t_Open9xFrSkyData_v208 { operator FrSkyData(); t_Open9xFrSkyData_v208() { memset(this, 0, sizeof(t_Open9xFrSkyData_v208)); } - t_Open9xFrSkyData_v208(FrSkyData&); }) Open9xFrSkyData_v208; PACK(typedef struct t_Open9xFrSkyData_v210 { @@ -466,7 +419,6 @@ PACK(typedef struct t_Open9xFrSkyData_v210 { operator FrSkyData(); t_Open9xFrSkyData_v210() { memset(this, 0, sizeof(t_Open9xFrSkyData_v210)); } - t_Open9xFrSkyData_v210(FrSkyData&); }) Open9xFrSkyData_v210; PACK(typedef struct t_Open9xSwashRingData_v208 { // Swash Ring data @@ -479,8 +431,6 @@ PACK(typedef struct t_Open9xSwashRingData_v208 { // Swash Ring data operator SwashRingData(); t_Open9xSwashRingData_v208() { memset(this, 0, sizeof(t_Open9xSwashRingData_v208)); } - t_Open9xSwashRingData_v208(SwashRingData&); - }) Open9xSwashRingData_v208; PACK(typedef struct t_Open9xSwashRingData_v209 { // Swash Ring data @@ -493,8 +443,6 @@ PACK(typedef struct t_Open9xSwashRingData_v209 { // Swash Ring data operator SwashRingData(); t_Open9xSwashRingData_v209() { memset(this, 0, sizeof(t_Open9xSwashRingData_v209)); } - t_Open9xSwashRingData_v209(SwashRingData&); - }) Open9xSwashRingData_v209; PACK(typedef struct t_Open9xPhaseData_v201 { @@ -507,7 +455,6 @@ PACK(typedef struct t_Open9xPhaseData_v201 { operator PhaseData(); t_Open9xPhaseData_v201() { memset(this, 0, sizeof(t_Open9xPhaseData_v201)); } - t_Open9xPhaseData_v201(PhaseData &eepe); }) Open9xPhaseData_v201; PACK(typedef struct t_Open9xTimerData_v201 { @@ -526,7 +473,6 @@ PACK(typedef struct t_Open9xTimerData_v202 { operator TimerData(); t_Open9xTimerData_v202() { memset(this, 0, sizeof(t_Open9xTimerData_v202)); } - t_Open9xTimerData_v202(TimerData &eepe); }) Open9xTimerData_v202; PACK(typedef struct t_Open9xTimerDataExtra { @@ -570,7 +516,7 @@ PACK(typedef struct t_Open9xModelData_v201 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xCustomSwData_v208 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xSafetySwData safetySw[O9X_NUM_CHNOUT]; Open9xFuncSwData_v201 funcSw[12]; Open9xSwashRingData_v208 swashR; @@ -579,8 +525,6 @@ PACK(typedef struct t_Open9xModelData_v201 { operator ModelData(); t_Open9xModelData_v201() { memset(this, 0, sizeof(t_Open9xModelData_v201)); } - t_Open9xModelData_v201(ModelData&); - }) Open9xModelData_v201; PACK(typedef struct t_Open9xModelData_v202 { @@ -603,7 +547,7 @@ PACK(typedef struct t_Open9xModelData_v202 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xCustomSwData_v208 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xSafetySwData safetySw[O9X_NUM_CHNOUT]; Open9xFuncSwData_v201 funcSw[12]; Open9xSwashRingData_v208 swashR; @@ -615,8 +559,6 @@ PACK(typedef struct t_Open9xModelData_v202 { operator ModelData(); t_Open9xModelData_v202() { memset(this, 0, sizeof(t_Open9xModelData_v202)); } - t_Open9xModelData_v202(ModelData&); - }) Open9xModelData_v202; PACK(typedef struct t_Open9xModelData_v203 { @@ -639,7 +581,7 @@ PACK(typedef struct t_Open9xModelData_v203 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xCustomSwData_v208 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v208 swashR; Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; @@ -650,8 +592,6 @@ PACK(typedef struct t_Open9xModelData_v203 { operator ModelData(); t_Open9xModelData_v203() { memset(this, 0, sizeof(t_Open9xModelData_v203)); } - t_Open9xModelData_v203(ModelData&); - }) Open9xModelData_v203; PACK(typedef struct t_Open9xModelData_v204 { @@ -674,7 +614,7 @@ PACK(typedef struct t_Open9xModelData_v204 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xCustomSwData_v208 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v208 swashR; Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; @@ -686,8 +626,6 @@ PACK(typedef struct t_Open9xModelData_v204 { operator ModelData(); t_Open9xModelData_v204() { memset(this, 0, sizeof(t_Open9xModelData_v204)); } - t_Open9xModelData_v204(ModelData&); - }) Open9xModelData_v204; PACK(typedef struct t_Open9xModelData_v205 { @@ -709,7 +647,7 @@ PACK(typedef struct t_Open9xModelData_v205 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xCustomSwData_v208 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v208 swashR; Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; @@ -723,8 +661,6 @@ PACK(typedef struct t_Open9xModelData_v205 { operator ModelData(); t_Open9xModelData_v205() { memset(this, 0, sizeof(t_Open9xModelData_v205)); } - t_Open9xModelData_v205(ModelData&); - }) Open9xModelData_v205; PACK(typedef struct t_Open9xModelData_v208 { @@ -746,7 +682,7 @@ PACK(typedef struct t_Open9xModelData_v208 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xCustomSwData_v208 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v208 swashR; Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; @@ -764,8 +700,6 @@ PACK(typedef struct t_Open9xModelData_v208 { operator ModelData(); t_Open9xModelData_v208() { memset(this, 0, sizeof(t_Open9xModelData_v208)); } - t_Open9xModelData_v208(ModelData&); - }) Open9xModelData_v208; PACK(typedef struct t_Open9xModelData_v209 { @@ -787,7 +721,7 @@ PACK(typedef struct t_Open9xModelData_v209 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves5[O9X_209_MAX_CURVE5][5]; int8_t curves9[O9X_209_MAX_CURVE9][9]; - Open9xCustomSwData_v209 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v209 swashR; Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; @@ -806,8 +740,6 @@ PACK(typedef struct t_Open9xModelData_v209 { operator ModelData(); t_Open9xModelData_v209() { memset(this, 0, sizeof(t_Open9xModelData_v209)); } - t_Open9xModelData_v209(ModelData&); - }) Open9xModelData_v209; PACK(typedef struct t_Open9xModelData_v210 { @@ -829,7 +761,7 @@ PACK(typedef struct t_Open9xModelData_v210 { Open9xExpoData_v201 expoData[O9X_MAX_EXPOS]; int8_t curves[O9X_MAX_CURVES]; int8_t points[O9X_NUM_POINTS]; - Open9xCustomSwData_v209 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v210 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v209 swashR; Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; @@ -846,8 +778,6 @@ PACK(typedef struct t_Open9xModelData_v210 { operator ModelData(); t_Open9xModelData_v210() { memset(this, 0, sizeof(t_Open9xModelData_v210)); } - t_Open9xModelData_v210(ModelData&); - }) Open9xModelData_v210; PACK(typedef struct t_Open9xModelData_v211 { @@ -869,7 +799,7 @@ PACK(typedef struct t_Open9xModelData_v211 { Open9xExpoData_v211 expoData[O9X_MAX_EXPOS]; int8_t curves[O9X_MAX_CURVES]; int8_t points[O9X_NUM_POINTS]; - Open9xCustomSwData_v209 customSw[O9X_NUM_CSW]; + Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v210 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v209 swashR; Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; @@ -884,8 +814,6 @@ PACK(typedef struct t_Open9xModelData_v211 { operator ModelData(); t_Open9xModelData_v211() { memset(this, 0, sizeof(t_Open9xModelData_v211)); } - t_Open9xModelData_v211(ModelData&); - }) Open9xModelData_v211; #endif diff --git a/companion/src/firmwares/opentx/open9xGruvin9xsimulator.cpp b/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp similarity index 86% rename from companion/src/firmwares/opentx/open9xGruvin9xsimulator.cpp rename to companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp index 9cb478b16..fb101b359 100644 --- a/companion/src/firmwares/opentx/open9xGruvin9xsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp @@ -14,9 +14,9 @@ * */ -#include "open9xGruvin9xsimulator.h" -#include "open9xinterface.h" -#include "open9xeeprom.h" +#include "opentxGruvin9xsimulator.h" +#include "opentxinterface.h" +#include "opentxeeprom.h" #define SIMU #define SIMU_EXCEPTIONS @@ -98,14 +98,14 @@ bool hasExtendedTrims() uint8_t getStickMode() { - return g_eeGeneral.stickMode; + return limit(0, g_eeGeneral.stickMode, 3); } } 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(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(); @@ -160,7 +168,7 @@ void Open9xGruvin9xSimulator::setValues(TxInputs &inputs) void Open9xGruvin9xSimulator::setTrim(unsigned int idx, int value) { - idx = Open9xGruvin9x::modn12x3[4*getStickMode() + idx] - 1; + idx = Open9xGruvin9x::modn12x3[4*getStickMode() + idx]; uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx); setTrimValue(phase, idx, value); } @@ -174,7 +182,7 @@ void Open9xGruvin9xSimulator::getTrims(Trims & trims) } for (int i=0; i<2; i++) { - uint8_t idx = Open9xGruvin9x::modn12x3[4*getStickMode() + i] - 1; + uint8_t idx = Open9xGruvin9x::modn12x3[4*getStickMode() + i]; int16_t tmp = trims.values[i]; trims.values[i] = trims.values[idx]; trims.values[idx] = tmp; diff --git a/companion/src/firmwares/opentx/open9xGruvin9xsimulator.h b/companion/src/firmwares/opentx/opentxGruvin9xsimulator.h similarity index 83% rename from companion/src/firmwares/opentx/open9xGruvin9xsimulator.h rename to companion/src/firmwares/opentx/opentxGruvin9xsimulator.h index 8216c7a04..6fb3e320a 100644 --- a/companion/src/firmwares/opentx/open9xGruvin9xsimulator.h +++ b/companion/src/firmwares/opentx/opentxGruvin9xsimulator.h @@ -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 diff --git a/companion/src/firmwares/opentx/open9xM128simulator.cpp b/companion/src/firmwares/opentx/opentxM128simulator.cpp similarity index 86% rename from companion/src/firmwares/opentx/open9xM128simulator.cpp rename to companion/src/firmwares/opentx/opentxM128simulator.cpp index a82b53b0c..a03045c2d 100644 --- a/companion/src/firmwares/opentx/open9xM128simulator.cpp +++ b/companion/src/firmwares/opentx/opentxM128simulator.cpp @@ -14,9 +14,9 @@ * */ -#include "open9xM128simulator.h" -#include "open9xinterface.h" -#include "open9xeeprom.h" +#include "opentxM128simulator.h" +#include "opentxinterface.h" +#include "opentxeeprom.h" #define SIMU #define SIMU_EXCEPTIONS @@ -96,14 +96,14 @@ bool hasExtendedTrims() uint8_t getStickMode() { - return g_eeGeneral.stickMode; + return limit(0, g_eeGeneral.stickMode, 3); } } 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(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(); @@ -154,7 +160,7 @@ void Open9xM128Simulator::setValues(TxInputs &inputs) void Open9xM128Simulator::setTrim(unsigned int idx, int value) { - idx = Open9xM128::modn12x3[4*getStickMode() + idx] - 1; + idx = Open9xM128::modn12x3[4*getStickMode() + idx]; uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx); setTrimValue(phase, idx, value); } @@ -168,7 +174,7 @@ void Open9xM128Simulator::getTrims(Trims & trims) } for (int i=0; i<2; i++) { - uint8_t idx = Open9xM128::modn12x3[4*getStickMode() + i] - 1; + uint8_t idx = Open9xM128::modn12x3[4*getStickMode() + i]; int16_t tmp = trims.values[i]; trims.values[i] = trims.values[idx]; trims.values[idx] = tmp; diff --git a/companion/src/firmwares/opentx/open9xM128simulator.h b/companion/src/firmwares/opentx/opentxM128simulator.h similarity index 83% rename from companion/src/firmwares/opentx/open9xM128simulator.h rename to companion/src/firmwares/opentx/opentxM128simulator.h index dc43edc5f..862c7ada9 100644 --- a/companion/src/firmwares/opentx/open9xM128simulator.h +++ b/companion/src/firmwares/opentx/opentxM128simulator.h @@ -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 diff --git a/companion/src/firmwares/opentx/open9xSky9xsimulator.cpp b/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp similarity index 88% rename from companion/src/firmwares/opentx/open9xSky9xsimulator.cpp rename to companion/src/firmwares/opentx/opentxSky9xsimulator.cpp index d724028ec..e17a14be3 100644 --- a/companion/src/firmwares/opentx/open9xSky9xsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp @@ -14,8 +14,9 @@ * */ -#include "open9xSky9xsimulator.h" -#include "open9xinterface.h" +#include "opentxSky9xsimulator.h" +#include "opentxinterface.h" +#include "appdata.h" #define SIMU #define SIMU_EXCEPTIONS @@ -125,18 +126,17 @@ bool hasExtendedTrims() uint8_t getStickMode() { - return g_eeGeneral.stickMode; + return limit(0, g_eeGeneral.stickMode, 3); } } using namespace Open9xSky9x; -Open9xSky9xSimulator::Open9xSky9xSimulator(Open9xInterface * open9xInterface): +Open9xSky9xSimulator::Open9xSky9xSimulator(OpenTxInterface * open9xInterface): open9xInterface(open9xInterface) { - QSettings settings("companion9x", "companion9x"); - QString path=settings.value("sdPath", ".").toString()+"/"; + QString path=g.profile[g.id()].sdPath()+"/"; int i=0; for (i=0; i< std::min(path.length(),1022); i++) { simuSdDirectory[i]=path.at(i).toAscii(); @@ -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(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(); @@ -193,7 +200,7 @@ void Open9xSky9xSimulator::setValues(TxInputs &inputs) void Open9xSky9xSimulator::setTrim(unsigned int idx, int value) { - idx = Open9xSky9x::modn12x3[4*getStickMode() + idx] - 1; + idx = Open9xSky9x::modn12x3[4*getStickMode() + idx]; uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx); setTrimValue(phase, idx, value); } @@ -207,7 +214,7 @@ void Open9xSky9xSimulator::getTrims(Trims & trims) } for (int i=0; i<2; i++) { - uint8_t idx = Open9xSky9x::modn12x3[4*getStickMode() + i] - 1; + uint8_t idx = Open9xSky9x::modn12x3[4*getStickMode() + i]; int16_t tmp = trims.values[i]; trims.values[i] = trims.values[idx]; trims.values[idx] = tmp; diff --git a/companion/src/firmwares/opentx/open9xSky9xsimulator.h b/companion/src/firmwares/opentx/opentxSky9xsimulator.h similarity index 83% rename from companion/src/firmwares/opentx/open9xSky9xsimulator.h rename to companion/src/firmwares/opentx/opentxSky9xsimulator.h index 95463fbab..0489fea1d 100644 --- a/companion/src/firmwares/opentx/open9xSky9xsimulator.h +++ b/companion/src/firmwares/opentx/opentxSky9xsimulator.h @@ -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 diff --git a/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp b/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp index 6f216273a..f147e1fc5 100644 --- a/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp +++ b/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp @@ -15,7 +15,8 @@ */ #include "opentxTaranisSimulator.h" -#include "open9xinterface.h" +#include "opentxinterface.h" +#include "appdata.h" #define SIMU #define SIMU_EXCEPTIONS @@ -35,6 +36,8 @@ #define AUDIO #define VOICE #define PXX +#define DSM2 +#define DSM2_PPM #define DBLKEYS #define AUTOSWITCH #define GRAPHICS @@ -47,6 +50,8 @@ #define PPM_CENTER_ADJUSTABLE #define PPM_LIMITS_SYMETRICAL #define FAI_CHOICE +#define LUA +#define LUA_MODEL_SCRIPTS #define EEPROM_VARIANT 3 #undef min @@ -65,6 +70,7 @@ inline int geteepromsize() { #include "radio/src/targets/taranis/board_taranis.cpp" #include "radio/src/protocols/ppm_arm.cpp" #include "radio/src/protocols/pxx_arm.cpp" +#include "radio/src/protocols/dsm2_arm.cpp" #include "radio/src/targets/taranis/pwr_driver.cpp" #include "radio/src/eeprom_common.cpp" #include "radio/src/eeprom_conversions.cpp" @@ -73,6 +79,7 @@ inline int geteepromsize() { #include "radio/src/targets/taranis/pulses_driver.cpp" #include "radio/src/targets/taranis/rtc_driver.cpp" #include "radio/src/targets/taranis/trainer_driver.cpp" +#include "radio/src/targets/taranis/uart3_driver.cpp" #include "radio/src/protocols/pulses_arm.cpp" #include "radio/src/stamp.cpp" #include "radio/src/maths.cpp" @@ -110,8 +117,38 @@ inline int geteepromsize() { #include "radio/src/translations/tts_pt.cpp" #include "radio/src/translations/tts_sk.cpp" #include "radio/src/translations/tts_pl.cpp" + +#include "radio/src/lua.cpp" +#include "radio/src/lua/src/lapi.c" +#include "radio/src/lua/src/lcode.c" +#include "radio/src/lua/src/lctype.c" +#include "radio/src/lua/src/ldebug.c" +#include "radio/src/lua/src/ldo.c" +#include "radio/src/lua/src/ldump.c" +#include "radio/src/lua/src/lfunc.c" +#include "radio/src/lua/src/lgc.c" +#include "radio/src/lua/src/llex.c" +#include "radio/src/lua/src/lmem.c" +#include "radio/src/lua/src/lobject.c" +#include "radio/src/lua/src/lopcodes.c" +#include "radio/src/lua/src/lparser.c" +#include "radio/src/lua/src/lstate.c" +#include "radio/src/lua/src/lstring.c" +#include "radio/src/lua/src/ltable.c" +#include "radio/src/lua/src/ltm.c" +#include "radio/src/lua/src/lundump.c" +#include "radio/src/lua/src/lvm.c" +#include "radio/src/lua/src/lzio.c" +#include "radio/src/lua/src/lbaselib.c" +#include "radio/src/lua/src/linit.c" +#include "radio/src/lua/src/lmathlib.c" +#include "radio/src/lua/src/loadlib.c" +#include "radio/src/lua/src/lauxlib.c" +#include "radio/src/lua/src/ltablib.c" +#include "radio/src/lua/src/lcorolib.c" + -int16_t g_anas[NUM_STICKS+BOARD_X9D_NUM_POTS]; +int16_t g_anas[NUM_STICKS+5]; uint16_t anaIn(uint8_t chan) { @@ -128,7 +165,7 @@ bool hasExtendedTrims() uint8_t getStickMode() { - return g_eeGeneral.stickMode; + return limit(0, g_eeGeneral.stickMode, 3); } void resetTrims() @@ -141,12 +178,11 @@ void resetTrims() using namespace Open9xX9D; -OpentxTaranisSimulator::OpentxTaranisSimulator(Open9xInterface * open9xInterface): +OpentxTaranisSimulator::OpentxTaranisSimulator(OpenTxInterface * open9xInterface): open9xInterface(open9xInterface) { taranisSimulatorBoard = GetEepromInterface()->getBoard(); - QSettings settings("companion9x", "companion9x"); - QString path=settings.value("sdPath", ".").toString()+"/"; + QString path=g.profile[g.id()].sdPath()+"/"; int i=0; for (i=0; i< std::min(path.length(),1022); i++) { simuSdDirectory[i]=path.at(i).toAscii(); @@ -172,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(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(); @@ -200,7 +242,7 @@ void OpentxTaranisSimulator::setValues(TxInputs &inputs) void OpentxTaranisSimulator::setTrim(unsigned int idx, int value) { - idx = Open9xX9D::modn12x3[4*getStickMode() + idx] - 1; + idx = Open9xX9D::modn12x3[4*getStickMode() + idx]; uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx); setTrimValue(phase, idx, value); } @@ -214,7 +256,7 @@ void OpentxTaranisSimulator::getTrims(Trims & trims) } for (int i=0; i<2; i++) { - uint8_t idx = Open9xX9D::modn12x3[4*getStickMode() + i] - 1; + uint8_t idx = Open9xX9D::modn12x3[4*getStickMode() + i]; int16_t tmp = trims.values[i]; trims.values[i] = trims.values[idx]; trims.values[idx] = tmp; diff --git a/companion/src/firmwares/opentx/opentxTaranisSimulator.h b/companion/src/firmwares/opentx/opentxTaranisSimulator.h index c14f9c16c..bd2da1d2a 100644 --- a/companion/src/firmwares/opentx/opentxTaranisSimulator.h +++ b/companion/src/firmwares/opentx/opentxTaranisSimulator.h @@ -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 diff --git a/companion/src/firmwares/opentx/open9xeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp similarity index 51% rename from companion/src/firmwares/opentx/open9xeeprom.cpp rename to companion/src/firmwares/opentx/opentxeeprom.cpp index 80969f79e..f56ffc8dc 100644 --- a/companion/src/firmwares/opentx/open9xeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1,7 +1,7 @@ #include #include #include "helpers.h" -#include "open9xeeprom.h" +#include "opentxeeprom.h" #include #define IS_DBLEEPROM(board, version) ((board==BOARD_GRUVIN9X || board==BOARD_M128) && version >= 213) @@ -11,25 +11,27 @@ #define HAS_PERSISTENT_TIMERS(board) (IS_ARM(board) || board == BOARD_GRUVIN9X) #define HAS_LARGE_LCD(board) IS_TARANIS(board) #define MAX_VIEWS(board) (HAS_LARGE_LCD(board) ? 2 : 256) -#define MAX_POTS(board) (IS_TARANIS(board) ? 4 : 3) +#define MAX_POTS(board, version) (IS_TARANIS(board) ? (version>=216 ? 5 : 4) : 3) #define MAX_SWITCHES(board) (IS_TARANIS(board) ? 8 : 7) #define MAX_SWITCHES_POSITION(board) (IS_TARANIS(board) ? 22 : 9) #define MAX_ROTARY_ENCODERS(board) (board==BOARD_GRUVIN9X ? 2 : (IS_SKY9X(board) ? 1 : 0)) #define MAX_PHASES(board, version) (IS_ARM(board) ? 9 : (IS_DBLRAM(board, version) ? 6 : 5)) #define MAX_MIXERS(board, version) (IS_ARM(board) ? 64 : 32) #define MAX_CHANNELS(board, version) (IS_ARM(board) ? 32 : 16) -#define MAX_EXPOS(board, version) (IS_ARM(board) ? 32 : (IS_DBLRAM(board, version) ? 16 : 14)) +#define MAX_EXPOS(board, version) (IS_ARM(board) ? ((IS_TARANIS(board) && version >= 216) ? 64 : 32) : (IS_DBLRAM(board, version) ? 16 : 14)) #define MAX_CUSTOM_SWITCHES(board, version) (IS_ARM(board) ? 32 : (IS_DBLEEPROM(board, version) ? 15 : 12)) -#define MAX_CUSTOM_FUNCTIONS(board, version) (IS_ARM(board) ? 32 : (IS_DBLEEPROM(board, version) ? 24 : 16)) -#define MAX_CURVES(board) (IS_ARM(board) ? O9X_ARM_MAX_CURVES : O9X_MAX_CURVES) +#define MAX_CUSTOM_FUNCTIONS(board, version) (IS_ARM(board) ? (version >= 216 ? 64 : 32) : (IS_DBLEEPROM(board, version) ? 24 : 16)) +#define MAX_CURVES(board, version) (IS_ARM(board) ? ((IS_TARANIS(board) && version >= 216) ? 32 : 16) : O9X_MAX_CURVES) +#define MAX_GVARS(board, version) ((IS_ARM(board) && version >= 216) ? 9 : 5) +#define NUM_PPM_INPUTS(board, version) ((IS_ARM(board) && version >= 216) ? 16 : 8) -#define IS_RELEASE_21_MARCH_2013(board, version) (version >= 214 || (!IS_ARM(board) && version >= 213)) -#define IS_RELEASE_23_MARCH_2013(board, version) (version >= 214 || (board==BOARD_STOCK && version >= 213)) +#define IS_AFTER_RELEASE_21_MARCH_2013(board, version) (version >= 214 || (!IS_ARM(board) && version >= 213)) +#define IS_AFTER_RELEASE_23_MARCH_2013(board, version) (version >= 214 || (board==BOARD_STOCK && version >= 213)) inline int switchIndex(int i, BoardEnum board, unsigned int version) { - bool release21March2013 = IS_RELEASE_21_MARCH_2013(board, version); - if (!IS_TARANIS(board) && release21March2013) + bool afterrelease21March2013 = IS_AFTER_RELEASE_21_MARCH_2013(board, version); + if (!IS_TARANIS(board) && afterrelease21March2013) return (i<=3 ? i+3 : (i<=6 ? i-3 : i)); else return i; @@ -41,40 +43,66 @@ class SwitchesConversionTable: public ConversionTable { SwitchesConversionTable(BoardEnum board, unsigned int version, unsigned long flags=0) { int val=0; - - addConversion(RawSwitch(SWITCH_TYPE_NONE), val++); + int offset=0; + if (flags & POPULATE_TIMER_MODES) { + offset = 4; + for (int i=0; i<5; i++) { + addConversion(RawSwitch(SWITCH_TYPE_TIMER_MODE, i), val++); + } + } + else { + addConversion(RawSwitch(SWITCH_TYPE_NONE), val++); + } for (int i=1; i<=MAX_SWITCHES_POSITION(board); i++) { int s = switchIndex(i, board, version); - addConversion(RawSwitch(SWITCH_TYPE_SWITCH, -s), -val); + addConversion(RawSwitch(SWITCH_TYPE_SWITCH, -s), -val+offset); addConversion(RawSwitch(SWITCH_TYPE_SWITCH, s), val++); } + if (IS_TARANIS(board) && version >= 216) { + for (int i=1; i<=3*6; i++) { + addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, -i), -val+offset); + addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, i), val++); + } + } + + if (version >= 216) { + for (int i=1; i<=8; i++) { + addConversion(RawSwitch(SWITCH_TYPE_TRIM, -i), -val+offset); + addConversion(RawSwitch(SWITCH_TYPE_TRIM, i), val++); + } + } + + if (version >= 216) { + for (int i=1; i<=MAX_ROTARY_ENCODERS(board); i++) { + addConversion(RawSwitch(SWITCH_TYPE_ROTARY_ENCODER, -i), -val+offset); + addConversion(RawSwitch(SWITCH_TYPE_ROTARY_ENCODER, i), val++); + } + } + for (int i=1; i<=MAX_CUSTOM_SWITCHES(board, version); i++) { - addConversion(RawSwitch(SWITCH_TYPE_VIRTUAL, -i), -val); + addConversion(RawSwitch(SWITCH_TYPE_VIRTUAL, -i), -val+offset); addConversion(RawSwitch(SWITCH_TYPE_VIRTUAL, i), val++); } - addConversion(RawSwitch(SWITCH_TYPE_OFF), -val); + addConversion(RawSwitch(SWITCH_TYPE_OFF), -val+offset); addConversion(RawSwitch(SWITCH_TYPE_ON), val++); - for (int i=1; i<=MAX_SWITCHES_POSITION(board); i++) { - int s = switchIndex(i, board, version); - addConversion(RawSwitch(SWITCH_TYPE_MOMENT_SWITCH, -s), -val); - addConversion(RawSwitch(SWITCH_TYPE_MOMENT_SWITCH, s), val++); - } + if (version < 216) { + // previous "moment" switches + for (int i=1; i<=MAX_SWITCHES_POSITION(board); i++) { + int s = switchIndex(i, board, version); + addConversion(RawSwitch(SWITCH_TYPE_SWITCH, s), val++); + } - for (int i=1; i<=MAX_CUSTOM_SWITCHES(board, version); i++) { - addConversion(RawSwitch(SWITCH_TYPE_MOMENT_VIRTUAL, -i), -val); - addConversion(RawSwitch(SWITCH_TYPE_MOMENT_VIRTUAL, i), val++); - } + for (int i=1; i<=MAX_CUSTOM_SWITCHES(board, version); i++) { + addConversion(RawSwitch(SWITCH_TYPE_VIRTUAL, i), val++); + } - addConversion(RawSwitch(SWITCH_TYPE_ONM, 1 ), -val); - addConversion(RawSwitch(SWITCH_TYPE_ONM, 0 ), val++); - addConversion(RawSwitch(SWITCH_TYPE_TRN, 0), val++); - addConversion(RawSwitch(SWITCH_TYPE_TRN, 1), val++); - addConversion(RawSwitch(SWITCH_TYPE_REA, 0), val++); - addConversion(RawSwitch(SWITCH_TYPE_REA, 1), val++); + // previous "One" switch + addConversion(RawSwitch(SWITCH_TYPE_ON), val++); + } } protected: @@ -126,7 +154,7 @@ class SourcesConversionTable: public ConversionTable { public: SourcesConversionTable(BoardEnum board, unsigned int version, unsigned int variant, unsigned long flags=0) { - bool release21March2013 = IS_RELEASE_21_MARCH_2013(board, version); + bool afterrelease21March2013 = IS_AFTER_RELEASE_21_MARCH_2013(board, version); int val=0; @@ -134,25 +162,35 @@ class SourcesConversionTable: public ConversionTable { addConversion(RawSource(SOURCE_TYPE_NONE), val++); } - for (int i=0; i<4+MAX_POTS(board); i++) + if (IS_TARANIS(board) && version >= 216) { + for (int i=0; i<32; i++) + addConversion(RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i), val++); + for (int i=0; i<7; i++) { + for (int j=0; j<6; j++) { + addConversion(RawSource(SOURCE_TYPE_LUA_INPUT, i*16+j), val++); + } + } + } + + for (int i=0; i<4+MAX_POTS(board, version); i++) addConversion(RawSource(SOURCE_TYPE_STICK, i), val++); for (int i=0; i= 216 && IS_ARM(board)) { + if (i==TELEMETRY_SOURCE_DTE) + val += 5; + if (i==TELEMETRY_SOURCE_POWER_MAX) + val += 5; + } + } } } @@ -245,59 +291,6 @@ class SourcesConversionTable: public ConversionTable { } }; -class TimerModeConversionTable: public ConversionTable { - - public: - TimerModeConversionTable(BoardEnum board, unsigned int version, unsigned long flags=0) - { - int val=0; - - addConversion(TMRMODE_OFF, val++); - addConversion(TMRMODE_ABS, val++); - addConversion(TMRMODE_THs, val++); - addConversion(TMRMODE_THp, val++); - addConversion(TMRMODE_THt, val++); - - int swCount = MAX_SWITCHES_POSITION(board) + MAX_CUSTOM_SWITCHES(board, version); - - for (int i=0; i > { - public: - TimerModeField(TimerMode & mode, BoardEnum board, unsigned int version, unsigned long flags=0): - ConversionField< SignedField<8> >(_mode, &conversionTable, "TimerMode"), - conversionTable(board, version, flags), - mode(mode), - _mode(0) - { - } - - virtual void beforeExport() - { - _mode = mode; - ConversionField< SignedField<8> >::beforeExport(); - } - - virtual void afterImport() - { - ConversionField< SignedField<8> >::afterImport(); - mode = (TimerMode)_mode; - } - - protected: - TimerModeConversionTable conversionTable; - TimerMode & mode; - int _mode; -}; - template class SwitchField: public ConversionField< SignedField > { public: @@ -325,6 +318,103 @@ class SwitchField: public ConversionField< SignedField > { int _switch; }; +class TelemetrySourcesConversionTable: public ConversionTable { + + public: + TelemetrySourcesConversionTable(BoardEnum board, unsigned int version) + { + int val = 0; + + if (IS_AFTER_RELEASE_21_MARCH_2013(board, version)) { + addConversion(0, val++); + } + + addConversion(1+TELEMETRY_SOURCE_TX_BATT, val++); + addConversion(1+TELEMETRY_SOURCE_TIMER1, val++); + addConversion(1+TELEMETRY_SOURCE_TIMER2, val++); + if (IS_ARM(board) && version >= 216) + addConversion(1+TELEMETRY_SOURCE_SWR, val++); + addConversion(1+TELEMETRY_SOURCE_RSSI_TX, val++); + addConversion(1+TELEMETRY_SOURCE_RSSI_RX, val++); + if (IS_ARM(board) && version >= 216) + addConversion(1+TELEMETRY_SOURCE_RX_BATT, val++); + addConversion(1+TELEMETRY_SOURCE_A1, val++); + addConversion(1+TELEMETRY_SOURCE_A2, val++); + if (IS_ARM(board) && version >= 216) { + addConversion(1+TELEMETRY_SOURCE_A3, val++); + addConversion(1+TELEMETRY_SOURCE_A4, val++); + } + addConversion(1+TELEMETRY_SOURCE_ALT, val++); + addConversion(1+TELEMETRY_SOURCE_RPM, val++); + addConversion(1+TELEMETRY_SOURCE_FUEL, val++); + addConversion(1+TELEMETRY_SOURCE_T1, val++); + addConversion(1+TELEMETRY_SOURCE_T2, val++); + addConversion(1+TELEMETRY_SOURCE_SPEED, val++); + addConversion(1+TELEMETRY_SOURCE_DIST, val++); + addConversion(1+TELEMETRY_SOURCE_GPS_ALT, val++); + addConversion(1+TELEMETRY_SOURCE_CELL, val++); + addConversion(1+TELEMETRY_SOURCE_CELLS_SUM, val++); + addConversion(1+TELEMETRY_SOURCE_VFAS, val++); + addConversion(1+TELEMETRY_SOURCE_CURRENT, val++); + addConversion(1+TELEMETRY_SOURCE_CONSUMPTION, val++); + addConversion(1+TELEMETRY_SOURCE_POWER, val++); + addConversion(1+TELEMETRY_SOURCE_ACCX, val++); + addConversion(1+TELEMETRY_SOURCE_ACCY, val++); + addConversion(1+TELEMETRY_SOURCE_ACCZ, val++); + addConversion(1+TELEMETRY_SOURCE_HDG, val++); + addConversion(1+TELEMETRY_SOURCE_VERTICAL_SPEED, val++); + if (version >= 216) { + addConversion(1+TELEMETRY_SOURCE_ASPD, val++); + addConversion(1+TELEMETRY_SOURCE_DTE, val++); + } + if (IS_ARM(board) && version >= 216) { + for (int i=0; i<5; i++) + addConversion(1+TELEMETRY_SOURCE_RESERVE, val++); + } + addConversion(1+TELEMETRY_SOURCE_A1_MIN, val++); + addConversion(1+TELEMETRY_SOURCE_A2_MIN, val++); + if (IS_ARM(board) && version >= 216) { + addConversion(1+TELEMETRY_SOURCE_A3_MIN, val++); + addConversion(1+TELEMETRY_SOURCE_A4_MIN, val++); + } + addConversion(1+TELEMETRY_SOURCE_ALT_MIN, val++); + addConversion(1+TELEMETRY_SOURCE_ALT_MAX, val++); + addConversion(1+TELEMETRY_SOURCE_RPM_MAX, val++); + addConversion(1+TELEMETRY_SOURCE_T1_MAX, val++); + addConversion(1+TELEMETRY_SOURCE_T2_MAX, val++); + addConversion(1+TELEMETRY_SOURCE_SPEED_MAX, val++); + addConversion(1+TELEMETRY_SOURCE_DIST_MAX, val++); + addConversion(1+TELEMETRY_SOURCE_CELL_MIN, val++); + addConversion(1+TELEMETRY_SOURCE_VFAS_MIN, val++); + addConversion(1+TELEMETRY_SOURCE_POWER_MAX, val++); + if (IS_ARM(board) && version >= 216) { + for (int i=0; i<5; i++) + addConversion(1+TELEMETRY_SOURCE_RESERVE, val++); + } + addConversion(1+TELEMETRY_SOURCE_ACC, val++); + addConversion(1+TELEMETRY_SOURCE_GPS_TIME, val++); + } +}; + +template +class TelemetrySourceField: public ConversionField< UnsignedField > { + public: + TelemetrySourceField(unsigned int & source, BoardEnum board, unsigned int version): + ConversionField< UnsignedField >(source, &conversionTable, "Telemetry source"), + conversionTable(board, version), + source(source), + board(board), + version(version) + { + } + + protected: + TelemetrySourcesConversionTable conversionTable; + unsigned int & source; + BoardEnum board; + unsigned int version; +}; + template class SourceField: public ConversionField< UnsignedField > { public: @@ -352,6 +442,36 @@ class SourceField: public ConversionField< UnsignedField > { unsigned int _source; }; +class CurveReferenceField: public TransformedField { + public: + CurveReferenceField(CurveReference & curve, BoardEnum board, unsigned int version): + TransformedField(internalField), + curve(curve), + _curve_type(0) + { + internalField.Append(new UnsignedField<8>(_curve_type)); + internalField.Append(new SignedField<8>(curve.value)); + } + + virtual void beforeExport() + { + if (curve.value != 0) + _curve_type = (unsigned int)curve.type; + else + _curve_type = 0; + } + + virtual void afterImport() + { + curve.type = (CurveReference::CurveRefType)_curve_type; + } + + protected: + StructField internalField; + CurveReference & curve; + unsigned int _curve_type; +}; + class HeliField: public StructField { public: HeliField(SwashRingData & heli, BoardEnum board, unsigned int version, unsigned int variant) @@ -384,6 +504,12 @@ class PhaseField: public TransformedField { for (int i=0; i(trimExt[i])); } + else if (board == BOARD_TARANIS && version >= 216) { + for (int i=0; i(phase.trim[i])); + internalField.Append(new UnsignedField<5>(trimMode[i])); + } + } else { for (int i=0; i(trimBase[i])); @@ -409,7 +535,7 @@ class PhaseField: public TransformedField { } if (board != BOARD_STOCK && (board != BOARD_M128 || version < 215)) { - for (int i=0; i(phase.gvars[i])); } } @@ -418,19 +544,27 @@ class PhaseField: public TransformedField { virtual void beforeExport() { for (int i=0; i= 0) { - trim = 501 + phase.trimRef[i] - (phase.trimRef[i] >= index ? 1 : 0); + if (board == BOARD_TARANIS && version >= 216) { + if (phase.trimMode[i] < 0) + trimMode[i] = TRIM_MODE_NONE; + else + trimMode[i] = 2*phase.trimRef[i] + phase.trimMode[i]; } else { - trim = std::max(-500, std::min(500, phase.trim[i])); - } - if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) { - trimBase[i] = trim >> 2; - trimExt[i] = (trim & 0x03); - } - else { - trimBase[i] = trim; + int trim; + if (phase.trimMode[i] < 0) + trim = 0; + else if (phase.trimRef[i] != index) + trim = 501 + phase.trimRef[i] - (phase.trimRef[i] > index ? 1 : 0); + else + trim = std::max(-500, std::min(500, phase.trim[i])); + if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) { + trimBase[i] = trim >> 2; + trimExt[i] = (trim & 0x03); + } + else { + trimBase[i] = trim; + } } } } @@ -438,21 +572,31 @@ class PhaseField: public TransformedField { virtual void afterImport() { for (int i=0; i= 215)) - trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03); - else - trim = trimBase[i]; - if (trim > 500) { - phase.trimRef[i] = trim - 501; - if (phase.trimRef[i] >= index) - phase.trimRef[i] += 1; - phase.trim[i] = 0; + if (board == BOARD_TARANIS && version >= 216) { + if (trimMode[i] == TRIM_MODE_NONE) { + phase.trimMode[i] = -1; + } + else { + phase.trimMode[i] = trimMode[i] % 2; + phase.trimRef[i] = trimMode[i] / 2; + } } else { - phase.trim[i] = trim; + int trim; + if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) + trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03); + else + trim = trimBase[i]; + if (trim > 500) { + phase.trimRef[i] = trim - 501; + if (phase.trimRef[i] >= index) + phase.trimRef[i] += 1; + phase.trim[i] = 0; + } + else { + phase.trim[i] = trim; + } } - } } @@ -465,6 +609,7 @@ class PhaseField: public TransformedField { int rotencCount; int trimBase[NUM_STICKS]; int trimExt[NUM_STICKS]; + unsigned int trimMode[NUM_STICKS]; }; @@ -588,14 +733,33 @@ void importGvarParam(int & gvar, const int _gvar) class MixField: public TransformedField { public: - MixField(MixData & mix, BoardEnum board, unsigned int version): + MixField(MixData & mix, BoardEnum board, unsigned int version, ModelData * model): TransformedField(internalField), internalField("Mix"), mix(mix), board(board), - version(version) + version(version), + model(model) { - if (IS_ARM(board)) { + if (IS_TARANIS(board) && version >= 216) { + internalField.Append(new UnsignedField<8>(_destCh)); + internalField.Append(new UnsignedField<16>(mix.phases)); + internalField.Append(new UnsignedField<8>((unsigned int &)mix.mltpx)); + internalField.Append(new SignedField<16>(_weight)); + internalField.Append(new SwitchField<8>(mix.swtch, board, version)); + internalField.Append(new CurveReferenceField(mix.curve, board, version)); + internalField.Append(new UnsignedField<4>(mix.mixWarn)); + internalField.Append(new UnsignedField<4>(mix.srcVariant)); + internalField.Append(new UnsignedField<8>(mix.delayUp)); + internalField.Append(new UnsignedField<8>(mix.delayDown)); + internalField.Append(new UnsignedField<8>(mix.speedUp)); + internalField.Append(new UnsignedField<8>(mix.speedDown)); + internalField.Append(new SourceField<8>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new SignedField<16>(_offset)); + internalField.Append(new ZCharField<8>(mix.name)); + internalField.Append(new SpareBitsField<8>()); + } + else if (IS_ARM(board)) { internalField.Append(new UnsignedField<8>(_destCh)); internalField.Append(new UnsignedField<16>(mix.phases)); internalField.Append(new BoolField<1>(_curveMode)); @@ -633,7 +797,7 @@ class MixField: public TransformedField { internalField.Append(new ZCharField<6>(mix.name)); } } - else if (IS_DBLRAM(board, version) && IS_RELEASE_23_MARCH_2013(board, version)) { + else if (IS_DBLRAM(board, version) && IS_AFTER_RELEASE_23_MARCH_2013(board, version)) { internalField.Append(new UnsignedField<4>(_destCh)); internalField.Append(new BoolField<1>(_curveMode)); internalField.Append(new BoolField<1>(mix.noExpo)); @@ -680,8 +844,18 @@ class MixField: public TransformedField { { if (mix.destCh && mix.srcRaw.type != SOURCE_TYPE_NONE) { _destCh = mix.destCh - 1; - _curveMode = mix.curve; - _curveParam = (mix.curve ? mix.curve : smallGvarToEEPROM(mix.differential)); + if (mix.curve.type == CurveReference::CURVE_REF_CUSTOM) { + _curveMode = true; + _curveParam = 6 + mix.curve.value; + } + else if (mix.curve.type == CurveReference::CURVE_REF_FUNC) { + _curveMode = true; + _curveParam = mix.curve.value; + } + else if (mix.curve.type == CurveReference::CURVE_REF_DIFF) { + _curveMode = 0; + _curveParam = smallGvarToEEPROM(mix.curve.value); + } } else { mix.clear(); @@ -705,14 +879,24 @@ class MixField: public TransformedField { virtual void afterImport() { + if (IS_TARANIS(board) || version < 216) { + if (mix.srcRaw.type == SOURCE_TYPE_STICK && mix.srcRaw.index < NUM_STICKS) { + if (!mix.noExpo) { + mix.srcRaw = RawSource(SOURCE_TYPE_VIRTUAL_INPUT, mix.srcRaw.index, model); + } + } + } + if (mix.srcRaw.type != SOURCE_TYPE_NONE) { mix.destCh = _destCh + 1; - mix.curve = 0; - mix.differential = 0; - if (_curveMode) - mix.curve = _curveParam; - else - mix.differential = smallGvarToC9x(_curveParam); + if (!IS_ARM(board) || version < 216) { + if (!_curveMode) + mix.curve = CurveReference(CurveReference::CURVE_REF_DIFF, smallGvarToC9x(_curveParam)); + else if (_curveParam > 6) + mix.curve = CurveReference(CurveReference::CURVE_REF_CUSTOM, _curveParam-6); + else + mix.curve = CurveReference(CurveReference::CURVE_REF_FUNC, _curveParam); + } } if (IS_ARM(board)) { @@ -733,6 +917,7 @@ class MixField: public TransformedField { MixData & mix; BoardEnum board; unsigned int version; + ModelData * model; unsigned int _destCh; bool _curveMode; int _curveParam; @@ -742,20 +927,34 @@ class MixField: public TransformedField { unsigned int _offsetMode; }; -class ExpoField: public TransformedField { +class InputField: public TransformedField { public: - ExpoField(ExpoData & expo, BoardEnum board, unsigned int version): + InputField(ExpoData & expo, BoardEnum board, unsigned int version): TransformedField(internalField), - internalField("Expo"), + internalField("Input"), expo(expo), - board(board) + board(board), + version(version) { - if (IS_ARM(board)) { - internalField.Append(new UnsignedField<8>(expo.mode)); - internalField.Append(new UnsignedField<8>(expo.chn)); + if (IS_TARANIS(board) && version >= 216) { + internalField.Append(new SourceField<8>(expo.srcRaw, board, version, 0)); + internalField.Append(new UnsignedField<16>(expo.scale)); + internalField.Append(new UnsignedField<8>(expo.chn, "Channel")); internalField.Append(new SwitchField<8>(expo.swtch, board, version)); internalField.Append(new UnsignedField<16>(expo.phases)); - internalField.Append(new SignedField<8>(_weight)); + internalField.Append(new SignedField<8>(_weight, "Weight")); + internalField.Append(new SignedField<8>(expo.carryTrim)); + internalField.Append(new ZCharField<8>(expo.name)); + internalField.Append(new SignedField<8>(expo.offset, "Offset")); + internalField.Append(new CurveReferenceField(expo.curve, board, version)); + internalField.Append(new SpareBitsField<8>()); + } + else if (IS_ARM(board)) { + internalField.Append(new UnsignedField<8>(expo.mode, "Mode")); + internalField.Append(new UnsignedField<8>(expo.chn, "Channel")); + internalField.Append(new SwitchField<8>(expo.swtch, board, version)); + internalField.Append(new UnsignedField<16>(expo.phases, "Phases")); + internalField.Append(new SignedField<8>(_weight, "Weight")); internalField.Append(new BoolField<8>(_curveMode)); if (HAS_LARGE_LCD(board)) { internalField.Append(new ZCharField<8>(expo.name)); @@ -766,7 +965,7 @@ class ExpoField: public TransformedField { } internalField.Append(new SignedField<8>(_curveParam)); } - else if (IS_DBLRAM(board, version) && IS_RELEASE_23_MARCH_2013(board, version)) { + else if (IS_DBLRAM(board, version) && IS_AFTER_RELEASE_23_MARCH_2013(board, version)) { internalField.Append(new UnsignedField<2>(expo.mode)); internalField.Append(new UnsignedField<2>(expo.chn)); internalField.Append(new BoolField<1>(_curveMode)); @@ -789,22 +988,49 @@ class ExpoField: public TransformedField { virtual void beforeExport() { - _curveMode = (expo.curveMode && expo.curveParam); _weight = smallGvarToEEPROM(expo.weight); - _curveParam = smallGvarToEEPROM(expo.curveParam); + + if (!IS_TARANIS(board) || version < 216) { + if (expo.curve.type==CurveReference::CURVE_REF_FUNC && expo.curve.value) { + _curveMode = true; + _curveParam = expo.curve.value; + } + else if (expo.curve.type==CurveReference::CURVE_REF_CUSTOM && expo.curve.value) { + _curveMode = true; + _curveParam = expo.curve.value+6; + } + else { + _curveMode = false; + _curveParam = smallGvarToEEPROM(expo.curve.value); + } + } } virtual void afterImport() { - expo.curveMode = _curveMode; - expo.weight = smallGvarToC9x(_weight); - expo.curveParam = smallGvarToC9x(_curveParam); + if (IS_TARANIS(board) && version < 216) { + if (expo.mode) { + expo.srcRaw = RawSource(SOURCE_TYPE_STICK, expo.chn); + } + } + + expo.weight = smallGvarToC9x(_weight); + + if (!IS_TARANIS(board) || version < 216) { + if (!_curveMode) + expo.curve = CurveReference(CurveReference::CURVE_REF_EXPO, smallGvarToC9x(_curveParam)); + else if (_curveParam > 6) + expo.curve = CurveReference(CurveReference::CURVE_REF_CUSTOM, _curveParam-6); + else + expo.curve = CurveReference(CurveReference::CURVE_REF_FUNC, _curveParam); + } } protected: StructField internalField; ExpoData & expo; BoardEnum board; + unsigned int version; bool _curveMode; int _weight; int _curveParam; @@ -812,36 +1038,56 @@ class ExpoField: public TransformedField { class LimitField: public StructField { public: - LimitField(LimitData & limit, BoardEnum board): + LimitField(LimitData & limit, BoardEnum board, unsigned int version): StructField("Limit") { - Append(new ConversionField< SignedField<8> >(limit.min, +100)); - Append(new ConversionField< SignedField<8> >(limit.max, -100)); + if (IS_ARM(board) && version >= 216) { + Append(new ConversionField< SignedField<16> >(limit.min, +1000)); + Append(new ConversionField< SignedField<16> >(limit.max, -1000)); + } + else { + Append(new ConversionField< SignedField<8> >(limit.min, +100, 10)); + Append(new ConversionField< SignedField<8> >(limit.max, -100, 10)); + } Append(new SignedField<8>(limit.ppmCenter)); Append(new SignedField<14>(limit.offset)); Append(new BoolField<1>(limit.symetrical)); Append(new BoolField<1>(limit.revert)); - if (HAS_LARGE_LCD(board)) + if (HAS_LARGE_LCD(board)) { Append(new ZCharField<6>(limit.name)); + } + if (IS_TARANIS(board) && version >= 216) { + Append(new SignedField<8>(limit.curve.value)); + } } }; class CurvesField: public TransformedField { public: - CurvesField(CurveData * curves, BoardEnum board): + CurvesField(CurveData * curves, BoardEnum board, unsigned int version): TransformedField(internalField), internalField("Curves"), curves(curves), board(board), - maxCurves(MAX_CURVES(board)), + version(version), + maxCurves(MAX_CURVES(board, version)), maxPoints(IS_ARM(board) ? O9X_ARM_NUM_POINTS : O9X_NUM_POINTS) { for (int i=0; i= 216) { + internalField.Append(new UnsignedField<3>((unsigned int &)curves[i].type)); + internalField.Append(new BoolField<1>(curves[i].smooth)); + internalField.Append(new SpareBitsField<4>()); + internalField.Append(new ConversionField< SignedField<8> >(curves[i].count, -5)); + } + else if (IS_ARM(board)) { internalField.Append(new SignedField<16>(_curves[i])); - else + } + else { internalField.Append(new SignedField<8>(_curves[i])); + } } + for (int i=0; i(_points[i])); } @@ -853,46 +1099,66 @@ class CurvesField: public TransformedField { int * cur = &_points[0]; int offset = 0; + for (int i=0; icustom ? curve->count * 2 - 2 : curve->count) - 5; - if (offset > maxPoints - 5 * maxCurves) { - EEPROMWarnings += ::QObject::tr("openTx only accepts %1 points in all curves").arg(maxPoints) + "\n"; + int size = (curve->type == CurveData::CURVE_TYPE_CUSTOM ? curve->count * 2 - 2 : curve->count); + if (offset+size > maxPoints) { + EEPROMWarnings += ::QObject::tr("OpenTX only accepts %1 points in all curves").arg(maxPoints) + "\n"; break; } - _curves[i] = offset; + if (!IS_TARANIS(board) || version < 216) { + _curves[i] = offset - (5*i); + } for (int j=0; jcount; j++) { *cur++ = curve->points[j].y; } - if (curve->custom) { + if (curve->type == CurveData::CURVE_TYPE_CUSTOM) { for (int j=1; jcount-1; j++) { *cur++ = curve->points[j].x; } } + offset += size; } } virtual void afterImport() { + int * cur = &_points[0]; + for (int i=0; icount = (size / 2) + 1; - curve->custom = true; + if (!IS_TARANIS(board) || version < 216) { + int * next = &_points[5*(i+1) + _curves[i]]; + int size = next - cur; + if (size % 2 == 0) { + curve->count = (size / 2) + 1; + curve->type = CurveData::CURVE_TYPE_CUSTOM; + } + else { + curve->count = size; + curve->type = CurveData::CURVE_TYPE_STANDARD; + } } - else { - curve->count = size; - curve->custom = false; + + if (curve->count > 17) { + qDebug() << "Wrong points count" << curve->count; + curve->count = 0; + for (int j=0; jclear(5); + } + return; } - for (int j=0; jcount; j++) - curve->points[j].y = cur[j]; - if (curve->custom) { + + for (int j=0; jcount; j++) { + curve->points[j].y = *cur++; + } + + if (curve->type == CurveData::CURVE_TYPE_CUSTOM) { curve->points[0].x = -100; for (int j=1; jcount-1; j++) - curve->points[j].x = cur[curve->count+j-1]; + curve->points[j].x = *cur++; curve->points[curve->count-1].x = +100; } else { @@ -906,48 +1172,55 @@ class CurvesField: public TransformedField { StructField internalField; CurveData *curves; BoardEnum board; + unsigned int version; int maxCurves; int maxPoints; - int _curves[O9X_ARM_MAX_CURVES]; - int _points[O9X_ARM_NUM_POINTS]; + int _curves[C9X_MAX_CURVES]; + int _points[C9X_MAX_CURVES*C9X_MAX_POINTS*2]; }; -class CustomSwitchesFunctionsTable: public ConversionTable { +class LogicalSwitchesFunctionsTable: public ConversionTable { public: - CustomSwitchesFunctionsTable(BoardEnum board, unsigned int version) + LogicalSwitchesFunctionsTable(BoardEnum board, unsigned int version) { int val=0; - bool release21March2013 = IS_RELEASE_21_MARCH_2013(board, version); - addConversion(CS_FN_OFF, val++); - if (release21March2013) - addConversion(CS_FN_VEQUAL, val++); - addConversion(CS_FN_VPOS, val++); - addConversion(CS_FN_VNEG, val++); - addConversion(CS_FN_APOS, val++); - addConversion(CS_FN_ANEG, val++); - addConversion(CS_FN_AND, val++); - addConversion(CS_FN_OR, val++); - addConversion(CS_FN_XOR, val++); - addConversion(CS_FN_EQUAL, val++); - if (!release21March2013) - addConversion(CS_FN_NEQUAL, val++); - addConversion(CS_FN_GREATER, val++); - addConversion(CS_FN_LESS, val++); - if (!release21March2013) { - addConversion(CS_FN_EGREATER, val++); - addConversion(CS_FN_ELESS, val++); + bool afterrelease21March2013 = IS_AFTER_RELEASE_21_MARCH_2013(board, version); + addConversion(LS_FN_OFF, val++); + if (IS_ARM(board) && version >= 216) + addConversion(LS_FN_VEQUAL, val++); + if (afterrelease21March2013) + addConversion(LS_FN_VALMOSTEQUAL, val++); + addConversion(LS_FN_VPOS, val++); + addConversion(LS_FN_VNEG, val++); + if (IS_ARM(board) && version >= 216) val++; // later RANGE + addConversion(LS_FN_APOS, val++); + addConversion(LS_FN_ANEG, val++); + addConversion(LS_FN_AND, val++); + addConversion(LS_FN_OR, val++); + addConversion(LS_FN_XOR, val++); + if (IS_ARM(board) && version >= 216) addConversion(LS_FN_STAY, val++); + addConversion(LS_FN_EQUAL, val++); + if (!afterrelease21March2013) + addConversion(LS_FN_NEQUAL, val++); + addConversion(LS_FN_GREATER, val++); + addConversion(LS_FN_LESS, val++); + if (!afterrelease21March2013) { + addConversion(LS_FN_EGREATER, val++); + addConversion(LS_FN_ELESS, val++); } - addConversion(CS_FN_DPOS, val++); - addConversion(CS_FN_DAPOS, val++); - addConversion(CS_FN_TIM, val++); + addConversion(LS_FN_DPOS, val++); + addConversion(LS_FN_DAPOS, val++); + addConversion(LS_FN_TIMER, val++); + if (version >= 216) + addConversion(LS_FN_STICKY, val++); } }; -class CustomSwitchesAndSwitchesConversionTable: public ConversionTable { +class AndSwitchesConversionTable: public ConversionTable { public: - CustomSwitchesAndSwitchesConversionTable(BoardEnum board, unsigned int version) + AndSwitchesConversionTable(BoardEnum board, unsigned int version) { int val=0; addConversion(RawSwitch(SWITCH_TYPE_NONE), val++); @@ -985,6 +1258,29 @@ class CustomSwitchesAndSwitchesConversionTable: public ConversionTable { } } + static ConversionTable * getInstance(BoardEnum board, unsigned int version) + { + if (IS_ARM(board) && version >= 216) + return new SwitchesConversionTable(board, version); + else + return new AndSwitchesConversionTable(board, version); + +#if 0 + static std::list internalCache; + + for (std::list::iterator it=internalCache.begin(); it!=internalCache.end(); it++) { + Cache element = *it; + if (element.board == board && element.version == version && element.flags == flags) + return element.table; + } + + Cache element(board, version, flags, new SwitchesConversionTable(board, version, flags)); + internalCache.push_back(element); + return element.table; +#endif + } + + protected: void addConversion(const RawSwitch & sw, const int b) @@ -993,21 +1289,30 @@ class CustomSwitchesAndSwitchesConversionTable: public ConversionTable { } }; -class CustomSwitchField: public TransformedField { +class LogicalSwitchField: public TransformedField { public: - CustomSwitchField(CustomSwData & csw, BoardEnum board, unsigned int version, unsigned int variant): + LogicalSwitchField(LogicalSwitchData & csw, BoardEnum board, unsigned int version, unsigned int variant, ModelData * model=NULL): TransformedField(internalField), - internalField("CustomSwitch"), + internalField("LogicalSwitch"), csw(csw), board(board), version(version), variant(variant), + model(model), functionsConversionTable(board, version), sourcesConversionTable(SourcesConversionTable::getInstance(board, version, variant, (version >= 214 || (!IS_ARM(board) && version >= 213)) ? 0 : FLAG_NOSWITCHES)), switchesConversionTable(SwitchesConversionTable::getInstance(board, version)), - andswitchesConversionTable(board, version) + andswitchesConversionTable(AndSwitchesConversionTable::getInstance(board, version)), + v1(0), + v2(0), + v3(0) { - if (IS_ARM(board) && version >= 215) { + if (IS_ARM(board) && version >= 216) { + internalField.Append(new SignedField<8>(v1)); + internalField.Append(new SignedField<16>(v2)); + internalField.Append(new SignedField<16>(v3)); + } + else if (IS_ARM(board) && version >= 215) { internalField.Append(new SignedField<16>(v1)); internalField.Append(new SignedField<16>(v2)); } @@ -1018,16 +1323,17 @@ class CustomSwitchField: public TransformedField { if (IS_ARM(board)) { internalField.Append(new ConversionField< UnsignedField<8> >(csw.func, &functionsConversionTable, "Function")); - internalField.Append(new UnsignedField<8>(csw.delay)); - internalField.Append(new UnsignedField<8>(csw.duration)); + int scale = (version >= 216 ? 0 : 5); + internalField.Append(new ConversionField< UnsignedField<8> >(csw.delay, 0, scale)); + internalField.Append(new ConversionField< UnsignedField<8> >(csw.duration, 0, scale)); if (version >= 214) { - internalField.Append(new ConversionField< SignedField<8> >((int &)csw.andsw, &andswitchesConversionTable, "AND switch")); + internalField.Append(new ConversionField< SignedField<8> >((int &)csw.andsw, andswitchesConversionTable, "AND switch")); } } else { if (version >= 213) { internalField.Append(new ConversionField< UnsignedField<4> >(csw.func, &functionsConversionTable, "Function")); - internalField.Append(new ConversionField< UnsignedField<4> >(csw.andsw, &andswitchesConversionTable, "AND switch")); + internalField.Append(new ConversionField< UnsignedField<4> >((unsigned int &)csw.andsw, andswitchesConversionTable, "AND switch")); } else { internalField.Append(new ConversionField< UnsignedField<8> >(csw.func, &functionsConversionTable, "Function")); @@ -1037,54 +1343,111 @@ class CustomSwitchField: public TransformedField { virtual void beforeExport() { - v1 = csw.val1; - v2 = csw.val2; - - if ((csw.func >= CS_FN_VPOS && csw.func <= CS_FN_ANEG) || (csw.func >= CS_FN_EQUAL && csw.func!=CS_FN_TIM)) { - sourcesConversionTable->exportValue(csw.val1, v1); + if (csw.func == LS_FN_TIMER) { + v1 = csw.val1; + v2 = csw.val2; } - - if (csw.func >= CS_FN_EQUAL && csw.func <= CS_FN_ELESS) { - sourcesConversionTable->exportValue(csw.val2, v2); + else if (csw.func == LS_FN_STAY) { + switchesConversionTable->exportValue(csw.val1, v1); + v2 = csw.val2; + v3 = csw.val3; } - - if (csw.func >= CS_FN_AND && csw.func <= CS_FN_XOR) { + else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY) { switchesConversionTable->exportValue(csw.val1, v1); switchesConversionTable->exportValue(csw.val2, v2); } + else if (csw.func >= LS_FN_EQUAL && csw.func <= LS_FN_ELESS) { + sourcesConversionTable->exportValue(csw.val1, v1); + sourcesConversionTable->exportValue(csw.val2, v2); + } + else if (csw.func != LS_FN_OFF) { + sourcesConversionTable->exportValue(csw.val1, v1); + v2 = csw.val2; + } } virtual void afterImport() { - csw.val1 = v1; - csw.val2 = v2; - - if ((csw.func >= CS_FN_VPOS && csw.func <= CS_FN_ANEG) || (csw.func >= CS_FN_EQUAL && csw.func!=CS_FN_TIM)) { - sourcesConversionTable->importValue(v1, csw.val1); + if (csw.func == LS_FN_TIMER) { + csw.val1 = v1; + csw.val2 = v2; } - - if (csw.func >= CS_FN_EQUAL && csw.func <= CS_FN_ELESS) { - sourcesConversionTable->importValue(v2, csw.val2); + else if (csw.func == LS_FN_STAY) { + switchesConversionTable->importValue(v1, csw.val1); + csw.val2 = v2; + csw.val3 = v3; } - - if (csw.func >= CS_FN_AND && csw.func <= CS_FN_XOR) { + else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY) { switchesConversionTable->importValue(v1, csw.val1); switchesConversionTable->importValue(v2, csw.val2); } + else if (csw.func >= LS_FN_EQUAL && csw.func <= LS_FN_ELESS) { + sourcesConversionTable->importValue((uint8_t)v1, csw.val1); + sourcesConversionTable->importValue((uint8_t)v2, csw.val2); + } + else if (csw.func != LS_FN_OFF) { + sourcesConversionTable->importValue((uint8_t)v1, csw.val1); + csw.val2 = v2; + RawSource val1(csw.val1, model); + if (IS_ARM(board) && version < 216 && val1.type == SOURCE_TYPE_TELEMETRY) { + switch (val1.index) { + case TELEMETRY_SOURCE_TIMER1: + case TELEMETRY_SOURCE_TIMER2: + csw.val2 = (csw.val2 + 128) * 3; + break; + case TELEMETRY_SOURCE_ALT: + case TELEMETRY_SOURCE_GPS_ALT: + case TELEMETRY_SOURCE_ALT_MIN: + case TELEMETRY_SOURCE_ALT_MAX: + csw.val2 = (csw.val2 + 128) * 8 - 500; + break; + case TELEMETRY_SOURCE_RPM: + case TELEMETRY_SOURCE_RPM_MAX: + csw.val2 = (csw.val2 + 128) * 50; + break; + case TELEMETRY_SOURCE_T1: + case TELEMETRY_SOURCE_T2: + case TELEMETRY_SOURCE_T1_MAX: + case TELEMETRY_SOURCE_T2_MAX: + csw.val2 = (csw.val2 + 128) + 30; + break; + case TELEMETRY_SOURCE_CELL: + case TELEMETRY_SOURCE_HDG: + csw.val2 = (csw.val2 + 128) * 2; + break; + case TELEMETRY_SOURCE_DIST: + case TELEMETRY_SOURCE_DIST_MAX: + csw.val2 = (csw.val2 + 128) * 8; + break; + case TELEMETRY_SOURCE_CURRENT: + case TELEMETRY_SOURCE_POWER: + csw.val2 = (csw.val2 + 128) * 5; + break; + case TELEMETRY_SOURCE_CONSUMPTION: + csw.val2 = (csw.val2 + 128) * 20; + break; + default: + csw.val2 += 128; + break; + } + } + } } protected: StructField internalField; - CustomSwData & csw; + LogicalSwitchData & csw; BoardEnum board; unsigned int version; unsigned int variant; - CustomSwitchesFunctionsTable functionsConversionTable; + ModelData * model; + LogicalSwitchesFunctionsTable functionsConversionTable; SourcesConversionTable * sourcesConversionTable; SwitchesConversionTable * switchesConversionTable; - CustomSwitchesAndSwitchesConversionTable andswitchesConversionTable; + ConversionTable * andswitchesConversionTable; int v1; int v2; + int v3; }; class CustomFunctionsConversionTable: public ConversionTable { @@ -1094,7 +1457,13 @@ class CustomFunctionsConversionTable: public ConversionTable { { int val=0; - if (IS_ARM(board) || version < 213) { + if (version >= 216) { + for (int i=0; i<32; i++) { + addConversion(i, val); + } + val++; + } + else if (IS_ARM(board) || version < 213) { for (int i=0; i<16; i++) { addConversion(val, val); val++; @@ -1106,32 +1475,81 @@ class CustomFunctionsConversionTable: public ConversionTable { } val+=4; } - addConversion(FuncTrainer, val++); - addConversion(FuncTrainerRUD, val++); - addConversion(FuncTrainerELE, val++); - addConversion(FuncTrainerTHR, val++); - addConversion(FuncTrainerAIL, val++); + + if (version >= 216) { + addConversion(FuncTrainer, val); + addConversion(FuncTrainerRUD, val); + addConversion(FuncTrainerELE, val); + addConversion(FuncTrainerTHR, val); + addConversion(FuncTrainerAIL, val); + val++; + } + else { + addConversion(FuncTrainer, val++); + addConversion(FuncTrainerRUD, val++); + addConversion(FuncTrainerELE, val++); + addConversion(FuncTrainerTHR, val++); + addConversion(FuncTrainerAIL, val++); + } + addConversion(FuncInstantTrim, val++); - addConversion(FuncPlaySound, val++); - if (!IS_TARANIS(board)) + + if (version >= 216) { + addConversion(FuncReset, val++); + if (IS_ARM(board)) { + addConversion(FuncSetTimer1, val); + addConversion(FuncSetTimer2, val); + val++; + } + for (int i=0; i= 213 && !IS_ARM(board)) + addConversion(FuncPlayBoth, val++); + addConversion(FuncPlayValue, val++); + if (IS_ARM(board)) { + addConversion(FuncReserve, val++); + addConversion(FuncReserve, val++); + addConversion(FuncReserve, val++); + addConversion(FuncBackgroundMusic, val++); + addConversion(FuncBackgroundMusicPause, val++); + } + addConversion(FuncVario, val++); addConversion(FuncPlayHaptic, val++); - addConversion(FuncReset, val++); - addConversion(FuncVario, val++); - addConversion(FuncPlayPrompt, val++); - if (version >= 213 && !IS_ARM(board)) - addConversion(FuncPlayBoth, val++); - addConversion(FuncPlayValue, val++); - if (board == BOARD_GRUVIN9X || IS_ARM(board) ) - addConversion(FuncLogs, val++); - if (IS_ARM(board)) - addConversion(FuncVolume, val++); - addConversion(FuncBacklight, val++); - if (IS_ARM(board)) { - addConversion(FuncBackgroundMusic, val++); - addConversion(FuncBackgroundMusicPause, val++); + if (board == BOARD_GRUVIN9X || IS_ARM(board) ) + addConversion(FuncLogs, val++); + addConversion(FuncBacklight, val++); + } + else { + addConversion(FuncPlaySound, val++); + if (!IS_TARANIS(board)) + addConversion(FuncPlayHaptic, val++); + addConversion(FuncReset, val++); + addConversion(FuncVario, val++); + addConversion(FuncPlayPrompt, val++); + if (version >= 213 && !IS_ARM(board)) + addConversion(FuncPlayBoth, val++); + addConversion(FuncPlayValue, val++); + if (board == BOARD_GRUVIN9X || IS_ARM(board) ) + addConversion(FuncLogs, val++); + if (IS_ARM(board)) + addConversion(FuncVolume, val++); + addConversion(FuncBacklight, val++); + if (IS_ARM(board)) { + addConversion(FuncBackgroundMusic, val++); + addConversion(FuncBackgroundMusicPause, val++); + } + for (int i=0; i<5; i++) + addConversion(FuncAdjustGV1+i, val++); } - for (int i=0; i<5; i++) - addConversion(FuncAdjustGV1+i, val++); } }; @@ -1149,20 +1567,17 @@ class SwitchesWarningField: public TransformedField { virtual void beforeExport() { - bool release21March2013 = IS_RELEASE_21_MARCH_2013(board, version); - if (release21March2013) { - _sw = (sw & 0xC1) + ((sw & 0x30) >> 3) + ((sw & 0x0E) << 2); - } - else { _sw = sw; - } } virtual void afterImport() { - bool release21March2013 = IS_RELEASE_21_MARCH_2013(board, version); - if (release21March2013) { - sw = (_sw & 0xC1) + ((_sw & 0x38) >> 2) + ((_sw & 0x06) << 3); + bool afterrelease21March2013 = IS_AFTER_RELEASE_21_MARCH_2013(board, version); + if (afterrelease21March2013 && version < 216) { + sw = _sw >> 1; + } + else if (!afterrelease21March2013) { + sw = ((_sw & 0x30) >> 4) + ((_sw & 0x0E) << 1) + ((_sw & 0xC0) >> 1); } else { sw = _sw; @@ -1177,9 +1592,9 @@ class SwitchesWarningField: public TransformedField { unsigned int version; }; -class CustomFunctionField: public TransformedField { +class ArmCustomFunctionField: public TransformedField { public: - CustomFunctionField(FuncSwData & fn, BoardEnum board, unsigned int version, unsigned int variant): + ArmCustomFunctionField(FuncSwData & fn, BoardEnum board, unsigned int version, unsigned int variant): TransformedField(internalField), internalField("CustomFunction"), fn(fn), @@ -1187,201 +1602,336 @@ class CustomFunctionField: public TransformedField { version(version), variant(variant), functionsConversionTable(board, version), - sourcesConversionTable(SourcesConversionTable::getInstance(board, version, variant, FLAG_NONONE)), - _param(0), - _delay(0), - _union_param(0) + sourcesConversionTable(SourcesConversionTable::getInstance(board, version, variant, version >= 216 ? 0 : FLAG_NONONE)), + _active(0) { - memset(_arm_param, 0, sizeof(_arm_param)); + memset(_param, 0, sizeof(_param)); internalField.Append(new SwitchField<8>(fn.swtch, board, version)); - if (IS_ARM(board)) { - internalField.Append(new ConversionField< UnsignedField<8> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); - if (IS_TARANIS(board)) - internalField.Append(new CharField<10>(_arm_param)); - else - internalField.Append(new CharField<6>(_arm_param)); - if (version >= 214) { - internalField.Append(new UnsignedField<2>(_mode)); - internalField.Append(new UnsignedField<6>(_delay)); - } - else { - internalField.Append(new UnsignedField<8>(_delay)); - } - if (version < 214) - internalField.Append(new SpareBitsField<8>()); + internalField.Append(new ConversionField< UnsignedField<8> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + + if (IS_TARANIS(board) && version >= 216) + internalField.Append(new CharField<8>(_param, false)); + else if (IS_TARANIS(board)) + internalField.Append(new CharField<10>(_param, false)); + else + internalField.Append(new CharField<6>(_param, false)); + + if (version >= 216) { + internalField.Append(new UnsignedField<8>(_active)); + } + else if (version >= 214) { + internalField.Append(new UnsignedField<2>(_mode)); + internalField.Append(new UnsignedField<6>(_active)); } else { - if (version >= 213) { - internalField.Append(new UnsignedField<3>(_union_param)); - internalField.Append(new ConversionField< UnsignedField<5> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); - } - else { - internalField.Append(new ConversionField< UnsignedField<7> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); - internalField.Append(new BoolField<1>((bool &)fn.enabled)); - } - internalField.Append(new UnsignedField<8>(_param)); + internalField.Append(new UnsignedField<8>((unsigned int &)_active)); + internalField.Append(new SpareBitsField<8>()); } } virtual void beforeExport() { - if (IS_ARM(board)) { - _mode = 0; - if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayValue) - _delay = fn.repeatParam / 5; - else - _delay = (fn.enabled ? 1 : 0); - if (fn.func <= FuncInstantTrim) { - *((uint32_t *)_arm_param) = fn.param; - } - else if (fn.func == FuncPlayPrompt || fn.func == FuncBackgroundMusic) { - memcpy(_arm_param, fn.paramarm, sizeof(_arm_param)); - } - else if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGV5) { - unsigned int value; - if (version >= 214) { - _mode = fn.adjustMode; - if (fn.adjustMode == 1) - sourcesConversionTable->exportValue(fn.param, (int &)value); - else if (fn.adjustMode == 2) - value = RawSource(fn.param).index; - else - value = fn.param; - } - else { - unsigned int value; - sourcesConversionTable->exportValue(fn.param, (int &)value); - } - *((uint32_t *)_arm_param) = value; - } - else if (fn.func == FuncPlayValue || fn.func == FuncVolume) { - unsigned int value; - sourcesConversionTable->exportValue(fn.param, (int &)value); - *((uint32_t *)_arm_param) = value; + _mode = 0; + + if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayValue) + _active = (version >= 216 ? fn.repeatParam : (fn.repeatParam/5)); + else + _active = (fn.enabled ? 1 : 0); + + if (fn.func >= FuncSafetyCh1 && fn.func <= FuncSafetyCh32) { + if (version >= 216) { + *((uint16_t *)_param) = fn.param; + *((uint8_t *)(_param+3)) = fn.func - FuncSafetyCh1; } else { - *((uint32_t *)_arm_param) = fn.param; + *((uint32_t *)_param) = fn.param; } } + else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerAIL) { + if (version >= 216) + *((uint8_t *)(_param+3)) = fn.func - FuncTrainer; + } + else if (fn.func >= FuncSetTimer1 && fn.func <= FuncSetTimer2) { + if (version >= 216) { + *((uint16_t *)_param) = fn.param; + *((uint8_t *)(_param+3)) = fn.func - FuncSetTimer1; + } + } + else if (fn.func == FuncPlayPrompt || fn.func == FuncBackgroundMusic) { + memcpy(_param, fn.paramarm, sizeof(_param)); + } + else if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGVLast) { + if (version >= 216) { + *((uint8_t *)(_param+2)) = fn.adjustMode; + *((uint8_t *)(_param+3)) = fn.func - FuncAdjustGV1; + unsigned int value; + if (fn.adjustMode == 1) + sourcesConversionTable->exportValue(fn.param, (int &)value); + else if (fn.adjustMode == 2) + value = RawSource(fn.param).index; + else + value = fn.param; + *((uint16_t *)_param) = value; + } + else if (version >= 214) { + unsigned int value; + _mode = fn.adjustMode; + if (fn.adjustMode == 1) + sourcesConversionTable->exportValue(fn.param, (int &)value); + else if (fn.adjustMode == 2) + value = RawSource(fn.param).index; + else + value = fn.param; + *((uint32_t *)_param) = value; + } + else { + unsigned int value; + sourcesConversionTable->exportValue(fn.param, (int &)value); + *((uint32_t *)_param) = value; + } + } + else if (fn.func == FuncPlayValue || fn.func == FuncVolume) { + unsigned int value; + sourcesConversionTable->exportValue(fn.param, (int &)value); + if (version >= 216) + *((uint16_t *)_param) = value; + else + *((uint32_t *)_param) = value; + } else { - /* the default behavior */ - _param = fn.param; - _union_param = (fn.enabled ? 1 : 0); - if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGV5) { - if (version >= 213) { - _union_param += (fn.adjustMode << 1); - if (fn.adjustMode == 1) - sourcesConversionTable->exportValue(fn.param, (int &)_param); - else if (fn.adjustMode == 2) - _param = RawSource(fn.param).index; - } - else { - sourcesConversionTable->exportValue(fn.param, (int &)_param); - } - } - else if (fn.func == FuncPlayValue) { - if (version >= 213) { - _union_param = fn.repeatParam / 10; - sourcesConversionTable->exportValue(fn.param, (int &)_param); - } - else { - SourcesConversionTable::getInstance(board, version, variant, FLAG_NONONE|FLAG_NOSWITCHES)->exportValue(fn.param, (int &)_param); - } - } - else if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayBoth) { - if (version >= 213) - _union_param = fn.repeatParam / 10; - } - else if (fn.func <= FuncSafetyCh16) { - if (version >= 213) - _union_param += ((fn.func % 4) << 1); - } + *((uint32_t *)_param) = fn.param; } } virtual void afterImport() { - if (IS_ARM(board)) { - if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayValue) - fn.repeatParam = _delay * 5; - else - fn.enabled = (_delay & 0x01); + if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayValue) + fn.repeatParam = (version >= 216 ? _active : (_active*5)); + else + fn.enabled = (_active & 0x01); - unsigned int value = *((uint32_t *)_arm_param); - if (fn.func <= FuncTrainer) { - fn.param = (int)value; - } - else if (fn.func <= FuncInstantTrim) { - fn.param = value; - } - else if (fn.func == FuncPlayPrompt || fn.func == FuncBackgroundMusic) { - memcpy(fn.paramarm, _arm_param, sizeof(fn.paramarm)); - } - else if (fn.func == FuncVolume) { - sourcesConversionTable->importValue(value, (int &)fn.param); - } - else if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGV5) { - if (version >= 214) { - fn.adjustMode = _mode; - if (fn.adjustMode == 1) - sourcesConversionTable->importValue(value, (int &)fn.param); - else if (fn.adjustMode == 2) - fn.param = RawSource(SOURCE_TYPE_GVAR, value).toValue(); - else - fn.param = value; - } - else { - sourcesConversionTable->importValue(value, (int &)fn.param); - } - } - else if (fn.func == FuncPlayValue) { - if (version >= 213) - sourcesConversionTable->importValue(value, (int &)fn.param); - else - SourcesConversionTable::getInstance(board, version, variant, FLAG_NONONE|FLAG_NOSWITCHES)->importValue(value, (int &)fn.param); - } - else { - fn.param = value; - } + unsigned int value=0, mode=0, index=0; + if (version >= 216) { + value = *((uint16_t *)_param); + mode = *((uint8_t *)(_param+2)); + index = *((uint8_t *)(_param+3)); } else { - fn.param = _param; - if (version >= 213) { - fn.enabled = (_union_param & 0x01); + value = *((uint32_t *)_param); + } + + if (fn.func >= FuncSafetyCh1 && fn.func <= FuncSafetyCh32) { + fn.func = AssignFunc(fn.func + index); + fn.param = (int)value; + } + else if (fn.func >= FuncSetTimer1 && fn.func <= FuncSetTimer2) { + fn.func = AssignFunc(fn.func + index); + fn.param = (int)value; + } + else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerAIL) { + fn.func = AssignFunc(fn.func + index); + fn.param = value; + } + else if (fn.func == FuncPlayPrompt || fn.func == FuncBackgroundMusic) { + memcpy(fn.paramarm, _param, sizeof(fn.paramarm)); + } + else if (fn.func == FuncVolume) { + sourcesConversionTable->importValue(value, (int &)fn.param); + } + else if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGVLast) { + if (version >= 216) { + fn.func = AssignFunc(fn.func + index); + fn.adjustMode = mode; + if (fn.adjustMode == 1) + sourcesConversionTable->importValue(value, (int &)fn.param); + else if (fn.adjustMode == 2) + fn.param = RawSource(SOURCE_TYPE_GVAR, value).toValue(); + else + fn.param = value; } - if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGV5) { - if (version >= 213) { - fn.adjustMode = ((_union_param >> 1) & 0x03); - if (fn.adjustMode == 1) - sourcesConversionTable->importValue(_param, (int &)fn.param); - else if (fn.adjustMode == 2) - fn.param = RawSource(SOURCE_TYPE_GVAR, _param).toValue(); - } - else { - sourcesConversionTable->importValue(_param, (int &)fn.param); - } + else if (version >= 214) { + fn.adjustMode = _mode; + if (fn.adjustMode == 1) + sourcesConversionTable->importValue(value, (int &)fn.param); + else if (fn.adjustMode == 2) + fn.param = RawSource(SOURCE_TYPE_GVAR, value).toValue(); + else + fn.param = value; } - else if (fn.func == FuncPlayValue) { - if (version >= 213) { - fn.repeatParam = _union_param * 10; - sourcesConversionTable->importValue(_param, (int &)fn.param); - } - else { - SourcesConversionTable::getInstance(board, version, variant, FLAG_NONONE|FLAG_NOSWITCHES)->importValue(_param, (int &)fn.param); - } - } - else if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayBoth) { - if (version >= 213) - fn.repeatParam = _union_param * 10; - } - else if (fn.func <= FuncSafetyCh16) { - if (version >= 213) { - fn.func = AssignFunc(((fn.func >> 2) << 2) + ((_union_param >> 1) & 0x03)); - } - fn.param = (int8_t)fn.param; + else { + sourcesConversionTable->importValue(value, (int &)fn.param); } } + else if (fn.func == FuncPlayValue) { + if (version >= 213) + sourcesConversionTable->importValue(value, (int &)fn.param); + else + SourcesConversionTable::getInstance(board, version, variant, FLAG_NONONE|FLAG_NOSWITCHES)->importValue(value, (int &)fn.param); + } + else { + fn.param = value; + } + } + + protected: + StructField internalField; + FuncSwData & fn; + BoardEnum board; + unsigned int version; + unsigned int variant; + CustomFunctionsConversionTable functionsConversionTable; + SourcesConversionTable * sourcesConversionTable; + char _param[10]; + unsigned int _active; + unsigned int _mode; +}; + +class AvrCustomFunctionField: public TransformedField { + public: + AvrCustomFunctionField(FuncSwData & fn, BoardEnum board, unsigned int version, unsigned int variant): + TransformedField(internalField), + internalField("CustomFunction"), + fn(fn), + board(board), + version(version), + variant(variant), + functionsConversionTable(board, version), + sourcesConversionTable(SourcesConversionTable::getInstance(board, version, variant, version >= 216 ? 0 : FLAG_NONONE)), + _param(0), + _union_param(0), + _active(0) + { + if (version >= 216) { + internalField.Append(new SwitchField<6>(fn.swtch, board, version)); + internalField.Append(new ConversionField< UnsignedField<4> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + internalField.Append(new UnsignedField<5>(_union_param)); + internalField.Append(new UnsignedField<1>(_active)); + } + if (version >= 213) { + internalField.Append(new SwitchField<8>(fn.swtch, board, version)); + internalField.Append(new UnsignedField<3>(_union_param)); + internalField.Append(new ConversionField< UnsignedField<5> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + } + else { + internalField.Append(new SwitchField<8>(fn.swtch, board, version)); + internalField.Append(new ConversionField< UnsignedField<7> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + internalField.Append(new BoolField<1>((bool &)fn.enabled)); + } + internalField.Append(new UnsignedField<8>(_param)); + } + + virtual void beforeExport() + { + _param = fn.param; + _active = (fn.enabled ? 1 : 0); + + if (fn.func >= FuncSafetyCh1 && fn.func <= FuncSafetyCh32) { + if (version >= 216) + _union_param = fn.func - FuncSafetyCh1; + else if (version >= 213) + _active += ((fn.func % 4) << 1); + } + else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerAIL) { + if (version >= 216) + _union_param = fn.func - FuncTrainer; + } + else if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGVLast) { + if (version >= 216) { + _union_param = fn.adjustMode; + _union_param += (fn.func - FuncAdjustGV1) << 2; + if (fn.adjustMode == 1) + sourcesConversionTable->exportValue(fn.param, (int &)_param); + else if (fn.adjustMode == 2) + _param = RawSource(fn.param).index; + } + else if (version >= 213) { + _active += (fn.adjustMode << 1); + if (fn.adjustMode == 1) + sourcesConversionTable->exportValue(fn.param, (int &)_param); + else if (fn.adjustMode == 2) + _param = RawSource(fn.param).index; + } + else { + sourcesConversionTable->exportValue(fn.param, (int &)_param); + } + } + else if (fn.func == FuncPlayValue) { + if (version >= 216) { + _union_param = fn.repeatParam / 10; + sourcesConversionTable->exportValue(fn.param, (int &)_param); + } + else if (version >= 213) { + _active = fn.repeatParam / 10; + sourcesConversionTable->exportValue(fn.param, (int &)_param); + } + else { + SourcesConversionTable::getInstance(board, version, variant, FLAG_NONONE|FLAG_NOSWITCHES)->exportValue(fn.param, (int &)_param); + } + } + else if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayBoth) { + if (version >= 216) { + _union_param = fn.repeatParam / 10; + } + else if (version >= 213) { + _active = fn.repeatParam / 10; + } + } + } + + virtual void afterImport() + { + fn.param = _param; + if (version >= 213) { + fn.enabled = (_active & 0x01); + } + + if (fn.func >= FuncSafetyCh1 && fn.func <= FuncSafetyCh32) { + if (version >= 216) + fn.func = AssignFunc(fn.func + _union_param); + else if (version >= 213) + fn.func = AssignFunc(((fn.func >> 2) << 2) + ((_active >> 1) & 0x03)); + fn.param = (int8_t)fn.param; + } + else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerAIL) { + if (version >= 216) + fn.func = AssignFunc(fn.func + _union_param); + } + else if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGVLast) { + if (version >= 216) { + fn.func = AssignFunc(fn.func + (_union_param >> 2)); + fn.adjustMode = (_union_param & 0x03); + } + else if (version >= 213) { + fn.adjustMode = ((_active >> 1) & 0x03); + if (fn.adjustMode == 1) + sourcesConversionTable->importValue(_param, (int &)fn.param); + else if (fn.adjustMode == 2) + fn.param = RawSource(SOURCE_TYPE_GVAR, _param).toValue(); + } + else { + sourcesConversionTable->importValue(_param, (int &)fn.param); + } + } + else if (fn.func == FuncPlayValue) { + if (version >= 216) { + fn.repeatParam = _union_param * 10; + sourcesConversionTable->importValue(_param, (int &)fn.param); + } + else if (version >= 213) { + fn.repeatParam = _active * 10; + sourcesConversionTable->importValue(_param, (int &)fn.param); + } + else { + SourcesConversionTable::getInstance(board, version, variant, FLAG_NONONE|FLAG_NOSWITCHES)->importValue(_param, (int &)fn.param); + } + } + else if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayBoth) { + if (version >= 216) + fn.repeatParam = _union_param * 10; + else if (version >= 213) + fn.repeatParam = _active * 10; + } } protected: @@ -1392,11 +1942,10 @@ class CustomFunctionField: public TransformedField { unsigned int variant; CustomFunctionsConversionTable functionsConversionTable; SourcesConversionTable * sourcesConversionTable; - char _arm_param[10]; unsigned int _param; - unsigned int _delay; unsigned int _mode; unsigned int _union_param; + unsigned int _active; }; class FrskyScreenField: public DataField { @@ -1408,15 +1957,15 @@ class FrskyScreenField: public DataField { version(version) { for (int i=0; i<4; i++) { - bars.Append(new UnsignedField<8>(_screen.body.bars[i].source)); - bars.Append(new UnsignedField<8>(_screen.body.bars[i].barMin)); - bars.Append(new UnsignedField<8>(_screen.body.bars[i].barMax)); + bars.Append(new TelemetrySourceField<8>(screen.body.bars[i].source, board, version)); + bars.Append(new UnsignedField<8>(screen.body.bars[i].barMin)); + bars.Append(new UnsignedField<8>(screen.body.bars[i].barMax)); } int columns=(IS_TARANIS(board) ? 3:2); for (int i=0; i<4; i++) { for (int j=0; j(_screen.body.lines[i].source[j])); + numbers.Append(new TelemetrySourceField<8>(screen.body.lines[i].source[j], board, version)); } } if (!IS_TARANIS(board)) { @@ -1428,23 +1977,6 @@ class FrskyScreenField: public DataField { virtual void ExportBits(QBitArray & output) { - _screen = screen; - - bool release21March2013 = IS_RELEASE_21_MARCH_2013(board, version); - if (!release21March2013) { - for (int i=0; i<4; i++) { - if (_screen.body.bars[i].source > 0) - _screen.body.bars[i].source--; - } - int columns=(IS_TARANIS(board) ? 3:2); - for (int i=0; i<4; i++) { - for (int j=0; j 0) - _screen.body.lines[i].source[j]--; - } - } - } - if (screen.type == 0) numbers.ExportBits(output); else @@ -1453,34 +1985,14 @@ class FrskyScreenField: public DataField { virtual void ImportBits(QBitArray & input) { - _screen = screen; - - bool release21March2013 = IS_RELEASE_21_MARCH_2013(board, version); - // NOTA: screen.type should have been imported first! if (screen.type == 0) { numbers.ImportBits(input); - if (!release21March2013) { - int columns=(IS_TARANIS(board) ? 3:2); - for (int i=0; i<4; i++) { - for (int j=0; j 0) - _screen.body.lines[i].source[j]++; - } - } - } } else { bars.ImportBits(input); - if (!release21March2013) { - for (int i=0; i<4; i++) { - if (_screen.body.bars[i].source > 0) - _screen.body.bars[i].source++; - } - } } - screen = _screen; } virtual unsigned int size() @@ -1494,7 +2006,6 @@ class FrskyScreenField: public DataField { protected: FrSkyScreenData & screen; - FrSkyScreenData _screen; BoardEnum board; unsigned int version; StructField bars; @@ -1551,7 +2062,13 @@ class FrskyField: public StructField { Append(new UnsignedField<8>(frsky.channels[i].multiplier, 0, 5, "Multiplier")); } Append(new UnsignedField<8>(frsky.usrProto)); - Append(new UnsignedField<8>(frsky.voltsSource)); + if (version >= 216) { + Append(new UnsignedField<7>(frsky.voltsSource)); + Append(new BoolField<1>(frsky.altitudeDisplayed)); + } + else { + Append(new UnsignedField<8>(frsky.voltsSource)); + } Append(new UnsignedField<8>(frsky.blades)); Append(new UnsignedField<8>(frsky.currentSource)); @@ -1575,6 +2092,11 @@ class FrskyField: public StructField { Append(new ConversionField< UnsignedField<2> >(frsky.rssiAlarms[i].level, &rssiConversionTable[i], "RSSI")); Append(new ConversionField< SignedField<6> >(frsky.rssiAlarms[i].value, -45+i*3)); } + if (version >= 216) { + Append(new BoolField<1>(frsky.mAhPersistent)); + Append(new UnsignedField<15>(frsky.storedMah)); + Append(new SignedField<8>(frsky.fasOffset)); + } } else { for (int i=0; i<2; i++) { @@ -1598,7 +2120,7 @@ class FrskyField: public StructField { Append(new SignedField<4>(frsky.varioMax)); for (int i=0; i<2; i++) { Append(new ConversionField< UnsignedField<2> >(frsky.rssiAlarms[i].level, &rssiConversionTable[i], "RSSI level")); - Append(new ConversionField< SignedField<6> >(frsky.rssiAlarms[i].value, -45+i*3, 0, 100, "RSSI value")); + Append(new ConversionField< SignedField<6> >(frsky.rssiAlarms[i].value, -45+i*3, 0, 0, 100, "RSSI value")); } for (int i=0; i<2; i++) { Append(new FrskyScreenField(frsky.screens[i], board, version)); @@ -1607,6 +2129,10 @@ class FrskyField: public StructField { Append(new SignedField<5>(frsky.varioCenterMin)); Append(new UnsignedField<3>(frsky.currentSource)); Append(new SignedField<8>(frsky.varioCenterMax)); + if (version >= 216) { + // TODO int8_t fasOffset; + Append(new SpareBitsField<8>()); + } } } @@ -1632,11 +2158,12 @@ class MavlinkField: public StructField { int exportPpmDelay(int delay) { return (delay - 300) / 50; } int importPpmDelay(int delay) { return 300 + 50 * delay; } -Open9xModelDataNew::Open9xModelDataNew(ModelData & modelData, BoardEnum board, unsigned int version, unsigned int variant): +OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigned int version, unsigned int variant): TransformedField(internalField), internalField("ModelData"), modelData(modelData), board(board), + version(version), variant(variant), protocolsConversionTable(board) { @@ -1647,9 +2174,9 @@ Open9xModelDataNew::Open9xModelDataNew(ModelData & modelData, BoardEnum board, u else internalField.Append(new ZCharField<10>(modelData.name)); - bool release21March2013 = IS_RELEASE_21_MARCH_2013(board, version); + bool afterrelease21March2013 = IS_AFTER_RELEASE_21_MARCH_2013(board, version); - if (release21March2013) + if (afterrelease21March2013) internalField.Append(new UnsignedField<8>(modelData.modelId)); if (IS_TARANIS(board) && version >= 215) { @@ -1657,11 +2184,18 @@ Open9xModelDataNew::Open9xModelDataNew(ModelData & modelData, BoardEnum board, u } for (int i=0; i(modelData.timers[i].mode, board, version, POPULATE_TIMER_MODES)); + if ((IS_ARM(board) || IS_2560(board)) && version >= 216) { + internalField.Append(new UnsignedField<16>(modelData.timers[i].val)); + internalField.Append(new UnsignedField<2>(modelData.timers[i].countdownBeep)); + internalField.Append(new BoolField<1>(modelData.timers[i].minuteBeep)); + internalField.Append(new BoolField<1>(modelData.timers[i].persistent)); + internalField.Append(new SpareBitsField<4>()); + internalField.Append(new SignedField<16>(modelData.timers[i].pvalue)); + } + else if (afterrelease21March2013) { internalField.Append(new UnsignedField<12>(modelData.timers[i].val)); - - internalField.Append(new BoolField<1>(modelData.timers[i].countdownBeep)); + internalField.Append(new BoolField<1>((bool &)modelData.timers[i].countdownBeep)); internalField.Append(new BoolField<1>(modelData.timers[i].minuteBeep)); if (HAS_PERSISTENT_TIMERS(board)) { internalField.Append(new BoolField<1>(modelData.timers[i].persistent)); @@ -1688,23 +2222,30 @@ Open9xModelDataNew::Open9xModelDataNew(ModelData & modelData, BoardEnum board, u internalField.Append(new BoolField<1>(modelData.thrTrim)); - if (IS_TARANIS(board)) + if (IS_TARANIS(board) || (IS_ARM(board) && version >= 216)) internalField.Append(new SpareBitsField<4>()); else internalField.Append(new ConversionField< SignedField<4> >(modelData.moduleData[0].channelsCount, &channelsConversionTable, "Channels number", ::QObject::tr("OpenTX doesn't allow this number of channels"))); - internalField.Append(new UnsignedField<3>(modelData.trimInc)); + if (version >= 216) + internalField.Append(new SignedField<3>(modelData.trimInc)); + else + internalField.Append(new ConversionField< SignedField<3> >(modelData.trimInc, +2)); + internalField.Append(new BoolField<1>(modelData.disableThrottleWarning)); - if (IS_TARANIS(board)) - internalField.Append(new SpareBitsField<1>()); + if (IS_TARANIS(board) || (IS_ARM(board) && version >= 216)) + internalField.Append(new BoolField<1>(modelData.displayText)); else internalField.Append(new BoolField<1>(modelData.moduleData[0].ppmPulsePol)); internalField.Append(new BoolField<1>(modelData.extendedLimits)); internalField.Append(new BoolField<1>(modelData.extendedTrims)); internalField.Append(new BoolField<1>(modelData.throttleReversed)); - internalField.Append(new ConversionField< SignedField<8> >(modelData.moduleData[0].ppmDelay, exportPpmDelay, importPpmDelay)); + + if (!IS_ARM(board) || version < 216) { + internalField.Append(new ConversionField< SignedField<8> >(modelData.moduleData[0].ppmDelay, exportPpmDelay, importPpmDelay)); + } if (IS_ARM(board) || board==BOARD_GRUVIN9X) internalField.Append(new UnsignedField<16>(modelData.beepANACenter)); @@ -1712,40 +2253,57 @@ Open9xModelDataNew::Open9xModelDataNew(ModelData & modelData, BoardEnum board, u internalField.Append(new UnsignedField<8>(modelData.beepANACenter)); for (int i=0; i(modelData.moduleData[0].ppmFrameLength)); + + if (!IS_ARM(board) || version < 216) { + internalField.Append(new SignedField<8>(modelData.moduleData[0].ppmFrameLength)); + } + internalField.Append(new UnsignedField<8>(modelData.thrTraceSrc)); - if (!release21March2013) + if (!afterrelease21March2013) { internalField.Append(new UnsignedField<8>(modelData.modelId)); + } if (IS_TARANIS(board)) - internalField.Append(new UnsignedField<16>(modelData.switchWarningStates)); + internalField.Append(new SwitchesWarningField<16>(modelData.switchWarningStates, board, version)); else internalField.Append(new SwitchesWarningField<8>(modelData.switchWarningStates, board, version)); + if (version >= 216) { + internalField.Append(new UnsignedField<8>(modelData.nSwToWarn)); + } + if ((board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) && (variant & GVARS_VARIANT)) { - for (int i=0; i(modelData.phaseData[0].gvars[i])); } } if (board != BOARD_STOCK && (board != BOARD_M128 || version < 215)) { - for (int i=0; i(modelData.gvars_names[i])); + if (version >= 216) { + internalField.Append(new BoolField<1>(modelData.gvars_popups[i])); + internalField.Append(new SpareBitsField<7>()); + } } } @@ -1782,44 +2340,92 @@ Open9xModelDataNew::Open9xModelDataNew(ModelData & modelData, BoardEnum board, u } } + if (board==BOARD_SKY9X && version >= 216) { + internalField.Append(new UnsignedField<8>(modelData.nPotsToWarn)); + for (int i=0; i < GetEepromInterface()->getCapability(Pots); i++) { + internalField.Append(new SignedField<8>(modelData.potPosition[i])); + } + } + if (IS_TARANIS(board)) { - for (int i=0; i(modelData.curves[i].name)); } } -} -void Open9xModelDataNew::beforeExport() -{ - // qDebug() << QString("before export model") << modelData.name; - for (int module=0; module<3; module++) { - if (modelData.moduleData[module].protocol >= PXX_XJT_X16 && modelData.moduleData[module].protocol <= PXX_XJT_LR12) - subprotocols[module] = modelData.moduleData[module].protocol - PXX_XJT_X16; - else - subprotocols[module] = (module==0 ? -1:0); + if (IS_TARANIS(board) && version >= 216) { + for (int i=0; i<7; i++) { + ScriptData & script = modelData.scriptData[i]; + internalField.Append(new ZCharField<10>(script.filename)); + internalField.Append(new ZCharField<10>(script.name)); + for (int j=0; j<10; j++) { + internalField.Append(new SignedField<8>(script.inputs[j])); + } + } + for (int i=0; i<32; i++) { + internalField.Append(new ZCharField<4>(modelData.inputNames[i])); + } + internalField.Append(new UnsignedField<8>(modelData.nPotsToWarn)); + for (int i=0; i < GetEepromInterface()->getCapability(Pots); i++) { + internalField.Append(new SignedField<8>(modelData.potPosition[i])); + } } } -void Open9xModelDataNew::afterImport() +void OpenTxModelData::beforeExport() { - // qDebug() << QString("after import model") << modelData.name; + // qDebug() << QString("before export model") << modelData.name; for (int module=0; module<3; module++) { - if (modelData.moduleData[module].protocol == PXX_XJT_X16) { - if (subprotocols[module]>=0) - modelData.moduleData[module].protocol = PXX_XJT_X16 + subprotocols[module]; + if (modelData.moduleData[module].protocol >= PXX_XJT_X16 && modelData.moduleData[module].protocol <= PXX_XJT_LR12) + subprotocols[module] = modelData.moduleData[module].protocol - PXX_XJT_X16; + else if (modelData.moduleData[module].protocol >= LP45 && modelData.moduleData[module].protocol <= DSMX) + subprotocols[module] = modelData.moduleData[module].protocol - LP45; + else + subprotocols[module] = (module==0 ? -1 : 0); + } +} + +void OpenTxModelData::afterImport() +{ + // qDebug() << QString("after import model") << modelData.name ; + + if (IS_TARANIS(board) && version < 216) { + for (unsigned int i=0; imode == INPUT_MODE_BOTH && expo->chn == i && expo->phases == 0 && expo->swtch.type == SWITCH_TYPE_NONE) + break; + if (expo->mode == 0 || expo->chn > i) { + ExpoData * newExpo = modelData.insertInput(j); + newExpo->mode = INPUT_MODE_BOTH; + newExpo->srcRaw = RawSource(SOURCE_TYPE_STICK, i); + newExpo->chn = i; + newExpo->weight = 100; + break; + } + } + strncpy(modelData.inputNames[i], AnalogString(i).toLatin1().constData(), sizeof(modelData.inputNames[i])-1); + } + } + + for (int module=0; module<3; module++) { + if (modelData.moduleData[module].protocol == PXX_XJT_X16 || modelData.moduleData[module].protocol == LP45) { + if (subprotocols[module] >= 0) + modelData.moduleData[module].protocol += subprotocols[module]; else modelData.moduleData[module].protocol = OFF; } } } -Open9xGeneralDataNew::Open9xGeneralDataNew(GeneralSettings & generalData, BoardEnum board, unsigned int version, unsigned int variant): +OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, BoardEnum board, unsigned int version, unsigned int variant): TransformedField(internalField), internalField("General Settings"), generalData(generalData), board(board), - inputsCount(IS_TARANIS(board) ? 8 : 7) + version(version), + inputsCount(4 + MAX_POTS(board, version)) { generalData.version = version; generalData.variant = variant; @@ -1828,12 +2434,21 @@ Open9xGeneralDataNew::Open9xGeneralDataNew(GeneralSettings & generalData, BoardE if (version >= 213 || (!IS_ARM(board) && version >= 212)) internalField.Append(new UnsignedField<16>(generalData.variant)); - for (int i=0; i(generalData.calibMid[i])); - for (int i=0; i(generalData.calibSpanNeg[i])); - for (int i=0; i(generalData.calibSpanPos[i])); + if (version >= 216) { + for (int i=0; i(generalData.calibMid[i])); + internalField.Append(new SignedField<16>(generalData.calibSpanNeg[i])); + internalField.Append(new SignedField<16>(generalData.calibSpanPos[i])); + } + } + else { + for (int i=0; i(generalData.calibMid[i])); + for (int i=0; i(generalData.calibSpanNeg[i])); + for (int i=0; i(generalData.calibSpanPos[i])); + } internalField.Append(new UnsignedField<16>(chkSum)); internalField.Append(new UnsignedField<8>(generalData.currModel)); @@ -1864,10 +2479,11 @@ Open9xGeneralDataNew::Open9xGeneralDataNew(GeneralSettings & generalData, BoardE internalField.Append(new SpareBitsField<1>()); internalField.Append(new UnsignedField<8>(generalData.inactivityTimer)); - if (IS_STOCK(board) && version >= 215) { + if (IS_9X(board) && version >= 215) { internalField.Append(new UnsignedField<3>(generalData.mavbaud)); - } else { - internalField.Append(new BoolField<1>(generalData.throttleReversed)); + } + else { + internalField.Append(new SpareBitsField<1>()); internalField.Append(new BoolField<1>(generalData.minuteBeep)); internalField.Append(new BoolField<1>(generalData.preBeep)); } @@ -1892,9 +2508,9 @@ Open9xGeneralDataNew::Open9xGeneralDataNew(GeneralSettings & generalData, BoardE internalField.Append(new UnsignedField<8>(generalData.speakerPitch)); if (IS_ARM(board)) - internalField.Append(new ConversionField< SignedField<8> >(generalData.speakerVolume, -12, 0, 23, "Volume")); + internalField.Append(new ConversionField< SignedField<8> >(generalData.speakerVolume, -12, 0, 0, 23, "Volume")); else - internalField.Append(new ConversionField< SignedField<8> >(generalData.speakerVolume, -7, 0, 7, "Volume")); + internalField.Append(new ConversionField< SignedField<8> >(generalData.speakerVolume, -7, 0, 0, 7, "Volume")); if (version >= 214 || (!IS_ARM(board) && version >= 213)) { internalField.Append(new SignedField<8>(generalData.vBatMin)); @@ -1924,21 +2540,45 @@ Open9xGeneralDataNew::Open9xGeneralDataNew(GeneralSettings & generalData, BoardE internalField.Append(new SignedField<8>(generalData.beepVolume)); internalField.Append(new SignedField<8>(generalData.wavVolume)); internalField.Append(new SignedField<8>(generalData.varioVolume)); + if (version >= 216) { + internalField.Append(new SignedField<8>(generalData.varioPitch)); + internalField.Append(new SignedField<8>(generalData.varioRange)); + internalField.Append(new SignedField<8>(generalData.varioRepeat)); + } internalField.Append(new SignedField<8>(generalData.backgroundVolume)); } + if (IS_TARANIS(board) && version >= 216) { + internalField.Append(new UnsignedField<8>(generalData.hw_uartMode)); + for (int i=0; i<8; i++) { + internalField.Append(new UnsignedField<1>(generalData.potsType[i])); + } + } } } -void Open9xGeneralDataNew::beforeExport() +void OpenTxGeneralData::beforeExport() { uint16_t sum = 0; - for (int i=0; i= 216) { + int count = 0; + for (int i=0; i #include -#include "open9xinterface.h" -#include "open9xeeprom.h" +#include "opentxinterface.h" +#include "opentxeeprom.h" #include "open9xGruvin9xeeprom.h" #include "open9xSky9xeeprom.h" -#include "open9xsimulator.h" -#include "open9xM128simulator.h" -#include "open9xGruvin9xsimulator.h" -#include "open9xSky9xsimulator.h" +#include "opentxsimulator.h" +#include "opentxM128simulator.h" +#include "opentxGruvin9xsimulator.h" +#include "opentxSky9xsimulator.h" #include "opentxTaranisSimulator.h" #include "file.h" +#include "appdata.h" #define FILE_TYP_GENERAL 1 #define FILE_TYP_MODEL 2 @@ -42,44 +43,40 @@ size_t SizeOfArray( T(&)[ N ] ) return N; } -QStringList o9xservers; - -Open9xInterface::Open9xInterface(BoardEnum board): +OpenTxInterface::OpenTxInterface(BoardEnum board): EEPROMInterface(board), efile(new EFile()) { - o9xservers.clear(); - o9xservers << "93.51.182.154" << "open9x.9xforums.com"; } -Open9xInterface::~Open9xInterface() +OpenTxInterface::~OpenTxInterface() { delete efile; } -const char * Open9xInterface::getName() +const char * OpenTxInterface::getName() { switch (board) { case BOARD_STOCK: - return "openTx for 9X board"; + return "OpenTX for 9X board"; case BOARD_M128: - return "openTx for M128 / 9X board"; + return "OpenTX for M128 / 9X board"; case BOARD_GRUVIN9X: - return "openTx for Gruvin9x board / 9X"; + return "OpenTX for Gruvin9x board / 9X"; case BOARD_TARANIS: - return "openTx for FrSky Taranis"; + return "OpenTX for FrSky Taranis"; case BOARD_TARANIS_REV4a: - return "openTx for FrSky Taranis Rev4a"; + return "OpenTX for FrSky Taranis Rev4a"; case BOARD_SKY9X: - return "openTx for Sky9x board / 9X"; + return "OpenTX for Sky9x board / 9X"; case BOARD_9XRPRO: - return "openTx for 9XR-PRO"; + return "OpenTX for 9XR-PRO"; default: - return "openTx for an unknown board"; + return "OpenTX for an unknown board"; } } -const int Open9xInterface::getEEpromSize() +const int OpenTxInterface::getEEpromSize() { switch (board) { case BOARD_STOCK: @@ -101,7 +98,7 @@ const int Open9xInterface::getEEpromSize() } } -const int Open9xInterface::getMaxModels() +const int OpenTxInterface::getMaxModels() { if (IS_ARM(board)) return 60; @@ -114,7 +111,7 @@ const int Open9xInterface::getMaxModels() } template -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; @@ -147,7 +144,7 @@ bool Open9xInterface::loadModel(ModelData &model, uint8_t *data, int index, unsi } template -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); @@ -174,7 +171,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(model, data, index, stickMode); @@ -243,11 +240,11 @@ bool Open9xInterface::loadModel(uint8_t version, ModelData &model, uint8_t *data return loadModel(model, data, index); } else { - return loadModelVariant(index, model, data, version, variant); + return loadModelVariant(index, model, data, version, variant); } } else if (version >= 213) { - return loadModelVariant(index, model, data, version, variant); + return loadModelVariant(index, model, data, version, variant); } std::cout << " ko\n"; @@ -255,7 +252,7 @@ bool Open9xInterface::loadModel(uint8_t version, ModelData &model, uint8_t *data } template -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); @@ -271,7 +268,7 @@ bool Open9xInterface::loadGeneral(GeneralSettings &settings, unsigned int versio } template -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(); @@ -282,15 +279,7 @@ bool Open9xInterface::saveGeneral(GeneralSettings &settings, BoardEnum board, ui } template -bool Open9xInterface::saveModel(unsigned int index, ModelData &model) -{ - T open9xModel(model); - int sz = efile->writeRlc2(FILE_MODEL(index), FILE_TYP_MODEL, (uint8_t*)&open9xModel, sizeof(T)); - return (sz == sizeof(T)); -} - -template -bool Open9xInterface::saveModelVariant(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(); @@ -300,12 +289,12 @@ bool Open9xInterface::saveModelVariant(unsigned int index, ModelData &model, uns 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, const uint8_t *eeprom, int size) { std::cout << "trying " << getName() << " import..."; @@ -320,8 +309,9 @@ bool Open9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size) if (notnull) { std::cout << " wrong size (" << size << ")\n"; return false; - } else { - QMessageBox::warning(NULL,"companion9x", QObject::tr("Your radio probably uses a wrong firmware,\n eeprom size is 4096 but only the first 2048 are used")); + } + else { + QMessageBox::warning(NULL, "companion", QObject::tr("Your radio probably uses a wrong firmware,\n eeprom size is 4096 but only the first 2048 are used")); size=2048; } } else { @@ -330,7 +320,7 @@ bool Open9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size) } } - if (!efile->EeFsOpen(eeprom, size, board)) { + if (!efile->EeFsOpen((uint8_t *)eeprom, size, board)) { std::cout << " wrong file system\n"; return false; } @@ -350,7 +340,7 @@ bool Open9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size) return false; } - if (!loadGeneral(radioData.generalSettings, version)) { + if (!loadGeneral(radioData.generalSettings, version)) { std::cout << " ko\n"; return false; } @@ -366,7 +356,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(); @@ -375,19 +365,19 @@ int Open9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t varian case BOARD_TARANIS: case BOARD_TARANIS_REV4a: case BOARD_SKY9X: - version = 215; + version = 216; break; case BOARD_9XRPRO: version = 215; break; case BOARD_GRUVIN9X: - version = 214; + version = 216; break; case BOARD_M128: - version = 215; + version = 216; break; case BOARD_STOCK: - version = 213; + version = 216; break; } } @@ -396,81 +386,21 @@ int Open9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t varian efile->EeFsCreate(eeprom, size, board); - int result = 0; - if (board == BOARD_M128) { variant |= M128_VARIANT; } - result = saveGeneral(radioData.generalSettings, board, version, variant); - - if (!result) + int result = saveGeneral(radioData.generalSettings, board, version, variant); + if (!result) { return 0; + } for (int i=0; i(i, radioData.models[i]); - break; - case 203: - result = saveModel(i, radioData.models[i]); - break; - case 204: - result = saveModel(i, radioData.models[i]); - break; - case 205: - result = saveModel(i, radioData.models[i]); - break; - case 207: - if (board == BOARD_GRUVIN9X) - result = saveModel(i, radioData.models[i]); - break; - case 208: - if (board == BOARD_GRUVIN9X) - result = saveModel(i, radioData.models[i]); - else if (IS_SKY9X(board)) - result = saveModel(i, radioData.models[i]); - else - result = saveModel(i, radioData.models[i]); - break; - case 209: - if (board == BOARD_GRUVIN9X) - result = saveModel(i, radioData.models[i]); - else if (IS_SKY9X(board)) - result = saveModel(i, radioData.models[i]); - else - result = saveModel(i, radioData.models[i]); - break; - case 210: - if (board == BOARD_GRUVIN9X) - result = saveModel(i, radioData.models[i]); - else if (IS_SKY9X(board)) - result = saveModel(i, radioData.models[i]); - else - result = saveModel(i, radioData.models[i]); - break; - case 211: - if (board == BOARD_GRUVIN9X) - result = saveModel(i, radioData.models[i]); - else if (IS_SKY9X(board)) - result = saveModel(i, radioData.models[i]); - else - result = saveModel(i, radioData.models[i]); - break; - case 212: - if (IS_SKY9X(board)) - result = saveModel(i, radioData.models[i]); - else - result = saveModelVariant(i, radioData.models[i], version, variant); - break; - default: - result = saveModelVariant(i, radioData.models[i], version, variant); - break; + result = saveModel(i, radioData.models[i], version, variant); + if (!result) { + return 0; } - if (!result) - return false; } } @@ -482,7 +412,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 (IS_SKY9X(board)) return 0; @@ -494,8 +424,7 @@ int Open9xInterface::getSize(ModelData &model) uint8_t tmp[EESIZE_RLC_MAX]; efile->EeFsCreate(tmp, EESIZE_RLC_MAX, board); - Open9xModelDataNew open9xModel(model, board, 255, GetCurrentFirmwareVariant()); - // open9xModel.Dump(); + OpenTxModelData open9xModel(model, board, 255, GetCurrentFirmwareVariant()); QByteArray eeprom; open9xModel.Export(eeprom); @@ -506,7 +435,7 @@ int Open9xInterface::getSize(ModelData &model) return efile->size(0); } -int Open9xInterface::getSize(GeneralSettings &settings) +int OpenTxInterface::getSize(GeneralSettings &settings) { if (IS_SKY9X(board)) return 0; @@ -514,7 +443,7 @@ int Open9xInterface::getSize(GeneralSettings &settings) uint8_t tmp[EESIZE_RLC_MAX]; efile->EeFsCreate(tmp, EESIZE_RLC_MAX, board); - Open9xGeneralDataNew open9xGeneral(settings, board, 255, GetCurrentFirmwareVariant()); + OpenTxGeneralData open9xGeneral(settings, board, 255, GetCurrentFirmwareVariant()); // open9xGeneral.Dump(); QByteArray eeprom; @@ -526,7 +455,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: @@ -536,11 +465,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; @@ -569,12 +493,14 @@ int Open9xInterface::getCapability(const Capability capability) return 6; else return 5; - case FlightPhasesAreNamed: case FlightPhasesHaveFades: + return 1; case Gvars: + return IS_ARM(board) ? 9 : 5; + case FlightModesName: + case GvarsName: + return (IS_TARANIS(board) ? 10 : 6); case GvarsInCS: - case GvarsAsWeight: - case ExpoIsCurve: case HasFAIMode: return 1; case GvarsAreNamed: @@ -591,24 +517,20 @@ int Open9xInterface::getCapability(const Capability capability) return 1; else return 0; - case minuteBeep: - return 1; - case countdownBeep: - return 1; case Pots: - return (IS_TARANIS(board) ? 4 : 3); + return (IS_TARANIS(board) ? 5 : 3); case Switches: return (IS_TARANIS(board) ? 8 : 7); case SwitchesPositions: return (IS_TARANIS(board) ? 22 : 9); case CustomFunctions: if (IS_ARM(board)) - return 32; + return 64; else if (board==BOARD_GRUVIN9X||board==BOARD_M128) return 24; else return 16; - case CustomSwitches: + case LogicalSwitches: if (IS_ARM(board)) return 32; else if (board==BOARD_GRUVIN9X||board==BOARD_M128) @@ -617,10 +539,10 @@ int Open9xInterface::getCapability(const Capability capability) return 12; case CustomAndSwitches: if (IS_ARM(board)) - return getCapability(CustomSwitches); + return getCapability(LogicalSwitches); else return 15/*4bits*/-9/*sw positions*/; - case CustomSwitchesExt: + case LogicalSwitchesExt: return (IS_ARM(board) ? true : false); case RotaryEncoders: if (board == BOARD_GRUVIN9X) @@ -636,7 +558,7 @@ int Open9xInterface::getCapability(const Capability capability) case VoicesAsNumbers: return (IS_ARM(board) ? 0 : 1); case VoicesMaxLength: - return (IS_ARM(board) ? (IS_TARANIS(board) ? 10 : 6) : 0); + return (IS_ARM(board) ? (IS_TARANIS(board) ? 8 : 6) : 0); case MultiLangVoice: return (IS_ARM(board) ? 1 : 0); case SoundPitch: @@ -670,27 +592,12 @@ int Open9xInterface::getCapability(const Capability capability) return 0; case ExtraInputs: return 1; - case HasNegCurves: - return 1; - case HasExpoCurves: - return true; - case ExpoCurve5: - case ExpoCurve9: - return 4; case ExtendedTrims: return 500; - case ExtraTrims: - return 1; case Simulation: return 1; case DSM2Indexes: return 1; - case FSSwitch: - return 1; - case HasTTrace: - return 1; - case CustomCurves: - return 1; case MixesWithoutExpo: return 1; case NumCurves: @@ -699,36 +606,20 @@ int Open9xInterface::getCapability(const Capability capability) return (IS_ARM(board) ? (IS_TARANIS(board) ? 8 : 6) : false); case HasExpoNames: return (IS_ARM(board) ? (IS_TARANIS(board) ? 8 : 6) : false); - case HasChNames: - return (IS_TARANIS(board) ? 1 : 0); + case ChannelsName: + return (IS_TARANIS(board) ? 6 : 0); case HasCvNames: return (IS_TARANIS(board) ? 1 : 0); - case NoTimerDirs: - return 1; - case NoThrExpo: - return 1; case Telemetry: return TM_HASTELEMETRY|TM_HASOFFSET|TM_HASWSHH; case TelemetryBars: return 1; - case TelemetryCSFields: - if (IS_TARANIS(board)) { - return 36; - } else { - return IS_ARM(board) ? 24 : 16; - } - case TelemetryColsCSFields: - if (IS_TARANIS(board)) { - return 3; - } else { - return 2; - } + case TelemetryCustomScreens: + return IS_TARANIS(board) ? 3 : 2; + case TelemetryCustomScreensFieldsPerLine: + return IS_TARANIS(board) ? 3 : 2; case NoTelemetryProtocol: - if (IS_TARANIS(board)) { - return 1; - } else { - return 0; - } + return IS_TARANIS(board) ? 1 : 0; case TelemetryUnits: return 0; case TelemetryBlades: @@ -741,8 +632,6 @@ int Open9xInterface::getCapability(const Capability capability) return 1; case TelemetryMaxMultiplier: return (IS_ARM(board) ? 32 : 8); - case DiffMixers: - return 1; case PPMCenter: return 1; case SYMLimits: @@ -773,10 +662,6 @@ int Open9xInterface::getCapability(const Capability capability) case HasBrightness: return (IS_ARM(board) ? true : false); case PerModelTimers: - case PerModelThrottleWarning: - case PerModelThrottleInvert: - return 1; - case pmSwitchMask: return 1; case SlowScale: return (IS_ARM(board) ? 10 : 2); @@ -784,21 +669,43 @@ int Open9xInterface::getCapability(const Capability capability) return (IS_ARM(board) ? 250 : 15); case CSFunc: return 18; - case GvarsNum: - case GvarsOfsNum: - return 5; case HasSDLogs: return ((board == BOARD_GRUVIN9X || IS_ARM(board)) ? true : false); case LCDWidth: return (IS_TARANIS(board) ? 212 : 128) ; case GetThrSwitch: - return (IS_TARANIS(board) ?DSW_SF1 : DSW_THR) ; + return (IS_TARANIS(board) ? DSW_SF1 : DSW_THR) ; + case HasDisplayText: + case VirtualInputs: + return IS_TARANIS(board) ? 32 : 0; + case TrainerInputs: + return IS_ARM(board) ? 16 : 8; + case LuaInputs: + case LimitsPer1000: + case EnhancedCurves: + case TelemetryInternalAlarms: + return IS_TARANIS(board); + case HasFasOffset: + return (IS_STOCK(board) ? false : true); + case HasMahPersistent: + return (IS_ARM(board) ? true : false); + case MultiposPots: + return IS_TARANIS(board) ? 3 : 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) { @@ -821,12 +728,15 @@ int Open9xInterface::isAvailable(Protocol proto, int port) case PXX_XJT_D8: case PXX_XJT_LR12: case PXX_DJT: + case LP45: + case DSM2: + case DSMX: return 1; default: return 0; } break; - case 2: + case -1: switch (proto) { case PPM: return 1; @@ -880,7 +790,7 @@ int Open9xInterface::isAvailable(Protocol proto, int port) } } -SimulatorInterface * Open9xInterface::getSimulator() +SimulatorInterface * OpenTxInterface::getSimulator() { switch (board) { case BOARD_STOCK: @@ -894,7 +804,6 @@ SimulatorInterface * Open9xInterface::getSimulator() case BOARD_9XRPRO: return new Open9xSky9xSimulator(this); case BOARD_TARANIS: - return new OpentxTaranisSimulator(this); case BOARD_TARANIS_REV4a: return new OpentxTaranisSimulator(this); default: @@ -907,7 +816,7 @@ size_t getSizeA(T (&)[SIZE]) { return SIZE; } -bool Open9xInterface::checkVersion(unsigned int version) +bool OpenTxInterface::checkVersion(unsigned int version) { switch(version) { case 201: @@ -963,6 +872,9 @@ bool Open9xInterface::checkVersion(unsigned int version) case 215: // M128 revert because too much RAM used! break; + case 216: + // A lot of things (first github release) + break; default: return false; } @@ -970,7 +882,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) { @@ -992,7 +904,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..."; @@ -1035,14 +947,11 @@ bool Open9xInterface::loadBackup(RadioData &radioData, uint8_t *eeprom, int esiz QString geturl( int board) { - QString url="http://"; - QSettings settings("companion9x", "companion9x"); - int server = settings.value("fwserver", 0).toInt(); - if (server >= o9xservers.count()) { - server = 0; - settings.setValue("fwserver",server); - } - url.append(o9xservers.at(server)); + QString url = g.compileServer(); + if (url.isEmpty()){ + url= OPENTX_FIRMWARE_DOWNLOADS; + g.compileServer(url); + } switch(board) { case BOARD_STOCK: case BOARD_M128: @@ -1064,28 +973,25 @@ QString geturl( int board) QString getstamp( int board) { - QString url="http://"; - QSettings settings("companion9x", "companion9x"); - int server = settings.value("fwserver",0).toInt(); - if (server >=o9xservers.count()) { - server=0; - settings.setValue("fwserver",server); - } - url.append(o9xservers.at(server)); - url.append("/binaries/stamp-opentx-"); + QString url = g.compileServer(); + if (url.isEmpty()){ + url= OPENTX_FIRMWARE_DOWNLOADS; + g.compileServer(url); + } + url.append("/stamp-opentx-"); switch(board) { case BOARD_STOCK: - url.append("stock.txt"); + url.append("9x.txt"); break; case BOARD_M128: - url.append("stock128.txt"); + url.append("9x128.txt"); break; case BOARD_GRUVIN9X: - url.append("v4.txt"); + url.append("gruvin9x.txt"); break; case BOARD_9XRPRO: case BOARD_SKY9X: - url.append("arm.txt"); + url.append("sky9x.txt"); break; case BOARD_TARANIS: case BOARD_TARANIS_REV4a: @@ -1100,16 +1006,13 @@ QString getstamp( int board) QString getrnurl( int board) { - QString url="http://"; - QSettings settings("companion9x", "companion9x"); - int server = settings.value("fwserver",0).toInt(); - if (server >=o9xservers.count()) { - server=0; - settings.setValue("fwserver",server); - } - url.append(o9xservers.at(server)); - url.append("/docs/releasenotes-"); - switch(board) { + QString url = g.compileServer(); + if (url.isEmpty()){ + url= OPENTX_FIRMWARE_DOWNLOADS; + g.compileServer(url); + } + url.append("/releasenotes-"); + switch(board) { case BOARD_STOCK: case BOARD_M128: case BOARD_GRUVIN9X: @@ -1137,7 +1040,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-stock", 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")); @@ -1169,11 +1072,12 @@ void RegisterOpen9xFirmwares() open9x->addOption("novario", QObject::tr("No vario support")); open9x->addOption("nogps", QObject::tr("No GPS support")); open9x->addOption("nogauges", QObject::tr("No gauges in the custom telemetry screen")); + open9x->addOption("fasoffset", QObject::tr("Allow compensating for offset errors in FrSky FAS current sensors")); open9x->addOptions(fai_options); firmwares.push_back(open9x); /* 9x board with M128 chip */ - open9x = new Open9xFirmware("opentx-stock128", 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")); @@ -1205,7 +1109,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")); @@ -1239,7 +1143,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")); @@ -1269,7 +1173,7 @@ void RegisterOpen9xFirmwares() firmwares.push_back(open9x); /* Gruvin9x board */ - open9x = new Open9xFirmware("opentx-v4", 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")); @@ -1299,7 +1203,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")); @@ -1349,7 +1253,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")); @@ -1358,10 +1262,8 @@ void RegisterOpen9xFirmwares() open9x->addOptions(fai_options); firmwares.push_back(open9x); - QSettings settings("companion9x", "companion9x"); - 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); + if (g.rev4aSupport()) { + 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")); diff --git a/companion/src/firmwares/opentx/open9xinterface.h b/companion/src/firmwares/opentx/opentxinterface.h similarity index 89% rename from companion/src/firmwares/opentx/open9xinterface.h rename to companion/src/firmwares/opentx/opentxinterface.h index 5712a83eb..d3db20ea4 100644 --- a/companion/src/firmwares/opentx/open9xinterface.h +++ b/companion/src/firmwares/opentx/opentxinterface.h @@ -18,15 +18,18 @@ #include "eeprominterface.h" +#define OPENTX_COMPANION_DOWNLOADS "http://downloads.open-tx.org/companion" +#define OPENTX_FIRMWARE_DOWNLOADS "http://downloads.open-tx.org/firmware" + 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(); @@ -34,7 +37,7 @@ class Open9xInterface : public EEPROMInterface virtual const int getMaxModels(); - virtual bool load(RadioData &, uint8_t *eeprom, int size); + virtual bool load(RadioData &, const uint8_t *eeprom, int size); virtual bool loadBackup(RadioData &, uint8_t *eeprom, int esize, int index); @@ -67,10 +70,7 @@ class Open9xInterface : public EEPROMInterface bool loadModel(uint8_t version, ModelData &model, uint8_t *data, int index, unsigned int variant, unsigned int stickMode=0); template - bool saveModel(unsigned int index, ModelData &model); - - template - bool saveModelVariant(unsigned int index, ModelData &model, unsigned int version, unsigned int variant); + bool saveModel(unsigned int index, ModelData &model, unsigned int version, unsigned int variant); template bool loadGeneral(GeneralSettings &settings, unsigned int version); @@ -94,6 +94,7 @@ class Open9xFirmware: public FirmwareInfo { addLanguage("se"); addLanguage("cz"); addLanguage("es"); + addLanguage("pl"); addLanguage("pt"); addTTSLanguage("en"); @@ -103,6 +104,7 @@ class Open9xFirmware: public FirmwareInfo { addTTSLanguage("se"); addTTSLanguage("cz"); addTTSLanguage("sk"); + addTTSLanguage("pl"); addTTSLanguage("pt"); addTTSLanguage("es"); } diff --git a/companion/src/firmwares/opentx/open9xsimulator.cpp b/companion/src/firmwares/opentx/opentxsimulator.cpp similarity index 86% rename from companion/src/firmwares/opentx/open9xsimulator.cpp rename to companion/src/firmwares/opentx/opentxsimulator.cpp index 252ee6ecc..dfb7025ea 100644 --- a/companion/src/firmwares/opentx/open9xsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxsimulator.cpp @@ -14,9 +14,9 @@ * */ -#include "open9xsimulator.h" -#include "open9xinterface.h" -#include "open9xeeprom.h" +#include "opentxsimulator.h" +#include "opentxinterface.h" +#include "opentxeeprom.h" #define HELI #define SIMU @@ -100,14 +100,14 @@ bool hasExtendedTrims() uint8_t getStickMode() { - return g_eeGeneral.stickMode; + return limit(0, g_eeGeneral.stickMode, 3); } } 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(); @@ -162,7 +169,7 @@ void Open9xSimulator::setValues(TxInputs &inputs) void Open9xSimulator::setTrim(unsigned int idx, int value) { - idx = Open9x::modn12x3[4*getStickMode() + idx] - 1; + idx = Open9x::modn12x3[4*getStickMode() + idx]; uint8_t phase = getTrimFlightPhase(getFlightPhase(), idx); setTrimValue(phase, idx, value); } @@ -176,7 +183,7 @@ void Open9xSimulator::getTrims(Trims & trims) } for (int i=0; i<2; i++) { - uint8_t idx = Open9x::modn12x3[4*getStickMode() + i] - 1; + uint8_t idx = Open9x::modn12x3[4*getStickMode() + i]; int16_t tmp = trims.values[i]; trims.values[i] = trims.values[idx]; trims.values[idx] = tmp; diff --git a/companion/src/firmwares/opentx/open9xsimulator.h b/companion/src/firmwares/opentx/opentxsimulator.h similarity index 83% rename from companion/src/firmwares/opentx/open9xsimulator.h rename to companion/src/firmwares/opentx/opentxsimulator.h index 84970eb1f..a4e24b3ba 100644 --- a/companion/src/firmwares/opentx/open9xsimulator.h +++ b/companion/src/firmwares/opentx/opentxsimulator.h @@ -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; }; diff --git a/companion/src/firmwares/opentx/stamp-opentx.h.in b/companion/src/firmwares/opentx/stamp-opentx.h.in index ad88df035..1b56589f5 100644 --- a/companion/src/firmwares/opentx/stamp-opentx.h.in +++ b/companion/src/firmwares/opentx/stamp-opentx.h.in @@ -1,6 +1,5 @@ // Automatically generated file (CMake) - do not edit #define DATE_STR "@DATE@" #define TIME_STR "@TIME@" -#define VERS_STR "c9x" -#define SVN_STR "@FIRMWARE@-r@G9X_WC_REVISION@" +#define VERS_STR "@C9X_VERSION@" #define MOD_STR "FH" diff --git a/companion/src/firmwares/th9x/th9xeeprom.cpp b/companion/src/firmwares/th9x/th9xeeprom.cpp index d09eb979b..daafb48b2 100644 --- a/companion/src/firmwares/th9x/th9xeeprom.cpp +++ b/companion/src/firmwares/th9x/th9xeeprom.cpp @@ -2,18 +2,6 @@ #include "helpers.h" #include "th9xeeprom.h" -int8_t th9xFromSwitch(const RawSwitch & sw) -{ - switch (sw.type) { - case SWITCH_TYPE_SWITCH: - return sw.index; - case SWITCH_TYPE_VIRTUAL: - return sw.index > 0 ? (9 + sw.index) : (-9 -sw.index); - default: - return 0; - } -} - RawSwitch th9xToSwitch(int8_t sw) { if (sw == 0) @@ -29,15 +17,6 @@ t_Th9xTrainerMix::t_Th9xTrainerMix() memset(this, 0, sizeof(t_Th9xTrainerMix)); } -t_Th9xTrainerMix::t_Th9xTrainerMix(TrainerMix &c9x) -{ - memset(this, 0, sizeof(t_Th9xTrainerMix)); - srcChn = c9x.src; - swtch = th9xFromSwitch(c9x.swtch); - studWeight = (8 * c9x.weight) / 25; - mode = c9x.mode; -} - t_Th9xTrainerMix::operator TrainerMix() { TrainerMix c9x; @@ -53,15 +32,6 @@ t_Th9xTrainerData::t_Th9xTrainerData() memset(this, 0, sizeof(t_Th9xTrainerData)); } -t_Th9xTrainerData::t_Th9xTrainerData(TrainerData &c9x) -{ - memset(this, 0, sizeof(t_Th9xTrainerData)); - for (int i=0; i 6) { + c9x.curve.type = CurveReference::CURVE_REF_CUSTOM; + c9x.curve.value = curve - 6; + } + else if (curve > 0) { + c9x.curve.type = CurveReference::CURVE_REF_FUNC; + c9x.curve.value = curve; + } c9x.mode = mode3; c9x.weight = weight6; c9x.chn = chn; c9x.swtch = th9xToSwitch(drSw); - if (curve) { - c9x.curveMode=1; - c9x.curveParam = curve; - } else { - c9x.curveMode = 0; - c9x.curveParam = exp5; - } return c9x; } @@ -206,15 +122,6 @@ t_Th9xLimitData::t_Th9xLimitData() memset(this, 0, sizeof(t_Th9xLimitData)); } -t_Th9xLimitData::t_Th9xLimitData(LimitData &c9x) -{ - memset(this, 0, sizeof(t_Th9xLimitData)); - min = c9x.min+100; - max = c9x.max-100; - revert = c9x.revert; - offset = c9x.offset; -} - t_Th9xLimitData::operator LimitData () { LimitData c9x; @@ -225,36 +132,11 @@ t_Th9xLimitData::operator LimitData () return c9x; } - t_Th9xMixData::t_Th9xMixData() { memset(this, 0, sizeof(t_Th9xMixData)); } -t_Th9xMixData::t_Th9xMixData(MixData &c9x) -{ - memset(this, 0, sizeof(t_Th9xMixData)); - destCh = c9x.destCh; - mixMode = c9x.mltpx; - if (c9x.srcRaw.type == SOURCE_TYPE_STICK) - srcRaw = c9x.srcRaw.index; - else if (c9x.srcRaw.type == SOURCE_TYPE_MAX) - srcRaw = 10; - else if (c9x.srcRaw.type == SOURCE_TYPE_PPM) - srcRaw = 24 + c9x.srcRaw.index; - else if (c9x.srcRaw.type == SOURCE_TYPE_CH) - srcRaw = 12 + c9x.srcRaw.index; - else - srcRaw = 0; // TODO - switchMode = 1; - curveNeg = 0; - weight = c9x.weight; - swtch = th9xFromSwitch(c9x.swtch); - curve = c9x.curve; - speedUp = c9x.speedUp; - speedDown = c9x.speedDown; -} - t_Th9xMixData::operator MixData () { MixData c9x; @@ -273,57 +155,36 @@ t_Th9xMixData::operator MixData () c9x.srcRaw = RawSource(SOURCE_TYPE_PPM, srcRaw-24); c9x.weight = weight; c9x.swtch = th9xToSwitch(swtch); - c9x.curve = curve; + if (curve > 6) { + c9x.curve.type = CurveReference::CURVE_REF_CUSTOM; + c9x.curve.value = curve - 6; + } + else if (curve > 0) { + c9x.curve.type = CurveReference::CURVE_REF_FUNC; + c9x.curve.value = curve; + } c9x.speedUp = speedUp; c9x.speedDown = speedDown; c9x.mltpx = (MltpxValue)mixMode; return c9x; } - -t_Th9xCustomSwData::t_Th9xCustomSwData(CustomSwData &c9x) +t_Th9xLogicalSwitchData::operator LogicalSwitchData () { - opCmp = c9x.func; - val1 = c9x.val1; - val2 = c9x.val2; - - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { - val1 = fromSource(RawSource(c9x.val1)); - } - - if (c9x.func >= CS_FN_EQUAL) { - val2 = fromSource(RawSource(c9x.val2)); - } - - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { - val1 = th9xFromSwitch(RawSwitch(c9x.val1)); - val2 = th9xFromSwitch(RawSwitch(c9x.val2)); - } - - if (opCmp>TH9X_MAX_CSFUNC ) { - EEPROMWarnings += ::QObject::tr("th9x does not support Custom Switch function %1").arg(getFuncName(opCmp)) + "\n"; - opCmp=0; - val1=0; - val2=0; - } -} - -t_Th9xCustomSwData::operator CustomSwData () -{ - CustomSwData c9x; + LogicalSwitchData c9x; c9x.func = opCmp; c9x.val1 = val1; c9x.val2 = val2; - if ((c9x.func >= CS_FN_VPOS && c9x.func <= CS_FN_ANEG) || c9x.func >= CS_FN_EQUAL) { + if ((c9x.func >= LS_FN_VPOS && c9x.func <= LS_FN_ANEG) || c9x.func >= LS_FN_EQUAL) { c9x.val1 = toSource(val1).toValue(); } - if (c9x.func >= CS_FN_EQUAL) { + if (c9x.func >= LS_FN_EQUAL) { c9x.val2 = toSource(val2).toValue(); } - if (c9x.func >= CS_FN_AND && c9x.func <= CS_FN_XOR) { + if (c9x.func >= LS_FN_AND && c9x.func <= LS_FN_XOR) { c9x.val1 = th9xToSwitch(val1).toValue(); c9x.val2 = th9xToSwitch(val2).toValue(); } @@ -331,7 +192,7 @@ t_Th9xCustomSwData::operator CustomSwData () return c9x; } -int8_t t_Th9xCustomSwData::fromSource(RawSource source) +int8_t t_Th9xLogicalSwitchData::fromSource(RawSource source) { int v1 = 0; if (source.type == SOURCE_TYPE_STICK) @@ -355,7 +216,7 @@ int8_t t_Th9xCustomSwData::fromSource(RawSource source) return v1; } -RawSource t_Th9xCustomSwData::toSource(int8_t value) +RawSource t_Th9xLogicalSwitchData::toSource(int8_t value) { if (value == 0) { return RawSource(SOURCE_TYPE_NONE); @@ -388,82 +249,12 @@ t_Th9xModelData::t_Th9xModelData() memset(this, 0, sizeof(t_Th9xModelData)); } -t_Th9xModelData::t_Th9xModelData(ModelData &c9x) -{ - memset(this, 0, sizeof(t_Th9xModelData)); - - if (c9x.used) { - setEEPROMString(name, c9x.name, sizeof(name)); - mdVers = MDVERS; - if (c9x.timers[0].mode == TMRMODE_ABS) - tmrMode = 1; - if (c9x.timers[0].mode == TMRMODE_THs) - tmrMode = 2; - if (c9x.timers[0].mode == TMRMODE_THp) - tmrMode = 3; - else - tmrMode = 0; - - // TODO tmrDir = c9x.timers[0].dir; - tmrVal = c9x.timers[0].val; - //protocol = c9x.protocol; - /* - ppmNCH = (c9x.moduleData[0].channelsCount - 8) / 2; - thrTrim = c9x.thrTrim; - thrExpo = c9x.thrExpo; - trimInc = c9x.trimInc; - ppmDelay = (c9x.moduleData[0].ppmDelay - 300) / 50; - for (unsigned int i=0; i 1=> 0=> !=> & | ^ int8_t val1; int8_t val2; - operator CustomSwData(); - t_Th9xCustomSwData() { memset(this, 0, sizeof(t_Th9xCustomSwData)); } - t_Th9xCustomSwData(CustomSwData &); + operator LogicalSwitchData(); + t_Th9xLogicalSwitchData() { memset(this, 0, sizeof(t_Th9xLogicalSwitchData)); } int8_t fromSource(RawSource source); RawSource toSource(int8_t value); -}) Th9xCustomSwData; +}) Th9xLogicalSwitchData; PACK(typedef struct t_Th9xTrimData { int8_t itrim:6; //trim index @@ -183,13 +173,10 @@ PACK(typedef struct t_Th9xModelData { int8_t curves3[TH9X_MAX_CURVES3][3]; // 9 new143 int8_t curves5[TH9X_MAX_CURVES5][5]; // 10 int8_t curves9[TH9X_MAX_CURVES9][9]; // 18 - Th9xCustomSwData switchTab[TH9X_MAX_SWITCHES];// + Th9xLogicalSwitchData switchTab[TH9X_MAX_SWITCHES];// Th9xTrimData trimData[NUM_STICKS]; // 3*4 -> 1*4 operator ModelData(); t_Th9xModelData(); - t_Th9xModelData(ModelData&); }) Th9xModelData; - #endif -/*eof*/ diff --git a/companion/src/firmwares/th9x/th9xinterface.cpp b/companion/src/firmwares/th9x/th9xinterface.cpp index 624b077a8..8e1b50866 100644 --- a/companion/src/firmwares/th9x/th9xinterface.cpp +++ b/companion/src/firmwares/th9x/th9xinterface.cpp @@ -19,6 +19,7 @@ #include "th9xeeprom.h" #include "th9xsimulator.h" #include "file.h" +#include "appdata.h" #define FILE_TYP_GENERAL 1 #define FILE_TYP_MODEL 2 @@ -44,8 +45,7 @@ const char * Th9xInterface::getName() const int Th9xInterface::getEEpromSize() { - QSettings settings("companion9x", "companion9x"); - QString avrMCU = settings.value("mcu", QString("m64")).toString(); + QString avrMCU = g.mcu(); if (avrMCU==QString("m128")) { return 2*EESIZE_STOCK; } @@ -62,7 +62,7 @@ bool Th9xInterface::loadxml(RadioData &radioData, QDomDocument &doc) return false; } -bool Th9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size) +bool Th9xInterface::load(RadioData &radioData, const uint8_t *eeprom, int size) { std::cout << "trying th9x import... "; @@ -71,7 +71,7 @@ bool Th9xInterface::load(RadioData &radioData, uint8_t *eeprom, int size) return false; } - if (!efile->EeFsOpen(eeprom, size, BOARD_STOCK)) { + if (!efile->EeFsOpen((uint8_t *)eeprom, size, BOARD_STOCK)) { std::cout << "wrong file system\n"; return false; } @@ -124,56 +124,20 @@ bool Th9xInterface::loadBackup(RadioData &radioData, uint8_t *eeprom, int esize, int Th9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t variant, uint8_t version) { - EEPROMWarnings.clear(); + std::cout << "NO!\n"; + // TODO a warning - efile->EeFsCreate(eeprom, getEEpromSize(), BOARD_STOCK); - - Th9xGeneral th9xGeneral(radioData.generalSettings); - int sz = efile->writeRlc2(FILE_GENERAL, FILE_TYP_GENERAL, (uint8_t*)&th9xGeneral, sizeof(Th9xGeneral)); - if(sz != sizeof(Th9xGeneral)) { - return 0; - } - - for (int i=0; iwriteRlc2(FILE_MODEL(i), FILE_TYP_MODEL, (uint8_t*)&th9xModel, sizeof(Th9xModelData)); - if(sz != sizeof(Th9xModelData)) { - return 0; - } - } - } - - return getEEpromSize(); + return 0; } int Th9xInterface::getSize(ModelData &model) { - if (model.isempty()) - return 0; - - uint8_t tmp[2*EESIZE_STOCK]; - efile->EeFsCreate(tmp, getEEpromSize(), BOARD_STOCK); - - Th9xModelData th9xModel(model); - int sz = efile->writeRlc2(0, FILE_TYP_MODEL, (uint8_t*)&th9xModel, sizeof(Th9xModelData)); - if(sz != sizeof(Th9xModelData)) { - return -1; - } - return efile->size(0); + return 0; } int Th9xInterface::getSize(GeneralSettings &settings) { - uint8_t tmp[2*EESIZE_STOCK]; - efile->EeFsCreate(tmp, getEEpromSize(), BOARD_STOCK); - - Th9xGeneral th9xGeneral(settings); - int sz = efile->writeRlc2(0, FILE_TYP_GENERAL, (uint8_t*)&th9xGeneral, sizeof(Th9xGeneral)); - if(sz != sizeof(th9xGeneral)) { - return -1; - } - return efile->size(0); + return 0; } int Th9xInterface::getCapability(const Capability capability) @@ -181,12 +145,6 @@ int Th9xInterface::getCapability(const Capability capability) switch (capability) { case Mixes: return TH9X_MAX_MIXERS; - case NumCurves3: - return TH9X_MAX_CURVES3; - case NumCurves5: - return TH9X_MAX_CURVES5; - case NumCurves9: - return TH9X_MAX_CURVES9; case OwnerName: return 0; case Timers: @@ -199,7 +157,7 @@ int Th9xInterface::getCapability(const Capability capability) return 9; case CustomFunctions: return 0; - case CustomSwitches: + case LogicalSwitches: return TH9X_MAX_SWITCHES; case Outputs: return 8; @@ -244,5 +202,5 @@ int Th9xInterface::isAvailable(Protocol proto, int port) SimulatorInterface * Th9xInterface::getSimulator() { - return new Th9xSimulator(this); + return NULL; // new Th9xSimulator(this); } diff --git a/companion/src/firmwares/th9x/th9xinterface.h b/companion/src/firmwares/th9x/th9xinterface.h index 6e0372107..9b63e7695 100644 --- a/companion/src/firmwares/th9x/th9xinterface.h +++ b/companion/src/firmwares/th9x/th9xinterface.h @@ -34,7 +34,7 @@ class Th9xInterface : public EEPROMInterface virtual const int getMaxModels(); - virtual bool load(RadioData &, uint8_t *eeprom, int size); + virtual bool load(RadioData &, const uint8_t *eeprom, int size); virtual bool loadBackup(RadioData &, uint8_t *eeprom, int esize, int index); diff --git a/companion/src/flashinterface.cpp b/companion/src/flashinterface.cpp index 86c677ef8..0b56cc795 100644 --- a/companion/src/flashinterface.cpp +++ b/companion/src/flashinterface.cpp @@ -52,7 +52,7 @@ FlashInterface::FlashInterface(QString fileName) char * bin_flash = (char *)malloc(MAX_FSIZE); flash_size = file.read(bin_flash, MAX_FSIZE); flash = QByteArray(bin_flash, flash_size); - free(bin_flash); + free(bin_flash); } else { flash = QByteArray(temp, flash_size); @@ -413,7 +413,7 @@ bool FlashInterface::setSplash(const QImage & newsplash) } } -uint FlashInterface::getSplashWidth() +int FlashInterface::getSplashWidth() { return splash_width; } diff --git a/companion/src/flashinterface.h b/companion/src/flashinterface.h index d7e6f0de9..eb1459d85 100644 --- a/companion/src/flashinterface.h +++ b/companion/src/flashinterface.h @@ -59,7 +59,7 @@ public: QImage getSplash(); bool setSplash(const QImage & newsplash); bool hasSplash(); - uint getSplashWidth(); + int getSplashWidth(); uint getSplashHeight(); uint getSplashColors(); QImage::Format getSplashFormat(); @@ -92,5 +92,5 @@ private: protected: bool isValidFlag; }; -#endif /* FLASHINTERFACE_H */ +#endif /* FLASHINTERFACE_H */ diff --git a/companion/src/fusesdialog.cpp b/companion/src/fusesdialog.cpp index 106bc0b85..aad4bdad5 100644 --- a/companion/src/fusesdialog.cpp +++ b/companion/src/fusesdialog.cpp @@ -1,13 +1,14 @@ #include "fusesdialog.h" #include "ui_fusesdialog.h" - #include "burnconfigdialog.h" +#include "helpers.h" fusesDialog::fusesDialog(QWidget *parent) : QDialog(parent), ui(new Ui::fusesDialog) { ui->setupUi(this); + this->setWindowIcon(CompanionIcon("fuses.png")); } fusesDialog::~fusesDialog() diff --git a/companion/src/fusesdialog.ui b/companion/src/fusesdialog.ui index e6b4acb92..f4ffe20bb 100644 --- a/companion/src/fusesdialog.ui +++ b/companion/src/fusesdialog.ui @@ -13,10 +13,6 @@ Fuses - - - :/images/fuses.png:/images/fuses.png - @@ -116,7 +112,7 @@ p, li { white-space: pre-wrap; } - + diff --git a/companion/src/fwpreferencesdialog.cpp b/companion/src/fwpreferencesdialog.cpp new file mode 100644 index 000000000..ec2585ddc --- /dev/null +++ b/companion/src/fwpreferencesdialog.cpp @@ -0,0 +1,323 @@ +#include "fwpreferencesdialog.h" +#include "ui_fwpreferencesdialog.h" +#include "mainwindow.h" +#include "eeprominterface.h" +#include "helpers.h" +#include "appdata.h" +#include +#include + +fwPreferencesDialog::fwPreferencesDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::fwPreferencesDialog), + updateLock(false) +{ + ui->setupUi(this); + setWindowIcon(CompanionIcon("fwpreferences.png")); + + QCheckBox * OptionCheckBox[]= { + ui->optionCheckBox_1, ui->optionCheckBox_2, ui->optionCheckBox_3, ui->optionCheckBox_4, ui->optionCheckBox_5, ui->optionCheckBox_6, ui->optionCheckBox_7, + ui->optionCheckBox_8, ui->optionCheckBox_9, ui->optionCheckBox_10, ui->optionCheckBox_11, ui->optionCheckBox_12, ui->optionCheckBox_13, ui->optionCheckBox_14, + ui->optionCheckBox_15,ui->optionCheckBox_16, ui->optionCheckBox_17, ui->optionCheckBox_18, ui->optionCheckBox_19, ui->optionCheckBox_20, ui->optionCheckBox_21, + ui->optionCheckBox_22, ui->optionCheckBox_23, ui->optionCheckBox_24, ui->optionCheckBox_25, ui->optionCheckBox_26, ui->optionCheckBox_27, ui->optionCheckBox_28, + ui->optionCheckBox_29, ui->optionCheckBox_30, ui->optionCheckBox_31, ui->optionCheckBox_32, ui->optionCheckBox_33, ui->optionCheckBox_34, ui->optionCheckBox_35, + ui->optionCheckBox_36, ui->optionCheckBox_37, ui->optionCheckBox_38, ui->optionCheckBox_39, ui->optionCheckBox_40, ui->optionCheckBox_41, ui->optionCheckBox_42, + NULL }; + + voice=NULL; + + connect(ui->langCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(firmwareLangChanged())); + connect(ui->voiceCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(firmwareLangChanged())); + + for (int i=0; OptionCheckBox[i]; i++) { + optionsCheckBoxes.push_back(OptionCheckBox[i]); + connect(OptionCheckBox[i], SIGNAL(toggled(bool)), this, SLOT(firmwareOptionChanged(bool))); + } + + initSettings(); + + connect(ui->downloadVerCB, SIGNAL(currentIndexChanged(int)), this, SLOT(baseFirmwareChanged())); + connect(this, SIGNAL(accepted()), this, SLOT(writeValues())); + + shrink(); +} + + +fwPreferencesDialog::~fwPreferencesDialog() +{ + delete ui; +} + +void fwPreferencesDialog::showVoice(bool show) +{ + if (show) + showVoice(); + else + hideVoice(); +} + +void fwPreferencesDialog::showVoice() +{ + ui->voiceLine->show(); + ui->voiceLabel->show(); + ui->voiceCombo->show(); + ui->voice_dnld->show(); +} + +void fwPreferencesDialog::hideVoice() +{ + ui->voiceLine->hide(); + ui->voiceLabel->hide(); + ui->voiceCombo->hide(); + ui->voice_dnld->hide(); + QTimer::singleShot(0, this, SLOT(shrink())); +} + +void fwPreferencesDialog::shrink() +{ + resize(0,0); +} + +void fwPreferencesDialog::baseFirmwareChanged() +{ + QVariant selected_firmware = ui->downloadVerCB->itemData(ui->downloadVerCB->currentIndex()); + voice=NULL; + foreach(FirmwareInfo * firmware, firmwares) { + if (firmware->id == selected_firmware) { + showVoice(firmware->voice); + populateFirmwareOptions(firmware); + break; + } + } + firmwareChanged(); +} + +FirmwareVariant fwPreferencesDialog::getFirmwareVariant() +{ + QVariant selected_firmware = ui->downloadVerCB->itemData(ui->downloadVerCB->currentIndex()); + bool voice=false; + foreach(FirmwareInfo * firmware, firmwares) { + if (firmware->id == selected_firmware) { + QString id = firmware->id; + foreach(QCheckBox *cb, optionsCheckBoxes) { + if (cb->isChecked()) { + if (cb->text()=="voice" && cb->isChecked()) + voice=true; + id += QString("-") + cb->text(); + } + } + if (! firmware->eepromInterface->getCapability(MultiLangVoice)) { + if (ui->voiceCombo->count() && (voice || firmware->voice)) + id += QString("-tts") + ui->voiceCombo->currentText(); + } + if (ui->langCombo->count()) + id += QString("-") + ui->langCombo->currentText(); + + return GetFirmwareVariant(id); + } + } + + // Should never occur... + return default_firmware_variant; +} + +void fwPreferencesDialog::firmwareOptionChanged(bool state) +{ + QCheckBox *cb = qobject_cast(sender()); + FirmwareInfo * firmware=NULL; + if (cb && state) { + QVariant selected_firmware = ui->downloadVerCB->itemData(ui->downloadVerCB->currentIndex()); + foreach(firmware, firmwares) { + if (firmware->id == selected_firmware) { + foreach(QList