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

Merge branch 'next' of https://github.com/opentx/opentx into kilrah/Bootloader

This commit is contained in:
Andre Bernet 2014-03-17 20:32:11 +01:00
commit de073a25ea
82 changed files with 10296 additions and 9131 deletions

View file

@ -331,3 +331,18 @@ Francisco Gutierrez Muñoz
Steve Coley
Sean Cull
Roberto Orsello
David Finger
FrSky - www.frsky-rc.com
Jean-Marie Oddo
Mike Matheny
Glen Roe (Showmaster)
Arron Bates
Tim Spurr
Daniel Morgan
Trent Ready
Mark Maskiell
Robert Crockford
Mark Illum
David McGuire
Martyn Coles

View file

@ -1,7 +1,7 @@
PROJECT( companion )
SET( C9X_VERSION_MAJOR "1" )
SET( C9X_VERSION_MINOR "52" )
SET( C9X_VERSION_MINOR "99" )
SET( C9X_VERSION ${C9X_VERSION_MAJOR}.${C9X_VERSION_MINOR} )
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
@ -36,7 +36,7 @@ ELSE()
MESSAGE( "SDL not found! Joysticks support will be disabled" )
ENDIF()
FIND_PACKAGE( Qt4 REQUIRED )
FIND_PACKAGE(Qt4 4.8.4 REQUIRED)
SET( QT_USE_QTNETWORK True )
SET( QT_USE_QTXML True )
INCLUDE( ${QT_USE_FILE} )
@ -90,6 +90,13 @@ add_custom_command(
WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
)
add_custom_command(
OUTPUT ${RADIO_SRC_DIRECTORY}/stamp-opentx.h
COMMAND make stamp_header
DEPENDS ${RADIO_SRC_DIRECTORY}/Makefile
WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
)
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${PROJECT_SOURCE_DIR}/../..
@ -128,6 +135,7 @@ set(companion_SRCS
firmwares/opentx/opentxsimulator.cpp
firmwares/ersky9x/ersky9xeeprom.cpp
firmwares/ersky9x/ersky9xinterface.cpp
${RADIO_SRC_DIRECTORY}/stamp-opentx.h
${RADIO_SRC_DIRECTORY}/bitmaps/sticks.lbm
${RADIO_SRC_DIRECTORY}/translations/en.h
appdata.cpp

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>685</width>
<height>462</height>
<width>734</width>
<height>492</height>
</rect>
</property>
<property name="sizePolicy">
@ -18,7 +18,7 @@
</property>
<property name="minimumSize">
<size>
<width>685</width>
<width>0</width>
<height>0</height>
</size>
</property>
@ -47,450 +47,9 @@
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="applicationTab">
<attribute name="title">
<string>Application Settings</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<item row="11" column="1" colspan="4">
<widget class="Line" name="line_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Automatic Backup Folder</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="historySize">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>40</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>50</width>
<height>16777215</height>
</size>
</property>
<property name="maximum">
<number>15</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="label_9">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>User Splash Screens</string>
</property>
</widget>
</item>
<item row="12" column="1">
<widget class="QComboBox" name="splashincludeCB">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Only show user splash images</string>
</property>
</item>
<item>
<property name="text">
<string>Show user and companion splash images</string>
</property>
</item>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="ge_label">
<property name="text">
<string>Google Earth Executable</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="startupCheck_fw">
<property name="text">
<string>Automatic check for OpenTX firmware updates</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QLineEdit" name="backupPath">
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="13" column="4">
<widget class="QPushButton" name="libraryPathButton">
<property name="text">
<string>Open Folder</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="4">
<widget class="Line" name="line_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="ge_lineedit">
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="ge_pathButton">
<property name="text">
<string>Find Executable</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Files to keep</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="label_10">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Splash Screen Library</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QCheckBox" name="backupEnable">
<property name="text">
<string>Enable automatic backup before writing firmware</string>
</property>
</widget>
</item>
<item row="9" column="4">
<widget class="QPushButton" name="backupPathButton">
<property name="text">
<string>Open Folder</string>
</property>
</widget>
</item>
<item row="14" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1" colspan="4">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="startupCheck_companion9x">
<property name="text">
<string>Automatic check for Companion updates</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="8" column="1" colspan="4">
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QCheckBox" name="wizardEnable_ChkB">
<property name="text">
<string>Offer to use wizard for new models</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="showSplash">
<property name="text">
<string>Show splash screen when Companion starts</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="3">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="13" column="1">
<widget class="QLineEdit" name="libraryPath">
<property name="enabled">
<bool>true</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="simulatorTab">
<attribute name="title">
<string>Simulator Settings</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Simulator BackLight</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QCheckBox" name="joystickChkB">
<property name="text">
<string>Enable</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="snapshotPathButton">
<property name="text">
<string>Open Folder</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="3">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="backLightColor">
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<item>
<property name="text">
<string>Blue</string>
</property>
</item>
<item>
<property name="text">
<string>Green</string>
</property>
</item>
<item>
<property name="text">
<string>Red</string>
</property>
</item>
<item>
<property name="text">
<string>Orange</string>
</property>
</item>
<item>
<property name="text">
<string>Yellow</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_11">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Joystick</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="snapshotClipboardCKB">
<property name="text">
<string>Only capture to clipboard</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="joystickCB">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QPushButton" name="joystickcalButton">
<property name="text">
<string>Calibrate</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="simuSW">
<property name="text">
<string>Remember simulator switch values</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Simulator capture folder</string>
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="snapshotPath">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="profileTab">
<attribute name="title">
<string>Radio Settings Profile</string>
<string>Radio Profile</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="10" column="1" colspan="3">
@ -804,19 +363,6 @@ This is used by the templated to determine which channel goes to what number out
</property>
</widget>
</item>
<item row="2" column="4">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="14" column="1" colspan="3">
<widget class="QCheckBox" name="burnFirmware">
<property name="text">
@ -867,6 +413,13 @@ This is used by the templated to determine which channel goes to what number out
</property>
</widget>
</item>
<item row="7" column="5">
<widget class="QPushButton" name="clearImageButton">
<property name="text">
<string>Clear Image</string>
</property>
</widget>
</item>
<item row="4" column="5">
<widget class="QPushButton" name="SplashSelect">
<property name="text">
@ -881,13 +434,6 @@ This is used by the templated to determine which channel goes to what number out
</property>
</widget>
</item>
<item row="7" column="5">
<widget class="QPushButton" name="clearImageButton">
<property name="text">
<string>Clear Image</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="5">
<widget class="Line" name="line_3">
<property name="orientation">
@ -938,7 +484,7 @@ This is used by the templated to determine which channel goes to what number out
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>1</number>
<number>0</number>
</property>
<property name="text">
<string/>
@ -987,6 +533,434 @@ This is used by the templated to determine which channel goes to what number out
</item>
</widget>
</item>
<item row="2" column="4">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="applicationTab">
<attribute name="title">
<string>Application Settings</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<item row="9" column="2">
<widget class="QPushButton" name="backupPathButton">
<property name="text">
<string>Open Folder</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="2">
<widget class="Line" name="line_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Automatic Backup Folder</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="historySize">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>40</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>50</width>
<height>16777215</height>
</size>
</property>
<property name="maximum">
<number>15</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="label_9">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>User Splash Screens</string>
</property>
</widget>
</item>
<item row="12" column="1">
<widget class="QComboBox" name="splashincludeCB">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Only show user splash images</string>
</property>
</item>
<item>
<property name="text">
<string>Show user and companion splash images</string>
</property>
</item>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="ge_label">
<property name="text">
<string>Google Earth Executable</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="startupCheck_fw">
<property name="text">
<string>Automatic check for OpenTX firmware updates</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QLineEdit" name="backupPath">
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="13" column="2">
<widget class="QPushButton" name="libraryPathButton">
<property name="text">
<string>Open Folder</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="Line" name="line_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="ge_lineedit">
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="ge_pathButton">
<property name="text">
<string>Find Executable</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Files to keep</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="label_10">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Splash Screen Library</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QCheckBox" name="backupEnable">
<property name="text">
<string>Enable automatic backup before writing firmware</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="startupCheck_companion9x">
<property name="text">
<string>Automatic check for Companion updates</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="8" column="1" colspan="2">
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QCheckBox" name="wizardEnable_ChkB">
<property name="text">
<string>Offer to use wizard for new models</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="showSplash">
<property name="text">
<string>Show splash screen when Companion starts</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QLineEdit" name="libraryPath">
<property name="enabled">
<bool>true</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="14" column="1" colspan="2">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="simulatorTab">
<attribute name="title">
<string>Simulator Settings</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Simulator BackLight</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QCheckBox" name="joystickChkB">
<property name="text">
<string>Enable</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="snapshotPathButton">
<property name="text">
<string>Open Folder</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="backLightColor">
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<item>
<property name="text">
<string>Blue</string>
</property>
</item>
<item>
<property name="text">
<string>Green</string>
</property>
</item>
<item>
<property name="text">
<string>Red</string>
</property>
</item>
<item>
<property name="text">
<string>Orange</string>
</property>
</item>
<item>
<property name="text">
<string>Yellow</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_11">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Joystick</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="snapshotClipboardCKB">
<property name="text">
<string>Only capture to clipboard</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="joystickCB">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QPushButton" name="joystickcalButton">
<property name="text">
<string>Calibrate</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="simuSW">
<property name="text">
<string>Remember simulator switch values</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Simulator capture folder</string>
</property>
</widget>
</item>
<item row="6" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="snapshotPath">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="3">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>

View file

@ -15,6 +15,7 @@ burnConfigDialog::burnConfigDialog(QWidget *parent) :
ui(new Ui::burnConfigDialog)
{
ui->setupUi(this);
setWindowIcon(CompanionIcon("configure.png"));
ui->avrdude_programmer->model()->sort(0);
getSettings();

View file

@ -18,6 +18,7 @@ burnDialog::burnDialog(QWidget *parent, int Type, QString * fileName, bool * bac
hexType(Type)
{
ui->setupUi(this);
setWindowIcon(CompanionIcon("write_flash.png"));
if(!g.profile[g.id()].splashFile().isEmpty()){
imageSource=PROFILE;

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>440</width>
<height>423</height>
<width>399</width>
<height>564</height>
</rect>
</property>
<property name="sizePolicy">
@ -18,7 +18,7 @@
</property>
<property name="minimumSize">
<size>
<width>440</width>
<width>0</width>
<height>0</height>
</size>
</property>
@ -171,6 +171,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -254,8 +260,8 @@
<item row="0" column="0">
<layout class="QGridLayout" name="SplashLayout" rowstretch="0,0,0,0,0,0,0">
<item row="0" column="1" rowspan="7">
<layout class="QGridLayout" name="gridLayout_2" rowstretch="1">
<item row="0" column="1">
<layout class="QGridLayout" name="gridLayout_2" rowstretch="0">
<item row="0" column="0">
<widget class="QLabel" name="imageLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
@ -271,8 +277,8 @@
</property>
<property name="maximumSize">
<size>
<width>212</width>
<height>64</height>
<width>214</width>
<height>66</height>
</size>
</property>
<property name="frameShape">
@ -281,6 +287,9 @@
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="text">
<string/>
</property>
@ -289,32 +298,6 @@
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="2" column="0">

View file

@ -142,7 +142,7 @@ customizeSplashDialog::customizeSplashDialog(QWidget *parent) :
ui(new Ui::customizeSplashDialog)
{
ui->setupUi(this);
this->setWindowIcon(CompanionIcon("paint.png"));
setWindowIcon(CompanionIcon("paintbrush.png"));
ui->leftLibraryButton->setIcon(CompanionIcon("library.png"));
ui->rightLibraryButton->setIcon(CompanionIcon("library.png"));

View file

@ -10,7 +10,7 @@
<x>0</x>
<y>0</y>
<width>1087</width>
<height>285</height>
<height>298</height>
</rect>
</property>
<property name="sizePolicy">
@ -165,6 +165,9 @@
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="text">
<string/>
</property>
@ -470,6 +473,9 @@
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="text">
<string/>
</property>

View file

@ -2,6 +2,7 @@
#include "ui_downloaddialog.h"
#include <QMessageBox>
#include <QtGui>
#include <QTime>
#include "helpers.h"
downloadDialog::downloadDialog(QWidget *parent, QString src, QString tgt) :
@ -87,3 +88,14 @@ void downloadDialog::fileError()
file = 0;
reject();
}
void downloadDialog::closeEvent( QCloseEvent * event)
{
// Delay closing 2 seconds to avoid unpleasant flashing download dialogs
QTime closeTime= QTime::currentTime().addSecs(2);
while( QTime::currentTime() < closeTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
event->accept();
}

View file

@ -27,6 +27,7 @@ private slots:
void updateDataReadProgress(qint64 bytesRead, qint64 totalBytes);
private:
void closeEvent( QCloseEvent * event);
Ui::downloadDialog *ui;
QNetworkAccessManager qnam;

View file

@ -126,11 +126,14 @@ RawSourceRange RawSource::getRange(bool singleprec)
result.max = singleprec ? 1540 : 3000;
break;
case TELEMETRY_SOURCE_T1:
case TELEMETRY_SOURCE_T1_MAX:
case TELEMETRY_SOURCE_T2:
case TELEMETRY_SOURCE_T2_MAX:
result.min = -30;
result.max = 225;
break;
case TELEMETRY_SOURCE_RPM:
case TELEMETRY_SOURCE_RPM_MAX:
result.step = singleprec ? 50 : 1;
result.max = singleprec ? 12750 : 20000;
break;
@ -138,6 +141,7 @@ RawSourceRange RawSource::getRange(bool singleprec)
result.max = 100;
break;
case TELEMETRY_SOURCE_SPEED:
case TELEMETRY_SOURCE_SPEED_MAX:
result.step = singleprec ? 4 : 1;
result.max = singleprec ? 944 : 2000;
if (model && !model->frsky.imperial) {
@ -146,21 +150,26 @@ RawSourceRange RawSource::getRange(bool singleprec)
}
break;
case TELEMETRY_SOURCE_DIST:
case TELEMETRY_SOURCE_DIST_MAX:
result.step = singleprec ? 8 : 1;
result.max = singleprec ? 2040 : 10000;
break;
case TELEMETRY_SOURCE_CELL:
case TELEMETRY_SOURCE_CELL_MIN:
result.step = singleprec ? 0.02 : 0.01;
result.max = 5.1;
result.decimals = 2;
break;
case TELEMETRY_SOURCE_CELLS_SUM:
case TELEMETRY_SOURCE_CELLS_MIN:
case TELEMETRY_SOURCE_VFAS:
case TELEMETRY_SOURCE_VFAS_MIN:
result.step = 0.1;
result.max = 25.5;
result.decimals = 1;
break;
case TELEMETRY_SOURCE_CURRENT:
case TELEMETRY_SOURCE_CURRENT_MAX:
result.step = singleprec ? 0.5 : 0.1;
result.max = singleprec ? 127.5 : 200.0;
result.decimals = 1;
@ -170,6 +179,7 @@ RawSourceRange RawSource::getRange(bool singleprec)
result.max = singleprec ? 5100 : 10000;
break;
case TELEMETRY_SOURCE_POWER:
case TELEMETRY_SOURCE_POWER_MAX:
result.step = singleprec ? 5 : 1;
result.max = singleprec ? 1275 : 2000;
break;
@ -221,12 +231,12 @@ QString RawSource::toString()
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("Cell"), QObject::tr("Cells"), 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("Alt-"), QObject::tr("Alt+"), QObject::tr("Rpm+"), QObject::tr("T1+"), QObject::tr("T2+"), QObject::tr("Speed+"), QObject::tr("Dist+"),
QObject::tr("Cell-"), QObject::tr("Cells-"), QObject::tr("Vfas-"), QObject::tr("Curr+"), QObject::tr("Powr+"),
QObject::tr("ACC"), QObject::tr("Time"),
};

View file

@ -217,6 +217,7 @@ enum TelemetrySource {
TELEMETRY_SOURCE_CELL_MIN,
TELEMETRY_SOURCE_CELLS_MIN,
TELEMETRY_SOURCE_VFAS_MIN,
TELEMETRY_SOURCE_CURRENT_MAX,
TELEMETRY_SOURCE_POWER_MAX,
TELEMETRY_SOURCE_ACC,
TELEMETRY_SOURCE_GPS_TIME,

View file

@ -54,6 +54,7 @@
#define GPS
#define FAI_CHOICE
#define NUM_POTS 3
#define EEPROM_VARIANT 3
#undef min

View file

@ -54,6 +54,8 @@
#define LUA_MODEL_SCRIPTS
#define EEPROM_VARIANT 3
#define NUM_POTS 5
#undef min
#undef max
@ -153,9 +155,6 @@ int16_t g_anas[NUM_STICKS+5];
uint16_t anaIn(uint8_t chan)
{
if (chan == 8)
return 1800;
else
return g_anas[chan];
}

View file

@ -384,8 +384,12 @@ class TelemetrySourcesConversionTable: public ConversionTable {
addConversion(1+TELEMETRY_SOURCE_T2_MAX, val++);
addConversion(1+TELEMETRY_SOURCE_SPEED_MAX, val++);
addConversion(1+TELEMETRY_SOURCE_DIST_MAX, val++);
if (version >= 216) {
addConversion(1+TELEMETRY_SOURCE_CELL_MIN, val++);
addConversion(1+TELEMETRY_SOURCE_CELLS_MIN, val++);
addConversion(1+TELEMETRY_SOURCE_VFAS_MIN, val++);
}
addConversion(1+TELEMETRY_SOURCE_CURRENT_MAX, val++);
addConversion(1+TELEMETRY_SOURCE_POWER_MAX, val++);
if (IS_ARM(board) && version >= 216) {
for (int i=0; i<5; i++)
@ -1008,11 +1012,17 @@ class InputField: public TransformedField {
virtual void afterImport()
{
if (IS_TARANIS(board) && version < 216) {
if (IS_TARANIS(board)) {
if (version < 216) {
if (expo.mode) {
expo.srcRaw = RawSource(SOURCE_TYPE_STICK, expo.chn);
}
}
else {
if (expo.srcRaw.type != SOURCE_TYPE_NONE)
expo.mode = 3;
}
}
expo.weight = smallGvarToC9x(_weight);

View file

@ -53,6 +53,8 @@
#define EEPROM_VARIANT SIMU_STOCK_VARIANTS
#define GAUGES
#define NUM_POTS 3
#undef min
#undef max

View file

@ -95,31 +95,6 @@ void populateRotEncCB(QComboBox *b, int value, int renumber)
b->setCurrentIndex(value);
}
void populateCustomScreenFieldCB(QComboBox *b, unsigned int value, bool last=false, int hubproto=0)
{
int telem_hub[] = {0,0,0,0,0,0,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,2,2,1,1,1,1,1,1};
b->clear();
b->addItem(RawSource(SOURCE_TYPE_NONE, 0).toString());
for (unsigned int i = 0; i <= (last ? TELEMETRY_SOURCES_DISPLAY_COUNT : TELEMETRY_SOURCES_STATUS_COUNT); i++) {
b->addItem(RawSource(SOURCE_TYPE_TELEMETRY, i).toString());
if (!(i>=sizeof(telem_hub)/sizeof(int) || telem_hub[i]==0 || ((telem_hub[i]>=hubproto) && hubproto!=0))) {
QModelIndex index = b->model()->index(i, 0);
QVariant v(0);
b->model()->setData(index, v, Qt::UserRole - 1);
}
}
if (value>=sizeof(telem_hub)/sizeof(int))
b->setCurrentIndex(0);
else if (telem_hub[value]==0 || ((telem_hub[value]>=hubproto) && hubproto!=0)) {
b->setCurrentIndex(value);
}
b->setMaxVisibleItems(10);
}
QString getProtocolStr(const int proto)
{
static const char *strings[] = { "OFF",

View file

@ -88,7 +88,6 @@ void populateSwitchCB(QComboBox *b, const RawSwitch & value, unsigned long attr=
void populatePhasesCB(QComboBox *b, int value);
void populateGvarUseCB(QComboBox *b, unsigned int phase);
void populateCustomScreenFieldCB(QComboBox *b, unsigned int value, bool last, int hubproto);
QString getProtocolStr(const int proto);
QString getPhasesStr(unsigned int phases, ModelData & model);

View file

@ -222,7 +222,7 @@ void MainWindow::checkForUpdates(bool ignoreSettings, QString & fwId)
if(ignoreSettings) {
downloadDialog_forWait = new downloadDialog(this, tr("Checking for updates"));
downloadDialog_forWait->show();
downloadDialog_forWait->exec();
} else {
downloadDialog_forWait = NULL; // TODO needed?
}
@ -272,7 +272,7 @@ void MainWindow::checkForUpdateFinished(QNetworkReply * reply)
downloadDialog * dd = new downloadDialog(this, QString(OPENTX_COMPANION_DOWNLOADS C9X_INSTALLER).arg(version), fileName);
installer_fileName = fileName;
connect(dd, SIGNAL(accepted()), this, SLOT(updateDownloaded()));
dd->show();
dd->exec();
}
}
#else
@ -1530,7 +1530,7 @@ MdiChild *MainWindow::createMdiChild()
return child;
}
QAction * MainWindow::addAct(QString icon, QString sName, QString lName, QKeySequence::StandardKey shortcut, const char *slot)
QAction * MainWindow::addAct(QString icon, QString sName, QString lName, QKeySequence::StandardKey shortcut, const char *slot, QObject *slotObj)
{
QAction * newAction = new QAction( this );
if (!icon.isEmpty())
@ -1541,7 +1541,9 @@ QAction * MainWindow::addAct(QString icon, QString sName, QString lName, QKeySeq
newAction->setStatusTip(lName);
if (shortcut != 0)
newAction->setShortcuts(shortcut);
connect(newAction, SIGNAL(triggered()), this, slot);
if (slotObj == NULL)
slotObj = this;
connect(newAction, SIGNAL(triggered()), slotObj, slot);
return newAction;
}
@ -1584,7 +1586,7 @@ void MainWindow::createActions()
openAct = addAct("open.png", tr("Open Models+Settings..."), tr("Open Models and Settings file"), QKeySequence::Open, SLOT(openFile()));
saveAct = addAct("save.png", tr("Save Models+Settings..."), tr("Save Models and Settings file"), QKeySequence::Save, SLOT(save()));
saveAsAct = addAct("saveas.png", tr("Save Models+Settings as..."), tr("Save Models and Settings file"), QKeySequence::SaveAs, SLOT(saveAs()));
exitAct = addAct("exit.png", tr("Exit"), tr("Exit the application"), QKeySequence::Quit, SLOT(newFile()));
exitAct = addAct("exit.png", tr("Exit"), tr("Exit the application"), QKeySequence::Quit, SLOT(closeAllWindows()), qApp);
cutAct = addAct("cut.png", tr("Cut Model"), tr("Cut current model to the clipboard"), QKeySequence::Cut, SLOT(cut()));
copyAct = addAct("copy.png", tr("Copy Model..."), tr("Copy current model to the clipboard"), QKeySequence::Copy, SLOT(copy()));
pasteAct = addAct("paste.png", tr("Paste Model..."), tr("Paste model from clipboard"), QKeySequence::Paste, SLOT(paste()));

View file

@ -49,7 +49,7 @@
#include "eeprominterface.h"
#define SPLASH_TIME 5
#define MAX_RECENT 10
#define MAX_RECENT 15
#define MAX_PROFILES 15
class MdiChild;
@ -158,7 +158,7 @@ private slots:
private:
void createActions();
QAction * addAct(QString, QString, QString, QKeySequence::StandardKey, const char *);
QAction * addAct(QString, QString, QString, QKeySequence::StandardKey, const char *, QObject *slotObj=NULL);
QAction * addAct(QActionGroup *, QString, QString, const char *);
QAction * addAct(QString, QString, QString, const char *);

View file

@ -161,6 +161,12 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData & model,
connect(fswtchParamArmT[i], SIGNAL(editTextChanged ( const QString)), this, SLOT(customFunctionEdited()));
#ifdef PHONON
phononLock=false;
clickObject = new Phonon::MediaObject(this);
clickOutput = new Phonon::AudioOutput(Phonon::NoCategory, this);
Phonon::createPath(clickObject, clickOutput);
connect(clickObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(mediaPlayer_state(Phonon::State,Phonon::State)));
playBT[i] = new QPushButton(this);
playBT[i]->setProperty("index", i);
playBT[i]->setProperty("state", "play");
@ -203,6 +209,7 @@ void CustomFunctionsPanel::mediaPlayer_state(Phonon::State newState, Phonon::Sta
clickObject->clearQueue();
clickObject->clear();
for (int i=0; i<GetEepromInterface()->getCapability(CustomFunctions); i++) {
playBT[i]->setProperty("state", "play");
playBT[i]->setObjectName(QString("play_%1").arg(i));
playBT[i]->setIcon(CompanionIcon("play.png"));
}

View file

@ -3,11 +3,12 @@
#include "eeprominterface.h"
#include "helpers.h"
ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, int stickMode) :
ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, int stickMode, char * inputName) :
QDialog(parent),
ui(new Ui::ExpoDialog),
model(model),
ed(expoData)
ed(expoData),
inputName(inputName)
{
ui->setupUi(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 };
@ -76,7 +77,7 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, i
}
ui->inputName->setValidator(new QRegExpValidator(rx, this));
ui->inputName->setText(model.inputNames[ed->chn]);
ui->inputName->setText(inputName);
ui->lineName->setValidator(new QRegExpValidator(rx, this));
ui->lineName->setText(ed->name);
@ -93,6 +94,8 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, i
for (int i=0; i<9; i++) {
connect(cb_fp[i], SIGNAL(toggled(bool)), this, SLOT(valuesChanged()));
}
if (GetEepromInterface()->getCapability(VirtualInputs))
connect(ui->inputName, SIGNAL(editingFinished()), this, SLOT(valuesChanged()));
QTimer::singleShot(0, this, SLOT(shrink()));
}
@ -137,7 +140,7 @@ void ExpoDialog::valuesChanged()
ed->mode = ui->sideCB->currentIndex() + 1;
strcpy(ed->name, ui->lineName->text().toAscii().data());
strcpy(model.inputNames[ed->chn], ui->inputName->text().toAscii().data());
strcpy(inputName, ui->inputName->text().toAscii().data());
ed->phases=0;
for (int i=8; i>=0 ; i--) {

View file

@ -14,7 +14,7 @@ namespace Ui {
class ExpoDialog : public QDialog {
Q_OBJECT
public:
ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expodata, int stickMode);
ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expodata, int stickMode, char * inputName);
~ExpoDialog();
protected:
@ -28,6 +28,7 @@ class ExpoDialog : public QDialog {
Ui::ExpoDialog * ui;
ModelData & model;
ExpoData * ed;
char * inputName;
GVarGroup * gvGroup;
CurveGroup * curveGroup;
};

View file

@ -194,33 +194,29 @@ void FlightMode::update()
for (int i=0; i<gvCount; i++) {
gvNames[i]->setText(model.gvars_names[i]);
if (phase.gvars[i] < 1024) {
gvValues[i]->setValue(phase.gvars[i]);
gvValues[i]->setDisabled(false);
}
else {
int idx = phase.gvars[i] - 1025;
if (idx >= i) idx++;
// TODO no!!!!
PhaseData *phasegvar = &model.phaseData[idx];
gvValues[i]->setValue(phasegvar->gvars[i]);
int idx = phase.gvars[i];
PhaseData *phasegvar = &phase;
while (idx >= 1024) {
idx -= 1025;
phasegvar = &model.phaseData[idx];
idx = phasegvar->gvars[i];
gvValues[i]->setDisabled(true);
}
gvValues[i]->setValue(phasegvar->gvars[i]);
}
for (int i=0; i<reCount; i++) {
if (phase.rotaryEncoders[i] < 1024) {
reValues[i]->setValue(phase.rotaryEncoders[i]);
reValues[i]->setDisabled(false);
}
else {
int idx = phase.rotaryEncoders[i] - 1025;
if (idx >= i) idx++;
// TODO no!!!!
PhaseData *phasere = &model.phaseData[idx];
reValues[i]->setValue(phasere->rotaryEncoders[i]);
int idx = phase.rotaryEncoders[i];
PhaseData *phasere = &phase;
while (idx >= 1024) {
idx -= 1025;
phasere = &model.phaseData[idx];
idx = phasere->rotaryEncoders[i];
reValues[i]->setDisabled(true);
}
reValues[i]->setValue(phasere->rotaryEncoders[i]);
}
}
@ -311,21 +307,12 @@ void FlightMode::phaseGVUse_currentIndexChanged(int index)
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
int gvar = comboBox->property("index").toInt();
if (index == 0) {
int value = phase.gvars[gvar];
if (value>1024) {
value=0;
}
gvValues[gvar]->setValue(value);
gvValues[gvar]->setEnabled(true);
phase.gvars[gvar]=value;
phase.gvars[gvar]=0;
}
else {
phase.gvars[gvar] = 1024+index;
// TOTO it's wrong!!!
int value = model.phaseData[index + (index>phaseIdx ? 0 :-1)].gvars[gvar];
gvValues[gvar]->setValue(value);
gvValues[gvar]->setDisabled(true);
}
update();
emit modified();
lock = false;
}
@ -348,21 +335,12 @@ void FlightMode::phaseREUse_currentIndexChanged(int index)
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
int re = comboBox->property("index").toInt();
if (index == 0) {
// TODO no!!!
int value = phase.rotaryEncoders[re];
if (value > 1024) {
value = 0;
}
reValues[re]->setValue(value);
reValues[re]->setEnabled(true);
phase.rotaryEncoders[re] = value;
phase.rotaryEncoders[re] = 0;
}
else {
phase.rotaryEncoders[re] = 1024 + index;
int value = model.phaseData[index + (index>phaseIdx ? 0 :-1)].rotaryEncoders[re];
reValues[re]->setValue(value);
reValues[re]->setDisabled(true) ;
phase.rotaryEncoders[re] = 1024 + index; ;
}
update();
lock = false;
emit modified();
}

View file

@ -169,12 +169,18 @@ void InputsPanel::gm_openExpo(int index)
if(index<0 || index>=C9X_MAX_EXPOS) return;
ExpoData mixd(model.expoData[index]);
char inputName[4+1];
emit modified();
update();
ExpoDialog *g = new ExpoDialog(this, model, &mixd, generalSettings.stickMode);
if (GetEepromInterface()->getCapability(VirtualInputs))
strcpy(inputName, model.inputNames[mixd.chn]);
ExpoDialog *g = new ExpoDialog(this, model, &mixd, generalSettings.stickMode, inputName);
if (g->exec()) {
model.expoData[index] = mixd;
if (GetEepromInterface()->getCapability(VirtualInputs))
strcpy(model.inputNames[mixd.chn], inputName);
emit modified();
update();
}

View file

@ -22,6 +22,7 @@ ModelEdit::ModelEdit(RadioData & radioData, int modelId, bool openWizard, bool i
generalSettings(radioData.generalSettings)
{
ui->setupUi(this);
setWindowIcon(CompanionIcon("edit.png"));
restoreGeometry(g.modelEditGeo());
ui->pushButton->setIcon(CompanionIcon("simulate.png"));
addTab(new Setup(this, model), tr("Setup"));

View file

@ -28,10 +28,20 @@ TelemetryAnalog::TelemetryAnalog(QWidget *parent, FrSkyChannelData & analog):
update();
ui->UnitCB->setCurrentIndex(analog.type);
if (!IS_TARANIS(GetEepromInterface()->getBoard())) {
ui->alarm1LevelCB->setCurrentIndex(analog.alarms[0].level);
ui->alarm1GreaterCB->setCurrentIndex(analog.alarms[0].greater);
ui->alarm2LevelCB->setCurrentIndex(analog.alarms[1].level);
ui->alarm2GreaterCB->setCurrentIndex(analog.alarms[1].greater);
}
else {
ui->alarm1LevelCB->hide();
ui->alarm2LevelCB->hide();
ui->alarm1GreaterCB->hide();
ui->alarm2GreaterCB->hide();
ui->alarm1Label->setText(tr("Low Alarm"));
ui->alarm2Label->setText(tr("Critical Alarm"));
}
if (!(GetEepromInterface()->getCapability(Telemetry) & TM_HASOFFSET)) {
ui->CalibSB->hide();
@ -281,7 +291,7 @@ TelemetryCustomScreen::TelemetryCustomScreen(QWidget *parent, ModelData & model,
for (int c=0; c<GetEepromInterface()->getCapability(TelemetryCustomScreensFieldsPerLine); c++) {
fieldsCB[l][c] = new QComboBox(this);
fieldsCB[l][c]->setProperty("index", c + (l<<8));
populateCustomScreenFieldCB(fieldsCB[l][c], screen.body.lines[l].source[c], (l<4), model.frsky.usrProto);
populateTelemetrySourceCB(fieldsCB[l][c], screen.body.lines[l].source[c], l==3, model.frsky.usrProto);
ui->screenNumsLayout->addWidget(fieldsCB[l][c], l, c, 1, 1);
connect(fieldsCB[l][c], SIGNAL(currentIndexChanged(int)), this, SLOT(customFieldChanged(int)));
}
@ -290,7 +300,7 @@ TelemetryCustomScreen::TelemetryCustomScreen(QWidget *parent, ModelData & model,
for (int l=0; l<4; l++) {
barsCB[l] = new QComboBox(this);
barsCB[l]->setProperty("index", l);
populateCustomScreenFieldCB(barsCB[l], screen.body.bars[l].source, false, model.frsky.usrProto);
populateTelemetrySourceCB(barsCB[l], screen.body.bars[l].source, false, model.frsky.usrProto);
connect(barsCB[l], SIGNAL(currentIndexChanged(int)), this, SLOT(barSourceChanged(int)));
ui->screenBarsLayout->addWidget(barsCB[l], l, 0, 1, 1);
@ -316,6 +326,31 @@ TelemetryCustomScreen::TelemetryCustomScreen(QWidget *parent, ModelData & model,
update();
}
void TelemetryCustomScreen::populateTelemetrySourceCB(QComboBox *b, unsigned int value, bool last, int hubproto)
{
int telem_hub[] = {0,0,0,0,0,0,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,2,2,1,1,1,1,1,1};
b->clear();
b->addItem(RawSource(SOURCE_TYPE_NONE, 0).toString());
for (unsigned int i = 0; i < (last ? TELEMETRY_SOURCES_STATUS_COUNT : TELEMETRY_SOURCES_DISPLAY_COUNT); i++) {
b->addItem(RawSource(SOURCE_TYPE_TELEMETRY, i).toString());
if (!(i>=sizeof(telem_hub)/sizeof(int) || telem_hub[i]==0 || ((telem_hub[i]>=hubproto) && hubproto!=0))) {
QModelIndex index = b->model()->index(i, 0);
QVariant v(0);
b->model()->setData(index, v, Qt::UserRole - 1);
}
}
if (value>=sizeof(telem_hub)/sizeof(int))
b->setCurrentIndex(0);
else if (telem_hub[value]==0 || ((telem_hub[value]>=hubproto) && hubproto!=0)) {
b->setCurrentIndex(value);
}
b->setMaxVisibleItems(10);
}
TelemetryCustomScreen::~TelemetryCustomScreen()
{
delete ui;
@ -347,6 +382,8 @@ void TelemetryCustomScreen::update()
void TelemetryCustomScreen::updateBar(int line)
{
lock = true;
int index = screen.body.bars[line].source;
barsCB[line]->setCurrentIndex(index);
if (index) {
@ -372,6 +409,8 @@ void TelemetryCustomScreen::updateBar(int line)
minSB[line]->setDisabled(true);
maxSB[line]->setDisabled(true);
}
lock = false;
}
void TelemetryCustomScreen::on_screenType_currentIndexChanged(int index)
@ -393,6 +432,7 @@ void TelemetryCustomScreen::customFieldChanged(int value)
void TelemetryCustomScreen::barSourceChanged(int index)
{
if (!lock) {
QComboBox * cb = qobject_cast<QComboBox*>(sender());
int line = cb->property("index").toInt();
screen.body.bars[line].source = index;
@ -401,6 +441,7 @@ void TelemetryCustomScreen::barSourceChanged(int index)
updateBar(line);
emit modified();
}
}
void TelemetryCustomScreen::barMinChanged(double value)
{
@ -467,8 +508,16 @@ void TelemetryPanel::setup()
}
ui->rssiAlarm1SB->setValue(model.frsky.rssiAlarms[0].value);
ui->rssiAlarm2SB->setValue(model.frsky.rssiAlarms[1].value);
if (!IS_TARANIS(GetEepromInterface()->getBoard())) {
ui->rssiAlarm1CB->setCurrentIndex(model.frsky.rssiAlarms[0].level);
ui->rssiAlarm2CB->setCurrentIndex(model.frsky.rssiAlarms[1].level);
}
else {
ui->rssiAlarm1CB->hide();
ui->rssiAlarm2CB->hide();
ui->rssiAlarm1Label->setText(tr("Low Alarm"));
ui->rssiAlarm2Label->setText(tr("Critical Alarm"));
}
if (!GetEepromInterface()->getCapability(HasAltitudeSel)) {
ui->AltitudeGPS_ChkB->hide();

View file

@ -61,6 +61,9 @@ class TelemetryCustomScreen : public ModelPanel
void barMinChanged(double value);
void barMaxChanged(double value);
protected:
void populateTelemetrySourceCB(QComboBox *b, unsigned int value, bool last, int hubproto);
private:
void updateBar(int line);
Ui::TelemetryCustomScreen * ui;

View file

@ -77,7 +77,7 @@
</property>
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="0">
<widget class="QLabel" name="label_927">
<widget class="QLabel" name="rssiAlarm1Label">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
@ -157,7 +157,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_928">
<widget class="QLabel" name="rssiAlarm2Label">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>

View file

@ -43,7 +43,7 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_919">
<widget class="QLabel" name="alarm1Label">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
@ -106,7 +106,7 @@
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_921">
<widget class="QLabel" name="alarm2Label">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>

View file

@ -530,9 +530,9 @@ void printDialog::printCurves()
qplot_color[7]=new QColor(0,0,255);
qplot_color[8]=new QColor(0,127,255);
qplot_color[9]=new QColor(127,0,255);
qplot_color[10]=new QColor(0,255,0);
qplot_color[11]=new QColor(0,255,127);
qplot_color[12]=new QColor(127,255,0);
qplot_color[10]=new QColor(0,200,0);
qplot_color[11]=new QColor(0,200,127);
qplot_color[12]=new QColor(127,200,0);
qplot_color[13]=new QColor(255,0,0);
qplot_color[14]=new QColor(255,0,127);
qplot_color[15]=new QColor(255,127,0);

View file

@ -515,6 +515,7 @@ void SimulatorDialogTaranis::getValues()
{
-ui->dialP_1->value(),
ui->dialP_2->value(),
0,
-ui->dialP_3->value(),
ui->dialP_4->value()
},

View file

@ -21,7 +21,7 @@
struct TxInputs {
int sticks[NUM_STICKS]; /* lh lv rv rh */
int pots[4]; /* TODO NUM_POTS */
int pots[5]; /* TODO NUM_POTS */
int switches[10]; /* TODO NUM_SWITCHES */
bool keys[6]; /* TODO NUM_KEYS */
bool rotenc;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -110,10 +110,17 @@ Section "OpenTX companion" SecDummy
${registerExtension} "$INSTDIR\companion.exe" ".companion" "EEPE_File"
${registerExtension} "$INSTDIR\companion.exe" ".eepm" "EEPM_File"
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
;Registry information for add/remove programs
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "DisplayName" "OpenTX Companion"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "UninstallString" "$\"$INSTDIR\Uninstall.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "DisplayIcon" "$\"$INSTDIR\companion.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "Publisher" "OpenTX"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "URLInfoAbout" "http://www.open-tx.org"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker" "QuietUninstallString" "$\"$INSTDIR\Uninstall.exe$\" /S"
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
;Create shortcuts
@ -178,6 +185,7 @@ Section "Uninstall"
RMDir "$SMPROGRAMS\$StartMenuFolder"
DeleteRegKey /ifempty HKCU "Software\companion9x"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX"
SectionEnd

View file

@ -12,14 +12,14 @@
;General
;Name and file
Name "OpenTX companion"
Name "OpenTX Companion"
OutFile "companionInstall_v@C9X_VERSION@.exe"
;Default installation folder
InstallDir "$PROGRAMFILES\OpenTX companion"
InstallDir "$PROGRAMFILES\OpenTX"
;Get installation folder from registry if available
InstallDirRegKey HKCU "Software\companion9x" ""
InstallDirRegKey HKCU "Software\OpenTX" ""
;Compressor options
SetCompressor /FINAL /SOLID lzma
@ -66,7 +66,7 @@
;Start Menu Folder Page Configuration
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\companion9x"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\OpenTX"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
@ -77,7 +77,7 @@
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_CHECKED
!define MUI_FINISHPAGE_RUN_TEXT "Launch companion"
!define MUI_FINISHPAGE_RUN_TEXT "Launch OpenTX Companion"
!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
# !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
# !define MUI_FINISHPAGE_SHOWREADME $INSTDIR\readme.txt
@ -95,7 +95,7 @@
;--------------------------------
;Installer Sections
Section "OpenTX companion" SecDummy
Section "OpenTX Companion" SecDummy
SetOutPath "$INSTDIR"
@ -129,7 +129,7 @@ Section "OpenTX companion" SecDummy
SetOutPath "$INSTDIR"
;Store installation folder
WriteRegStr HKCU "Software\companion9x" "" $INSTDIR
WriteRegStr HKCU "Software\OpenTX" "" $INSTDIR
;Associate with extentions ,bin and .hex
${registerExtension} "$INSTDIR\companion.exe" ".bin" "BIN_File"
@ -141,6 +141,14 @@ Section "OpenTX companion" SecDummy
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
;Registry information for add/remove programs
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "DisplayName" "OpenTX Companion"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "UninstallString" "$\"$INSTDIR\Uninstall.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "DisplayIcon" "$\"$INSTDIR\companion.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "Publisher" "OpenTX"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX" "URLInfoAbout" "http://www.open-tx.org"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ImageMaker" "QuietUninstallString" "$\"$INSTDIR\Uninstall.exe$\" /S"
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
;Create shortcuts
@ -207,7 +215,8 @@ Section "Uninstall"
Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk"
RMDir "$SMPROGRAMS\$StartMenuFolder"
DeleteRegKey /ifempty HKCU "Software\companion9x"
DeleteRegKey /ifempty HKCU "Software\OpenTX"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX"
SectionEnd

View file

@ -1,6 +1,6 @@
Copyright © 2011-2013 Bertrand Songis and Romolo Manfredini
Copyright © 2011-2014 OpenTX team
companion9x is based on code named eePe by author - Erez Raviv <erezraviv@gmail.com>
OpenTX Companion is based on code named eePe by author - Erez Raviv <erezraviv@gmail.com>
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.

View file

@ -277,7 +277,7 @@ SHELL = sh
IMG2LBM = -python ../util/img2lbm.py
BIN2LBM = -python ../util/bin2lbm.py
TRANSLATE = -python ../util/translate.py
VERSION = 2.0
VERSION = 1.99
SRC =
CPPSRC =

View file

@ -42,7 +42,10 @@
void doMixerCalculations();
#define MODEL_RESET() memset(&g_model, 0, sizeof(g_model))
#define MODEL_RESET() \
memset(&g_model, 0, sizeof(g_model)); \
extern bool s_mixer_first_run_done; \
s_mixer_first_run_done = false;
#define MIXER_RESET() \
memset(channelOutputs, 0, sizeof(channelOutputs)); \
@ -62,6 +65,7 @@ uint16_t anaIn(uint8_t chan)
return 0;
}
#if !defined(PCBTARANIS)
TEST(Trims, greaterTrimLink)
{
MODEL_RESET();
@ -88,6 +92,7 @@ TEST(Trims, infiniteChainedTrims)
setTrimValue(3, 0, TRIM_EXTENDED_MAX+3); // link to FP2 trim
EXPECT_EQ(getRawTrimValue(getTrimFlightPhase(0, 2), 0), 32);
}
#endif
TEST(outdezNAtt, test_unsigned)
{
@ -565,8 +570,10 @@ TEST(Mixer, SlowOnSwitch)
g_model.mixData[0].srcRaw = MIXSRC_MAX;
g_model.mixData[0].weight = 100;
g_model.mixData[0].swtch = SWSRC_THR;
g_model.mixData[0].speedUp = 10;
g_model.mixData[0].speedDown = 10;
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
s_mixer_first_run_done = true;
perOut(e_perout_mode_normal, 0);
EXPECT_EQ(chans[0], 0);
@ -574,7 +581,7 @@ TEST(Mixer, SlowOnSwitch)
simuSetSwitch(0, 1);
CHECK_SLOW_MOVEMENT(0, +1, 250);
simuSetSwitch(0, 0);
simuSetSwitch(0, -1);
CHECK_SLOW_MOVEMENT(0, -1, 250);
}
@ -587,11 +594,12 @@ TEST(Mixer, SlowUpOnSwitch)
g_model.mixData[0].srcRaw = MIXSRC_MAX;
g_model.mixData[0].weight = 100;
g_model.mixData[0].swtch = SWSRC_THR;
g_model.mixData[0].speedUp = 10;
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = 0;
simuSetSwitch(0, 0);
perOut(e_perout_mode_normal, 0);
s_mixer_first_run_done = true;
EXPECT_EQ(chans[0], 0);
simuSetSwitch(0, 1);
@ -605,20 +613,22 @@ TEST(Mixer, SlowUpOnSwitch)
simuSetSwitch(0, 1);
CHECK_SLOW_MOVEMENT(0, +1, 100);
}
#endif
TEST(Mixer, SlowOnPhase)
{
MODEL_RESET();
MIXER_RESET();
g_model.phaseData[1].swtch = SWSRC_THR;
g_model.phaseData[1].swtch = TR(SWSRC_THR, SWSRC_SA0);
g_model.mixData[0].destCh = 0;
g_model.mixData[0].mltpx = MLTPX_ADD;
g_model.mixData[0].srcRaw = MIXSRC_MAX;
g_model.mixData[0].weight = 100;
g_model.mixData[0].phases = 0x2 + 0x4 + 0x8 + 0x10 /*only enabled in phase 0*/;
g_model.mixData[0].speedUp = 10;
g_model.mixData[0].speedDown = 10;
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
s_mixer_first_run_done = true;
s_perout_flight_phase = 0;
perOut(e_perout_mode_normal, 0);
EXPECT_EQ(chans[0], 0);
@ -629,20 +639,26 @@ TEST(Mixer, SlowOnPhase)
CHECK_SLOW_MOVEMENT(0, -1, 250);
}
#if !defined(CPUARM)
TEST(Mixer, SlowOnSwitchAndPhase)
{
MODEL_RESET();
MIXER_RESET();
g_model.phaseData[1].swtch = SWSRC_THR;
g_model.phaseData[1].swtch = TR(SWSRC_THR, SWSRC_SA0);
g_model.mixData[0].destCh = 0;
g_model.mixData[0].mltpx = MLTPX_ADD;
g_model.mixData[0].srcRaw = MIXSRC_MAX;
g_model.mixData[0].weight = 100;
g_model.mixData[0].swtch = SWSRC_THR;
g_model.mixData[0].swtch = TR(SWSRC_THR, SWSRC_SA0);
#if defined(CPUARM)
g_model.mixData[0].phases = 0x2 + 0x4 + 0x8 + 0x10 + 0x20 + 0x40 + 0x80 + 0x100 /*only enabled in phase 0*/;
#else
g_model.mixData[0].phases = 0x2 + 0x4 + 0x8 + 0x10 /*only enabled in phase 0*/;
g_model.mixData[0].speedUp = 10;
g_model.mixData[0].speedDown = 10;
#endif
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
s_mixer_first_run_done = true;
perOut(e_perout_mode_normal, 0);
EXPECT_EQ(chans[0], 0);
@ -650,25 +666,26 @@ TEST(Mixer, SlowOnSwitchAndPhase)
s_perout_flight_phase = 0;
CHECK_SLOW_MOVEMENT(0, +1, 250);
simuSetSwitch(0, 0);
simuSetSwitch(0, -1);
s_perout_flight_phase = 1;
CHECK_SLOW_MOVEMENT(0, -1, 250);
}
#endif
#if !defined(PCBTARANIS)
TEST(Mixer, SlowOnSwitchSource)
{
MODEL_RESET();
MIXER_RESET();
g_model.mixData[0].destCh = 0;
g_model.mixData[0].mltpx = MLTPX_ADD;
g_model.mixData[0].srcRaw = MIXSRC_THR;
g_model.mixData[0].srcRaw = TR(MIXSRC_THR, MIXSRC_SA);
g_model.mixData[0].weight = 100;
g_model.mixData[0].speedUp = 10;
g_model.mixData[0].speedDown = 10;
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
simuSetSwitch(0, 0);
s_mixer_first_run_done = true;
simuSetSwitch(0, -1);
CHECK_SLOW_MOVEMENT(0, -1, 250);
EXPECT_EQ(chans[0], -CHANNEL_MAX);
@ -676,6 +693,22 @@ TEST(Mixer, SlowOnSwitchSource)
CHECK_SLOW_MOVEMENT(0, +1, 500);
}
TEST(Mixer, SlowDisabledOnStartup)
{
MODEL_RESET();
MIXER_RESET();
g_model.mixData[0].destCh = 0;
g_model.mixData[0].mltpx = MLTPX_ADD;
g_model.mixData[0].srcRaw = MIXSRC_MAX;
g_model.mixData[0].weight = 100;
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
perOut(e_perout_mode_normal, 0);
EXPECT_EQ(chans[0], CHANNEL_MAX);
}
#if !defined(PCBTARANIS)
TEST(Mixer, SlowAndDelayOnReplace3POSSource)
{
MODEL_RESET();
@ -685,8 +718,10 @@ TEST(Mixer, SlowAndDelayOnReplace3POSSource)
g_model.mixData[0].srcRaw = MIXSRC_3POS;
g_model.mixData[0].weight = 100;
g_model.mixData[0].delayUp = 10;
g_model.mixData[0].speedUp = 10;
g_model.mixData[0].speedDown = 10;
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
s_mixer_first_run_done = true;
simuSetSwitch(3, -1);
CHECK_SLOW_MOVEMENT(0, -1, 250);
@ -717,7 +752,7 @@ TEST(Mixer, SlowOnSwitchReplace)
g_model.mixData[1].srcRaw = MIXSRC_MAX;
g_model.mixData[1].weight = 100;
g_model.mixData[1].swtch = SWSRC_THR;
g_model.mixData[1].speedDown = 10;
g_model.mixData[1].speedDown = SLOW_STEP*5;
simuSetSwitch(0, 0);
perOut(e_perout_mode_normal, 1);
@ -745,16 +780,19 @@ TEST(Mixer, NoTrimOnInactiveMix)
g_model.mixData[0].srcRaw = MIXSRC_Thr;
g_model.mixData[0].weight = 100;
g_model.mixData[0].swtch = SWSRC_THR;
g_model.mixData[0].speedUp = 10;
g_model.mixData[0].speedDown = 10;
g_model.mixData[0].speedUp = SLOW_STEP*5;
g_model.mixData[0].speedDown = SLOW_STEP*5;
setTrimValue(0, 2, 256);
s_mixer_first_run_done = true;
simuSetSwitch(0, 1);
CHECK_SLOW_MOVEMENT(0, 1, 100);
simuSetSwitch(0, 0);
simuSetSwitch(0, -1);
CHECK_SLOW_MOVEMENT(0, -1, 100);
}
#endif
TEST(Mixer, SlowOnMultiply)
{
@ -768,20 +806,21 @@ TEST(Mixer, SlowOnMultiply)
g_model.mixData[1].mltpx = MLTPX_MUL;
g_model.mixData[1].srcRaw = MIXSRC_MAX;
g_model.mixData[1].weight = 100;
g_model.mixData[1].swtch = SWSRC_THR;
g_model.mixData[1].speedUp = 10;
g_model.mixData[1].speedDown = 10;
g_model.mixData[1].swtch = TR(SWSRC_THR, SWSRC_SA0);
g_model.mixData[1].speedUp = SLOW_STEP*5;
g_model.mixData[1].speedDown = SLOW_STEP*5;
s_mixer_first_run_done = true;
simuSetSwitch(0, 1);
CHECK_SLOW_MOVEMENT(0, 1, 250);
simuSetSwitch(0, 0);
simuSetSwitch(0, -1);
CHECK_NO_MOVEMENT(0, CHANNEL_MAX, 250);
simuSetSwitch(0, 1);
CHECK_NO_MOVEMENT(0, CHANNEL_MAX, 250);
}
#endif
TEST(Curves, LinearIntpol)
{

View file

@ -870,13 +870,13 @@ enum menuModelSetupItems {
ITEM_MODEL_EXTENDED_LIMITS,
ITEM_MODEL_EXTENDED_TRIMS,
ITEM_MODEL_TRIM_INC,
CASE_PCBTARANIS(ITEM_MODEL_THROTTLE_LABEL)
ITEM_MODEL_THROTTLE_REVERSED,
ITEM_MODEL_THROTTLE_TRACE,
ITEM_MODEL_THROTTLE_TRIM,
CASE_PCBTARANIS(ITEM_MODEL_PREFLIGHT_LABEL)
CASE_PCBTARANIS(ITEM_MODEL_CHECKLIST_DISPLAY)
ITEM_MODEL_THROTTLE_WARNING,
#if defined(PCBTARANIS)
ITEM_MODEL_CHECKLIST_DISPLAY,
#endif
ITEM_MODEL_SWITCHES_WARNING,
CASE_PCBTARANIS(ITEM_MODEL_POT_WARNING)
ITEM_MODEL_BEEP_CENTER,
@ -964,7 +964,7 @@ void menuModelSetup(uint8_t event)
#define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0)
bool CURSOR_ON_CELL = (m_posHorz >= 0);
MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, CASE_PCBTARANIS(0) 7, POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), LABEL(InternalModule), 0, IF_PORT1_ON(1), IF_PORT1_ON(IS_D8_RX(0) ? (uint8_t)1 : (uint8_t)2), IF_PORT1_ON(FAILSAFE_ROWS(0)), LABEL(ExternalModule), (g_model.externalModule==MODULE_TYPE_XJT || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, PORT2_CHANNELS_ROWS(), (IS_MODULE_XJT(1) && IS_D8_RX(1)) ? (uint8_t)1 : (IS_MODULE_PPM(1) || IS_MODULE_XJT(1) || IS_MODULE_DSM2(1)) ? (uint8_t)2 : HIDDEN_ROW, IF_PORT2_XJT(FAILSAFE_ROWS(1)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)});
MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0,CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0,CASE_PCBTARANIS(LABEL(PreflightCheck)) CASE_PCBTARANIS(0) 0, 7, POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), LABEL(InternalModule), 0, IF_PORT1_ON(1), IF_PORT1_ON(IS_D8_RX(0) ? (uint8_t)1 : (uint8_t)2), IF_PORT1_ON(FAILSAFE_ROWS(0)), LABEL(ExternalModule), (g_model.externalModule==MODULE_TYPE_XJT || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, PORT2_CHANNELS_ROWS(), (IS_MODULE_XJT(1) && IS_D8_RX(1)) ? (uint8_t)1 : (IS_MODULE_PPM(1) || IS_MODULE_XJT(1) || IS_MODULE_DSM2(1)) ? (uint8_t)2 : HIDDEN_ROW, IF_PORT2_XJT(FAILSAFE_ROWS(1)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)});
#elif defined(CPUM64)
#define CURSOR_ON_CELL (true)
#define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX)
@ -1121,6 +1121,12 @@ void menuModelSetup(uint8_t event)
g_model.trimInc = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_TRIMINC, STR_VTRIMINC, g_model.trimInc, -2, 2, attr, event);
break;
#if defined(PCBTARANIS)
case ITEM_MODEL_THROTTLE_LABEL:
lcd_putsLeft(y, STR_THROTTLE_LABEL);
break;
#endif
case ITEM_MODEL_THROTTLE_REVERSED:
g_model.throttleReversed = onoffMenuItem(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ;
break;
@ -1142,16 +1148,20 @@ void menuModelSetup(uint8_t event)
g_model.thrTrim = onoffMenuItem(g_model.thrTrim, MODEL_SETUP_2ND_COLUMN, y, STR_TTRIM, attr, event);
break;
case ITEM_MODEL_THROTTLE_WARNING:
g_model.disableThrottleWarning = !onoffMenuItem(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEWARNING, attr, event);
#if defined(PCBTARANIS)
case ITEM_MODEL_PREFLIGHT_LABEL:
lcd_putsLeft(y, STR_PREFLIGHT);
break;
#if defined(PCBTARANIS)
case ITEM_MODEL_CHECKLIST_DISPLAY:
g_model.displayText = onoffMenuItem(g_model.displayText, MODEL_SETUP_2ND_COLUMN, y, STR_CHECKLIST, attr, event);
break;
#endif
case ITEM_MODEL_THROTTLE_WARNING:
g_model.disableThrottleWarning = !onoffMenuItem(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEWARNING, attr, event);
break;
case ITEM_MODEL_SWITCHES_WARNING:
{
lcd_putsLeft(y, STR_SWITCHWARNING);
@ -1201,9 +1211,9 @@ void menuModelSetup(uint8_t event)
uint8_t swactive = !(g_model.nSwToWarn & 1 << i);
#if defined(PCBTARANIS)
c = "\300-\301"[states & 0x03];
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+i*(2*FW), y, 'A'+i, line && (m_posHorz == i) ? INVERS : 0);
if (swactive) lcd_putc(MODEL_SETUP_2ND_COLUMN+i*(2*FW)+FWNUM, y, c);
lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+((NUM_SWITCHES-1)*2*FW+2), y, PSTR("<]"), (m_posHorz == NUM_SWITCHES-1 && !s_noHi) ? line : 0);
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+i*(2*FW+1), y, 'A'+i, line && (m_posHorz == i) ? INVERS : 0);
if (swactive) lcd_putc(MODEL_SETUP_2ND_COLUMN+i*(2*FW+1)+FWNUM+1, y, c);
lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+((NUM_SWITCHES-1)*2*FW+8), y, PSTR("<]"), (m_posHorz == NUM_SWITCHES-1 && !s_noHi) ? line : 0);
states >>= 2;
#else
attr = 0;

View file

@ -540,16 +540,10 @@ PACK(typedef struct t_LimitData {
#define MLTPX_REP 2
#if defined(CPUARM)
// highest bit used for small values in mix 128 --> 8 bit is enough
#define GV1_SMALL 128
// highest bit used for large values in mix 4096 --> 12 bits is used (type for weight and offset has even 16 bits)
#define GV1_LARGE 4096
// the define GV1_LARGE marks the highest bit value used for this variables
// because this would give too big numbers for ARM, we limit it further for offset and weight
// must be smaller than GV1_LARGE - RESERVE_RANGE_FOR_GVARS -1
#define GV1_LARGE 512
#define GV_RANGE_WEIGHT 500
#define GV_RANGE_OFFSET 500
#define DELAY_STEP 10
#define SLOW_STEP 10
#define DELAY_MAX (25*DELAY_STEP) /* 25 seconds */
@ -1112,12 +1106,18 @@ enum FrskyUsrProtocols {
USR_PROTO_LAST = USR_PROTO_WS_HOW_HIGH,
};
enum FrskySource {
FRSKY_SOURCE_NONE,
FRSKY_SOURCE_A1,
FRSKY_SOURCE_A2,
FRSKY_SOURCE_FAS,
FRSKY_SOURCE_CELLS,
enum FrskyCurrentSource {
FRSKY_CURRENT_SOURCE_NONE,
FRSKY_CURRENT_SOURCE_A1,
FRSKY_CURRENT_SOURCE_A2,
FRSKY_CURRENT_SOURCE_FAS,
};
enum FrskyVoltsSource {
FRSKY_VOLTS_SOURCE_A1,
FRSKY_VOLTS_SOURCE_A2,
FRSKY_VOLTS_SOURCE_FAS,
FRSKY_VOLTS_SOURCE_CELLS,
};
#if defined(CPUARM)

View file

@ -1983,7 +1983,6 @@ int16_t getGVarValue(int16_t x, int16_t min, int16_t max, int8_t phase)
x = GVAR_VALUE(idx, getGVarFlightPhase(phase, idx)) * mul;
}
return limit(min, x, max);
}
@ -2104,6 +2103,8 @@ getvalue_t convert8bitsTelemValue(uint8_t channel, ls_telemetry_value_t value)
break;
case TELEM_CURRENT:
case TELEM_POWER:
case TELEM_MAX_CURRENT:
case TELEM_MAX_POWER:
result = value * 5;
break;
case TELEM_CONSUMPTION:
@ -2981,6 +2982,8 @@ void resetTimer(uint8_t idx)
timerState.val_10ms = 0 ;
}
bool s_mixer_first_run_done = false;
void resetAll()
{
static bool firstReset = true;
@ -2999,6 +3002,7 @@ void resetAll()
}
s_last_switch_value = 0;
s_mixer_first_run_done = false;
SKIP_AUTOMATIC_PROMPTS();
@ -3350,6 +3354,7 @@ uint8_t fnSwitchDuration[NUM_CFN] = { 0 };
inline void playCustomFunctionFile(CustomFnData *sd, uint8_t id)
{
if (sd->play.name[0] != '\0') {
char filename[sizeof(SOUNDS_PATH)+sizeof(sd->play.name)+sizeof(SOUNDS_EXT)] = SOUNDS_PATH "/";
strncpy(filename+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
strncpy(filename+sizeof(SOUNDS_PATH), sd->play.name, sizeof(sd->play.name));
@ -3357,6 +3362,7 @@ inline void playCustomFunctionFile(CustomFnData *sd, uint8_t id)
strcat(filename+sizeof(SOUNDS_PATH), SOUNDS_EXT);
PLAY_FILE(filename, sd->func==FUNC_BACKGND_MUSIC ? PLAY_BACKGROUND : 0, id);
}
}
#endif
#if defined(CPUARM)
@ -3851,21 +3857,21 @@ void perOut(uint8_t mode, uint8_t tick10ms)
// the unit of the stored value is the value from md->speedUp or md->speedDown divide SLOW_STEP seconds; e.g. value 4 means 4/SLOW_STEP = 2 seconds for CPU64
// because we get a tick each 10msec, we need 100 ticks for one second
// the value in md->speedXXX gives the time it should take to do a full movement from -100 to 100 therefore 200%. This equals 2048 in recalculated internal range
if (tick10ms) {
if (tick10ms || !s_mixer_first_run_done) {
// only if already time is passed add or substract a value according the speed configured
int32_t rate = (int32_t) tick10ms << (DEL_MULT_SHIFT+11); // = DEL_MULT*2048*tick10ms
// rate equals a full range for one second; if less time is passed rate is accordingly smaller
// if one second passed, rate would be 2048 (full motion)*256(recalculated weight)*100(100 ticks needed for one second)
int32_t currentValue = ((int32_t) v<<DEL_MULT_SHIFT);
if (diff > 0) {
if (md->speedUp > 0) {
if (s_mixer_first_run_done && md->speedUp > 0) {
// if a speed upwards is defined recalculate the new value according configured speed; the higher the speed the smaller the add value is
int32_t newValue = tact+rate/((int16_t)(100/SLOW_STEP)*md->speedUp);
if (newValue<currentValue) currentValue = newValue; // Endposition; prevent toggling around the destination
}
}
else { // if is <0 because ==0 is not possible
if (md->speedDown > 0) {
if (s_mixer_first_run_done && md->speedDown > 0) {
// see explanation in speedUp
int32_t newValue = tact-rate/((int16_t)(100/SLOW_STEP)*md->speedDown);
if (newValue>currentValue) currentValue = newValue; // Endposition; prevent toggling around the destination
@ -4088,6 +4094,8 @@ void doMixerCalculations()
perOut(e_perout_mode_normal, tick10ms);
}
s_mixer_first_run_done = true;
//========== FUNCTIONS ===============
// must be done after mixing because some functions use the inputs/channels values
// must be done before limits because of the applyLimit function: it checks for safety switches which would be not initialized otherwise

View file

@ -101,12 +101,12 @@ sem_t *eeprom_write_sem;
#if defined(PCBTARANIS)
#define SWITCH_CASE(swtch, pin, mask) \
case swtch: \
if (state) pin &= ~(mask); else pin |= (mask); \
if (state > 0) pin &= ~(mask); else pin |= (mask); \
break;
#else
#define SWITCH_CASE(swtch, pin, mask) \
case swtch: \
if (state) pin |= (mask); else pin &= ~(mask); \
if (state > 0) pin |= (mask); else pin &= ~(mask); \
break;
#endif
#define SWITCH_3_CASE(swtch, pin1, pin2, mask1, mask2) \
@ -116,13 +116,13 @@ sem_t *eeprom_write_sem;
break;
#define KEY_CASE(key, pin, mask) \
case key: \
if (state) pin &= ~mask; else pin |= mask;\
if (state > 0) pin &= ~mask; else pin |= mask;\
break;
#define TRIM_CASE KEY_CASE
#else
#define SWITCH_CASE(swtch, pin, mask) \
case swtch: \
if (state) pin &= ~(mask); else pin |= (mask); \
if (state > 0) pin &= ~(mask); else pin |= (mask); \
break;
#define SWITCH_3_CASE(swtch, pin1, pin2, mask1, mask2) \
case swtch: \
@ -131,7 +131,7 @@ sem_t *eeprom_write_sem;
break;
#define KEY_CASE(key, pin, mask) \
case key: \
if (state) pin |= (mask); else pin &= ~(mask);\
if (state > 0) pin |= (mask); else pin &= ~(mask);\
break;
#define TRIM_CASE KEY_CASE
#endif

View file

@ -723,7 +723,7 @@ void telemetryInterrupt10ms()
uint16_t current = 0;
#endif
channel = g_model.frsky.currentSource - FRSKY_SOURCE_A1;
channel = g_model.frsky.currentSource - FRSKY_CURRENT_SOURCE_A1;
if (channel <= 1) {
current = applyChannelRatio(channel, frskyData.analog[channel].value) / 10;
}

View file

@ -595,7 +595,7 @@ void telemetryInterrupt10ms()
uint16_t current = 0;
#endif
channel = g_model.frsky.currentSource - FRSKY_SOURCE_A1;
channel = g_model.frsky.currentSource - FRSKY_CURRENT_SOURCE_A1;
if (channel <= 1) {
current = applyChannelRatio(channel, frskyData.analog[channel].value) / 10;
}

View file

@ -496,8 +496,10 @@ const pm_char STR_VIEW_TEXT[] PROGMEM = "View text";
const pm_char STR_VIEW_CHANNELS[] PROGMEM = "View Channels";
const pm_char STR_VIEW_NOTES[] PROGMEM = "View Notes";
const pm_char STR_POTWARNING[] PROGMEM = TR_POTWARNING;
const pm_char STR_PREFLIGHT[] PROGMEM = TR_PREFLIGHT;
const pm_char STR_CHECKLIST[] PROGMEM = TR_CHECKLIST;
const pm_char STR_UART3MODE[] PROGMEM = TR_UART3MODE;
const pm_char STR_THROTTLE_LABEL[] PROGMEM = TR_THROTTLE_LABEL;
#endif
#if MENUS_LOCK == 1

View file

@ -672,8 +672,10 @@ extern const pm_char STR_VIEW_TEXT[];
extern const pm_char STR_VIEW_CHANNELS[];
extern const pm_char STR_VIEW_NOTES[];
extern const pm_char STR_POTWARNING[];
extern const pm_char STR_PREFLIGHT[];
extern const pm_char STR_CHECKLIST[];
extern const pm_char STR_UART3MODE[];
extern const pm_char STR_THROTTLE_LABEL[];
#endif
#if MENUS_LOCK == 1

View file

@ -72,7 +72,7 @@
#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "Pot\0 ""Multipos Switch"
#define TR_POTTYPES "None\0 ""Pot\0 ""Multipos Switch"
#define LEN_DATETIME "\006"
#define TR_DATETIME "DATUM:""ČAS: "
@ -330,7 +330,7 @@
#define TR_VTEMPLATES "Smazat mixy\0\0""Zákl. 4kanál\0""Sticky-T-Cut\0""V-Tail \0""Elevon\\Delta\0""eCCPM \0""Heli Setup \0""Servo Test \0"
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS TR("Menu\0""Exit\0""Dolů\0""Nhoru""Vprvo""Vlevo", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Mínus")
@ -445,8 +445,8 @@
#define TR_ELIMITS TR("Limit+25%", "Kanál +/- 125%")
#define TR_ETRIMS TR("širšíTrim", "Široký trim")
#define TR_TRIMINC TR("KrokTrimu", "Krok trimu")
#define TR_TTRACE TR("StopaPlyn", "Stopař plynu")
#define TR_TTRIM TR("TrimPlynu", "TrimPlyn-volnoběh")
#define TR_TTRACE TR("StopaPlyn", INDENT "Stopař plynu")
#define TR_TTRIM TR("TrimPlynu", INDENT "Trim-volnoběh")
#define TR_BEEPCTR "(\043)Středy"
#define TR_PROTO INDENT"Protokol"
#define TR_PPMFRAME "PPM frame"
@ -509,7 +509,8 @@
#define TR_MEMORYWARNING INDENT"Plná pamět'"
#define TR_ALARMWARNING INDENT"Vypnutý zvuk"
#define TR_RENAVIG "Navig. RotEnc"
#define TR_THROTTLEREVERSE TR("ReversPlyn", "Revers plynu")
#define TR_THROTTLE_LABEL "Plyn"
#define TR_THROTTLEREVERSE TR("ReversPlyn", INDENT"Revers plynu")
#define TR_MINUTEBEEP TR(INDENT"Minuta", INDENT"Oznamovat minuty")
#define TR_BEEPCOUNTDOWN INDENT"Odpočet"
#define TR_PERSISTENT INDENT"Trvalé"
@ -518,9 +519,9 @@
#define TR_BLONBRIGHTNESS INDENT"Jas Zap."
#define TR_BLOFFBRIGHTNESS INDENT"Jas Vyp."
#define TR_SPLASHSCREEN "úvodníLogo"
#define TR_THROTTLEWARNING "(\043)Plyn"
#define TR_SWITCHWARNING "(\043)Spínače"
#define TR_POTWARNING TR("Pot Warn.","Pot Warning")
#define TR_THROTTLEWARNING TR("(\043)Plyn", INDENT "(\043)Plyn")
#define TR_SWITCHWARNING TR("(\043)Spínače", INDENT "(\043)Spínače")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning")
#define TR_TIMEZONE "časové pásmo"
#define TR_RXCHANNELORD TR("Pořadí kanálů", "Výchozí pořadí kanálů")
#define TR_SLAVE "Podřízený"
@ -715,7 +716,8 @@
#define TR_LOWALARM INDENT "Nízký Alarm"
#define TR_CRITICALALARM INDENT "Kritický Alarm"
#define TR_PERSISTENT_MAH INDENT "Store mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Display Checklist"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Serial port"

View file

@ -69,7 +69,7 @@
#define TR_UART3MODES "AUS\0 ""S-Port Data Out\0""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "Poti\0 ""Stufen-Schalter "
#define TR_POTTYPES "None\0 ""Poti\0 ""Stufen-Schalter "
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATE:""ZEIT:"
@ -447,8 +447,8 @@
#define TR_ELIMITS TR("Erw.Limit","Erweit. Limits")
#define TR_ETRIMS TR("Erw.Trims","Erweit. Trimmung")
#define TR_TRIMINC TR("Trim Schr.","Trimm Schritte")
#define TR_TTRACE TR("Gasquelle","Gas Verfolgung")
#define TR_TTRIM TR("Gastrim","Gas Trimmung")
#define TR_TTRACE TR("Gasquelle", INDENT "Gas Verfolgung")
#define TR_TTRIM TR("Gastrim", INDENT "Gas Trimmung")
#define TR_BEEPCTR TR("Mitt.Piep","Mittelst. Pieps")
#define TR_PROTO TR(INDENT"Proto.",INDENT"Protokoll")
#define TR_PPMFRAME "PPM Einst."
@ -511,7 +511,8 @@
#define TR_MEMORYWARNING INDENT"Speicher voll"
#define TR_ALARMWARNING INDENT"Ton aus"
#define TR_RENAVIG "Drehgeb. Navig."
#define TR_THROTTLEREVERSE TR("Gas invers", "Vollgas hinten?") //Änderung wg TH9x, Taranis
#define TR_THROTTLE_LABEL "Gas"
#define TR_THROTTLEREVERSE TR("Gas invers", INDENT "Vollgas hinten?") //Änderung wg TH9x, Taranis
#define TR_MINUTEBEEP TR(INDENT"Minute",INDENT"Jede Minute")
#define TR_BEEPCOUNTDOWN INDENT"Countdown"
#define TR_PERSISTENT TR(INDENT"M-Zeit",INDENT"Modell Zeit")
@ -520,9 +521,9 @@
#define TR_BLONBRIGHTNESS INDENT"An Helligkeit"
#define TR_BLOFFBRIGHTNESS INDENT"Aus Helligkeit"
#define TR_SPLASHSCREEN "Startbild"
#define TR_THROTTLEWARNING "Gas Alarm"
#define TR_SWITCHWARNING TR("Sch. Alarm","Schalter Alarm")
#define TR_POTWARNING TR("Pot Warn.","Poti Warnung")
#define TR_THROTTLEWARNING TR("Gas Alarm", INDENT "Gas Alarm")
#define TR_SWITCHWARNING TR("Sch. Alarm", INDENT "Schalter Alarm")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Poti Warnung")
#define TR_TIMEZONE TR("Zeitzone","GPS Zeit Zone")
#define TR_RXCHANNELORD TR("Kanalanordnung","Kanalvoreinstellung")
#define TR_SLAVE "Schüler PPM1-8 als Ausgang"
@ -717,7 +718,8 @@
#define TR_LOWALARM INDENT "Low Alarm"
#define TR_CRITICALALARM INDENT "Kritisch Alarm"
#define TR_PERSISTENT_MAH INDENT "Speichern mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Display Checklist"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Serial Port"

View file

@ -319,8 +319,8 @@
#define LEN_VTELPROTO "\007"
#define TR_VTELPROTO "None\0 ""Hub\0 ""WSHHigh"
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VOLTSRC TR("\003", "\007")
#define TR_VOLTSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Cells\0 ")
#define LEN_VARIOSRC "\004"
#if defined(FRSKY_SPORT)
@ -333,7 +333,7 @@
#define TR_VSCREEN "Nums""Bars"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define TR_GPSFORMAT "HMS ""NMEA"
#define LEN2_VTEMPLATES 13
#define LEN_VTEMPLATES "\015"
@ -455,8 +455,8 @@
#define TR_ELIMITS TR("E.Limits", "Extended Limits")
#define TR_ETRIMS TR("E.Trims", "Extended Trims")
#define TR_TRIMINC "Trim Step"
#define TR_TTRACE TR("T-Source", "Throttle Source")
#define TR_TTRIM TR("T-Trim", "Throttle Trim")
#define TR_TTRACE TR("T-Source", INDENT "Timer Source")
#define TR_TTRIM TR("T-Trim", INDENT "Trim Idle Only")
#define TR_BEEPCTR TR("Ctr Beep", "Center Beep")
#define TR_PROTO TR(INDENT "Proto", INDENT "Protocol")
#define TR_PPMFRAME TR("PPM frame", INDENT "PPM frame")
@ -519,7 +519,8 @@
#define TR_MEMORYWARNING INDENT "Memory Low"
#define TR_ALARMWARNING INDENT "Sound Off"
#define TR_RENAVIG "RotEnc Navig"
#define TR_THROTTLEREVERSE TR("T-Reverse", "Throttle reverse")
#define TR_THROTTLE_LABEL "Throttle"
#define TR_THROTTLEREVERSE TR("T-Reverse", INDENT "Reverse")
#define TR_MINUTEBEEP TR(INDENT "Minute",INDENT "Minute call")
#define TR_BEEPCOUNTDOWN INDENT "Countdown"
#define TR_PERSISTENT TR(INDENT "Persist.",INDENT "Persistent")
@ -528,9 +529,9 @@
#define TR_BLONBRIGHTNESS INDENT "ON Brightness"
#define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness"
#define TR_SPLASHSCREEN "Splash screen"
#define TR_THROTTLEWARNING TR("T-Warning","Throttle Warning")
#define TR_SWITCHWARNING TR("S-Warning","Switch Warning")
#define TR_POTWARNING TR("Pot Warn.","Pot Warning")
#define TR_THROTTLEWARNING TR("T-Warning", INDENT "Throttle State")
#define TR_SWITCHWARNING TR("S-Warning", INDENT "Switch Positions")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Positions")
#define TR_TIMEZONE TR("Time Zone","GPS Time zone")
#define TR_RXCHANNELORD TR("Rx Channel Ord","Default channel order")
#define TR_SLAVE "Slave"
@ -725,7 +726,8 @@
#define TR_LOWALARM INDENT "Low Alarm"
#define TR_CRITICALALARM INDENT "Critical Alarm"
#define TR_PERSISTENT_MAH INDENT "Store mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Display Checklist"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Serial port"

View file

@ -72,7 +72,7 @@
#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "Pot\0 ""Multipos Switch"
#define TR_POTTYPES "None\0 ""Pot\0 ""Multipos Switch"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATA:""HORA:"
@ -445,8 +445,8 @@
#define TR_ELIMITS TR("E.Limite","Ampliar Limites")
#define TR_ETRIMS TR("E.Trims","Ampliar Trims")
#define TR_TRIMINC "Paso Trim"
#define TR_TTRACE TR("Fuente-A","Fuente Acelerad")
#define TR_TTRIM TR("Trim-A","Trim Acelerad")
#define TR_TTRACE TR("Fuente-A", INDENT "Fuente Acelerad")
#define TR_TTRIM TR("Trim-A", INDENT "Trim Acelerad")
#define TR_BEEPCTR TR("Ctr Beep","Center Beep")
#define TR_PROTO TR(INDENT"Proto",INDENT"Protocol")
#define TR_PPMFRAME "Trama PPM"
@ -509,7 +509,8 @@
#define TR_MEMORYWARNING INDENT"Memoria Baja"
#define TR_ALARMWARNING INDENT"Sin Sonido"
#define TR_RENAVIG "RotEnc Navig"
#define TR_THROTTLEREVERSE TR("Invert_Acel", "Invertir Acel.")
#define TR_THROTTLE_LABEL "Throttle"
#define TR_THROTTLEREVERSE TR("Invert_Acel", INDENT "Invertir Acel.")
#define TR_MINUTEBEEP TR(INDENT"Minuto",INDENT"Cada Minuto")
#define TR_BEEPCOUNTDOWN INDENT"Cuentaatras"
#define TR_PERSISTENT TR(INDENT"Persist.",INDENT"Persistente")
@ -518,9 +519,9 @@
#define TR_BLONBRIGHTNESS INDENT"MAS Brillo"
#define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo"
#define TR_SPLASHSCREEN "Ptalla.inicio"
#define TR_THROTTLEWARNING TR("Aviso-A", "Aviso Acelerador")
#define TR_SWITCHWARNING TR("Aviso-I", "Aviso Intrptor")
#define TR_POTWARNING TR("Pot Warn.","Pot Warning")
#define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador")
#define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso Intrptor")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning")
#define TR_TIMEZONE TR("Zona Hora", "GPS Zona Hora")
#define TR_RXCHANNELORD TR("Rx Orden canal", "Orden habitual canales")
#define TR_SLAVE "Esclavo"
@ -715,7 +716,8 @@
#define TR_LOWALARM INDENT "Alarma baja"
#define TR_CRITICALALARM INDENT "Alarma Critica"
#define TR_PERSISTENT_MAH INDENT "Valor mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Display Checklist"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Serial port"

View file

@ -42,16 +42,16 @@
// NON ZERO TERMINATED STRINGS
#define LEN_OFFON "\003"
#define TR_OFFON "OFF""ON\0"
#define TR_OFFON "POI""PÄÄ"
#define LEN_MMMINV "\003"
#define TR_MMMINV "---""INV"
#define TR_MMMINV "---""KÄÄ"
#define LEN_NCHANNELS "\004"
#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH"
#define LEN_VBEEPMODE "\005"
#define TR_VBEEPMODE "Quiet""Alarm""NoKey""All "
#define TR_VBEEPMODE "Äänet""Hälyt""EiNap""Kaikk"
#define LEN_VBEEPLEN "\005"
#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0"
@ -69,22 +69,22 @@
#define TR_TRNCHN "CH1CH2CH3CH4"
#define LEN_UART3MODES "\017"
#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Debug\0 "
#define TR_UART3MODES "POIS\0 ""S-Port Pelik\0 ""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "Pot\0 ""Multipos Switch"
#define TR_POTTYPES "None\0 ""Potikka\0 ""Monias. Kytkin\0"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATE:""TIME:"
#define TR_DATETIME "PÄIV:""AIKA:"
#define LEN_VLCD "\006"
#define TR_VLCD "NormalOptrex"
#define LEN_COUNTRYCODES TR("\002", "\007")
#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0")
#define TR_COUNTRYCODES TR("US""JP""EU", "Amerikk""Japani\0""Euroopp")
#define LEN_VTRIMINC TR("\006", "\013")
#define TR_VTRIMINC TR("Expo\0 ""ExFine""Fine\0 ""Medium""Coarse", "Exponential""Extra Fine\0""Fine\0 ""Medium\0 ""Coarse\0 ")
#define TR_VTRIMINC TR("Expo\0 ""EriHie""Hieno\0""Keski\0""Karkea", "Exponential""Eri Hieno\0 ""Hieno\0 ""Keski\0 ""Karkea\0 ")
#define LEN_VBEEPCOUNTDOWN "\006"
#define TR_VBEEPCOUNTDOWN "SilentBeeps\0Voice\0"
@ -445,8 +445,8 @@
#define TR_ELIMITS TR("E.Limits", "Extended Limits")
#define TR_ETRIMS TR("E.Trims", "Extended Trims")
#define TR_TRIMINC "Trim Step"
#define TR_TTRACE TR("T-Source", "Throttle Source")
#define TR_TTRIM TR("T-Trim", "Throttle Trim")
#define TR_TTRACE TR("T-Source", INDENT "Throttle Source")
#define TR_TTRIM TR("T-Trim", INDENT "Throttle Trim")
#define TR_BEEPCTR TR("Ctr Beep", "Center Beep")
#define TR_PROTO TR(INDENT "Proto", INDENT "Protocol")
#define TR_PPMFRAME TR("PPM frame", INDENT "PPM frame")
@ -509,7 +509,8 @@
#define TR_MEMORYWARNING INDENT"Memory Low"
#define TR_ALARMWARNING INDENT"Sound Off"
#define TR_RENAVIG "RotEnc Navig"
#define TR_THROTTLEREVERSE TR("T-Reverse", "Throttle reverse")
#define TR_THROTTLE_LABEL "Throttle"
#define TR_THROTTLEREVERSE TR("T-Reverse", INDENT "Throttle reverse")
#define TR_MINUTEBEEP TR(INDENT"Minute",INDENT"Minute call")
#define TR_BEEPCOUNTDOWN INDENT"Countdown"
#define TR_PERSISTENT TR(INDENT"Persist.",INDENT"Persistent")
@ -518,9 +519,9 @@
#define TR_BLONBRIGHTNESS INDENT"ON Brightness"
#define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness"
#define TR_SPLASHSCREEN "Splash screen"
#define TR_THROTTLEWARNING TR("T-Warning","Throttle Warning")
#define TR_SWITCHWARNING TR("S-Warning","Switch Warning")
#define TR_POTWARNING TR("Pot Warn.","Pot Warning")
#define TR_THROTTLEWARNING TR("T-Warning", INDENT "Throttle Warning")
#define TR_SWITCHWARNING TR("S-Warning", INDENT "Switch Warning")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning")
#define TR_TIMEZONE TR("Time Zone","GPS Time zone")
#define TR_RXCHANNELORD TR("Rx Channel Ord","Default channel order")
#define TR_SLAVE "Slave"
@ -715,7 +716,8 @@
#define TR_LOWALARM INDENT "Low Alarm"
#define TR_CRITICALALARM INDENT "Critical Alarm"
#define TR_PERSISTENT_MAH INDENT "Store mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Display Checklist"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Serial port"
@ -803,12 +805,12 @@
#define TR_CHR_HOUR 'h'
#define TR_CHR_INPUT 'I' // Values between A-I will work
#define TR_BEEP_VOLUME "Beep Volume"
#define TR_WAV_VOLUME "Wav Volume"
#define TR_VARIO_VOLUME "Vario Volume"
#define TR_BG_VOLUME "Bg Volume"
#define TR_BEEP_VOLUME "Piip Voim"
#define TR_WAV_VOLUME "Wav Voim"
#define TR_VARIO_VOLUME "Variom Voim"
#define TR_BG_VOLUME "Tausta Voim"
#define TR_TOP_BAR "Top Bar"
#define TR_ALTITUDE INDENT "Altitude"
#define TR_MODS_FORBIDDEN "Modifications forbidden!"
#define TR_UNLOCKED "Unlocked"
#define TR_TOP_BAR "Ylä palkki"
#define TR_ALTITUDE INDENT "Korkeus"
#define TR_MODS_FORBIDDEN "Muutokset kielletty!"
#define TR_UNLOCKED "Avattu"

View file

@ -1,10 +1,7 @@
/*
* Authors (alphabetical order)
* - Andre Bernet <bernet.andre@gmail.com>
* - Bertrand Songis <bsongis@gmail.com>
* - Bernet Andre <bernet.andre@gmail.com>
* - Kjell Kernen <kjell.kernen@gmail.com>
* - Martin Hotar <mhotar@gmail.com>
* - Romolo Manfredini <romolo.manfredini@gmail.com>
*
* opentx is based on code named
* gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/,
@ -72,7 +69,7 @@
#define TR_UART3MODES "OFF\0 ""Recopie S-Port\0""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "Potentiomètre\0 ""Inter multi-pos"
#define TR_POTTYPES "Rien\0 ""Potentiomètre\0 ""Inter multi-pos"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATE:""HEURE"
@ -86,8 +83,8 @@
#define LEN_VTRIMINC TR("\006","\013")
#define TR_VTRIMINC TR("Expo\0 ""ExFin\0""Fin\0 ""Moyen\0""Gros\0 ","Exponentiel""Extra Fin\0 ""Fin\0 ""Moyen\0 ""Grossier\0 ")
#define LEN_VBEEPCOUNTDOWN "\006"
#define TR_VBEEPCOUNTDOWN "SilentBeeps\0Voice\0"
#define LEN_VBEEPCOUNTDOWN "\007"
#define TR_VBEEPCOUNTDOWN "Silence""Bips\0 ""Voix\0 "
#define LEN_RETA123 "\001"
@ -152,7 +149,7 @@
#if defined(PCBTARANIS)
#define TR_CSWTIMER "Tempo"
#define TR_CSWSTICKY "Bist."
#define TR_CSWSTICKY "Bistb"
#define TR_CSWRANGE "Plage"
#define TR_CSWSTAY "Flanc"
#else
@ -175,9 +172,9 @@
#define LEN_VCSWFUNC "\005"
#if defined(CPUARM)
#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a{x\0 ""a>x\0 ""a<x\0 " TR_CSWRANGE "|a|>x""|a|<x""AND\0 ""OR\0 ""XOR\0 " TR_CSWSTAY "a=b\0 ""a>b\0 ""a<b\0 ""Δ}x\0 ""|Δ|}x" TR_CSWTIMER TR_CSWSTICKY
#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a{x\0 ""a>x\0 ""a<x\0 " TR_CSWRANGE "|a|>x""|a|<x""ET\0 ""OU\0 ""OUX\0 " TR_CSWSTAY "a=b\0 ""a>b\0 ""a<b\0 ""Δ}x\0 ""|Δ|}x" TR_CSWTIMER TR_CSWSTICKY
#else
#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a{x\0 ""a>x\0 ""a<x\0 " TR_CSWRANGE "|a|>x""|a|<x""AND\0 ""OR\0 ""XOR\0 " TR_CSWSTAY "a=b\0 ""a>b\0 ""a<b\0 ""^}x\0 ""|^|}x" TR_CSWTIMER TR_CSWSTICKY
#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a{x\0 ""a>x\0 ""a<x\0 " TR_CSWRANGE "|a|>x""|a|<x""ET\0 ""OU\0 ""OUX\0 " TR_CSWSTAY "a=b\0 ""a>b\0 ""a<b\0 ""^}x\0 ""|^|}x" TR_CSWTIMER TR_CSWSTICKY
#endif
#define LEN_VFSWFUNC "\015"
@ -234,8 +231,10 @@
#define TR_CFN_TEST
#endif
#define TR_CFN_RESERVE "[reserve]\0 "
#if defined(CPUARM)
#define TR_VFSWFUNC "Sécur.\0 ""Ecolage\0 ""Trim instant.""Remise à 0\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Rétroécl.\0 " TR_CFN_TEST
#define TR_VFSWFUNC "Sécur.\0 ""Ecolage\0 ""Trim instant.""Remise à 0\0 ""Déf \0 " TR_ADJUST_GVAR "Volume\0 " TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_RESERVE TR_CFN_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Rétroécl.\0 " TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Sécur.\0 ""Ecolage\0 ""Trim instant.""Remise à 0\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Rétroécl.\0 " TR_CFN_TEST
#else
@ -264,14 +263,22 @@
#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Wrn1""Wrn2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Warn1 ""Warn2 ""Cheep ""Ratata""Tick ""Siren ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk")
#define LEN_VTELEMCHNS "\004"
#if defined(PCBTARANIS)
#define TR_RSSI_0 "SWR\0"
#define TR_RSSI_1 "RSSI"
#if defined(CPUARM)
#define TR_TELEM_RESERVE "[--]"
#define TR_SWR "SWR\0"
#define TR_RX_BATT "RxBt"
#define TR_A3_A4 "A3\0 ""A4\0 "
#define TR_A3_A4_MIN "A3-\0""A4-\0"
#else
#define TR_RSSI_0 "Tx\0 "
#define TR_RSSI_1 "Rx\0 "
#define TR_TELEM_RESERVE
#define TR_SWR
#define TR_RX_BATT
#define TR_A3_A4
#define TR_A3_A4_MIN
#endif
#define TR_VTELEMCHNS "---\0""Batt""Chr1""Chr2" TR_RSSI_0 TR_RSSI_1 "A1\0 ""A2\0 ""Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vit\0""Dist""AltG""Elem""Velm""Vfas""Cour""Cnsm""Puis""AccX""AccY""AccZ""Cap\0""VitV""VitA""dET\0""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vit+""Dst+""Elm-""Els-""Vfs-""Cur+""Pui+""Acc\0""Tmps"
#define TR_VTELEMCHNS "---\0""Batt""Chr1""Chr2" TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Carb""T1\0 ""T2\0 ""Vit\0""Dist""AltG""Elem""Velm""Vfas""Cour""Cnsm""Puis""AccX""AccY""AccZ""Cap\0""VitV""VitA""dET\0" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "A1-\0""A2-\0" TR_A3_A4_MIN "Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vit+""Dst+""Elm-""Els-""Vfs-""Cur+""Pui+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Tmps"
#define LENGTH_UNIT_IMP "ft\0"
#define SPEED_UNIT_IMP "mph"
@ -282,16 +289,16 @@
#define LEN_VUNITSSYSTEM TR("\006", "\012")
#define TR_VUNITSSYSTEM TR("Métr.\0""Impér.", "Métriques\0""Impériales")
#define LEN_VTELEMUNIT_METR "\003"
#define TR_VTELEMUNIT_METR "v\0 ""A\0 ""m/s""-\0 ""kmh""m\0 ""@\0 ""%\0 ""mA\0""mAh""W\0 "
#define TR_VTELEMUNIT_METR "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT_METR LENGTH_UNIT_METR "@\0 ""%\0 ""mA\0""mAh""W\0 "
#define LEN_VTELEMUNIT_IMP "\003"
#define TR_VTELEMUNIT_IMP "v\0 ""A\0 ""m/s""-\0 ""kts""ft\0""@\0 ""%\0 ""mA\0""mAh""W\0 "
#define TR_VTELEMUNIT_IMP "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT_IMP LENGTH_UNIT_IMP "@\0 ""%\0 ""mA\0""mAh""W\0 "
#else
#if defined(IMPERIAL_UNITS)
#define LENGTH_UNIT "ft\0"
#define SPEED_UNIT "kts"
#define LENGTH_UNIT LENGTH_UNIT_IMP
#define SPEED_UNIT SPEED_UNIT_IMP
#else
#define LENGTH_UNIT "m\0 "
#define SPEED_UNIT "kmh"
#define LENGTH_UNIT LENGTH_UNIT_METR
#define SPEED_UNIT SPEED_UNIT_METR
#endif
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh""W\0 "
@ -314,7 +321,7 @@
#define LEN_VARIOSRC "\005"
#if defined(FRSKY_SPORT)
#define TR_VARIOSRC "Vario""A1\0 ""A2\0"
#define TR_VARIOSRC "Vario""A1\0 ""A2\0""dTE\0"
#else
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#endif
@ -323,7 +330,7 @@
#define TR_VSCREEN TR("Val.""Bars", "Valeurs""Barres\0")
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "DMS\0NMEA"
#define TR_GPSFORMAT "DMS\0""NMEA"
#define LEN2_VTEMPLATES 15
#define LEN_VTEMPLATES "\017"
@ -434,7 +441,7 @@
#define TR_MODELNAME TR("Nom modèle","Nom du modèle")
#define TR_PHASENAME "Nom phase"
#define TR_MIXNAME TR("Nom mix.","Nom du mixeur")
#define TR_INPUTNAME "Input Name"
#define TR_INPUTNAME "Nom entrée"
#if defined(PCBTARANIS)
#define TR_EXPONAME "Nom ligne"
#else
@ -445,8 +452,8 @@
#define TR_ELIMITS TR("Limites ét", "Limites étendues")
#define TR_ETRIMS TR("Trims ét.", "Trims étendus")
#define TR_TRIMINC TR("Pas Trim", "Pas des trims")
#define TR_TTRACE "Source gaz"
#define TR_TTRIM "Trim gaz"
#define TR_TTRACE TR("Source gaz", INDENT "Source gaz")
#define TR_TTRIM TR("Trim gaz", INDENT "Trim ralenti")
#define TR_BEEPCTR TR("Bips centr", "Bips centrage")
#define TR_PROTO TR(INDENT "Proto.", INDENT "Protocole")
#define TR_PPMFRAME INDENT "Trame PPM"
@ -509,7 +516,8 @@
#define TR_MEMORYWARNING INDENT "Mémoire pleine"
#define TR_ALARMWARNING TR(INDENT "Silence",INDENT "Sons désactivés")
#define TR_RENAVIG "Navig EncRot"
#define TR_THROTTLEREVERSE TR("Inv. gaz","Inversion gaz")
#define TR_THROTTLE_LABEL "Gaz"
#define TR_THROTTLEREVERSE TR("Inv. gaz", INDENT "Inversion gaz")
#define TR_MINUTEBEEP TR(INDENT "Bip min.",INDENT "Annonces minutes")
#define TR_BEEPCOUNTDOWN TR(INDENT "Bip fin",INDENT "Compte à rebours")
#define TR_PERSISTENT TR(INDENT "Persist.",INDENT "Persistant")
@ -518,9 +526,9 @@
#define TR_BLONBRIGHTNESS INDENT "Luminosité ON"
#define TR_BLOFFBRIGHTNESS INDENT "Luminosité OFF"
#define TR_SPLASHSCREEN "Logo d'accueil"
#define TR_THROTTLEWARNING "Alerte gaz"
#define TR_SWITCHWARNING TR("Alerte int","Alerte interrupt.")
#define TR_POTWARNING TR("Alerte pot","Alerte potentiom.")
#define TR_THROTTLEWARNING TR("Alerte gaz", INDENT "Alerte gaz")
#define TR_SWITCHWARNING TR("Alerte int", INDENT "Pos. interrupteurs")
#define TR_POTWARNING TR("Alerte pot", INDENT "Pos. potentiom.")
#define TR_TIMEZONE "Fuseau horaire"
#define TR_RXCHANNELORD TR("Ordre voies RX","Ordre des voies préféré")
#define TR_SLAVE "Elève"
@ -715,7 +723,8 @@
#define TR_LOWALARM INDENT "Alarme basse"
#define TR_CRITICALALARM INDENT "Alarme critique"
#define TR_PERSISTENT_MAH TR(INDENT "Enr. mAh", INDENT "Enregistrer mAh")
#define TR_CHECKLIST "Afficher notes"
#define TR_PREFLIGHT "Vérifications avant vol"
#define TR_CHECKLIST INDENT "Afficher notes"
#define TR_FAS_OFFSET TR(INDENT "Corr FAS", INDENT "Correction FAS")
#define TR_UART3MODE "Port série"
@ -746,8 +755,8 @@
#endif
// Taranis column headers
#define TR_PHASES_HEADERS { " Nom ", " Inter ", " Trims ", " Fondu ON ", " Fondu OFF " }
#define TR_LIMITS_HEADERS { " Nom ", " Subtrim ", " Min ", " Max ", " Direction ", " Curve ", " Neutre PPM ", " Mode subtrim " }
#define TR_PHASES_HEADERS { " Nom ", " Inter ", " Trim Dir ", " Trim Prf ", " Trim Gaz ", " Trim Ail ", " Fondu ON ", " Fondu OFF " }
#define TR_LIMITS_HEADERS { " Nom ", " Subtrim ", " Min ", " Max ", " Direction ", " Courbe ", " Neutre PPM ", " Mode subtrim " }
#define TR_CSW_HEADERS { " Fonction ", " V1 ", " V2 ", " V2 ", " ET suppl. ", " Durée ", " Délai " }
//Taranis About screen

View file

@ -72,7 +72,7 @@
#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "Pot\0 ""Multipos Switch"
#define TR_POTTYPES "None\0 ""Pot\0 ""Multipos Switch"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATA:""ORA :"
@ -445,8 +445,8 @@
#define TR_ELIMITS TR("Limiti.E","Limiti Estesi")
#define TR_ETRIMS TR("Trim Ext","Trim Estesi")
#define TR_TRIMINC "Trim Step"
#define TR_TTRACE TR("T-Source","Throttle Source")
#define TR_TTRIM TR("T-Trim","Throttle Trim")
#define TR_TTRACE TR("T-Source", INDENT "Throttle Source")
#define TR_TTRIM TR("T-Trim", INDENT "Throttle Trim")
#define TR_BEEPCTR TR("Ctr Beep","Center Beep")
#define TR_PROTO TR(INDENT "Proto", INDENT "Protocollo")
#define TR_PPMFRAME TR("PPM frame", INDENT "PPM frame")
@ -509,7 +509,8 @@
#define TR_MEMORYWARNING INDENT"Avviso memoria"
#define TR_ALARMWARNING INDENT"Spento"
#define TR_RENAVIG "Navig RotEnc "
#define TR_THROTTLEREVERSE TR("Thr inv.", "Throttle Inverso")
#define TR_THROTTLE_LABEL "Throttle"
#define TR_THROTTLEREVERSE TR("Thr inv.", INDENT "Throttle Inverso")
#define TR_MINUTEBEEP INDENT"Minuto"
#define TR_BEEPCOUNTDOWN TR(INDENT"Conto rov",INDENT"Conto rovescia")
#define TR_PERSISTENT TR(INDENT"Persist.",INDENT"Persistente")
@ -518,9 +519,9 @@
#define TR_BLONBRIGHTNESS TR(INDENT"Lumin. ON",INDENT"Luminosità ON")
#define TR_BLOFFBRIGHTNESS TR(INDENT"Lumin. OFF",INDENT"Luminosità OFF")
#define TR_SPLASHSCREEN TR("Schermo avvio", "Schermata di avvio")
#define TR_THROTTLEWARNING TR("All. Thr", "Allarme Throttle")
#define TR_SWITCHWARNING TR("Avv. Int.", "Avviso Interr.")
#define TR_POTWARNING TR("Pot Warn.","Pot Warning")
#define TR_THROTTLEWARNING TR("All. Thr", INDENT "Allarme Throttle")
#define TR_SWITCHWARNING TR("Avv. Int.", INDENT "Avviso Interr.")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning")
#define TR_TIMEZONE "Ora locale"
#define TR_RXCHANNELORD "Ordine ch RX"
#define TR_SLAVE "Allievo"
@ -715,7 +716,8 @@
#define TR_LOWALARM INDENT "Allarme Basso"
#define TR_CRITICALALARM INDENT "Allarme Critico"
#define TR_PERSISTENT_MAH INDENT "Store mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Display Checklist"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Serial port"

View file

@ -72,7 +72,7 @@
#define TR_UART3MODES "Wyłącz\0 ""S-Port Mirror\0 ""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "Potencjometr\0 ""Przeł.Wielopoz."
#define TR_POTTYPES "None\0 ""Potencjometr\0 ""Przeł.Wielopoz."
#define LEN_DATETIME "\006"
#define TR_DATETIME "DATA:\0""CZAS:\0"
@ -445,8 +445,8 @@
#define TR_ELIMITS TR("Limit+25%", "Kanał +/- 125%")
#define TR_ETRIMS TR("Trymery 100%", "Poszerzone Trymery")
#define TR_TRIMINC TR("Krok Trymera", "Krok trymera")
#define TR_TTRACE TR("Źródło gazu", "Źródło gazu")
#define TR_TTRIM TR("Trymer gazu", "Trymer gazu")
#define TR_TTRACE TR("Źródło gazu", INDENT "Źródło gazu")
#define TR_TTRIM TR("Trymer gazu", INDENT "Trymer gazu")
#define TR_BEEPCTR "(\043)Pikanie środka"
#define TR_PROTO INDENT"Protokól"
#define TR_PPMFRAME "Ramka PPM"
@ -509,7 +509,8 @@
#define TR_MEMORYWARNING INDENT"Pełna pamięć'"
#define TR_ALARMWARNING INDENT"Wyłącz dźwięk"
#define TR_RENAVIG "Nawigacja potencjometrem"
#define TR_THROTTLEREVERSE TR("Odwróć gaz", "Odwróć gaz")
#define TR_THROTTLE_LABEL "Throttle"
#define TR_THROTTLEREVERSE TR("Odwróć gaz", INDENT "Odwróć gaz")
#define TR_MINUTEBEEP TR(INDENT "Minuta", INDENT "Pik co minutę")
#define TR_BEEPCOUNTDOWN TR(INDENT "Odliczanie", INDENT "Odliczanie")
#define TR_PERSISTENT INDENT"Dokładny"
@ -518,9 +519,9 @@
#define TR_BLONBRIGHTNESS INDENT"Jasnośc wł."
#define TR_BLOFFBRIGHTNESS INDENT"Jasność wył."
#define TR_SPLASHSCREEN "Logo ekranu"
#define TR_THROTTLEWARNING "(\043)Gaz"
#define TR_SWITCHWARNING "(\043)Przełącznik"
#define TR_POTWARNING TR("Pot Warn.","Pot Warning")
#define TR_THROTTLEWARNING TR("(\043)Gaz", INDENT "(\043)Gaz")
#define TR_SWITCHWARNING TR("(\043)Przełącznik", INDENT "(\043)Przełącznik")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning")
#define TR_TIMEZONE "Strefa czasowa"
#define TR_RXCHANNELORD TR("Kolejność kanałów", "Bazowa kolejność kanałów")
#define TR_SLAVE "Uczeń"
@ -715,7 +716,8 @@
#define TR_LOWALARM INDENT "Alarm niski"
#define TR_CRITICALALARM INDENT "Alarm krytyczny"
#define TR_PERSISTENT_MAH INDENT "Zapisz mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Display Checklist"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Port szreg."

View file

@ -72,7 +72,7 @@
#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Debug\0 "
#define LEN_POTTYPES "\017"
#define TR_POTTYPES "Pot\0 ""Multipos Switch"
#define TR_POTTYPES "None\0 ""Pot\0 ""Multipos Switch"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATA:""HORA:"
@ -445,8 +445,8 @@
#define TR_ELIMITS "E.Limits"
#define TR_ETRIMS "E.Trims"
#define TR_TRIMINC "Trim Step"
#define TR_TTRACE "T-Trace"
#define TR_TTRIM "T-Trim"
#define TR_TTRACE TR("T-Trace", INDENT "T-Trace")
#define TR_TTRIM TR("T-Trim", INDENT "T-Trim")
#define TR_BEEPCTR "Ctr Beep"
#define TR_PROTO INDENT"Proto"
#define TR_PPMFRAME "PPM frame"
@ -509,7 +509,8 @@
#define TR_MEMORYWARNING INDENT"Memoria Baixa"
#define TR_ALARMWARNING INDENT"Som Off"
#define TR_RENAVIG "RotEnc Navig"
#define TR_THROTTLEREVERSE "Inverte Acel."
#define TR_THROTTLE_LABEL "Throttle"
#define TR_THROTTLEREVERSE TR("Inverte Acel.", INDENT "Inverte Acel.")
#define TR_MINUTEBEEP INDENT"Beep Minuto"
#define TR_BEEPCOUNTDOWN INDENT"Beep Regressivo"
#define TR_PERSISTENT INDENT"Persist."
@ -518,9 +519,9 @@
#define TR_BLONBRIGHTNESS INDENT"ON Brightness"
#define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness"
#define TR_SPLASHSCREEN "Splash screen"
#define TR_THROTTLEWARNING "Avisa Acel"
#define TR_SWITCHWARNING "Avisa Chav"
#define TR_POTWARNING TR("Pot Warn.","Pot Warning")
#define TR_THROTTLEWARNING TR("Avisa Acel", INDENT "Avisa Acel")
#define TR_SWITCHWARNING TR("Avisa Chav", INDENT "Avisa Chav")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning")
#define TR_TIMEZONE "Time Zone"
#define TR_RXCHANNELORD "Ordem Canal RX"
#define TR_SLAVE "Escravo"
@ -715,7 +716,8 @@
#define TR_LOWALARM INDENT "Low Alarm"
#define TR_CRITICALALARM INDENT "Critical Alarm"
#define TR_PERSISTENT_MAH INDENT "Store mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Display Checklist"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Serial port"

View file

@ -72,7 +72,7 @@
#define TR_UART3MODES "Av\0 ""Spegling av S-Port""Debug\0 "
#define LEN_POTTYPES "\020"
#define TR_POTTYPES "Potentiometer\0 ""Flerlägesväljare"
#define TR_POTTYPES "Ingen\0 ""Potentiometer\0 ""Flerlägesväljare"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DAG: ""TID: "
@ -225,7 +225,7 @@
#ifdef GVARS
#define TR_ADJUST_GVAR "Justera\0 "
#else
#define TR_ADJUST_GVAR "[AdjustGV]"
#define TR_ADJUST_GVAR "[Just. GV]"
#endif
#ifdef DEBUG
@ -445,8 +445,8 @@
#define TR_ELIMITS TR("Gränser++","Utökade Gränser")
#define TR_ETRIMS TR("Trimmar++","Utökade Trimmar")
#define TR_TRIMINC TR("Trimning","Trimökning")
#define TR_TTRACE "Följ Gas"
#define TR_TTRIM "Gastrim"
#define TR_TTRACE TR("Följ Gas", INDENT "Följ Gas")
#define TR_TTRIM TR("Gastrim", INDENT "Gastrim")
#define TR_BEEPCTR TR("Cent.pip", "Centerpip")
#define TR_PROTO TR(INDENT "Proto", INDENT "Protokoll")
#define TR_PPMFRAME "PPM-paket"
@ -509,18 +509,19 @@
#define TR_MEMORYWARNING INDENT"Lite Minne"
#define TR_ALARMWARNING INDENT"Ljud Av"
#define TR_RENAVIG "RotEnc Navig"
#define TR_THROTTLEREVERSE "Revers.Gas"
#define TR_THROTTLE_LABEL "Throttle"
#define TR_THROTTLEREVERSE TR("Revers.Gas", INDENT "Revers.Gas")
#define TR_MINUTEBEEP INDENT"Minutpip"
#define TR_BEEPCOUNTDOWN INDENT"Räkna Ned"
#define TR_BEEPCOUNTDOWN INDENT"Räkna ned"
#define TR_PERSISTENT TR("Jämt på ",INDENT"Alltid På")
#define TR_BACKLIGHT_LABEL "Belysning"
#define TR_BLDELAY INDENT"Av efter"
#define TR_BLONBRIGHTNESS INDENT"På Ljusstyrka"
#define TR_BLOFFBRIGHTNESS INDENT"Av Ljusstyrka"
#define TR_SPLASHSCREEN "Startbild"
#define TR_THROTTLEWARNING "Gasvarning"
#define TR_SWITCHWARNING TR("Bryt.varn.","Brytarvarning")
#define TR_POTWARNING TR("Pot Warn.","Pot Warning")
#define TR_THROTTLEWARNING TR("Gasvarning", INDENT "Gasvarning")
#define TR_SWITCHWARNING TR("Bryt.varn.", INDENT "Brytarvarning")
#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning")
#define TR_TIMEZONE TR("Tidszon","GPS Tidszon")
#define TR_RXCHANNELORD "Kanaler i RX"
#define TR_SLAVE "Elev"
@ -566,40 +567,40 @@
#define TR_BADEEPROMDATA "Minnet kan inte tolkas"
#define TR_EEPROMFORMATTING "Minnet Nollställs"
#define TR_EEPROMOVERFLOW "Minnesfel"
#define TR_MENURADIOSETUP "Inställningar"
#define TR_MENUDATEANDTIME "Dag och Tid"
#define TR_MENUTRAINER "Trainer (PPM in)"
#define TR_MENUVERSION "Version"
#define TR_MENUDIAG TR("Brytare","Test av Brytare")
#define TR_MENUANA "Analoga Värden"
#define TR_MENUCALIBRATION "Kalibrering"
#define TR_MENURADIOSETUP "INSTÄLLNINGAR"
#define TR_MENUDATEANDTIME "DAG OCH TID"
#define TR_MENUTRAINER "TRAINER (PPM IN)"
#define TR_MENUVERSION "VERSION"
#define TR_MENUDIAG TR("BRYTARE","TEST AV BRYTARE")
#define TR_MENUANA "ANALOGA VÄRDEN"
#define TR_MENUCALIBRATION "KALIBRERING"
#define TR_TRIMS2OFFSETS "\004[Spara Trimvärden]"
#define TR_MENUMODELSEL TR("Modell","Välj Modell")
#define TR_MENUSETUP TR("Värden","Modellinställningar")
#define TR_MENUFLIGHTPHASE "Flygläge"
#define TR_MENUFLIGHTPHASES "Flyglägen"
#define TR_MENUHELISETUP "Helikopter"
#define TR_MENUMODELSEL TR("MODELL","VÄLJ MODELL")
#define TR_MENUSETUP TR("VÄRDEN","MODELLINSTÄLLNINGAR")
#define TR_MENUFLIGHTPHASE "FLYGLÄGE"
#define TR_MENUFLIGHTPHASES "FLYGLÄGEN"
#define TR_MENUHELISETUP "HELIKOPTER"
#if defined(PCBTARANIS)
#define TR_MENUINPUTS TR("Filter","Filtrerad Insignal")
#define TR_MENULIMITS "Gränser"
#define TR_MENUINPUTS TR("FILTER","FILTRERAD INSIGNAL")
#define TR_MENULIMITS "GRÄNSER"
#elif defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
#define TR_MENUINPUTS "Spakar"
#define TR_MENULIMITS "Gränser"
#define TR_MENUINPUTS "SPAKAR"
#define TR_MENULIMITS "GRÄNSER"
#else
#define TR_MENUINPUTS TR("DR/Expo","DualRates/Expo")
#define TR_MENULIMITS "Gränser"
#define TR_MENUINPUTS TR("DR/EXPO","DUALRATES/EXPO")
#define TR_MENULIMITS "GRÄNSER"
#endif
#define TR_MENUCURVES "Kurvor"
#define TR_MENUCURVE "Kurva"
#define TR_MENULOGICALSWITCH "Logisk Brytare"
#define TR_MENULOGICALSWITCHES "Logiska Brytare"
#define TR_MENUCUSTOMFUNC "BrytarFunktioner"
#define TR_MENUTELEMETRY "Telemetri"
#define TR_MENUTEMPLATES "Mallar"
#define TR_MENUSTAT "Statistik"
#define TR_MENUDEBUG "Debug"
#define TR_MENUCURVES "KURVOR"
#define TR_MENUCURVE "KURVA"
#define TR_MENULOGICALSWITCH "LOGISK BRYTARE"
#define TR_MENULOGICALSWITCHES "LOGISKA BRYTARE"
#define TR_MENUCUSTOMFUNC "BRYTARFUNKTIONER"
#define TR_MENUTELEMETRY "TELEMETRI"
#define TR_MENUTEMPLATES "MALLAR"
#define TR_MENUSTAT "STATISTIK"
#define TR_MENUDEBUG "DEBUG"
#define TR_RXNUM "RxNum"
#define TR_SYNCMENU "Synk [MENU]"
#define TR_LIMIT INDENT"Nivå"
@ -672,7 +673,7 @@
#define TR_GLOBAL_VARS "Globala Variabler"
#define TR_GLOBAL_V "GLOBAL V."
#define TR_GLOBAL_VAR "Global Variabel"
#define TR_MENUGLOBALVARS "Globala Variabler"
#define TR_MENUGLOBALVARS "GLOBALA VARIABLER"
#define TR_OWN "Egen"
#define TR_DATE "Datum"
#define TR_ROTARY_ENCODER "R.Enks"
@ -702,7 +703,7 @@
#define TR_CF "BF"
#define TR_SPEAKER INDENT"Högtalare"
#define TR_BUZZER INDENT"Summer"
#define TR_BYTES "bytes"
#define TR_BYTES "byte"
#define TR_MODULE_BIND "[Bind]"
#define TR_MODULE_RANGE "[Testa]"
#define TR_RESET_BTN "[Nollställ]"
@ -714,15 +715,16 @@
#define TR_CHANNELRANGE INDENT "Kanalområde"
#define TR_LOWALARM INDENT "Låg-alarm"
#define TR_CRITICALALARM INDENT "Kritiskt alarm"
#define TR_PERSISTENT_MAH INDENT "Store mAh"
#define TR_CHECKLIST "Display Checklist"
#define TR_PERSISTENT_MAH INDENT "Lagra mAh"
#define TR_PREFLIGHT "Preflight Checks"
#define TR_CHECKLIST INDENT "Visa checklisa"
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
#define TR_UART3MODE "Serieporten"
#if defined(MAVLINK)
#define TR_MAVLINK_RC_RSSI_SCALE_LABEL "Max RSSI"
#define TR_MAVLINK_PC_RSSI_EN_LABEL "PC RSSI EN"
#define TR_MAVMENUSETUP_TITLE "MavlinkInställningar"
#define TR_MAVMENUSETUP_TITLE "MAVLINKINSTÄLLNINGAR"
#define TR_MAVLINK_BAUD_LABEL "Baudrate"
#define TR_MAVLINK_INFOS "INFOS"
#define TR_MAVLINK_MODE "LÄGE"

3
speaker/.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
/OpenTXspeak.suo
/bin/*
/obj/*

8
speaker/App.xaml Normal file
View file

@ -0,0 +1,8 @@
<Application x:Class="OpenTXspeak.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

32
speaker/App.xaml.cs Normal file
View file

@ -0,0 +1,32 @@
/* This file is part of OpenTX Speaker.
* OpenTX Speaker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* OpenTX Speaker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2014 Kjell Kernen */
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace OpenTXspeak
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

BIN
speaker/GPLv3_Logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

120
speaker/MainWindow.xaml Normal file
View file

@ -0,0 +1,120 @@
<Window x:Class="OpenTXspeak.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="OpenTX Speaker"
Height="460"
MinWidth="840"
MaxWidth="840"
ResizeMode="CanResizeWithGrip" MinHeight="460" SizeToContent="Width">
<Grid VerticalAlignment="Stretch" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Row="0" Grid.Column="0" VerticalAlignment="Stretch">
<ListView Name="lvSentences"
SelectionMode="Single"
MouseDoubleClick="lvSentences_MouseDoubleClick"
VerticalAlignment="Stretch" >
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="File Name" Width="100" DisplayMemberBinding="{Binding fileName}" />
<GridViewColumn Header="Description" Width="200" DisplayMemberBinding="{Binding description}" />
<GridViewColumn Header="Voice" Width="200" DisplayMemberBinding="{Binding voiceString}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</Grid>
<StackPanel Grid.Row="0" Grid.Column="1">
<TextBlock Text="Language" Margin="5,0,0,0" FontSize="18" />
<StackPanel Orientation="Vertical" HorizontalAlignment="Left" Margin="10,0,0,0">
<StackPanel Orientation="Horizontal">
<Label Content="Text" Width="75" />
<ComboBox Name="cbLanguages"
DisplayMemberPath="lName"
SelectedValuePath="sName"
SelectionChanged="cbLanguages_SelectionChanged"
Width="200" Height="23" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="Voice" Width="75" />
<ComboBox Height="23" Name="cbVoices" Width="200" Margin="0,0,0,0"/>
</StackPanel>
</StackPanel>
<Separator Height="5" />
<TextBlock Text="Sentence" Margin="5,0,0,0" FontSize="18" />
<Grid Margin="10,0,0,0" DataContext="{Binding ElementName=lvSentences, Path=SelectedItem}" Width="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="75" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="File Name" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Margin="0,5,0,0" />
<TextBox Text="{Binding Path=fileName}" Grid.Row="0" Grid.Column="1" Margin=" 0,0,10,0" />
<TextBlock Text="Description" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Row="1" Grid.Column="0" Margin="0,5,0,0" />
<TextBox Text="{Binding Path=description}" Grid.Row="1" Grid.Column="1" Margin=" 0,0,10,0"/>
<TextBlock Text="Sentence" Grid.Row="2" Grid.Column="0" Margin="0,5,0,0" />
<TextBox Text="{Binding Path=voiceString}" Grid.Row="2" Grid.Column="1" Margin="0,0,10,0"/>
</Grid>
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<TextBlock Text="Voice Rate" Width="70" Margin="10,10,0,0" />
<Slider Name="voiceRateSlider"
Value="0"
Minimum="-5"
Maximum="5"
TickPlacement="BottomRight"
TickFrequency="1"
IsSnapToTickEnabled="True"
Width="170"
Margin="10,10,10,0"/>
<TextBlock Text="{Binding ElementName=voiceRateSlider, Path=Value}" Width="40" Margin="0,10,0,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="New Sentence" Name="buttonAddItem" Click="buttonAddItem_Click" Margin="0,10,0,0" Width="140" />
<Button Content="Play Sentence" Name="buttonPlay" Click="buttonPlay_Click" Margin="10,10,0,0" Width="140" />
</StackPanel>
<Separator Height="5" />
<TextBlock Text="Voice Files" Margin="5,0,0,0" FontSize="18" />
<StackPanel Orientation="Horizontal" >
<TextBlock Text="Voice Rate" Width="70" Margin="10,0,0,0" />
<Slider Name="fileRateSlider"
Value="0"
Minimum="-5"
Maximum="5"
TickPlacement="BottomRight"
TickFrequency="1"
IsSnapToTickEnabled="True"
Width="170"
Margin="10,0,10,0"/>
<TextBlock Text="{Binding ElementName=fileRateSlider, Path=Value}" Width="40" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Sample Rate" Width="70" Margin="10,10,0,0" />
<RadioButton Content="8 KHz" Height="16" Name="rb8khz" Margin="10,10,0,0"/>
<RadioButton Content="16 kHz" Height="16" Name="rb16khz" Margin="10,10,0,0" />
<RadioButton Content="32 kHz" Height="16" Name="rb32khz" IsChecked="True" Margin="10,10,0,0"/>
</StackPanel>
<Button Content="Generate Voice Files" Name="buttonGenerate" Click="buttonSaveFiles_Click" Margin="10,10,10,0" />
<Separator Height="5" />
<StackPanel Width="Auto" Orientation="Horizontal">
<TextBlock FontSize="18" VerticalAlignment="Center" MouseLeftButtonDown="InstallVoices_MouseLeftButtonDown" Cursor="Hand" HorizontalAlignment="Center" Margin="20,5,20,0" TextWrapping="Wrap" Height="48" Width="59" IsHyphenationEnabled="True">Install Voices</TextBlock>
<Image Name="openTXLogo" Height="48" Source="/OpenTXspeak;component/speaker_logo.png" MouseLeftButtonDown="openTXLogo_MouseLeftButtonDown" HorizontalAlignment="Right" Cursor="Hand" Margin="0,5,10,0"/>
</StackPanel>
</StackPanel>
</Grid>
</Window>

232
speaker/MainWindow.xaml.cs Normal file
View file

@ -0,0 +1,232 @@
/* This file is part of OpenTX Speaker.
* OpenTX Speaker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* OpenTX Speaker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2014 Kjell Kernen */
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Speech.Synthesis;
using System.Speech.AudioFormat;
namespace OpenTXspeak
{
public partial class MainWindow : Window
{
SentenceTables tables = new SentenceTables();
Languages languages = new Languages();
Language curLang;
Sentences sentences = new Sentences();
SpeechSynthesizer synth = new SpeechSynthesizer();
int added_files = 0;
public MainWindow()
{
SplashScreen splash = new SplashScreen("speaker_logo.png");
splash.Show(true);
Thread.Sleep(1500);
InitializeComponent();
lvSentences.ItemsSource = sentences;
cbLanguages.ItemsSource = languages;
foreach (InstalledVoice voice in synth.GetInstalledVoices())
{
cbVoices.Items.Add(voice.VoiceInfo.Name);
}
cbVoices.SelectedIndex = 0;
languages.Add("English", "en");
languages.Add("Czech", "cz");
languages.Add("German", "de");
languages.Add("French", "fr");
languages.Add("Italian", "it");
languages.Add("Polish", "pl");
languages.Add("Portuguese", "pt");
languages.Add("Swedish", "se");
languages.Add("Slovak", "sk");
languages.Add("Spanish", "es");
curLang = languages[0];
cbLanguages.SelectedIndex = 0; // Note: Sets current langugage -> triggers loadlanguage()
}
private void loadLanguage()
{
string[] system_strings;
string[] other_strings;
try
{
system_strings = System.IO.File.ReadAllLines(@"SOUNDS\" + curLang.sName + @"\SYSTEM\system_sounds.txt");
other_strings = System.IO.File.ReadAllLines(@"SOUNDS\" + curLang.sName + @"\other_sounds.txt");
}
catch (IOException)
{
system_strings = tables.default_system_strings[tables.toInt(curLang.sName)];
other_strings = tables.default_other_strings[tables.toInt(curLang.sName)];
}
sentences.RemoveRange(0, sentences.Count);
foreach (string str in system_strings)
sentences.Add(str);
sentences.Add(@";^ System Sounds ^;");
foreach (string str in other_strings)
sentences.Add(str);
lvSentences.Items.Refresh(); // Workaround - Two way binding is better
}
private void cbLanguages_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
curLang = (Language)e.AddedItems[0];
loadLanguage();
}
private void lvSentences_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
synth.SetOutputToDefaultAudioDevice();
synth.Rate = (int)this.voiceRateSlider.Value;
if (this.lvSentences.SelectedItems.Count < 1)
return;
Sentence sentence = (Sentence)this.lvSentences.SelectedItem;
synth.SelectVoice(cbVoices.Text);
try { synth.Speak(sentence.voiceString); }
catch (Exception){} // Workaround - Some TTS engines crashes on destruction
}
private void openTXLogo_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
AboutWindow aboutWindow = new AboutWindow();
aboutWindow.ShowDialog();
}
private void InstallVoices_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
InstallVoicesWindow installVoicesWindow = new InstallVoicesWindow();
installVoicesWindow.ShowDialog();
}
private void buttonPlay_Click(object sender, RoutedEventArgs e)
{
lvSentences_MouseDoubleClick(sender, null);
}
private void buttonAddItem_Click(object sender, RoutedEventArgs e)
{
added_files++;
sentences.Add(new Sentence("new_file_" + added_files.ToString() + ";New Description;New Voice Message"));
this.lvSentences.Items.Refresh();
this.lvSentences.SelectedIndex = this.lvSentences.Items.Count - 1;
this.lvSentences.ScrollIntoView(this.lvSentences.SelectedItem);
}
private void buttonSaveFiles_Click(object sender, RoutedEventArgs e)
{
Cursor oldCursor = this.Cursor;
this.Cursor = Cursors.Wait;
synth.Rate = (int)this.fileRateSlider.Value;
int sampleRate = 32000;
if ((bool)this.rb16khz.IsChecked)
sampleRate = 16000;
else if ((bool)this.rb8khz.IsChecked)
sampleRate = 8000;
SpeechAudioFormatInfo audioFormat = new SpeechAudioFormatInfo(sampleRate, AudioBitsPerSample.Sixteen, AudioChannel.Mono);
System.IO.Directory.CreateDirectory(@"SOUNDS\" + curLang.sName + @"\SYSTEM");
StreamWriter sw = File.CreateText(@"SOUNDS\" + curLang.sName + @"\SYSTEM\system_sounds.txt");
int i;
for (i = 0; sentences[i].fileName != ""; i++)
{
sw.WriteLine(sentences[i].toRaw());
synth.SetOutputToWaveFile(@"SOUNDS\" + curLang.sName + @"\SYSTEM\" + sentences[i].fileName + ".wav", audioFormat);
try { synth.Speak(sentences[i].voiceString); }
catch (Exception){} // Workaround - Some TTS engines crashes on destruction
}
sw.Close();
sw = File.CreateText(@"SOUNDS\" + curLang.sName + @"\other_sounds.txt");
for (i++; i < sentences.Count; i++)
{
sw.WriteLine(sentences[i].toRaw());
synth.SetOutputToWaveFile(@"SOUNDS\" + curLang.sName + @"\" + sentences[i].fileName + ".wav", audioFormat);
try { synth.Speak(sentences[i].voiceString); }
catch (Exception){} // Workaround - Some TTS engines crashes on destruction
}
sw.Close();
synth.SetOutputToNull(); // Workaround - The synth does not release the sound file like it should
this.Cursor = oldCursor;
}
}
public class Language
{
public string lName { get; set; }
public string sName { get; set; }
}
public class Languages : List<Language>
{
public void Add(string longer, string shorter)
{
this.Add(new Language { lName = longer, sName = shorter });
}
}
public class Sentence
{
public string fileName { get; set; }
public string description { get; set; }
public string voiceString { get; set; }
public Sentence(string rawString)
{
string[] words = rawString.Split(';');
fileName = words[0].TrimStart(' ', '\"');
description = words[1];
voiceString = words[2].TrimEnd('\"', ',', ' ');
}
public string toRaw()
{
return "\"" +fileName + ";" + description + ";" + voiceString + "\",";
}
}
public class Sentences : List<Sentence>
{
public void Add(string rawString)
{
this.Add(new Sentence(rawString));
}
}
}

133
speaker/OpenTXspeak.csproj Normal file
View file

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{8143D08D-1861-42DD-A861-56B15DE42A69}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>OpenTXspeak</RootNamespace>
<AssemblyName>OpenTXspeak</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Speech" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="AboutWindow.xaml.cs">
<DependentUpon>AboutWindow.xaml</DependentUpon>
</Compile>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="installvoices.xaml.cs">
<DependentUpon>installvoices.xaml</DependentUpon>
</Compile>
<Compile Include="sentencetables.cs" />
<Page Include="installvoices.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="AboutWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<Resource Include="icon.ico" />
</ItemGroup>
<ItemGroup>
<Resource Include="eSpeak.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="speaker_logo.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="GPLv3_Logo.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

20
speaker/OpenTXspeak.sln Normal file
View file

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual C# Express 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTXspeak", "OpenTXspeak.csproj", "{8143D08D-1861-42DD-A861-56B15DE42A69}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8143D08D-1861-42DD-A861-56B15DE42A69}.Debug|x86.ActiveCfg = Debug|x86
{8143D08D-1861-42DD-A861-56B15DE42A69}.Debug|x86.Build.0 = Debug|x86
{8143D08D-1861-42DD-A861-56B15DE42A69}.Release|x86.ActiveCfg = Release|x86
{8143D08D-1861-42DD-A861-56B15DE42A69}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,71 @@
/* This file is part of OpenTX Speaker.
* OpenTX Speaker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* OpenTX Speaker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2014 Kjell Kernen */
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("OpenTX Speaker")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("OpenTX Team")]
[assembly: AssemblyProduct("OpenTX Speaker")]
[assembly: AssemblyCopyright("Copyright © Kjell Kernen 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2")]
[assembly: AssemblyFileVersion("1.2")]

71
speaker/Properties/Resources.Designer.cs generated Normal file
View file

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18444
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OpenTXspeak.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenTXspeak.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View file

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

30
speaker/Properties/Settings.Designer.cs generated Normal file
View file

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18444
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OpenTXspeak.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View file

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

49
speaker/aboutWindow.xaml Normal file
View file

@ -0,0 +1,49 @@
<Window x:Class="OpenTXspeak.AboutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="OpenTX About Window" Height="370" Width="357" Icon="/OpenTXspeak;component/icon.ico">
<Grid>
<StackPanel>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal" Width="240" HorizontalAlignment="Left">
<Label Content="Product:">
</Label>
<Label Content="Product Name" Name="lblProductName"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<Label Content="Version:"/>
<Label Content="Version" Name="lblVersion"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<Label Content="Company:" />
<Label Content="Company" Name="lblCompanyName"/>
</StackPanel>
<Label Content="Copyright" Name="lblCopyright" HorizontalAlignment="Left" />
</StackPanel>
<TextBlock>
<Hyperlink NavigateUri="http://www.open-tx.org/" RequestNavigate="Hyperlink_RequestNavigate">
<Image Source="/OpenTXspeak;component/icon.ico" Stretch="Uniform" Height="90" Width="90" Cursor="Hand" />
</Hyperlink>
</TextBlock>
</StackPanel>
<StackPanel Orientation="Vertical">
<TextBlock Margin="5,5,5,0" TextWrapping="Wrap"
Text="This application is used to edit OpenTX voice strings and generate audio files for use in the FrSky Taranis radio." />
<TextBlock Margin="5,10,5,0" TextWrapping="Wrap"
Text= "This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version." />
<TextBlock Margin="5,5,5,0" TextWrapping="Wrap"
Text= "This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose." />
<StackPanel Orientation="Horizontal">
<TextBlock TextWrapping="Wrap" Margin="5,5,5,0" Width="175"
Text= "See the GNU General Public License for more details." />
<TextBlock>
<Hyperlink NavigateUri="http://www.gnu.org/licenses/" RequestNavigate="Hyperlink_RequestNavigate">
<Image Height="60" Width="149" Source="/OpenTXspeak;component/GPLv3_Logo.png" Margin="0,5,0,0" Cursor="Hand" />
</Hyperlink>
</TextBlock>
</StackPanel>
</StackPanel>
</StackPanel>
</Grid>
</Window>

View file

@ -0,0 +1,62 @@
/* This file is part of OpenTX Speaker.
* OpenTX Speaker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* OpenTX Speaker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2014 Kjell Kernen */
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Navigation;
namespace OpenTXspeak
{
public partial class AboutWindow : Window
{
public AboutWindow()
{
InitializeComponent();
Assembly app = Assembly.GetExecutingAssembly();
AssemblyTitleAttribute title = (AssemblyTitleAttribute)app.GetCustomAttributes(typeof(AssemblyTitleAttribute), false)[0];
AssemblyProductAttribute product = (AssemblyProductAttribute)app.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0];
AssemblyCopyrightAttribute copyright = (AssemblyCopyrightAttribute)app.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false)[0];
AssemblyCompanyAttribute company = (AssemblyCompanyAttribute)app.GetCustomAttributes(typeof(AssemblyCompanyAttribute), false)[0];
Version version = app.GetName().Version;
this.Title = String.Format("About {0}", title.Title);
this.lblProductName.Content = product.Product;
this.lblVersion.Content = String.Format("Version {0}", version.ToString());
this.lblCopyright.Content = copyright.Copyright.ToString();
this.lblCompanyName.Content = company.Company;
}
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}
}
}

BIN
speaker/eSpeak.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
speaker/firmware_logo.xcf Normal file

Binary file not shown.

BIN
speaker/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View file

@ -0,0 +1,24 @@
<Window x:Class="OpenTXspeak.InstallVoicesWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Install Additional Voices" Height="269" Width="504">
<Grid>
<StackPanel Orientation="Vertical" >
<TextBlock Margin="5,5,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" TextWrapping="Wrap"
Text="The English default voice (Microsoft Anna) is quite good. Microsoft does however not provide free voices for all languages. If there is no voice available for your language, you must install one on your own. Any MS SAPI voice should work."/>
<TextBlock Margin="5,5,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" TextWrapping="Wrap"
Text="Use the phrases SAPI and TTS to search for voices. TTS is the general term for synthetic speech and SAPI is Microsoft's voice interface." />
<TextBlock Margin="5,5,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" TextWrapping="Wrap"
Text="There are several commercial alternatives available. These are high quility, but also expensive. There are also free open source alternatives. The downside to these is that the voices sound robotic. But they are clearly understandable." />
<StackPanel Orientation="Horizontal">
<TextBlock Margin="5,5,10,0" Width="370" HorizontalAlignment="Left" VerticalAlignment="Top" TextWrapping="Wrap"
Text="The author of this application used the free eSpeak voices to test voice generation. Many languages are supported. Click the image on the right to go to eSpeaks project page. There you can find out if your language is supported and download the voice package." />
<TextBlock>
<Hyperlink NavigateUri="http://espeak.sourceforge.net/" RequestNavigate="Hyperlink_RequestNavigate">
<Image Stretch="None" Source="/OpenTXspeak;component/eSpeak.png" Cursor="Hand" />
</Hyperlink>
</TextBlock>
</StackPanel>
</StackPanel>
</Grid>
</Window>

View file

@ -0,0 +1,53 @@
/* This file is part of OpenTX Speaker.
* OpenTX Speaker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* OpenTX Speaker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2014 Kjell Kernen */
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Navigation;
namespace OpenTXspeak
{
/// <summary>
/// Interaction logic for installvoices.xaml
/// </summary>
public partial class InstallVoicesWindow : Window
{
public InstallVoicesWindow()
{
InitializeComponent();
}
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}
}
}

2455
speaker/sentencetables.cs Normal file

File diff suppressed because it is too large Load diff

BIN
speaker/speaker_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
speaker/speaker_logo.xcf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB