From ecff71b0448e9a8979c0e811ce55151d894a9509 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 12:54:35 +0100 Subject: [PATCH 01/69] Cosmetics --- radio/src/lua/api_general.cpp | 30 +++++++----------------------- radio/src/lua/api_lcd.cpp | 30 +++++++----------------------- radio/src/lua/api_model.cpp | 30 +++++++----------------------- radio/src/lua/interface.cpp | 30 +++++++----------------------- radio/src/lua/lua_api.h | 30 +++++++----------------------- 5 files changed, 35 insertions(+), 115 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 5b04c0978..a3478fa11 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -31,7 +16,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * */ #include diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index 862798c6c..62a07c169 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -31,7 +16,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * */ #include diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index d2e4dd691..f350630f9 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -31,7 +16,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * */ #include diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 42e446446..a75cc28b0 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -31,7 +16,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * */ #include diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 5e93a3188..9aa231e22 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -31,7 +16,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * */ #ifndef _LUA_API_H_ From dd76e9d8bf14bcb63c2e127808ab6fda837d21bc Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 25 Mar 2016 14:04:30 +0100 Subject: [PATCH 02/69] Also backup members inside unions, the code is a bit more complicated since unions can have structs or simple types. --- radio/src/storage/datacopy.cpp | 11 ++++- radio/util/generate_datacopy.py | 71 ++++++++++++++++++++++++++------- 2 files changed, 66 insertions(+), 16 deletions(-) diff --git a/radio/src/storage/datacopy.cpp b/radio/src/storage/datacopy.cpp index 239db541d..1fc1a9730 100644 --- a/radio/src/storage/datacopy.cpp +++ b/radio/src/storage/datacopy.cpp @@ -1,4 +1,4 @@ -//This file was auto-generated by generate_datacopy.py script on Wed Mar 16 20:12:19 2016. Do not edit this file! +//This file was auto-generated by generate_datacopy.py script on Fri Mar 25 14:01:12 2016. Do not edit this file! @@ -77,6 +77,7 @@ void copyCustomFunctionData(A * dest, B * src) { dest->swtch = src->swtch; dest->func = src->func; + copyCustomFunctionData_all(&dest->CustomFunctionData_all, &src->CustomFunctionData_all); dest->active = src->active; } @@ -305,3 +306,11 @@ void copyRadioData(A * dest, B * src) dest->potsConfig = src->potsConfig; } +template +void copyCustomFunctionData_all(A * dest, B * src) +{ + dest->val = src->val; + dest->mode = src->mode; + dest->param = src->param; +} + diff --git a/radio/util/generate_datacopy.py b/radio/util/generate_datacopy.py index 22e87d6d9..9d1d9f7e4 100644 --- a/radio/util/generate_datacopy.py +++ b/radio/util/generate_datacopy.py @@ -12,33 +12,74 @@ if sys.platform == "darwin": structs = [] +extrastructs = [] + +def build_struct(cursor, anonymousUnion=False): + if not anonymousUnion: + structs.append(cursor.spelling) + print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) -def build_struct(cursor): - structs.append(cursor.spelling) - print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) for c in cursor.get_children(): - if c.kind == clang.cindex.CursorKind.FIELD_DECL: - if c.type.get_array_size() > 0: - if c.type.get_array_element_type().spelling in structs: - print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) - print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, c.spelling, c.spelling)) - print(" }") + if c.kind == clang.cindex.CursorKind.UNION_DECL: + if c.spelling: + raise "Cannot handle non anonymous unions" + + copiedUnionMember = False + for uc in c.get_children(): + if not uc.spelling or uc.kind == clang.cindex.CursorKind.PACKED_ATTR: + # Ignore + pass else: - print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (c.spelling, c.spelling, c.spelling)) - elif c.type.get_declaration().spelling in structs: - print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, c.spelling, c.spelling)) - else: - print(" dest->%s = src->%s;" % (c.spelling, c.spelling)) - print("}\n") + # per default we copy only the first member of a union and warn if there are more + # members (declare the other members NOBACKUP) + if copiedUnionMember: + print ("Warning more than one union member (%s) in anynomous union inside struct %s, consider NOBACKUP statements" % (uc.spelling, cursor.spelling), file=sys.stderr) + else: + copy_decl(uc, uc.spelling) + copiedUnionMember = True + + elif c.kind == clang.cindex.CursorKind.FIELD_DECL: + copy_decl(c, c.spelling) + + + if not anonymousUnion: + print("}\n") def build(cursor): result = [] for c in cursor.get_children(): if c.kind == clang.cindex.CursorKind.STRUCT_DECL: build_struct(c) + for c, spelling in extrastructs: + print("template \nvoid copy%s(A * dest, B * src)\n{" % spelling) + build_struct(c, True) + print ("}\n") + return result +def copy_decl(c, spelling): + childs = [ch for ch in c.get_children()] + if c.type.get_array_size() > 0: + if c.type.get_array_element_type().spelling in structs: + print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) + print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, spelling, spelling)) + print(" }") + else: + print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (spelling, spelling, spelling)) + elif c.type.kind == clang.cindex.TypeKind.UNEXPOSED and len(childs)==1 and childs[0].kind == clang.cindex.CursorKind.STRUCT_DECL: + # inline declared structs + spelling = c.semantic_parent.semantic_parent.spelling + "_" + spelling + + extrastructs.append((childs[0], spelling)) + print(" copy%s(&dest->%s, &src->%s);" % (spelling, spelling, spelling)) + + elif c.type.get_declaration().spelling in structs: + print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, spelling, spelling)) + else: + print(" dest->%s = src->%s;" % (spelling, spelling)) + + def header(): print("//This file was auto-generated by %s script on %s. Do not edit this file!\n\n\n" % (os.path.basename(sys.argv[0]), time.asctime())) From f073c9fe856b84ac02f4ad647817f66eacfa8ad9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 15:30:03 +0100 Subject: [PATCH 03/69] Dockerfile commited --- radio/util/Dockerfile | 18 ++++++++++++++ radio/util/build.py | 55 ++++++++++++++++++++++++++++++------------- 2 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 radio/util/Dockerfile diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile new file mode 100644 index 000000000..803dddf6d --- /dev/null +++ b/radio/util/Dockerfile @@ -0,0 +1,18 @@ +# An Debian image for compiling OpenTX 2.2 + +FROM debian:jessie +MAINTAINER bsongis + +RUN apt-get update && + apt-get install -y software-properties-common wget lib32z1 lib32ncurses5 git cmake gcc avr-libc build-essential libfox-1.6-dev python-qt4 +RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && + tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && + mv gcc-arm-none-eabi-4_7-2013q3 /opt/gcc-arm-none-eabi +ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin + +ADD http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb gcc-avr_4.7.2-2_amd64.deb +ADD http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb libmpc2_0.9-4_amd64.deb +RUN dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb + +VOLUME ["/opentx"] +ENTRYPOINT ["python", "/opentx/code/radio/util/build.py"] diff --git a/radio/util/build.py b/radio/util/build.py index 1517a9857..1bbe6e5bb 100644 --- a/radio/util/build.py +++ b/radio/util/build.py @@ -2,8 +2,17 @@ import os import sys +import subprocess +import shutil from fwoptions import * +# Error codes +INVALID_FIRMWARE = -1 +UNKNOWN_BOARD = -2 +INVALID_LANGUAGE = -3 +COMPILATION_ERROR = -4 +FIRMWARE_SIZE_TOO_BIG = -5 + # Board types BOARD_9X = 0 BOARD_GRUVIN9X = 1 @@ -15,13 +24,16 @@ BOARD_HORUS = 4 BOARD_FAMILY_AVR = 0 BOARD_FAMILY_ARM = 1 +if len(sys.argv) != 2: + exit(INVALID_FIRMWARE) + srcdir = os.path.dirname(os.path.realpath(__file__)) + "/../.." filename = sys.argv[1] root, ext = os.path.splitext(filename) options = root.split("-") -if options[0] != "opentx": - sys.exit("Invalid firmware"); +if len(options) < 2 or options[0] != "opentx": + exit(INVALID_FIRMWARE) filename = "opentx-" optcount = 1 @@ -116,7 +128,7 @@ elif options[optcount] == "horus": board = BOARD_HORUS board_family = BOARD_FAMILY_ARM else: - sys.exit("Unknown board") + exit(UNKNOWN_BOARD) filename += options[optcount] optcount += 1 @@ -144,7 +156,7 @@ for key in languages: if key == options[-1]: language = key if not language: - sys.exit("Invalid language") + exit(INVALID_LANGUAGE) command_options["TRANSLATIONS"] = language.upper() filename += "-" + language @@ -156,24 +168,35 @@ filename += ext firmware = "firmware" + ext # Launch CMake -cmd = "cmake" +cmd = ["cmake"] for opt, value in command_options.items(): - cmd += " -D%s=%s" % (opt, value) -cmd += " " + srcdir + cmd.append("-D%s=%s" % (opt, value)) if "OPENTX_VERSION_SUFFIX" in os.environ: - cmd += ' -DVERSION_SUFFIX="%s"' % os.environ["OPENTX_VERSION_SUFFIX"] -print cmd -os.system(cmd) + cmd.append('-DVERSION_SUFFIX="%s"' % os.environ["OPENTX_VERSION_SUFFIX"]) +cmd.append(srcdir) +proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +output, error = proc.communicate() +if proc.returncode != 0: + file("%s.err" % filename, "w").write(output + error) + exit(COMPILATION_ERROR) # Launch make firmware -cmd = "make firmware" -os.system(cmd) +cmd = ["make", "firmware"] +proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +output, error = proc.communicate() +if proc.returncode != 0: + file("%s.err" % filename, "w").write(output + error) + exit(COMPILATION_ERROR) # Check binary size if board_family == BOARD_FAMILY_ARM: size = os.stat(firmware).st_size else: - os.system("avr-size -A %s | grep Total | cut -f2- -d \" \" > ./size" % firmware) - size = file("./size").read().strip() -if int(size) > maxsize: - exit("Invalid size") + size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % firmware, shell=True) + size = int(size.strip()) +if size > maxsize: + exit(FIRMWARE_SIZE_TOO_BIG) + +# Copy binary to the binaries directory +shutil.copyfile(firmware, filename) +print filename From 34f9bc0b638ccc59a1732f1566301f6b2ba15022 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 15:39:55 +0100 Subject: [PATCH 04/69] Dockerfile commited --- radio/util/Dockerfile | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile index 803dddf6d..175c36cfe 100644 --- a/radio/util/Dockerfile +++ b/radio/util/Dockerfile @@ -3,11 +3,23 @@ FROM debian:jessie MAINTAINER bsongis -RUN apt-get update && - apt-get install -y software-properties-common wget lib32z1 lib32ncurses5 git cmake gcc avr-libc build-essential libfox-1.6-dev python-qt4 -RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && - tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && +RUN apt-get update && apt-get install -y \ + software-properties-common + wget + lib32z1 + lib32ncurses5 + git + cmake + gcc + avr-libc + build-essential + libfox-1.6-dev + python-qt4 + +RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ + tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ mv gcc-arm-none-eabi-4_7-2013q3 /opt/gcc-arm-none-eabi + ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin ADD http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb gcc-avr_4.7.2-2_amd64.deb From a681c341a2f30681c7c6cf8309ff7a28a6a32c1d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 15:43:16 +0100 Subject: [PATCH 05/69] Dockerfile commited --- radio/util/Dockerfile | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile index 175c36cfe..e569cbfdc 100644 --- a/radio/util/Dockerfile +++ b/radio/util/Dockerfile @@ -4,27 +4,26 @@ FROM debian:jessie MAINTAINER bsongis RUN apt-get update && apt-get install -y \ - software-properties-common - wget - lib32z1 - lib32ncurses5 - git - cmake - gcc - avr-libc - build-essential - libfox-1.6-dev + software-properties-common \ + wget \ + lib32z1 \ + lib32ncurses5 \ + git \ + cmake \ + gcc \ + avr-libc \ + build-essential \ + libfox-1.6-dev \ python-qt4 RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ mv gcc-arm-none-eabi-4_7-2013q3 /opt/gcc-arm-none-eabi +RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb gcc-avr_4.7.2-2_amd64.deb && \ + wget -q http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb libmpc2_0.9-4_amd64.deb && \ + dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb + ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin - -ADD http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb gcc-avr_4.7.2-2_amd64.deb -ADD http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb libmpc2_0.9-4_amd64.deb -RUN dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb - VOLUME ["/opentx"] ENTRYPOINT ["python", "/opentx/code/radio/util/build.py"] From 884e1feee4ca9e95c6187b54c9bc813966a1d93c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 15:47:48 +0100 Subject: [PATCH 06/69] Dockerfile commited --- radio/util/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile index e569cbfdc..836c69bc4 100644 --- a/radio/util/Dockerfile +++ b/radio/util/Dockerfile @@ -20,8 +20,8 @@ RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-updat tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ mv gcc-arm-none-eabi-4_7-2013q3 /opt/gcc-arm-none-eabi -RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb gcc-avr_4.7.2-2_amd64.deb && \ - wget -q http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb libmpc2_0.9-4_amd64.deb && \ +RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb && \ + wget -q http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb && \ dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin From ccfcfa85d00a2a6f286813de414381931252cb15 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 15:56:21 +0100 Subject: [PATCH 07/69] Dockerfile commited --- radio/util/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile index 836c69bc4..3662ae74a 100644 --- a/radio/util/Dockerfile +++ b/radio/util/Dockerfile @@ -26,4 +26,6 @@ RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_ ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin VOLUME ["/opentx"] + +WORKDIR /opentx/binaries ENTRYPOINT ["python", "/opentx/code/radio/util/build.py"] From 862199f8227618676ad9d00f054166290fa922e8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 16:23:12 +0100 Subject: [PATCH 08/69] Dockerfile commited --- radio/util/Dockerfile | 2 -- radio/util/build.py | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile index 3662ae74a..836c69bc4 100644 --- a/radio/util/Dockerfile +++ b/radio/util/Dockerfile @@ -26,6 +26,4 @@ RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_ ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin VOLUME ["/opentx"] - -WORKDIR /opentx/binaries ENTRYPOINT ["python", "/opentx/code/radio/util/build.py"] diff --git a/radio/util/build.py b/radio/util/build.py index 1bbe6e5bb..69d24a10a 100644 --- a/radio/util/build.py +++ b/radio/util/build.py @@ -28,7 +28,7 @@ if len(sys.argv) != 2: exit(INVALID_FIRMWARE) srcdir = os.path.dirname(os.path.realpath(__file__)) + "/../.." -filename = sys.argv[1] +directory, filename = os.path.split(sys.argv[1]) root, ext = os.path.splitext(filename) options = root.split("-") @@ -198,5 +198,5 @@ if size > maxsize: exit(FIRMWARE_SIZE_TOO_BIG) # Copy binary to the binaries directory -shutil.copyfile(firmware, filename) +shutil.copyfile(firmware, os.path.join(directory, filename)) print filename From 7501608aca5b985eb6e632e3525d8f04a988f3a4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 16:53:09 +0100 Subject: [PATCH 09/69] Build output now saved in a .out file ... so that we can grep for warnings! --- radio/util/build.py | 70 +++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/radio/util/build.py b/radio/util/build.py index 69d24a10a..ea1b60598 100644 --- a/radio/util/build.py +++ b/radio/util/build.py @@ -167,36 +167,50 @@ else: filename += ext firmware = "firmware" + ext -# Launch CMake -cmd = ["cmake"] -for opt, value in command_options.items(): - cmd.append("-D%s=%s" % (opt, value)) -if "OPENTX_VERSION_SUFFIX" in os.environ: - cmd.append('-DVERSION_SUFFIX="%s"' % os.environ["OPENTX_VERSION_SUFFIX"]) -cmd.append(srcdir) -proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) -output, error = proc.communicate() -if proc.returncode != 0: - file("%s.err" % filename, "w").write(output + error) +path = os.path.join(directory, filename) +outpath = path + ".out" +errpath = path + ".err" + +if os.path.isfile(errpath): exit(COMPILATION_ERROR) -# Launch make firmware -cmd = ["make", "firmware"] -proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) -output, error = proc.communicate() -if proc.returncode != 0: - file("%s.err" % filename, "w").write(output + error) - exit(COMPILATION_ERROR) +if not os.path.isfile(path): + # Launch CMake + cmd = ["cmake"] + for opt, value in command_options.items(): + cmd.append("-D%s=%s" % (opt, value)) + if "OPENTX_VERSION_SUFFIX" in os.environ: + cmd.append('-DVERSION_SUFFIX="%s"' % os.environ["OPENTX_VERSION_SUFFIX"]) + cmd.append(srcdir) + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode == 0: + file(outpath, "a").write(output + error) + else: + file(errpath, "w").write(output + error) + exit(COMPILATION_ERROR) -# Check binary size -if board_family == BOARD_FAMILY_ARM: - size = os.stat(firmware).st_size -else: - size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % firmware, shell=True) - size = int(size.strip()) -if size > maxsize: - exit(FIRMWARE_SIZE_TOO_BIG) + # Launch make firmware + cmd = ["make", "firmware"] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode == 0: + file(outpath, "a").write(output + error) + else: + file(errpath, "w").write(output + error) + exit(COMPILATION_ERROR) + + # Check binary size + if board_family == BOARD_FAMILY_ARM: + size = os.stat(firmware).st_size + else: + size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % firmware, shell=True) + size = int(size.strip()) + if size > maxsize: + exit(FIRMWARE_SIZE_TOO_BIG) + + # Copy binary to the binaries directory + shutil.copyfile(firmware, path) -# Copy binary to the binaries directory -shutil.copyfile(firmware, os.path.join(directory, filename)) print filename +exit(0) \ No newline at end of file From 2bb63e664463345e44570ebd6fc229fc3352aac3 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Fri, 25 Mar 2016 20:37:34 +0400 Subject: [PATCH 10/69] Header data is useful --- radio/src/targets/horus/system_stm32f4xx.c | 110 +++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/radio/src/targets/horus/system_stm32f4xx.c b/radio/src/targets/horus/system_stm32f4xx.c index 3ec7176f5..393603fc2 100644 --- a/radio/src/targets/horus/system_stm32f4xx.c +++ b/radio/src/targets/horus/system_stm32f4xx.c @@ -17,6 +17,116 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @version V1.1.0 + * @date 21-March-2015 + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * This file contains the system clock configuration for STM32F4xx devices, + * and is generated by the clock configuration tool + * stm32f4xx_Clock_Configuration_V1.1.0.xls + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier + * and Divider factors, AHB/APBx prescalers and Flash settings), + * depending on the configuration made in the clock xls tool. + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * 2. After each device reset the HSI (16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f4xx.s" file, to + * configure the system clock before to branch to main program. + * + * 3. If the system clock source selected by user fails to startup, the SystemInit() + * function will do nothing and HSI still used as system clock source. User can + * add some code to deal with this issue inside the SetSysClock() function. + * + * 4. The default value of HSE crystal is set to 25MHz, refer to "HSE_VALUE" define + * in "stm32f4xx.h" file. When HSE is used as system clock source, directly or + * through PLL, and you are using different crystal you have to adapt the HSE + * value to your own configuration. + * + * 5. This file configures the system clock as follows: + *============================================================================= + *============================================================================= + * Supported STM32F40xx/41xx/427x/437x devices + *----------------------------------------------------------------------------- + * System Clock source | PLL (HSE) + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 168000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 168000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 4 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 2 + *----------------------------------------------------------------------------- + * HSE Frequency(Hz) | 12000000 + *----------------------------------------------------------------------------- + * PLL_M | 12 + *----------------------------------------------------------------------------- + * PLL_N | 336 + *----------------------------------------------------------------------------- + * PLL_P | 2 + *----------------------------------------------------------------------------- + * PLL_Q | 7 + *----------------------------------------------------------------------------- + * PLLI2S_N | NA + *----------------------------------------------------------------------------- + * PLLI2S_R | NA + *----------------------------------------------------------------------------- + * I2S input clock | NA + *----------------------------------------------------------------------------- + * VDD(V) | 3.3 + *----------------------------------------------------------------------------- + * Main regulator output voltage | Scale1 mode + *----------------------------------------------------------------------------- + * Flash Latency(WS) | 5 + *----------------------------------------------------------------------------- + * Prefetch Buffer | ON + *----------------------------------------------------------------------------- + * Instruction cache | ON + *----------------------------------------------------------------------------- + * Data cache | ON + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Enabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ /** @addtogroup CMSIS * @{ From a2928c5d79c814d3c2cefdac03c9186870bc44f2 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Fri, 25 Mar 2016 20:50:34 +0400 Subject: [PATCH 11/69] [Horus] Clock is 168MHz, not 180... --- radio/src/targets/horus/system_stm32f4xx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/targets/horus/system_stm32f4xx.c b/radio/src/targets/horus/system_stm32f4xx.c index 393603fc2..5c609ffac 100644 --- a/radio/src/targets/horus/system_stm32f4xx.c +++ b/radio/src/targets/horus/system_stm32f4xx.c @@ -23,7 +23,7 @@ * @file system_stm32f4xx.c * @author MCD Application Team * @version V1.1.0 - * @date 21-March-2015 + * @date 25-March-2016 * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. * This file contains the system clock configuration for STM32F4xx devices, * and is generated by the clock configuration tool @@ -199,7 +199,7 @@ * @{ */ - uint32_t SystemCoreClock = 180000000; + uint32_t SystemCoreClock = 168000000; __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; @@ -426,7 +426,7 @@ static void SetSysClock(void) } /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ - FLASH->ACR = FLASH_ACR_PRFTEN |FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; + FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; /* Select the main PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); From c2786d36c9ce187df9233a8d3e1af00157b69f67 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 19:12:24 +0100 Subject: [PATCH 12/69] More compilation server errors --- companion/src/mainwindow.cpp | 15 ++++++++++++--- radio/util/build.py | 14 +++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index d93c05a5a..be359f1d3 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -360,16 +360,25 @@ void MainWindow::firmwareDownloadAccepted() int errnum = hline.mid(6).toInt(); switch(errnum) { case 1: - errormsg = tr("Not enough memory for all the selected firmware options"); + errormsg = tr("Not enough flash available on this board for all the selected options"); break; case 2: - errormsg = tr("Compilation server termporary failure, try later"); + errormsg = tr("Compilation server temporary failure, try later"); break; case 3: errormsg = tr("Compilation server too busy, try later"); break; case 4: - errormsg = tr("Compilation server requires registration, please check OpenTX web site"); + errormsg = tr("Compilation error"); + break; + case 5: + errormsg = tr("Invalid firmware"); + break; + case 6: + errormsg = tr("Invalid board"); + break; + case 7: + errormsg = tr("Invalid language"); break; default: errormsg = tr("Unknown server failure, try later"); diff --git a/radio/util/build.py b/radio/util/build.py index ea1b60598..1eb4ec30c 100644 --- a/radio/util/build.py +++ b/radio/util/build.py @@ -7,11 +7,11 @@ import shutil from fwoptions import * # Error codes -INVALID_FIRMWARE = -1 -UNKNOWN_BOARD = -2 -INVALID_LANGUAGE = -3 -COMPILATION_ERROR = -4 -FIRMWARE_SIZE_TOO_BIG = -5 +FIRMWARE_SIZE_TOO_BIG = 1 +COMPILATION_ERROR = 4 +INVALID_FIRMWARE = 5 +INVALID_BOARD = 6 +INVALID_LANGUAGE = 7 # Board types BOARD_9X = 0 @@ -128,7 +128,7 @@ elif options[optcount] == "horus": board = BOARD_HORUS board_family = BOARD_FAMILY_ARM else: - exit(UNKNOWN_BOARD) + exit(INVALID_BOARD) filename += options[optcount] optcount += 1 @@ -147,7 +147,7 @@ for opt, value in firmware_options.items(): else: optvalue = value[2] - if optvalue != None: + if optvalue is not None: command_options[value[0]] = optvalue # The firmware display language From 69fc1b9354a3278244b7091125f19a87328d2f17 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 22:48:00 +0100 Subject: [PATCH 13/69] We won't start the bad simulator --- .../src/simulation/simulatorinterface.cpp | 4 +++- compile.bat | 18 +++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/companion/src/simulation/simulatorinterface.cpp b/companion/src/simulation/simulatorinterface.cpp index 6793dbbfa..146c153d9 100644 --- a/companion/src/simulation/simulatorinterface.cpp +++ b/companion/src/simulation/simulatorinterface.cpp @@ -69,7 +69,7 @@ void registerSimulators() } } -SimulatorFactory *getSimulatorFactory(const QString &name) +SimulatorFactory * getSimulatorFactory(const QString & name) { QString simuName = name; while(1) { @@ -85,6 +85,8 @@ SimulatorFactory *getSimulatorFactory(const QString &name) if (pos <= 0) break; simuName = simuName.mid(0, pos); + if (simuName.count('-') == 0) + break; } return NULL; } diff --git a/compile.bat b/compile.bat index 9121027aa..94d22efe3 100644 --- a/compile.bat +++ b/compile.bat @@ -13,29 +13,29 @@ cd build SET COMMON_OPTIONS=-DCMAKE_PREFIX_PATH=C:\Qt\5.6\msvc2015 -DALLOW_NIGHTLY_BUILDS=YES -DVERSION_SUFFIX=%1 cmake %COMMON_OPTIONS% -DPCB=9X %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=GRUVIN9X %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=MEGA2560 %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=SKY9X %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=9XRPRO %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=TARANIS %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=TARANIS -DPCBREV=REVPLUS %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=TARANIS -DPCBREV=REV9E %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=HORUS %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" companion\src\installer.vcxproj /t:Rebuild /p:Configuration=Release From 47f083e1c8bf75b31c4004f690e5d4bb0ca04bb9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Mar 2016 22:50:45 +0100 Subject: [PATCH 14/69] Now we will try to build simulators the same way --- radio/src/targets/simu/CMakeLists.txt | 5 +-- radio/util/build.py | 56 +++++++++++++++------------ 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/radio/src/targets/simu/CMakeLists.txt b/radio/src/targets/simu/CMakeLists.txt index ad2c7034d..8a3c123c7 100644 --- a/radio/src/targets/simu/CMakeLists.txt +++ b/radio/src/targets/simu/CMakeLists.txt @@ -8,15 +8,14 @@ add_definitions(-DSIMU) remove_definitions(-DCLI) if(Qt5Widgets_FOUND) - string(TOLOWER ${TRANSLATIONS} TRANSLATION_LOWERCASE) - set(SIMULATOR_FLAVOUR opentx-${FLAVOUR}-${TRANSLATION_LOWERCASE}) + set(SIMULATOR_FLAVOUR opentx-${FLAVOUR}) set(SIMULATOR_TARGET ${SIMULATOR_FLAVOUR}-simulator) add_definitions(-DSIMULATOR_FLAVOUR="${SIMULATOR_FLAVOUR}") include_directories(${COMPANION_SRC_DIRECTORY} ${COMPANION_SRC_DIRECTORY}/simulation) add_library(${SIMULATOR_TARGET} SHARED ${SIMU_SRC} opentxsimulator.cpp) add_dependencies(${SIMULATOR_TARGET} ${FIRMWARE_DEPENDENCIES}) qt5_use_modules(${SIMULATOR_TARGET} Core) - add_custom_target(opentx-simulator DEPENDS ${SIMULATOR_TARGET}) + add_custom_target(libsimulator DEPENDS ${SIMULATOR_TARGET}) endif() if(MSVC) diff --git a/radio/util/build.py b/radio/util/build.py index 1eb4ec30c..242907d0d 100644 --- a/radio/util/build.py +++ b/radio/util/build.py @@ -24,20 +24,18 @@ BOARD_HORUS = 4 BOARD_FAMILY_AVR = 0 BOARD_FAMILY_ARM = 1 -if len(sys.argv) != 2: +if len(sys.argv) != 3: exit(INVALID_FIRMWARE) -srcdir = os.path.dirname(os.path.realpath(__file__)) + "/../.." -directory, filename = os.path.split(sys.argv[1]) +what = sys.argv[1] +directory, filename = os.path.split(sys.argv[2]) root, ext = os.path.splitext(filename) options = root.split("-") if len(options) < 2 or options[0] != "opentx": exit(INVALID_FIRMWARE) -filename = "opentx-" optcount = 1 - command_options = {} if options[optcount] == "9x": @@ -130,7 +128,19 @@ elif options[optcount] == "horus": else: exit(INVALID_BOARD) -filename += options[optcount] +if what == "firmware": + if board_family == BOARD_FAMILY_ARM: + ext = ".bin" + else: + ext = ".hex" + target = "firmware" + ext + filename = "opentx" +elif what == "libsimulator": + ext = ".so" + target = "libopentx-" + options[optcount] + "-simulator.so" + filename = "libopentx" + +filename += "-" + options[optcount] optcount += 1 # The firmware options @@ -158,15 +168,9 @@ for key in languages: if not language: exit(INVALID_LANGUAGE) command_options["TRANSLATIONS"] = language.upper() -filename += "-" + language - -if board_family == BOARD_FAMILY_ARM: - ext = ".bin" -else: - ext = ".hex" -filename += ext -firmware = "firmware" + ext +filename += "-" + language + ext +srcdir = os.path.dirname(os.path.realpath(__file__)) + "/../.." path = os.path.join(directory, filename) outpath = path + ".out" errpath = path + ".err" @@ -190,8 +194,8 @@ if not os.path.isfile(path): file(errpath, "w").write(output + error) exit(COMPILATION_ERROR) - # Launch make firmware - cmd = ["make", "firmware"] + # Launch make + cmd = ["make", what] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = proc.communicate() if proc.returncode == 0: @@ -200,17 +204,19 @@ if not os.path.isfile(path): file(errpath, "w").write(output + error) exit(COMPILATION_ERROR) - # Check binary size - if board_family == BOARD_FAMILY_ARM: - size = os.stat(firmware).st_size - else: - size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % firmware, shell=True) - size = int(size.strip()) - if size > maxsize: - exit(FIRMWARE_SIZE_TOO_BIG) + if what == "firmware": + # Check binary size + if board_family == BOARD_FAMILY_ARM: + size = os.stat(firmware).st_size + else: + size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % firmware, shell=True) + size = int(size.strip()) + if size > maxsize: + exit(FIRMWARE_SIZE_TOO_BIG) + # Copy binary to the binaries directory - shutil.copyfile(firmware, path) + shutil.copyfile(target, path) print filename exit(0) \ No newline at end of file From 210ee69101e01d3c0bfbc6e7af7747f5c622252d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 10:49:16 +0100 Subject: [PATCH 15/69] Travis fix --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index c8d72a914..8603c0676 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,12 +9,12 @@ before_install: - sudo add-apt-repository 'deb http://llvm.org/apt/precise/ llvm-toolchain-precise main' --yes - wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-get update -qq - - rsync -av firmware.diydrones.com::Tools/Travis/*.deb ExtraPackages +# - rsync -av firmware.diydrones.com::Tools/Travis/*.deb ExtraPackages install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 - - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" - - export CXX="g++-5" CC="gcc-5" +# - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" +# - export CXX="g++-5" CC="gcc-5" script: - ./radio/util/commit-tests.sh . From ca47684e36f37d7efb8a40a8469f67d93219441c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 11:26:17 +0100 Subject: [PATCH 16/69] Travis fix --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 8603c0676..43573a94c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,9 @@ install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 # - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" # - export CXX="g++-5" CC="gcc-5" + - wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb | dpkg --install - + - wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | dpkg --install - + - wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | dpkg --install - script: - ./radio/util/commit-tests.sh . From 4bf837b21f840a3c5a8d864d1ae9b867aa303a02 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 11:36:29 +0100 Subject: [PATCH 17/69] Travis again --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 43573a94c..b7d022269 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,9 +15,9 @@ install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 # - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" # - export CXX="g++-5" CC="gcc-5" - - wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb | dpkg --install - - - wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | dpkg --install - - - wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | dpkg --install - + - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb | dpkg --install - + - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | dpkg --install - + - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | dpkg --install - script: - ./radio/util/commit-tests.sh . From d609158b27d5cbb40a086891389f6b3a26de83b5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 12:29:40 +0100 Subject: [PATCH 18/69] Travis again --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b7d022269..6c187a995 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,9 +15,9 @@ install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 # - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" # - export CXX="g++-5" CC="gcc-5" - - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb | dpkg --install - - - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | dpkg --install - - - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | dpkg --install - + - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb | sudo dpkg --install - + - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | sudo dpkg --install - + - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | sudo dpkg --install - script: - ./radio/util/commit-tests.sh . From 02730382892b029a2e2f3631ab0592eb8cd54391 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 12:48:47 +0100 Subject: [PATCH 19/69] Python build script fix --- radio/util/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/util/build.py b/radio/util/build.py index 242907d0d..814755eab 100644 --- a/radio/util/build.py +++ b/radio/util/build.py @@ -209,7 +209,7 @@ if not os.path.isfile(path): if board_family == BOARD_FAMILY_ARM: size = os.stat(firmware).st_size else: - size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % firmware, shell=True) + size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % target, shell=True) size = int(size.strip()) if size > maxsize: exit(FIRMWARE_SIZE_TOO_BIG) From e774fe091cd193301a0e09e69515db9dbdb8d693 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 13:13:42 +0100 Subject: [PATCH 20/69] Travis again --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6c187a995..92993f141 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,9 +15,9 @@ install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 # - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" # - export CXX="g++-5" CC="gcc-5" - - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb | sudo dpkg --install - - - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | sudo dpkg --install - - - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | sudo dpkg --install - + - sudo wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb && dpkg --install gcc-avr_1%253a4.8-2.1_amd64.deb + # - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | sudo dpkg --install - + # - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | sudo dpkg --install - script: - ./radio/util/commit-tests.sh . From 06cdc6ba7bc6c837539876c71dd291af60be8a0e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 13:24:18 +0100 Subject: [PATCH 21/69] Travis again --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 92993f141..bb2d5b59f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 # - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" # - export CXX="g++-5" CC="gcc-5" - - sudo wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb && dpkg --install gcc-avr_1%253a4.8-2.1_amd64.deb + - sudo wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb && sudo dpkg --install gcc-avr_1%253a4.8-2.1_amd64.deb # - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | sudo dpkg --install - # - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | sudo dpkg --install - From 42f1515b2f92b455f8a381ac55e0a0bd68809c9c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 14:04:47 +0100 Subject: [PATCH 22/69] Travis again --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index bb2d5b59f..a410ef0f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,8 @@ install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 # - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" # - export CXX="g++-5" CC="gcc-5" - - sudo wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb && sudo dpkg --install gcc-avr_1%253a4.8-2.1_amd64.deb - # - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb | sudo dpkg --install - + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb && sudo dpkg --install gcc-avr_1%3a4.8-2.1_amd64.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb && sudo dpkg --install avr-libc_1%3a1.8.0-4.1_all.deb # - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | sudo dpkg --install - script: From 1c9a5ed75348a3d788d5c2d0370bdf7f047dac59 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 14:13:50 +0100 Subject: [PATCH 23/69] Travis again --- .travis.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index a410ef0f5..975a1b37c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,9 +15,12 @@ install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 # - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" # - export CXX="g++-5" CC="gcc-5" - - wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb && sudo dpkg --install gcc-avr_1%3a4.8-2.1_amd64.deb - - wget --quiet http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb && sudo dpkg --install avr-libc_1%3a1.8.0-4.1_all.deb - # - sudo wget --quiet --output-document=- http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb | sudo dpkg --install - + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/libmpfr4_3.1.2-1_amd64.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/libmpc3_1.0.1-1ubuntu1_amd64.deb + - sudo dpkg --install gcc-avr_1%3a4.8-2.1_amd64.deb avr-libc_1%3a1.8.0-4.1_all.deb libmpfr4_3.1.2-1_amd64.deb binutils-avr_2.23.1-2.1_amd64.deb libmpc3_1.0.1-1ubuntu1_amd64.deb script: - ./radio/util/commit-tests.sh . From dfd4a04220d10343f0da20fa1bd355ae30aa6802 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 15:48:42 +0100 Subject: [PATCH 24/69] Revert "Also backup members inside unions," This reverts commit dd76e9d8bf14bcb63c2e127808ab6fda837d21bc. --- radio/src/storage/datacopy.cpp | 11 +---- radio/util/generate_datacopy.py | 71 +++++++-------------------------- 2 files changed, 16 insertions(+), 66 deletions(-) diff --git a/radio/src/storage/datacopy.cpp b/radio/src/storage/datacopy.cpp index 1fc1a9730..239db541d 100644 --- a/radio/src/storage/datacopy.cpp +++ b/radio/src/storage/datacopy.cpp @@ -1,4 +1,4 @@ -//This file was auto-generated by generate_datacopy.py script on Fri Mar 25 14:01:12 2016. Do not edit this file! +//This file was auto-generated by generate_datacopy.py script on Wed Mar 16 20:12:19 2016. Do not edit this file! @@ -77,7 +77,6 @@ void copyCustomFunctionData(A * dest, B * src) { dest->swtch = src->swtch; dest->func = src->func; - copyCustomFunctionData_all(&dest->CustomFunctionData_all, &src->CustomFunctionData_all); dest->active = src->active; } @@ -306,11 +305,3 @@ void copyRadioData(A * dest, B * src) dest->potsConfig = src->potsConfig; } -template -void copyCustomFunctionData_all(A * dest, B * src) -{ - dest->val = src->val; - dest->mode = src->mode; - dest->param = src->param; -} - diff --git a/radio/util/generate_datacopy.py b/radio/util/generate_datacopy.py index 9d1d9f7e4..22e87d6d9 100644 --- a/radio/util/generate_datacopy.py +++ b/radio/util/generate_datacopy.py @@ -12,74 +12,33 @@ if sys.platform == "darwin": structs = [] -extrastructs = [] - -def build_struct(cursor, anonymousUnion=False): - if not anonymousUnion: - structs.append(cursor.spelling) - print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) +def build_struct(cursor): + structs.append(cursor.spelling) + print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) for c in cursor.get_children(): - if c.kind == clang.cindex.CursorKind.UNION_DECL: - if c.spelling: - raise "Cannot handle non anonymous unions" - - copiedUnionMember = False - for uc in c.get_children(): - if not uc.spelling or uc.kind == clang.cindex.CursorKind.PACKED_ATTR: - # Ignore - pass + if c.kind == clang.cindex.CursorKind.FIELD_DECL: + if c.type.get_array_size() > 0: + if c.type.get_array_element_type().spelling in structs: + print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) + print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, c.spelling, c.spelling)) + print(" }") else: - # per default we copy only the first member of a union and warn if there are more - # members (declare the other members NOBACKUP) - if copiedUnionMember: - print ("Warning more than one union member (%s) in anynomous union inside struct %s, consider NOBACKUP statements" % (uc.spelling, cursor.spelling), file=sys.stderr) - else: - copy_decl(uc, uc.spelling) - copiedUnionMember = True - - elif c.kind == clang.cindex.CursorKind.FIELD_DECL: - copy_decl(c, c.spelling) - - - if not anonymousUnion: - print("}\n") + print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (c.spelling, c.spelling, c.spelling)) + elif c.type.get_declaration().spelling in structs: + print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, c.spelling, c.spelling)) + else: + print(" dest->%s = src->%s;" % (c.spelling, c.spelling)) + print("}\n") def build(cursor): result = [] for c in cursor.get_children(): if c.kind == clang.cindex.CursorKind.STRUCT_DECL: build_struct(c) - for c, spelling in extrastructs: - print("template \nvoid copy%s(A * dest, B * src)\n{" % spelling) - build_struct(c, True) - print ("}\n") - return result -def copy_decl(c, spelling): - childs = [ch for ch in c.get_children()] - if c.type.get_array_size() > 0: - if c.type.get_array_element_type().spelling in structs: - print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) - print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, spelling, spelling)) - print(" }") - else: - print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (spelling, spelling, spelling)) - elif c.type.kind == clang.cindex.TypeKind.UNEXPOSED and len(childs)==1 and childs[0].kind == clang.cindex.CursorKind.STRUCT_DECL: - # inline declared structs - spelling = c.semantic_parent.semantic_parent.spelling + "_" + spelling - - extrastructs.append((childs[0], spelling)) - print(" copy%s(&dest->%s, &src->%s);" % (spelling, spelling, spelling)) - - elif c.type.get_declaration().spelling in structs: - print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, spelling, spelling)) - else: - print(" dest->%s = src->%s;" % (spelling, spelling)) - - def header(): print("//This file was auto-generated by %s script on %s. Do not edit this file!\n\n\n" % (os.path.basename(sys.argv[0]), time.asctime())) From e1b7848a91df7b9c854d68d44c9f8754c40bab6e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 16:13:00 +0100 Subject: [PATCH 25/69] Cosmetics --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 975a1b37c..a108c9eaa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,12 +9,10 @@ before_install: - sudo add-apt-repository 'deb http://llvm.org/apt/precise/ llvm-toolchain-precise main' --yes - wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-get update -qq -# - rsync -av firmware.diydrones.com::Tools/Travis/*.deb ExtraPackages install: - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 -# - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" -# - export CXX="g++-5" CC="gcc-5" + - export CXX="g++-5" CC="gcc-5" - wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb - wget --quiet http://firmware.ardupilot.org/Tools/Travis/libmpfr4_3.1.2-1_amd64.deb - wget --quiet http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb From a70cbe6a0d67a2263e8d95480aa15e0763552ed7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 16:32:57 +0100 Subject: [PATCH 26/69] Companion now able to use .dfu files for flashing radio firmware --- companion/src/flashfirmwaredialog.cpp | 2 +- companion/src/flashfirmwaredialog.h | 3 ++- companion/src/radiointerface.cpp | 14 ++++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/companion/src/flashfirmwaredialog.cpp b/companion/src/flashfirmwaredialog.cpp index a6ee513ca..9ce7efe70 100644 --- a/companion/src/flashfirmwaredialog.cpp +++ b/companion/src/flashfirmwaredialog.cpp @@ -124,7 +124,7 @@ void FlashFirmwareDialog::on_firmwareLoad_clicked() QString fileName = QFileDialog::getOpenFileName(this, tr("Open Firmware File"), g.flashDir(), FLASH_FILES_FILTER); if (!fileName.isEmpty()) { fwName = fileName; - if (!fwName.isEmpty() && !FirmwareInterface(fwName).isValid()) { + if (!fwName.isEmpty() && !fwName.endsWith(".dfu") && !FirmwareInterface(fwName).isValid()) { QMessageBox::warning(this, tr("Warning"), tr("%1 may not be a valid firmware file").arg(fwName)); } updateUI(); diff --git a/companion/src/flashfirmwaredialog.h b/companion/src/flashfirmwaredialog.h index 78a70f397..883ec429d 100644 --- a/companion/src/flashfirmwaredialog.h +++ b/companion/src/flashfirmwaredialog.h @@ -8,9 +8,10 @@ #define HEX_FILES_FILTER "HEX files (*.hex);;" #define BIN_FILES_FILTER "BIN files (*.bin);;" +#define DFU_FILES_FILTER "DFU files (*.dfu);;" #define EEPE_FILES_FILTER "EEPE EEPROM files (*.eepe);;" #define EEPROM_FILES_FILTER "EEPE files (*.eepe *.bin *.hex);;" EEPE_FILES_FILTER BIN_FILES_FILTER HEX_FILES_FILTER -#define FLASH_FILES_FILTER "FLASH files (*.bin *.hex);;" BIN_FILES_FILTER HEX_FILES_FILTER +#define FLASH_FILES_FILTER "FLASH files (*.bin *.hex *.dfu);;" BIN_FILES_FILTER HEX_FILES_FILTER DFU_FILES_FILTER #define EXTERNAL_EEPROM_FILES_FILTER "EEPROM files (*.bin *.hex);;" BIN_FILES_FILTER HEX_FILES_FILTER #define ER9X_EEPROM_FILE_TYPE "ER9X_EEPROM_FILE" #define EEPE_EEPROM_FILE_HEADER "EEPE EEPROM FILE" diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index 2bfec44ab..7dec64b7c 100644 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -62,18 +62,20 @@ QStringList getAvrdudeArgs(const QString &cmd, const QString &filename) QStringList getDfuArgs(const QString & cmd, const QString & filename) { - QStringList arguments; + QStringList args; burnConfigDialog bcd; QString memory = "0x08000000"; if (cmd == "-U") { memory.append(QString(":%1").arg(MAX_FSIZE)); } - arguments << bcd.getDFUArgs() << "--dfuse-address" << memory; // removed for Horus, is it really needed? << "-d" << "0483:df11"; + args << bcd.getDFUArgs(); + if (!filename.endsWith(".dfu")) { + args << "--dfuse-address" << memory; + } + // removed for Horus, is it really needed? args << "-d" << "0483:df11"; QString fullcmd = cmd + filename; - - arguments << "" << fullcmd; - - return arguments; + args << "" << fullcmd; + return args; } QStringList getSambaArgs(const QString &tcl) From 6ceb575d1ed17332a8fe7c2eab66d9dd0a113880 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 16:34:12 +0100 Subject: [PATCH 27/69] DFU-UTIL "-d 0483:df11" again there --- companion/src/radiointerface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index 7dec64b7c..dc8d1359a 100644 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -72,7 +72,7 @@ QStringList getDfuArgs(const QString & cmd, const QString & filename) if (!filename.endsWith(".dfu")) { args << "--dfuse-address" << memory; } - // removed for Horus, is it really needed? args << "-d" << "0483:df11"; + args << "-d" << "0483:df11"; QString fullcmd = cmd + filename; args << "" << fullcmd; return args; From c2412ca05e92a6bb9cdc39489fed243b9ceb49d4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 23:04:39 +0100 Subject: [PATCH 28/69] Python scripts with the executable flag --- radio/util/build.py | 0 radio/util/fwoptions.py | 0 radio/util/generate_datacopy.py | 0 radio/util/tts_cz.py | 0 radio/util/tts_de.py | 0 radio/util/tts_en.py | 0 radio/util/tts_es.py | 0 radio/util/tts_fr.py | 0 radio/util/tts_it.py | 0 radio/util/tts_pt.py | 0 10 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 radio/util/build.py mode change 100644 => 100755 radio/util/fwoptions.py mode change 100644 => 100755 radio/util/generate_datacopy.py mode change 100644 => 100755 radio/util/tts_cz.py mode change 100644 => 100755 radio/util/tts_de.py mode change 100644 => 100755 radio/util/tts_en.py mode change 100644 => 100755 radio/util/tts_es.py mode change 100644 => 100755 radio/util/tts_fr.py mode change 100644 => 100755 radio/util/tts_it.py mode change 100644 => 100755 radio/util/tts_pt.py diff --git a/radio/util/build.py b/radio/util/build.py old mode 100644 new mode 100755 diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py old mode 100644 new mode 100755 diff --git a/radio/util/generate_datacopy.py b/radio/util/generate_datacopy.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_cz.py b/radio/util/tts_cz.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_de.py b/radio/util/tts_de.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_en.py b/radio/util/tts_en.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_es.py b/radio/util/tts_es.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_fr.py b/radio/util/tts_fr.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_it.py b/radio/util/tts_it.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_pt.py b/radio/util/tts_pt.py old mode 100644 new mode 100755 From 8c636e31d9fcbcea0328e43e14c481bd6a7fe36a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 26 Mar 2016 23:06:54 +0100 Subject: [PATCH 29/69] Dockerfile updated --- radio/util/Dockerfile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile index 836c69bc4..9d095ef72 100644 --- a/radio/util/Dockerfile +++ b/radio/util/Dockerfile @@ -14,7 +14,12 @@ RUN apt-get update && apt-get install -y \ avr-libc \ build-essential \ libfox-1.6-dev \ - python-qt4 + python-qt4 \ + qt5-default \ + qttools5-dev \ + qtmultimedia5-dev \ + qttools5-dev-tools \ + libsdl1.2-dev RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ @@ -24,6 +29,5 @@ RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_ wget -q http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb && \ dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb -ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin VOLUME ["/opentx"] -ENTRYPOINT ["python", "/opentx/code/radio/util/build.py"] +ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin:/opentx/code/radio/util From 8d5e5b2d011534d8381aa7e0a5d13ce558e89bc9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 27 Mar 2016 09:54:41 +0200 Subject: [PATCH 30/69] Warnings fixed on VC++ 2015 --- radio/src/opentx.h | 4 ++-- radio/src/targets/simu/CMakeLists.txt | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index b9da6c379..cc7a82a65 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -222,8 +222,8 @@ #endif #if defined(SIMU) - #ifndef FORCEINLINE - #define FORCEINLINE + #if !defined(FORCEINLINE) + #define FORCEINLINE inline #endif #if !defined(NOINLINE) #define NOINLINE diff --git a/radio/src/targets/simu/CMakeLists.txt b/radio/src/targets/simu/CMakeLists.txt index 8a3c123c7..8f8b45d82 100644 --- a/radio/src/targets/simu/CMakeLists.txt +++ b/radio/src/targets/simu/CMakeLists.txt @@ -20,7 +20,6 @@ endif() if(MSVC) set(CMAKE_CXX_FLAGS "/EHsc /LD") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:MULTIPLE") include_directories(${PROJECT_SOURCE_DIR}/winbuild C:/Programs/pthreads/Pre-built.2/include C:/Programs/msinttypes C:/Programs/dirent/include) target_link_libraries(${SIMULATOR_TARGET} PRIVATE C:/Programs/pthreads/Pre-built.2/lib/pthreadVC2.lib) else() From 7ec0dd8a40a5b4f748893a0cc77f0e6de028a526 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 27 Mar 2016 10:18:31 +0200 Subject: [PATCH 31/69] Qt4 was still required for gtests --- radio/src/tests/CMakeLists.txt | 6 ++---- radio/src/tests/gtests.cpp | 2 +- radio/src/tests/lcd.cpp | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index 16cde69a2..860442512 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -4,9 +4,6 @@ set(GTEST_SRCDIR /usr/src/gtest) if(EXISTS "${GTEST_SRCDIR}/src/gtest-all.cc") add_library(gtests-lib STATIC EXCLUDE_FROM_ALL ${GTEST_SRCDIR}/src/gtest-all.cc ) target_include_directories(gtests-lib PUBLIC ${GTEST_INCDIR} PUBLIC ${GTEST_SRCDIR}) - - find_package(Qt4 4.8.1 REQUIRED) - include(${QT_USE_FILE}) add_definitions(-DSIMU) set(TESTS_PATH ${RADIO_SRC_DIRECTORY}) configure_file(${RADIO_SRC_DIRECTORY}/tests/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY) @@ -19,8 +16,9 @@ if(EXISTS "${GTEST_SRCDIR}/src/gtest-all.cc") file(GLOB TEST_SRC_FILES ${RADIO_SRC_DIRECTORY}/tests/*.cpp) add_executable(gtests EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h ${RADIO_SRC} ../targets/simu/simpgmspace.cpp) + qt5_use_modules(gtests Core Widgets) add_dependencies(gtests ${FIRMWARE_DEPENDENCIES} gtests-lib) - target_link_libraries(gtests gtests-lib ${QT_LIBRARIES} pthread) + target_link_libraries(gtests gtests-lib pthread) message("Added optional gtests target") else() message("WARNING: can't find gtests source, gtest target will not be available!") diff --git a/radio/src/tests/gtests.cpp b/radio/src/tests/gtests.cpp index c8be129a3..dbec8f7a6 100644 --- a/radio/src/tests/gtests.cpp +++ b/radio/src/tests/gtests.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include +#include #include "gtests.h" int32_t lastAct = 0; diff --git a/radio/src/tests/lcd.cpp b/radio/src/tests/lcd.cpp index 3a1a6794b..2c7d47765 100644 --- a/radio/src/tests/lcd.cpp +++ b/radio/src/tests/lcd.cpp @@ -20,8 +20,8 @@ #include #include -#include -#include +#include +#include #include #include From 1fba706bdbd5b8c0a275a9d50a3bed23aad8ac27 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 27 Mar 2016 10:33:32 +0200 Subject: [PATCH 32/69] Compilation fixes --- radio/src/opentx.cpp | 2 +- radio/src/targets/9x/board_stock.cpp | 42 +++++++++---------- radio/src/targets/gruvin9x/board_gruvin9x.cpp | 2 +- radio/src/targets/mega2560/board_mega2560.cpp | 2 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index d44aced1e..dabb7ea2c 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -921,7 +921,7 @@ getvalue_t convert8bitsTelemValue(uint8_t channel, ls_telemetry_value_t value) #endif #if defined(FRSKY)&& !defined(CPUARM) -FORCEINLINE void convertUnit(getvalue_t & val, uint8_t & unit) +void convertUnit(getvalue_t & val, uint8_t & unit) { if (IS_IMPERIAL_ENABLE()) { if (unit == UNIT_TEMPERATURE) { diff --git a/radio/src/targets/9x/board_stock.cpp b/radio/src/targets/9x/board_stock.cpp index 05d39fca2..64824144f 100644 --- a/radio/src/targets/9x/board_stock.cpp +++ b/radio/src/targets/9x/board_stock.cpp @@ -1,23 +1,23 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #include "../../opentx.h" #if defined(ROTARY_ENCODER_NAVIGATION) @@ -279,7 +279,7 @@ uint8_t trimDown(uint8_t idx) return trimHelper(~PIND, idx); } -FORCEINLINE void readKeysAndTrims() +void readKeysAndTrims() { uint8_t enuk = KEY_MENU; diff --git a/radio/src/targets/gruvin9x/board_gruvin9x.cpp b/radio/src/targets/gruvin9x/board_gruvin9x.cpp index 75dc10ff4..11d4f5d2e 100644 --- a/radio/src/targets/gruvin9x/board_gruvin9x.cpp +++ b/radio/src/targets/gruvin9x/board_gruvin9x.cpp @@ -240,7 +240,7 @@ uint8_t trimDown(uint8_t idx) return (in & pgm_read_byte(crossTrim+idx)); } -FORCEINLINE void readKeysAndTrims() +void readKeysAndTrims() { uint8_t enuk = KEY_MENU; diff --git a/radio/src/targets/mega2560/board_mega2560.cpp b/radio/src/targets/mega2560/board_mega2560.cpp index 1496e3f60..8cd8e97c4 100644 --- a/radio/src/targets/mega2560/board_mega2560.cpp +++ b/radio/src/targets/mega2560/board_mega2560.cpp @@ -165,7 +165,7 @@ uint8_t trimDown(uint8_t idx) return (in & pgm_read_byte(crossTrim+idx)); } -FORCEINLINE void readKeysAndTrims() +void readKeysAndTrims() { uint8_t enuk = KEY_MENU; From 2c256e9e736a7147cb1945b4196d7e993b021241 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 27 Mar 2016 10:46:19 +0200 Subject: [PATCH 33/69] Avoids generating all bitmaps one time per CPU during compilation --- cmake/Bitmaps.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Bitmaps.cmake b/cmake/Bitmaps.cmake index 16c54a462..145aeff0f 100644 --- a/cmake/Bitmaps.cmake +++ b/cmake/Bitmaps.cmake @@ -1,4 +1,5 @@ macro(add_bitmaps_target targetname filter width format) + set(bitmaps_files) file(GLOB bitmaps ${filter}) foreach(bitmap ${bitmaps}) get_filename_component(target ${bitmap} NAME_WE) From fef78a1b9792ab80665519ff6889d9774c855139 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 27 Mar 2016 10:49:04 +0200 Subject: [PATCH 34/69] Compilation fix --- radio/src/bitmaps/horus/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/bitmaps/horus/CMakeLists.txt b/radio/src/bitmaps/horus/CMakeLists.txt index d1b5ab591..9289b19ec 100644 --- a/radio/src/bitmaps/horus/CMakeLists.txt +++ b/radio/src/bitmaps/horus/CMakeLists.txt @@ -18,4 +18,4 @@ add_bitmaps_target(horus_layouts_masks "${RADIO_SRC_DIRECTORY}/gui/horus/layouts add_bitmaps_target(horus_themes_bitmaps "${RADIO_SRC_DIRECTORY}/gui/horus/themes/*.png" 480 5/6/5) add_bitmaps_target(horus_fonts ${RADIO_SRC_DIRECTORY}/fonts/horus/*.png 480 8bits) add_bitmaps_target(horus_volume_masks ${RADIO_SRC_DIRECTORY}/bitmaps/horus/volume/*.png 480 8bits) -add_dependencies(horus_bitmaps horus_volume_masks horus_calibration_bitmaps horus_alpha_bitmaps horus_alpha_calibration_bitmaps horus_masks horus_slider_masks horus_themes_bitmaps horus_layouts_masks horus_fonts) +add_dependencies(horus_bitmaps horus_calibration_bitmaps horus_button_bitmaps horus_alpha_bitmaps horus_alpha_calibration_bitmaps horus_masks horus_slider_masks horus_layouts_masks horus_themes_bitmaps horus_fonts horus_volume_masks) From 2c00a3437f4e344815fc457d62a17164e86a3abd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 27 Mar 2016 12:56:48 +0200 Subject: [PATCH 35/69] Checkscreenshot simplification --- radio/src/tests/lcd.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/radio/src/tests/lcd.cpp b/radio/src/tests/lcd.cpp index 2c7d47765..60e31a5d4 100644 --- a/radio/src/tests/lcd.cpp +++ b/radio/src/tests/lcd.cpp @@ -82,18 +82,11 @@ bool checkScreenshot(const QString & test) QImage buffer(LCD_W, LCD_H, QImage::Format_RGB32); QPainter p(&buffer); doPaint(p); + QString filename(QString("%1_%2x%3.png").arg(test).arg(LCD_W).arg(LCD_H)); - buffer.save("/tmp/" + filename); - QFile screenshot("/tmp/" + filename); - if (!screenshot.open(QIODevice::ReadOnly)) - return false; - QFile reference( TESTS_PATH "/tests/" + filename); - if (!reference.open(QIODevice::ReadOnly)) - return false; - if (reference.readAll() != screenshot.readAll()) - return false; - screenshot.remove(); - return true; + QImage reference(TESTS_PATH "/tests/" + filename); + + return buffer == reference; } #if defined(COLORLCD) From 7e4b5d97e35f4d384266536ac2fb30dc16d1f2ea Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 27 Mar 2016 17:48:24 +0200 Subject: [PATCH 36/69] Compilation fix --- radio/src/targets/gruvin9x/board_gruvin9x.cpp | 2 +- radio/src/targets/mega2560/board_mega2560.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/gruvin9x/board_gruvin9x.cpp b/radio/src/targets/gruvin9x/board_gruvin9x.cpp index 11d4f5d2e..772039990 100644 --- a/radio/src/targets/gruvin9x/board_gruvin9x.cpp +++ b/radio/src/targets/gruvin9x/board_gruvin9x.cpp @@ -164,7 +164,7 @@ void pwrOff() #endif } -FORCEINLINE uint8_t keyDown() +uint8_t keyDown() { return ((~PINL) & 0x3F) || ROTENC_DOWN(); } diff --git a/radio/src/targets/mega2560/board_mega2560.cpp b/radio/src/targets/mega2560/board_mega2560.cpp index 8cd8e97c4..8b2e63437 100644 --- a/radio/src/targets/mega2560/board_mega2560.cpp +++ b/radio/src/targets/mega2560/board_mega2560.cpp @@ -87,7 +87,7 @@ void pwrOff() PORTH &= ~0x10; // PortH-4 set to 0 } -FORCEINLINE uint8_t keyDown() +uint8_t keyDown() { return ((~PINL) & 0x3F) || ROTENC_DOWN(); } From 485d30f65b388f0599b2d7f001f2dc7881c291cd Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 27 Mar 2016 22:38:05 +0200 Subject: [PATCH 37/69] SysTick was configured wrong for Horus --- radio/src/thirdparty/CoOS/OsConfig.h | 66 ++++++++++++++-------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/radio/src/thirdparty/CoOS/OsConfig.h b/radio/src/thirdparty/CoOS/OsConfig.h index ffc41ca1a..2c2fb2db5 100644 --- a/radio/src/thirdparty/CoOS/OsConfig.h +++ b/radio/src/thirdparty/CoOS/OsConfig.h @@ -1,39 +1,39 @@ /** ******************************************************************************* * @file OsConfig.h - * @version V1.1.6 - * @date 2014.05.23 + * @version V1.1.6 + * @date 2014.05.23 * @brief This file use by user to configuration CooCox CoOS. * @note Ensure you have knew every item before modify this file. ******************************************************************************* * @copy * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. * - *

© COPYRIGHT 2014 CooCox

+ *

© COPYRIGHT 2014 CooCox

******************************************************************************* */ @@ -60,18 +60,18 @@ Max number of tasks that can be running. /*!< Idle task stack size(word). */ -#if CFG_CHIP_TYPE == 3 -#define CFG_IDLE_STACK_SIZE (58) -#else +#if CFG_CHIP_TYPE == 3 +#define CFG_IDLE_STACK_SIZE (58) +#else #define CFG_IDLE_STACK_SIZE (25) -#endif +#endif /*!< System frequency (Hz). */ -#if defined(PCBFLAMENCO) || (defined(PCBTARANIS) && defined(REV9E)) +#if defined(PCBFLAMENCO) || (defined(PCBTARANIS) && defined(REV9E)) || defined(PCBHORUS) #define CFG_CPU_FREQ (168000000) -#elif defined(PCBTARANIS) || defined(PCBHORUS) +#elif defined(PCBTARANIS) #define CFG_CPU_FREQ (120000000) #else #define CFG_CPU_FREQ (36000000) // TODO check if really correct for sky9x? From 746dc450fa4ae3e44f228b9dc8ca5a24cc7b8fe7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 11:24:35 +0200 Subject: [PATCH 38/69] Telemetry files split --- companion/src/simulation/simulatorimport.h | 2 +- radio/src/CMakeLists.txt | 4 +- radio/src/gui/9x/menu_model_telemetry.cpp | 4 +- radio/src/gui/9x/view_telemetry.cpp | 46 +- radio/src/logs.cpp | 48 +- radio/src/maths.cpp | 30 +- radio/src/mixer.cpp | 50 +- radio/src/opentx.h | 21 +- radio/src/simu.cpp | 2 +- .../targets/common_avr/telemetry_driver.cpp | 4 +- radio/src/telemetry/frsky.cpp | 519 +-------- radio/src/telemetry/frsky.h | 209 ++-- radio/src/telemetry/frsky_d.cpp | 188 ++-- radio/src/telemetry/frsky_d_arm.cpp | 8 +- radio/src/telemetry/frsky_sport.cpp | 20 +- radio/src/telemetry/mavlink.h | 54 +- radio/src/telemetry/telemetry.cpp | 989 +++++++----------- radio/src/telemetry/telemetry.h | 145 +-- radio/src/telemetry/telemetry_holders.cpp | 77 ++ radio/src/telemetry/telemetry_holders.h | 54 + radio/src/telemetry/telemetry_sensors.cpp | 693 ++++++++++++ radio/src/telemetry/telemetry_sensors.h | 115 ++ radio/src/tests/frsky.cpp | 34 +- radio/src/tests/gtests.h | 2 +- radio/src/vario.cpp | 4 +- 25 files changed, 1713 insertions(+), 1609 deletions(-) create mode 100644 radio/src/telemetry/telemetry_holders.cpp create mode 100644 radio/src/telemetry/telemetry_holders.h create mode 100644 radio/src/telemetry/telemetry_sensors.cpp create mode 100644 radio/src/telemetry/telemetry_sensors.h diff --git a/companion/src/simulation/simulatorimport.h b/companion/src/simulation/simulatorimport.h index 0a8d7b08f..5bf52b265 100644 --- a/companion/src/simulation/simulatorimport.h +++ b/companion/src/simulation/simulatorimport.h @@ -23,7 +23,7 @@ #ifdef INIT_IMPORT #undef INIT_IMPORT #ifdef FRSKY -frskyStreaming = 20; +telemetryStreaming = 20; #endif #endif diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 4c7bddf22..31dfafc44 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -512,6 +512,8 @@ if(ARCH STREQUAL ARM) tasks_arm.cpp audio_arm.cpp telemetry/telemetry.cpp + telemetry/telemetry_holders.cpp + telemetry/telemetry_sensors.cpp telemetry/frsky.cpp telemetry/frsky_d_arm.cpp telemetry/frsky_sport.cpp @@ -637,7 +639,7 @@ else() option(GPS "GPS support" ON) option(VARIO "Vario support" ON) add_definitions(-DFRSKY) - set(SRC ${SRC} telemetry/frsky.cpp telemetry/frsky_d.cpp) + set(SRC ${SRC} telemetry/telemetry.cpp telemetry/telemetry_holders.cpp telemetry/frsky.cpp telemetry/frsky_d.cpp) set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/common_avr/telemetry_driver.cpp) set(GUI_SRC ${GUI_SRC} view_telemetry.cpp) if(FRSKY_HUB) diff --git a/radio/src/gui/9x/menu_model_telemetry.cpp b/radio/src/gui/9x/menu_model_telemetry.cpp index 53aa9d29d..8d26418ed 100644 --- a/radio/src/gui/9x/menu_model_telemetry.cpp +++ b/radio/src/gui/9x/menu_model_telemetry.cpp @@ -609,7 +609,7 @@ void menuModelTelemetry(uint8_t event) case ITEM_TELEMETRY_A2_LABEL: lcd_putsLeft(y, STR_ACHANNEL); lcdDrawNumber(2*FW, y, ch+1, 0); - putsTelemetryChannelValue(TELEM_COL2+6*FW, y, dest, frskyData.analog[ch].value, LEFT); + putsTelemetryChannelValue(TELEM_COL2+6*FW, y, dest, telemetryData.analog[ch].value, LEFT); break; case ITEM_TELEMETRY_A1_RANGE: @@ -739,7 +739,7 @@ void menuModelTelemetry(uint8_t event) case ITEM_TELEMETRY_FAS_OFFSET: lcd_putsLeft(y, STR_FAS_OFFSET); lcdDrawNumber(TELEM_COL2, y, g_model.frsky.fasOffset, attr|LEFT|PREC1); - lcdDrawNumber(TELEM_COL2+6*FW, y, frskyData.hub.current, LEFT|PREC1); + lcdDrawNumber(TELEM_COL2+6*FW, y, telemetryData.hub.current, LEFT|PREC1); lcdDrawChar(TELEM_COL2+8*FW, y, 'A'); if (attr) g_model.frsky.fasOffset = checkIncDec(event, g_model.frsky.fasOffset, -120, 120, EE_MODEL); break; diff --git a/radio/src/gui/9x/view_telemetry.cpp b/radio/src/gui/9x/view_telemetry.cpp index 805813d72..816bc6d90 100644 --- a/radio/src/gui/9x/view_telemetry.cpp +++ b/radio/src/gui/9x/view_telemetry.cpp @@ -38,7 +38,7 @@ void displayRssiLine() lcdDrawSolidHorizontalLine(0, 55, 128, 0); // separator uint8_t rssi; #if !defined(CPUARM) - rssi = min((uint8_t)99, frskyData.rssi[1].value); + rssi = min((uint8_t)99, telemetryData.rssi[1].value); lcd_putsLeft(STATUS_BAR_Y, STR_TX); lcdDrawNumber(4*FW+1, STATUS_BAR_Y, rssi, LEADING0, 2); lcdDrawRect(BAR_LEFT+1, 57, 38, 7); lcdDrawFilledRect(BAR_LEFT+1, 58, 4*rssi/11, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID); @@ -59,17 +59,17 @@ void displayRssiLine() void displayGpsTime() { uint8_t att = (TELEMETRY_STREAMING() ? LEFT|LEADING0 : LEFT|LEADING0|BLINK); - lcdDrawNumber(CENTER_OFS+6*FW+7, STATUS_BAR_Y, frskyData.hub.hour, att, 2); + lcdDrawNumber(CENTER_OFS+6*FW+7, STATUS_BAR_Y, telemetryData.hub.hour, att, 2); lcdDrawChar(CENTER_OFS+8*FW+4, STATUS_BAR_Y, ':', att); - lcdDrawNumber(CENTER_OFS+9*FW+2, STATUS_BAR_Y, frskyData.hub.min, att, 2); + lcdDrawNumber(CENTER_OFS+9*FW+2, STATUS_BAR_Y, telemetryData.hub.min, att, 2); lcdDrawChar(CENTER_OFS+11*FW-1, STATUS_BAR_Y, ':', att); - lcdDrawNumber(CENTER_OFS+12*FW-3, STATUS_BAR_Y, frskyData.hub.sec, att, 2); + lcdDrawNumber(CENTER_OFS+12*FW-3, STATUS_BAR_Y, telemetryData.hub.sec, att, 2); lcdInvertLastLine(); } void displayGpsCoord(uint8_t y, char direction, int16_t bp, int16_t ap) { - if (frskyData.hub.gpsFix >= 0) { + if (telemetryData.hub.gpsFix >= 0) { if (!direction) direction = '-'; lcdDrawNumber(TELEM_2ND_COLUMN, y, bp / 100, LEFT); // ddd before '.' lcdDrawChar(lcdLastPos, y, '@'); @@ -107,9 +107,9 @@ void displayVoltageScreenLine(uint8_t y, uint8_t index) { drawStringWithIndex(0, y, STR_A, index+1, 0); if (TELEMETRY_STREAMING()) { - putsTelemetryChannelValue(3*FW+6*FW+4, y-FH, index+TELEM_A1-1, frskyData.analog[index].value, DBLSIZE); - lcdDrawChar(12*FW-1, y-FH, '<'); putsTelemetryChannelValue(17*FW, y-FH, index+TELEM_A1-1, frskyData.analog[index].min, NO_UNIT); - lcdDrawChar(12*FW, y, '>'); putsTelemetryChannelValue(17*FW, y, index+TELEM_A1-1, frskyData.analog[index].max, NO_UNIT); + putsTelemetryChannelValue(3*FW+6*FW+4, y-FH, index+TELEM_A1-1, telemetryData.analog[index].value, DBLSIZE); + lcdDrawChar(12*FW-1, y-FH, '<'); putsTelemetryChannelValue(17*FW, y-FH, index+TELEM_A1-1, telemetryData.analog[index].min, NO_UNIT); + lcdDrawChar(12*FW, y, '>'); putsTelemetryChannelValue(17*FW, y, index+TELEM_A1-1, telemetryData.analog[index].max, NO_UNIT); } } #endif @@ -142,10 +142,10 @@ void displayVoltagesScreen() break; #if defined(FRSKY_HUB) case FRSKY_VOLTS_SOURCE_FAS: - putsTelemetryChannelValue(3*FW+6*FW+4, FH, TELEM_VFAS-1, frskyData.hub.vfas, DBLSIZE); + putsTelemetryChannelValue(3*FW+6*FW+4, FH, TELEM_VFAS-1, telemetryData.hub.vfas, DBLSIZE); break; case FRSKY_VOLTS_SOURCE_CELLS: - putsTelemetryChannelValue(3*FW+6*FW+4, FH, TELEM_CELLS_SUM-1, frskyData.hub.cellsSum, DBLSIZE); + putsTelemetryChannelValue(3*FW+6*FW+4, FH, TELEM_CELLS_SUM-1, telemetryData.hub.cellsSum, DBLSIZE); break; #endif } @@ -159,13 +159,13 @@ void displayVoltagesScreen() break; #if defined(FRSKY_HUB) case FRSKY_CURRENT_SOURCE_FAS: - putsTelemetryChannelValue(3*FW+6*FW+4, 3*FH, TELEM_CURRENT-1, frskyData.hub.current, DBLSIZE); + putsTelemetryChannelValue(3*FW+6*FW+4, 3*FH, TELEM_CURRENT-1, telemetryData.hub.current, DBLSIZE); break; #endif } - putsTelemetryChannelValue(4, 5*FH, TELEM_POWER-1, frskyData.hub.power, LEFT|DBLSIZE); - putsTelemetryChannelValue(3*FW+4+4*FW+6*FW+FW, 5*FH, TELEM_CONSUMPTION-1, frskyData.hub.currentConsumption, DBLSIZE); + putsTelemetryChannelValue(4, 5*FH, TELEM_POWER-1, telemetryData.hub.power, LEFT|DBLSIZE); + putsTelemetryChannelValue(3*FW+4+4*FW+6*FW+FW, 5*FH, TELEM_CONSUMPTION-1, telemetryData.hub.currentConsumption, DBLSIZE); } else { displayVoltageScreenLine(analog > 0 ? 5*FH : 4*FH, analog ? 2-analog : 0); @@ -174,11 +174,11 @@ void displayVoltagesScreen() #if defined(FRSKY_HUB) // Cells voltage - if (frskyData.hub.cellsCount > 0) { + if (telemetryData.hub.cellsCount > 0) { uint8_t y = 1*FH; - for (uint8_t k=0; k frskyData.hub.pilotLatitude) ? lat - frskyData.hub.pilotLatitude : frskyData.hub.pilotLatitude - lat; + uint32_t angle = (lat > telemetryData.hub.pilotLatitude) ? lat - telemetryData.hub.pilotLatitude : telemetryData.hub.pilotLatitude - lat; uint32_t dist = EARTH_RADIUS * angle / 1000000; uint32_t result = dist*dist; - angle = (lng > frskyData.hub.pilotLongitude) ? lng - frskyData.hub.pilotLongitude : frskyData.hub.pilotLongitude - lng; - dist = frskyData.hub.distFromEarthAxis * angle / 1000000; + angle = (lng > telemetryData.hub.pilotLongitude) ? lng - telemetryData.hub.pilotLongitude : telemetryData.hub.pilotLongitude - lng; + dist = telemetryData.hub.distFromEarthAxis * angle / 1000000; result += dist*dist; dist = abs(TELEMETRY_BARO_ALT_AVAILABLE() ? TELEMETRY_RELATIVE_BARO_ALT_BP : TELEMETRY_RELATIVE_GPS_ALT_BP); result += dist*dist; - frskyData.hub.gpsDistance = isqrt32(result); - if (frskyData.hub.gpsDistance > frskyData.hub.maxGpsDistance) - frskyData.hub.maxGpsDistance = frskyData.hub.gpsDistance; + telemetryData.hub.gpsDistance = isqrt32(result); + if (telemetryData.hub.gpsDistance > telemetryData.hub.maxGpsDistance) + telemetryData.hub.maxGpsDistance = telemetryData.hub.gpsDistance; } #endif diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 0aa5b9f17..2fdb56b87 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -370,39 +370,39 @@ getvalue_t getValue(mixsrc_t i) } } #elif defined(FRSKY) - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_TX) return frskyData.rssi[1].value; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_RX) return frskyData.rssi[0].value; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_A1) return frskyData.analog[TELEM_ANA_A1].value; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_A2) return frskyData.analog[TELEM_ANA_A2].value; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_TX) return telemetryData.rssi[1].value; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_RX) return telemetryData.rssi[0].value; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_A1) return telemetryData.analog[TELEM_ANA_A1].value; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_A2) return telemetryData.analog[TELEM_ANA_A2].value; #if defined(FRSKY_SPORT) - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ALT) return frskyData.hub.baroAltitude; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ALT) return telemetryData.hub.baroAltitude; #elif defined(FRSKY_HUB) || defined(WS_HOW_HIGH) else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ALT) return TELEMETRY_RELATIVE_BARO_ALT_BP; #endif #if defined(FRSKY_HUB) - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RPM) return frskyData.hub.rpm; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_FUEL) return frskyData.hub.fuelLevel; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_T1) return frskyData.hub.temperature1; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_T2) return frskyData.hub.temperature2; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RPM) return telemetryData.hub.rpm; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_FUEL) return telemetryData.hub.fuelLevel; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_T1) return telemetryData.hub.temperature1; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_T2) return telemetryData.hub.temperature2; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_SPEED) return TELEMETRY_GPS_SPEED_BP; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DIST) return frskyData.hub.gpsDistance; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DIST) return telemetryData.hub.gpsDistance; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_GPSALT) return TELEMETRY_RELATIVE_GPS_ALT_BP; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELL) return (int16_t)TELEMETRY_MIN_CELL_VOLTAGE; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VFAS) return (int16_t)frskyData.hub.vfas; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CURRENT) return (int16_t)frskyData.hub.current; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CONSUMPTION) return frskyData.hub.currentConsumption; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_POWER) return frskyData.hub.power; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCx) return frskyData.hub.accelX; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCy) return frskyData.hub.accelY; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCz) return frskyData.hub.accelZ; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_HDG) return frskyData.hub.gpsCourse_bp; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VSPEED) return frskyData.hub.varioSpeed; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ASPEED) return frskyData.hub.airSpeed; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DTE) return frskyData.hub.dTE; - else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1) return frskyData.analog[TELEM_ANA_A1].min; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2) return frskyData.analog[TELEM_ANA_A2].min; - else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_CSW_MAX) return *(((int16_t*)(&frskyData.hub.minAltitude))+i-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_ALT)); + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM) return (int16_t)telemetryData.hub.cellsSum; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VFAS) return (int16_t)telemetryData.hub.vfas; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CURRENT) return (int16_t)telemetryData.hub.current; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CONSUMPTION) return telemetryData.hub.currentConsumption; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_POWER) return telemetryData.hub.power; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCx) return telemetryData.hub.accelX; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCy) return telemetryData.hub.accelY; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCz) return telemetryData.hub.accelZ; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_HDG) return telemetryData.hub.gpsCourse_bp; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VSPEED) return telemetryData.hub.varioSpeed; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ASPEED) return telemetryData.hub.airSpeed; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DTE) return telemetryData.hub.dTE; + else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1) return telemetryData.analog[TELEM_ANA_A1].min; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2) return telemetryData.analog[TELEM_ANA_A2].min; + else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_CSW_MAX) return *(((int16_t*)(&telemetryData.hub.minAltitude))+i-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_ALT)); #endif #endif else return 0; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index cc7a82a65..55d3f157a 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1301,26 +1301,7 @@ void evalFunctions(); extern volatile rotenc_t g_rotenc[1]; #endif -#if defined(CPUARM) - #include "telemetry/telemetry.h" -#endif - -#if defined (FRSKY) - // FrSky Telemetry - #include "telemetry/frsky.h" -#elif defined(JETI) - // Jeti-DUPLEX Telemetry - #include "telemetry/jeti.h" -#elif defined(ARDUPILOT) - // ArduPilot Telemetry - #include "telemetry/ardupilot.h" -#elif defined(NMEA) - // NMEA Telemetry - #include "telemetry/nmea.h" -#elif defined(MAVLINK) - // Mavlink Telemetry - #include "telemetry/mavlink.h" -#endif +#include "telemetry/telemetry.h" #if defined(CPUARM) uint16_t crc16(uint8_t * buf, uint32_t len); diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 57f7c4201..c9adee146 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -524,7 +524,7 @@ int main(int argc,char **argv) #endif #if defined(FRSKY) && !defined(FRSKY_SPORT) - frskyStreaming = 1; + telemetryStreaming = 1; #endif printf("Model size = %d\n", (int)sizeof(g_model)); diff --git a/radio/src/targets/common_avr/telemetry_driver.cpp b/radio/src/targets/common_avr/telemetry_driver.cpp index 2388f3794..da3ebbdfc 100644 --- a/radio/src/targets/common_avr/telemetry_driver.cpp +++ b/radio/src/targets/common_avr/telemetry_driver.cpp @@ -33,7 +33,7 @@ void telemetryEnableRx(void) UCSRB_N(TLM_USART) |= (1 << RXCIE_N(TLM_USART)); // enable Interrupt } -void processSerialData(uint8_t data); +void processFrskyTelemetryData(uint8_t data); extern uint8_t frskyRxBufferCount; // TODO not driver, change name ISR(USART_RX_vect_N(TLM_USART)) @@ -82,7 +82,7 @@ ISR(USART_RX_vect_N(TLM_USART)) frskyRxBufferCount = 0; } else { - processSerialData(data); + processFrskyTelemetryData(data); } cli() ; diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 934dc5437..345002f56 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -18,113 +18,14 @@ * GNU General Public License for more details. */ -#include "../opentx.h" +#include "opentx.h" -uint8_t frskyStreaming = 0; - -#if defined(WS_HOW_HIGH) -uint8_t frskyUsrStreaming = 0; -#endif - -uint8_t link_counter = 0; - -#define FRSKY_RX_PACKET_SIZE 19 uint8_t frskyRxBuffer[FRSKY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) - -#if !defined(CPUARM) && !defined(PCBFLAMENCO) -uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; -#endif - -#if !defined(CPUARM) -uint8_t frskyTxBufferCount = 0; -#endif - -#if defined(CPUARM) -uint8_t telemetryState = TELEMETRY_INIT; -#endif - uint8_t frskyRxBufferCount = 0; -FrskyData frskyData; - -#if defined(CPUARM) -uint8_t telemetryProtocol = 255; -#if defined(REVX) -uint8_t serialInversion = 0; -#endif -#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D) -#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT) -#else -#define IS_FRSKY_D_PROTOCOL() (true) -#define IS_FRSKY_SPORT_PROTOCOL() (false) -#endif - -#if defined(CPUARM) -void FrskyValueWithMin::reset() -{ - memclear(this, sizeof(*this)); -} -#endif - -void FrskyValueWithMin::set(uint8_t value) -{ -#if defined(CPUARM) - if (this->value == 0) { - memset(values, value, TELEMETRY_AVERAGE_COUNT); - this->value = value; - } - else { - //calculate the average from values[] and value - //also shift readings in values [] array - unsigned int sum = values[0]; - for (int i=0; ivalue = sum/(TELEMETRY_AVERAGE_COUNT+1); - } -#else - if (this->value == 0) { - this->value = value; - } - else { - sum += value; - if (link_counter == 0) { - this->value = sum / (IS_FRSKY_D_PROTOCOL() ? FRSKY_D_AVERAGING : FRSKY_SPORT_AVERAGING); - sum = 0; - } - } -#endif - - if (!min || value < min) { - min = value; - } -} - -void FrskyValueWithMinMax::set(uint8_t value, uint8_t unit) -{ - FrskyValueWithMin::set(value); - if (unit != UNIT_VOLTS) { - this->value = value; - } - if (!max || value > max) { - max = value; - } -} - #if !defined(CPUARM) -uint16_t getChannelRatio(source_t channel) -{ - return (uint16_t)g_model.frsky.channels[channel].ratio << g_model.frsky.channels[channel].multiplier; -} - -lcdint_t applyChannelRatio(source_t channel, lcdint_t val) -{ - return ((int32_t)val+g_model.frsky.channels[channel].offset) * getChannelRatio(channel) * 2 / 51; -} +uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; +uint8_t frskyTxBufferCount = 0; #endif #if defined(TELEMETREZ) @@ -138,7 +39,7 @@ extern uint8_t TrotCount; extern uint8_t TezRotary; #endif -NOINLINE void processSerialData(uint8_t data) +NOINLINE void processFrskyTelemetryData(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -166,8 +67,7 @@ NOINLINE void processSerialData(uint8_t data) } #endif - switch (dataState) - { + switch (dataState) { case STATE_DATA_START: if (data == START_STOP) { if (IS_FRSKY_SPORT_PROTOCOL()) { @@ -262,412 +162,23 @@ NOINLINE void processSerialData(uint8_t data) #endif } -void telemetryWakeup() -{ -#if defined(CPUARM) - uint8_t requiredTelemetryProtocol = MODEL_TELEMETRY_PROTOCOL(); -#if defined(REVX) - uint8_t requiredSerialInversion = g_model.moduleData[EXTERNAL_MODULE].invertedSerial; - if (telemetryProtocol != requiredTelemetryProtocol || serialInversion != requiredSerialInversion) { - serialInversion = requiredSerialInversion; -#else - if (telemetryProtocol != requiredTelemetryProtocol) { -#endif - telemetryInit(requiredTelemetryProtocol); - telemetryProtocol = requiredTelemetryProtocol; - } -#endif - -#if defined(CPUSTM32) - uint8_t data; -#if defined(LOG_TELEMETRY) && !defined(SIMU) - static tmr10ms_t lastTime = 0; - tmr10ms_t newTime = get_tmr10ms(); - struct gtm utm; - gettime(&utm); -#endif - while (telemetryFifo.pop(data)) { - processSerialData(data); -#if defined(LOG_TELEMETRY) && !defined(SIMU) - extern FIL g_telemetryFile; - if (lastTime != newTime) { - f_printf(&g_telemetryFile, "\r\n%4d-%02d-%02d,%02d:%02d:%02d.%02d0: %02X", utm.tm_year+1900, utm.tm_mon+1, utm.tm_mday, utm.tm_hour, utm.tm_min, utm.tm_sec, g_ms100, data); - lastTime = newTime; - } - else { - f_printf(&g_telemetryFile, " %02X", data); - } -#endif - } -#elif defined(PCBSKY9X) - if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { - uint8_t data; - while (telemetrySecondPortReceive(data)) { - processSerialData(data); - } - } - else { - // Receive serial data here - rxPdcUsart(processSerialData); - } -#endif - -#if !defined(CPUARM) - if (IS_FRSKY_D_PROTOCOL()) { - // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) - static uint8_t frskyTxDelay = 5; - if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { - frskyTxDelay = 5; // 50ms -#if !defined(SIMU) - frskyDSendNextAlarm(); -#endif - } - } -#endif - -#if defined(CPUARM) - for (int i=0; i 0x33) -#else - #define FRSKY_BAD_ANTENNA() (frskyData.swr.value > 0x33) -#endif - -#if defined(CPUARM) - static tmr10ms_t alarmsCheckTime = 0; - #define SCHEDULE_NEXT_ALARMS_CHECK(seconds) alarmsCheckTime = get_tmr10ms() + (100*(seconds)) - if (int32_t(get_tmr10ms() - alarmsCheckTime) > 0) { - - SCHEDULE_NEXT_ALARMS_CHECK(1/*second*/); - - uint8_t now = TelemetryItem::now(); - bool sensor_lost = false; - for (int i=0; i TELEMETRY_VALUE_OLD_THRESHOLD) { - sensor_lost = true; - telemetryItems[i].lastReceived = TELEMETRY_VALUE_OLD; - TelemetrySensor * sensor = & g_model.telemetrySensors[i]; - if (sensor->unit == UNIT_DATETIME) { - telemetryItems[i].datetime.datestate = 0; - telemetryItems[i].datetime.timestate = 0; - } - } - } - } - if (sensor_lost && TELEMETRY_STREAMING()) { - audioEvent(AU_SENSOR_LOST); - } - -#if defined(PCBTARANIS) - if ((g_model.moduleData[INTERNAL_MODULE].rfProtocol != RF_PROTO_OFF || g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_XJT) && FRSKY_BAD_ANTENNA()) { - AUDIO_SWR_RED(); - POPUP_WARNING(STR_ANTENNAPROBLEM); - SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); - } -#endif - - if (TELEMETRY_STREAMING()) { - if (getRssiAlarmValue(1) && TELEMETRY_RSSI() < getRssiAlarmValue(1)) { - AUDIO_RSSI_RED(); - SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); - } - else if (getRssiAlarmValue(0) && TELEMETRY_RSSI() < getRssiAlarmValue(0)) { - AUDIO_RSSI_ORANGE(); - SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); - } - } - } - - if (TELEMETRY_STREAMING()) { - if (telemetryState == TELEMETRY_KO) { - AUDIO_TELEMETRY_BACK(); - } - telemetryState = TELEMETRY_OK; - } - else if (telemetryState == TELEMETRY_OK) { - telemetryState = TELEMETRY_KO; - AUDIO_TELEMETRY_LOST(); - } -#endif -} - -void telemetryInterrupt10ms() -{ -#if defined(CPUARM) -#elif defined(FRSKY_HUB) - uint16_t voltage = 0; /* unit: 1/10 volts */ - for (uint8_t i=0; i>1) * (voltage>>1)) / 25; - - frskyData.hub.currentPrescale += current; - if (frskyData.hub.currentPrescale >= 3600) { - frskyData.hub.currentConsumption += 1; - frskyData.hub.currentPrescale -= 3600; - } -#endif - } - -#if !defined(CPUARM) - if (frskyData.hub.power > frskyData.hub.maxPower) { - frskyData.hub.maxPower = frskyData.hub.power; - } -#endif - } - -#if defined(WS_HOW_HIGH) - if (frskyUsrStreaming > 0) { - frskyUsrStreaming--; - } -#endif - - if (frskyStreaming > 0) { - frskyStreaming--; - } - else { -#if !defined(SIMU) -#if defined(CPUARM) - frskyData.rssi.reset(); -#else - frskyData.rssi[0].set(0); - frskyData.rssi[1].set(0); -#endif -#endif - } -} - -void telemetryReset() -{ - memclear(&frskyData, sizeof(frskyData)); - -#if defined(CPUARM) - for (int index=0; index Cell number + Cell voltage - uint8_t battnumber = ((frskyData.hub.volts & 0x00F0) >> 4); + uint8_t battnumber = ((telemetryData.hub.volts & 0x00F0) >> 4); if (battnumber < 12) { - if (frskyData.hub.cellsCount < battnumber+1) { - frskyData.hub.cellsCount = battnumber+1; + if (telemetryData.hub.cellsCount < battnumber+1) { + telemetryData.hub.cellsCount = battnumber+1; } - uint8_t cellVolts = (uint8_t)(((((frskyData.hub.volts & 0xFF00) >> 8) + ((frskyData.hub.volts & 0x000F) << 8))) / 10); - frskyData.hub.cellVolts[battnumber] = cellVolts; - if (!frskyData.hub.minCellVolts || cellVolts> 8) + ((telemetryData.hub.volts & 0x000F) << 8))) / 10); + telemetryData.hub.cellVolts[battnumber] = cellVolts; + if (!telemetryData.hub.minCellVolts || cellVolts * luaInputTelemetryFifo = NULL; -Fifo * luaOutputTelemetryFifo = NULL; -#endif diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index a5187bbfe..2ede667a1 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -21,7 +21,7 @@ #ifndef _FRSKY_H_ #define _FRSKY_H_ -#include +#include "telemetry_holders.h" #define FRSKY_SPORT_BAUDRATE 57600 #define FRSKY_D_BAUDRATE 9600 @@ -161,59 +161,9 @@ #define DATA_ID_SP2UH 0x45 // 5 #define DATA_ID_SP2UR 0xC6 // 6 - -// Global Fr-Sky telemetry data variables -extern uint8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time - -#if defined(WS_HOW_HIGH) -extern uint8_t frskyUsrStreaming; -#endif - -extern uint8_t link_counter; - -#if defined(CPUARM) -enum TelemetryStates { - TELEMETRY_INIT, - TELEMETRY_OK, - TELEMETRY_KO -}; - -extern uint8_t telemetryState; -#endif - -#if defined(CPUARM) -#define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! -#define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1] -class FrskyValueWithMin { - public: - uint8_t value; // fitered value (average of last TELEMETRY_AVERAGE_COUNT+1 values) - uint8_t min; - uint8_t values[TELEMETRY_AVERAGE_COUNT]; - void set(uint8_t value); - void reset(); -}; -#else -#define RAW_FRSKY_MINMAX(v) v.value -class FrskyValueWithMin { - public: - uint8_t value; - uint8_t min; - uint16_t sum; - void set(uint8_t value); -}; -#endif - -class FrskyValueWithMinMax: public FrskyValueWithMin { - public: - uint8_t max; - void set(uint8_t value, uint8_t unit); -}; - -#if defined(CPUARM) - - -#elif defined(FRSKY_HUB) -PACK(struct FrskySerialData { +#if !defined(CPUARM) +#if defined(FRSKY_HUB) +PACK(struct FrskyTelemetryData { int16_t baroAltitudeOffset; // spare reused int16_t gpsAltitude_bp; // 0x01 before punct int16_t temperature1; // 0x02 -20 .. 250 deg. celcius @@ -291,7 +241,7 @@ PACK(struct FrskySerialData { int16_t dTE; }); #elif defined(WS_HOW_HIGH) -PACK(struct FrskySerialData { +PACK(struct FrskyTelemetryData { int16_t baroAltitude_bp; // 0..9,999 meters int16_t baroAltitudeOffset; int16_t minAltitude; @@ -305,7 +255,7 @@ PACK(struct FrskySerialData { #endif }); #elif defined(VARIO) -PACK(struct FrskySerialData { +PACK(struct FrskyTelemetryData { int16_t varioSpeed; // Vertical speed in cm/s uint16_t currentConsumption; uint16_t currentPrescale; @@ -313,41 +263,17 @@ PACK(struct FrskySerialData { uint16_t maxPower; }); #else -PACK(struct FrskySerialData { +PACK(struct FrskyTelemetryData { uint16_t currentConsumption; uint16_t currentPrescale; uint16_t power; uint16_t maxPower; }); #endif - -enum TelemAnas { - TELEM_ANA_A1, - TELEM_ANA_A2, -#if defined(CPUARM) - TELEM_ANA_A3, - TELEM_ANA_A4, -#endif - TELEM_ANA_COUNT -}; - -#if defined(CPUARM) -struct FrskyData { - FrskyValueWithMin swr; // TODO Min not needed - FrskyValueWithMin rssi; // TODO Min not needed - uint16_t xjtVersion; - bool varioHighPrecision; -}; -#else -struct FrskyData { - FrskyValueWithMinMax analog[TELEM_ANA_COUNT]; - FrskyValueWithMin rssi[2]; - FrskySerialData hub; -}; #endif #if defined(PCBTARANIS) && defined(REVPLUS) - #define IS_VALID_XJT_VERSION() (frskyData.xjtVersion != 0 && frskyData.xjtVersion != 0xff) + #define IS_VALID_XJT_VERSION() (telemetryData.xjtVersion != 0 && telemetryData.xjtVersion != 0xff) #else #define IS_VALID_XJT_VERSION() (1) #endif @@ -364,101 +290,99 @@ enum AlarmLevel { #define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) #if defined(CPUARM) - #define TELEMETRY_STREAMING() (frskyData.rssi.value > 0) - #define TELEMETRY_RSSI() (frskyData.rssi.value) - #define TELEMETRY_RSSI_MIN() (frskyData.rssi.min) + #define TELEMETRY_STREAMING() (telemetryData.rssi.value > 0) + #define TELEMETRY_RSSI() (telemetryData.rssi.value) + #define TELEMETRY_RSSI_MIN() (telemetryData.rssi.min) #define TELEMETRY_CELL_VOLTAGE_MUTLIPLIER 1 - #define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp - #define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap + #define TELEMETRY_GPS_SPEED_BP telemetryData.hub.gpsSpeed_bp + #define TELEMETRY_GPS_SPEED_AP telemetryData.hub.gpsSpeed_ap - #define TELEMETRY_ABSOLUTE_GPS_ALT (frskyData.hub.gpsAltitude) - #define TELEMETRY_RELATIVE_GPS_ALT (frskyData.hub.gpsAltitude + frskyData.hub.gpsAltitudeOffset) + #define TELEMETRY_ABSOLUTE_GPS_ALT (telemetryData.hub.gpsAltitude) + #define TELEMETRY_RELATIVE_GPS_ALT (telemetryData.hub.gpsAltitude + telemetryData.hub.gpsAltitudeOffset) #define TELEMETRY_RELATIVE_GPS_ALT_BP (TELEMETRY_RELATIVE_GPS_ALT / 100) - #define TELEMETRY_RELATIVE_BARO_ALT_BP (frskyData.hub.baroAltitude / 100) - #define TELEMETRY_RELATIVE_BARO_ALT_AP (frskyData.hub.baroAltitude % 100) + #define TELEMETRY_RELATIVE_BARO_ALT_BP (telemetryData.hub.baroAltitude / 100) + #define TELEMETRY_RELATIVE_BARO_ALT_AP (telemetryData.hub.baroAltitude % 100) - #define TELEMETRY_BARO_ALT_PREPARE() div_t baroAltitudeDivision = div(getConvertedTelemetryValue(frskyData.hub.baroAltitude, UNIT_DIST), 100) + #define TELEMETRY_BARO_ALT_PREPARE() div_t baroAltitudeDivision = div(getConvertedTelemetryValue(telemetryData.hub.baroAltitude, UNIT_DIST), 100) #define TELEMETRY_BARO_ALT_FORMAT "%c%d.%02d," - #define TELEMETRY_BARO_ALT_ARGS frskyData.hub.baroAltitude < 0 ? '-' : ' ', abs(baroAltitudeDivision.quot), abs(baroAltitudeDivision.rem), + #define TELEMETRY_BARO_ALT_ARGS telemetryData.hub.baroAltitude < 0 ? '-' : ' ', abs(baroAltitudeDivision.quot), abs(baroAltitudeDivision.rem), #define TELEMETRY_GPS_ALT_FORMAT "%c%d.%02d," - #define TELEMETRY_GPS_ALT_ARGS frskyData.hub.gpsAltitude < 0 ? '-' : ' ', abs(frskyData.hub.gpsAltitude / 100), abs(frskyData.hub.gpsAltitude % 100), + #define TELEMETRY_GPS_ALT_ARGS telemetryData.hub.gpsAltitude < 0 ? '-' : ' ', abs(telemetryData.hub.gpsAltitude / 100), abs(telemetryData.hub.gpsAltitude % 100), #define TELEMETRY_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) #define TELEMETRY_GPS_SPEED_FORMAT "%d," - #define TELEMETRY_GPS_SPEED_ARGS frskyData.hub.gpsSpeed_bp, + #define TELEMETRY_GPS_SPEED_ARGS telemetryData.hub.gpsSpeed_bp, #if defined(CPUARM) - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, TELEMETRY_CELL_VOLTAGE(6)/100, TELEMETRY_CELL_VOLTAGE(6)%100, TELEMETRY_CELL_VOLTAGE(7)/100, TELEMETRY_CELL_VOLTAGE(7)%100, TELEMETRY_CELL_VOLTAGE(8)/100, TELEMETRY_CELL_VOLTAGE(8)%100, TELEMETRY_CELL_VOLTAGE(9)/100, TELEMETRY_CELL_VOLTAGE(9)%100, TELEMETRY_CELL_VOLTAGE(10)/100, TELEMETRY_CELL_VOLTAGE(10)%100, TELEMETRY_CELL_VOLTAGE(11)/100, TELEMETRY_CELL_VOLTAGE(11)%100, + #define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, TELEMETRY_CELL_VOLTAGE(6)/100, TELEMETRY_CELL_VOLTAGE(6)%100, TELEMETRY_CELL_VOLTAGE(7)/100, TELEMETRY_CELL_VOLTAGE(7)%100, TELEMETRY_CELL_VOLTAGE(8)/100, TELEMETRY_CELL_VOLTAGE(8)%100, TELEMETRY_CELL_VOLTAGE(9)/100, TELEMETRY_CELL_VOLTAGE(9)%100, TELEMETRY_CELL_VOLTAGE(10)/100, TELEMETRY_CELL_VOLTAGE(10)%100, TELEMETRY_CELL_VOLTAGE(11)/100, TELEMETRY_CELL_VOLTAGE(11)%100, #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," #else - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, + #define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6," #endif #define TELEMETRY_CURRENT_FORMAT "%d.%d," - #define TELEMETRY_CURRENT_ARGS frskyData.hub.current / 10, frskyData.hub.current % 10, + #define TELEMETRY_CURRENT_ARGS telemetryData.hub.current / 10, telemetryData.hub.current % 10, #define TELEMETRY_VFAS_FORMAT "%d.%d," - #define TELEMETRY_VFAS_ARGS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10, + #define TELEMETRY_VFAS_ARGS telemetryData.hub.vfas / 10, telemetryData.hub.vfas % 10, #define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," - #define TELEMETRY_VSPEED_ARGS frskyData.hub.varioSpeed < 0 ? '-' : ' ', abs(frskyData.hub.varioSpeed / 100), abs(frskyData.hub.varioSpeed % 100), + #define TELEMETRY_VSPEED_ARGS telemetryData.hub.varioSpeed < 0 ? '-' : ' ', abs(telemetryData.hub.varioSpeed / 100), abs(telemetryData.hub.varioSpeed % 100), #define TELEMETRY_ASPEED_FORMAT "%d.%d," - #define TELEMETRY_ASPEED_ARGS frskyData.hub.airSpeed / 10, frskyData.hub.airSpeed % 10, + #define TELEMETRY_ASPEED_ARGS telemetryData.hub.airSpeed / 10, telemetryData.hub.airSpeed % 10, #define TELEMETRY_OPENXSENSOR() (0) #else - #define TELEMETRY_STREAMING() (frskyStreaming > 0) - #define TELEMETRY_RSSI() (frskyData.rssi[0].value) - #define TELEMETRY_RSSI_MIN() (frskyData.rssi[0].min) + #define TELEMETRY_STREAMING() (telemetryStreaming > 0) + #define TELEMETRY_RSSI() (telemetryData.rssi[0].value) + #define TELEMETRY_RSSI_MIN() (telemetryData.rssi[0].min) #define TELEMETRY_CELL_VOLTAGE_MUTLIPLIER 2 - #define TELEMETRY_BARO_ALT_AVAILABLE() (frskyData.hub.baroAltitudeOffset) + #define TELEMETRY_BARO_ALT_AVAILABLE() (telemetryData.hub.baroAltitudeOffset) #define TELEMETRY_BARO_ALT_UNIT (IS_IMPERIAL_ENABLE() ? LENGTH_UNIT_IMP : LENGTH_UNIT_METR) - #define TELEMETRY_RELATIVE_BARO_ALT_BP frskyData.hub.baroAltitude_bp - #define TELEMETRY_RELATIVE_BARO_ALT_AP frskyData.hub.baroAltitude_ap - #define TELEMETRY_RELATIVE_GPS_ALT_BP frskyData.hub.gpsAltitude_bp - #define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp - #define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap + #define TELEMETRY_RELATIVE_BARO_ALT_BP telemetryData.hub.baroAltitude_bp + #define TELEMETRY_RELATIVE_BARO_ALT_AP telemetryData.hub.baroAltitude_ap + #define TELEMETRY_RELATIVE_GPS_ALT_BP telemetryData.hub.gpsAltitude_bp + #define TELEMETRY_GPS_SPEED_BP telemetryData.hub.gpsSpeed_bp + #define TELEMETRY_GPS_SPEED_AP telemetryData.hub.gpsSpeed_ap #define TELEMETRY_BARO_ALT_PREPARE() #define TELEMETRY_BARO_ALT_FORMAT "%d," - #define TELEMETRY_BARO_ALT_ARGS frskyData.hub.baroAltitude_bp, + #define TELEMETRY_BARO_ALT_ARGS telemetryData.hub.baroAltitude_bp, #define TELEMETRY_GPS_ALT_FORMAT "%d," - #define TELEMETRY_GPS_ALT_ARGS frskyData.hub.gpsAltitude_bp, + #define TELEMETRY_GPS_ALT_ARGS telemetryData.hub.gpsAltitude_bp, #define TELEMETRY_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) #define TELEMETRY_GPS_SPEED_FORMAT "%d," - #define TELEMETRY_GPS_SPEED_ARGS frskyData.hub.gpsSpeed_bp, + #define TELEMETRY_GPS_SPEED_ARGS telemetryData.hub.gpsSpeed_bp, #if defined(CPUARM) - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100, frskyData.hub.cellVolts[6]*2/100, frskyData.hub.cellVolts[6]*2%100, frskyData.hub.cellVolts[7]*2/100, frskyData.hub.cellVolts[7]*2%100, frskyData.hub.cellVolts[8]*2/100, frskyData.hub.cellVolts[8]*2%100, frskyData.hub.cellVolts[9]*2/100, frskyData.hub.cellVolts[9]*2%100, frskyData.hub.cellVolts[10]*2/100, frskyData.hub.cellVolts[10]*2%100, frskyData.hub.cellVolts[11]*2/100, frskyData.hub.cellVolts[11]*2%100, + #define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, telemetryData.hub.cellVolts[0]*2/100, telemetryData.hub.cellVolts[0]*2%100, telemetryData.hub.cellVolts[1]*2/100, telemetryData.hub.cellVolts[1]*2%100, telemetryData.hub.cellVolts[2]*2/100, telemetryData.hub.cellVolts[2]*2%100, telemetryData.hub.cellVolts[3]*2/100, telemetryData.hub.cellVolts[3]*2%100, telemetryData.hub.cellVolts[4]*2/100, telemetryData.hub.cellVolts[4]*2%100, telemetryData.hub.cellVolts[5]*2/100, telemetryData.hub.cellVolts[5]*2%100, telemetryData.hub.cellVolts[6]*2/100, telemetryData.hub.cellVolts[6]*2%100, telemetryData.hub.cellVolts[7]*2/100, telemetryData.hub.cellVolts[7]*2%100, telemetryData.hub.cellVolts[8]*2/100, telemetryData.hub.cellVolts[8]*2%100, telemetryData.hub.cellVolts[9]*2/100, telemetryData.hub.cellVolts[9]*2%100, telemetryData.hub.cellVolts[10]*2/100, telemetryData.hub.cellVolts[10]*2%100, telemetryData.hub.cellVolts[11]*2/100, telemetryData.hub.cellVolts[11]*2%100, #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," #else - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100, + #define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, telemetryData.hub.cellVolts[0]*2/100, telemetryData.hub.cellVolts[0]*2%100, telemetryData.hub.cellVolts[1]*2/100, telemetryData.hub.cellVolts[1]*2%100, telemetryData.hub.cellVolts[2]*2/100, telemetryData.hub.cellVolts[2]*2%100, telemetryData.hub.cellVolts[3]*2/100, telemetryData.hub.cellVolts[3]*2%100, telemetryData.hub.cellVolts[4]*2/100, telemetryData.hub.cellVolts[4]*2%100, telemetryData.hub.cellVolts[5]*2/100, telemetryData.hub.cellVolts[5]*2%100, #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6," #endif #define TELEMETRY_CURRENT_FORMAT "%d.%02d," - #define TELEMETRY_CURRENT_ARGS frskyData.hub.current / 100, frskyData.hub.current % 100, + #define TELEMETRY_CURRENT_ARGS telemetryData.hub.current / 100, telemetryData.hub.current % 100, #define TELEMETRY_VFAS_FORMAT "%d.%d," - #define TELEMETRY_VFAS_ARGS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10, + #define TELEMETRY_VFAS_ARGS telemetryData.hub.vfas / 10, telemetryData.hub.vfas % 10, #define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," - #define TELEMETRY_VSPEED_ARGS frskyData.hub.varioSpeed < 0 ? '-' : ' ', frskyData.hub.varioSpeed / 100, frskyData.hub.varioSpeed % 100, + #define TELEMETRY_VSPEED_ARGS telemetryData.hub.varioSpeed < 0 ? '-' : ' ', telemetryData.hub.varioSpeed / 100, telemetryData.hub.varioSpeed % 100, #define TELEMETRY_ASPEED_FORMAT "%d.%d," - #define TELEMETRY_ASPEED_ARGS frskyData.hub.airSpeed / 10, frskyData.hub.airSpeed % 10, + #define TELEMETRY_ASPEED_ARGS telemetryData.hub.airSpeed / 10, telemetryData.hub.airSpeed % 10, #if defined(FRSKY_HUB) - #define TELEMETRY_OPENXSENSOR() (frskyData.hub.openXsensor) + #define TELEMETRY_OPENXSENSOR() (telemetryData.hub.openXsensor) #else #define TELEMETRY_OPENXSENSOR() (0) #endif #endif -#define TELEMETRY_CELL_VOLTAGE(k) (frskyData.hub.cellVolts[k] * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) -#define TELEMETRY_MIN_CELL_VOLTAGE (frskyData.hub.minCellVolts * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) - -extern FrskyData frskyData; +#define TELEMETRY_CELL_VOLTAGE(k) (telemetryData.hub.cellVolts[k] * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) +#define TELEMETRY_MIN_CELL_VOLTAGE (telemetryData.hub.minCellVolts * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) #define START_STOP 0x7e #define BYTESTUFF 0x7d @@ -476,6 +400,8 @@ enum FrSkyDataState { #endif }; +#define FRSKY_RX_PACKET_SIZE 19 + #if defined(CPUARM) #define frskySendAlarms() #else @@ -523,6 +449,39 @@ void telemetryInit(void); void telemetryInterrupt10ms(); +enum TelemetryProtocol +{ + TELEM_PROTO_FRSKY_D, + TELEM_PROTO_FRSKY_SPORT, +}; + +enum TelemAnas { + TELEM_ANA_A1, + TELEM_ANA_A2, +#if defined(CPUARM) + TELEM_ANA_A3, + TELEM_ANA_A4, +#endif + TELEM_ANA_COUNT +}; + +#if defined(CPUARM) +struct TelemetryData { + TelemetryValueWithMin swr; // TODO Min not needed + TelemetryValueWithMin rssi; // TODO Min not needed + uint16_t xjtVersion; + bool varioHighPrecision; +}; +#else +struct TelemetryData { + TelemetryValueWithMinMax analog[TELEM_ANA_COUNT]; + TelemetryValueWithMin rssi[2]; + FrskyTelemetryData hub; +}; +#endif + +extern TelemetryData telemetryData; + #if defined(CPUARM) typedef uint16_t frskyCellVoltage_t; #elif defined(FRSKY_HUB) @@ -535,7 +494,7 @@ void frskySetCellVoltage(uint8_t battnumber, frskyCellVoltage_t cellVolts); void frskyUpdateCells(); #endif -void processSerialData(uint8_t data); +void processFrskyTelemetryData(uint8_t data); #if defined(PCBTARANIS) inline uint8_t modelTelemetryProtocol() diff --git a/radio/src/telemetry/frsky_d.cpp b/radio/src/telemetry/frsky_d.cpp index a16b6ff7d..98adf0a3d 100644 --- a/radio/src/telemetry/frsky_d.cpp +++ b/radio/src/telemetry/frsky_d.cpp @@ -23,10 +23,10 @@ #if (defined(FRSKY_HUB) || defined(WS_HOW_HIGH)) void checkMinMaxAltitude() { - if (TELEMETRY_RELATIVE_BARO_ALT_BP > frskyData.hub.maxAltitude) - frskyData.hub.maxAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; - if (TELEMETRY_RELATIVE_BARO_ALT_BP < frskyData.hub.minAltitude) - frskyData.hub.minAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; + if (TELEMETRY_RELATIVE_BARO_ALT_BP > telemetryData.hub.maxAltitude) + telemetryData.hub.maxAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; + if (TELEMETRY_RELATIVE_BARO_ALT_BP < telemetryData.hub.minAltitude) + telemetryData.hub.minAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; } #endif @@ -71,148 +71,148 @@ void parseTelemHubByte(uint8_t byte) state = TS_IDLE; #if defined(GPS) - if ((uint8_t)structPos == offsetof(FrskySerialData, gpsLatitude_bp)) { + if ((uint8_t)structPos == offsetof(FrskyTelemetryData, gpsLatitude_bp)) { if (lowByte || byte) - frskyData.hub.gpsFix = 1; - else if (frskyData.hub.gpsFix > 0 && frskyData.hub.gpsLatitude_bp > 1) - frskyData.hub.gpsFix = 0; + telemetryData.hub.gpsFix = 1; + else if (telemetryData.hub.gpsFix > 0 && telemetryData.hub.gpsLatitude_bp > 1) + telemetryData.hub.gpsFix = 0; } - else if ((uint8_t)structPos == offsetof(FrskySerialData, gpsLongitude_bp)) { + else if ((uint8_t)structPos == offsetof(FrskyTelemetryData, gpsLongitude_bp)) { if (lowByte || byte) - frskyData.hub.gpsFix = 1; - else if (frskyData.hub.gpsFix > 0 && frskyData.hub.gpsLongitude_bp > 1) - frskyData.hub.gpsFix = 0; + telemetryData.hub.gpsFix = 1; + else if (telemetryData.hub.gpsFix > 0 && telemetryData.hub.gpsLongitude_bp > 1) + telemetryData.hub.gpsFix = 0; } - if ((uint8_t)structPos == offsetof(FrskySerialData, gpsAltitude_bp) || - ((uint8_t)structPos >= offsetof(FrskySerialData, gpsAltitude_ap) && (uint8_t)structPos <= offsetof(FrskySerialData, gpsLatitudeNS) && (uint8_t)structPos != offsetof(FrskySerialData, baroAltitude_bp) && (uint8_t)structPos != offsetof(FrskySerialData, baroAltitude_ap))) { + if ((uint8_t)structPos == offsetof(FrskyTelemetryData, gpsAltitude_bp) || + ((uint8_t)structPos >= offsetof(FrskyTelemetryData, gpsAltitude_ap) && (uint8_t)structPos <= offsetof(FrskyTelemetryData, gpsLatitudeNS) && (uint8_t)structPos != offsetof(FrskyTelemetryData, baroAltitude_bp) && (uint8_t)structPos != offsetof(FrskyTelemetryData, baroAltitude_ap))) { // If we don't have a fix, we may discard the value - if (frskyData.hub.gpsFix <= 0) + if (telemetryData.hub.gpsFix <= 0) return; } #endif // #if defined(GPS) - ((uint8_t*)&frskyData.hub)[structPos] = lowByte; - ((uint8_t*)&frskyData.hub)[structPos+1] = byte; + ((uint8_t*)&telemetryData.hub)[structPos] = lowByte; + ((uint8_t*)&telemetryData.hub)[structPos+1] = byte; switch ((uint8_t)structPos) { - case offsetof(FrskySerialData, rpm): - frskyData.hub.rpm *= (uint8_t)60/(g_model.frsky.blades+2); - if (frskyData.hub.rpm > frskyData.hub.maxRpm) - frskyData.hub.maxRpm = frskyData.hub.rpm; + case offsetof(FrskyTelemetryData, rpm): + telemetryData.hub.rpm *= (uint8_t)60/(g_model.frsky.blades+2); + if (telemetryData.hub.rpm > telemetryData.hub.maxRpm) + telemetryData.hub.maxRpm = telemetryData.hub.rpm; break; - case offsetof(FrskySerialData, temperature1): - if (frskyData.hub.temperature1 > frskyData.hub.maxTemperature1) - frskyData.hub.maxTemperature1 = frskyData.hub.temperature1; + case offsetof(FrskyTelemetryData, temperature1): + if (telemetryData.hub.temperature1 > telemetryData.hub.maxTemperature1) + telemetryData.hub.maxTemperature1 = telemetryData.hub.temperature1; break; - case offsetof(FrskySerialData, temperature2): - if (frskyData.hub.temperature2 > frskyData.hub.maxTemperature2) - frskyData.hub.maxTemperature2 = frskyData.hub.temperature2; + case offsetof(FrskyTelemetryData, temperature2): + if (telemetryData.hub.temperature2 > telemetryData.hub.maxTemperature2) + telemetryData.hub.maxTemperature2 = telemetryData.hub.temperature2; break; - case offsetof(FrskySerialData, current): + case offsetof(FrskyTelemetryData, current): #if defined(FAS_OFFSET) || !defined(CPUM64) - if ((int16_t)frskyData.hub.current > 0 && ((int16_t)frskyData.hub.current + g_model.frsky.fasOffset) > 0) - frskyData.hub.current += g_model.frsky.fasOffset; + if ((int16_t)telemetryData.hub.current > 0 && ((int16_t)telemetryData.hub.current + g_model.frsky.fasOffset) > 0) + telemetryData.hub.current += g_model.frsky.fasOffset; else - frskyData.hub.current = 0; + telemetryData.hub.current = 0; #endif - if (frskyData.hub.current > frskyData.hub.maxCurrent) - frskyData.hub.maxCurrent = frskyData.hub.current; + if (telemetryData.hub.current > telemetryData.hub.maxCurrent) + telemetryData.hub.maxCurrent = telemetryData.hub.current; break; - case offsetof(FrskySerialData, currentConsumption): + case offsetof(FrskyTelemetryData, currentConsumption): // we receive data from openXsensor. stops the calculation of consumption and power - frskyData.hub.openXsensor = 1; + telemetryData.hub.openXsensor = 1; break; - case offsetof(FrskySerialData, volts_ap): + case offsetof(FrskyTelemetryData, volts_ap): #if defined(FAS_BSS) - frskyData.hub.vfas = (frskyData.hub.volts_bp * 10 + frskyData.hub.volts_ap); + telemetryData.hub.vfas = (telemetryData.hub.volts_bp * 10 + telemetryData.hub.volts_ap); #else - frskyData.hub.vfas = ((frskyData.hub.volts_bp * 100 + frskyData.hub.volts_ap * 10) * 21) / 110; + telemetryData.hub.vfas = ((telemetryData.hub.volts_bp * 100 + telemetryData.hub.volts_ap * 10) * 21) / 110; #endif - /* TODO later if (!frskyData.hub.minVfas || frskyData.hub.minVfas > frskyData.hub.vfas) - frskyData.hub.minVfas = frskyData.hub.vfas; */ + /* TODO later if (!telemetryData.hub.minVfas || telemetryData.hub.minVfas > telemetryData.hub.vfas) + telemetryData.hub.minVfas = telemetryData.hub.vfas; */ break; - case offsetof(FrskySerialData, baroAltitude_bp): + case offsetof(FrskyTelemetryData, baroAltitude_bp): // First received barometer altitude => Altitude offset - if (!frskyData.hub.baroAltitudeOffset) - frskyData.hub.baroAltitudeOffset = -frskyData.hub.baroAltitude_bp; - frskyData.hub.baroAltitude_bp += frskyData.hub.baroAltitudeOffset; + if (!telemetryData.hub.baroAltitudeOffset) + telemetryData.hub.baroAltitudeOffset = -telemetryData.hub.baroAltitude_bp; + telemetryData.hub.baroAltitude_bp += telemetryData.hub.baroAltitudeOffset; checkMinMaxAltitude(); break; #if defined(GPS) - case offsetof(FrskySerialData, gpsAltitude_ap): - if (!frskyData.hub.gpsAltitudeOffset) - frskyData.hub.gpsAltitudeOffset = -frskyData.hub.gpsAltitude_bp; - frskyData.hub.gpsAltitude_bp += frskyData.hub.gpsAltitudeOffset; - if (!frskyData.hub.baroAltitudeOffset) { - if (frskyData.hub.gpsAltitude_bp > frskyData.hub.maxAltitude) - frskyData.hub.maxAltitude = frskyData.hub.gpsAltitude_bp; - if (frskyData.hub.gpsAltitude_bp < frskyData.hub.minAltitude) - frskyData.hub.minAltitude = frskyData.hub.gpsAltitude_bp; + case offsetof(FrskyTelemetryData, gpsAltitude_ap): + if (!telemetryData.hub.gpsAltitudeOffset) + telemetryData.hub.gpsAltitudeOffset = -telemetryData.hub.gpsAltitude_bp; + telemetryData.hub.gpsAltitude_bp += telemetryData.hub.gpsAltitudeOffset; + if (!telemetryData.hub.baroAltitudeOffset) { + if (telemetryData.hub.gpsAltitude_bp > telemetryData.hub.maxAltitude) + telemetryData.hub.maxAltitude = telemetryData.hub.gpsAltitude_bp; + if (telemetryData.hub.gpsAltitude_bp < telemetryData.hub.minAltitude) + telemetryData.hub.minAltitude = telemetryData.hub.gpsAltitude_bp; } - if (!frskyData.hub.pilotLatitude && !frskyData.hub.pilotLongitude) { + if (!telemetryData.hub.pilotLatitude && !telemetryData.hub.pilotLongitude) { // First received GPS position => Pilot GPS position getGpsPilotPosition(); } - else if (frskyData.hub.gpsDistNeeded || menuHandlers[menuLevel] == menuTelemetryFrsky) { + else if (telemetryData.hub.gpsDistNeeded || menuHandlers[menuLevel] == menuTelemetryFrsky) { getGpsDistance(); } break; - case offsetof(FrskySerialData, gpsSpeed_bp): + case offsetof(FrskyTelemetryData, gpsSpeed_bp): // Speed => Max speed - if (frskyData.hub.gpsSpeed_bp > frskyData.hub.maxGpsSpeed) - frskyData.hub.maxGpsSpeed = frskyData.hub.gpsSpeed_bp; + if (telemetryData.hub.gpsSpeed_bp > telemetryData.hub.maxGpsSpeed) + telemetryData.hub.maxGpsSpeed = telemetryData.hub.gpsSpeed_bp; break; #endif - case offsetof(FrskySerialData, volts): + case offsetof(FrskyTelemetryData, volts): frskyUpdateCells(); break; #if defined(GPS) - case offsetof(FrskySerialData, hour): - frskyData.hub.hour = ((uint8_t)(frskyData.hub.hour + g_eeGeneral.timezone + 24)) % 24; + case offsetof(FrskyTelemetryData, hour): + telemetryData.hub.hour = ((uint8_t)(telemetryData.hub.hour + g_eeGeneral.timezone + 24)) % 24; break; #endif - case offsetof(FrskySerialData, accelX): - case offsetof(FrskySerialData, accelY): - case offsetof(FrskySerialData, accelZ): - *(int16_t*)(&((uint8_t*)&frskyData.hub)[structPos]) /= 10; + case offsetof(FrskyTelemetryData, accelX): + case offsetof(FrskyTelemetryData, accelY): + case offsetof(FrskyTelemetryData, accelZ): + *(int16_t*)(&((uint8_t*)&telemetryData.hub)[structPos]) /= 10; break; #if 0 - case offsetof(FrskySerialData, gpsAltitude_bp): - case offsetof(FrskySerialData, fuelLevel): - case offsetof(FrskySerialData, gpsLongitude_bp): - case offsetof(FrskySerialData, gpsLatitude_bp): - case offsetof(FrskySerialData, gpsCourse_bp): - case offsetof(FrskySerialData, day): - case offsetof(FrskySerialData, year): - case offsetof(FrskySerialData, sec): - case offsetof(FrskySerialData, gpsSpeed_ap): - case offsetof(FrskySerialData, gpsLongitude_ap): - case offsetof(FrskySerialData, gpsLatitude_ap): - case offsetof(FrskySerialData, gpsCourse_ap): - case offsetof(FrskySerialData, gpsLongitudeEW): - case offsetof(FrskySerialData, gpsLatitudeNS): - case offsetof(FrskySerialData, varioSpeed): - case offsetof(FrskySerialData, power): /* because sent by openXsensor */ - case offsetof(FrskySerialData, vfas): - case offsetof(FrskySerialData, volts_bp): + case offsetof(FrskyTelemetryData, gpsAltitude_bp): + case offsetof(FrskyTelemetryData, fuelLevel): + case offsetof(FrskyTelemetryData, gpsLongitude_bp): + case offsetof(FrskyTelemetryData, gpsLatitude_bp): + case offsetof(FrskyTelemetryData, gpsCourse_bp): + case offsetof(FrskyTelemetryData, day): + case offsetof(FrskyTelemetryData, year): + case offsetof(FrskyTelemetryData, sec): + case offsetof(FrskyTelemetryData, gpsSpeed_ap): + case offsetof(FrskyTelemetryData, gpsLongitude_ap): + case offsetof(FrskyTelemetryData, gpsLatitude_ap): + case offsetof(FrskyTelemetryData, gpsCourse_ap): + case offsetof(FrskyTelemetryData, gpsLongitudeEW): + case offsetof(FrskyTelemetryData, gpsLatitudeNS): + case offsetof(FrskyTelemetryData, varioSpeed): + case offsetof(FrskyTelemetryData, power): /* because sent by openXsensor */ + case offsetof(FrskyTelemetryData, vfas): + case offsetof(FrskyTelemetryData, volts_bp): break; default: - *((uint16_t *)(((uint8_t*)&frskyData.hub) + structPos)) = previousValue; + *((uint16_t *)(((uint8_t*)&telemetryData.hub) + structPos)) = previousValue; break; #endif } @@ -222,16 +222,16 @@ void parseTelemHubByte(uint8_t byte) #if defined(WS_HOW_HIGH) void parseTelemWSHowHighByte(uint8_t byte) { - if (frskyUsrStreaming < (WSHH_TIMEOUT10ms - 10)) { - ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)] = byte; + if (wshhStreaming < (WSHH_TIMEOUT10ms - 10)) { + ((uint8_t*)&telemetryData.hub)[offsetof(FrskyTelemetryData, baroAltitude_bp)] = byte; checkMinMaxAltitude(); } else { // At least 100mS passed since last data received - ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)+1] = byte; + ((uint8_t*)&telemetryData.hub)[offsetof(FrskyTelemetryData, baroAltitude_bp)+1] = byte; } // baroAltitude_bp unit here is feet! - frskyUsrStreaming = WSHH_TIMEOUT10ms; // reset counter + wshhStreaming = WSHH_TIMEOUT10ms; // reset counter } #endif @@ -242,16 +242,16 @@ void frskyDProcessPacket(uint8_t *packet) { case LINKPKT: // A1/A2/RSSI values { - frskyData.analog[TELEM_ANA_A1].set(packet[1], g_model.frsky.channels[TELEM_ANA_A1].type); - frskyData.analog[TELEM_ANA_A2].set(packet[2], g_model.frsky.channels[TELEM_ANA_A2].type); - frskyData.rssi[0].set(packet[3]); - frskyData.rssi[1].set(packet[4] / 2); - frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected + telemetryData.analog[TELEM_ANA_A1].set(packet[1], g_model.frsky.channels[TELEM_ANA_A1].type); + telemetryData.analog[TELEM_ANA_A2].set(packet[2], g_model.frsky.channels[TELEM_ANA_A2].type); + telemetryData.rssi[0].set(packet[3]); + telemetryData.rssi[1].set(packet[4] / 2); + telemetryStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected link_counter += 256 / FRSKY_D_AVERAGING; #if defined(VARIO) uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1; if (varioSource < 2) { - frskyData.hub.varioSpeed = applyChannelRatio(varioSource, frskyData.analog[varioSource].value); + telemetryData.hub.varioSpeed = applyChannelRatio(varioSource, telemetryData.analog[varioSource].value); } #endif break; diff --git a/radio/src/telemetry/frsky_d_arm.cpp b/radio/src/telemetry/frsky_d_arm.cpp index d2172da01..1e476b7b0 100644 --- a/radio/src/telemetry/frsky_d_arm.cpp +++ b/radio/src/telemetry/frsky_d_arm.cpp @@ -73,8 +73,8 @@ void frskyDProcessPacket(uint8_t *packet) setTelemetryValue(TELEM_PROTO_FRSKY_D, D_A1_ID, 0, 0, packet[1], UNIT_VOLTS, 0); setTelemetryValue(TELEM_PROTO_FRSKY_D, D_A2_ID, 0, 0, packet[2], UNIT_VOLTS, 0); setTelemetryValue(TELEM_PROTO_FRSKY_D, D_RSSI_ID, 0, 0, packet[3], UNIT_RAW, 0); - frskyData.rssi.set(packet[3]); - frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected + telemetryData.rssi.set(packet[3]); + telemetryStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected break; } @@ -178,8 +178,8 @@ void processHubPacket(uint8_t id, int16_t value) } else if (id == BARO_ALT_AP_ID) { if (lastId == BARO_ALT_BP_ID) { - if (data > 9 || frskyData.varioHighPrecision) { - frskyData.varioHighPrecision = true; + if (data > 9 || telemetryData.varioHighPrecision) { + telemetryData.varioHighPrecision = true; data /= 10; // map hi precision vario into low precision. Altitude is stored in 0.1m anyways } data = (int16_t)lastValue * 10 + (((int16_t)lastValue < 0) ? -data : data); diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index ba77828bf..a9cd0d17c 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -212,32 +212,32 @@ void processSportPacket(uint8_t * packet) uint32_t data = SPORT_DATA_S32(packet); if (id == RSSI_ID) { - frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected + telemetryStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected data = SPORT_DATA_U8(packet); if (data == 0) - frskyData.rssi.reset(); + telemetryData.rssi.reset(); else - frskyData.rssi.set(data); + telemetryData.rssi.set(data); } #if defined(PCBTARANIS) && defined(REVPLUS) else if (id == XJT_VERSION_ID) { - frskyData.xjtVersion = HUB_DATA_U16(packet); + telemetryData.xjtVersion = HUB_DATA_U16(packet); if (!IS_VALID_XJT_VERSION()) { - frskyData.swr.set(0x00); + telemetryData.swr.set(0x00); } } else if (id == SWR_ID) { if (IS_VALID_XJT_VERSION()) - frskyData.swr.set(SPORT_DATA_U8(packet)); + telemetryData.swr.set(SPORT_DATA_U8(packet)); else - frskyData.swr.set(0x00); + telemetryData.swr.set(0x00); } #else else if (id == XJT_VERSION_ID) { - frskyData.xjtVersion = HUB_DATA_U16(packet); + telemetryData.xjtVersion = HUB_DATA_U16(packet); } else if (id == SWR_ID) { - frskyData.swr.set(SPORT_DATA_U8(packet)); + telemetryData.swr.set(SPORT_DATA_U8(packet)); } #endif @@ -339,7 +339,7 @@ bool sportWaitState(SportUpdateState state, int timeout) for (int i=timeout/2; i>=0; i--) { uint8_t byte ; while (telemetryGetByte(&byte)) { - processSerialData(byte); + processFrskyTelemetryData(byte); } if (sportUpdateState == state) { return true; diff --git a/radio/src/telemetry/mavlink.h b/radio/src/telemetry/mavlink.h index 8c80b3bf7..fb2281259 100644 --- a/radio/src/telemetry/mavlink.h +++ b/radio/src/telemetry/mavlink.h @@ -1,29 +1,29 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + /*! \file mavlink.h * Mavlink include file */ -#ifndef _MAVLINK_H_ -#define _MAVLINK_H_ +#ifndef _MAVLINK_H_ +#define _MAVLINK_H_ #define MAVLINK_USE_CONVENIENCE_FUNCTIONS #define MAVLINK_COMM_NUM_BUFFERS 1 @@ -32,11 +32,11 @@ #include "targets/common_avr/serial_driver.h" #include "opentx.h" -extern int8_t mav_heartbeat; +extern int8_t mav_heartbeat; extern mavlink_system_t mavlink_system; -#define LEN_STATUSTEXT 20 -extern char mav_statustext[LEN_STATUSTEXT]; - +#define LEN_STATUSTEXT 20 +extern char mav_statustext[LEN_STATUSTEXT]; + extern void SERIAL_start_uart_send(); extern void SERIAL_end_uart_send(); extern void SERIAL_send_uart_bytes(const uint8_t * buf, uint16_t len); @@ -321,5 +321,5 @@ inline uint8_t getPrecisMavlinParamsValue(uint8_t idx) { void lcd_outdezFloat(uint8_t x, uint8_t y, float val, uint8_t precis, uint8_t mode); #endif -#endif // _MAVLINK_H_ +#endif // _MAVLINK_H_ diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 5b723fcfd..70e58474f 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -18,676 +18,435 @@ * GNU General Public License for more details. */ -#include "../opentx.h" +#include "opentx.h" -TelemetryItem telemetryItems[MAX_SENSORS]; -uint8_t allowNewSensors; +uint8_t telemetryStreaming = 0; -void TelemetryItem::gpsReceived() +#if defined(WS_HOW_HIGH) +uint8_t wshhStreaming = 0; +#endif + +uint8_t link_counter = 0; + +#if defined(CPUARM) +uint8_t telemetryState = TELEMETRY_INIT; +#endif + +TelemetryData telemetryData; + +#if defined(CPUARM) +uint8_t telemetryProtocol = 255; +#if defined(REVX) +uint8_t serialInversion = 0; +#endif +#endif + +#if defined(PCBSKY9X) && defined(REVX) +uint8_t serialInversion = 0; +#endif + +#if !defined(CPUARM) +uint16_t getChannelRatio(source_t channel) { - if (!distFromEarthAxis) { - gps.extractLatitudeLongitude(&pilotLatitude, &pilotLongitude); - uint32_t lat = pilotLatitude / 10000; - uint32_t angle2 = (lat*lat) / 10000; - uint32_t angle4 = angle2 * angle2; - distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500); - } - lastReceived = now(); + return (uint16_t)g_model.frsky.channels[channel].ratio << g_model.frsky.channels[channel].multiplier; } -void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32_t unit, uint32_t prec) +lcdint_t applyChannelRatio(source_t channel, lcdint_t val) { - int32_t newVal = val; + return ((int32_t)val+g_model.frsky.channels[channel].offset) * getChannelRatio(channel) * 2 / 51; +} +#endif - if (unit == UNIT_CELLS) { - uint32_t data = uint32_t(newVal); - uint8_t cellsCount = (data >> 24); - uint8_t cellIndex = ((data >> 16) & 0x0F); - uint16_t cellValue = (data & 0xFFFF); - if (cellsCount == 0) { - cellsCount = (cellIndex >= cells.count ? cellIndex + 1 : cells.count); - if (cellsCount != cells.count) { - clear(); - cells.count = cellsCount; - // we skip this round as we are not sure we received all cells values - return; - } - } - else if (cellsCount != cells.count) { - clear(); - cells.count = cellsCount; - } - cells.values[cellIndex].set(cellValue); - if (cellIndex+1 == cells.count) { - newVal = 0; - for (int i=0; i> 24); - datetime.month = (uint8_t) ((data & 0x00ff0000) >> 16); - datetime.day = (uint8_t) ((data & 0x0000ff00) >> 8); - if (datetime.year != 0) { - datetime.datestate = 1; - } -#if defined(RTCLOCK) - if (g_eeGeneral.adjustRTC && (datetime.datestate == 1)) { - struct gtm t; - gettime(&t); - t.tm_year = datetime.year+4; - t.tm_mon = datetime.month-1; - t.tm_mday = datetime.day; - rtcSetTime(&t); - } #endif - } - else { - datetime.hour = ((uint8_t) ((data & 0xff000000) >> 24) + g_eeGeneral.timezone + 24) % 24; - datetime.min = (uint8_t) ((data & 0x00ff0000) >> 16); - datetime.sec = (uint16_t) ((data & 0x0000ff00) >> 8); - if (datetime.datestate == 1) { - datetime.timestate = 1; - } -#if defined(RTCLOCK) - if (g_eeGeneral.adjustRTC && datetime.datestate == 1) { - struct gtm t; - gettime(&t); - if (abs((t.tm_hour-datetime.hour)*3600 + (t.tm_min-datetime.min)*60 + (t.tm_sec-datetime.sec)) > 20) { - // we adjust RTC only if difference is > 20 seconds - t.tm_hour = datetime.hour; - t.tm_min = datetime.min; - t.tm_sec = datetime.sec; - g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated - rtcSetTime(&t); - } - } -#endif - } - if (datetime.year == 0) { - return; - } - newVal = 0; } - else if (unit == UNIT_GPS) { - uint32_t gps_long_lati_data = uint32_t(newVal); - uint32_t gps_long_lati_b1w, gps_long_lati_a1w; - gps_long_lati_b1w = (gps_long_lati_data & 0x3fffffff) / 10000; - gps_long_lati_a1w = (gps_long_lati_data & 0x3fffffff) % 10000; - switch ((gps_long_lati_data & 0xc0000000) >> 30) { - case 0: - gps.latitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); - gps.latitude_ap = gps_long_lati_a1w; - gps.latitudeNS = 'N'; - break; - case 1: - gps.latitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); - gps.latitude_ap = gps_long_lati_a1w; - gps.latitudeNS = 'S'; - break; - case 2: - gps.longitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); - gps.longitude_ap = gps_long_lati_a1w; - gps.longitudeEW = 'E'; - break; - case 3: - gps.longitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); - gps.longitude_ap = gps_long_lati_a1w; - gps.longitudeEW = 'W'; - break; - } - if (gps.longitudeEW && gps.latitudeNS) { - gpsReceived(); - } - return; - } - else if (unit >= UNIT_GPS_LONGITUDE && unit <= UNIT_GPS_LATITUDE_NS) { - uint32_t data = uint32_t(newVal); - switch (unit) { - case UNIT_GPS_LONGITUDE: - gps.longitude_bp = data >> 16; - gps.longitude_ap = data & 0xFFFF; - break; - case UNIT_GPS_LATITUDE: - gps.latitude_bp = data >> 16; - gps.latitude_ap = data & 0xFFFF; - break; - case UNIT_GPS_LONGITUDE_EW: - gps.longitudeEW = data; - break; - case UNIT_GPS_LATITUDE_NS: - gps.latitudeNS = data; - break; - } - if (gps.longitudeEW && gps.latitudeNS && gps.longitude_ap && gps.latitude_ap) { - gpsReceived(); - } - return; - } - else if (unit == UNIT_DATETIME_YEAR) { - datetime.year = newVal; - return; - } - else if (unit == UNIT_DATETIME_DAY_MONTH) { - uint32_t data = uint32_t(newVal); - datetime.month = data >> 8; - datetime.day = data & 0xFF; - datetime.datestate = 1; - return; - } - else if (unit == UNIT_DATETIME_HOUR_MIN) { - uint32_t data = uint32_t(newVal); - datetime.hour = ((data & 0xFF) + g_eeGeneral.timezone + 24) % 24; - datetime.min = data >> 8; - } - else if (unit == UNIT_DATETIME_SEC) { - datetime.sec = newVal & 0xFF; - datetime.timestate = 1; - newVal = 0; - } - else if (unit == UNIT_RPMS) { - if (sensor.custom.ratio != 0) { - newVal = (newVal * sensor.custom.offset) / sensor.custom.ratio; +#elif defined(PCBSKY9X) + if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { + uint8_t data; + while (telemetrySecondPortReceive(data)) { + processFrskyTelemetryData(data); } } else { - newVal = sensor.getValue(newVal, unit, prec); - if (sensor.autoOffset) { - if (!isAvailable()) { - std.offsetAuto = -newVal; - } - newVal += std.offsetAuto; - } - else if (sensor.filter) { - if (!isAvailable()) { - for (int i=0; i valueMax) { - valueMax = newVal; - if (sensor.unit == UNIT_VOLTS) { - valueMin = newVal; // the batt was changed +#if !defined(CPUARM) + if (IS_FRSKY_D_PROTOCOL()) { + // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) + static uint8_t frskyTxDelay = 5; + if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { + frskyTxDelay = 5; // 50ms +#if !defined(SIMU) + frskyDSendNextAlarm(); +#endif } } +#endif +#if defined(CPUARM) for (int i=0; i 0x33) +#else + #define FRSKY_BAD_ANTENNA() (telemetryData.swr.value > 0x33) +#endif + +#if defined(CPUARM) + static tmr10ms_t alarmsCheckTime = 0; + #define SCHEDULE_NEXT_ALARMS_CHECK(seconds) alarmsCheckTime = get_tmr10ms() + (100*(seconds)) + if (int32_t(get_tmr10ms() - alarmsCheckTime) > 0) { + + SCHEDULE_NEXT_ALARMS_CHECK(1/*second*/); + + uint8_t now = TelemetryItem::now(); + bool sensor_lost = false; + for (int i=0; i TELEMETRY_VALUE_OLD_THRESHOLD) { + sensor_lost = true; + telemetryItems[i].lastReceived = TELEMETRY_VALUE_OLD; + TelemetrySensor * sensor = & g_model.telemetrySensors[i]; + if (sensor->unit == UNIT_DATETIME) { + telemetryItems[i].datetime.datestate = 0; + telemetryItems[i].datetime.timestate = 0; + } + } + } + } + if (sensor_lost && TELEMETRY_STREAMING()) { + audioEvent(AU_SENSOR_LOST); + } + +#if defined(PCBTARANIS) + if ((g_model.moduleData[INTERNAL_MODULE].rfProtocol != RF_PROTO_OFF || g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_XJT) && FRSKY_BAD_ANTENNA()) { + AUDIO_SWR_RED(); + POPUP_WARNING(STR_ANTENNAPROBLEM); + SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); + } +#endif + + if (TELEMETRY_STREAMING()) { + if (getRssiAlarmValue(1) && TELEMETRY_RSSI() < getRssiAlarmValue(1)) { + AUDIO_RSSI_RED(); + SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); + } + else if (getRssiAlarmValue(0) && TELEMETRY_RSSI() < getRssiAlarmValue(0)) { + AUDIO_RSSI_ORANGE(); + SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); + } } } - value = newVal; - lastReceived = now(); + if (TELEMETRY_STREAMING()) { + if (telemetryState == TELEMETRY_KO) { + AUDIO_TELEMETRY_BACK(); + } + telemetryState = TELEMETRY_OK; + } + else if (telemetryState == TELEMETRY_OK) { + telemetryState = TELEMETRY_KO; + AUDIO_TELEMETRY_LOST(); + } +#endif } -bool TelemetryItem::isAvailable() +void telemetryInterrupt10ms() { - return (lastReceived != TELEMETRY_VALUE_UNAVAILABLE); -} +#if defined(FRSKY_HUB) && !defined(CPUARM) + uint16_t voltage = 0; /* unit: 1/10 volts */ + for (uint8_t i=0; i= 3600) { - currentItem.consumption.prescale -= 3600; - setValue(sensor, value+1, sensor.unit, sensor.prec); - } - lastReceived = now(); } - break; +#else + // power calculation + uint8_t channel = g_model.frsky.voltsSource; + if (channel <= FRSKY_VOLTS_SOURCE_A2) { + voltage = applyChannelRatio(channel, telemetryData.analog[channel].value) / 10; + } - default: - break; +#if defined(FRSKY_HUB) + else if (channel == FRSKY_VOLTS_SOURCE_FAS) { + voltage = telemetryData.hub.vfas; + } +#endif + +#if defined(FRSKY_HUB) + uint16_t current = telemetryData.hub.current; /* unit: 1/10 amps */ +#else + uint16_t current = 0; +#endif + + channel = g_model.frsky.currentSource - FRSKY_CURRENT_SOURCE_A1; + if (channel < MAX_FRSKY_A_CHANNELS) { + current = applyChannelRatio(channel, telemetryData.analog[channel].value) / 10; + } + + telemetryData.hub.power = ((current>>1) * (voltage>>1)) / 25; + + telemetryData.hub.currentPrescale += current; + if (telemetryData.hub.currentPrescale >= 3600) { + telemetryData.hub.currentConsumption += 1; + telemetryData.hub.currentPrescale -= 3600; + } +#endif + } + +#if !defined(CPUARM) + if (telemetryData.hub.power > telemetryData.hub.maxPower) { + telemetryData.hub.maxPower = telemetryData.hub.power; + } +#endif + } + +#if defined(WS_HOW_HIGH) + if (wshhStreaming > 0) { + wshhStreaming--; + } +#endif + + if (telemetryStreaming > 0) { + telemetryStreaming--; + } + else { +#if !defined(SIMU) +#if defined(CPUARM) + telemetryData.rssi.reset(); +#else + telemetryData.rssi[0].set(0); + telemetryData.rssi[1].set(0); +#endif +#endif } } -void TelemetryItem::eval(const TelemetrySensor & sensor) +void telemetryReset() { - switch (sensor.formula) { - case TELEM_FORMULA_CELL: - if (sensor.cell.source) { - TelemetryItem & cellsItem = telemetryItems[sensor.cell.source-1]; - if (cellsItem.isOld()) { - lastReceived = TELEMETRY_VALUE_OLD; - } - else { - unsigned int index = sensor.cell.index; - if (index == TELEM_CELL_INDEX_LOWEST || index == TELEM_CELL_INDEX_HIGHEST || index == TELEM_CELL_INDEX_DELTA) { - unsigned int lowest=0, highest=0; - for (int i=0; i cellsItem.cells.values[highest-1].value) - highest = i+1; - } - else { - lowest = highest = 0; - } - } - if (lowest) { - switch (index) { - case TELEM_CELL_INDEX_LOWEST: - setValue(sensor, cellsItem.cells.values[lowest-1].value, UNIT_VOLTS, 2); - break; - case TELEM_CELL_INDEX_HIGHEST: - setValue(sensor, cellsItem.cells.values[highest-1].value, UNIT_VOLTS, 2); - break; - case TELEM_CELL_INDEX_DELTA: - setValue(sensor, cellsItem.cells.values[highest-1].value - cellsItem.cells.values[lowest-1].value, UNIT_VOLTS, 2); - break; - } - } - } - else { - index -= 1; - if (index < cellsItem.cells.count && cellsItem.cells.values[index].state) { - setValue(sensor, cellsItem.cells.values[index].value, UNIT_VOLTS, 2); - } - } - } - } - break; + memclear(&telemetryData, sizeof(telemetryData)); - case TELEM_FORMULA_DIST: - if (sensor.dist.gps) { - TelemetryItem gpsItem = telemetryItems[sensor.dist.gps-1]; - TelemetryItem * altItem = NULL; - if (!gpsItem.isAvailable()) { - return; - } - else if (gpsItem.isOld()) { - lastReceived = TELEMETRY_VALUE_OLD; - return; - } - if (sensor.dist.alt) { - altItem = &telemetryItems[sensor.dist.alt-1]; - if (!altItem->isAvailable()) { - return; - } - else if (altItem->isOld()) { - lastReceived = TELEMETRY_VALUE_OLD; - return; - } - } - uint32_t latitude, longitude; - gpsItem.gps.extractLatitudeLongitude(&latitude, &longitude); +#if defined(CPUARM) + for (int index=0; index gpsItem.pilotLatitude) ? latitude - gpsItem.pilotLatitude : gpsItem.pilotLatitude - latitude; - uint32_t dist = EARTH_RADIUS * angle / 1000000; - uint32_t result = dist*dist; + telemetryStreaming = 0; // reset counter only if valid frsky packets are being detected + link_counter = 0; - angle = (longitude > gpsItem.pilotLongitude) ? longitude - gpsItem.pilotLongitude : gpsItem.pilotLongitude - longitude; - dist = gpsItem.distFromEarthAxis * angle / 1000000; - result += dist*dist; +#if defined(CPUARM) + telemetryState = TELEMETRY_INIT; +#endif - if (altItem) { - dist = abs(altItem->value) / g_model.telemetrySensors[sensor.dist.alt-1].getPrecDivisor(); - result += dist*dist; - } +#if defined(FRSKY_HUB) && !defined(CPUARM) + telemetryData.hub.gpsLatitude_bp = 2; + telemetryData.hub.gpsLongitude_bp = 2; + telemetryData.hub.gpsFix = -1; +#endif - setValue(sensor, isqrt32(result), UNIT_METERS); - } - break; +#if defined(SIMU) - case TELEM_FORMULA_ADD: - case TELEM_FORMULA_AVERAGE: - case TELEM_FORMULA_MIN: - case TELEM_FORMULA_MAX: - case TELEM_FORMULA_MULTIPLY: +#if defined(CPUARM) + telemetryData.swr.value = 30; + telemetryData.rssi.value = 75; +#else + telemetryData.rssi[0].value = 75; + telemetryData.rssi[1].value = 75; + telemetryData.analog[TELEM_ANA_A1].set(120, UNIT_VOLTS); + telemetryData.analog[TELEM_ANA_A2].set(240, UNIT_VOLTS); +#endif + +#if !defined(CPUARM) + telemetryData.hub.fuelLevel = 75; + telemetryData.hub.rpm = 12000; + telemetryData.hub.vfas = 100; + telemetryData.hub.minVfas = 90; + +#if defined(GPS) + telemetryData.hub.gpsFix = 1; + telemetryData.hub.gpsLatitude_bp = 4401; + telemetryData.hub.gpsLatitude_ap = 7710; + telemetryData.hub.gpsLongitude_bp = 1006; + telemetryData.hub.gpsLongitude_ap = 8872; + telemetryData.hub.gpsSpeed_bp = 200; //in knots + telemetryData.hub.gpsSpeed_ap = 0; + getGpsPilotPosition(); + + telemetryData.hub.gpsLatitude_bp = 4401; + telemetryData.hub.gpsLatitude_ap = 7455; + telemetryData.hub.gpsLongitude_bp = 1006; + telemetryData.hub.gpsLongitude_ap = 9533; + getGpsDistance(); +#endif + + telemetryData.hub.airSpeed = 1000; // 185.1 km/h + + telemetryData.hub.cellsCount = 6; + telemetryData.hub.cellVolts[0] = 410/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[1] = 420/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[2] = 430/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[3] = 440/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[4] = 450/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[5] = 460/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.minCellVolts = 250/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.minCell = 300; //unit 10mV + telemetryData.hub.minCells = 220; //unit 100mV + //telemetryData.hub.cellsSum = 261; //calculated from cellVolts[] + + telemetryData.hub.gpsAltitude_bp = 50; + telemetryData.hub.baroAltitude_bp = 50; + telemetryData.hub.minAltitude = 10; + telemetryData.hub.maxAltitude = 500; + + telemetryData.hub.accelY = 100; + telemetryData.hub.temperature1 = -30; + telemetryData.hub.maxTemperature1 = 100; + + telemetryData.hub.current = 55; + telemetryData.hub.maxCurrent = 65; +#endif +#endif + +/*Add some default sensor values to the simulator*/ +#if defined(CPUARM) && defined(SIMU) + for (int i=0; i(value, sensorValue)); - else if (sensor.formula == TELEM_FORMULA_MAX) - value = (count==1 ? sensorValue : max(value, sensorValue)); - else - value += sensorValue; - } - } - } - if (sensor.formula == TELEM_FORMULA_AVERAGE) { - if (count == 0) { - if (available) - lastReceived = TELEMETRY_VALUE_OLD; - return; - } - else { - value = (value + count/2) / count; - } - } - else if (sensor.formula == TELEM_FORMULA_MULTIPLY) { - if (count == 0) - return; - value = convertTelemetryValue(value, sensor.unit, mulprec, sensor.unit, sensor.prec); - } - setValue(sensor, value, sensor.unit, sensor.prec); - break; - } - - default: - break; - } -} - -void delTelemetryIndex(uint8_t index) -{ - memclear(&g_model.telemetrySensors[index], sizeof(TelemetrySensor)); - telemetryItems[index].clear(); - storageDirty(EE_MODEL); -} - -int availableTelemetryIndex() -{ - for (int index=0; index=0; index--) { - TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index]; - if (telemetrySensor.isAvailable()) { - return index; - } - } - return -1; -} - -void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec) -{ - bool available = false; - - for (int index=0; index= 0) { - switch (protocol) { -#if defined(FRSKY_SPORT) - case TELEM_PROTO_FRSKY_SPORT: - frskySportSetDefault(index, id, subId, instance); + case RSSI_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, RSSI_ID, 0, sensor.instance , 75, UNIT_RAW, 0); break; + case ADC1_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, ADC1_ID, 0, sensor.instance, 100, UNIT_RAW, 0); + break; + case ADC2_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, ADC2_ID, 0, sensor.instance, 245, UNIT_RAW, 0); + break; + case SWR_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, SWR_ID, 0, sensor.instance, 30, UNIT_RAW, 0); + break; + case BATT_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, BATT_ID, 0, sensor.instance, 100, UNIT_RAW, 0); + break; + } + } #endif -#if defined(FRSKY) - case TELEM_PROTO_FRSKY_D: - frskyDSetDefault(index, id); - break; +} + +#if defined(CPUARM) +// we don't reset the telemetry here as we would also reset the consumption after model load +void telemetryInit(uint8_t protocol) +{ + if (protocol == PROTOCOL_FRSKY_D) { + telemetryPortInit(FRSKY_D_BAUDRATE); + } +#if defined(CROSSFIRE) + else if (protocol == PROTOCOL_PULSES_CROSSFIRE) { + telemetryPortInit(CROSSFIRE_BAUDRATE); + telemetryPortSetDirectionOutput(); + } #endif - default: - return; - } - telemetryItems[index].setValue(g_model.telemetrySensors[index], value, unit, prec); + else if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + telemetryPortInit(0); + serial2TelemetryInit(PROTOCOL_FRSKY_D_SECONDARY); } else { - POPUP_WARNING(STR_TELEMETRYFULL); + telemetryPortInit(FRSKY_SPORT_BAUDRATE); } -} -void TelemetrySensor::init(const char * label, uint8_t unit, uint8_t prec) -{ - memclear(this->label, TELEM_LABEL_LEN); - strncpy(this->label, label, TELEM_LABEL_LEN); - this->unit = unit; - if (prec > 1 && (IS_DISTANCE_UNIT(unit) || IS_SPEED_UNIT(unit))) { - // 2 digits precision is not needed here - prec = 1; - } - this->prec = prec; -} - -void TelemetrySensor::init(uint16_t id) -{ - char label[4]; - label[0] = hex2zchar((id & 0xf000) >> 12); - label[1] = hex2zchar((id & 0x0f00) >> 8); - label[2] = hex2zchar((id & 0x00f0) >> 4); - label[3] = hex2zchar((id & 0x000f) >> 0); - init(label); -} - -bool TelemetrySensor::isAvailable() const -{ - return ZLEN(label) > 0; -} - -PACK(typedef struct { - uint8_t unitFrom; - uint8_t unitTo; - int16_t multiplier; - int16_t divisor; -}) UnitConversionRule; - -const UnitConversionRule unitConversionTable[] = { - /* unitFrom unitTo multiplier divisor */ - { UNIT_METERS, UNIT_FEET, 105, 32}, - { UNIT_METERS_PER_SECOND, UNIT_FEET_PER_SECOND, 105, 32}, - - { UNIT_KTS, UNIT_KMH, 1852, 1000}, // 1 knot = 1.85200 kilometers per hour - { UNIT_KTS, UNIT_MPH, 1151, 1000}, // 1 knot = 1.15077945 miles per hour - { UNIT_KTS, UNIT_METERS_PER_SECOND, 1000, 1944}, // 1 knot = 0.514444444 meters / second (divide with 1.94384449) - { UNIT_KTS, UNIT_FEET_PER_SECOND, 1688, 1000}, // 1 knot = 1.68780986 feet per second - - { UNIT_KMH, UNIT_KTS, 1000, 1852}, // 1 km/h = 0.539956803 knots (divide with 1.85200) - { UNIT_KMH, UNIT_MPH, 1000, 1609}, // 1 km/h = 0.621371192 miles per hour (divide with 1.60934400) - { UNIT_KMH, UNIT_METERS_PER_SECOND, 10, 36}, // 1 km/h = 0.277777778 meters / second (divide with 3.6) - { UNIT_KMH, UNIT_FEET_PER_SECOND, 911, 1000}, // 1 km/h = 0.911344415 feet per second - - { UNIT_MILLILITERS, UNIT_FLOZ, 100, 2957}, - { 0, 0, 0, 0} // termination -}; - -int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec) -{ - for (int i=prec; idivisor) { - if (p->unitFrom == unit && p->unitTo == destUnit) { - value = (value * (int32_t)p->multiplier) / (int32_t)p->divisor; - break; - } - ++p; - } + clearMFP(); } - - for (int i=destPrec; iprec == 2) { - value *= 10; - prec = 2; - } - else { - prec = 1; - } - value = (custom.ratio * value + 122) / 255; - } - - value = convertTelemetryValue(value, unit, prec, this->unit, this->prec); - - if (type == TELEM_TYPE_CUSTOM) { - value += custom.offset; - if (value < 0 && onlyPositive) { - value = 0; - } - } - - return value; + telemetryPortInit(); } +#endif -bool TelemetrySensor::isConfigurable() const +NOINLINE uint8_t getRssiAlarmValue(uint8_t alarm) { - if (type == TELEM_TYPE_CALCULATED) { - if (formula >= TELEM_FORMULA_CELL) { - return false; - } - } - else { - if (unit >= UNIT_FIRST_VIRTUAL) { - return false; - } - } - return true; + return (45 - 3*alarm + g_model.frsky.rssiAlarms[alarm].value); } -bool TelemetrySensor::isPrecConfigurable() const -{ - if (isConfigurable()) { - return true; - } - else if (unit == UNIT_CELLS) { - return true; - } - else { - return false; - } -} - -int32_t TelemetrySensor::getPrecMultiplier() const -{ - /* - Important: the return type must be signed, otherwise - mathematic operations with a negative telemetry value won't work - */ - if (prec == 2) return 1; - if (prec == 1) return 10; - return 100; -} - -int32_t TelemetrySensor::getPrecDivisor() const -{ - if (prec == 2) return 100; - if (prec == 1) return 10; - return 1; -} +#if defined(LUA) +Fifo * luaInputTelemetryFifo = NULL; +Fifo * luaOutputTelemetryFifo = NULL; +#endif diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 36b3f695d..7ceb1e218 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -21,12 +21,41 @@ #ifndef _TELEMETRY_H_ #define _TELEMETRY_H_ -enum TelemetryProtocol -{ - TELEM_PROTO_FRSKY_D, - TELEM_PROTO_FRSKY_SPORT, -}; +#if defined (FRSKY) + // FrSky Telemetry + #include "frsky.h" +#elif defined(JETI) + // Jeti-DUPLEX Telemetry + #include "jeti.h" +#elif defined(ARDUPILOT) + // ArduPilot Telemetry + #include "ardupilot.h" +#elif defined(NMEA) + // NMEA Telemetry + #include "nmea.h" +#elif defined(MAVLINK) + // Mavlink Telemetry + #include "mavlink.h" +#endif +extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time + +#if defined(WS_HOW_HIGH) +extern uint8_t wshhStreaming; +#endif + +extern uint8_t link_counter; + +#if defined(CPUARM) +enum TelemetryStates { + TELEMETRY_INIT, + TELEMETRY_OK, + TELEMETRY_KO +}; +extern uint8_t telemetryState; +#endif + +#if defined(CPUARM) #define TELEMETRY_VALUE_TIMER_CYCLE 200 /*20 seconds*/ #define TELEMETRY_VALUE_OLD_THRESHOLD 150 /*15 seconds*/ #define TELEMETRY_VALUE_UNAVAILABLE 255 @@ -60,108 +89,32 @@ PACK(struct CellValue } }); -class TelemetryItem -{ - public: - union { - int32_t value; // value, stored as uint32_t but interpreted accordingly to type - uint32_t distFromEarthAxis; - }; - - union { - int32_t valueMin; // min store - uint32_t pilotLongitude; - }; - - union { - int32_t valueMax; // max store - uint32_t pilotLatitude; - }; - - uint8_t lastReceived; // for detection of sensor loss - - union { - struct { - int32_t offsetAuto; - int32_t filterValues[TELEMETRY_AVERAGE_COUNT]; - } std; - struct { - uint16_t prescale; - } consumption; - struct { - uint8_t count; - CellValue values[6]; - } cells; - struct { - uint8_t datestate; - uint16_t year; - uint8_t month; - uint8_t day; - uint8_t timestate; - uint8_t hour; - uint8_t min; - uint8_t sec; - } datetime; - struct { - uint16_t longitude_bp; - uint16_t longitude_ap; - char longitudeEW; - uint16_t latitude_bp; - uint16_t latitude_ap; - char latitudeNS; - // pilot longitude is stored in min - // pilot latitude is stored in max - // distFromEarthAxis is stored in value - void extractLatitudeLongitude(uint32_t * latitude, uint32_t * longitude) - { - div_t qr = div(latitude_bp, 100); - *latitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + latitude_ap) * 5) / 3; - qr = div(longitude_bp, 100); - *longitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + longitude_ap) * 5) / 3; - } - } gps; - }; - - static uint8_t now() - { - return (get_tmr10ms() / 10) % TELEMETRY_VALUE_TIMER_CYCLE; - } - - TelemetryItem() - { - clear(); - } - - void clear() - { - memset(this, 0, sizeof(*this)); - lastReceived = TELEMETRY_VALUE_UNAVAILABLE; - } - - void eval(const TelemetrySensor & sensor); - void per10ms(const TelemetrySensor & sensor); - - void setValue(const TelemetrySensor & sensor, int32_t newVal, uint32_t unit, uint32_t prec=0); - bool isAvailable(); - bool isFresh(); - bool isOld(); - void gpsReceived(); -}; - -extern TelemetryItem telemetryItems[MAX_SENSORS]; -extern uint8_t allowNewSensors; - void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec); void delTelemetryIndex(uint8_t index); int availableTelemetryIndex(); int lastUsedTelemetryIndex(); + int32_t getTelemetryValue(uint8_t index, uint8_t & prec); int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec); void frskySportSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance); void frskyDSetDefault(int index, uint16_t id); +#endif #define IS_DISTANCE_UNIT(unit) ((unit) == UNIT_METERS || (unit) == UNIT_FEET) #define IS_SPEED_UNIT(unit) ((unit) >= UNIT_KTS && (unit) <= UNIT_MPH) +#if defined(CPUARM) +extern uint8_t telemetryProtocol; +#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D) +#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT) +#else +#define IS_FRSKY_D_PROTOCOL() (true) +#define IS_FRSKY_SPORT_PROTOCOL() (false) +#endif + +#if defined(CPUARM) + #include "telemetry_sensors.h" +#endif + #endif // _TELEMETRY_H_ diff --git a/radio/src/telemetry/telemetry_holders.cpp b/radio/src/telemetry/telemetry_holders.cpp new file mode 100644 index 000000000..edcbc14d2 --- /dev/null +++ b/radio/src/telemetry/telemetry_holders.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +#if defined(CPUARM) +void TelemetryValueWithMin::reset() +{ + memclear(this, sizeof(*this)); +} +#endif + +void TelemetryValueWithMin::set(uint8_t value) +{ +#if defined(CPUARM) + if (this->value == 0) { + memset(values, value, TELEMETRY_AVERAGE_COUNT); + this->value = value; + } + else { + //calculate the average from values[] and value + //also shift readings in values [] array + unsigned int sum = values[0]; + for (int i=0; ivalue = sum/(TELEMETRY_AVERAGE_COUNT+1); + } +#else + if (this->value == 0) { + this->value = value; + } + else { + sum += value; + if (link_counter == 0) { + this->value = sum / (IS_FRSKY_D_PROTOCOL() ? FRSKY_D_AVERAGING : FRSKY_SPORT_AVERAGING); + sum = 0; + } + } +#endif + + if (!min || value < min) { + min = value; + } +} + +void TelemetryValueWithMinMax::set(uint8_t value, uint8_t unit) +{ + TelemetryValueWithMin::set(value); + if (unit != UNIT_VOLTS) { + this->value = value; + } + if (!max || value > max) { + max = value; + } +} diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h new file mode 100644 index 000000000..1068686d9 --- /dev/null +++ b/radio/src/telemetry/telemetry_holders.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _TELEMETRY_HOLDERS_H_ +#define _TELEMETRY_HOLDERS_H_ + +#include + +#if defined(CPUARM) +#define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! +#define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1] +class TelemetryValueWithMin { + public: + uint8_t value; // fitered value (average of last TELEMETRY_AVERAGE_COUNT+1 values) + uint8_t min; + uint8_t values[TELEMETRY_AVERAGE_COUNT]; + void set(uint8_t value); + void reset(); +}; +#else +#define RAW_FRSKY_MINMAX(v) v.value +class TelemetryValueWithMin { + public: + uint8_t value; + uint8_t min; + uint16_t sum; + void set(uint8_t value); +}; +#endif + +class TelemetryValueWithMinMax: public TelemetryValueWithMin { + public: + uint8_t max; + void set(uint8_t value, uint8_t unit); +}; + +#endif // _TELEMETRY_HOLDERS_H_ \ No newline at end of file diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp new file mode 100644 index 000000000..294c2a951 --- /dev/null +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -0,0 +1,693 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +TelemetryItem telemetryItems[MAX_SENSORS]; +uint8_t allowNewSensors; + +void TelemetryItem::gpsReceived() +{ + if (!distFromEarthAxis) { + gps.extractLatitudeLongitude(&pilotLatitude, &pilotLongitude); + uint32_t lat = pilotLatitude / 10000; + uint32_t angle2 = (lat*lat) / 10000; + uint32_t angle4 = angle2 * angle2; + distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500); + } + lastReceived = now(); +} + +void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32_t unit, uint32_t prec) +{ + int32_t newVal = val; + + if (unit == UNIT_CELLS) { + uint32_t data = uint32_t(newVal); + uint8_t cellsCount = (data >> 24); + uint8_t cellIndex = ((data >> 16) & 0x0F); + uint16_t cellValue = (data & 0xFFFF); + if (cellsCount == 0) { + cellsCount = (cellIndex >= cells.count ? cellIndex + 1 : cells.count); + if (cellsCount != cells.count) { + clear(); + cells.count = cellsCount; + // we skip this round as we are not sure we received all cells values + return; + } + } + else if (cellsCount != cells.count) { + clear(); + cells.count = cellsCount; + } + cells.values[cellIndex].set(cellValue); + if (cellIndex+1 == cells.count) { + newVal = 0; + for (int i=0; i> 24); + datetime.month = (uint8_t) ((data & 0x00ff0000) >> 16); + datetime.day = (uint8_t) ((data & 0x0000ff00) >> 8); + if (datetime.year != 0) { + datetime.datestate = 1; + } +#if defined(RTCLOCK) + if (g_eeGeneral.adjustRTC && (datetime.datestate == 1)) { + struct gtm t; + gettime(&t); + t.tm_year = datetime.year+4; + t.tm_mon = datetime.month-1; + t.tm_mday = datetime.day; + rtcSetTime(&t); + } +#endif + } + else { + datetime.hour = ((uint8_t) ((data & 0xff000000) >> 24) + g_eeGeneral.timezone + 24) % 24; + datetime.min = (uint8_t) ((data & 0x00ff0000) >> 16); + datetime.sec = (uint16_t) ((data & 0x0000ff00) >> 8); + if (datetime.datestate == 1) { + datetime.timestate = 1; + } +#if defined(RTCLOCK) + if (g_eeGeneral.adjustRTC && datetime.datestate == 1) { + struct gtm t; + gettime(&t); + if (abs((t.tm_hour-datetime.hour)*3600 + (t.tm_min-datetime.min)*60 + (t.tm_sec-datetime.sec)) > 20) { + // we adjust RTC only if difference is > 20 seconds + t.tm_hour = datetime.hour; + t.tm_min = datetime.min; + t.tm_sec = datetime.sec; + g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated + rtcSetTime(&t); + } + } +#endif + } + if (datetime.year == 0) { + return; + } + newVal = 0; + } + else if (unit == UNIT_GPS) { + uint32_t gps_long_lati_data = uint32_t(newVal); + uint32_t gps_long_lati_b1w, gps_long_lati_a1w; + gps_long_lati_b1w = (gps_long_lati_data & 0x3fffffff) / 10000; + gps_long_lati_a1w = (gps_long_lati_data & 0x3fffffff) % 10000; + switch ((gps_long_lati_data & 0xc0000000) >> 30) { + case 0: + gps.latitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); + gps.latitude_ap = gps_long_lati_a1w; + gps.latitudeNS = 'N'; + break; + case 1: + gps.latitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); + gps.latitude_ap = gps_long_lati_a1w; + gps.latitudeNS = 'S'; + break; + case 2: + gps.longitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); + gps.longitude_ap = gps_long_lati_a1w; + gps.longitudeEW = 'E'; + break; + case 3: + gps.longitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); + gps.longitude_ap = gps_long_lati_a1w; + gps.longitudeEW = 'W'; + break; + } + if (gps.longitudeEW && gps.latitudeNS) { + gpsReceived(); + } + return; + } + else if (unit >= UNIT_GPS_LONGITUDE && unit <= UNIT_GPS_LATITUDE_NS) { + uint32_t data = uint32_t(newVal); + switch (unit) { + case UNIT_GPS_LONGITUDE: + gps.longitude_bp = data >> 16; + gps.longitude_ap = data & 0xFFFF; + break; + case UNIT_GPS_LATITUDE: + gps.latitude_bp = data >> 16; + gps.latitude_ap = data & 0xFFFF; + break; + case UNIT_GPS_LONGITUDE_EW: + gps.longitudeEW = data; + break; + case UNIT_GPS_LATITUDE_NS: + gps.latitudeNS = data; + break; + } + if (gps.longitudeEW && gps.latitudeNS && gps.longitude_ap && gps.latitude_ap) { + gpsReceived(); + } + return; + } + else if (unit == UNIT_DATETIME_YEAR) { + datetime.year = newVal; + return; + } + else if (unit == UNIT_DATETIME_DAY_MONTH) { + uint32_t data = uint32_t(newVal); + datetime.month = data >> 8; + datetime.day = data & 0xFF; + datetime.datestate = 1; + return; + } + else if (unit == UNIT_DATETIME_HOUR_MIN) { + uint32_t data = uint32_t(newVal); + datetime.hour = ((data & 0xFF) + g_eeGeneral.timezone + 24) % 24; + datetime.min = data >> 8; + } + else if (unit == UNIT_DATETIME_SEC) { + datetime.sec = newVal & 0xFF; + datetime.timestate = 1; + newVal = 0; + } + else if (unit == UNIT_RPMS) { + if (sensor.custom.ratio != 0) { + newVal = (newVal * sensor.custom.offset) / sensor.custom.ratio; + } + } + else { + newVal = sensor.getValue(newVal, unit, prec); + if (sensor.autoOffset) { + if (!isAvailable()) { + std.offsetAuto = -newVal; + } + newVal += std.offsetAuto; + } + else if (sensor.filter) { + if (!isAvailable()) { + for (int i=0; i valueMax) { + valueMax = newVal; + if (sensor.unit == UNIT_VOLTS) { + valueMin = newVal; // the batt was changed + } + } + + for (int i=0; i= 3600) { + currentItem.consumption.prescale -= 3600; + setValue(sensor, value+1, sensor.unit, sensor.prec); + } + lastReceived = now(); + } + break; + + default: + break; + } +} + +void TelemetryItem::eval(const TelemetrySensor & sensor) +{ + switch (sensor.formula) { + case TELEM_FORMULA_CELL: + if (sensor.cell.source) { + TelemetryItem & cellsItem = telemetryItems[sensor.cell.source-1]; + if (cellsItem.isOld()) { + lastReceived = TELEMETRY_VALUE_OLD; + } + else { + unsigned int index = sensor.cell.index; + if (index == TELEM_CELL_INDEX_LOWEST || index == TELEM_CELL_INDEX_HIGHEST || index == TELEM_CELL_INDEX_DELTA) { + unsigned int lowest=0, highest=0; + for (int i=0; i cellsItem.cells.values[highest-1].value) + highest = i+1; + } + else { + lowest = highest = 0; + } + } + if (lowest) { + switch (index) { + case TELEM_CELL_INDEX_LOWEST: + setValue(sensor, cellsItem.cells.values[lowest-1].value, UNIT_VOLTS, 2); + break; + case TELEM_CELL_INDEX_HIGHEST: + setValue(sensor, cellsItem.cells.values[highest-1].value, UNIT_VOLTS, 2); + break; + case TELEM_CELL_INDEX_DELTA: + setValue(sensor, cellsItem.cells.values[highest-1].value - cellsItem.cells.values[lowest-1].value, UNIT_VOLTS, 2); + break; + } + } + } + else { + index -= 1; + if (index < cellsItem.cells.count && cellsItem.cells.values[index].state) { + setValue(sensor, cellsItem.cells.values[index].value, UNIT_VOLTS, 2); + } + } + } + } + break; + + case TELEM_FORMULA_DIST: + if (sensor.dist.gps) { + TelemetryItem gpsItem = telemetryItems[sensor.dist.gps-1]; + TelemetryItem * altItem = NULL; + if (!gpsItem.isAvailable()) { + return; + } + else if (gpsItem.isOld()) { + lastReceived = TELEMETRY_VALUE_OLD; + return; + } + if (sensor.dist.alt) { + altItem = &telemetryItems[sensor.dist.alt-1]; + if (!altItem->isAvailable()) { + return; + } + else if (altItem->isOld()) { + lastReceived = TELEMETRY_VALUE_OLD; + return; + } + } + uint32_t latitude, longitude; + gpsItem.gps.extractLatitudeLongitude(&latitude, &longitude); + + uint32_t angle = (latitude > gpsItem.pilotLatitude) ? latitude - gpsItem.pilotLatitude : gpsItem.pilotLatitude - latitude; + uint32_t dist = EARTH_RADIUS * angle / 1000000; + uint32_t result = dist*dist; + + angle = (longitude > gpsItem.pilotLongitude) ? longitude - gpsItem.pilotLongitude : gpsItem.pilotLongitude - longitude; + dist = gpsItem.distFromEarthAxis * angle / 1000000; + result += dist*dist; + + if (altItem) { + dist = abs(altItem->value) / g_model.telemetrySensors[sensor.dist.alt-1].getPrecDivisor(); + result += dist*dist; + } + + setValue(sensor, isqrt32(result), UNIT_METERS); + } + break; + + case TELEM_FORMULA_ADD: + case TELEM_FORMULA_AVERAGE: + case TELEM_FORMULA_MIN: + case TELEM_FORMULA_MAX: + case TELEM_FORMULA_MULTIPLY: + { + int32_t value=0, count=0, available=0, maxitems=4, mulprec=0; + if (sensor.formula == TELEM_FORMULA_MULTIPLY) { + maxitems = 2; + value = 1; + } + for (int i=0; i(value, sensorValue)); + else if (sensor.formula == TELEM_FORMULA_MAX) + value = (count==1 ? sensorValue : max(value, sensorValue)); + else + value += sensorValue; + } + } + } + if (sensor.formula == TELEM_FORMULA_AVERAGE) { + if (count == 0) { + if (available) + lastReceived = TELEMETRY_VALUE_OLD; + return; + } + else { + value = (value + count/2) / count; + } + } + else if (sensor.formula == TELEM_FORMULA_MULTIPLY) { + if (count == 0) + return; + value = convertTelemetryValue(value, sensor.unit, mulprec, sensor.unit, sensor.prec); + } + setValue(sensor, value, sensor.unit, sensor.prec); + break; + } + + default: + break; + } +} + +void delTelemetryIndex(uint8_t index) +{ + memclear(&g_model.telemetrySensors[index], sizeof(TelemetrySensor)); + telemetryItems[index].clear(); + storageDirty(EE_MODEL); +} + +int availableTelemetryIndex() +{ + for (int index=0; index=0; index--) { + TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index]; + if (telemetrySensor.isAvailable()) { + return index; + } + } + return -1; +} + +void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec) +{ + bool available = false; + + for (int index=0; index= 0) { + switch (protocol) { +#if defined(FRSKY_SPORT) + case TELEM_PROTO_FRSKY_SPORT: + frskySportSetDefault(index, id, subId, instance); + break; +#endif +#if defined(FRSKY) + case TELEM_PROTO_FRSKY_D: + frskyDSetDefault(index, id); + break; +#endif + default: + return; + } + telemetryItems[index].setValue(g_model.telemetrySensors[index], value, unit, prec); + } + else { + POPUP_WARNING(STR_TELEMETRYFULL); + } +} + +void TelemetrySensor::init(const char * label, uint8_t unit, uint8_t prec) +{ + memclear(this->label, TELEM_LABEL_LEN); + strncpy(this->label, label, TELEM_LABEL_LEN); + this->unit = unit; + if (prec > 1 && (IS_DISTANCE_UNIT(unit) || IS_SPEED_UNIT(unit))) { + // 2 digits precision is not needed here + prec = 1; + } + this->prec = prec; +} + +void TelemetrySensor::init(uint16_t id) +{ + char label[4]; + label[0] = hex2zchar((id & 0xf000) >> 12); + label[1] = hex2zchar((id & 0x0f00) >> 8); + label[2] = hex2zchar((id & 0x00f0) >> 4); + label[3] = hex2zchar((id & 0x000f) >> 0); + init(label); +} + +bool TelemetrySensor::isAvailable() const +{ + return ZLEN(label) > 0; +} + +PACK(typedef struct { + uint8_t unitFrom; + uint8_t unitTo; + int16_t multiplier; + int16_t divisor; +}) UnitConversionRule; + +const UnitConversionRule unitConversionTable[] = { + /* unitFrom unitTo multiplier divisor */ + { UNIT_METERS, UNIT_FEET, 105, 32}, + { UNIT_METERS_PER_SECOND, UNIT_FEET_PER_SECOND, 105, 32}, + + { UNIT_KTS, UNIT_KMH, 1852, 1000}, // 1 knot = 1.85200 kilometers per hour + { UNIT_KTS, UNIT_MPH, 1151, 1000}, // 1 knot = 1.15077945 miles per hour + { UNIT_KTS, UNIT_METERS_PER_SECOND, 1000, 1944}, // 1 knot = 0.514444444 meters / second (divide with 1.94384449) + { UNIT_KTS, UNIT_FEET_PER_SECOND, 1688, 1000}, // 1 knot = 1.68780986 feet per second + + { UNIT_KMH, UNIT_KTS, 1000, 1852}, // 1 km/h = 0.539956803 knots (divide with 1.85200) + { UNIT_KMH, UNIT_MPH, 1000, 1609}, // 1 km/h = 0.621371192 miles per hour (divide with 1.60934400) + { UNIT_KMH, UNIT_METERS_PER_SECOND, 10, 36}, // 1 km/h = 0.277777778 meters / second (divide with 3.6) + { UNIT_KMH, UNIT_FEET_PER_SECOND, 911, 1000}, // 1 km/h = 0.911344415 feet per second + + { UNIT_MILLILITERS, UNIT_FLOZ, 100, 2957}, + { 0, 0, 0, 0} // termination +}; + +int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec) +{ + for (int i=prec; idivisor) { + if (p->unitFrom == unit && p->unitTo == destUnit) { + value = (value * (int32_t)p->multiplier) / (int32_t)p->divisor; + break; + } + ++p; + } + } + + for (int i=destPrec; iprec == 2) { + value *= 10; + prec = 2; + } + else { + prec = 1; + } + value = (custom.ratio * value + 122) / 255; + } + + value = convertTelemetryValue(value, unit, prec, this->unit, this->prec); + + if (type == TELEM_TYPE_CUSTOM) { + value += custom.offset; + if (value < 0 && onlyPositive) { + value = 0; + } + } + + return value; +} + +bool TelemetrySensor::isConfigurable() const +{ + if (type == TELEM_TYPE_CALCULATED) { + if (formula >= TELEM_FORMULA_CELL) { + return false; + } + } + else { + if (unit >= UNIT_FIRST_VIRTUAL) { + return false; + } + } + return true; +} + +bool TelemetrySensor::isPrecConfigurable() const +{ + if (isConfigurable()) { + return true; + } + else if (unit == UNIT_CELLS) { + return true; + } + else { + return false; + } +} + +int32_t TelemetrySensor::getPrecMultiplier() const +{ + /* + Important: the return type must be signed, otherwise + mathematic operations with a negative telemetry value won't work + */ + if (prec == 2) return 1; + if (prec == 1) return 10; + return 100; +} + +int32_t TelemetrySensor::getPrecDivisor() const +{ + if (prec == 2) return 100; + if (prec == 1) return 10; + return 1; +} diff --git a/radio/src/telemetry/telemetry_sensors.h b/radio/src/telemetry/telemetry_sensors.h new file mode 100644 index 000000000..26747076b --- /dev/null +++ b/radio/src/telemetry/telemetry_sensors.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _TELEMETRY_SENSORS_H_ +#define _TELEMETRY_SENSORS_H_ + +class TelemetryItem +{ + public: + union { + int32_t value; // value, stored as uint32_t but interpreted accordingly to type + uint32_t distFromEarthAxis; + }; + + union { + int32_t valueMin; // min store + uint32_t pilotLongitude; + }; + + union { + int32_t valueMax; // max store + uint32_t pilotLatitude; + }; + + uint8_t lastReceived; // for detection of sensor loss + + union { + struct { + int32_t offsetAuto; + int32_t filterValues[TELEMETRY_AVERAGE_COUNT]; + } std; + struct { + uint16_t prescale; + } consumption; + struct { + uint8_t count; + CellValue values[6]; + } cells; + struct { + uint8_t datestate; + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t timestate; + uint8_t hour; + uint8_t min; + uint8_t sec; + } datetime; + struct { + uint16_t longitude_bp; + uint16_t longitude_ap; + char longitudeEW; + uint16_t latitude_bp; + uint16_t latitude_ap; + char latitudeNS; + // pilot longitude is stored in min + // pilot latitude is stored in max + // distFromEarthAxis is stored in value + void extractLatitudeLongitude(uint32_t * latitude, uint32_t * longitude) + { + div_t qr = div(latitude_bp, 100); + *latitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + latitude_ap) * 5) / 3; + qr = div(longitude_bp, 100); + *longitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + longitude_ap) * 5) / 3; + } + } gps; + }; + + static uint8_t now() + { + return (get_tmr10ms() / 10) % TELEMETRY_VALUE_TIMER_CYCLE; + } + + TelemetryItem() + { + clear(); + } + + void clear() + { + memset(this, 0, sizeof(*this)); + lastReceived = TELEMETRY_VALUE_UNAVAILABLE; + } + + void eval(const TelemetrySensor & sensor); + void per10ms(const TelemetrySensor & sensor); + + void setValue(const TelemetrySensor & sensor, int32_t newVal, uint32_t unit, uint32_t prec=0); + bool isAvailable(); + bool isFresh(); + bool isOld(); + void gpsReceived(); +}; + +extern TelemetryItem telemetryItems[MAX_SENSORS]; +extern uint8_t allowNewSensors; + +#endif // _TELEMETRY_SENSORS_H_ diff --git a/radio/src/tests/frsky.cpp b/radio/src/tests/frsky.cpp index 189f35bb6..3872e0ad6 100644 --- a/radio/src/tests/frsky.cpp +++ b/radio/src/tests/frsky.cpp @@ -34,7 +34,7 @@ void displayVoltagesScreen(); TEST(FrSky, gpsNfuel) { g_model.frsky.usrProto = 1; - frskyData.hub.gpsFix = 1; + telemetryData.hub.gpsFix = 1; uint8_t pkt1[] = { 0xfd, 0x07, 0x00, 0x5e, 0x14, 0x2c, 0x00, 0x5e, 0x1c, 0x03 }; uint8_t pkt2[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x13, 0x38, 0x0c, 0x5e, 0x1b }; @@ -50,14 +50,14 @@ TEST(FrSky, gpsNfuel) frskyDProcessPacket(pkt5); frskyDProcessPacket(pkt6); frskyDProcessPacket(pkt7); - EXPECT_EQ(frskyData.hub.gpsCourse_bp, 44); - EXPECT_EQ(frskyData.hub.gpsCourse_ap, 03); - EXPECT_EQ(frskyData.hub.gpsLongitude_bp / 100, 120); - EXPECT_EQ(frskyData.hub.gpsLongitude_bp % 100, 15); - EXPECT_EQ(frskyData.hub.gpsLongitude_ap, 0x2698); - EXPECT_EQ(frskyData.hub.gpsLatitudeNS, 'N'); - EXPECT_EQ(frskyData.hub.gpsLongitudeEW, 'E'); - EXPECT_EQ(frskyData.hub.fuelLevel, 100); + EXPECT_EQ(telemetryData.hub.gpsCourse_bp, 44); + EXPECT_EQ(telemetryData.hub.gpsCourse_ap, 03); + EXPECT_EQ(telemetryData.hub.gpsLongitude_bp / 100, 120); + EXPECT_EQ(telemetryData.hub.gpsLongitude_bp % 100, 15); + EXPECT_EQ(telemetryData.hub.gpsLongitude_ap, 0x2698); + EXPECT_EQ(telemetryData.hub.gpsLatitudeNS, 'N'); + EXPECT_EQ(telemetryData.hub.gpsLongitudeEW, 'E'); + EXPECT_EQ(telemetryData.hub.fuelLevel, 100); } TEST(FrSky, dateNtime) @@ -68,17 +68,17 @@ TEST(FrSky, dateNtime) frskyDProcessPacket(pkt1); frskyDProcessPacket(pkt2); frskyDProcessPacket(pkt3); - EXPECT_EQ(frskyData.hub.day, 15); - EXPECT_EQ(frskyData.hub.month, 07); - EXPECT_EQ(frskyData.hub.year, 11); - EXPECT_EQ(frskyData.hub.hour, 06); - EXPECT_EQ(frskyData.hub.min, 18); - EXPECT_EQ(frskyData.hub.sec, 50); + EXPECT_EQ(telemetryData.hub.day, 15); + EXPECT_EQ(telemetryData.hub.month, 07); + EXPECT_EQ(telemetryData.hub.year, 11); + EXPECT_EQ(telemetryData.hub.hour, 06); + EXPECT_EQ(telemetryData.hub.min, 18); + EXPECT_EQ(telemetryData.hub.sec, 50); } #endif #if defined(FRSKY) && defined(CPUARM) -TEST(FrSky, FrskyValueWithMinAveraging) +TEST(FrSky, TelemetryValueWithMinAveraging) { /* The following expected[] array is filled @@ -90,7 +90,7 @@ TEST(FrSky, FrskyValueWithMinAveraging) uint8_t expected[] = { 10, 12, 17, 25, 35, 45, 55, 65, 75, 85, 92, 97, 100, 100, 100, 100, 100}; int testPos = 0; //test of averaging - FrskyValueWithMin testVal; + TelemetryValueWithMin testVal; testVal.value = 0; testVal.set(10); EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 10); diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index 5dd7db858..07e7a14e8 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -79,7 +79,7 @@ inline void MIXER_RESET() inline void TELEMETRY_RESET() { #if defined(FRSKY) - memclear(&frskyData, sizeof(frskyData)); + memclear(&telemetryData, sizeof(telemetryData)); TELEMETRY_RSSI() = 100; #endif #if defined(CPUARM) && defined(FRSKY) diff --git a/radio/src/vario.cpp b/radio/src/vario.cpp index 67f195e4e..2d81568e9 100644 --- a/radio/src/vario.cpp +++ b/radio/src/vario.cpp @@ -80,7 +80,7 @@ void varioWakeup() if (isFunctionActive(FUNCTION_VARIO)) { #if defined(AUDIO) cli(); - int16_t verticalSpeed = frskyData.hub.varioSpeed; + int16_t verticalSpeed = telemetryData.hub.varioSpeed; sei(); #if defined(PCBSTD) @@ -126,7 +126,7 @@ void varioWakeup() #elif defined(BUZZER) // && !defined(AUDIO) - int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(frskyData.hub.varioSpeed/10), (int16_t)+100); + int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(telemetryData.hub.varioSpeed/10), (int16_t)+100); uint16_t interval; if (verticalSpeed == 0) { From d73b34e1a97be56996b1cb8621bc779a4150ed45 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 11:25:47 +0200 Subject: [PATCH 39/69] [Crossfire] Back to 400kHz, at least for Taranis (no DMA on RX) --- radio/src/pulses/pulses_arm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 7dc7277b7..9a8fb4091 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -68,7 +68,7 @@ PACK(struct Dsm2PulsesData { }); #endif -#define CROSSFIRE_BAUDRATE 921600 +#define CROSSFIRE_BAUDRATE 400000 #define CROSSFIRE_FRAME_LEN 25 #define CROSSFIRE_CHANNELS_COUNT 16 PACK(struct CrossfirePulsesData { From 7c1db4c4dc3eb72949de34b31cc8035db684f3e5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 11:26:57 +0200 Subject: [PATCH 40/69] Less files in .gitignore (they are now visible in case of in source compilation) --- radio/src/translations/.gitignore | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 radio/src/translations/.gitignore diff --git a/radio/src/translations/.gitignore b/radio/src/translations/.gitignore deleted file mode 100644 index e270edda0..000000000 --- a/radio/src/translations/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/en.h -/cz.h -/de.h -/es.h -/fi.h -/fr.h -/it.h -/nl.h -/pl.h -/pt.h -/se.h From af87c57d1dc1a7fd9300ef936482c6489ca65719 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 17:23:35 +0200 Subject: [PATCH 41/69] Translations files cosmetics (no CRLF / standard header / translation author, start at line 45) --- radio/src/translations/cz.h.txt | 39 +- radio/src/translations/de.h.txt | 2339 +++++++++++++++--------------- radio/src/translations/en.h.txt | 41 +- radio/src/translations/es.h.txt | 37 +- radio/src/translations/fi.h.txt | 41 +- radio/src/translations/fr.h.txt | 41 +- radio/src/translations/it.h.txt | 2334 +++++++++++++++--------------- radio/src/translations/nl.h.txt | 43 +- radio/src/translations/pl.h.txt | 41 +- radio/src/translations/pt.h.txt | 2241 +++++++++++++++-------------- radio/src/translations/se.h.txt | 2363 +++++++++++++++---------------- 11 files changed, 4727 insertions(+), 4833 deletions(-) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index c0fede4ec..84d5f6b50 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1,16 +1,12 @@ /* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -21,10 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * - * - * + */ + +// CZ translations author: Martin Hotar + +/* * !!!!! DO NOT EDIT cz.h - EDIT cz.h.txt INSTEAD !!!!!!! * * In order to make translations easier cz.h.txt is parsed and national @@ -33,7 +30,9 @@ * * !!!!! DO NOT EDIT cz.h - EDIT cz.h.txt INSTEAD !!!!!!! */ -/* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -43,14 +42,6 @@ - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "VYP""ZAP" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index f1e5184a1..5cfabed45 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1,1174 +1,1165 @@ -/* German checked 27.09.2015 r096 opentx V2.1.4 für X9D,X9D+, X9E, Th9, 9XR, 9XR-Pro - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Helle - * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * - * !!!!! DO NOT EDIT de.h - EDIT de.h.txt INSTEAD !!!!!!! - * - * In order to make translations easier de.h.txt is parsed and national - * characters are replaced by bitmap codes. The result is de.h. - * - * See translate.py in the util folder for the list of character codes - * - * !!!!! DO NOT EDIT de.h - EDIT de.h.txt INSTEAD !!!!!!! - */ - /* Formatting octal codes available in TR_ strings: - * \037\x -sets LCD x-coord (x value in octal) - * \036 -newline - * \035 -horizontal tab (ARM only) - * \001 to \034 -extended spacing (value * FW/2) - * \0 -ends current string - */ - - - - - - - - - - - - - - -// NON ZERO TERMINATED STRINGS -#define LEN_OFFON "\003" -#define TR_OFFON "AUS""EIN" - -#define LEN_MMMINV "\003" -#define TR_MMMINV "---""INV" - -#define LEN_NCHANNELS "\004" -#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH" - -#define LEN_VBEEPMODE "\005" -#define TR_VBEEPMODE "Stumm""Alarm""NoKey""Alle\0" - -#define LEN_VBEEPLEN "\005" -#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0" - -#define LEN_VRENAVIG "\003" -#define TR_VRENAVIG "AUSDGaDGb" - -#define LEN_VBLMODE "\005" -#define TR_VBLMODE "AUS\0 ""Taste""Stks\0""Beide""EIN\0 " // Anpassung - -#define LEN_TRNMODE "\003" -#define TR_TRNMODE "AUS"" +="" :=" - -#define LEN_TRNCHN "\003" -#define TR_TRNCHN "CH1CH2CH3CH4" - -#define LEN_UART3MODES "\015" -#define TR_UART3MODES "AUS\0 ""S-Port Mirror""Telemetrie\0 ""SBUS Schüler\0""Debug\0" - -#define LEN_SWTYPES "\006" -#define TR_SWTYPES "Kein\0 ""Taster""2POS\0 ""3POS\0" - -#define LEN_POTTYPES "\017" -#define TR_POTTYPES "Kein\0 ""Poti mit Raste ""Stufen-Schalter""Poti ohne Raste\0" - -#define LEN_SLIDERTYPES "\006" -#define TR_SLIDERTYPES "Keine\0""Slider" - -#define LEN_DATETIME "\005" -#define TR_DATETIME "DATE:""ZEIT:" - -#define LEN_VLCD "\006" -#define TR_VLCD "NormalOptrex" - -#define LEN_VPERSISTENT "\014" -#define TR_VPERSISTENT "AUS\0 ""Flugzeit\0 ""Manuell Ruck" - -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") - -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF" - -#if defined(MODULE_D16_EU_ONLY_SUPPORT) - #define LEN_XJT_PROTOCOLS "\007" - #define TR_XJT_PROTOCOLS "AUS\0 ""D16-EU\0""D8\0 ""LR12-EU" -#else - #define LEN_XJT_PROTOCOLS "\004" - #define TR_XJT_PROTOCOLS "AUS\0""X16\0""D8\0 ""LR12" -#endif - -#define LEN_DSM_PROTOCOLS "\004" -#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal - -#define LEN_VTRIMINC TR("\007", "\014") // ursprüglich "\006", "\013" -#define TR_VTRIMINC TR("Expo ""ExFein ""Fein ""Mittel ""Grob ", "Exponentiell""Extrafein ""Fein ""Mittel ""Grob ") - -#define LEN_VDISPLAYTRIMS "\006" -#define TR_VDISPLAYTRIMS "Nein\0 ""Kurz\0 ""Ja\0" //Trimmwerte Keine, kurze Anzeigen, Ja - -#define LEN_VBEEPCOUNTDOWN "\006" -#define TR_VBEEPCOUNTDOWN "Kein\0 Pieps\0StimmeHaptik" - -#define LEN_VVARIOCENTER "\006" -#define TR_VVARIOCENTER "Ton\0 ""Ruhe " - -#define LEN_CURVE_TYPES "\010" -#define TR_CURVE_TYPES " Nur Y "" X und Y" //"Standard""Custom\0" - -#define LEN_RETA123 "\001" - -#if defined(PCBHORUS) - #define TR_RETA123 "SHGQ12345LR" -#elif defined(PCBFLAMENCO) - #define TR_RETA123 "SHGQ123LR" -#elif defined(PCBTARANIS) && defined(REV9E) - #define TR_RETA123 "SHGQ1234LRLR" -#elif defined(PCBTARANIS) || defined(REVX) - #define TR_RETA123 "SHGQ123LR" -#elif defined(PCBSKY9X) - #define TR_RETA123 "SHGQ123a" -#elif defined(CPUM2560) - #define TR_RETA123 "SHGQ123ab" -#else - #define TR_RETA123 "SHGQ123" -#endif - -#define LEN_VPROTOS "\006" - -#if defined(PXX) - #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) - #define TR_PXX "[PXX]\0" -#else - #define TR_PXX -#endif - -#if defined(DSM2) - #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" -#else - #define TR_DSM2 -#endif - -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - -#if defined(CPUARM) - #define TR_XPPM -#else - #define TR_XPPM "PPM16\0""PPMsim" -#endif - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS - -#define LEN_POSNEG "\003" -#define TR_POSNEG "POS""NEG" - -#if defined(PCBSKY9X) && defined(REVX) - #define LEN_VOUTPUT_TYPE "\011" - #define TR_VOUTPUT_TYPE "OpenDrain""PushPull\0" -#endif - -#define LEN_VCURVEFUNC "\003" -#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" - -#define LEN_VMLTPX "\010" -#define TR_VMLTPX "Addiere ""Multipl.""Ersetze " - -#define LEN_VMLTPX2 "\002" -#define TR_VMLTPX2 "+=""*="":=" - -#define LEN_VMIXTRIMS "\003" -#define TR_VMIXTRIMS "AUS""EIN""Sei""Höh""Gas""Que" //Mixer Trim Werte - -#if LCD_W >= 212 - #define TR_CSWTIMER "Takt\0" // TIM = Takt = Taktgenerator - #define TR_CSWSTICKY "SRFF\0" // Sticky = RS-Flip-Flop - #define TR_CSWRANGE "Range" // Range = Bereichsabfrage von bis - #define TR_CSWSTAY "Puls\0" // Edge = einstellbarer Impuls -#else - #define TR_CSWTIMER "Takt\0" // TIM = Takt = Taktgenerator - #define TR_CSWSTICKY "SRFF\0" // Sticky = RS-Flip-Flop - #if defined(CPUARM) - #define TR_CSWRANGE "Rnge\0" // Range= Bereichsabfrage von bis - #define TR_CSWSTAY "Puls\0" // Edge = einstellbarer Impuls - #else - #define TR_CSWRANGE - #define TR_CSWSTAY - #endif -#endif - -#if defined(CPUARM) -#define TR_CSWEQUAL "a=x\0 " -#else -#define TR_CSWEQUAL -#endif - -#define LEN_VCSWFUNC "\005" -#if defined(CPUARM) -#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a= 212 - #define TR_SF_SAFETY "Override\0 " //"Override\0 " -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Overr.\0 " //"Overr.\0 " -#else - #define TR_SF_SAFETY "---\0 " -#endif - -#if defined(PCBTARANIS) - #define TR_SF_SCREENSHOT "Screenshot" -#else - #define TR_SF_SCREENSHOT -#endif - -#define TR_SF_RESERVE "[Reserve]\0" - -#if defined(CPUARM) - #define TR_VFSWFUNC TR_SF_SAFETY "Lehrer \0 ""Inst. Trim""Rücksetz.\0""Setze \0 " TR_ADJUST_GVAR "Lautstr.\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "LCD Licht\0" TR_SF_SCREENSHOT TR_SF_TEST -#elif defined(PCBGRUVIN9X) - #define TR_VFSWFUNC TR_SF_SAFETY "Lehrer \0 ""Inst. Trim""Rücksetz.\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "LCD Licht\0" TR_SF_TEST -#else - #define TR_VFSWFUNC TR_SF_SAFETY "Lehrer \0 ""Inst. Trim""Rücksetz.\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC "LCD Licht\0" TR_SF_TEST -#endif - -#define LEN_VFSWRESET TR("\004", "\011") - -#if defined(FRSKY) - #define TR_FSW_RESET_TELEM TR("Telm", "Telemetrie") -#else - #define TR_FSW_RESET_TELEM -#endif - -#if ROTARY_ENCODERS == 2 - #define TR_FSW_RESET_ROTENC TR("DGa\0""DGb\0", "DrehGb A\0""DrehGb B\0") -#elif ROTARY_ENCODERS == 1 - #define TR_FSW_RESET_ROTENC TR("D.G.", "DrehGb\0 ") -#else - #define TR_FSW_RESET_ROTENC -#endif - -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " -#elif defined(CPUARM) - #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2" -#endif - -#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "All\0" TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, TR_FSW_RESET_TIMERS "All\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC) - -#define LEN_FUNCSOUNDS TR("\004", "\006") -#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Wrn1""Wrn2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Piep1\0""Piep2\0""Piep3\0""Warn1 ""Warn2 ""Cheep ""Ratata""Tick ""Siren ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") - -#define LEN_VTELEMCHNS TR("\004", "\005") - -#if defined(CPUARM) - #define TR_TELEM_RESERVE TR("[--]", "[---]") - #define TR_TELEM_TIME TR("Zeit", "Zeit\0") - #define TR_SWR TR("SWR\0", "SWR\0 ") - #define TR_RX_BATT TR("[NA]", "[NA]\0") - #define TR_A3_A4 TR("A3\0 ""A4\0 ", "A3\0 ""A4\0 ") - #define TR_A3_A4_MIN TR("A3-\0""A4-\0", "A3-\0 ""A4-\0 ") -#else - #define TR_TELEM_RESERVE - #define TR_TELEM_TIME - #define TR_SWR - #define TR_RX_BATT - #define TR_A3_A4 - #define TR_A3_A4_MIN -#endif - -#define TR_ASPD_MAX TR("ASp+", "ASpd+") - -#if LCD_W >= 212 - #define TR_TELEM_RSSI_RX "RSSI\0" -#else - #define TR_TELEM_RSSI_RX TR("Rx\0 ", "Rx\0 ") -#endif - -#if defined(CPUARM) - #define TR_TELEM_TIMERS TR("Tmr1""Tmr2""Tmr3", "Tmr1\0""Tmr2\0""Tmr3\0") -#else - #define TR_TELEM_TIMERS TR("Tmr1""Tmr2", "Tmr1\0""Tmr2\0") -#endif - -#if LCD_W >= 212 - #define TR_VTELEMCHNS "---\0 ""Akku\0" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Cells""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\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-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Zeit\0" -#else - #define TR_VTELEMCHNS "---\0""Akku" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\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""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Zeit" -#endif - -#define LENGTH_UNIT_IMP "ft\0" -#define SPEED_UNIT_IMP "mph" -#define LENGTH_UNIT_METR "m\0 " -#define SPEED_UNIT_METR "kmh" - -#if defined(CPUARM) - #define LEN_VUNITSSYSTEM TR("\006", "\012") - #define TR_VUNITSSYSTEM TR("Metrik""Imper.", "Metrisch\0 ""Imperial\0 ") - #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" -#else - #if defined(IMPERIAL_UNITS) - #define LENGTH_UNIT LENGTH_UNIT_IMP - #define SPEED_UNIT SPEED_UNIT_IMP - #else - #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 " -#endif - -#define STR_V (STR_VTELEMUNIT+1) -#define STR_A (STR_VTELEMUNIT+4) - -#define LEN_VALARM "\003" -#define TR_VALARM "---""Glb""Org""Rot" - -#define LEN_VALARMFN "\001" -#define TR_VALARMFN "<>" - -#define LEN_VTELPROTO "\007" -#define TR_VTELPROTO "Kein\0 ""Hub\0 ""WSHHigh" - -#if defined(CPUARM) - #define LEN_AMPSRC TR("\003", "\005") - #define TR_AMPSRC TR("---""A1\0""A2\0""A3\0""A4\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells") - #define LEN_VOLTSRC TR("\003", "\005") - #define TR_VOLTSRC TR("A1\0""A2\0""A3\0""A4\0""FAS""Cel", "A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells") -#else - #define LEN_AMPSRC TR("\003", "\005") - #define TR_AMPSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Cells") -#endif - -#define LEN_VARIOSRC "\004" -#if defined(FRSKY_SPORT) - #define TR_VARIOSRC "Vspd""A1\0 ""A2\0 ""dTE\0" -#else - #define TR_VARIOSRC "Alt\0""Alt+""Vspd""A1\0 ""A2\0 " -#endif - -#if defined(CPUARM) - #define LEN_VTELEMSCREENTYPE "\007" - #define TR_VTELEMSCREENTYPE " None "" Werte "" Balken"" Script" -#else - #define LEN_VTELEMSCREENTYPE "\007" - #define TR_VTELEMSCREENTYPE " Werte "" Balken" -#endif - -#define LEN_GPSFORMAT "\004" -#define TR_GPSFORMAT "GMS\0""NMEA" //Koordinatenanzeige - -#define LEN2_VTEMPLATES 15 // max String Länge für Menü (original=13) -#define LEN_VTEMPLATES "\017" // max String Länge 15+cr+lf -#define TR_VTEMPLATES "Misch. Lösch.\0 ""Einfach. 4-CH\0 ""Fixe Gassperre\0""V-Leitwerk\0 ""Delta Mischer\0 ""eCCPM\0 ""Hubschrauber\0 ""Servo Tester\0 " - -#define LEN_VSWASHTYPE "\004" -#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" - -#define LEN_VKEYS "\005" -#define TR_VKEYS TR("Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus") - -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "DGa""DGb" //Digitalgeber a und b = Drehgeber - -#define LEN_VSWITCHES "\003" -#define LEN_VSRCRAW "\004" - -#define TR_STICKS_VSRCRAW TR("Sei\0""Höh\0""Gas\0""Qur\0", "\307Sei""\307Höh""\307Gas""\307Qur") -#define TR_TRIMS_VSRCRAW TR("TrmS""TrmH""TrmG""TrmQ", "\313Sei""\313Höh""\313Gas""\313Qur") - -#if defined(PCBHORUS) - #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" -#elif defined(PCBFLAMENCO) - #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " - #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " -#elif defined(PCBTARANIS) && defined(REV9E) - #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" -#elif defined(PCBTARANIS) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" -#else - #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " - #define TR_SW_VSRCRAW "3POS" - #define TR_9X_3POS_SWITCHES "ID0""ID1""ID2" -#endif - -#if defined(CPUARM) - #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12""L13""L14""L15""L16""L17""L18""L19""L20""L21""L22""L23""L24""L25""L26""L27""L28""L29""L30""L31""L32" -#else - #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12" -#endif - -#define TR_TRIMS_SWITCHES TR("tSl""tSr""tHd""tHu""tGd""tGu""tQl""tQr", "\313Sl""\313Sr""\313Hd""\313Hu""\313Gd""\313Gu""\313Ql""\313Qr") - -#if defined(PCBSKY9X) - #define TR_ROTARY_ENCODERS "DGa\0" - #define TR_ROTENC_SWITCHES "DGa" -#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560) - #define TR_ROTARY_ENCODERS "DGa\0""DGb\0" - #define TR_ROTENC_SWITCHES "DGa""DGb" -#else - #define TR_ROTARY_ENCODERS - #define TR_ROTENC_SWITCHES -#endif - -#if !defined(PCBTARANIS) - #define TR_PHYS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" -#endif - -#define TR_ON_ONE_SWITCHES "ON\0""One" - -#if defined(PCBFLAMENCO) - #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" -#elif defined(PCBTARANIS) || defined(PCBHORUS) - // only special switches here - #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES -#else - #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES -#endif - -#if defined(HELI) -#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3" -#else -#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" -#endif - -#if defined(CPUARM) - #define TR_RESERVE_VSRCRAW "[--]" - #define TR_EXTRA_VSRCRAW "Batt""Time" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3" -#else - #define TR_EXTRA_VSRCRAW -#endif - -#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW - -#define LEN_VTMRMODES "\003" -#define TR_VTMRMODES "AUS""EIN""GSs""GS%""GSt" - -#define LEN_VTRAINERMODES "\022" -#define TR_VTRAINERMODES "Lehrer/Buchse\0 ""Schüler/Buchse\0 ""Lehrer/SBUS Modul\0""Lehrer/CPPM Modul\0""Lehrer/Batterie\0" - -#define LEN_VFAILSAFE "\015" // "\013" original -#define TR_VFAILSAFE "Kein Failsafe""Halte Pos.\0 ""Kanäle\0 ""Kein Signal\0 ""Empfänger\0 " - -#if defined(MAVLINK) - #define LEN_MAVLINK_BAUDS "\006" - #define TR_MAVLINK_BAUDS "4800 ""9600 ""14400 ""19200 ""38400 ""57600 ""76800 ""115200" - #define LEN_MAVLINK_AC_MODES "\011" - #define TR_MAVLINK_AC_MODES "Stabilize""Acro ""Alt Hold ""Auto ""Guided ""Loiter ""RTL ""Circle ""Pos Hold ""Land ""OF Loiter""Toy A ""Toy M ""INVALID " - #define LEN_MAVLINK_AP_MODES "\015" - #define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID " -#endif - -#define LEN_VSENSORTYPES "\012" -#define TR_VSENSORTYPES "Sensor\0 ""Berechnung" - -#define LEN_VFORMULAS "\014" // "\10" ursprünglich -#define TR_VFORMULAS "Addieren\0 ""Mittelwert\0 ""Min\0 ""Max\0 ""Multiplizier""Gesamt\0 ""Zelle\0 ""Verbrauch\0 ""Distanz\0 " - -#define LEN_VPREC "\004" // "\005" Prec0 Prec1 Prec2 ursprünglich -#define TR_VPREC "0.--""0.0 ""0.00" - -#define LEN_VCELLINDEX "\012" // "\007" ursprünglich -#define TR_VCELLINDEX "Niedrigst\0""1. Zelle\0 ""2. Zelle\0 ""3. Zelle\0 ""4. Zelle\0 ""5. Zelle\0 ""6. Zelle\0 ""Höchster\0 ""Differenz\0" - -// ZERO TERMINATED STRINGS -#if defined(COLORLCD) - #define INDENT "\007" - #define LEN_INDENT 1 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - -#if defined(PCBTARANIS) - #define TR_ENTER "[ENTER]" -#else - #define TR_ENTER "[MENU]" -#endif - -#define TR_EXIT "[EXIT]" - -#if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -#else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT - #define OFS_EXIT sizeof(TR_ENTER) -#endif - -#define TR_MENUWHENDONE CENTER"\010"TR_ENTER" > Weiter" -#define TR_FREE "frei" -#define TR_DELETEMODEL "Modell löschen?" -#define TR_COPYINGMODEL "Kopiere Modell" -#define TR_MOVINGMODEL "Schiebe Modell" -#define TR_LOADINGMODEL "Lade Modell..." -#define TR_NAME "Name" -#define TR_MODELNAME "Modellname" -#define TR_PHASENAME "Phase-Name" -#define TR_MIXNAME "Mix-Name" -#define TR_INPUTNAME "Input-Name" -#if defined(VIRTUALINPUTS) - #define TR_EXPONAME "Info-Name" -#else - #define TR_EXPONAME "Info-Name" // Expo Name -#endif -#define TR_BITMAP "Modellfoto" -#define TR_TIMER TR("Timer", "Timer ") // für Timer1 Timer2 Timer3 -#define TR_ELIMITS TR("Erw. Limit", "Erw. Wege auf 150%") -#define TR_ETRIMS TR("Erw. Trims", "Erw. Trim auf 100%") -#define TR_TRIMINC TR("Trim Schr.", "Trimmschritte") -#define TR_DISPLAY_TRIMS TR("Trim anzeig", "Trimwerte anzeigen") -#define TR_TTRACE TR("Gasquelle", INDENT "Gas-Timerquelle") -#define TR_TTRIM TR("Gastrim", INDENT "Gas-Leerlauftrim") -#define TR_BEEPCTR TR("Mitt.Piep", "Mittelstell. -Pieps") -#define TR_USE_GLOBAL_FUNCS TR("Glob. Funkt.", "Globale Funkt verw.") -#if defined(PCBSKY9X) && defined(REVX) - #define TR_OUTPUT_TYPE INDENT "Output" -#endif -#define TR_PROTO TR(INDENT "Protok.", INDENT "Protokoll") -#if defined(CPUARM) - #define TR_PPMFRAME INDENT "PPM frame" -#else - #define TR_PPMFRAME "PPM frame" -#endif -#define TR_MS "ms" -#define TR_SWITCH TR("Schalt.", "Schalter") -#define TR_TRIMS "Trims" -#define TR_FADEIN "Langs. Ein" -#define TR_FADEOUT "Langs. Aus" -#define TR_DEFAULT "(Normal)" -#define TR_CHECKTRIMS CENTER"\006Check\012Trims" -#define OFS_CHECKTRIMS CENTER_OFS+(9*FW) -#define TR_SWASHTYPE TR("Typ Taumelsch", "Typ Taumelscheibe") -#define TR_COLLECTIVE TR("Kollekt. Pitch", "Kollekt. Pitch Quelle") -#define TR_AILERON "Roll Quelle" -#define TR_ELEVATOR "Nick Quelle" -#define TR_SWASHRING TR("Ring Begrenz", "Ring Begrenzung") -#define TR_ELEDIRECTION TR("Nick Richtung", "Nick Servo Richtung") -#define TR_AILDIRECTION TR("Roll Richtung", "Roll Servo Richtung") -#define TR_COLDIRECTION TR("Pitch Richtung", "Pitch Servo Richtung") -#define TR_MODE INDENT "Modus" -#define TR_NOFREEEXPO "Expos voll!" -#define TR_NOFREEMIXER "Mischer voll!" -#define TR_SOURCE INDENT "Quelle" -#define TR_WEIGHT "Gewicht" -#define TR_EXPO TR("Expo", "Exponential") -#define TR_SIDE "Seite" -#define TR_DIFFERENTIAL "Diff" -#define TR_OFFSET INDENT "Offset" -#define TR_TRIM "Trim" -#define TR_DREX "DRex" -#define DREX_CHBOX_OFFSET 30 -#define TR_CURVE "Kurve" -#define TR_FLMODE TR("Phase", "Phasen") -#define TR_MIXWARNING "Warnung" -#define TR_OFF "AUS" -#define TR_MULTPX "Wirkung" -#define TR_DELAYDOWN "Verz. Dn" -#define TR_DELAYUP "Verz. Up" -#define TR_SLOWDOWN "Langs.Dn" -#define TR_SLOWUP "Langs.Up" -#define TR_MIXER "MISCHER" -#define TR_CV "KV" -#define TR_GV "GV" -#define TR_ACHANNEL TR("A\004gemessen", "A\004Kanal gemessen =>") //9XR-Pro -#define TR_RANGE TR(INDENT "Bereich", INDENT "Variobereich m/s") // 9XR-Pro -#define TR_CENTER TR(INDENT "Mitte m/s", INDENT "Variomitte m/s") -#define TR_BAR "Streifen" -#define TR_ALARM TR(INDENT "Alarme ", INDENT "Ein bei Alarm") //9XR-Pro -#define TR_USRDATA "Daten berechnen aus" -#define TR_BLADES TR(INDENT "Prop", INDENT "Prop-Blätter") //9XR-Pro -#define TR_SCREEN "Telm-Bild " -#define TR_SOUND_LABEL "----Töne---------" -#define TR_LENGTH INDENT "Dauer" -#define TR_BEEP_LENGTH INDENT "Beep-Länge" -#define TR_SPKRPITCH INDENT "Beep-Freq. +/-" -#define TR_HAPTIC_LABEL "----Haptik-------" //9XR-Pro -#define TR_HAPTICSTRENGTH INDENT "Stärke" -#define TR_CONTRAST "LCD-Kontrast" -#define TR_ALARMS_LABEL "----Alarm wenn---" -#define TR_BATTERY_RANGE TR("Akku Bereich", "Akku Spgs-Bereich") // Symbol Akku Ladezustand -#define TR_BATTERYWARNING INDENT "Akkuspg kleiner" -#define TR_INACTIVITYALARM TR(INDENT "Inaktivität", INDENT "Inaktivität nach") //9XR-Pro -#define TR_MEMORYWARNING INDENT "Speicher voll" -#define TR_ALARMWARNING TR(INDENT "Alle Töne aus?", INDENT "Alle Töne ganz aus?") -#define TR_RENAVIG "Drehgeb. Navig." -#define TR_THROTTLE_LABEL "----Gas-Kontrolle----" -#define TR_THROTTLEREVERSE TR("Gas invers", INDENT "Vollgas hinten?") //Änderung wg TH9x, Taranis -#define TR_TIMER_NAME INDENT "Name" -#define TR_MINUTEBEEP TR(INDENT "Min-Alarm", INDENT "Minuten-Alarm") -#define TR_BEEPCOUNTDOWN INDENT "Countdown" -#define TR_PERSISTENT TR(INDENT "Permanent", INDENT "Permanent") -#define TR_BACKLIGHT_LABEL "----LCD-Beleuchtg----" -#define TR_BLDELAY INDENT "Dauer" -#define TR_BLONBRIGHTNESS INDENT "An-Helligkeit" -#define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit" -#define TR_BLCOLOR INDENT "Farbe" -#define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Ein für") -#define TR_THROTTLEWARNING TR("Gasalarm", 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-Zeitzone +/-Std") -#define TR_ADJUST_RTC INDENT "Uhrzeit per GPS setzen" -#define TR_GPS "----GPS--------------" -#define TR_RXCHANNELORD TR("Kanalanordnung", "Kanalvoreinstellung") -#define TR_STICKS "Knüppel" -#define TR_POTS "Potis" -#define TR_SWITCHES "Schalter" -#define TR_SWITCHES_DELAY TR("Sw. Mitte Delay", "Schaltermitte Verz.") //Schalter Mitten verzögern Anpassung -#define TR_SLAVE TR("Schüler PPM1-16", "Schüler PPM1-16 als Ausgang") -#define TR_MODESRC " Modus\003% Quelle" -#define TR_MULTIPLIER "Multiplikator" -#define TR_CAL "Kal." -#define TR_VTRIM "Trim - +" -#define TR_BG "BG:" -#if defined(PCBHORUS) - #define TR_MENUTOSTART "Press [Enter] to start" - #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" - #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" -#elif defined(COLORLCD) - #define TR_MENUTOSTART CENTER"\007"TR_ENTER" zum Start" - #define TR_SETMIDPOINT CENTER"\002Knüppel+Potis auf Mitte" - #define TR_MOVESTICKSPOTS CENTER"\003Knüppel+Potis bewegen" -#else - #define TR_MENUTOSTART CENTER"\007"TR_ENTER" zum Start" - #define TR_SETMIDPOINT TR(CENTER "\002Knüppel+Potis auf Mitte", CENTER "\002Knüppel+Potis auf Mitte") - #define TR_MOVESTICKSPOTS CENTER"\003Knüppel+Potis bewegen" -#endif -#define TR_RXBATT "Rx Akku:" -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 -#define TR_ACCEL "Acc:" -#define TR_NODATA CENTER"Keine Daten" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036GAS\037\146GS%" -#define TR_TMR1LATMAXUS "Tmr1Lat max\037\124us" -#define STR_US (STR_TMR1LATMAXUS+13) -#define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" -#define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" - -#if defined(CPUARM) - #define TR_TMIXMAXMS "Tmix max" - #define TR_FREESTACKMINB "Free Stack" -#else - #define TR_TMIXMAXMS "Tmix max\037\124ms" - #define TR_FREESTACKMINB "Free Stack\037\124b" -#endif - -#define TR_MENUTORESET CENTER TR_ENTER" für Reset" -#define TR_PPM_TRAINER "TR" //old #define TR_PPM "PPM" -#define TR_CH "CH" -#define TR_MODEL "MODELL" -#define TR_FP "FP" -#define TR_MIX "MIX" -#define TR_EEPROMLOWMEM "EEPROM voll" -#define TR_ALERT "WARNUNG" -#define TR_PRESSANYKEYTOSKIP TR("Taste drücken",CENTER"Taste drücken") -#define TR_THROTTLENOTIDLE "Gas nicht Null!" -#define TR_ALARMSDISABLED "Alarme ausgeschaltet" -#define TR_PRESSANYKEY TR("Taste drücken",CENTER"Taste drücken") -#define TR_BADEEPROMDATA "EEPROM ungültig" -#define TR_BAD_RADIO_DATA "Bad Radio Data" -#define TR_EEPROMFORMATTING "EEPROM Initialisieren" -#define TR_STORAGE_FORMAT "Storage Preparation" -#define TR_EEPROMOVERFLOW "EEPROM Überlauf" -#define TR_MENURADIOSETUP TR("SENDER-EINSTELLEN", "SENDER-GRUNDEINSTELLUNGEN") -#define TR_MENUDATEANDTIME "DATUM UND ZEIT" -#define TR_MENUTRAINER TR("LEHRER/SCHÜLER", "LEHRER/SCHÜLER") -#define TR_MENUGLOBALFUNCS "GLOBALE FUNKTIONEN" -#define TR_MENUVERSION "VERSION" -#define TR_MENUDIAG TR("Schalt.", "Schalter-Test") -#define TR_MENUANA "Analog-Test" -#define TR_MENUCALIBRATION TR("KALIB. ANALOG", "KALIBRIERUNG Knüppel+Potis") -#if defined(COLORLCD) - #define TR_TRIMS2OFFSETS "Trims => Subtrims" -#else - #define TR_TRIMS2OFFSETS "\006Trims => Subtrims" -#endif -#define TR_MENUMODELSEL TR("MODELLE", "MODELL WÄHLEN") -#define TR_MENUSETUP TR("MODELL-EINSTELLUNG", "MODELL-EINSTELLUNGEN") -#define TR_MENUFLIGHTPHASE "FLUGPHASE" -#define TR_MENUFLIGHTPHASES "FLUGPHASEN" -#define TR_MENUHELISETUP TR("HELI TS-Mischer", "HELI TS-Mischer CYC1-3") - -#if defined(PCBTARANIS) - #define TR_MENUINPUTS "INPUTS" - #define TR_MENULIMITS "SERVOWEGE" -#else - #define TR_MENUINPUTS TR("DR/EXPO", "DUALRATE/EXPO") - #define TR_MENULIMITS TR("GRENZEN", "SERVOWEGE") -#endif - -#define TR_MENUCURVES "KURVEN" -#define TR_MENUCURVE "KURVE" -#define TR_MENULOGICALSWITCH "LOGIKSCHALTER" -#define TR_MENULOGICALSWITCHES "LOGIKSCHALTER" -#define TR_MENUCUSTOMFUNC TR("SPEZ.-FUNKTIONEN", "SPEZIAL-FUNKTIONEN") -#define TR_MENUCUSTOMSCRIPTS "LUA-SCRIPTE" -#define TR_MENUTELEMETRY "TELEMETRIE" -#define TR_MENUTEMPLATES "VORLAGEN" -#define TR_MENUSTAT "STAT" -#define TR_MENUDEBUG "DEBUG" -#if defined(CPUARM) - #define TR_RXNUM TR(INDENT "Empf Nr.", INDENT "Modell-Match-Nr.") -#else - #define TR_RXNUM "Empf Nr." -#endif -#define TR_SYNCMENU "Sync [MENU]" -#define TR_LIMIT INDENT "Grenzen" -#define TR_MINRSSI "Min. RSSI" -#define TR_LATITUDE "Breite:" -#define TR_LONGITUDE "Länge:" -#define TR_GPSCOORD TR("GPS-Koord.", "GPS-Koordinaten-Format") -#define TR_VARIO TR("----Vario--------", "----Variometer----") //9XR-Pro -#define TR_PITCH_AT_ZERO INDENT "Niedrigster Ton" -#define TR_PITCH_AT_MAX INDENT "Höchster Ton" -#define TR_REPEAT_AT_ZERO INDENT "Wiederholrate" -#define TR_POWEROFF "\027Power OFF..." -#define TR_SHUTDOWN "Herunterfahren" -#define TR_SAVEMODEL "Modelleinstellungen speichern" -#define TR_BATT_CALIB "Akku Spg messen" -#define TR_CURRENT_CALIB "Strom abgl." -#define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spannungsquelle") //9XR-Pro -#define TR_CURRENT TR(INDENT "Strom", INDENT "Stromquelle") -#define TR_SELECT_MODEL "Modell Wählen" -#define TR_CREATE_CATEGORY "Create Category" -#define TR_RENAME_CATEGORY "Rename Category" -#define TR_DELETE_CATEGORY "Delete Category" -#define TR_CREATE_MODEL "Neues Modell" -#define TR_DUPLICATE_MODEL "Duplicate Model" -#define TR_CHANGE_CATEGORY "Change category" -#define TR_COPY_MODEL "Kopiere Modell" -#define TR_MOVE_MODEL "Verschiebe Modell" -#define TR_BACKUP_MODEL "Modell auf SD-Karte" //9XR-Pro -#define TR_DELETE_MODEL "Modell Löschen" // TODO merged into DELETEMODEL? -#define TR_RESTORE_MODEL "Modell Restore" -#define TR_SDCARD_ERROR "SD-Kartenfehler" -#define TR_NO_SDCARD "Keine SD-Karte" -#define TR_SDCARD_FULL "SD-Karte voll" -#define TR_INCOMPATIBLE "Nicht kompatibel" -#define TR_WARNING "WARNUNG" -#define TR_EEPROMWARN "EEPROM" -#define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "EEPROM Converting" -#define TR_THROTTLEWARN "GAS" -#define TR_ALARMSWARN "ALARM" -#define TR_SWITCHWARN "SCHALTER" -#define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NO_FAILSAFE TR("Failsafe not set", "Failsafe nicht programmiert") -#define TR_KEYSTUCK "Taste klemmt" //Key stuck=Taste klemmt -#define TR_INVERT_THR TR("Gas umkehren?", "Vollgas hinten?") // Th9x 9XR -#define TR_SPEAKER_VOLUME INDENT "Lautstärke" -#define TR_LCD "Bildschirm" -#define TR_BRIGHTNESS INDENT "Helligkeit" -#define TR_CPU_TEMP "CPU-Temp.\016>" -#define TR_CPU_CURRENT "Strom\022>" -#define TR_CPU_MAH "Verbrauch" -#define TR_COPROC "CoProz." -#define TR_COPROC_TEMP "MB Temp. \016>" -#define TR_CAPAWARNING INDENT "Kapaz. niedrig" // wg 9XR-Pro -#define TR_TEMPWARNING INDENT "Temp. größer" //wg 9XR-Pro -#define TR_FUNC "Funktion" -#define TR_V1 "V1" -#define TR_V2 "V2" -#define TR_DURATION "Dauer" -#define TR_DELAY "Verzög." -#define TR_SD_CARD "SD-Karte" -#define TR_SDHC_CARD "SDHC-Karte" -#define TR_NO_SOUNDS_ON_SD "Keine Töne auf SD" -#define TR_NO_MODELS_ON_SD "Kein Modell auf SD" -#define TR_NO_BITMAPS_ON_SD "Keine Bitmaps auf SD" -#define TR_NO_SCRIPTS_ON_SD "Keine Scripte auf SD" -#define TR_SCRIPT_SYNTAX_ERROR "Script Syntax Fehler" -#define TR_SCRIPT_PANIC "Script panic" //?? -#define TR_SCRIPT_KILLED "Script killed" //?? -#define TR_SCRIPT_ERROR "Unbekannter Fehler" -#define TR_PLAY_FILE "Spielen" -#define TR_DELETE_FILE "Löschen" -#define TR_COPY_FILE "Kopieren" -#define TR_RENAME_FILE "Umbenennen" -#define TR_ASSIGN_BITMAP "Bitmap zuordnen" -#define TR_EXECUTE_FILE "Execute" -#define TR_REMOVED " gelöscht" -#define TR_SD_INFO "Information" -#define TR_SD_FORMAT "Formatieren" -#define TR_NA "N/V" //NV=Nicht Verfügbar Kurz-Meldung -#define TR_HARDWARE TR("Hardware einst. ", "Namen und Hardware einst.") -#define TR_FORMATTING "Formatierung..." -#define TR_TEMP_CALIB "Temp. abgl." -#define TR_TIME "Uhrzeit:" -#define TR_BAUDRATE "BT Baudrate" -#define TR_SD_INFO_TITLE "SD-INFO" -#define TR_SD_TYPE "Typ:" -#define TR_SD_SPEED "Geschw:" -#define TR_SD_SECTORS "Sectoren:" -#define TR_SD_SIZE "Größe:" -#define TR_TYPE INDENT "Type" -#define TR_GLOBAL_VARS "Globale Variablen" -#define TR_GVARS "GLOBALE V." -#define TR_GLOBAL_VAR "Globale Variable" -#define TR_MENUGLOBALVARS "GLOBALE VARIABLEN" -#define TR_OWN "Eigen" -#define TR_DATE "Datum:" -#define TR_ROTARY_ENCODER "Drehgeber" -#define TR_CHANNELS_MONITOR "Kanal-Monitor==>" -#define TR_MIXERS_MONITOR "==>Mischer Monitor" -#define TR_PATH_TOO_LONG "Pfad zu Lang" -#define TR_VIEW_TEXT "View Text" -#define TR_FLASH_BOOTLOADER "Flash BootLoader selbst" // -#define TR_FLASH_EXTERNAL_DEVICE "Flash externes Gerät" -#define TR_FLASH_INTERNAL_MODULE "Flash internes XJT-Modul" -#define TR_WRITING "\032Writing..." // -#define TR_CONFIRM_FORMAT "Formatieren bestätigen?" -#define TR_INTERNALRF "----Internes HF-Modul----------" -#define TR_EXTERNALRF TR("---Externes HF-Modul---", "----Externes HF-Modul----------") //9XR-Pro -#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") -#define TR_FAILSAFESET "Failsafe setzen" -#define TR_MENUSENSOR "SENSOR" -#define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Landescode" -#define TR_VOICELANG "Sprach-Ansage" -#define TR_UNITSSYSTEM "Einheiten" -#define TR_EDIT "Zeile Editieren" -#define TR_INSERT_BEFORE "Neue Zeile davor" -#define TR_INSERT_AFTER "Neue Zeile danach" -#define TR_COPY "Zeile kopieren" -#define TR_MOVE "Zeile verschieben" -#define TR_PASTE "Zeile einfügen" -#define TR_DELETE "Zeile löschen" -#define TR_INSERT "Neue Zeile" -#define TR_RESET_FLIGHT "Reset Flugdaten" -#define TR_RESET_TIMER1 "Reset Timer1" -#define TR_RESET_TIMER2 "Reset Timer2" -#define TR_RESET_TIMER3 "Reset Timer3" -#define TR_RESET_TELEMETRY "Reset Telemetrie" -#define TR_STATISTICS "Statistik und Gas" -#define TR_ABOUT_US "Die Programmierer" -#define TR_SETUP_SCREENS "Setup screens" -#define TR_AND_SWITCH "UND Schalt" //UND mit weiterem Schaltern -#define TR_SF "SF" //Spezial Funktionen -#define TR_GF "GF" // Globale Funktionen -#define TR_SPEAKER INDENT "Lautspr" -#define TR_BUZZER INDENT "Summer" -#define TR_BYTES "Bytes" -#define TR_MODULE_BIND TR("Bind","[Bind]") //9XR-Pro -#define TR_MODULE_RANGE TR("Rang", "[Range]") //9XR-Pro -#define TR_RESET_BTN TR("[Reset]", "[Reset Trim]") -#define TR_SET "[Set]" -#define TR_TRAINER "----DSC Buchse PPM In/Out------" //DSC Buchse Trainer Buchse -#define TR_ANTENNAPROBLEM CENTER "TX-Antennenproblem!" -#define TR_MODELIDUSED TR("ID schon benutzt", "Modell-ID schon benutzt") -#define TR_MODULE INDENT "Modul-Typ" -#define TR_TELEMETRY_TYPE TR("Typ", "Telemetrytyp") -#define TR_TELEMETRY_SENSORS "----Sensoren----" -#define TR_VALUE "Wert" -#define TR_TOPLCDTIMER "Top LCD Timer" -#define TR_UNIT "Einheit" -#define TR_TELEMETRY_NEWSENSOR INDENT "Sensor hinzufügen ..." -#define TR_CHANNELRANGE TR(INDENT "Kanäle", INDENT "Ausgangs Kanäle") //wg 9XR-Pro -#define TR_LOWALARM INDENT "Vor-Alarm bei" -#define TR_CRITICALALARM INDENT "Kritisch-Alarm" -#define TR_ENABLE_POPUP "Freigabe Popup-Fenster" -#define TR_DISABLE_POPUP "Sperren Popup-Fenster" -#define TR_POPUP "Popup" -#define TR_MIN "Min" -#define TR_MAX "Max" -#define TR_CURVE_PRESET "Gerade 0 11 22 33 45" -#define TR_PRESET "Preset" -#define TR_MIRROR "Spiegeln" -#define TR_CLEAR "Löschen" -#define TR_RESET "Servowerte rücksetzen" -#define TR_RESET_SUBMENU TR("Reset Werte ==>", "Reset=>Timer Flug Telem") -#define TR_COUNT "Punkte" -#define TR_PT "Pt" -#define TR_PTS "Pts" -#define TR_SMOOTH "Runden" -#define TR_COPY_STICKS_TO_OFS "Kopie Stick to Servo-Mitte" -#define TR_COPY_TRIMS_TO_OFS "Kopie Trimm to Servo-Mitte" // "Trim to Subtrim" -#define TR_INCDEC "Inc/Decrement" -#define TR_GLOBALVAR "Global Var" -#define TR_MIXSOURCE "Mixer Quelle" -#define TR_CONSTANT "Konstant" -#define TR_PERSISTENT_MAH TR(INDENT "Spr. mAh", INDENT "Speichern mAh") //9XR-Pro -#define TR_PREFLIGHT TR("---Vorflug-Checkliste--", "----Vorflug-Checkliste----") -#define TR_CHECKLIST TR(INDENT "Checkliste", INDENT "Checkliste anzeigen") //9XR-Pro -#define TR_FAS_OFFSET TR(INDENT "FAS-Ofs", INDENT "FAS-Offset") -#define TR_UART3MODE "Serieller Port" -#define TR_SCRIPT "Lua-Script" -#define TR_INPUTS "Inputs" -#define TR_OUTPUTS "Outputs" -#define TR_EEBACKUP "\002[ENTER Long] Backup EEPROM->SD-Karte" -#define TR_FACTORYRESET "\004[MENU Long] ALLES komplett löschen" -#define TR_CONFIRMRESET "ALLE Modelle + Einst. löschen?" -#define TR_TO_MANY_LUA_SCRIPTS "Zu viele Lua-Scripte!!" - -#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 "Mavlink Setup" - #define TR_MAVLINK_BAUD_LABEL "Baudrate" - #define TR_MAVLINK_INFOS "INFOS" - #define TR_MAVLINK_MODE "MODE" - #define TR_MAVLINK_CUR_MODE "Current Mode" - #define TR_MAVLINK_ARMED "Armed" - #define TR_MAVLINK_BAT_MENU_TITLE "BAT RSSI" - #define TR_MAVLINK_BATTERY_LABEL "Flugakku-Status" - #define TR_MAVLINK_RC_RSSI_LABEL "RC RSSI" - #define TR_MAVLINK_PC_RSSI_LABEL "PC RSSI" - #define TR_MAVLINK_NAV_MENU_TITLE "NAV" - #define TR_MAVLINK_COURSE "Course" - #define TR_MAVLINK_HEADING "Heading" - #define TR_MAVLINK_BEARING "Bearing" - #define TR_MAVLINK_ALTITUDE "Altitude" - #define TR_MAVLINK_GPS "GPS" - #define TR_MAVLINK_NO_FIX "NO Fix" - #define TR_MAVLINK_SAT "SAT" - #define TR_MAVLINK_HDOP "HDOP" - #define TR_MAVLINK_LAT "LAT" - #define TR_MAVLINK_LON "LON" -#endif - -// Taranis Info Zeile Anzeigen -#define TR_PHASES_HEADERS { " Name ", " Schalter ", " Trim Seite ", " Trim Höhe ", " Trim Gas ", " Trim Quer ", " Fade In ", " Fade Out " } -#define TR_LIMITS_HEADERS { " Name ", " Mitte ", " Min ", " Max ", " Richtung ", " Kurve ", " PPM-Mitte ", " Mitte-Mode " } -#define TR_CSW_HEADERS { " Funktion ", " Var1 ", " Var2 ", " Var2 ", " UND-Schalter ", " Dauer ", " Verzögerung " } - -//Taranis About screen -#define TR_ABOUTUS "Über OpenTx" - -#define TR_ABOUT_OPENTX_1 "OpenTX ist Open Source," -#define TR_ABOUT_OPENTX_2 "nicht kommerziell, ohne" -#define TR_ABOUT_OPENTX_3 "Funktionsgarantie, frei" -#define TR_ABOUT_OPENTX_4 "verfügbar. Unterstützung" -#define TR_ABOUT_OPENTX_5 "durch Spenden willkommen" - -#define TR_ABOUT_BERTRAND_1 "Bertrand Songis" -#define TR_ABOUT_BERTRAND_2 "OpenTX Hauptauthor" -#define TR_ABOUT_BERTRAND_3 "Companion9x-Mitentwickler" - -#define TR_ABOUT_MIKE_1 "Mike Blandford" -#define TR_ABOUT_MIKE_2 "Code- und Treiber-Guru" -#define TR_ABOUT_MIKE_3 "Wohl einer der Besten." -#define TR_ABOUT_MIKE_4 "Sehr inspirierend." - -#define TR_ABOUT_ROMOLO_1 "Romolo Manfredini" -#define TR_ABOUT_ROMOLO_2 "Companion9x-Hauptentwickler" -#define TR_ABOUT_ROMOLO_3 "" - -#define TR_ABOUT_ANDRE_1 "Andre Bernet" -#define TR_ABOUT_ANDRE_2 "Funktionalität und Tests," -#define TR_ABOUT_ANDRE_3 "Debugging, Dokumentation" - -#define TR_ABOUT_ROB_1 "Rob Thomson" -#define TR_ABOUT_ROB_2 "Openrcforums Webmaster" - -#define TR_ABOUT_KJELL_1 "Kjell Kernen" -#define TR_ABOUT_KJELL_2 "www.open-tx.org Hauptautor" -#define TR_ABOUT_KJELL_3 "Author von OpenTX Recorder" -#define TR_ABOUT_KJELL_4 "Companion contributor" - -#define TR_ABOUT_MARTIN_1 "Martin Hotar" -#define TR_ABOUT_MARTIN_2 "Grafikdesigner" - -#if defined(PCBTARANIS) - #define TR_ABOUT_HARDWARE_1 "Firma FrSky " - #define TR_ABOUT_HARDWARE_2 "Hardware-Design/-Produktion" - #define TR_ABOUT_HARDWARE_3 "Firmware-Vertrieb" -#else - #define TR_ABOUT_HARDWARE_1 "Brent Nelson" - #define TR_ABOUT_HARDWARE_2 "Sky9x Design/Produktion" - #define TR_ABOUT_HARDWARE_3 "" -#endif - -#define TR_ABOUT_PARENTS_1 "Vorgänger-Projekte" -#define TR_ABOUT_PARENTS_2 "Ersky9x (Mike Blandford)" -#define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" -#define TR_ABOUT_PARENTS_4 "TH9X (Thomas Husterer)" - -#define TR_CHR_SHORT 's' // Taste short -#define TR_CHR_LONG 'l' // Taste long -#define TR_CHR_TOGGLE 't' // Taste als togglefunktion = Ein Aus Ein -#define TR_CHR_HOUR 'h' // Stunden -#define TR_CHR_INPUT 'I' // Values between A-I will work - -#define TR_BEEP_VOLUME "Beep-Lautst." -#define TR_WAV_VOLUME "Wave-Lautst." -#define TR_VARIO_VOLUME "Vario-Lautst." -#define TR_BG_VOLUME "Hintergr-Lautst." - -#define TR_TOP_BAR "----Infozeile----" -#define TR_ALTITUDE INDENT "Höhenanzeige" -#define TR_SCALE "Skalierer" -#define TR_VIEW_CHANNELS "Zeige Kanäle" -#define TR_VIEW_NOTES "Zeige Notizen" -#define TR_MODEL_SELECT "Model Select" -#define TR_MODS_FORBIDDEN "Veränderungen verboten!" -#define TR_UNLOCKED "Entsperrt" -#define TR_ID "ID" -#define TR_PRECISION "Prezision" -#define TR_RATIO "Umrechnung" //Faktor, Mulitplikator, Teiler 0,1 bis 10,0 -#define TR_FORMULA "Formel" -#define TR_CELLINDEX "Zellenindex" -#define TR_LOGS "Log Daten" -#define TR_OPTIONS "Optionen" - -#define TR_ALTSENSOR "Höhen Sensor" -#define TR_CELLSENSOR "Zellen Sensor" -#define TR_GPSSENSOR "GPS Sensor" -#define TR_CURRENTSENSOR "Sensor" -#define TR_AUTOOFFSET "Auto Offset" -#define TR_ONLYPOSITIVE "Nur Positiv" -#define TR_FILTER "Filter aktiv" -#define TR_TELEMETRYFULL "Telemetriezeilen voll!" -#define TR_INVERTED_SERIAL INDENT "Invert." -#define TR_IGNORE_INSTANCE TR(INDENT "Keine ID", INDENT "Keine Multisen-ID") //unklar -#define TR_DISCOVER_SENSORS INDENT "Start Sensorsuche" -#define TR_STOP_DISCOVER_SENSORS INDENT "Stop Sensorsuche" -#define TR_DELETE_ALL_SENSORS INDENT "Lösche alle Sensoren" -#define TR_CONFIRMDELETE "Wirklich alle löschen?" -#define TR_SELECT_WIDGET "Select widget" -#define TR_REMOVE_WIDGET "Remove widget" -#define TR_WIDGET_SETTINGS "Widget settings" -#define TR_REMOVE_SCREEN "Remove screen" -// ----------------------------- Symbole für Auswahlliste---------- -#define TR_MENU_INPUTS "\314Inputs" -#define TR_MENU_LUA "\322Lua Scripte" -#define TR_MENU_STICKS "\307Knüppel" -#define TR_MENU_POTS "\310Potis" -#define TR_MENU_MAX "\315MAX" -#define TR_MENU_HELI "\316Heli-TS CYC1-3" -#define TR_MENU_TRIMS "\313Trimmung" -#define TR_MENU_SWITCHES "\312Schalter" -#define TR_MENU_LOGICAL_SWITCHES "\312Log. Schalter" -#define TR_MENU_TRAINER "\317Trainer" -#define TR_MENU_CHANNELS "\320Kanäle" -#define TR_MENU_GVARS "\311Glob. Vars" -#define TR_MENU_TELEMETRY "\321Telemetrie" -#define TR_MENU_OTHER " Weitere" -#define TR_MENU_INVERT "Invertieren" -// ---------------------------------------------------------------- -#define ZSTR_RSSI "RSSI" -#define ZSTR_SWR "SWR" -#define ZSTR_A1 "A1" -#define ZSTR_A2 "A2" -#define ZSTR_A3 "A3" -#define ZSTR_A4 "A4" -#define ZSTR_BATT "RxBt" -#define ZSTR_ALT "Alt" -#define ZSTR_TEMP1 "Tmp1" -#define ZSTR_TEMP2 "Tmp2" -#define ZSTR_RPM "RPM" -#define ZSTR_FUEL "Fuel" -#define ZSTR_VSPD "VSpd" -#define ZSTR_ACCX "AccX" -#define ZSTR_ACCY "AccY" -#define ZSTR_ACCZ "AccZ" -#define ZSTR_CURR "Curr" -#define ZSTR_VFAS "VFAS" -#define ZSTR_ASPD "ASpd" -#define ZSTR_GSPD "GSpd" -#define ZSTR_HDG "Hdg" -#define ZSTR_CELLS "Cels" -#define ZSTR_GPSALT "GAlt" -#define ZSTR_GPSDATETIME "Date" -#define ZSTR_GPS "GPS" -#define ZSTR_BATT1_VOLTAGE "RB1V" -#define ZSTR_BATT2_VOLTAGE "RB2V" -#define ZSTR_BATT1_CURRENT "RB1A" -#define ZSTR_BATT2_CURRENT "RB2A" -#define ZSTR_BATT1_CONSUMPTION "RB1C" -#define ZSTR_BATT2_CONSUMPTION "RB2C" -#define ZSTR_RB_STATE "RBS" -#define ZSTR_CHANS_STATE "RBCS" +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +// DE translations author: who? + +/* + * !!!!! DO NOT EDIT de.h - EDIT de.h.txt INSTEAD !!!!!!! + * + * In order to make translations easier de.h.txt is parsed and national + * characters are replaced by bitmap codes. The result is de.h. + * + * See translate.py in the util folder for the list of character codes + * + * !!!!! DO NOT EDIT de.h - EDIT de.h.txt INSTEAD !!!!!!! + */ + +/* + * Formatting octal codes available in TR_ strings: + * \037\x -sets LCD x-coord (x value in octal) + * \036 -newline + * \035 -horizontal tab (ARM only) + * \001 to \034 -extended spacing (value * FW/2) + * \0 -ends current string + */ + + +// NON ZERO TERMINATED STRINGS +#define LEN_OFFON "\003" +#define TR_OFFON "AUS""EIN" + +#define LEN_MMMINV "\003" +#define TR_MMMINV "---""INV" + +#define LEN_NCHANNELS "\004" +#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH" + +#define LEN_VBEEPMODE "\005" +#define TR_VBEEPMODE "Stumm""Alarm""NoKey""Alle\0" + +#define LEN_VBEEPLEN "\005" +#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0" + +#define LEN_VRENAVIG "\003" +#define TR_VRENAVIG "AUSDGaDGb" + +#define LEN_VBLMODE "\005" +#define TR_VBLMODE "AUS\0 ""Taste""Stks\0""Beide""EIN\0 " // Anpassung + +#define LEN_TRNMODE "\003" +#define TR_TRNMODE "AUS"" +="" :=" + +#define LEN_TRNCHN "\003" +#define TR_TRNCHN "CH1CH2CH3CH4" + +#define LEN_UART3MODES "\015" +#define TR_UART3MODES "AUS\0 ""S-Port Mirror""Telemetrie\0 ""SBUS Schüler\0""Debug\0" + +#define LEN_SWTYPES "\006" +#define TR_SWTYPES "Kein\0 ""Taster""2POS\0 ""3POS\0" + +#define LEN_POTTYPES "\017" +#define TR_POTTYPES "Kein\0 ""Poti mit Raste ""Stufen-Schalter""Poti ohne Raste\0" + +#define LEN_SLIDERTYPES "\006" +#define TR_SLIDERTYPES "Keine\0""Slider" + +#define LEN_DATETIME "\005" +#define TR_DATETIME "DATE:""ZEIT:" + +#define LEN_VLCD "\006" +#define TR_VLCD "NormalOptrex" + +#define LEN_VPERSISTENT "\014" +#define TR_VPERSISTENT "AUS\0 ""Flugzeit\0 ""Manuell Ruck" + +#define LEN_COUNTRYCODES TR("\002", "\007") +#define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") + +#define LEN_TARANIS_PROTOCOLS "\004" +#define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF" + +#if defined(MODULE_D16_EU_ONLY_SUPPORT) + #define LEN_XJT_PROTOCOLS "\007" + #define TR_XJT_PROTOCOLS "AUS\0 ""D16-EU\0""D8\0 ""LR12-EU" +#else + #define LEN_XJT_PROTOCOLS "\004" + #define TR_XJT_PROTOCOLS "AUS\0""X16\0""D8\0 ""LR12" +#endif + +#define LEN_DSM_PROTOCOLS "\004" +#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal + +#define LEN_VTRIMINC TR("\007", "\014") // ursprüglich "\006", "\013" +#define TR_VTRIMINC TR("Expo ""ExFein ""Fein ""Mittel ""Grob ", "Exponentiell""Extrafein ""Fein ""Mittel ""Grob ") + +#define LEN_VDISPLAYTRIMS "\006" +#define TR_VDISPLAYTRIMS "Nein\0 ""Kurz\0 ""Ja\0" //Trimmwerte Keine, kurze Anzeigen, Ja + +#define LEN_VBEEPCOUNTDOWN "\006" +#define TR_VBEEPCOUNTDOWN "Kein\0 Pieps\0StimmeHaptik" + +#define LEN_VVARIOCENTER "\006" +#define TR_VVARIOCENTER "Ton\0 ""Ruhe " + +#define LEN_CURVE_TYPES "\010" +#define TR_CURVE_TYPES " Nur Y "" X und Y" //"Standard""Custom\0" + +#define LEN_RETA123 "\001" + +#if defined(PCBHORUS) + #define TR_RETA123 "SHGQ12345LR" +#elif defined(PCBFLAMENCO) + #define TR_RETA123 "SHGQ123LR" +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_RETA123 "SHGQ1234LRLR" +#elif defined(PCBTARANIS) || defined(REVX) + #define TR_RETA123 "SHGQ123LR" +#elif defined(PCBSKY9X) + #define TR_RETA123 "SHGQ123a" +#elif defined(CPUM2560) + #define TR_RETA123 "SHGQ123ab" +#else + #define TR_RETA123 "SHGQ123" +#endif + +#define LEN_VPROTOS "\006" + +#if defined(PXX) + #define TR_PXX "PXX\0 " +#elif defined(DSM2) || defined(IRPROTOS) + #define TR_PXX "[PXX]\0" +#else + #define TR_PXX +#endif + +#if defined(DSM2) + #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " +#elif defined(IRPROTOS) + #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" +#else + #define TR_DSM2 +#endif + +#if defined(IRPROTOS) + #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" +#else + #define TR_IRPROTOS +#endif + +#if defined(CPUARM) + #define TR_XPPM +#else + #define TR_XPPM "PPM16\0""PPMsim" +#endif + +#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS + +#define LEN_POSNEG "\003" +#define TR_POSNEG "POS""NEG" + +#if defined(PCBSKY9X) && defined(REVX) + #define LEN_VOUTPUT_TYPE "\011" + #define TR_VOUTPUT_TYPE "OpenDrain""PushPull\0" +#endif + +#define LEN_VCURVEFUNC "\003" +#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" + +#define LEN_VMLTPX "\010" +#define TR_VMLTPX "Addiere ""Multipl.""Ersetze " + +#define LEN_VMLTPX2 "\002" +#define TR_VMLTPX2 "+=""*="":=" + +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "AUS""EIN""Sei""Höh""Gas""Que" //Mixer Trim Werte + +#if LCD_W >= 212 + #define TR_CSWTIMER "Takt\0" // TIM = Takt = Taktgenerator + #define TR_CSWSTICKY "SRFF\0" // Sticky = RS-Flip-Flop + #define TR_CSWRANGE "Range" // Range = Bereichsabfrage von bis + #define TR_CSWSTAY "Puls\0" // Edge = einstellbarer Impuls +#else + #define TR_CSWTIMER "Takt\0" // TIM = Takt = Taktgenerator + #define TR_CSWSTICKY "SRFF\0" // Sticky = RS-Flip-Flop + #if defined(CPUARM) + #define TR_CSWRANGE "Rnge\0" // Range= Bereichsabfrage von bis + #define TR_CSWSTAY "Puls\0" // Edge = einstellbarer Impuls + #else + #define TR_CSWRANGE + #define TR_CSWSTAY + #endif +#endif + +#if defined(CPUARM) +#define TR_CSWEQUAL "a=x\0 " +#else +#define TR_CSWEQUAL +#endif + +#define LEN_VCSWFUNC "\005" +#if defined(CPUARM) +#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a= 212 + #define TR_SF_SAFETY "Override\0 " //"Override\0 " +#elif defined(OVERRIDE_CHANNEL_FUNCTION) + #define TR_SF_SAFETY "Overr.\0 " //"Overr.\0 " +#else + #define TR_SF_SAFETY "---\0 " +#endif + +#if defined(PCBTARANIS) + #define TR_SF_SCREENSHOT "Screenshot" +#else + #define TR_SF_SCREENSHOT +#endif + +#define TR_SF_RESERVE "[Reserve]\0" + +#if defined(CPUARM) + #define TR_VFSWFUNC TR_SF_SAFETY "Lehrer \0 ""Inst. Trim""Rücksetz.\0""Setze \0 " TR_ADJUST_GVAR "Lautstr.\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "LCD Licht\0" TR_SF_SCREENSHOT TR_SF_TEST +#elif defined(PCBGRUVIN9X) + #define TR_VFSWFUNC TR_SF_SAFETY "Lehrer \0 ""Inst. Trim""Rücksetz.\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "LCD Licht\0" TR_SF_TEST +#else + #define TR_VFSWFUNC TR_SF_SAFETY "Lehrer \0 ""Inst. Trim""Rücksetz.\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC "LCD Licht\0" TR_SF_TEST +#endif + +#define LEN_VFSWRESET TR("\004", "\011") + +#if defined(FRSKY) + #define TR_FSW_RESET_TELEM TR("Telm", "Telemetrie") +#else + #define TR_FSW_RESET_TELEM +#endif + +#if ROTARY_ENCODERS == 2 + #define TR_FSW_RESET_ROTENC TR("DGa\0""DGb\0", "DrehGb A\0""DrehGb B\0") +#elif ROTARY_ENCODERS == 1 + #define TR_FSW_RESET_ROTENC TR("D.G.", "DrehGb\0 ") +#else + #define TR_FSW_RESET_ROTENC +#endif + +#if LCD_W >= 212 + #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " +#elif defined(CPUARM) + #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" +#else + #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2" +#endif + +#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "All\0" TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, TR_FSW_RESET_TIMERS "All\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC) + +#define LEN_FUNCSOUNDS TR("\004", "\006") +#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Wrn1""Wrn2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Piep1\0""Piep2\0""Piep3\0""Warn1 ""Warn2 ""Cheep ""Ratata""Tick ""Siren ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") + +#define LEN_VTELEMCHNS TR("\004", "\005") + +#if defined(CPUARM) + #define TR_TELEM_RESERVE TR("[--]", "[---]") + #define TR_TELEM_TIME TR("Zeit", "Zeit\0") + #define TR_SWR TR("SWR\0", "SWR\0 ") + #define TR_RX_BATT TR("[NA]", "[NA]\0") + #define TR_A3_A4 TR("A3\0 ""A4\0 ", "A3\0 ""A4\0 ") + #define TR_A3_A4_MIN TR("A3-\0""A4-\0", "A3-\0 ""A4-\0 ") +#else + #define TR_TELEM_RESERVE + #define TR_TELEM_TIME + #define TR_SWR + #define TR_RX_BATT + #define TR_A3_A4 + #define TR_A3_A4_MIN +#endif + +#define TR_ASPD_MAX TR("ASp+", "ASpd+") + +#if LCD_W >= 212 + #define TR_TELEM_RSSI_RX "RSSI\0" +#else + #define TR_TELEM_RSSI_RX TR("Rx\0 ", "Rx\0 ") +#endif + +#if defined(CPUARM) + #define TR_TELEM_TIMERS TR("Tmr1""Tmr2""Tmr3", "Tmr1\0""Tmr2\0""Tmr3\0") +#else + #define TR_TELEM_TIMERS TR("Tmr1""Tmr2", "Tmr1\0""Tmr2\0") +#endif + +#if LCD_W >= 212 + #define TR_VTELEMCHNS "---\0 ""Akku\0" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Cells""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\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-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Zeit\0" +#else + #define TR_VTELEMCHNS "---\0""Akku" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\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""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Zeit" +#endif + +#define LENGTH_UNIT_IMP "ft\0" +#define SPEED_UNIT_IMP "mph" +#define LENGTH_UNIT_METR "m\0 " +#define SPEED_UNIT_METR "kmh" + +#if defined(CPUARM) + #define LEN_VUNITSSYSTEM TR("\006", "\012") + #define TR_VUNITSSYSTEM TR("Metrik""Imper.", "Metrisch\0 ""Imperial\0 ") + #define LEN_VTELEMUNIT "\003" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" +#else + #if defined(IMPERIAL_UNITS) + #define LENGTH_UNIT LENGTH_UNIT_IMP + #define SPEED_UNIT SPEED_UNIT_IMP + #else + #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 " +#endif + +#define STR_V (STR_VTELEMUNIT+1) +#define STR_A (STR_VTELEMUNIT+4) + +#define LEN_VALARM "\003" +#define TR_VALARM "---""Glb""Org""Rot" + +#define LEN_VALARMFN "\001" +#define TR_VALARMFN "<>" + +#define LEN_VTELPROTO "\007" +#define TR_VTELPROTO "Kein\0 ""Hub\0 ""WSHHigh" + +#if defined(CPUARM) + #define LEN_AMPSRC TR("\003", "\005") + #define TR_AMPSRC TR("---""A1\0""A2\0""A3\0""A4\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells") + #define LEN_VOLTSRC TR("\003", "\005") + #define TR_VOLTSRC TR("A1\0""A2\0""A3\0""A4\0""FAS""Cel", "A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells") +#else + #define LEN_AMPSRC TR("\003", "\005") + #define TR_AMPSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Cells") +#endif + +#define LEN_VARIOSRC "\004" +#if defined(FRSKY_SPORT) + #define TR_VARIOSRC "Vspd""A1\0 ""A2\0 ""dTE\0" +#else + #define TR_VARIOSRC "Alt\0""Alt+""Vspd""A1\0 ""A2\0 " +#endif + +#if defined(CPUARM) + #define LEN_VTELEMSCREENTYPE "\007" + #define TR_VTELEMSCREENTYPE " None "" Werte "" Balken"" Script" +#else + #define LEN_VTELEMSCREENTYPE "\007" + #define TR_VTELEMSCREENTYPE " Werte "" Balken" +#endif + +#define LEN_GPSFORMAT "\004" +#define TR_GPSFORMAT "GMS\0""NMEA" //Koordinatenanzeige + +#define LEN2_VTEMPLATES 15 // max String Länge für Menü (original=13) +#define LEN_VTEMPLATES "\017" // max String Länge 15+cr+lf +#define TR_VTEMPLATES "Misch. Lösch.\0 ""Einfach. 4-CH\0 ""Fixe Gassperre\0""V-Leitwerk\0 ""Delta Mischer\0 ""eCCPM\0 ""Hubschrauber\0 ""Servo Tester\0 " + +#define LEN_VSWASHTYPE "\004" +#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" + +#define LEN_VKEYS "\005" +#define TR_VKEYS TR("Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus") + +#define LEN_VRENCODERS "\003" +#define TR_VRENCODERS "DGa""DGb" //Digitalgeber a und b = Drehgeber + +#define LEN_VSWITCHES "\003" +#define LEN_VSRCRAW "\004" + +#define TR_STICKS_VSRCRAW TR("Sei\0""Höh\0""Gas\0""Qur\0", "\307Sei""\307Höh""\307Gas""\307Qur") +#define TR_TRIMS_VSRCRAW TR("TrmS""TrmH""TrmG""TrmQ", "\313Sei""\313Höh""\313Gas""\313Qur") + +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" +#elif defined(PCBTARANIS) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#else + #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " + #define TR_SW_VSRCRAW "3POS" + #define TR_9X_3POS_SWITCHES "ID0""ID1""ID2" +#endif + +#if defined(CPUARM) + #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12""L13""L14""L15""L16""L17""L18""L19""L20""L21""L22""L23""L24""L25""L26""L27""L28""L29""L30""L31""L32" +#else + #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12" +#endif + +#define TR_TRIMS_SWITCHES TR("tSl""tSr""tHd""tHu""tGd""tGu""tQl""tQr", "\313Sl""\313Sr""\313Hd""\313Hu""\313Gd""\313Gu""\313Ql""\313Qr") + +#if defined(PCBSKY9X) + #define TR_ROTARY_ENCODERS "DGa\0" + #define TR_ROTENC_SWITCHES "DGa" +#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560) + #define TR_ROTARY_ENCODERS "DGa\0""DGb\0" + #define TR_ROTENC_SWITCHES "DGa""DGb" +#else + #define TR_ROTARY_ENCODERS + #define TR_ROTENC_SWITCHES +#endif + +#if !defined(PCBTARANIS) + #define TR_PHYS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" +#endif + +#define TR_ON_ONE_SWITCHES "ON\0""One" + +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) + // only special switches here + #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES +#else + #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES +#endif + +#if defined(HELI) +#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3" +#else +#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" +#endif + +#if defined(CPUARM) + #define TR_RESERVE_VSRCRAW "[--]" + #define TR_EXTRA_VSRCRAW "Batt""Time" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3" +#else + #define TR_EXTRA_VSRCRAW +#endif + +#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW + +#define LEN_VTMRMODES "\003" +#define TR_VTMRMODES "AUS""EIN""GSs""GS%""GSt" + +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Lehrer/Buchse\0 ""Schüler/Buchse\0 ""Lehrer/SBUS Modul\0""Lehrer/CPPM Modul\0""Lehrer/Batterie\0" + +#define LEN_VFAILSAFE "\015" // "\013" original +#define TR_VFAILSAFE "Kein Failsafe""Halte Pos.\0 ""Kanäle\0 ""Kein Signal\0 ""Empfänger\0 " + +#if defined(MAVLINK) + #define LEN_MAVLINK_BAUDS "\006" + #define TR_MAVLINK_BAUDS "4800 ""9600 ""14400 ""19200 ""38400 ""57600 ""76800 ""115200" + #define LEN_MAVLINK_AC_MODES "\011" + #define TR_MAVLINK_AC_MODES "Stabilize""Acro ""Alt Hold ""Auto ""Guided ""Loiter ""RTL ""Circle ""Pos Hold ""Land ""OF Loiter""Toy A ""Toy M ""INVALID " + #define LEN_MAVLINK_AP_MODES "\015" + #define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID " +#endif + +#define LEN_VSENSORTYPES "\012" +#define TR_VSENSORTYPES "Sensor\0 ""Berechnung" + +#define LEN_VFORMULAS "\014" // "\10" ursprünglich +#define TR_VFORMULAS "Addieren\0 ""Mittelwert\0 ""Min\0 ""Max\0 ""Multiplizier""Gesamt\0 ""Zelle\0 ""Verbrauch\0 ""Distanz\0 " + +#define LEN_VPREC "\004" // "\005" Prec0 Prec1 Prec2 ursprünglich +#define TR_VPREC "0.--""0.0 ""0.00" + +#define LEN_VCELLINDEX "\012" // "\007" ursprünglich +#define TR_VCELLINDEX "Niedrigst\0""1. Zelle\0 ""2. Zelle\0 ""3. Zelle\0 ""4. Zelle\0 ""5. Zelle\0 ""6. Zelle\0 ""Höchster\0 ""Differenz\0" + +// ZERO TERMINATED STRINGS +#if defined(COLORLCD) + #define INDENT "\007" + #define LEN_INDENT 1 + #define INDENT_WIDTH 12 + #define BREAKSPACE "\036" +#else + #define INDENT "\001" + #define LEN_INDENT 1 + #define INDENT_WIDTH (FW/2) + #define BREAKSPACE " " +#endif + +#if defined(PCBTARANIS) + #define TR_ENTER "[ENTER]" +#else + #define TR_ENTER "[MENU]" +#endif + +#define TR_EXIT "[EXIT]" + +#if defined(PCBTARANIS) + #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +#else + #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define OFS_EXIT sizeof(TR_ENTER) +#endif + +#define TR_MENUWHENDONE CENTER"\010"TR_ENTER" > Weiter" +#define TR_FREE "frei" +#define TR_DELETEMODEL "Modell löschen?" +#define TR_COPYINGMODEL "Kopiere Modell" +#define TR_MOVINGMODEL "Schiebe Modell" +#define TR_LOADINGMODEL "Lade Modell..." +#define TR_NAME "Name" +#define TR_MODELNAME "Modellname" +#define TR_PHASENAME "Phase-Name" +#define TR_MIXNAME "Mix-Name" +#define TR_INPUTNAME "Input-Name" +#if defined(VIRTUALINPUTS) + #define TR_EXPONAME "Info-Name" +#else + #define TR_EXPONAME "Info-Name" // Expo Name +#endif +#define TR_BITMAP "Modellfoto" +#define TR_TIMER TR("Timer", "Timer ") // für Timer1 Timer2 Timer3 +#define TR_ELIMITS TR("Erw. Limit", "Erw. Wege auf 150%") +#define TR_ETRIMS TR("Erw. Trims", "Erw. Trim auf 100%") +#define TR_TRIMINC TR("Trim Schr.", "Trimmschritte") +#define TR_DISPLAY_TRIMS TR("Trim anzeig", "Trimwerte anzeigen") +#define TR_TTRACE TR("Gasquelle", INDENT "Gas-Timerquelle") +#define TR_TTRIM TR("Gastrim", INDENT "Gas-Leerlauftrim") +#define TR_BEEPCTR TR("Mitt.Piep", "Mittelstell. -Pieps") +#define TR_USE_GLOBAL_FUNCS TR("Glob. Funkt.", "Globale Funkt verw.") +#if defined(PCBSKY9X) && defined(REVX) + #define TR_OUTPUT_TYPE INDENT "Output" +#endif +#define TR_PROTO TR(INDENT "Protok.", INDENT "Protokoll") +#if defined(CPUARM) + #define TR_PPMFRAME INDENT "PPM frame" +#else + #define TR_PPMFRAME "PPM frame" +#endif +#define TR_MS "ms" +#define TR_SWITCH TR("Schalt.", "Schalter") +#define TR_TRIMS "Trims" +#define TR_FADEIN "Langs. Ein" +#define TR_FADEOUT "Langs. Aus" +#define TR_DEFAULT "(Normal)" +#define TR_CHECKTRIMS CENTER"\006Check\012Trims" +#define OFS_CHECKTRIMS CENTER_OFS+(9*FW) +#define TR_SWASHTYPE TR("Typ Taumelsch", "Typ Taumelscheibe") +#define TR_COLLECTIVE TR("Kollekt. Pitch", "Kollekt. Pitch Quelle") +#define TR_AILERON "Roll Quelle" +#define TR_ELEVATOR "Nick Quelle" +#define TR_SWASHRING TR("Ring Begrenz", "Ring Begrenzung") +#define TR_ELEDIRECTION TR("Nick Richtung", "Nick Servo Richtung") +#define TR_AILDIRECTION TR("Roll Richtung", "Roll Servo Richtung") +#define TR_COLDIRECTION TR("Pitch Richtung", "Pitch Servo Richtung") +#define TR_MODE INDENT "Modus" +#define TR_NOFREEEXPO "Expos voll!" +#define TR_NOFREEMIXER "Mischer voll!" +#define TR_SOURCE INDENT "Quelle" +#define TR_WEIGHT "Gewicht" +#define TR_EXPO TR("Expo", "Exponential") +#define TR_SIDE "Seite" +#define TR_DIFFERENTIAL "Diff" +#define TR_OFFSET INDENT "Offset" +#define TR_TRIM "Trim" +#define TR_DREX "DRex" +#define DREX_CHBOX_OFFSET 30 +#define TR_CURVE "Kurve" +#define TR_FLMODE TR("Phase", "Phasen") +#define TR_MIXWARNING "Warnung" +#define TR_OFF "AUS" +#define TR_MULTPX "Wirkung" +#define TR_DELAYDOWN "Verz. Dn" +#define TR_DELAYUP "Verz. Up" +#define TR_SLOWDOWN "Langs.Dn" +#define TR_SLOWUP "Langs.Up" +#define TR_MIXER "MISCHER" +#define TR_CV "KV" +#define TR_GV "GV" +#define TR_ACHANNEL TR("A\004gemessen", "A\004Kanal gemessen =>") //9XR-Pro +#define TR_RANGE TR(INDENT "Bereich", INDENT "Variobereich m/s") // 9XR-Pro +#define TR_CENTER TR(INDENT "Mitte m/s", INDENT "Variomitte m/s") +#define TR_BAR "Streifen" +#define TR_ALARM TR(INDENT "Alarme ", INDENT "Ein bei Alarm") //9XR-Pro +#define TR_USRDATA "Daten berechnen aus" +#define TR_BLADES TR(INDENT "Prop", INDENT "Prop-Blätter") //9XR-Pro +#define TR_SCREEN "Telm-Bild " +#define TR_SOUND_LABEL "----Töne---------" +#define TR_LENGTH INDENT "Dauer" +#define TR_BEEP_LENGTH INDENT "Beep-Länge" +#define TR_SPKRPITCH INDENT "Beep-Freq. +/-" +#define TR_HAPTIC_LABEL "----Haptik-------" //9XR-Pro +#define TR_HAPTICSTRENGTH INDENT "Stärke" +#define TR_CONTRAST "LCD-Kontrast" +#define TR_ALARMS_LABEL "----Alarm wenn---" +#define TR_BATTERY_RANGE TR("Akku Bereich", "Akku Spgs-Bereich") // Symbol Akku Ladezustand +#define TR_BATTERYWARNING INDENT "Akkuspg kleiner" +#define TR_INACTIVITYALARM TR(INDENT "Inaktivität", INDENT "Inaktivität nach") //9XR-Pro +#define TR_MEMORYWARNING INDENT "Speicher voll" +#define TR_ALARMWARNING TR(INDENT "Alle Töne aus?", INDENT "Alle Töne ganz aus?") +#define TR_RENAVIG "Drehgeb. Navig." +#define TR_THROTTLE_LABEL "----Gas-Kontrolle----" +#define TR_THROTTLEREVERSE TR("Gas invers", INDENT "Vollgas hinten?") //Änderung wg TH9x, Taranis +#define TR_TIMER_NAME INDENT "Name" +#define TR_MINUTEBEEP TR(INDENT "Min-Alarm", INDENT "Minuten-Alarm") +#define TR_BEEPCOUNTDOWN INDENT "Countdown" +#define TR_PERSISTENT TR(INDENT "Permanent", INDENT "Permanent") +#define TR_BACKLIGHT_LABEL "----LCD-Beleuchtg----" +#define TR_BLDELAY INDENT "Dauer" +#define TR_BLONBRIGHTNESS INDENT "An-Helligkeit" +#define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit" +#define TR_BLCOLOR INDENT "Farbe" +#define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Ein für") +#define TR_THROTTLEWARNING TR("Gasalarm", 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-Zeitzone +/-Std") +#define TR_ADJUST_RTC INDENT "Uhrzeit per GPS setzen" +#define TR_GPS "----GPS--------------" +#define TR_RXCHANNELORD TR("Kanalanordnung", "Kanalvoreinstellung") +#define TR_STICKS "Knüppel" +#define TR_POTS "Potis" +#define TR_SWITCHES "Schalter" +#define TR_SWITCHES_DELAY TR("Sw. Mitte Delay", "Schaltermitte Verz.") //Schalter Mitten verzögern Anpassung +#define TR_SLAVE TR("Schüler PPM1-16", "Schüler PPM1-16 als Ausgang") +#define TR_MODESRC " Modus\003% Quelle" +#define TR_MULTIPLIER "Multiplikator" +#define TR_CAL "Kal." +#define TR_VTRIM "Trim - +" +#define TR_BG "BG:" +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) + #define TR_MENUTOSTART CENTER"\007"TR_ENTER" zum Start" + #define TR_SETMIDPOINT CENTER"\002Knüppel+Potis auf Mitte" + #define TR_MOVESTICKSPOTS CENTER"\003Knüppel+Potis bewegen" +#else + #define TR_MENUTOSTART CENTER"\007"TR_ENTER" zum Start" + #define TR_SETMIDPOINT TR(CENTER "\002Knüppel+Potis auf Mitte", CENTER "\002Knüppel+Potis auf Mitte") + #define TR_MOVESTICKSPOTS CENTER"\003Knüppel+Potis bewegen" +#endif +#define TR_RXBATT "Rx Akku:" +#define TR_TXnRX "Tx:\0Rx:" +#define OFS_RX 4 +#define TR_ACCEL "Acc:" +#define TR_NODATA CENTER"Keine Daten" +#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036GAS\037\146GS%" +#define TR_TMR1LATMAXUS "Tmr1Lat max\037\124us" +#define STR_US (STR_TMR1LATMAXUS+13) +#define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" +#define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" + +#if defined(CPUARM) + #define TR_TMIXMAXMS "Tmix max" + #define TR_FREESTACKMINB "Free Stack" +#else + #define TR_TMIXMAXMS "Tmix max\037\124ms" + #define TR_FREESTACKMINB "Free Stack\037\124b" +#endif + +#define TR_MENUTORESET CENTER TR_ENTER" für Reset" +#define TR_PPM_TRAINER "TR" //old #define TR_PPM "PPM" +#define TR_CH "CH" +#define TR_MODEL "MODELL" +#define TR_FP "FP" +#define TR_MIX "MIX" +#define TR_EEPROMLOWMEM "EEPROM voll" +#define TR_ALERT "WARNUNG" +#define TR_PRESSANYKEYTOSKIP TR("Taste drücken",CENTER"Taste drücken") +#define TR_THROTTLENOTIDLE "Gas nicht Null!" +#define TR_ALARMSDISABLED "Alarme ausgeschaltet" +#define TR_PRESSANYKEY TR("Taste drücken",CENTER"Taste drücken") +#define TR_BADEEPROMDATA "EEPROM ungültig" +#define TR_BAD_RADIO_DATA "Bad Radio Data" +#define TR_EEPROMFORMATTING "EEPROM Initialisieren" +#define TR_STORAGE_FORMAT "Storage Preparation" +#define TR_EEPROMOVERFLOW "EEPROM Überlauf" +#define TR_MENURADIOSETUP TR("SENDER-EINSTELLEN", "SENDER-GRUNDEINSTELLUNGEN") +#define TR_MENUDATEANDTIME "DATUM UND ZEIT" +#define TR_MENUTRAINER TR("LEHRER/SCHÜLER", "LEHRER/SCHÜLER") +#define TR_MENUGLOBALFUNCS "GLOBALE FUNKTIONEN" +#define TR_MENUVERSION "VERSION" +#define TR_MENUDIAG TR("Schalt.", "Schalter-Test") +#define TR_MENUANA "Analog-Test" +#define TR_MENUCALIBRATION TR("KALIB. ANALOG", "KALIBRIERUNG Knüppel+Potis") +#if defined(COLORLCD) + #define TR_TRIMS2OFFSETS "Trims => Subtrims" +#else + #define TR_TRIMS2OFFSETS "\006Trims => Subtrims" +#endif +#define TR_MENUMODELSEL TR("MODELLE", "MODELL WÄHLEN") +#define TR_MENUSETUP TR("MODELL-EINSTELLUNG", "MODELL-EINSTELLUNGEN") +#define TR_MENUFLIGHTPHASE "FLUGPHASE" +#define TR_MENUFLIGHTPHASES "FLUGPHASEN" +#define TR_MENUHELISETUP TR("HELI TS-Mischer", "HELI TS-Mischer CYC1-3") + +#if defined(PCBTARANIS) + #define TR_MENUINPUTS "INPUTS" + #define TR_MENULIMITS "SERVOWEGE" +#else + #define TR_MENUINPUTS TR("DR/EXPO", "DUALRATE/EXPO") + #define TR_MENULIMITS TR("GRENZEN", "SERVOWEGE") +#endif + +#define TR_MENUCURVES "KURVEN" +#define TR_MENUCURVE "KURVE" +#define TR_MENULOGICALSWITCH "LOGIKSCHALTER" +#define TR_MENULOGICALSWITCHES "LOGIKSCHALTER" +#define TR_MENUCUSTOMFUNC TR("SPEZ.-FUNKTIONEN", "SPEZIAL-FUNKTIONEN") +#define TR_MENUCUSTOMSCRIPTS "LUA-SCRIPTE" +#define TR_MENUTELEMETRY "TELEMETRIE" +#define TR_MENUTEMPLATES "VORLAGEN" +#define TR_MENUSTAT "STAT" +#define TR_MENUDEBUG "DEBUG" +#if defined(CPUARM) + #define TR_RXNUM TR(INDENT "Empf Nr.", INDENT "Modell-Match-Nr.") +#else + #define TR_RXNUM "Empf Nr." +#endif +#define TR_SYNCMENU "Sync [MENU]" +#define TR_LIMIT INDENT "Grenzen" +#define TR_MINRSSI "Min. RSSI" +#define TR_LATITUDE "Breite:" +#define TR_LONGITUDE "Länge:" +#define TR_GPSCOORD TR("GPS-Koord.", "GPS-Koordinaten-Format") +#define TR_VARIO TR("----Vario--------", "----Variometer----") //9XR-Pro +#define TR_PITCH_AT_ZERO INDENT "Niedrigster Ton" +#define TR_PITCH_AT_MAX INDENT "Höchster Ton" +#define TR_REPEAT_AT_ZERO INDENT "Wiederholrate" +#define TR_POWEROFF "\027Power OFF..." +#define TR_SHUTDOWN "Herunterfahren" +#define TR_SAVEMODEL "Modelleinstellungen speichern" +#define TR_BATT_CALIB "Akku Spg messen" +#define TR_CURRENT_CALIB "Strom abgl." +#define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spannungsquelle") //9XR-Pro +#define TR_CURRENT TR(INDENT "Strom", INDENT "Stromquelle") +#define TR_SELECT_MODEL "Modell Wählen" +#define TR_CREATE_CATEGORY "Create Category" +#define TR_RENAME_CATEGORY "Rename Category" +#define TR_DELETE_CATEGORY "Delete Category" +#define TR_CREATE_MODEL "Neues Modell" +#define TR_DUPLICATE_MODEL "Duplicate Model" +#define TR_CHANGE_CATEGORY "Change category" +#define TR_COPY_MODEL "Kopiere Modell" +#define TR_MOVE_MODEL "Verschiebe Modell" +#define TR_BACKUP_MODEL "Modell auf SD-Karte" //9XR-Pro +#define TR_DELETE_MODEL "Modell Löschen" // TODO merged into DELETEMODEL? +#define TR_RESTORE_MODEL "Modell Restore" +#define TR_SDCARD_ERROR "SD-Kartenfehler" +#define TR_NO_SDCARD "Keine SD-Karte" +#define TR_SDCARD_FULL "SD-Karte voll" +#define TR_INCOMPATIBLE "Nicht kompatibel" +#define TR_WARNING "WARNUNG" +#define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" +#define TR_EEPROM_CONVERTING "EEPROM Converting" +#define TR_THROTTLEWARN "GAS" +#define TR_ALARMSWARN "ALARM" +#define TR_SWITCHWARN "SCHALTER" +#define TR_FAILSAFEWARN "FAILSAFE" +#define TR_NO_FAILSAFE TR("Failsafe not set", "Failsafe nicht programmiert") +#define TR_KEYSTUCK "Taste klemmt" //Key stuck=Taste klemmt +#define TR_INVERT_THR TR("Gas umkehren?", "Vollgas hinten?") // Th9x 9XR +#define TR_SPEAKER_VOLUME INDENT "Lautstärke" +#define TR_LCD "Bildschirm" +#define TR_BRIGHTNESS INDENT "Helligkeit" +#define TR_CPU_TEMP "CPU-Temp.\016>" +#define TR_CPU_CURRENT "Strom\022>" +#define TR_CPU_MAH "Verbrauch" +#define TR_COPROC "CoProz." +#define TR_COPROC_TEMP "MB Temp. \016>" +#define TR_CAPAWARNING INDENT "Kapaz. niedrig" // wg 9XR-Pro +#define TR_TEMPWARNING INDENT "Temp. größer" //wg 9XR-Pro +#define TR_FUNC "Funktion" +#define TR_V1 "V1" +#define TR_V2 "V2" +#define TR_DURATION "Dauer" +#define TR_DELAY "Verzög." +#define TR_SD_CARD "SD-Karte" +#define TR_SDHC_CARD "SDHC-Karte" +#define TR_NO_SOUNDS_ON_SD "Keine Töne auf SD" +#define TR_NO_MODELS_ON_SD "Kein Modell auf SD" +#define TR_NO_BITMAPS_ON_SD "Keine Bitmaps auf SD" +#define TR_NO_SCRIPTS_ON_SD "Keine Scripte auf SD" +#define TR_SCRIPT_SYNTAX_ERROR "Script Syntax Fehler" +#define TR_SCRIPT_PANIC "Script panic" //?? +#define TR_SCRIPT_KILLED "Script killed" //?? +#define TR_SCRIPT_ERROR "Unbekannter Fehler" +#define TR_PLAY_FILE "Spielen" +#define TR_DELETE_FILE "Löschen" +#define TR_COPY_FILE "Kopieren" +#define TR_RENAME_FILE "Umbenennen" +#define TR_ASSIGN_BITMAP "Bitmap zuordnen" +#define TR_EXECUTE_FILE "Execute" +#define TR_REMOVED " gelöscht" +#define TR_SD_INFO "Information" +#define TR_SD_FORMAT "Formatieren" +#define TR_NA "N/V" //NV=Nicht Verfügbar Kurz-Meldung +#define TR_HARDWARE TR("Hardware einst. ", "Namen und Hardware einst.") +#define TR_FORMATTING "Formatierung..." +#define TR_TEMP_CALIB "Temp. abgl." +#define TR_TIME "Uhrzeit:" +#define TR_BAUDRATE "BT Baudrate" +#define TR_SD_INFO_TITLE "SD-INFO" +#define TR_SD_TYPE "Typ:" +#define TR_SD_SPEED "Geschw:" +#define TR_SD_SECTORS "Sectoren:" +#define TR_SD_SIZE "Größe:" +#define TR_TYPE INDENT "Type" +#define TR_GLOBAL_VARS "Globale Variablen" +#define TR_GVARS "GLOBALE V." +#define TR_GLOBAL_VAR "Globale Variable" +#define TR_MENUGLOBALVARS "GLOBALE VARIABLEN" +#define TR_OWN "Eigen" +#define TR_DATE "Datum:" +#define TR_ROTARY_ENCODER "Drehgeber" +#define TR_CHANNELS_MONITOR "Kanal-Monitor==>" +#define TR_MIXERS_MONITOR "==>Mischer Monitor" +#define TR_PATH_TOO_LONG "Pfad zu Lang" +#define TR_VIEW_TEXT "View Text" +#define TR_FLASH_BOOTLOADER "Flash BootLoader selbst" // +#define TR_FLASH_EXTERNAL_DEVICE "Flash externes Gerät" +#define TR_FLASH_INTERNAL_MODULE "Flash internes XJT-Modul" +#define TR_WRITING "\032Writing..." // +#define TR_CONFIRM_FORMAT "Formatieren bestätigen?" +#define TR_INTERNALRF "----Internes HF-Modul----------" +#define TR_EXTERNALRF TR("---Externes HF-Modul---", "----Externes HF-Modul----------") //9XR-Pro +#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") +#define TR_FAILSAFESET "Failsafe setzen" +#define TR_MENUSENSOR "SENSOR" +#define TR_SENSOR "SENSOR" +#define TR_COUNTRYCODE "Landescode" +#define TR_VOICELANG "Sprach-Ansage" +#define TR_UNITSSYSTEM "Einheiten" +#define TR_EDIT "Zeile Editieren" +#define TR_INSERT_BEFORE "Neue Zeile davor" +#define TR_INSERT_AFTER "Neue Zeile danach" +#define TR_COPY "Zeile kopieren" +#define TR_MOVE "Zeile verschieben" +#define TR_PASTE "Zeile einfügen" +#define TR_DELETE "Zeile löschen" +#define TR_INSERT "Neue Zeile" +#define TR_RESET_FLIGHT "Reset Flugdaten" +#define TR_RESET_TIMER1 "Reset Timer1" +#define TR_RESET_TIMER2 "Reset Timer2" +#define TR_RESET_TIMER3 "Reset Timer3" +#define TR_RESET_TELEMETRY "Reset Telemetrie" +#define TR_STATISTICS "Statistik und Gas" +#define TR_ABOUT_US "Die Programmierer" +#define TR_SETUP_SCREENS "Setup screens" +#define TR_AND_SWITCH "UND Schalt" //UND mit weiterem Schaltern +#define TR_SF "SF" //Spezial Funktionen +#define TR_GF "GF" // Globale Funktionen +#define TR_SPEAKER INDENT "Lautspr" +#define TR_BUZZER INDENT "Summer" +#define TR_BYTES "Bytes" +#define TR_MODULE_BIND TR("Bind","[Bind]") //9XR-Pro +#define TR_MODULE_RANGE TR("Rang", "[Range]") //9XR-Pro +#define TR_RESET_BTN TR("[Reset]", "[Reset Trim]") +#define TR_SET "[Set]" +#define TR_TRAINER "----DSC Buchse PPM In/Out------" //DSC Buchse Trainer Buchse +#define TR_ANTENNAPROBLEM CENTER "TX-Antennenproblem!" +#define TR_MODELIDUSED TR("ID schon benutzt", "Modell-ID schon benutzt") +#define TR_MODULE INDENT "Modul-Typ" +#define TR_TELEMETRY_TYPE TR("Typ", "Telemetrytyp") +#define TR_TELEMETRY_SENSORS "----Sensoren----" +#define TR_VALUE "Wert" +#define TR_TOPLCDTIMER "Top LCD Timer" +#define TR_UNIT "Einheit" +#define TR_TELEMETRY_NEWSENSOR INDENT "Sensor hinzufügen ..." +#define TR_CHANNELRANGE TR(INDENT "Kanäle", INDENT "Ausgangs Kanäle") //wg 9XR-Pro +#define TR_LOWALARM INDENT "Vor-Alarm bei" +#define TR_CRITICALALARM INDENT "Kritisch-Alarm" +#define TR_ENABLE_POPUP "Freigabe Popup-Fenster" +#define TR_DISABLE_POPUP "Sperren Popup-Fenster" +#define TR_POPUP "Popup" +#define TR_MIN "Min" +#define TR_MAX "Max" +#define TR_CURVE_PRESET "Gerade 0 11 22 33 45" +#define TR_PRESET "Preset" +#define TR_MIRROR "Spiegeln" +#define TR_CLEAR "Löschen" +#define TR_RESET "Servowerte rücksetzen" +#define TR_RESET_SUBMENU TR("Reset Werte ==>", "Reset=>Timer Flug Telem") +#define TR_COUNT "Punkte" +#define TR_PT "Pt" +#define TR_PTS "Pts" +#define TR_SMOOTH "Runden" +#define TR_COPY_STICKS_TO_OFS "Kopie Stick to Servo-Mitte" +#define TR_COPY_TRIMS_TO_OFS "Kopie Trimm to Servo-Mitte" // "Trim to Subtrim" +#define TR_INCDEC "Inc/Decrement" +#define TR_GLOBALVAR "Global Var" +#define TR_MIXSOURCE "Mixer Quelle" +#define TR_CONSTANT "Konstant" +#define TR_PERSISTENT_MAH TR(INDENT "Spr. mAh", INDENT "Speichern mAh") //9XR-Pro +#define TR_PREFLIGHT TR("---Vorflug-Checkliste--", "----Vorflug-Checkliste----") +#define TR_CHECKLIST TR(INDENT "Checkliste", INDENT "Checkliste anzeigen") //9XR-Pro +#define TR_FAS_OFFSET TR(INDENT "FAS-Ofs", INDENT "FAS-Offset") +#define TR_UART3MODE "Serieller Port" +#define TR_SCRIPT "Lua-Script" +#define TR_INPUTS "Inputs" +#define TR_OUTPUTS "Outputs" +#define TR_EEBACKUP "\002[ENTER Long] Backup EEPROM->SD-Karte" +#define TR_FACTORYRESET "\004[MENU Long] ALLES komplett löschen" +#define TR_CONFIRMRESET "ALLE Modelle + Einst. löschen?" +#define TR_TO_MANY_LUA_SCRIPTS "Zu viele Lua-Scripte!!" + +#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 "Mavlink Setup" + #define TR_MAVLINK_BAUD_LABEL "Baudrate" + #define TR_MAVLINK_INFOS "INFOS" + #define TR_MAVLINK_MODE "MODE" + #define TR_MAVLINK_CUR_MODE "Current Mode" + #define TR_MAVLINK_ARMED "Armed" + #define TR_MAVLINK_BAT_MENU_TITLE "BAT RSSI" + #define TR_MAVLINK_BATTERY_LABEL "Flugakku-Status" + #define TR_MAVLINK_RC_RSSI_LABEL "RC RSSI" + #define TR_MAVLINK_PC_RSSI_LABEL "PC RSSI" + #define TR_MAVLINK_NAV_MENU_TITLE "NAV" + #define TR_MAVLINK_COURSE "Course" + #define TR_MAVLINK_HEADING "Heading" + #define TR_MAVLINK_BEARING "Bearing" + #define TR_MAVLINK_ALTITUDE "Altitude" + #define TR_MAVLINK_GPS "GPS" + #define TR_MAVLINK_NO_FIX "NO Fix" + #define TR_MAVLINK_SAT "SAT" + #define TR_MAVLINK_HDOP "HDOP" + #define TR_MAVLINK_LAT "LAT" + #define TR_MAVLINK_LON "LON" +#endif + +// Taranis Info Zeile Anzeigen +#define TR_PHASES_HEADERS { " Name ", " Schalter ", " Trim Seite ", " Trim Höhe ", " Trim Gas ", " Trim Quer ", " Fade In ", " Fade Out " } +#define TR_LIMITS_HEADERS { " Name ", " Mitte ", " Min ", " Max ", " Richtung ", " Kurve ", " PPM-Mitte ", " Mitte-Mode " } +#define TR_CSW_HEADERS { " Funktion ", " Var1 ", " Var2 ", " Var2 ", " UND-Schalter ", " Dauer ", " Verzögerung " } + +//Taranis About screen +#define TR_ABOUTUS "Über OpenTx" + +#define TR_ABOUT_OPENTX_1 "OpenTX ist Open Source," +#define TR_ABOUT_OPENTX_2 "nicht kommerziell, ohne" +#define TR_ABOUT_OPENTX_3 "Funktionsgarantie, frei" +#define TR_ABOUT_OPENTX_4 "verfügbar. Unterstützung" +#define TR_ABOUT_OPENTX_5 "durch Spenden willkommen" + +#define TR_ABOUT_BERTRAND_1 "Bertrand Songis" +#define TR_ABOUT_BERTRAND_2 "OpenTX Hauptauthor" +#define TR_ABOUT_BERTRAND_3 "Companion9x-Mitentwickler" + +#define TR_ABOUT_MIKE_1 "Mike Blandford" +#define TR_ABOUT_MIKE_2 "Code- und Treiber-Guru" +#define TR_ABOUT_MIKE_3 "Wohl einer der Besten." +#define TR_ABOUT_MIKE_4 "Sehr inspirierend." + +#define TR_ABOUT_ROMOLO_1 "Romolo Manfredini" +#define TR_ABOUT_ROMOLO_2 "Companion9x-Hauptentwickler" +#define TR_ABOUT_ROMOLO_3 "" + +#define TR_ABOUT_ANDRE_1 "Andre Bernet" +#define TR_ABOUT_ANDRE_2 "Funktionalität und Tests," +#define TR_ABOUT_ANDRE_3 "Debugging, Dokumentation" + +#define TR_ABOUT_ROB_1 "Rob Thomson" +#define TR_ABOUT_ROB_2 "Openrcforums Webmaster" + +#define TR_ABOUT_KJELL_1 "Kjell Kernen" +#define TR_ABOUT_KJELL_2 "www.open-tx.org Hauptautor" +#define TR_ABOUT_KJELL_3 "Author von OpenTX Recorder" +#define TR_ABOUT_KJELL_4 "Companion contributor" + +#define TR_ABOUT_MARTIN_1 "Martin Hotar" +#define TR_ABOUT_MARTIN_2 "Grafikdesigner" + +#if defined(PCBTARANIS) + #define TR_ABOUT_HARDWARE_1 "Firma FrSky " + #define TR_ABOUT_HARDWARE_2 "Hardware-Design/-Produktion" + #define TR_ABOUT_HARDWARE_3 "Firmware-Vertrieb" +#else + #define TR_ABOUT_HARDWARE_1 "Brent Nelson" + #define TR_ABOUT_HARDWARE_2 "Sky9x Design/Produktion" + #define TR_ABOUT_HARDWARE_3 "" +#endif + +#define TR_ABOUT_PARENTS_1 "Vorgänger-Projekte" +#define TR_ABOUT_PARENTS_2 "Ersky9x (Mike Blandford)" +#define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" +#define TR_ABOUT_PARENTS_4 "TH9X (Thomas Husterer)" + +#define TR_CHR_SHORT 's' // Taste short +#define TR_CHR_LONG 'l' // Taste long +#define TR_CHR_TOGGLE 't' // Taste als togglefunktion = Ein Aus Ein +#define TR_CHR_HOUR 'h' // Stunden +#define TR_CHR_INPUT 'I' // Values between A-I will work + +#define TR_BEEP_VOLUME "Beep-Lautst." +#define TR_WAV_VOLUME "Wave-Lautst." +#define TR_VARIO_VOLUME "Vario-Lautst." +#define TR_BG_VOLUME "Hintergr-Lautst." + +#define TR_TOP_BAR "----Infozeile----" +#define TR_ALTITUDE INDENT "Höhenanzeige" +#define TR_SCALE "Skalierer" +#define TR_VIEW_CHANNELS "Zeige Kanäle" +#define TR_VIEW_NOTES "Zeige Notizen" +#define TR_MODEL_SELECT "Model Select" +#define TR_MODS_FORBIDDEN "Veränderungen verboten!" +#define TR_UNLOCKED "Entsperrt" +#define TR_ID "ID" +#define TR_PRECISION "Prezision" +#define TR_RATIO "Umrechnung" //Faktor, Mulitplikator, Teiler 0,1 bis 10,0 +#define TR_FORMULA "Formel" +#define TR_CELLINDEX "Zellenindex" +#define TR_LOGS "Log Daten" +#define TR_OPTIONS "Optionen" + +#define TR_ALTSENSOR "Höhen Sensor" +#define TR_CELLSENSOR "Zellen Sensor" +#define TR_GPSSENSOR "GPS Sensor" +#define TR_CURRENTSENSOR "Sensor" +#define TR_AUTOOFFSET "Auto Offset" +#define TR_ONLYPOSITIVE "Nur Positiv" +#define TR_FILTER "Filter aktiv" +#define TR_TELEMETRYFULL "Telemetriezeilen voll!" +#define TR_INVERTED_SERIAL INDENT "Invert." +#define TR_IGNORE_INSTANCE TR(INDENT "Keine ID", INDENT "Keine Multisen-ID") //unklar +#define TR_DISCOVER_SENSORS INDENT "Start Sensorsuche" +#define TR_STOP_DISCOVER_SENSORS INDENT "Stop Sensorsuche" +#define TR_DELETE_ALL_SENSORS INDENT "Lösche alle Sensoren" +#define TR_CONFIRMDELETE "Wirklich alle löschen?" +#define TR_SELECT_WIDGET "Select widget" +#define TR_REMOVE_WIDGET "Remove widget" +#define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" +// ----------------------------- Symbole für Auswahlliste---------- +#define TR_MENU_INPUTS "\314Inputs" +#define TR_MENU_LUA "\322Lua Scripte" +#define TR_MENU_STICKS "\307Knüppel" +#define TR_MENU_POTS "\310Potis" +#define TR_MENU_MAX "\315MAX" +#define TR_MENU_HELI "\316Heli-TS CYC1-3" +#define TR_MENU_TRIMS "\313Trimmung" +#define TR_MENU_SWITCHES "\312Schalter" +#define TR_MENU_LOGICAL_SWITCHES "\312Log. Schalter" +#define TR_MENU_TRAINER "\317Trainer" +#define TR_MENU_CHANNELS "\320Kanäle" +#define TR_MENU_GVARS "\311Glob. Vars" +#define TR_MENU_TELEMETRY "\321Telemetrie" +#define TR_MENU_OTHER " Weitere" +#define TR_MENU_INVERT "Invertieren" +// ---------------------------------------------------------------- +#define ZSTR_RSSI "RSSI" +#define ZSTR_SWR "SWR" +#define ZSTR_A1 "A1" +#define ZSTR_A2 "A2" +#define ZSTR_A3 "A3" +#define ZSTR_A4 "A4" +#define ZSTR_BATT "RxBt" +#define ZSTR_ALT "Alt" +#define ZSTR_TEMP1 "Tmp1" +#define ZSTR_TEMP2 "Tmp2" +#define ZSTR_RPM "RPM" +#define ZSTR_FUEL "Fuel" +#define ZSTR_VSPD "VSpd" +#define ZSTR_ACCX "AccX" +#define ZSTR_ACCY "AccY" +#define ZSTR_ACCZ "AccZ" +#define ZSTR_CURR "Curr" +#define ZSTR_VFAS "VFAS" +#define ZSTR_ASPD "ASpd" +#define ZSTR_GSPD "GSpd" +#define ZSTR_HDG "Hdg" +#define ZSTR_CELLS "Cels" +#define ZSTR_GPSALT "GAlt" +#define ZSTR_GPSDATETIME "Date" +#define ZSTR_GPS "GPS" +#define ZSTR_BATT1_VOLTAGE "RB1V" +#define ZSTR_BATT2_VOLTAGE "RB2V" +#define ZSTR_BATT1_CURRENT "RB1A" +#define ZSTR_BATT2_CURRENT "RB2A" +#define ZSTR_BATT1_CONSUMPTION "RB1C" +#define ZSTR_BATT2_CONSUMPTION "RB2C" +#define ZSTR_RB_STATE "RBS" +#define ZSTR_CHANS_STATE "RBCS" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index b2f02bde8..8a6e47b40 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -32,6 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + */ + + + +/* * !!!!! DO NOT EDIT en.h - EDIT en.h.txt INSTEAD !!!!!!! * * In order to make translations easier en.h.txt is parsed and national @@ -41,9 +31,8 @@ * !!!!! DO NOT EDIT en.h - EDIT en.h.txt INSTEAD !!!!!!! */ - - -/* Formatting octal codes available in TR_ strings: +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -51,6 +40,8 @@ * \0 -ends current string */ + + // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "OFF""ON\0" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 2cc8db163..09df0af3a 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1,17 +1,12 @@ /* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Jose Moreno - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -22,8 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * + */ + +// ES translations author: Jose Moreno + +/* * !!!!! DO NOT EDIT es.h - EDIT es.h.txt INSTEAD !!!!!!! * * In order to make translations easier es.h.txt is parsed and national @@ -33,7 +31,8 @@ * * !!!!! DO NOT EDIT es.h - EDIT es.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -43,14 +42,6 @@ - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "OFF""ON\0" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index ffb873f9c..a1f96a504 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1,16 +1,12 @@ -/* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini +/* + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -21,9 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * - * + */ + +// FI translations author: who? + +/* * !!!!! DO NOT EDIT fi.h - EDIT fi.h.txt INSTEAD !!!!!!! * * In order to make translations easier fi.h.txt is parsed and national @@ -33,7 +31,9 @@ * * !!!!! DO NOT EDIT fi.h - EDIT fi.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -42,15 +42,6 @@ */ - - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "POI""PÄÄ" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 50beee0ef..ec285a68e 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1,13 +1,12 @@ -/* - * Authors (alphabetical order) - * - Andre Bernet - * - Bertrand Songis +/* + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -18,9 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * - * + */ + +// FR translations author: Andre Bernet + +/* * !!!!! DO NOT EDIT fr.h - EDIT fr.h.txt INSTEAD !!!!!!! * * In order to make translations easier fr.h.txt is parsed and national @@ -30,7 +31,9 @@ * * !!!!! DO NOT EDIT fr.h - EDIT fr.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -39,18 +42,6 @@ */ - - - - - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "OFF""ON\0" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 13e07cbcd..d3079fa3d 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1,1173 +1,1161 @@ -/* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer - * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * - * !!!!! DO NOT EDIT it.h - EDIT it.h.txt INSTEAD !!!!!!! - * - * In order to make translations easier it.h.txt is parsed and national - * characters are replaced by bitmap codes. The result is it.h. - * - * See translate.py in the util folder for the list of character codes - * - * !!!!! DO NOT EDIT it.h - EDIT it.h.txt INSTEAD !!!!!!! - */ - - - - /* Formatting octal codes available in TR_ strings: - * \037\x -sets LCD x-coord (x value in octal) - * \036 -newline - * \035 -horizontal tab (ARM only) - * \001 to \034 -extended spacing (value * FW/2) - * \0 -ends current string - */ - -// NON ZERO TERMINATED STRINGS -#define LEN_OFFON "\003" -#define TR_OFFON "OFF""ON\0" - -#define LEN_MMMINV "\003" -#define TR_MMMINV "---""INV" - -#define LEN_NCHANNELS "\004" -#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH" - -#define LEN_VBEEPMODE TR("\005", "\010") -#define TR_VBEEPMODE TR("Silen""Avvis""Notst""Tutti","Silente ""Avvisi\0 ""No Tasti""Tutti\0 ") - -#define LEN_VBEEPLEN "\005" -#define TR_VBEEPLEN "+Cort""Corta""Media""Lunga""+Lung" - -#define LEN_VRENAVIG "\003" -#define TR_VRENAVIG "No REaREb" - -#define LEN_VBLMODE TR("\005", "\006") -#define TR_VBLMODE TR("OFF\0 ""Tasti""Stks\0""Tutti""ON\0 ", "Spenta""Tasti\0""Sticks""Tutti\0""Accesa") - -#define LEN_TRNMODE "\003" -#define TR_TRNMODE "off"" +="" :=" - -#define LEN_TRNCHN "\003" -#define TR_TRNCHN "ch1ch2ch3ch4" - -#define LEN_UART3MODES "\016" -#define TR_UART3MODES "OFF\0 ""Replica S-Port""Telemetria\0 ""SBUS Trainer\0 ""Debug\0" - -#define LEN_SWTYPES "\006" -#define TR_SWTYPES "None\0 ""Toggle""2POS\0 ""3POS\0" - -#define LEN_POTTYPES "\017" -#define TR_POTTYPES "None\0 ""Pot. con centro""Inter. Multipos""Potenziometro\0 " - -#define LEN_SLIDERTYPES "\006" -#define TR_SLIDERTYPES "Niente""Slider" - -#define LEN_DATETIME "\005" -#define TR_DATETIME "DATA:""ORA :" - -#define LEN_VLCD "\006" -#define TR_VLCD "NormalOptrex" - -#define LEN_VPERSISTENT "\015" -#define TR_VPERSISTENT "NO\0 ""Volo\0 ""Reset Manuale" - -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europa\0") - -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" - -#define LEN_XJT_PROTOCOLS "\004" -#define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" - -#define LEN_DSM_PROTOCOLS "\004" -#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" - -#define LEN_VTRIMINC "\006" -#define TR_VTRIMINC "Exp ""ExFine""Fine ""Medio ""Ampio " - -#define LEN_VDISPLAYTRIMS "\006" -#define TR_VDISPLAYTRIMS "No\0 ""Cambio""Si\0 " - -#define LEN_VBEEPCOUNTDOWN "\006" -#define TR_VBEEPCOUNTDOWN "NienteSuoni\0Voce\0 Vibra\0" - -#define LEN_VVARIOCENTER "\006" -#define TR_VVARIOCENTER "Tono\0 ""Silent" - -#define LEN_CURVE_TYPES "\010" -#define TR_CURVE_TYPES "Fisso\0 ""Modific." - -#define LEN_RETA123 "\001" - -#if defined(PCBHORUS) - #define TR_RETA123 "DEMA12345LR" -#elif defined(PCBFLAMENCO) - #define TR_RETA123 "DEMA123LR" -#elif defined(PCBTARANIS) && defined(REV9E) - #define TR_RETA123 "DEMA123SDSD" -#elif defined(PCBTARANIS) || defined(REVX) - #define TR_RETA123 "DEMA123SD" -#elif defined(PCBSKY9X) - #define TR_RETA123 "DEMA123a" -#elif defined(CPUM2560) - #define TR_RETA123 "DEMA123ab" -#else - #define TR_RETA123 "DEMA123" -#endif - -#define LEN_VPROTOS "\006" - -#if defined(PXX) - #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) - #define TR_PXX "[PXX]\0" -#else - #define TR_PXX -#endif - -#if defined(DSM2) - #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" -#else - #define TR_DSM2 -#endif - -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - -#if defined(CPUARM) - #define TR_XPPM -#else - #define TR_XPPM "PPM16\0""PPMsim" -#endif - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS - -#define LEN_POSNEG "\003" -#define TR_POSNEG "POS""NEG" - -#if defined(PCBSKY9X) && defined(REVX) - #define LEN_VOUTPUT_TYPE "\011" - #define TR_VOUTPUT_TYPE "OpenDrain""PushPull\0" -#endif - -#define LEN_VCURVEFUNC "\003" -#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" - -#define LEN_VMLTPX "\005" -#define TR_VMLTPX "Add. ""Molt.""Sost." - -#define LEN_VMLTPX2 "\002" -#define TR_VMLTPX2 "+=""*="":=" - -#define LEN_VMIXTRIMS "\003" -#define TR_VMIXTRIMS "OFF""ON ""Dir""Ele""Mot""Ale" - -#if LCD_W >= 212 - #define TR_CSWTIMER "Timer" - #define TR_CSWSTICKY "Stcky" - #define TR_CSWRANGE "Campo" - #define TR_CSWSTAY "Edge\0" -#else - #define TR_CSWTIMER "Tim\0 " - #define TR_CSWSTICKY "Glue\0" - #if defined(CPUARM) - #define TR_CSWRANGE "Rnge\0" - #define TR_CSWSTAY "Edge\0" - #else - #define TR_CSWRANGE - #define TR_CSWSTAY - #endif -#endif - -#if defined(CPUARM) - #define TR_CSWEQUAL "a=x\0 " -#else - #define TR_CSWEQUAL -#endif - -#define LEN_VCSWFUNC "\005" -#if defined(CPUARM) -#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a= 212 - #define TR_SF_SAFETY "Blocco\0 " -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Blocco\0 " -#else - #define TR_SF_SAFETY "---\0 " -#endif - -#if defined(PCBTARANIS) - #define TR_SF_SCREENSHOT "Screenshot\0 " -#else - #define TR_SF_SCREENSHOT -#endif - -#define TR_SF_RESERVE "[riserva] \0" - -#if defined(CPUARM) - #define TR_VFSWFUNC TR_SF_SAFETY "Maestro \0 ""Trim Instant.""Azzera\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " "SetFailsafe\0 " "RangeCheck\0 " "ModuleBind\0 " TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Retroillum.\0 " TR_SF_SCREENSHOT TR_SF_TEST -#elif defined(PCBGRUVIN9X) - #define TR_VFSWFUNC TR_SF_SAFETY "Maestro \0 ""Trim Instant.""Azzera\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Retroillum.\0 " TR_SF_TEST -#else - #define TR_VFSWFUNC TR_SF_SAFETY "Maestro \0 ""Trim Instant.""Azzera\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC "Retroillum.\0 " TR_SF_TEST -#endif - -#define LEN_VFSWRESET TR("\004", "\011") - -#if defined(FRSKY) - #define TR_FSW_RESET_TELEM TR("Telm", "Telemetr.") -#else - #define TR_FSW_RESET_TELEM -#endif - -#if ROTARY_ENCODERS == 2 - #define TR_FSW_RESET_ROTENC TR("REa\0""REb\0", "EncRot A\0""EncRot B\0") -#elif ROTARY_ENCODERS == 1 - #define TR_FSW_RESET_ROTENC TR("R.E.", "EncRot\0 ") -#else - #define TR_FSW_RESET_ROTENC -#endif - -#if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " -#elif defined(CPUARM) - #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2" -#endif - -#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "All\0" TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, TR_FSW_RESET_TIMERS "Tutto\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC) - -#define LEN_FUNCSOUNDS TR("\004", "\006") -#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Wrn1""Wrn2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Warn1 ""Warn2 ""Cheep ""Ratata""Tick ""Siren ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") - -#define LEN_VTELEMCHNS TR("\004", "\005") - -#if defined(CPUARM) - #define TR_TELEM_RESERVE TR("[--]", "[---]") - #define TR_TELEM_TIME TR("Ora\0", "Ora\0 ") - #define TR_SWR TR("SWR\0", "SWR\0 ") - #define TR_RX_BATT TR("RxBt", "BatRx") - #define TR_A3_A4 TR("A3\0 ""A4\0 ", "A3\0 ""A4\0 ") - #define TR_A3_A4_MIN TR("A3-\0""A4-\0", "A3-\0 ""A4-\0 ") -#else - #define TR_TELEM_RESERVE - #define TR_TELEM_TIME - #define TR_SWR - #define TR_RX_BATT - #define TR_A3_A4 - #define TR_A3_A4_MIN -#endif - -#define TR_ASPD_MAX TR("ASp+", "ASpd+") - -#if LCD_W >= 212 - #define TR_TELEM_RSSI_RX "RSSI\0" -#else - #define TR_TELEM_RSSI_RX TR("Rx\0 ", "Rx\0 ") -#endif - -#if defined(CPUARM) - #define TR_TELEM_TIMERS TR("Tmr1""Tmr2""Tmr3", "Tmr1\0""Tmr2\0""Tmr3\0") -#else - #define TR_TELEM_TIMERS TR("Tmr1""Tmr2", "Tmr1\0""Tmr2\0") -#endif - -#if LCD_W >= 212 - #define TR_VTELEMCHNS "---\0 ""Batt\0" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Celle""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\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-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Ora\0 " -#else - #define TR_VTELEMCHNS "---\0""Batt" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\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""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Ora\0" -#endif - -#define LENGTH_UNIT_IMP "ft\0" -#define SPEED_UNIT_IMP "mph" -#define LENGTH_UNIT_METR "m\0 " -#define SPEED_UNIT_METR "kmh" - -#if defined(CPUARM) - #define LEN_VUNITSSYSTEM TR("\006", "\011") - #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metriche\0""Imperiali") - #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" -#else - #if defined(IMPERIAL_UNITS) - #define LENGTH_UNIT LENGTH_UNIT_IMP - #define SPEED_UNIT SPEED_UNIT_IMP - #else - #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 " -#endif - -#define STR_V (STR_VTELEMUNIT+1) -#define STR_A (STR_VTELEMUNIT+4) - -#define LEN_VALARM "\003" -#define TR_VALARM "---""Gia""Ara""Ros" - -#define LEN_VALARMFN "\001" -#define TR_VALARMFN "<>" - -#define LEN_VTELPROTO "\007" -#define TR_VTELPROTO "---\0 ""Hub\0 ""WSHHigh" - -#if defined(CPUARM) - #define LEN_AMPSRC TR("\003", "\007") - #define TR_AMPSRC TR("---""A1\0""A2\0""A3\0""A4\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Celle\0 ") - #define LEN_VOLTSRC TR("\003", "\007") - #define TR_VOLTSRC TR("A1\0""A2\0""A3\0""A4\0""FAS""Cel", "A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Celle\0 ") -#else - #define LEN_AMPSRC TR("\003", "\007") - #define TR_AMPSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Celle\0 ") -#endif - -#define LEN_VARIOSRC "\005" -#if defined(FRSKY_SPORT) - #define TR_VARIOSRC "Vario""A1\0 ""A2\0" -#else - #define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0" -#endif - -#if defined(CPUARM) - #define LEN_VTELEMSCREENTYPE "\006" - #define TR_VTELEMSCREENTYPE "Niente""Valori""Barre\0""Script" -#else - #define LEN_VTELEMSCREENTYPE "\006" - #define TR_VTELEMSCREENTYPE "Valori""Barre\0" -#endif - -#define LEN_GPSFORMAT "\004" -#define TR_GPSFORMAT "HMS NMEA" - -#define LEN2_VTEMPLATES 13 -#define LEN_VTEMPLATES "\015" -#define TR_VTEMPLATES "Canc. Mixer\0 ""Semplice 4CH\0""Sticky-T-Cut\0""Coda-V \0""Elevoni\0 ""Delta\0 ""eCCPM\0 ""Setup Heli\0 ""Test Servo\0 " - -#define LEN_VSWASHTYPE "\004" -#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0" - -#define LEN_VKEYS "\005" -#define TR_VKEYS TR("Menù\0""EXIT\0""DN\0 ""UP\0 ""SX\0 ""DX\0 ", "Menu\0""Esci\0""Enter""Pag.\0""Più\0 ""Meno") - -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - -#define LEN_VSWITCHES "\003" -#define LEN_VSRCRAW "\004" - -#define TR_STICKS_VSRCRAW TR("Dir\0""Ele\0""Mot\0""Ale\0", "\307Dir""\307Ele""\307Mot""\307Ale") -#define TR_TRIMS_VSRCRAW TR("TrmR""TrmE""TrmT""TrmA", "\313Dir""\313Ele""\313Mot""\313Ale") - -#if defined(PCBHORUS) - #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" -#elif defined(PCBFLAMENCO) - #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " - #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " -#elif defined(PCBTARANIS) && defined(REV9E) - #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" -#elif defined(PCBTARANIS) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" -#else - #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " - #define TR_SW_VSRCRAW "3POS" - #define TR_9X_3POS_SWITCHES "ID0""ID1""ID2" -#endif - -#if defined(CPUARM) - #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12""L13""L14""L15""L16""L17""L18""L19""L20""L21""L22""L23""L24""L25""L26""L27""L28""L29""L30""L31""L32" -#else - #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12" -#endif - -#define TR_TRIMS_SWITCHES TR("tRl""tRr""tEd""tEu""tTd""tTu""tAl""tAr", "\313Rl""\313Rr""\313Ed""\313Eu""\313Td""\313Tu""\313Al""\313Ar") - -#if defined(PCBSKY9X) - #define TR_ROTARY_ENCODERS "REa\0" - #define TR_ROTENC_SWITCHES "REa" -#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560) - #define TR_ROTARY_ENCODERS "REa\0""REb\0" - #define TR_ROTENC_SWITCHES "REa""REb" -#else - #define TR_ROTARY_ENCODERS - #define TR_ROTENC_SWITCHES -#endif - -#if !defined(PCBTARANIS) - #define TR_PHYS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" -#endif - -#define TR_ON_ONE_SWITCHES "ON\0""One" - -#if defined(PCBFLAMENCO) - #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" -#elif defined(PCBTARANIS) || defined(PCBHORUS) - // only special switches here - #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES -#else - #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES -#endif - -#if defined(HELI) -#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3" -#else -#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" -#endif - -#if defined(CPUARM) - #define TR_RESERVE_VSRCRAW "[--]" - #define TR_EXTRA_VSRCRAW "Batt""Time" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3" -#else - #define TR_EXTRA_VSRCRAW -#endif - -#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW - -#define LEN_VTMRMODES "\003" -#define TR_VTMRMODES "OFF""ABS""MOs""MO%""MOt" - -#define LEN_VTRAINERMODES "\022" -#define TR_VTRAINERMODES "Maestro/Jack\0 ""Allievo/Jack\0 ""Master/Modulo SBUS""Master/Modulo CPPM""Master/Batteria\0 " - -#define LEN_VFAILSAFE "\013" -#define TR_VFAILSAFE "Non settato""Mantieni\0 ""Personali\0 ""No impulsi\0""Ricevente\0 " - -#if defined(MAVLINK) - #define LEN_MAVLINK_BAUDS "\006" - #define TR_MAVLINK_BAUDS "4800 ""9600 ""14400 ""19200 ""38400 ""57600 ""76800 ""115200" - #define LEN_MAVLINK_AC_MODES "\011" - #define TR_MAVLINK_AC_MODES "Stabilize""Acro ""Alt Hold ""Auto ""Guided ""Loiter ""RTL ""Circle ""Pos Hold ""Land ""OF Loiter""Toy A ""Toy M ""INVALID " - #define LEN_MAVLINK_AP_MODES "\015" - #define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Inizializza ""INVALID " -#endif - -#define LEN_VSENSORTYPES "\012" -#define TR_VSENSORTYPES "Custom\0 ""Calcolato\0" - -#define LEN_VFORMULAS "\011" -#define TR_VFORMULAS "Somma\0 ""Media\0 ""Min\0 ""Max\0 ""Moltipl\0 ""Totalizza""Cella\0 ""Consumo\0 ""Distanza\0" - -#define LEN_VPREC "\004" -#define TR_VPREC "0.--""0.0 ""0.00" - -#define LEN_VCELLINDEX "\010" -#define TR_VCELLINDEX "Minore\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Maggiore""Delta\0" - -// ZERO TERMINATED STRINGS -#if defined(COLORLCD) - #define INDENT "\007" - #define LEN_INDENT 1 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - -#if defined(PCBTARANIS) - #define TR_ENTER "[ENTER]" -#else - #define TR_ENTER "[Menù]" -#endif - -#define TR_EXIT "[EXIT]" - -#if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -#else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT - #define OFS_EXIT sizeof(TR_ENTER) -#endif - -#define TR_MENUWHENDONE CENTER "\007" TR_ENTER " Conferma" -#define TR_FREE "disp" -#define TR_DELETEMODEL "Elimina modello?" -#define TR_COPYINGMODEL "Copia in corso.." -#define TR_MOVINGMODEL "Spostamento..." -#define TR_LOADINGMODEL "Caricamento..." -#define TR_NAME "Nome" -#define TR_MODELNAME "Nome modello" -#define TR_PHASENAME "Nome fase" -#define TR_MIXNAME "Nome mix" -#define TR_INPUTNAME "Nome Ingr." -#if defined(VIRTUALINPUTS) - #define TR_EXPONAME "Nome expo" -#else - #define TR_EXPONAME "Nome Expo" -#endif -#define TR_BITMAP "Immagine" -#define TR_TIMER TR("Timer","Timer ") -#define TR_ELIMITS TR("Limiti.E","Limiti Estesi") -#define TR_ETRIMS TR("Trim Ext","Trim Estesi") -#define TR_TRIMINC "Passo Trim" -#define TR_DISPLAY_TRIMS "Mostra Trims" -#define TR_TTRACE TR("T-Source", INDENT "Sorgente Motore") -#define TR_TTRIM TR("T-Trim", INDENT "Trim Motore") -#define TR_BEEPCTR TR("Ctr Beep","Beep al centro") -#define TR_USE_GLOBAL_FUNCS "Usa Funz Globali" -#if defined(PCBSKY9X) && defined(REVX) - #define TR_OUTPUT_TYPE INDENT "Output" -#endif -#define TR_PROTO TR(INDENT "Proto", INDENT "Protocollo") -#if defined(CPUARM) - #define TR_PPMFRAME INDENT "PPM frame" -#else - #define TR_PPMFRAME "PPM frame" -#endif -#define TR_MS "ms" -#define TR_SWITCH "Inter." -#define TR_TRIMS "Trims" -#define TR_FADEIN "Diss.In" -#define TR_FADEOUT "Diss.Out" -#define TR_DEFAULT "(Predefinita)" -#define TR_CHECKTRIMS CENTER "\006Check\012Trims" -#define OFS_CHECKTRIMS CENTER_OFS+(9*FW) -#define TR_SWASHTYPE "Tipo Ciclico" -#define TR_COLLECTIVE TR("Collettivo","Origine Collettivo") -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" -#define TR_SWASHRING "Anello Ciclico" -#define TR_ELEDIRECTION TR("Direzione ELE","Direzione Long. cyc.") -#define TR_AILDIRECTION TR("Direzione AIL","Direzione Lateral cyc.") -#define TR_COLDIRECTION TR("Direzione PIT","Direzione Coll. Passo") -#define TR_MODE INDENT"Modo" -#define TR_NOFREEEXPO "Expo pieni!" -#define TR_NOFREEMIXER "Mixer pieni!" -#define TR_SOURCE INDENT"Sorg." -#define TR_WEIGHT "Peso" -#define TR_EXPO "Espo" -#define TR_SIDE "Lato" -#define TR_DIFFERENTIAL "Differ" -#define TR_OFFSET INDENT"Offset" -#define TR_TRIM "Trim" -#define TR_DREX "DRex" -#define DREX_CHBOX_OFFSET 30 -#define TR_CURVE "Curva" -#define TR_FLMODE "Fase" -#define TR_MIXWARNING "Avviso" -#define TR_OFF "OFF" -#define TR_MULTPX "MultPx" -#define TR_DELAYDOWN "Post.Giù " -#define TR_DELAYUP "Post.Sù" -#define TR_SLOWDOWN "Rall.Giù " -#define TR_SLOWUP "Rall.Sù" -#define TR_MIXER "MIXER" -#define TR_CV "CV" -#define TR_GV "GV" -#define TR_ACHANNEL "A\002ingresso" -#define TR_RANGE TR(INDENT"Inter.", INDENT"Intervallo") -#define TR_CENTER INDENT "Centro" -#define TR_BAR "Barra" -#define TR_ALARM TR(INDENT"Allar.", INDENT"Allarme") -#define TR_USRDATA "Dati" -#define TR_BLADES INDENT"Pale" -#define TR_SCREEN "Schermo " -#define TR_SOUND_LABEL "Suono" -#define TR_LENGTH INDENT"Durata" -#define TR_BEEP_LENGTH INDENT "Lung. Beep" -#define TR_SPKRPITCH INDENT"Tono" -#define TR_HAPTIC_LABEL "Vibraz" -#define TR_HAPTICSTRENGTH INDENT"Forza" -#define TR_CONTRAST "Contrasto" -#define TR_ALARMS_LABEL "Allarmi" -#define TR_BATTERY_RANGE TR("Interv. Batt", "Intervallo batteria") -#define TR_BATTERYWARNING INDENT"Avviso batteria" -#define TR_INACTIVITYALARM INDENT"Inattivita'" -#define TR_MEMORYWARNING INDENT"Avviso memoria" -#define TR_ALARMWARNING INDENT"Spegni suono" -#define TR_RENAVIG "Navig EncRot " -#define TR_THROTTLE_LABEL "Motore" -#define TR_THROTTLEREVERSE TR("Mot inv.", INDENT "Motore Inverso") -#define TR_TIMER_NAME INDENT "Nome" -#define TR_MINUTEBEEP INDENT"Minuto" -#define TR_BEEPCOUNTDOWN TR(INDENT"Conto rov", INDENT"Conto rovescia") -#define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente") -#define TR_BACKLIGHT_LABEL TR("Retroillum.", "Retroilluminazione") -#define TR_BLDELAY INDENT"Durata" -#define TR_BLONBRIGHTNESS TR(INDENT"Lumin. ON",INDENT"Luminosità ON") -#define TR_BLOFFBRIGHTNESS TR(INDENT"Lumin. OFF",INDENT"Luminosità OFF") -#define TR_BLCOLOR INDENT "Colore" -#define TR_SPLASHSCREEN TR("Schermo avvio", "Schermata di avvio") -#define TR_THROTTLEWARNING TR("All. Mot.", INDENT "Allarme Motore") -#define TR_SWITCHWARNING TR("Avv. Int.", INDENT "Avviso Interr.") -#define TR_POTWARNING TR("Avv. Pot.", INDENT "Avviso Pot.") -#define TR_TIMEZONE "Ora locale" -#define TR_ADJUST_RTC INDENT "Aggiusta RTC" -#define TR_GPS "GPS" -#define TR_RXCHANNELORD "Ordine ch RX" -#define TR_STICKS "Sticks" -#define TR_POTS "Pot." -#define TR_SWITCHES "Interutt." -#define TR_SWITCHES_DELAY "Ritardo voce FV" -#define TR_SLAVE "Allievo" -#define TR_MODESRC "Modo\006% Origine" -#define TR_MULTIPLIER "Moltiplica" -#define TR_CAL "Cal" -#define TR_VTRIM "Trim- +" -#define TR_BG "BG:" -#if defined(PCBHORUS) - #define TR_MENUTOSTART "Press [Enter] to start" - #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" - #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" -#elif defined(COLORLCD) - #define TR_MENUTOSTART TR_ENTER " TO START" - #define TR_SETMIDPOINT "CENTRA STICKS/SLIDERS" - #define TR_MOVESTICKSPOTS "MUOVI STICKS/POTS" -#else - #define TR_MENUTOSTART CENTER"\011" TR_ENTER " per Cal." - #define TR_SETMIDPOINT CENTER"\012SETTA CENTRO" - #define TR_MOVESTICKSPOTS CENTER"\010MUOVI STICK/POT" -#endif -#define TR_RXBATT "Batt Rx:" -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 -#define TR_ACCEL "Acc:" -#define TR_NODATA CENTER"DATI ASSENTI" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" -#define TR_TMR1LATMAXUS "Tmr1Lat max\037\124us" -#define STR_US (STR_TMR1LATMAXUS+13) -#define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" -#define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" - -#if defined(CPUARM) - #define TR_TMIXMAXMS "Tmix max" - #define TR_FREESTACKMINB "Free Stack" -#else - #define TR_TMIXMAXMS "Tmix max\037\124ms" - #define TR_FREESTACKMINB "Free Stack\037\124b" -#endif - -#define TR_MENUTORESET CENTER TR_ENTER" x Azzerare" -#define TR_PPM_TRAINER "TR" -#define TR_CH "CH" -#define TR_MODEL "MODELLO" -#define TR_FP "FV" -#define TR_MIX "MIX" -#define TR_EEPROMLOWMEM "EEPROM quasi piena!" -#define TR_ALERT "\016ALERT" -#define TR_PRESSANYKEYTOSKIP "\010Premi un tasto" -#define TR_THROTTLENOTIDLE TR("Motore non in posiz.","Motore non in posizione") -#define TR_ALARMSDISABLED "Avvisi Disattivati!" -#define TR_PRESSANYKEY "\010Premi un tasto" -#define TR_BADEEPROMDATA "Dati corrotti!" -#define TR_BAD_RADIO_DATA "Bad Radio Data" -#define TR_EEPROMFORMATTING "Formatto EEPROM..." -#define TR_STORAGE_FORMAT "Storage Preparation" -#define TR_EEPROMOVERFLOW "EEPROM Piena" -#define TR_MENURADIOSETUP "CONFIGURATX" -#define TR_MENUDATEANDTIME "DATA E ORA" -#define TR_MENUTRAINER "MAESTRO/ALLIEVO" -#define TR_MENUGLOBALFUNCS "FUNZIONI GLOBALI" -#define TR_MENUVERSION "VERSIONE" -#define TR_MENUDIAG "DIAG" -#define TR_MENUANA "ANAS" -#define TR_MENUCALIBRATION "CALIBRAZIONE" -#if defined(COLORLCD) - #define TR_TRIMS2OFFSETS "Trims >> Subtrims" -#else - #define TR_TRIMS2OFFSETS "\006Trim => Offset " -#endif -#define TR_MENUMODELSEL "MODELLI" -#define TR_MENUSETUP "CONFIGURA" -#define TR_MENUFLIGHTPHASE "FASE DI VOLO" -#define TR_MENUFLIGHTPHASES "FASI DI VOLO" -#define TR_MENUHELISETUP "CONFIGURA ELI" - -#if defined(VIRTUALINPUTS) - #define TR_MENUINPUTS "INGRESSI" - #define TR_MENULIMITS "USCITE" -#else - #define TR_MENUINPUTS "DR/ESPO" - #define TR_MENULIMITS "LIMITI" -#endif - -#define TR_MENUCURVES "CURVE" -#define TR_MENUCURVE "CURVA" -#define TR_MENULOGICALSWITCH "INTER. PERSON." -#define TR_MENULOGICALSWITCHES TR("INTER. LOGICI","INTERRUTTORI LOGICI") -#define TR_MENUCUSTOMFUNC TR("FUNZ. SPECIALI","FUNZIONI SPECIALI") -#define TR_MENUCUSTOMSCRIPTS "SCRIPTS UTENTE" -#define TR_MENUTELEMETRY "TELEMETRIA" -#define TR_MENUTEMPLATES "ESEMPI GUIDA" -#define TR_MENUSTAT "STATO" -#define TR_MENUDEBUG "DEBUG" -#if defined(CPUARM) - #define TR_RXNUM TR(INDENT "RxNum", INDENT "Ricevente No.") -#else - #define TR_RXNUM "RxNum" -#endif -#define TR_SYNCMENU "[Sync]" -#define TR_LIMIT INDENT "Limiti" -#define TR_MINRSSI "Min Rssi" -#define TR_LATITUDE "Latitud." -#define TR_LONGITUDE "Longitud." -#define TR_GPSCOORD TR("GPS Coords", INDENT "Formato Coordinate") -#define TR_VARIO TR("Vario", "Variometro") -#define TR_PITCH_AT_ZERO INDENT "Tono a Zero" -#define TR_PITCH_AT_MAX INDENT "Tono al Max" -#define TR_REPEAT_AT_ZERO INDENT "Ripeti a Zero" -#define TR_POWEROFF "\027Power OFF..." -#define TR_SHUTDOWN "ARRESTO.." -#define TR_SAVEMODEL "Salvataggio dati modello" -#define TR_BATT_CALIB "Calibra batt." -#define TR_CURRENT_CALIB "Calibra corr." -#define TR_VOLTAGE TR(INDENT "Voltagg.",INDENT "Voltaggio") -#define TR_CURRENT TR(INDENT "Corrente",INDENT "Corrente") -#define TR_SELECT_MODEL "Scegli Memo." -#define TR_CREATE_CATEGORY "Create Category" -#define TR_RENAME_CATEGORY "Rename Category" -#define TR_DELETE_CATEGORY "Delete Category" -#define TR_CREATE_MODEL "Crea Modello" -#define TR_DUPLICATE_MODEL "Duplicate Model" -#define TR_CHANGE_CATEGORY "Change category" -#define TR_COPY_MODEL "Copia Modello" -#define TR_MOVE_MODEL "Sposta Modello" -#define TR_BACKUP_MODEL "Salva Modello" -#define TR_DELETE_MODEL TR("Elim. Modello","Elimina Modello") // TODO merged into DELETEMODEL? -#define TR_RESTORE_MODEL TR("Ripr. Modello","Ripristina Modello") -#define TR_SDCARD_ERROR "Errore SD" -#define TR_NO_SDCARD "No SDCARD" -#define TR_SDCARD_FULL "SD Card Piena" -#define TR_INCOMPATIBLE "Incompatibile" -#define TR_WARNING "AVVISO" -#define TR_EEPROMWARN "EEPROM" -#define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "Conversione EEPROM" -#define TR_THROTTLEWARN "MOTORE" -#define TR_ALARMSWARN "ALLARMI" -#define TR_SWITCHWARN "CONTROLLI" -#define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NO_FAILSAFE "Failsafe non settato" -#define TR_KEYSTUCK "Tasto bloccato" -#define TR_INVERT_THR "Inverti Mot?" -#define TR_SPEAKER_VOLUME "Volume Audio" -#define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Luminosità" -#define TR_CPU_TEMP "Temp CPU \016>" -#define TR_CPU_CURRENT "Corrente\022>" -#define TR_CPU_MAH "Consumo" -#define TR_COPROC "CoProc." -#define TR_COPROC_TEMP "Temp. MB \016>" -#define TR_CAPAWARNING INDENT "CapacitàLow" -#define TR_TEMPWARNING INDENT "Temp. Alta" -#define TR_FUNC "Funz" -#define TR_V1 "V1" -#define TR_V2 "V2" -#define TR_DURATION "Durata" -#define TR_DELAY "Ritardo" -#define TR_SD_CARD "SD Card" -#define TR_SDHC_CARD "SD-HC Card" -#define TR_NO_SOUNDS_ON_SD "No Suoni su SD" -#define TR_NO_MODELS_ON_SD "No Model. su SD" -#define TR_NO_BITMAPS_ON_SD "No Immag. su SD" -#define TR_NO_SCRIPTS_ON_SD "No Scripts su SD" -#define TR_SCRIPT_SYNTAX_ERROR "Script errore sintassi" -#define TR_SCRIPT_PANIC "Script panic" -#define TR_SCRIPT_KILLED "Script fermato" -#define TR_SCRIPT_ERROR "Errore sconosciuto" -#define TR_PLAY_FILE "Suona" -#define TR_DELETE_FILE "Elimina" -#define TR_COPY_FILE "Copia" -#define TR_RENAME_FILE "Rinomomina" -#define TR_ASSIGN_BITMAP "Assegna Immagine" -#define TR_EXECUTE_FILE "Esegui" -#define TR_REMOVED " rimosso" -#define TR_SD_INFO "Informazioni" -#define TR_SD_FORMAT "Format" -#define TR_NA "N/A" -#define TR_HARDWARE "HARDWARE" -#define TR_FORMATTING "Formattazione." -#define TR_TEMP_CALIB "Temp. Calib" -#define TR_TIME "Ora" -#define TR_BAUDRATE "BT Baudrate" -#define TR_SD_INFO_TITLE "SD INFO" -#define TR_SD_TYPE "Tipo:" -#define TR_SD_SPEED "Veloc.:" -#define TR_SD_SECTORS "Settori:" -#define TR_SD_SIZE "Dimens:" -#define TR_TYPE INDENT "Tipo" -#define TR_GLOBAL_VARS "Variabili Globali" -#define TR_GVARS "V.GLOBALI" -#define TR_GLOBAL_VAR "Variabile globale" -#define TR_MENUGLOBALVARS "VARIABILI GLOBALI" -#define TR_OWN "Fase" -#define TR_DATE "Data" -#define TR_ROTARY_ENCODER "R.Encs" -#define TR_CHANNELS_MONITOR "MONITOR CANALI" -#define TR_MIXERS_MONITOR "MONITOR MIXER" -#define TR_PATH_TOO_LONG "Path troppo lungo" -#define TR_VIEW_TEXT "Vedi testo" -#define TR_FLASH_BOOTLOADER "Flash BootLoader" -#define TR_FLASH_EXTERNAL_DEVICE "Progr. Dispositivo Esterno" -#define TR_FLASH_INTERNAL_MODULE "Progr. Modulo Interno" -#define TR_WRITING "\032Scrivendo..." -#define TR_CONFIRM_FORMAT "Confermi Format?" -#define TR_INTERNALRF "Modulo Interno" -#define TR_EXTERNALRF "Modulo esterno" -#define TR_FAILSAFE "Modo failsafe" -#define TR_FAILSAFESET TR("FAILSAFE","IMPOSTAZIONI FAILSAFE") -#define TR_MENUSENSOR "SENSOR" -#define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE TR("Codice Paese","Standard 2.4Ghz") -#define TR_VOICELANG "Lingua Voce" -#define TR_UNITSSYSTEM "Unità" -#define TR_EDIT "Modifica" -#define TR_INSERT_BEFORE "Inserisci prima" -#define TR_INSERT_AFTER "Inserisci dopo" -#define TR_COPY "Copia" -#define TR_MOVE "Sposta" -#define TR_PASTE "Incolla" -#define TR_DELETE "Elimina" -#define TR_INSERT TR("Inser.","Inserisci") -#define TR_RESET_FLIGHT "Azzera volo" -#define TR_RESET_TIMER1 "Azzera Timer1" -#define TR_RESET_TIMER2 "Azzera Timer2" -#define TR_RESET_TIMER3 "Azzera Timer3" -#define TR_RESET_TELEMETRY "Azzera Telemetria" -#define TR_STATISTICS "Statistiche" -#define TR_ABOUT_US "Info su" -#define TR_SETUP_SCREENS "Setup screens" -#define TR_AND_SWITCH "Inter. AND" -#define TR_SF "CF" -#define TR_GF "GF" -#define TR_SPEAKER INDENT"Speaker" -#define TR_BUZZER INDENT"Buzzer" -#define TR_BYTES "Bytes" -#define TR_MODULE_BIND "[Bind]" -#define TR_MODULE_RANGE "[Range]" -#define TR_RESET_BTN "[Reset]" -#define TR_SET "[Set]" -#define TR_TRAINER TR("Trainer","Maestro/Allievo") -#define TR_ANTENNAPROBLEM CENTER "Problemi antenna TX!" -#define TR_MODELIDUSED TR("ID già usato","ID Modello già usato") -#define TR_MODULE INDENT "Modulo" -#define TR_TELEMETRY_TYPE "Tipo Telemetria" -#define TR_TELEMETRY_SENSORS "Sensori" -#define TR_VALUE "Valore" -#define TR_TOPLCDTIMER "Timer LCD Sup." -#define TR_UNIT "Unita" -#define TR_TELEMETRY_NEWSENSOR INDENT "Aggiungi nuovo sensore..." -#define TR_CHANNELRANGE INDENT "Numero Canali" -#define TR_LOWALARM INDENT "Allarme Basso" -#define TR_CRITICALALARM INDENT "Allarme Critico" -#define TR_ENABLE_POPUP "Abilita Popup" -#define TR_DISABLE_POPUP "Disabilita Popup" -#define TR_POPUP "Popup" -#define TR_MIN "Min" -#define TR_MAX "Max" -#define TR_CURVE_PRESET "Preimpostate..." -#define TR_PRESET "Preimpostate" -#define TR_MIRROR "Mirror" -#define TR_CLEAR "Cancella" -#define TR_RESET "Azzera" -#define TR_RESET_SUBMENU "Azzera..." -#define TR_COUNT "Punti" -#define TR_PT "pt" -#define TR_PTS "pti" -#define TR_SMOOTH "Smussa" -#define TR_COPY_STICKS_TO_OFS "Copia Stick su Offset" -#define TR_COPY_TRIMS_TO_OFS "Copia Trim in Subtrim" -#define TR_INCDEC "Inc/Decrementa" -#define TR_GLOBALVAR "Var Globale" -#define TR_MIXSOURCE "Sorgente Mixer" -#define TR_CONSTANT "Constante" -#define TR_PERSISTENT_MAH INDENT "Memo mAh" -#define TR_PREFLIGHT "Controlli Prevolo" -#define TR_CHECKLIST INDENT "Mostra Checklist" -#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Porta Seriale" -#define TR_SCRIPT "Script" -#define TR_INPUTS "Ingresso" -#define TR_OUTPUTS "Uscita" -#define TR_EEBACKUP "\004[ENTER Lungo] per copiare la EEPROM" -#define TR_FACTORYRESET "\012[MENU Lungo]: Inizializza dati" -#define TR_CONFIRMRESET "Resettare TUTTI i dati?" -#define TR_TO_MANY_LUA_SCRIPTS "Troppi Scripts Lua!" - -#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 "Setta Mavlink" - #define TR_MAVLINK_BAUD_LABEL "Baudrate" - #define TR_MAVLINK_INFOS "INFOS" - #define TR_MAVLINK_MODE "MODO" - #define TR_MAVLINK_CUR_MODE "Modo Corrente" - #define TR_MAVLINK_ARMED "Armato" - #define TR_MAVLINK_BAT_MENU_TITLE "BAT RSSI" - #define TR_MAVLINK_BATTERY_LABEL "Stato batteria di volo" - #define TR_MAVLINK_RC_RSSI_LABEL "RC RSSI" - #define TR_MAVLINK_PC_RSSI_LABEL "PC RSSI" - #define TR_MAVLINK_NAV_MENU_TITLE "NAV" - #define TR_MAVLINK_COURSE "Course" - #define TR_MAVLINK_HEADING "Heading" - #define TR_MAVLINK_BEARING "Bearing" - #define TR_MAVLINK_ALTITUDE "Altitudine" - #define TR_MAVLINK_GPS "GPS" - #define TR_MAVLINK_NO_FIX "NO Fix" - #define TR_MAVLINK_SAT "SAT" - #define TR_MAVLINK_HDOP "HDOP" - #define TR_MAVLINK_LAT "LAT" - #define TR_MAVLINK_LON "LON" -#endif - -// Taranis column headers -#define TR_PHASES_HEADERS { " Nome ", " Inter. ", " Trim Deriva ", " Trim Elevator ", " Trim Motore ", " Trim Alettoni ", " Disolv. In ", " Dissolv. Out " } -#define TR_LIMITS_HEADERS { " Nome ", " Offset ", " Min ", " Max ", " Direzione ", " Curve ", " Centro PPM ", " Simmetria " } -#define TR_CSW_HEADERS { " Funzione ", " V1 ", " V2 ", " V2 ", " Inter. AND ", " Durata ", " Ritardo " } - -// About screen -#define TR_ABOUTUS TR(" INFO ", "INFO SU") - -#define TR_ABOUT_OPENTX_1 TR("OpenTX\001e'\001open\001source,\001non", "OpenTX e' open source, non-") -#define TR_ABOUT_OPENTX_2 TR("commercial,\001wo\001warranties.", "commerciale, fornito senza") -#define TR_ABOUT_OPENTX_3 TR("It\001was\001developed\001for\001free.", "garanzie. E' stato sviluppato") -#define TR_ABOUT_OPENTX_4 TR("Support through donations", "gratuitamente. Il supporto") -#define TR_ABOUT_OPENTX_5 TR("is welcome!", "mediante donazioni e' gradito!") - -#define TR_ABOUT_BERTRAND_1 "Bertrand Songis" -#define TR_ABOUT_BERTRAND_2 "Autore principale OpenTX" -#define TR_ABOUT_BERTRAND_3 "Co-autore Companion9x" - -#define TR_ABOUT_MIKE_1 "Mike Blandford" -#define TR_ABOUT_MIKE_2 "Guru codice e driver" -#define TR_ABOUT_MIKE_3 "esperto a basso livello" -#define TR_ABOUT_MIKE_4 "Ispiratore" - -#define TR_ABOUT_ROMOLO_1 "Romolo Manfredini" -#define TR_ABOUT_ROMOLO_2 "Autore Companion9x" -#define TR_ABOUT_ROMOLO_3 "" - -#define TR_ABOUT_ANDRE_1 "Andre Bernet" -#define TR_ABOUT_ANDRE_2 "Funzionalità, usabilità," -#define TR_ABOUT_ANDRE_3 "debugging, documentazione" - -#define TR_ABOUT_ROB_1 "Rob Thomson" -#define TR_ABOUT_ROB_2 "Webmaster openrcforums" - -#define TR_ABOUT_KJELL_1 "Kjell Kernen" -#define TR_ABOUT_KJELL_2 "www.open-tx.org main author" -#define TR_ABOUT_KJELL_3 "OpenTX Recorder author" -#define TR_ABOUT_KJELL_4 "Companion contributor" - -#define TR_ABOUT_MARTIN_1 "Martin Hotar" -#define TR_ABOUT_MARTIN_2 "Graphic Designer" - -#if defined(PCBTARANIS) - #define TR_ABOUT_HARDWARE_1 "FrSky" - #define TR_ABOUT_HARDWARE_2 "Disegno/produzione Hardware" - #define TR_ABOUT_HARDWARE_3 "Contributi al Firmware" -#else - #define TR_ABOUT_HARDWARE_1 "Brent Nelson" - #define TR_ABOUT_HARDWARE_2 "Designer/Produttore SKY9X" - #define TR_ABOUT_HARDWARE_3 "" -#endif - -#define TR_ABOUT_PARENTS_1 "Progetti correlati" -#define TR_ABOUT_PARENTS_2 "ersky9x (Mike Blandford)" -#define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" -#define TR_ABOUT_PARENTS_4 "TH9X (Thomas Husterer)" - -#define TR_CHR_SHORT 's' -#define TR_CHR_LONG 'l' -#define TR_CHR_TOGGLE 't' -#define TR_CHR_HOUR 'h' -#define TR_CHR_INPUT 'I' // Values between A-I will work - -#define TR_BEEP_VOLUME "Volume Beep" -#define TR_WAV_VOLUME "Volume Wav" -#define TR_VARIO_VOLUME "Volume Vario" -#define TR_BG_VOLUME "Volume Sf" - -#define TR_TOP_BAR "Barra sup." -#define TR_ALTITUDE INDENT "Altitudine" -#define TR_SCALE "Scala" -#define TR_VIEW_CHANNELS "Vedi Canali" -#define TR_VIEW_NOTES "Vedi Note" -#define TR_MODEL_SELECT "Model Select" -#define TR_MODS_FORBIDDEN "Modifica proibita!" -#define TR_UNLOCKED "Sbloccato" -#define TR_ID "ID" -#define TR_PRECISION "Precisione" -#define TR_RATIO "Ratio" -#define TR_FORMULA "Formula" -#define TR_CELLINDEX "Indice cella" -#define TR_LOGS "Logs" -#define TR_OPTIONS "Opzioni" - -#define TR_ALTSENSOR "Sensore Alt" -#define TR_CELLSENSOR "Sensore Cell" -#define TR_GPSSENSOR "Sensore GPS" -#define TR_CURRENTSENSOR "Sensore" -#define TR_AUTOOFFSET "Auto Offset" -#define TR_ONLYPOSITIVE "Positivo" -#define TR_FILTER "Filtro" -#define TR_TELEMETRYFULL "Tutti gli slot sono pieni!" -//TODO: translation -#define TR_INVERTED_SERIAL INDENT "Invert" -#define TR_IGNORE_INSTANCE TR(INDENT "No inst.","Ignora instanza") -#define TR_DISCOVER_SENSORS INDENT "Cerca nuovi sensori" -#define TR_STOP_DISCOVER_SENSORS INDENT "Ferma ricerca.." -#define TR_DELETE_ALL_SENSORS INDENT "Elimina tutti i sensori" -#define TR_CONFIRMDELETE "Confermi eliminazione?" -#define TR_SELECT_WIDGET "Select widget" -#define TR_REMOVE_WIDGET "Remove widget" -#define TR_WIDGET_SETTINGS "Widget settings" -#define TR_REMOVE_SCREEN "Remove screen" - -#define TR_MENU_INPUTS "\314Ingressi" -#define TR_MENU_LUA "\322Lua scripts" -#define TR_MENU_STICKS "\307Sticks" -#define TR_MENU_POTS "\310Pots" -#define TR_MENU_MAX "\315MAX" -#define TR_MENU_HELI "\316Ciclico" -#define TR_MENU_TRIMS "\313Trims" -#define TR_MENU_SWITCHES "\312Interrut." -#define TR_MENU_LOGICAL_SWITCHES "\312Interrut. Logici" -#define TR_MENU_TRAINER "\317Trainer" -#define TR_MENU_CHANNELS "\320Canali" -#define TR_MENU_GVARS "\311GVars" -#define TR_MENU_TELEMETRY "\321Telemetry" -#define TR_MENU_OTHER "Altro" -#define TR_MENU_INVERT "Inverti" - -#define ZSTR_RSSI "RSSI" -#define ZSTR_SWR "SWR" -#define ZSTR_A1 "A1" -#define ZSTR_A2 "A2" -#define ZSTR_A3 "A3" -#define ZSTR_A4 "A4" -#define ZSTR_BATT "RxBt" -#define ZSTR_ALT "Alt" -#define ZSTR_TEMP1 "Tmp1" -#define ZSTR_TEMP2 "Tmp2" -#define ZSTR_RPM "RPM" -#define ZSTR_FUEL "Fuel" -#define ZSTR_VSPD "VSpd" -#define ZSTR_ACCX "AccX" -#define ZSTR_ACCY "AccY" -#define ZSTR_ACCZ "AccZ" -#define ZSTR_CURR "Curr" -#define ZSTR_VFAS "VFAS" -#define ZSTR_ASPD "ASpd" -#define ZSTR_GSPD "GSpd" -#define ZSTR_HDG "Hdg" -#define ZSTR_CELLS "Cels" -#define ZSTR_GPSALT "GAlt" -#define ZSTR_GPSDATETIME "Data" -#define ZSTR_GPS "GPS" -#define ZSTR_BATT1_VOLTAGE "RB1V" -#define ZSTR_BATT2_VOLTAGE "RB2V" -#define ZSTR_BATT1_CURRENT "RB1A" -#define ZSTR_BATT2_CURRENT "RB2A" -#define ZSTR_BATT1_CONSUMPTION "RB1C" -#define ZSTR_BATT2_CONSUMPTION "RB2C" -#define ZSTR_RB_STATE "RBS" -#define ZSTR_CHANS_STATE "RBCS" +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +// IT translations author: Romolo Manfredini + +/* + * !!!!! DO NOT EDIT it.h - EDIT it.h.txt INSTEAD !!!!!!! + * + * In order to make translations easier it.h.txt is parsed and national + * characters are replaced by bitmap codes. The result is it.h. + * + * See translate.py in the util folder for the list of character codes + * + * !!!!! DO NOT EDIT it.h - EDIT it.h.txt INSTEAD !!!!!!! + */ + +/* + * Formatting octal codes available in TR_ strings: + * \037\x -sets LCD x-coord (x value in octal) + * \036 -newline + * \035 -horizontal tab (ARM only) + * \001 to \034 -extended spacing (value * FW/2) + * \0 -ends current string + */ + + +// NON ZERO TERMINATED STRINGS +#define LEN_OFFON "\003" +#define TR_OFFON "OFF""ON\0" + +#define LEN_MMMINV "\003" +#define TR_MMMINV "---""INV" + +#define LEN_NCHANNELS "\004" +#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH" + +#define LEN_VBEEPMODE TR("\005", "\010") +#define TR_VBEEPMODE TR("Silen""Avvis""Notst""Tutti","Silente ""Avvisi\0 ""No Tasti""Tutti\0 ") + +#define LEN_VBEEPLEN "\005" +#define TR_VBEEPLEN "+Cort""Corta""Media""Lunga""+Lung" + +#define LEN_VRENAVIG "\003" +#define TR_VRENAVIG "No REaREb" + +#define LEN_VBLMODE TR("\005", "\006") +#define TR_VBLMODE TR("OFF\0 ""Tasti""Stks\0""Tutti""ON\0 ", "Spenta""Tasti\0""Sticks""Tutti\0""Accesa") + +#define LEN_TRNMODE "\003" +#define TR_TRNMODE "off"" +="" :=" + +#define LEN_TRNCHN "\003" +#define TR_TRNCHN "ch1ch2ch3ch4" + +#define LEN_UART3MODES "\016" +#define TR_UART3MODES "OFF\0 ""Replica S-Port""Telemetria\0 ""SBUS Trainer\0 ""Debug\0" + +#define LEN_SWTYPES "\006" +#define TR_SWTYPES "None\0 ""Toggle""2POS\0 ""3POS\0" + +#define LEN_POTTYPES "\017" +#define TR_POTTYPES "None\0 ""Pot. con centro""Inter. Multipos""Potenziometro\0 " + +#define LEN_SLIDERTYPES "\006" +#define TR_SLIDERTYPES "Niente""Slider" + +#define LEN_DATETIME "\005" +#define TR_DATETIME "DATA:""ORA :" + +#define LEN_VLCD "\006" +#define TR_VLCD "NormalOptrex" + +#define LEN_VPERSISTENT "\015" +#define TR_VPERSISTENT "NO\0 ""Volo\0 ""Reset Manuale" + +#define LEN_COUNTRYCODES TR("\002", "\007") +#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europa\0") + +#define LEN_TARANIS_PROTOCOLS "\004" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" + +#define LEN_XJT_PROTOCOLS "\004" +#define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" + +#define LEN_DSM_PROTOCOLS "\004" +#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" + +#define LEN_VTRIMINC "\006" +#define TR_VTRIMINC "Exp ""ExFine""Fine ""Medio ""Ampio " + +#define LEN_VDISPLAYTRIMS "\006" +#define TR_VDISPLAYTRIMS "No\0 ""Cambio""Si\0 " + +#define LEN_VBEEPCOUNTDOWN "\006" +#define TR_VBEEPCOUNTDOWN "NienteSuoni\0Voce\0 Vibra\0" + +#define LEN_VVARIOCENTER "\006" +#define TR_VVARIOCENTER "Tono\0 ""Silent" + +#define LEN_CURVE_TYPES "\010" +#define TR_CURVE_TYPES "Fisso\0 ""Modific." + +#define LEN_RETA123 "\001" + +#if defined(PCBHORUS) + #define TR_RETA123 "DEMA12345LR" +#elif defined(PCBFLAMENCO) + #define TR_RETA123 "DEMA123LR" +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_RETA123 "DEMA123SDSD" +#elif defined(PCBTARANIS) || defined(REVX) + #define TR_RETA123 "DEMA123SD" +#elif defined(PCBSKY9X) + #define TR_RETA123 "DEMA123a" +#elif defined(CPUM2560) + #define TR_RETA123 "DEMA123ab" +#else + #define TR_RETA123 "DEMA123" +#endif + +#define LEN_VPROTOS "\006" + +#if defined(PXX) + #define TR_PXX "PXX\0 " +#elif defined(DSM2) || defined(IRPROTOS) + #define TR_PXX "[PXX]\0" +#else + #define TR_PXX +#endif + +#if defined(DSM2) + #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " +#elif defined(IRPROTOS) + #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" +#else + #define TR_DSM2 +#endif + +#if defined(IRPROTOS) + #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" +#else + #define TR_IRPROTOS +#endif + +#if defined(CPUARM) + #define TR_XPPM +#else + #define TR_XPPM "PPM16\0""PPMsim" +#endif + +#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS + +#define LEN_POSNEG "\003" +#define TR_POSNEG "POS""NEG" + +#if defined(PCBSKY9X) && defined(REVX) + #define LEN_VOUTPUT_TYPE "\011" + #define TR_VOUTPUT_TYPE "OpenDrain""PushPull\0" +#endif + +#define LEN_VCURVEFUNC "\003" +#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" + +#define LEN_VMLTPX "\005" +#define TR_VMLTPX "Add. ""Molt.""Sost." + +#define LEN_VMLTPX2 "\002" +#define TR_VMLTPX2 "+=""*="":=" + +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "OFF""ON ""Dir""Ele""Mot""Ale" + +#if LCD_W >= 212 + #define TR_CSWTIMER "Timer" + #define TR_CSWSTICKY "Stcky" + #define TR_CSWRANGE "Campo" + #define TR_CSWSTAY "Edge\0" +#else + #define TR_CSWTIMER "Tim\0 " + #define TR_CSWSTICKY "Glue\0" + #if defined(CPUARM) + #define TR_CSWRANGE "Rnge\0" + #define TR_CSWSTAY "Edge\0" + #else + #define TR_CSWRANGE + #define TR_CSWSTAY + #endif +#endif + +#if defined(CPUARM) + #define TR_CSWEQUAL "a=x\0 " +#else + #define TR_CSWEQUAL +#endif + +#define LEN_VCSWFUNC "\005" +#if defined(CPUARM) +#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a= 212 + #define TR_SF_SAFETY "Blocco\0 " +#elif defined(OVERRIDE_CHANNEL_FUNCTION) + #define TR_SF_SAFETY "Blocco\0 " +#else + #define TR_SF_SAFETY "---\0 " +#endif + +#if defined(PCBTARANIS) + #define TR_SF_SCREENSHOT "Screenshot\0 " +#else + #define TR_SF_SCREENSHOT +#endif + +#define TR_SF_RESERVE "[riserva] \0" + +#if defined(CPUARM) + #define TR_VFSWFUNC TR_SF_SAFETY "Maestro \0 ""Trim Instant.""Azzera\0 ""Set \0 " TR_ADJUST_GVAR "Volume\0 " "SetFailsafe\0 " "RangeCheck\0 " "ModuleBind\0 " TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Retroillum.\0 " TR_SF_SCREENSHOT TR_SF_TEST +#elif defined(PCBGRUVIN9X) + #define TR_VFSWFUNC TR_SF_SAFETY "Maestro \0 ""Trim Instant.""Azzera\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Retroillum.\0 " TR_SF_TEST +#else + #define TR_VFSWFUNC TR_SF_SAFETY "Maestro \0 ""Trim Instant.""Azzera\0 " TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC "Retroillum.\0 " TR_SF_TEST +#endif + +#define LEN_VFSWRESET TR("\004", "\011") + +#if defined(FRSKY) + #define TR_FSW_RESET_TELEM TR("Telm", "Telemetr.") +#else + #define TR_FSW_RESET_TELEM +#endif + +#if ROTARY_ENCODERS == 2 + #define TR_FSW_RESET_ROTENC TR("REa\0""REb\0", "EncRot A\0""EncRot B\0") +#elif ROTARY_ENCODERS == 1 + #define TR_FSW_RESET_ROTENC TR("R.E.", "EncRot\0 ") +#else + #define TR_FSW_RESET_ROTENC +#endif + +#if LCD_W >= 212 + #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " +#elif defined(CPUARM) + #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" +#else + #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2" +#endif + +#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "All\0" TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, TR_FSW_RESET_TIMERS "Tutto\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC) + +#define LEN_FUNCSOUNDS TR("\004", "\006") +#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Wrn1""Wrn2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Warn1 ""Warn2 ""Cheep ""Ratata""Tick ""Siren ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") + +#define LEN_VTELEMCHNS TR("\004", "\005") + +#if defined(CPUARM) + #define TR_TELEM_RESERVE TR("[--]", "[---]") + #define TR_TELEM_TIME TR("Ora\0", "Ora\0 ") + #define TR_SWR TR("SWR\0", "SWR\0 ") + #define TR_RX_BATT TR("RxBt", "BatRx") + #define TR_A3_A4 TR("A3\0 ""A4\0 ", "A3\0 ""A4\0 ") + #define TR_A3_A4_MIN TR("A3-\0""A4-\0", "A3-\0 ""A4-\0 ") +#else + #define TR_TELEM_RESERVE + #define TR_TELEM_TIME + #define TR_SWR + #define TR_RX_BATT + #define TR_A3_A4 + #define TR_A3_A4_MIN +#endif + +#define TR_ASPD_MAX TR("ASp+", "ASpd+") + +#if LCD_W >= 212 + #define TR_TELEM_RSSI_RX "RSSI\0" +#else + #define TR_TELEM_RSSI_RX TR("Rx\0 ", "Rx\0 ") +#endif + +#if defined(CPUARM) + #define TR_TELEM_TIMERS TR("Tmr1""Tmr2""Tmr3", "Tmr1\0""Tmr2\0""Tmr3\0") +#else + #define TR_TELEM_TIMERS TR("Tmr1""Tmr2", "Tmr1\0""Tmr2\0") +#endif + +#if LCD_W >= 212 + #define TR_VTELEMCHNS "---\0 ""Batt\0" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Celle""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\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-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Ora\0 " +#else + #define TR_VTELEMCHNS "---\0""Batt" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\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""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Ora\0" +#endif + +#define LENGTH_UNIT_IMP "ft\0" +#define SPEED_UNIT_IMP "mph" +#define LENGTH_UNIT_METR "m\0 " +#define SPEED_UNIT_METR "kmh" + +#if defined(CPUARM) + #define LEN_VUNITSSYSTEM TR("\006", "\011") + #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metriche\0""Imperiali") + #define LEN_VTELEMUNIT "\003" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" +#else + #if defined(IMPERIAL_UNITS) + #define LENGTH_UNIT LENGTH_UNIT_IMP + #define SPEED_UNIT SPEED_UNIT_IMP + #else + #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 " +#endif + +#define STR_V (STR_VTELEMUNIT+1) +#define STR_A (STR_VTELEMUNIT+4) + +#define LEN_VALARM "\003" +#define TR_VALARM "---""Gia""Ara""Ros" + +#define LEN_VALARMFN "\001" +#define TR_VALARMFN "<>" + +#define LEN_VTELPROTO "\007" +#define TR_VTELPROTO "---\0 ""Hub\0 ""WSHHigh" + +#if defined(CPUARM) + #define LEN_AMPSRC TR("\003", "\007") + #define TR_AMPSRC TR("---""A1\0""A2\0""A3\0""A4\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Celle\0 ") + #define LEN_VOLTSRC TR("\003", "\007") + #define TR_VOLTSRC TR("A1\0""A2\0""A3\0""A4\0""FAS""Cel", "A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Celle\0 ") +#else + #define LEN_AMPSRC TR("\003", "\007") + #define TR_AMPSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Celle\0 ") +#endif + +#define LEN_VARIOSRC "\005" +#if defined(FRSKY_SPORT) + #define TR_VARIOSRC "Vario""A1\0 ""A2\0" +#else + #define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0" +#endif + +#if defined(CPUARM) + #define LEN_VTELEMSCREENTYPE "\006" + #define TR_VTELEMSCREENTYPE "Niente""Valori""Barre\0""Script" +#else + #define LEN_VTELEMSCREENTYPE "\006" + #define TR_VTELEMSCREENTYPE "Valori""Barre\0" +#endif + +#define LEN_GPSFORMAT "\004" +#define TR_GPSFORMAT "HMS NMEA" + +#define LEN2_VTEMPLATES 13 +#define LEN_VTEMPLATES "\015" +#define TR_VTEMPLATES "Canc. Mixer\0 ""Semplice 4CH\0""Sticky-T-Cut\0""Coda-V \0""Elevoni\0 ""Delta\0 ""eCCPM\0 ""Setup Heli\0 ""Test Servo\0 " + +#define LEN_VSWASHTYPE "\004" +#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0" + +#define LEN_VKEYS "\005" +#define TR_VKEYS TR("Menù\0""EXIT\0""DN\0 ""UP\0 ""SX\0 ""DX\0 ", "Menu\0""Esci\0""Enter""Pag.\0""Più\0 ""Meno") + +#define LEN_VRENCODERS "\003" +#define TR_VRENCODERS "REa""REb" + +#define LEN_VSWITCHES "\003" +#define LEN_VSRCRAW "\004" + +#define TR_STICKS_VSRCRAW TR("Dir\0""Ele\0""Mot\0""Ale\0", "\307Dir""\307Ele""\307Mot""\307Ale") +#define TR_TRIMS_VSRCRAW TR("TrmR""TrmE""TrmT""TrmA", "\313Dir""\313Ele""\313Mot""\313Ale") + +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" +#elif defined(PCBTARANIS) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#else + #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " + #define TR_SW_VSRCRAW "3POS" + #define TR_9X_3POS_SWITCHES "ID0""ID1""ID2" +#endif + +#if defined(CPUARM) + #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12""L13""L14""L15""L16""L17""L18""L19""L20""L21""L22""L23""L24""L25""L26""L27""L28""L29""L30""L31""L32" +#else + #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12" +#endif + +#define TR_TRIMS_SWITCHES TR("tRl""tRr""tEd""tEu""tTd""tTu""tAl""tAr", "\313Rl""\313Rr""\313Ed""\313Eu""\313Td""\313Tu""\313Al""\313Ar") + +#if defined(PCBSKY9X) + #define TR_ROTARY_ENCODERS "REa\0" + #define TR_ROTENC_SWITCHES "REa" +#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560) + #define TR_ROTARY_ENCODERS "REa\0""REb\0" + #define TR_ROTENC_SWITCHES "REa""REb" +#else + #define TR_ROTARY_ENCODERS + #define TR_ROTENC_SWITCHES +#endif + +#if !defined(PCBTARANIS) + #define TR_PHYS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" +#endif + +#define TR_ON_ONE_SWITCHES "ON\0""One" + +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) + // only special switches here + #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES +#else + #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES +#endif + +#if defined(HELI) +#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3" +#else +#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" +#endif + +#if defined(CPUARM) + #define TR_RESERVE_VSRCRAW "[--]" + #define TR_EXTRA_VSRCRAW "Batt""Time" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3" +#else + #define TR_EXTRA_VSRCRAW +#endif + +#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW + +#define LEN_VTMRMODES "\003" +#define TR_VTMRMODES "OFF""ABS""MOs""MO%""MOt" + +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Maestro/Jack\0 ""Allievo/Jack\0 ""Master/Modulo SBUS""Master/Modulo CPPM""Master/Batteria\0 " + +#define LEN_VFAILSAFE "\013" +#define TR_VFAILSAFE "Non settato""Mantieni\0 ""Personali\0 ""No impulsi\0""Ricevente\0 " + +#if defined(MAVLINK) + #define LEN_MAVLINK_BAUDS "\006" + #define TR_MAVLINK_BAUDS "4800 ""9600 ""14400 ""19200 ""38400 ""57600 ""76800 ""115200" + #define LEN_MAVLINK_AC_MODES "\011" + #define TR_MAVLINK_AC_MODES "Stabilize""Acro ""Alt Hold ""Auto ""Guided ""Loiter ""RTL ""Circle ""Pos Hold ""Land ""OF Loiter""Toy A ""Toy M ""INVALID " + #define LEN_MAVLINK_AP_MODES "\015" + #define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Inizializza ""INVALID " +#endif + +#define LEN_VSENSORTYPES "\012" +#define TR_VSENSORTYPES "Custom\0 ""Calcolato\0" + +#define LEN_VFORMULAS "\011" +#define TR_VFORMULAS "Somma\0 ""Media\0 ""Min\0 ""Max\0 ""Moltipl\0 ""Totalizza""Cella\0 ""Consumo\0 ""Distanza\0" + +#define LEN_VPREC "\004" +#define TR_VPREC "0.--""0.0 ""0.00" + +#define LEN_VCELLINDEX "\010" +#define TR_VCELLINDEX "Minore\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Maggiore""Delta\0" + +// ZERO TERMINATED STRINGS +#if defined(COLORLCD) + #define INDENT "\007" + #define LEN_INDENT 1 + #define INDENT_WIDTH 12 + #define BREAKSPACE "\036" +#else + #define INDENT "\001" + #define LEN_INDENT 1 + #define INDENT_WIDTH (FW/2) + #define BREAKSPACE " " +#endif + +#if defined(PCBTARANIS) + #define TR_ENTER "[ENTER]" +#else + #define TR_ENTER "[Menù]" +#endif + +#define TR_EXIT "[EXIT]" + +#if defined(PCBTARANIS) + #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +#else + #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define OFS_EXIT sizeof(TR_ENTER) +#endif + +#define TR_MENUWHENDONE CENTER "\007" TR_ENTER " Conferma" +#define TR_FREE "disp" +#define TR_DELETEMODEL "Elimina modello?" +#define TR_COPYINGMODEL "Copia in corso.." +#define TR_MOVINGMODEL "Spostamento..." +#define TR_LOADINGMODEL "Caricamento..." +#define TR_NAME "Nome" +#define TR_MODELNAME "Nome modello" +#define TR_PHASENAME "Nome fase" +#define TR_MIXNAME "Nome mix" +#define TR_INPUTNAME "Nome Ingr." +#if defined(VIRTUALINPUTS) + #define TR_EXPONAME "Nome expo" +#else + #define TR_EXPONAME "Nome Expo" +#endif +#define TR_BITMAP "Immagine" +#define TR_TIMER TR("Timer","Timer ") +#define TR_ELIMITS TR("Limiti.E","Limiti Estesi") +#define TR_ETRIMS TR("Trim Ext","Trim Estesi") +#define TR_TRIMINC "Passo Trim" +#define TR_DISPLAY_TRIMS "Mostra Trims" +#define TR_TTRACE TR("T-Source", INDENT "Sorgente Motore") +#define TR_TTRIM TR("T-Trim", INDENT "Trim Motore") +#define TR_BEEPCTR TR("Ctr Beep","Beep al centro") +#define TR_USE_GLOBAL_FUNCS "Usa Funz Globali" +#if defined(PCBSKY9X) && defined(REVX) + #define TR_OUTPUT_TYPE INDENT "Output" +#endif +#define TR_PROTO TR(INDENT "Proto", INDENT "Protocollo") +#if defined(CPUARM) + #define TR_PPMFRAME INDENT "PPM frame" +#else + #define TR_PPMFRAME "PPM frame" +#endif +#define TR_MS "ms" +#define TR_SWITCH "Inter." +#define TR_TRIMS "Trims" +#define TR_FADEIN "Diss.In" +#define TR_FADEOUT "Diss.Out" +#define TR_DEFAULT "(Predefinita)" +#define TR_CHECKTRIMS CENTER "\006Check\012Trims" +#define OFS_CHECKTRIMS CENTER_OFS+(9*FW) +#define TR_SWASHTYPE "Tipo Ciclico" +#define TR_COLLECTIVE TR("Collettivo","Origine Collettivo") +#define TR_AILERON "Lateral cyc. source" +#define TR_ELEVATOR "Long. cyc. source" +#define TR_SWASHRING "Anello Ciclico" +#define TR_ELEDIRECTION TR("Direzione ELE","Direzione Long. cyc.") +#define TR_AILDIRECTION TR("Direzione AIL","Direzione Lateral cyc.") +#define TR_COLDIRECTION TR("Direzione PIT","Direzione Coll. Passo") +#define TR_MODE INDENT"Modo" +#define TR_NOFREEEXPO "Expo pieni!" +#define TR_NOFREEMIXER "Mixer pieni!" +#define TR_SOURCE INDENT"Sorg." +#define TR_WEIGHT "Peso" +#define TR_EXPO "Espo" +#define TR_SIDE "Lato" +#define TR_DIFFERENTIAL "Differ" +#define TR_OFFSET INDENT"Offset" +#define TR_TRIM "Trim" +#define TR_DREX "DRex" +#define DREX_CHBOX_OFFSET 30 +#define TR_CURVE "Curva" +#define TR_FLMODE "Fase" +#define TR_MIXWARNING "Avviso" +#define TR_OFF "OFF" +#define TR_MULTPX "MultPx" +#define TR_DELAYDOWN "Post.Giù " +#define TR_DELAYUP "Post.Sù" +#define TR_SLOWDOWN "Rall.Giù " +#define TR_SLOWUP "Rall.Sù" +#define TR_MIXER "MIXER" +#define TR_CV "CV" +#define TR_GV "GV" +#define TR_ACHANNEL "A\002ingresso" +#define TR_RANGE TR(INDENT"Inter.", INDENT"Intervallo") +#define TR_CENTER INDENT "Centro" +#define TR_BAR "Barra" +#define TR_ALARM TR(INDENT"Allar.", INDENT"Allarme") +#define TR_USRDATA "Dati" +#define TR_BLADES INDENT"Pale" +#define TR_SCREEN "Schermo " +#define TR_SOUND_LABEL "Suono" +#define TR_LENGTH INDENT"Durata" +#define TR_BEEP_LENGTH INDENT "Lung. Beep" +#define TR_SPKRPITCH INDENT"Tono" +#define TR_HAPTIC_LABEL "Vibraz" +#define TR_HAPTICSTRENGTH INDENT"Forza" +#define TR_CONTRAST "Contrasto" +#define TR_ALARMS_LABEL "Allarmi" +#define TR_BATTERY_RANGE TR("Interv. Batt", "Intervallo batteria") +#define TR_BATTERYWARNING INDENT"Avviso batteria" +#define TR_INACTIVITYALARM INDENT"Inattivita'" +#define TR_MEMORYWARNING INDENT"Avviso memoria" +#define TR_ALARMWARNING INDENT"Spegni suono" +#define TR_RENAVIG "Navig EncRot " +#define TR_THROTTLE_LABEL "Motore" +#define TR_THROTTLEREVERSE TR("Mot inv.", INDENT "Motore Inverso") +#define TR_TIMER_NAME INDENT "Nome" +#define TR_MINUTEBEEP INDENT"Minuto" +#define TR_BEEPCOUNTDOWN TR(INDENT"Conto rov", INDENT"Conto rovescia") +#define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente") +#define TR_BACKLIGHT_LABEL TR("Retroillum.", "Retroilluminazione") +#define TR_BLDELAY INDENT"Durata" +#define TR_BLONBRIGHTNESS TR(INDENT"Lumin. ON",INDENT"Luminosità ON") +#define TR_BLOFFBRIGHTNESS TR(INDENT"Lumin. OFF",INDENT"Luminosità OFF") +#define TR_BLCOLOR INDENT "Colore" +#define TR_SPLASHSCREEN TR("Schermo avvio", "Schermata di avvio") +#define TR_THROTTLEWARNING TR("All. Mot.", INDENT "Allarme Motore") +#define TR_SWITCHWARNING TR("Avv. Int.", INDENT "Avviso Interr.") +#define TR_POTWARNING TR("Avv. Pot.", INDENT "Avviso Pot.") +#define TR_TIMEZONE "Ora locale" +#define TR_ADJUST_RTC INDENT "Aggiusta RTC" +#define TR_GPS "GPS" +#define TR_RXCHANNELORD "Ordine ch RX" +#define TR_STICKS "Sticks" +#define TR_POTS "Pot." +#define TR_SWITCHES "Interutt." +#define TR_SWITCHES_DELAY "Ritardo voce FV" +#define TR_SLAVE "Allievo" +#define TR_MODESRC "Modo\006% Origine" +#define TR_MULTIPLIER "Moltiplica" +#define TR_CAL "Cal" +#define TR_VTRIM "Trim- +" +#define TR_BG "BG:" +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) + #define TR_MENUTOSTART TR_ENTER " TO START" + #define TR_SETMIDPOINT "CENTRA STICKS/SLIDERS" + #define TR_MOVESTICKSPOTS "MUOVI STICKS/POTS" +#else + #define TR_MENUTOSTART CENTER"\011" TR_ENTER " per Cal." + #define TR_SETMIDPOINT CENTER"\012SETTA CENTRO" + #define TR_MOVESTICKSPOTS CENTER"\010MUOVI STICK/POT" +#endif +#define TR_RXBATT "Batt Rx:" +#define TR_TXnRX "Tx:\0Rx:" +#define OFS_RX 4 +#define TR_ACCEL "Acc:" +#define TR_NODATA CENTER"DATI ASSENTI" +#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" +#define TR_TMR1LATMAXUS "Tmr1Lat max\037\124us" +#define STR_US (STR_TMR1LATMAXUS+13) +#define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" +#define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" + +#if defined(CPUARM) + #define TR_TMIXMAXMS "Tmix max" + #define TR_FREESTACKMINB "Free Stack" +#else + #define TR_TMIXMAXMS "Tmix max\037\124ms" + #define TR_FREESTACKMINB "Free Stack\037\124b" +#endif + +#define TR_MENUTORESET CENTER TR_ENTER" x Azzerare" +#define TR_PPM_TRAINER "TR" +#define TR_CH "CH" +#define TR_MODEL "MODELLO" +#define TR_FP "FV" +#define TR_MIX "MIX" +#define TR_EEPROMLOWMEM "EEPROM quasi piena!" +#define TR_ALERT "\016ALERT" +#define TR_PRESSANYKEYTOSKIP "\010Premi un tasto" +#define TR_THROTTLENOTIDLE TR("Motore non in posiz.","Motore non in posizione") +#define TR_ALARMSDISABLED "Avvisi Disattivati!" +#define TR_PRESSANYKEY "\010Premi un tasto" +#define TR_BADEEPROMDATA "Dati corrotti!" +#define TR_BAD_RADIO_DATA "Bad Radio Data" +#define TR_EEPROMFORMATTING "Formatto EEPROM..." +#define TR_STORAGE_FORMAT "Storage Preparation" +#define TR_EEPROMOVERFLOW "EEPROM Piena" +#define TR_MENURADIOSETUP "CONFIGURATX" +#define TR_MENUDATEANDTIME "DATA E ORA" +#define TR_MENUTRAINER "MAESTRO/ALLIEVO" +#define TR_MENUGLOBALFUNCS "FUNZIONI GLOBALI" +#define TR_MENUVERSION "VERSIONE" +#define TR_MENUDIAG "DIAG" +#define TR_MENUANA "ANAS" +#define TR_MENUCALIBRATION "CALIBRAZIONE" +#if defined(COLORLCD) + #define TR_TRIMS2OFFSETS "Trims >> Subtrims" +#else + #define TR_TRIMS2OFFSETS "\006Trim => Offset " +#endif +#define TR_MENUMODELSEL "MODELLI" +#define TR_MENUSETUP "CONFIGURA" +#define TR_MENUFLIGHTPHASE "FASE DI VOLO" +#define TR_MENUFLIGHTPHASES "FASI DI VOLO" +#define TR_MENUHELISETUP "CONFIGURA ELI" + +#if defined(VIRTUALINPUTS) + #define TR_MENUINPUTS "INGRESSI" + #define TR_MENULIMITS "USCITE" +#else + #define TR_MENUINPUTS "DR/ESPO" + #define TR_MENULIMITS "LIMITI" +#endif + +#define TR_MENUCURVES "CURVE" +#define TR_MENUCURVE "CURVA" +#define TR_MENULOGICALSWITCH "INTER. PERSON." +#define TR_MENULOGICALSWITCHES TR("INTER. LOGICI","INTERRUTTORI LOGICI") +#define TR_MENUCUSTOMFUNC TR("FUNZ. SPECIALI","FUNZIONI SPECIALI") +#define TR_MENUCUSTOMSCRIPTS "SCRIPTS UTENTE" +#define TR_MENUTELEMETRY "TELEMETRIA" +#define TR_MENUTEMPLATES "ESEMPI GUIDA" +#define TR_MENUSTAT "STATO" +#define TR_MENUDEBUG "DEBUG" +#if defined(CPUARM) + #define TR_RXNUM TR(INDENT "RxNum", INDENT "Ricevente No.") +#else + #define TR_RXNUM "RxNum" +#endif +#define TR_SYNCMENU "[Sync]" +#define TR_LIMIT INDENT "Limiti" +#define TR_MINRSSI "Min Rssi" +#define TR_LATITUDE "Latitud." +#define TR_LONGITUDE "Longitud." +#define TR_GPSCOORD TR("GPS Coords", INDENT "Formato Coordinate") +#define TR_VARIO TR("Vario", "Variometro") +#define TR_PITCH_AT_ZERO INDENT "Tono a Zero" +#define TR_PITCH_AT_MAX INDENT "Tono al Max" +#define TR_REPEAT_AT_ZERO INDENT "Ripeti a Zero" +#define TR_POWEROFF "\027Power OFF..." +#define TR_SHUTDOWN "ARRESTO.." +#define TR_SAVEMODEL "Salvataggio dati modello" +#define TR_BATT_CALIB "Calibra batt." +#define TR_CURRENT_CALIB "Calibra corr." +#define TR_VOLTAGE TR(INDENT "Voltagg.",INDENT "Voltaggio") +#define TR_CURRENT TR(INDENT "Corrente",INDENT "Corrente") +#define TR_SELECT_MODEL "Scegli Memo." +#define TR_CREATE_CATEGORY "Create Category" +#define TR_RENAME_CATEGORY "Rename Category" +#define TR_DELETE_CATEGORY "Delete Category" +#define TR_CREATE_MODEL "Crea Modello" +#define TR_DUPLICATE_MODEL "Duplicate Model" +#define TR_CHANGE_CATEGORY "Change category" +#define TR_COPY_MODEL "Copia Modello" +#define TR_MOVE_MODEL "Sposta Modello" +#define TR_BACKUP_MODEL "Salva Modello" +#define TR_DELETE_MODEL TR("Elim. Modello","Elimina Modello") // TODO merged into DELETEMODEL? +#define TR_RESTORE_MODEL TR("Ripr. Modello","Ripristina Modello") +#define TR_SDCARD_ERROR "Errore SD" +#define TR_NO_SDCARD "No SDCARD" +#define TR_SDCARD_FULL "SD Card Piena" +#define TR_INCOMPATIBLE "Incompatibile" +#define TR_WARNING "AVVISO" +#define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" +#define TR_EEPROM_CONVERTING "Conversione EEPROM" +#define TR_THROTTLEWARN "MOTORE" +#define TR_ALARMSWARN "ALLARMI" +#define TR_SWITCHWARN "CONTROLLI" +#define TR_FAILSAFEWARN "FAILSAFE" +#define TR_NO_FAILSAFE "Failsafe non settato" +#define TR_KEYSTUCK "Tasto bloccato" +#define TR_INVERT_THR "Inverti Mot?" +#define TR_SPEAKER_VOLUME "Volume Audio" +#define TR_LCD "LCD" +#define TR_BRIGHTNESS INDENT "Luminosità" +#define TR_CPU_TEMP "Temp CPU \016>" +#define TR_CPU_CURRENT "Corrente\022>" +#define TR_CPU_MAH "Consumo" +#define TR_COPROC "CoProc." +#define TR_COPROC_TEMP "Temp. MB \016>" +#define TR_CAPAWARNING INDENT "CapacitàLow" +#define TR_TEMPWARNING INDENT "Temp. Alta" +#define TR_FUNC "Funz" +#define TR_V1 "V1" +#define TR_V2 "V2" +#define TR_DURATION "Durata" +#define TR_DELAY "Ritardo" +#define TR_SD_CARD "SD Card" +#define TR_SDHC_CARD "SD-HC Card" +#define TR_NO_SOUNDS_ON_SD "No Suoni su SD" +#define TR_NO_MODELS_ON_SD "No Model. su SD" +#define TR_NO_BITMAPS_ON_SD "No Immag. su SD" +#define TR_NO_SCRIPTS_ON_SD "No Scripts su SD" +#define TR_SCRIPT_SYNTAX_ERROR "Script errore sintassi" +#define TR_SCRIPT_PANIC "Script panic" +#define TR_SCRIPT_KILLED "Script fermato" +#define TR_SCRIPT_ERROR "Errore sconosciuto" +#define TR_PLAY_FILE "Suona" +#define TR_DELETE_FILE "Elimina" +#define TR_COPY_FILE "Copia" +#define TR_RENAME_FILE "Rinomomina" +#define TR_ASSIGN_BITMAP "Assegna Immagine" +#define TR_EXECUTE_FILE "Esegui" +#define TR_REMOVED " rimosso" +#define TR_SD_INFO "Informazioni" +#define TR_SD_FORMAT "Format" +#define TR_NA "N/A" +#define TR_HARDWARE "HARDWARE" +#define TR_FORMATTING "Formattazione." +#define TR_TEMP_CALIB "Temp. Calib" +#define TR_TIME "Ora" +#define TR_BAUDRATE "BT Baudrate" +#define TR_SD_INFO_TITLE "SD INFO" +#define TR_SD_TYPE "Tipo:" +#define TR_SD_SPEED "Veloc.:" +#define TR_SD_SECTORS "Settori:" +#define TR_SD_SIZE "Dimens:" +#define TR_TYPE INDENT "Tipo" +#define TR_GLOBAL_VARS "Variabili Globali" +#define TR_GVARS "V.GLOBALI" +#define TR_GLOBAL_VAR "Variabile globale" +#define TR_MENUGLOBALVARS "VARIABILI GLOBALI" +#define TR_OWN "Fase" +#define TR_DATE "Data" +#define TR_ROTARY_ENCODER "R.Encs" +#define TR_CHANNELS_MONITOR "MONITOR CANALI" +#define TR_MIXERS_MONITOR "MONITOR MIXER" +#define TR_PATH_TOO_LONG "Path troppo lungo" +#define TR_VIEW_TEXT "Vedi testo" +#define TR_FLASH_BOOTLOADER "Flash BootLoader" +#define TR_FLASH_EXTERNAL_DEVICE "Progr. Dispositivo Esterno" +#define TR_FLASH_INTERNAL_MODULE "Progr. Modulo Interno" +#define TR_WRITING "\032Scrivendo..." +#define TR_CONFIRM_FORMAT "Confermi Format?" +#define TR_INTERNALRF "Modulo Interno" +#define TR_EXTERNALRF "Modulo esterno" +#define TR_FAILSAFE "Modo failsafe" +#define TR_FAILSAFESET TR("FAILSAFE","IMPOSTAZIONI FAILSAFE") +#define TR_MENUSENSOR "SENSOR" +#define TR_SENSOR "SENSOR" +#define TR_COUNTRYCODE TR("Codice Paese","Standard 2.4Ghz") +#define TR_VOICELANG "Lingua Voce" +#define TR_UNITSSYSTEM "Unità" +#define TR_EDIT "Modifica" +#define TR_INSERT_BEFORE "Inserisci prima" +#define TR_INSERT_AFTER "Inserisci dopo" +#define TR_COPY "Copia" +#define TR_MOVE "Sposta" +#define TR_PASTE "Incolla" +#define TR_DELETE "Elimina" +#define TR_INSERT TR("Inser.","Inserisci") +#define TR_RESET_FLIGHT "Azzera volo" +#define TR_RESET_TIMER1 "Azzera Timer1" +#define TR_RESET_TIMER2 "Azzera Timer2" +#define TR_RESET_TIMER3 "Azzera Timer3" +#define TR_RESET_TELEMETRY "Azzera Telemetria" +#define TR_STATISTICS "Statistiche" +#define TR_ABOUT_US "Info su" +#define TR_SETUP_SCREENS "Setup screens" +#define TR_AND_SWITCH "Inter. AND" +#define TR_SF "CF" +#define TR_GF "GF" +#define TR_SPEAKER INDENT"Speaker" +#define TR_BUZZER INDENT"Buzzer" +#define TR_BYTES "Bytes" +#define TR_MODULE_BIND "[Bind]" +#define TR_MODULE_RANGE "[Range]" +#define TR_RESET_BTN "[Reset]" +#define TR_SET "[Set]" +#define TR_TRAINER TR("Trainer","Maestro/Allievo") +#define TR_ANTENNAPROBLEM CENTER "Problemi antenna TX!" +#define TR_MODELIDUSED TR("ID già usato","ID Modello già usato") +#define TR_MODULE INDENT "Modulo" +#define TR_TELEMETRY_TYPE "Tipo Telemetria" +#define TR_TELEMETRY_SENSORS "Sensori" +#define TR_VALUE "Valore" +#define TR_TOPLCDTIMER "Timer LCD Sup." +#define TR_UNIT "Unita" +#define TR_TELEMETRY_NEWSENSOR INDENT "Aggiungi nuovo sensore..." +#define TR_CHANNELRANGE INDENT "Numero Canali" +#define TR_LOWALARM INDENT "Allarme Basso" +#define TR_CRITICALALARM INDENT "Allarme Critico" +#define TR_ENABLE_POPUP "Abilita Popup" +#define TR_DISABLE_POPUP "Disabilita Popup" +#define TR_POPUP "Popup" +#define TR_MIN "Min" +#define TR_MAX "Max" +#define TR_CURVE_PRESET "Preimpostate..." +#define TR_PRESET "Preimpostate" +#define TR_MIRROR "Mirror" +#define TR_CLEAR "Cancella" +#define TR_RESET "Azzera" +#define TR_RESET_SUBMENU "Azzera..." +#define TR_COUNT "Punti" +#define TR_PT "pt" +#define TR_PTS "pti" +#define TR_SMOOTH "Smussa" +#define TR_COPY_STICKS_TO_OFS "Copia Stick su Offset" +#define TR_COPY_TRIMS_TO_OFS "Copia Trim in Subtrim" +#define TR_INCDEC "Inc/Decrementa" +#define TR_GLOBALVAR "Var Globale" +#define TR_MIXSOURCE "Sorgente Mixer" +#define TR_CONSTANT "Constante" +#define TR_PERSISTENT_MAH INDENT "Memo mAh" +#define TR_PREFLIGHT "Controlli Prevolo" +#define TR_CHECKLIST INDENT "Mostra Checklist" +#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") +#define TR_UART3MODE "Porta Seriale" +#define TR_SCRIPT "Script" +#define TR_INPUTS "Ingresso" +#define TR_OUTPUTS "Uscita" +#define TR_EEBACKUP "\004[ENTER Lungo] per copiare la EEPROM" +#define TR_FACTORYRESET "\012[MENU Lungo]: Inizializza dati" +#define TR_CONFIRMRESET "Resettare TUTTI i dati?" +#define TR_TO_MANY_LUA_SCRIPTS "Troppi Scripts Lua!" + +#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 "Setta Mavlink" + #define TR_MAVLINK_BAUD_LABEL "Baudrate" + #define TR_MAVLINK_INFOS "INFOS" + #define TR_MAVLINK_MODE "MODO" + #define TR_MAVLINK_CUR_MODE "Modo Corrente" + #define TR_MAVLINK_ARMED "Armato" + #define TR_MAVLINK_BAT_MENU_TITLE "BAT RSSI" + #define TR_MAVLINK_BATTERY_LABEL "Stato batteria di volo" + #define TR_MAVLINK_RC_RSSI_LABEL "RC RSSI" + #define TR_MAVLINK_PC_RSSI_LABEL "PC RSSI" + #define TR_MAVLINK_NAV_MENU_TITLE "NAV" + #define TR_MAVLINK_COURSE "Course" + #define TR_MAVLINK_HEADING "Heading" + #define TR_MAVLINK_BEARING "Bearing" + #define TR_MAVLINK_ALTITUDE "Altitudine" + #define TR_MAVLINK_GPS "GPS" + #define TR_MAVLINK_NO_FIX "NO Fix" + #define TR_MAVLINK_SAT "SAT" + #define TR_MAVLINK_HDOP "HDOP" + #define TR_MAVLINK_LAT "LAT" + #define TR_MAVLINK_LON "LON" +#endif + +// Taranis column headers +#define TR_PHASES_HEADERS { " Nome ", " Inter. ", " Trim Deriva ", " Trim Elevator ", " Trim Motore ", " Trim Alettoni ", " Disolv. In ", " Dissolv. Out " } +#define TR_LIMITS_HEADERS { " Nome ", " Offset ", " Min ", " Max ", " Direzione ", " Curve ", " Centro PPM ", " Simmetria " } +#define TR_CSW_HEADERS { " Funzione ", " V1 ", " V2 ", " V2 ", " Inter. AND ", " Durata ", " Ritardo " } + +// About screen +#define TR_ABOUTUS TR(" INFO ", "INFO SU") + +#define TR_ABOUT_OPENTX_1 TR("OpenTX\001e'\001open\001source,\001non", "OpenTX e' open source, non-") +#define TR_ABOUT_OPENTX_2 TR("commercial,\001wo\001warranties.", "commerciale, fornito senza") +#define TR_ABOUT_OPENTX_3 TR("It\001was\001developed\001for\001free.", "garanzie. E' stato sviluppato") +#define TR_ABOUT_OPENTX_4 TR("Support through donations", "gratuitamente. Il supporto") +#define TR_ABOUT_OPENTX_5 TR("is welcome!", "mediante donazioni e' gradito!") + +#define TR_ABOUT_BERTRAND_1 "Bertrand Songis" +#define TR_ABOUT_BERTRAND_2 "Autore principale OpenTX" +#define TR_ABOUT_BERTRAND_3 "Co-autore Companion9x" + +#define TR_ABOUT_MIKE_1 "Mike Blandford" +#define TR_ABOUT_MIKE_2 "Guru codice e driver" +#define TR_ABOUT_MIKE_3 "esperto a basso livello" +#define TR_ABOUT_MIKE_4 "Ispiratore" + +#define TR_ABOUT_ROMOLO_1 "Romolo Manfredini" +#define TR_ABOUT_ROMOLO_2 "Autore Companion9x" +#define TR_ABOUT_ROMOLO_3 "" + +#define TR_ABOUT_ANDRE_1 "Andre Bernet" +#define TR_ABOUT_ANDRE_2 "Funzionalità, usabilità," +#define TR_ABOUT_ANDRE_3 "debugging, documentazione" + +#define TR_ABOUT_ROB_1 "Rob Thomson" +#define TR_ABOUT_ROB_2 "Webmaster openrcforums" + +#define TR_ABOUT_KJELL_1 "Kjell Kernen" +#define TR_ABOUT_KJELL_2 "www.open-tx.org main author" +#define TR_ABOUT_KJELL_3 "OpenTX Recorder author" +#define TR_ABOUT_KJELL_4 "Companion contributor" + +#define TR_ABOUT_MARTIN_1 "Martin Hotar" +#define TR_ABOUT_MARTIN_2 "Graphic Designer" + +#if defined(PCBTARANIS) + #define TR_ABOUT_HARDWARE_1 "FrSky" + #define TR_ABOUT_HARDWARE_2 "Disegno/produzione Hardware" + #define TR_ABOUT_HARDWARE_3 "Contributi al Firmware" +#else + #define TR_ABOUT_HARDWARE_1 "Brent Nelson" + #define TR_ABOUT_HARDWARE_2 "Designer/Produttore SKY9X" + #define TR_ABOUT_HARDWARE_3 "" +#endif + +#define TR_ABOUT_PARENTS_1 "Progetti correlati" +#define TR_ABOUT_PARENTS_2 "ersky9x (Mike Blandford)" +#define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" +#define TR_ABOUT_PARENTS_4 "TH9X (Thomas Husterer)" + +#define TR_CHR_SHORT 's' +#define TR_CHR_LONG 'l' +#define TR_CHR_TOGGLE 't' +#define TR_CHR_HOUR 'h' +#define TR_CHR_INPUT 'I' // Values between A-I will work + +#define TR_BEEP_VOLUME "Volume Beep" +#define TR_WAV_VOLUME "Volume Wav" +#define TR_VARIO_VOLUME "Volume Vario" +#define TR_BG_VOLUME "Volume Sf" + +#define TR_TOP_BAR "Barra sup." +#define TR_ALTITUDE INDENT "Altitudine" +#define TR_SCALE "Scala" +#define TR_VIEW_CHANNELS "Vedi Canali" +#define TR_VIEW_NOTES "Vedi Note" +#define TR_MODEL_SELECT "Model Select" +#define TR_MODS_FORBIDDEN "Modifica proibita!" +#define TR_UNLOCKED "Sbloccato" +#define TR_ID "ID" +#define TR_PRECISION "Precisione" +#define TR_RATIO "Ratio" +#define TR_FORMULA "Formula" +#define TR_CELLINDEX "Indice cella" +#define TR_LOGS "Logs" +#define TR_OPTIONS "Opzioni" + +#define TR_ALTSENSOR "Sensore Alt" +#define TR_CELLSENSOR "Sensore Cell" +#define TR_GPSSENSOR "Sensore GPS" +#define TR_CURRENTSENSOR "Sensore" +#define TR_AUTOOFFSET "Auto Offset" +#define TR_ONLYPOSITIVE "Positivo" +#define TR_FILTER "Filtro" +#define TR_TELEMETRYFULL "Tutti gli slot sono pieni!" +//TODO: translation +#define TR_INVERTED_SERIAL INDENT "Invert" +#define TR_IGNORE_INSTANCE TR(INDENT "No inst.","Ignora instanza") +#define TR_DISCOVER_SENSORS INDENT "Cerca nuovi sensori" +#define TR_STOP_DISCOVER_SENSORS INDENT "Ferma ricerca.." +#define TR_DELETE_ALL_SENSORS INDENT "Elimina tutti i sensori" +#define TR_CONFIRMDELETE "Confermi eliminazione?" +#define TR_SELECT_WIDGET "Select widget" +#define TR_REMOVE_WIDGET "Remove widget" +#define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" + +#define TR_MENU_INPUTS "\314Ingressi" +#define TR_MENU_LUA "\322Lua scripts" +#define TR_MENU_STICKS "\307Sticks" +#define TR_MENU_POTS "\310Pots" +#define TR_MENU_MAX "\315MAX" +#define TR_MENU_HELI "\316Ciclico" +#define TR_MENU_TRIMS "\313Trims" +#define TR_MENU_SWITCHES "\312Interrut." +#define TR_MENU_LOGICAL_SWITCHES "\312Interrut. Logici" +#define TR_MENU_TRAINER "\317Trainer" +#define TR_MENU_CHANNELS "\320Canali" +#define TR_MENU_GVARS "\311GVars" +#define TR_MENU_TELEMETRY "\321Telemetry" +#define TR_MENU_OTHER "Altro" +#define TR_MENU_INVERT "Inverti" + +#define ZSTR_RSSI "RSSI" +#define ZSTR_SWR "SWR" +#define ZSTR_A1 "A1" +#define ZSTR_A2 "A2" +#define ZSTR_A3 "A3" +#define ZSTR_A4 "A4" +#define ZSTR_BATT "RxBt" +#define ZSTR_ALT "Alt" +#define ZSTR_TEMP1 "Tmp1" +#define ZSTR_TEMP2 "Tmp2" +#define ZSTR_RPM "RPM" +#define ZSTR_FUEL "Fuel" +#define ZSTR_VSPD "VSpd" +#define ZSTR_ACCX "AccX" +#define ZSTR_ACCY "AccY" +#define ZSTR_ACCZ "AccZ" +#define ZSTR_CURR "Curr" +#define ZSTR_VFAS "VFAS" +#define ZSTR_ASPD "ASpd" +#define ZSTR_GSPD "GSpd" +#define ZSTR_HDG "Hdg" +#define ZSTR_CELLS "Cels" +#define ZSTR_GPSALT "GAlt" +#define ZSTR_GPSDATETIME "Data" +#define ZSTR_GPS "GPS" +#define ZSTR_BATT1_VOLTAGE "RB1V" +#define ZSTR_BATT2_VOLTAGE "RB2V" +#define ZSTR_BATT1_CURRENT "RB1A" +#define ZSTR_BATT2_CURRENT "RB2A" +#define ZSTR_BATT1_CONSUMPTION "RB1C" +#define ZSTR_BATT2_CONSUMPTION "RB2C" +#define ZSTR_RB_STATE "RBS" +#define ZSTR_CHANS_STATE "RBCS" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 2139a4dc1..239b26ed2 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1,29 +1,12 @@ - /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Jean-Pierre van Melis - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -34,6 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + */ + +// NL translations author: who? + +/* * !!!!! DO NOT EDIT nl.h - EDIT nl.h.txt INSTEAD !!!!!!! * * In order to make translations easier nl.h.txt is parsed and national @@ -43,9 +31,8 @@ * !!!!! DO NOT EDIT nl.h - EDIT nl.h.txt INSTEAD !!!!!!! */ - - -/* Formatting octal codes available in TR_ strings: +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -53,6 +40,8 @@ * \0 -ends current string */ + + // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "UIT""AAN" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 0dbc2a164..1114573f5 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1,28 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Jacek Drewniak - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -33,6 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + */ + +// PL translations author: Jacek Drewniak + +/* * !!!!! DO NOT EDIT pl.h - EDIT pl.h.txt INSTEAD !!!!!!! * * In order to make translations easier pl.h.txt is parsed and national @@ -43,9 +32,8 @@ * */ - - -/* Formatting octal codes available in TR_ strings: +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -53,6 +41,7 @@ * \0 -ends current string */ + // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "WYŁ""ZAŁ" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 167326cc9..3ea2ba070 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1,1125 +1,1116 @@ -/* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini - * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * - * - * !!!!! DO NOT EDIT pt.h - EDIT pt.h.txt INSTEAD !!!!!!! - * - * In order to make translations easier pt.h.txt is parsed and national - * characters are replaced by bitmap codes. The result is pt.h. - * - * See translate.py in the util folder for the list of character codes - * - * !!!!! DO NOT EDIT pt.h - EDIT pt.h.txt INSTEAD !!!!!!! - */ - /* Formatting octal codes available in TR_ strings: - * \037\x -sets LCD x-coord (x value in octal) - * \036 -newline - * \035 -horizontal tab (ARM only) - * \001 to \034 -extended spacing (value * FW/2) - * \0 -ends current string - */ - - - - - - - - - - - -// NON ZERO TERMINATED STRINGS -#define LEN_OFFON "\003" -#define TR_OFFON "OFF""ON\0" - -#define LEN_MMMINV "\003" -#define TR_MMMINV "---""INV" - -#define LEN_NCHANNELS "\004" -#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH" - -#define LEN_VBEEPMODE "\005" -#define TR_VBEEPMODE "Mudo ""Alarm""NoKey""Todo " - -#define LEN_VBEEPLEN "\005" -#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0" - -#define LEN_VRENAVIG "\003" -#define TR_VRENAVIG "No REaREb" - -#define LEN_VBLMODE "\004" -#define TR_VBLMODE "OFF ""Chav""Stks""Tudo""ON\0" - -#define LEN_TRNMODE "\003" -#define TR_TRNMODE "OFF"" +="" :=" - -#define LEN_TRNCHN "\003" -#define TR_TRNCHN "CH1CH2CH3CH4" - -#define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""Debug\0" - -#define LEN_SWTYPES "\006" -#define TR_SWTYPES "None\0 ""Toggle""2POS\0 ""3POS\0" - -#define LEN_POTTYPES "\017" -#define TR_POTTYPES "None\0 ""Pot with detent""Multipos Switch""Pot\0" - -#define LEN_SLIDERTYPES "\006" -#define TR_SLIDERTYPES "Rien\0 ""Slider" - -#define LEN_DATETIME "\005" -#define TR_DATETIME "DATA:""HORA:" - -#define LEN_VLCD "\006" -#define TR_VLCD "NormalOptrex" - -#define LEN_VPERSISTENT "\014" -#define TR_VPERSISTENT "OFF\0 ""Flight\0 ""Manual Reset" - -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0") - -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" - -#define LEN_XJT_PROTOCOLS "\004" -#define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" - -#define LEN_DSM_PROTOCOLS "\004" -#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" - -#define LEN_VTRIMINC "\006" -#define TR_VTRIMINC "Expo ""ExFino""Fino ""Medio ""Largo " - -#define LEN_VDISPLAYTRIMS "\006" -#define TR_VDISPLAYTRIMS "No\0 ""Change""Yes\0" - -#define LEN_VBEEPCOUNTDOWN "\006" -#define TR_VBEEPCOUNTDOWN "SilentBeeps\0Voice\0Haptic" - -#define LEN_VVARIOCENTER "\006" -#define TR_VVARIOCENTER "Tone\0 ""Silent" - -#define LEN_CURVE_TYPES "\010" -#define TR_CURVE_TYPES "Standard""Custom\0" - -#define LEN_RETA123 "\001" - -#if defined(PCBTARANIS) || defined(REVX) - #define TR_RETA123 "LPMA123LR" -#elif defined(PCBSKY9X) - #define TR_RETA123 "LPMA123a" -#elif defined(CPUM2560) - #define TR_RETA123 "LPMA123ab" -#else - #define TR_RETA123 "LPMA123" -#endif - -#define LEN_VPROTOS "\006" - -#if defined(PXX) - #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) - #define TR_PXX "[PXX]\0" -#else - #define TR_PXX -#endif - -#if defined(DSM2) - #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" -#else - #define TR_DSM2 -#endif - -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - -#if defined(CPUARM) - #define TR_XPPM -#else - #define TR_XPPM "PPM16\0""PPMsim" -#endif - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS - -#define LEN_POSNEG "\003" -#define TR_POSNEG "POS""NEG" - -#if defined(PCBSKY9X) && defined(REVX) - #define LEN_VOUTPUT_TYPE "\011" - #define TR_VOUTPUT_TYPE "OpenDrain""PushPull\0" -#endif - -#define LEN_VCURVEFUNC "\003" -#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" - -#define LEN_VMLTPX "\011" -#define TR_VMLTPX "Adicionar""Multipl. ""Trocar\0 0" - -#define LEN_VMLTPX2 "\002" -#define TR_VMLTPX2 "+=""*="":=" - -#define LEN_VMIXTRIMS "\003" -#define TR_VMIXTRIMS "OFF""ON\0""Lem""Pfd""Mot""Ail" - -#if defined(PCBTARANIS) - #define TR_CSWTIMER "Timer" - #define TR_CSWSTICKY "Stcky" - #define TR_CSWRANGE "Range" - #define TR_CSWSTAY "Edge\0" -#else - #define TR_CSWTIMER "Tim\0 " - #define TR_CSWSTICKY "Glue\0" - #if defined(CPUARM) - #define TR_CSWRANGE "Rnge\0" - #define TR_CSWSTAY "Edge\0" - #else - #define TR_CSWRANGE - #define TR_CSWSTAY - #endif -#endif - -#if defined(CPUARM) - #define TR_CSWEQUAL "a=x\0 " -#else - #define TR_CSWEQUAL -#endif - -#define LEN_VCSWFUNC "\005" -#if defined(CPUARM) -#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a= 212 - #define TR_VTELEMCHNS "---\0 ""Batt\0" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Cells""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\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-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Time\0" -#else - #define TR_VTELEMCHNS "---\0""Batt" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\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""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Time" -#endif - -#define LENGTH_UNIT_IMP "ft\0" -#define SPEED_UNIT_IMP "mph" -#define LENGTH_UNIT_METR "m\0 " -#define SPEED_UNIT_METR "kmh" - -#if defined(CPUARM) - #define LEN_VUNITSSYSTEM TR("\006", "\010") - #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") - #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" -#else - #if defined(IMPERIAL_UNITS) - #define LENGTH_UNIT LENGTH_UNIT_IMP - #define SPEED_UNIT SPEED_UNIT_IMP - #else - #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 " -#endif - -#define STR_V (STR_VTELEMUNIT+1) -#define STR_A (STR_VTELEMUNIT+4) - -#define LEN_VALARM "\003" -#define TR_VALARM "---""Ama""Lar""Ver" - -#define LEN_VALARMFN "\001" -#define TR_VALARMFN "<>" - -#define LEN_VTELPROTO "\007" -#define TR_VTELPROTO "Nada\0 ""Hub\0 ""WSHHigh" - -#if defined(CPUARM) - #define LEN_AMPSRC TR("\003", "\007") - #define TR_AMPSRC TR("---""A1\0""A2\0""A3\0""A4\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells\0 ") - #define LEN_VOLTSRC TR("\003", "\007") - #define TR_VOLTSRC TR("A1\0""A2\0""A3\0""A4\0""FAS""Cel", "A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells\0 ") -#else - #define LEN_AMPSRC TR("\003", "\007") - #define TR_AMPSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Cells\0 ") -#endif - -#define LEN_VARIOSRC "\005" -#if defined(FRSKY_SPORT) - #define TR_VARIOSRC "Vario""A1\0 ""A2\0" -#else - #define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0" -#endif - -#define LEN_VTELEMSCREENTYPE "\004" -#define TR_VTELEMSCREENTYPE "Nums""Bars" - -#define LEN_GPSFORMAT "\004" -#define TR_GPSFORMAT "HMS NMEA" - -#define LEN2_VTEMPLATES 13 -#define LEN_VTEMPLATES "\015" -#define TR_VTEMPLATES "Tirar Mixagem""4CH Simples\0 ""Anular Motor\0""V-Tail\0 ""Elevon\\Zagi\0 ""eCCPM\0 ""Mixagem Heli\0""Testar Servos" - -#define LEN_VSWASHTYPE "\004" -#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" - -#define LEN_VKEYS "\005" -#define TR_VKEYS TR("Menu\0""Sair\0""Desce""Sobe\0""Direi""Esqda", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus") - -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - -#define LEN_VSWITCHES "\003" -#define LEN_VSRCRAW "\004" - -#if defined(PCBHORUS) - #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" -#elif defined(PCBFLAMENCO) - #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " - #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " -#elif defined(PCBTARANIS) && defined(REV9E) - #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" -#elif defined(PCBTARANIS) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" -#else - #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " - #define TR_SW_VSRCRAW "3POS" - #define TR_9X_3POS_SWITCHES "ID0""ID1""ID2" -#endif - -#if defined(CPUARM) - #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12""L13""L14""L15""L16""L17""L18""L19""L20""L21""L22""L23""L24""L25""L26""L27""L28""L29""L30""L31""L32" -#else - #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12" -#endif - -#define TR_TRIMS_SWITCHES TR("tRl""tRr""tEd""tEu""tTd""tTu""tAl""tAr", "\313Rl""\313Rr""\313Ed""\313Eu""\313\313d""\313\313u""\313Al""\313Ar") - -#if defined(PCBSKY9X) - #define TR_ROTARY_ENCODERS "REa\0" - #define TR_ROTENC_SWITCHES "REa" -#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560) - #define TR_ROTARY_ENCODERS "REa\0""REb\0" - #define TR_ROTENC_SWITCHES "REa""REb" -#else - #define TR_ROTARY_ENCODERS - #define TR_ROTENC_SWITCHES -#endif - -#if !defined(PCBTARANIS) - #define TR_PHYS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" -#endif - -#define TR_ON_ONE_SWITCHES "ON\0""One" - -#if defined(PCBFLAMENCO) - #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" -#elif defined(PCBTARANIS) || defined(PCBHORUS) - // only special switches here - #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES -#else - #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES -#endif - -#if defined(HELI) -#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3" -#else -#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" -#endif - -#define TR_VSRCRAW "---\0""Lem\0""Pfd\0""Mot\0""Ail\0" TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "MAX\0" TR_CYC_VSRCRAW "TrmL" "TrmP" "TrmM" "TrmA" TR_SW_VSRCRAW - -#define LEN_VTMRMODES "\003" -#define TR_VTMRMODES "OFF""ABS""MTs""MT%""MTt" - -#define LEN_VTRAINERMODES "\022" -#define TR_VTRAINERMODES "Master/Jack\0 ""Slave/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" - -#define LEN_VFAILSAFE "\011" -#define TR_VFAILSAFE "Not set\0 ""Hold\0 ""Custom\0 ""No pulses""Receiver\0" - -#if defined(MAVLINK) - #define LEN_MAVLINK_BAUDS "\006" - #define TR_MAVLINK_BAUDS "4800 ""9600 ""14400 ""19200 ""38400 ""57600 ""76800 ""115200" - #define LEN_MAVLINK_AC_MODES "\011" - #define TR_MAVLINK_AC_MODES "Stabilize""Acro ""Alt Hold ""Auto ""Guided ""Loiter ""RTL ""Circle ""Pos Hold ""Land ""OF Loiter""Toy A ""Toy M ""INVALID " - #define LEN_MAVLINK_AP_MODES "\015" - #define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID " -#endif - -#define LEN_VSENSORTYPES "\012" -#define TR_VSENSORTYPES "Custom\0 ""Calculated" - -#define LEN_VFORMULAS "\010" -#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Totalize""Cell\0 ""Consumpt""Distance" - -#define LEN_VPREC "\005" -#define TR_VPREC "PREC0""PREC1""PREC2" - -#define LEN_VCELLINDEX "\007" -#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0" - -// ZERO TERMINATED STRINGS -#define INDENT "\001" -#define LEN_INDENT 1 -#define INDENT_WIDTH (FW/2) - -#if defined(PCBTARANIS) - #define TR_ENTER "[ENTER]" -#else - #define TR_ENTER "[MENU]" -#endif - -#define TR_EXIT "[EXIT]" - -#if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -#else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT - #define OFS_EXIT sizeof(TR_ENTER) -#endif - -#define TR_MENUWHENDONE CENTER"\006"TR_ENTER"QDO PRONTO" -#define TR_FREE "Livre" -#define TR_DELETEMODEL "EXCLUI MODELO" -#define TR_COPYINGMODEL "Copiando modelo" -#define TR_MOVINGMODEL "Movendo modelo" -#define TR_LOADINGMODEL "Carregar modelo" -#define TR_NAME "Nome" -#define TR_MODELNAME "Model Name" -#define TR_PHASENAME "Phase Name" -#define TR_MIXNAME "Mix Name" -#define TR_INPUTNAME "Input Name" -#if defined(PCBTARANIS) - #define TR_EXPONAME "Line Name" -#else - #define TR_EXPONAME "Expo Name" -#endif -#define TR_BITMAP "Model Image" -#define TR_TIMER "Cronom" -#define TR_ELIMITS "E.Limits" -#define TR_ETRIMS "E.Trims" -#define TR_TRIMINC "Trim Step" -#define TR_DISPLAY_TRIMS "Display Trims" -#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_USE_GLOBAL_FUNCS "Use Global Funcs" -#if defined(PCBSKY9X) && defined(REVX) - #define TR_OUTPUT_TYPE INDENT "Output" -#endif -#define TR_PROTO INDENT"Proto" -#define TR_PPMFRAME "PPM frame" -#define TR_MS "ms" -#define TR_SWITCH "Chave" -#define TR_TRIMS "Trims" -#define TR_FADEIN "Aparecer" -#define TR_FADEOUT "Ocultar" -#define TR_DEFAULT "(default)" -#define TR_CHECKTRIMS "\006Check\012Trims" -#define OFS_CHECKTRIMS (9*FW) -#define TR_SWASHTYPE "Ciclico Tipo" -#define TR_COLLECTIVE "Coletivo" -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" -#define TR_SWASHRING "Anel Coletivo" -#define TR_ELEDIRECTION "PFD Sentido" -#define TR_AILDIRECTION "AIL Sentido" -#define TR_COLDIRECTION "COL Sentido" -#define TR_MODE INDENT"Modo" -#define TR_NOFREEEXPO "No free expo!" -#define TR_NOFREEMIXER "No free mixer!" -#define TR_SOURCE INDENT"Fonte" -#define TR_WEIGHT "Quantia" -#define TR_EXPO "Exponen" -#define TR_SIDE "Lado" -#define TR_DIFFERENTIAL "Diferencial" -#define TR_OFFSET INDENT"Desvio" -#define TR_TRIM "Trim" -#define TR_DREX "DRex" -#define DREX_CHBOX_OFFSET 30 -#define TR_CURVE "Curvas" -#define TR_FLMODE "Fase" -#define TR_MIXWARNING "Aviso" -#define TR_OFF "OFF" -#define TR_MULTPX "Aplicar" -#define TR_DELAYDOWN "Atraso Dn" -#define TR_DELAYUP "Atraso Up" -#define TR_SLOWDOWN "Lento Dn" -#define TR_SLOWUP "Lento Up" -#define TR_MIXER "MIXAGENS" -#define TR_CV "CV" -#define TR_GV "GV" -#define TR_ACHANNEL "A\004Canal" -#define TR_RANGE INDENT"Range" -#define TR_CENTER INDENT "Center" -#define TR_BAR "Bar" -#define TR_ALARM INDENT"Alarme" -#define TR_USRDATA "UsrData" -#define TR_BLADES INDENT"Helice" -#define TR_SCREEN "Tela" -#define TR_SOUND_LABEL "Som" -#define TR_LENGTH INDENT"Comprimento" -#define TR_BEEP_LENGTH INDENT "Beep Length" -#define TR_SPKRPITCH INDENT"Pitch" -#define TR_HAPTIC_LABEL "Vibrar" -#define TR_HAPTICSTRENGTH INDENT"Forca" -#define TR_CONTRAST "Contraste" -#define TR_ALARMS_LABEL "Alarmes" -#define TR_BATTERY_RANGE "Battery Range" -#define TR_BATTERYWARNING INDENT"Bateria Baixa" -#define TR_INACTIVITYALARM INDENT"Inactividade" -#define TR_MEMORYWARNING INDENT"Memoria Baixa" -#define TR_ALARMWARNING INDENT"Som Off" -#define TR_RENAVIG "RotEnc Navig" -#define TR_THROTTLE_LABEL "Throttle" -#define TR_THROTTLEREVERSE TR("Inverte Acel.", INDENT "Inverte Acel.") -#define TR_TIMER_NAME INDENT "Name" -#define TR_MINUTEBEEP INDENT "Beep Minuto" -#define TR_BEEPCOUNTDOWN INDENT "Beep Regressivo" -#define TR_PERSISTENT INDENT "Persist." -#define TR_BACKLIGHT_LABEL "Backlight" -#define TR_BLDELAY INDENT "Tempo Backlight" -#define TR_BLONBRIGHTNESS INDENT "ON Brightness" -#define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness" -#define TR_BLCOLOR INDENT "Color" -#define TR_SPLASHSCREEN "Splash screen" -#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_ADJUST_RTC INDENT "Adjust RTC" -#define TR_GPS "GPS" -#define TR_RXCHANNELORD "Ordem Canal RX" -#define TR_STICKS "Sticks" -#define TR_POTS "Pots" -#define TR_SWITCHES "Switches" -#define TR_SWITCHES_DELAY "Switches Delay" -#define TR_SLAVE "Escravo" -#define TR_MODESRC "Modo\006% Fonte" -#define TR_MULTIPLIER "Multiplicar" -#define TR_CAL "Cal" -#define TR_VTRIM "Trim- +" -#define TR_BG "BG:" -#if defined(PCBHORUS) - #define TR_MENUTOSTART "Press [Enter] to start" - #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" - #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" -#else - #define TR_MENUTOSTART CENTER"\011" TR_ENTER " INICIAR" - #define TR_SETMIDPOINT TR(CENTER"\005CENTRAR STICK/POT",CENTER"\006CENTRAR STICK/POT") - #define TR_MOVESTICKSPOTS TR(CENTER"\005MOVER STICKS/POTs",CENTER"\006MOVER STICKS/POTs") -#endif -#define TR_RXBATT "Rx Batt:" -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 -#define TR_ACCEL "Acc:" -#define TR_NODATA CENTER"SEM DADOS" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" -#define TR_TMR1LATMAXUS "Tmr1Lat max\037\124us" -#define STR_US (STR_TMR1LATMAXUS+13) -#define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" -#define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" - -#if defined(CPUARM) - #define TR_TMIXMAXMS "Tmix max" - #define TR_FREESTACKMINB "Free Stack" -#else - #define TR_TMIXMAXMS "Tmix max\037\124ms" - #define TR_FREESTACKMINB "Pilha Livre\037\124b" -#endif - -#define TR_MENUTORESET CENTER TR_ENTER" Reinicia" -#define TR_PPM_TRAINER "TR" -#define TR_CH "CH" -#define TR_MODEL "MODEL" -#define TR_FP "FP" -#define TR_MIX "MIX" -#define TR_EEPROMLOWMEM "EEPROM BX Memoria" -#define TR_ALERT "\016ALERT" -#define TR_PRESSANYKEYTOSKIP "Pulsar Tecla p/ sair" -#define TR_THROTTLENOTIDLE "**ACELERADOR ATIVO**" -#define TR_ALARMSDISABLED "Desabilita Alarmes" -#define TR_PRESSANYKEY "\010Pressione Tecla" -#define TR_BADEEPROMDATA "EEPRON INVALIDA" -#define TR_BAD_RADIO_DATA "Bad Radio Data" -#define TR_EEPROMFORMATTING "Formatando EEPROM" -#define TR_STORAGE_FORMAT "Storage Preparation" -#define TR_EEPROMOVERFLOW "EEPROM CHEIA" -#define TR_MENURADIOSETUP "AJUSTAR RADIO" -#define TR_MENUDATEANDTIME "DATA E HORA" -#define TR_MENUTRAINER "TRAINER" -#define TR_MENUGLOBALFUNCS "GLOBAL FUNCTIONS" -#define TR_MENUVERSION "VERSAO" -#define TR_MENUDIAG "DIAGNOST" -#define TR_MENUANA "ANALOGICOS" -#define TR_MENUCALIBRATION "CALIBRAGEM" -#define TR_TRIMS2OFFSETS "\006Trims => Offsets" -#define TR_MENUMODELSEL "MODELOS" -#define TR_MENUSETUP "SETUP" -#define TR_MENUFLIGHTPHASE "MODO DE VOO" -#define TR_MENUFLIGHTPHASES "MODOS DE VOO" -#define TR_MENUHELISETUP "HELI SETUP" - - -// Alignment - -#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ... - #define TR_MENUINPUTS "STICKS" - #define TR_MENULIMITS "SAIDAS" -#else - #define TR_MENUINPUTS "DR/EXPO" - #define TR_MENULIMITS "LIMITES" -#endif - -#define TR_MENUCURVES "CURVAS" -#define TR_MENUCURVE "CURVA" -#define TR_MENULOGICALSWITCH "CHAVE ESPECIAL" -#define TR_MENULOGICALSWITCHES "CHAVES ESPECIAIS" -#define TR_MENUCUSTOMFUNC "FUNCAO ESPECIAL" -#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" -#define TR_MENUTELEMETRY "TELEMETRIA" -#define TR_MENUTEMPLATES "MODELOS" -#define TR_MENUSTAT "REGISTROS" -#define TR_MENUDEBUG "DEPURAR" -#define TR_RXNUM "RxNum" -#define TR_SYNCMENU "Sync [MENU]" -#define TR_LIMIT INDENT"Limite" -#define TR_MINRSSI "Min Rssi" -#define TR_LATITUDE "Latitude" -#define TR_LONGITUDE "Longitude" -#define TR_GPSCOORD "Gps Coords" -#define TR_VARIO "Vario" -#define TR_PITCH_AT_ZERO INDENT "Pitch at Zero" -#define TR_PITCH_AT_MAX INDENT "Pitch at Max" -#define TR_REPEAT_AT_ZERO INDENT "Repeat at Zero" -#define TR_POWEROFF "\027Power OFF..." -#define TR_SHUTDOWN "DESLIGANDOo" -#define TR_SAVEMODEL "Saving model settings" -#define TR_BATT_CALIB "CALIBRAR BATT" -#define TR_CURRENT_CALIB "Corrente Calib" -#define TR_VOLTAGE INDENT"Volts" -#define TR_CURRENT INDENT"Amperes" -#define TR_SELECT_MODEL "Selec. Modelo" -#define TR_CREATE_CATEGORY "Create Category" -#define TR_RENAME_CATEGORY "Rename Category" -#define TR_DELETE_CATEGORY "Delete Category" -#define TR_CREATE_MODEL "Criar Modelo" -#define TR_DUPLICATE_MODEL "Duplicate Model" -#define TR_CHANGE_CATEGORY "Change category" -#define TR_COPY_MODEL "Copy Model" -#define TR_MOVE_MODEL "Move Model" -#define TR_BACKUP_MODEL "Salvar Modelo" -#define TR_DELETE_MODEL "Apagar Modelo" -#define TR_RESTORE_MODEL "Restaura Modelo" -#define TR_SDCARD_ERROR "SDCARD Erro" -#define TR_NO_SDCARD "Sem SDCARD" -#define TR_SDCARD_FULL "SD Card Full" -#define TR_INCOMPATIBLE "Incompativel" -#define TR_WARNING "AVISO" -#define TR_EEPROMWARN "EEPROM" -#define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "EEPROM Converting" -#define TR_THROTTLEWARN "ACELERAD" -#define TR_ALARMSWARN "ALARMES" -#define TR_SWITCHWARN "CHAVES" -#define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NO_FAILSAFE "Failsafe not set" -#define TR_KEYSTUCK "Key stuck" -#define TR_INVERT_THR "Inverte Acel?" -#define TR_SPEAKER_VOLUME INDENT "Volume" -#define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Brilho" -#define TR_CPU_TEMP "CPU Temp.\016>" -#define TR_CPU_CURRENT "Current\022>" -#define TR_CPU_MAH "Consumo." -#define TR_COPROC "CoProc." -#define TR_COPROC_TEMP "MB Temp. \016>" -#define TR_CAPAWARNING INDENT "Aviso Capacidade" -#define TR_TEMPWARNING INDENT "Temperat. ALTA" -#define TR_FUNC "Funcao" -#define TR_V1 "V1" -#define TR_V2 "V2" -#define TR_DURATION "Tempo" -#define TR_DELAY "Atraso" -#define TR_SD_CARD "SD CARD" -#define TR_SDHC_CARD "SD-HC CARD" -#define TR_NO_SOUNDS_ON_SD "Sem Som no SD" -#define TR_NO_MODELS_ON_SD "Sem Modelo no SD" -#define TR_NO_BITMAPS_ON_SD "No Bitmaps on SD" -#define TR_NO_SCRIPTS_ON_SD "No Scripts on SD" -#define TR_SCRIPT_SYNTAX_ERROR "Script syntax error" -#define TR_SCRIPT_PANIC "Script panic" -#define TR_SCRIPT_KILLED "Script killed" -#define TR_SCRIPT_ERROR "Unknown error" -#define TR_PLAY_FILE "Play" -#define TR_DELETE_FILE "Apagar" -#define TR_COPY_FILE "Copiar" -#define TR_RENAME_FILE "Renomear" -#define TR_ASSIGN_BITMAP "Assign Bitmap" -#define TR_EXECUTE_FILE "Execute" -#define TR_REMOVED "Remover" -#define TR_SD_INFO "Dados SD" -#define TR_SD_FORMAT "Formatar" -#define TR_NA "N/A" -#define TR_HARDWARE "HARDWARE" -#define TR_FORMATTING "Formatando..." -#define TR_TEMP_CALIB "Temp. Calib" -#define TR_TIME "Time" -#define TR_BAUDRATE "BT Baudrate" -#define TR_SD_INFO_TITLE "SD INFO" -#define TR_SD_TYPE "Tipe" -#define TR_SD_SPEED "Velocidade" -#define TR_SD_SECTORS "Sectores" -#define TR_SD_SIZE "Tamanho" -#define TR_TYPE INDENT "Tipe" -#define TR_GLOBAL_VARS "Variaveis" -#define TR_GVARS "GLOBAL V." -#define TR_GLOBAL_VAR "Global Variable" -#define TR_MENUGLOBALVARS "VARIAVEIS" -#define TR_OWN "Propr." -#define TR_DATE "Data" -#define TR_ROTARY_ENCODER "R.Encs" -#define TR_CHANNELS_MONITOR "CHANNELS MONITOR" -#define TR_MIXERS_MONITOR "MIXERS MONITOR" -#define TR_PATH_TOO_LONG "Path too long" -#define TR_VIEW_TEXT "View text" -#define TR_FLASH_BOOTLOADER "Flash BootLoader" -#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" -#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" -#define TR_WRITING "\032Writing..." -#define TR_CONFIRM_FORMAT "Confirm Format?" -#define TR_INTERNALRF "Internal RF" -#define TR_EXTERNALRF "External RF" -#define TR_FAILSAFE "Failsafe mode" -#define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_MENUSENSOR "SENSOR" -#define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Country Code" -#define TR_VOICELANG "Voice Language" -#define TR_UNITSSYSTEM "Units" -#define TR_EDIT "Edit" -#define TR_INSERT_BEFORE "Insert Before" -#define TR_INSERT_AFTER "Insert After" -#define TR_COPY "Copy" -#define TR_MOVE "Move" -#define TR_PASTE "Paste" -#define TR_DELETE "Delete" -#define TR_INSERT "Insert" -#define TR_RESET_FLIGHT "Reset Flight" -#define TR_RESET_TIMER1 "Reset Timer1" -#define TR_RESET_TIMER2 "Reset Timer2" -#define TR_RESET_TIMER3 "Reset Timer3" -#define TR_RESET_TELEMETRY "Reset Telemetry" -#define TR_STATISTICS "Statistics" -#define TR_ABOUT_US "About Us" -#define TR_SETUP_SCREENS "Setup screens" -#define TR_AND_SWITCH "AND Switch" -#define TR_SF "CF" -#define TR_GF "GF" -#define TR_SPEAKER INDENT"Speaker" -#define TR_BUZZER INDENT"Buzzer" -#define TR_BYTES "bytes" -#define TR_MODULE_BIND "[Bind]" -#define TR_MODULE_RANGE "[Range]" -#define TR_RESET_BTN "[Reset]" -#define TR_SET "[Set]" -#define TR_TRAINER "Trainer" -#define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!" -#define TR_MODELIDUSED TR("ID already used","Model ID already used") -#define TR_MODULE INDENT "Module" -#define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") -#define TR_TELEMETRY_SENSORS "Sensors" -#define TR_VALUE "Value" -#define TR_TOPLCDTIMER "Top LCD Timer" -#define TR_UNIT "Unit" -#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." -#define TR_CHANNELRANGE INDENT "Channel Range" -#define TR_LOWALARM INDENT "Low Alarm" -#define TR_CRITICALALARM INDENT "Critical Alarm" -#define TR_ENABLE_POPUP "Enable Popup" -#define TR_DISABLE_POPUP "Disable Popup" -#define TR_POPUP "Popup" -#define TR_MIN "Min" -#define TR_MAX "Max" -#define TR_CURVE_PRESET "Preset..." -#define TR_PRESET "Preset" -#define TR_MIRROR "Mirror" -#define TR_CLEAR "Clear" -#define TR_RESET "Reset" -#define TR_RESET_SUBMENU "Reset..." -#define TR_COUNT "Count" -#define TR_PT "pt" -#define TR_PTS "pts" -#define TR_SMOOTH "Smooth" -#define TR_COPY_STICKS_TO_OFS "Copy Sticks To Offset" -#define TR_COPY_TRIMS_TO_OFS "Copy trims to subtrim" -#define TR_INCDEC "Inc/Decrement" -#define TR_GLOBALVAR "Global Var" -#define TR_MIXSOURCE "Mixer Source" -#define TR_CONSTANT "Constant" -#define TR_PERSISTENT_MAH INDENT "Store mAh" -#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" -#define TR_SCRIPT "Script" -#define TR_INPUTS "Inputs" -#define TR_OUTPUTS "Outputs" -#define TR_EEBACKUP "\004[ENTER Long] to backup the EEPROM" -#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" -#define TR_CONFIRMRESET "Erase ALL models and settings?" -#define TR_TO_MANY_LUA_SCRIPTS "Too many Lua scripts!" - -#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 "Mavlink Setup" - #define TR_MAVLINK_BAUD_LABEL "Baudrate" - #define TR_MAVLINK_INFOS "INFOS" - #define TR_MAVLINK_MODE "MODE" - #define TR_MAVLINK_CUR_MODE "Current Mode" - #define TR_MAVLINK_ARMED "Armed" - #define TR_MAVLINK_BAT_MENU_TITLE "BAT RSSI" - #define TR_MAVLINK_BATTERY_LABEL "Flight Battery status" - #define TR_MAVLINK_RC_RSSI_LABEL "RC RSSI" - #define TR_MAVLINK_PC_RSSI_LABEL "PC RSSI" - #define TR_MAVLINK_NAV_MENU_TITLE "NAV" - #define TR_MAVLINK_COURSE "Course" - #define TR_MAVLINK_HEADING "Heading" - #define TR_MAVLINK_BEARING "Bearing" - #define TR_MAVLINK_ALTITUDE "Altitude" - #define TR_MAVLINK_GPS "GPS" - #define TR_MAVLINK_NO_FIX "NO Fix" - #define TR_MAVLINK_SAT "SAT" - #define TR_MAVLINK_HDOP "HDOP" - #define TR_MAVLINK_LAT "LAT" - #define TR_MAVLINK_LON "LON" -#endif - -// Taranis column headers -#define TR_PHASES_HEADERS { " Name ", " Switch ", " Rudder Trim ", " Elevator Trim ", " Throttle Trim ", " Aileron Trim ", " Fade In ", " Fade Out " } -#define TR_LIMITS_HEADERS { " Name ", " Offset ", " Min ", " Max ", " Direction ", " Curve ", " PPM Center ", " Symmetrical " } -#define TR_CSW_HEADERS { " Function ", " V1 ", " V2 ", " V2 ", " AND Switch ", " Duration ", " Delay " } - -//Taranis About screen -#define TR_ABOUTUS "ABOUT US" - -#define TR_ABOUT_OPENTX_1 "OpenTX is open source, non-" -#define TR_ABOUT_OPENTX_2 "commercial and comes with no" -#define TR_ABOUT_OPENTX_3 "warranties. It was developed" -#define TR_ABOUT_OPENTX_4 "for free. Support through" -#define TR_ABOUT_OPENTX_5 "donations is welcome!" - -#define TR_ABOUT_BERTRAND_1 "Bertrand Songis" -#define TR_ABOUT_BERTRAND_2 "OpenTX main author" -#define TR_ABOUT_BERTRAND_3 "Companion9x co-developer" - -#define TR_ABOUT_MIKE_1 "Mike Blandford" -#define TR_ABOUT_MIKE_2 "Code and drivers guru" -#define TR_ABOUT_MIKE_3 "Arguably, one of the best" -#define TR_ABOUT_MIKE_4 "Inspirational" - -#define TR_ABOUT_ROMOLO_1 "Romolo Manfredini" -#define TR_ABOUT_ROMOLO_2 "Companion9x main developer" -#define TR_ABOUT_ROMOLO_3 "" - -#define TR_ABOUT_ANDRE_1 "Andre Bernet" -#define TR_ABOUT_ANDRE_2 "Functionality, usability," -#define TR_ABOUT_ANDRE_3 "debugging, documentation" - -#define TR_ABOUT_ROB_1 "Rob Thomson" -#define TR_ABOUT_ROB_2 "openrcforums webmaster" - -#define TR_ABOUT_KJELL_1 "Kjell Kernen" -#define TR_ABOUT_KJELL_2 "www.open-tx.org main author" -#define TR_ABOUT_KJELL_3 "OpenTX Recorder author" -#define TR_ABOUT_KJELL_4 "Companion contributor" - -#define TR_ABOUT_MARTIN_1 "Martin Hotar" -#define TR_ABOUT_MARTIN_2 "Graphics designer" - -#if defined(PCBTARANIS) - #define TR_ABOUT_HARDWARE_1 "FrSky" - #define TR_ABOUT_HARDWARE_2 "Hardware designer/producer" - #define TR_ABOUT_HARDWARE_3 "Firmware contributor" -#else - #define TR_ABOUT_HARDWARE_1 "Brent Nelson" - #define TR_ABOUT_HARDWARE_2 "Sky9x designer/producer" - #define TR_ABOUT_HARDWARE_3 "" -#endif - -#define TR_ABOUT_PARENTS_1 "Parent projects" -#define TR_ABOUT_PARENTS_2 "ersky9x (Mike Blandford)" -#define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" -#define TR_ABOUT_PARENTS_4 "TH9X (Thomas Husterer)" - -#define TR_CHR_SHORT 's' -#define TR_CHR_LONG 'l' -#define TR_CHR_TOGGLE 't' -#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_TOP_BAR "Top Bar" -#define TR_ALTITUDE INDENT "Altitude" -#define TR_SCALE "Scale" -#define TR_VIEW_CHANNELS "View Channels" -#define TR_VIEW_NOTES "View Notes" -#define TR_MODEL_SELECT "Model Select" -#define TR_MODS_FORBIDDEN "Modifications forbidden!" -#define TR_UNLOCKED "Unlocked" -#define TR_ID "ID" -#define TR_PRECISION "Precision" -#define TR_RATIO "Ratio" -#define TR_FORMULA "Formula" -#define TR_CELLINDEX "Cell index" -#define TR_LOGS "Logs" -#define TR_OPTIONS "Options" - -#define TR_ALTSENSOR "Alt sensor" -#define TR_CELLSENSOR "Cell sensor" -#define TR_GPSSENSOR "GPS sensor" -#define TR_CURRENTSENSOR "Sensor" -#define TR_AUTOOFFSET "Auto Offset" -#define TR_ONLYPOSITIVE "Positive" -#define TR_FILTER "Filter" -#define TR_TELEMETRYFULL "All telemetry slots full!" -#define TR_INVERTED_SERIAL INDENT "Invert" -#define TR_IGNORE_INSTANCE INDENT "Ignore instance" -#define TR_DISCOVER_SENSORS INDENT "Discover new sensors" -#define TR_STOP_DISCOVER_SENSORS INDENT "Stop discovery" -#define TR_DELETE_ALL_SENSORS INDENT "Delete all sensors" -#define TR_CONFIRMDELETE "Really delete all?" -#define TR_SELECT_WIDGET "Select widget" -#define TR_REMOVE_WIDGET "Remove widget" -#define TR_WIDGET_SETTINGS "Widget settings" -#define TR_REMOVE_SCREEN "Remove screen" - -#define TR_MENU_INPUTS "\314Inputs" -#define TR_MENU_LUA "\322Lua scripts" -#define TR_MENU_STICKS "\307Sticks" -#define TR_MENU_POTS "\310Pots" -#define TR_MENU_MAX "\315MAX" -#define TR_MENU_HELI "\316Cyclic" -#define TR_MENU_TRIMS "\313Trims" -#define TR_MENU_SWITCHES "\312Switches" -#define TR_MENU_LOGICAL_SWITCHES "\312Logical Switches" -#define TR_MENU_TRAINER "\317Trainer" -#define TR_MENU_CHANNELS "\320Channels" -#define TR_MENU_GVARS "\311GVars" -#define TR_MENU_TELEMETRY "\321Telemetry" -#define TR_MENU_OTHER "Other" -#define TR_MENU_INVERT "Invert" - -#define ZSTR_RSSI "RSSI" -#define ZSTR_SWR "SWR" -#define ZSTR_A1 "A1" -#define ZSTR_A2 "A2" -#define ZSTR_A3 "A3" -#define ZSTR_A4 "A4" -#define ZSTR_BATT "RxBt" -#define ZSTR_ALT "Alt" -#define ZSTR_TEMP1 "Tmp1" -#define ZSTR_TEMP2 "Tmp2" -#define ZSTR_RPM "RPM" -#define ZSTR_FUEL "Fuel" -#define ZSTR_VSPD "VSpd" -#define ZSTR_ACCX "AccX" -#define ZSTR_ACCY "AccY" -#define ZSTR_ACCZ "AccZ" -#define ZSTR_CURR "Curr" -#define ZSTR_VFAS "VFAS" -#define ZSTR_ASPD "ASpd" -#define ZSTR_GSPD "GSpd" -#define ZSTR_HDG "Hdg" -#define ZSTR_CELLS "Cels" -#define ZSTR_GPSALT "GAlt" -#define ZSTR_GPSDATETIME "Date" -#define ZSTR_GPS "GPS" -#define ZSTR_BATT1_VOLTAGE "RB1V" -#define ZSTR_BATT2_VOLTAGE "RB2V" -#define ZSTR_BATT1_CURRENT "RB1A" -#define ZSTR_BATT2_CURRENT "RB2A" -#define ZSTR_BATT1_CONSUMPTION "RB1C" -#define ZSTR_BATT2_CONSUMPTION "RB2C" -#define ZSTR_RB_STATE "RBS" -#define ZSTR_CHANS_STATE "RBCS" +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +// PT translations author: who? + +/* + * !!!!! DO NOT EDIT pt.h - EDIT pt.h.txt INSTEAD !!!!!!! + * + * In order to make translations easier pt.h.txt is parsed and national + * characters are replaced by bitmap codes. The result is pt.h. + * + * See translate.py in the util folder for the list of character codes + * + * !!!!! DO NOT EDIT pt.h - EDIT pt.h.txt INSTEAD !!!!!!! + */ + +/* + * Formatting octal codes available in TR_ strings: + * \037\x -sets LCD x-coord (x value in octal) + * \036 -newline + * \035 -horizontal tab (ARM only) + * \001 to \034 -extended spacing (value * FW/2) + * \0 -ends current string + */ + + +// NON ZERO TERMINATED STRINGS +#define LEN_OFFON "\003" +#define TR_OFFON "OFF""ON\0" + +#define LEN_MMMINV "\003" +#define TR_MMMINV "---""INV" + +#define LEN_NCHANNELS "\004" +#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH" + +#define LEN_VBEEPMODE "\005" +#define TR_VBEEPMODE "Mudo ""Alarm""NoKey""Todo " + +#define LEN_VBEEPLEN "\005" +#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0" + +#define LEN_VRENAVIG "\003" +#define TR_VRENAVIG "No REaREb" + +#define LEN_VBLMODE "\004" +#define TR_VBLMODE "OFF ""Chav""Stks""Tudo""ON\0" + +#define LEN_TRNMODE "\003" +#define TR_TRNMODE "OFF"" +="" :=" + +#define LEN_TRNCHN "\003" +#define TR_TRNCHN "CH1CH2CH3CH4" + +#define LEN_UART3MODES "\017" +#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""Debug\0" + +#define LEN_SWTYPES "\006" +#define TR_SWTYPES "None\0 ""Toggle""2POS\0 ""3POS\0" + +#define LEN_POTTYPES "\017" +#define TR_POTTYPES "None\0 ""Pot with detent""Multipos Switch""Pot\0" + +#define LEN_SLIDERTYPES "\006" +#define TR_SLIDERTYPES "Rien\0 ""Slider" + +#define LEN_DATETIME "\005" +#define TR_DATETIME "DATA:""HORA:" + +#define LEN_VLCD "\006" +#define TR_VLCD "NormalOptrex" + +#define LEN_VPERSISTENT "\014" +#define TR_VPERSISTENT "OFF\0 ""Flight\0 ""Manual Reset" + +#define LEN_COUNTRYCODES TR("\002", "\007") +#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0") + +#define LEN_TARANIS_PROTOCOLS "\004" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF" + +#define LEN_XJT_PROTOCOLS "\004" +#define TR_XJT_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" + +#define LEN_DSM_PROTOCOLS "\004" +#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" + +#define LEN_VTRIMINC "\006" +#define TR_VTRIMINC "Expo ""ExFino""Fino ""Medio ""Largo " + +#define LEN_VDISPLAYTRIMS "\006" +#define TR_VDISPLAYTRIMS "No\0 ""Change""Yes\0" + +#define LEN_VBEEPCOUNTDOWN "\006" +#define TR_VBEEPCOUNTDOWN "SilentBeeps\0Voice\0Haptic" + +#define LEN_VVARIOCENTER "\006" +#define TR_VVARIOCENTER "Tone\0 ""Silent" + +#define LEN_CURVE_TYPES "\010" +#define TR_CURVE_TYPES "Standard""Custom\0" + +#define LEN_RETA123 "\001" + +#if defined(PCBTARANIS) || defined(REVX) + #define TR_RETA123 "LPMA123LR" +#elif defined(PCBSKY9X) + #define TR_RETA123 "LPMA123a" +#elif defined(CPUM2560) + #define TR_RETA123 "LPMA123ab" +#else + #define TR_RETA123 "LPMA123" +#endif + +#define LEN_VPROTOS "\006" + +#if defined(PXX) + #define TR_PXX "PXX\0 " +#elif defined(DSM2) || defined(IRPROTOS) + #define TR_PXX "[PXX]\0" +#else + #define TR_PXX +#endif + +#if defined(DSM2) + #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " +#elif defined(IRPROTOS) + #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" +#else + #define TR_DSM2 +#endif + +#if defined(IRPROTOS) + #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" +#else + #define TR_IRPROTOS +#endif + +#if defined(CPUARM) + #define TR_XPPM +#else + #define TR_XPPM "PPM16\0""PPMsim" +#endif + +#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS + +#define LEN_POSNEG "\003" +#define TR_POSNEG "POS""NEG" + +#if defined(PCBSKY9X) && defined(REVX) + #define LEN_VOUTPUT_TYPE "\011" + #define TR_VOUTPUT_TYPE "OpenDrain""PushPull\0" +#endif + +#define LEN_VCURVEFUNC "\003" +#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" + +#define LEN_VMLTPX "\011" +#define TR_VMLTPX "Adicionar""Multipl. ""Trocar\0 0" + +#define LEN_VMLTPX2 "\002" +#define TR_VMLTPX2 "+=""*="":=" + +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "OFF""ON\0""Lem""Pfd""Mot""Ail" + +#if defined(PCBTARANIS) + #define TR_CSWTIMER "Timer" + #define TR_CSWSTICKY "Stcky" + #define TR_CSWRANGE "Range" + #define TR_CSWSTAY "Edge\0" +#else + #define TR_CSWTIMER "Tim\0 " + #define TR_CSWSTICKY "Glue\0" + #if defined(CPUARM) + #define TR_CSWRANGE "Rnge\0" + #define TR_CSWSTAY "Edge\0" + #else + #define TR_CSWRANGE + #define TR_CSWSTAY + #endif +#endif + +#if defined(CPUARM) + #define TR_CSWEQUAL "a=x\0 " +#else + #define TR_CSWEQUAL +#endif + +#define LEN_VCSWFUNC "\005" +#if defined(CPUARM) +#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a= 212 + #define TR_VTELEMCHNS "---\0 ""Batt\0" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Cells""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\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-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Time\0" +#else + #define TR_VTELEMCHNS "---\0""Batt" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 " TR_TELEM_RSSI_RX TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\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""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Time" +#endif + +#define LENGTH_UNIT_IMP "ft\0" +#define SPEED_UNIT_IMP "mph" +#define LENGTH_UNIT_METR "m\0 " +#define SPEED_UNIT_METR "kmh" + +#if defined(CPUARM) + #define LEN_VUNITSSYSTEM TR("\006", "\010") + #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") + #define LEN_VTELEMUNIT "\003" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" +#else + #if defined(IMPERIAL_UNITS) + #define LENGTH_UNIT LENGTH_UNIT_IMP + #define SPEED_UNIT SPEED_UNIT_IMP + #else + #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 " +#endif + +#define STR_V (STR_VTELEMUNIT+1) +#define STR_A (STR_VTELEMUNIT+4) + +#define LEN_VALARM "\003" +#define TR_VALARM "---""Ama""Lar""Ver" + +#define LEN_VALARMFN "\001" +#define TR_VALARMFN "<>" + +#define LEN_VTELPROTO "\007" +#define TR_VTELPROTO "Nada\0 ""Hub\0 ""WSHHigh" + +#if defined(CPUARM) + #define LEN_AMPSRC TR("\003", "\007") + #define TR_AMPSRC TR("---""A1\0""A2\0""A3\0""A4\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells\0 ") + #define LEN_VOLTSRC TR("\003", "\007") + #define TR_VOLTSRC TR("A1\0""A2\0""A3\0""A4\0""FAS""Cel", "A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells\0 ") +#else + #define LEN_AMPSRC TR("\003", "\007") + #define TR_AMPSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Cells\0 ") +#endif + +#define LEN_VARIOSRC "\005" +#if defined(FRSKY_SPORT) + #define TR_VARIOSRC "Vario""A1\0 ""A2\0" +#else + #define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0" +#endif + +#define LEN_VTELEMSCREENTYPE "\004" +#define TR_VTELEMSCREENTYPE "Nums""Bars" + +#define LEN_GPSFORMAT "\004" +#define TR_GPSFORMAT "HMS NMEA" + +#define LEN2_VTEMPLATES 13 +#define LEN_VTEMPLATES "\015" +#define TR_VTEMPLATES "Tirar Mixagem""4CH Simples\0 ""Anular Motor\0""V-Tail\0 ""Elevon\\Zagi\0 ""eCCPM\0 ""Mixagem Heli\0""Testar Servos" + +#define LEN_VSWASHTYPE "\004" +#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" + +#define LEN_VKEYS "\005" +#define TR_VKEYS TR("Menu\0""Sair\0""Desce""Sobe\0""Direi""Esqda", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus") + +#define LEN_VRENCODERS "\003" +#define TR_VRENCODERS "REa""REb" + +#define LEN_VSWITCHES "\003" +#define LEN_VSRCRAW "\004" + +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" +#elif defined(PCBTARANIS) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#else + #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " + #define TR_SW_VSRCRAW "3POS" + #define TR_9X_3POS_SWITCHES "ID0""ID1""ID2" +#endif + +#if defined(CPUARM) + #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12""L13""L14""L15""L16""L17""L18""L19""L20""L21""L22""L23""L24""L25""L26""L27""L28""L29""L30""L31""L32" +#else + #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12" +#endif + +#define TR_TRIMS_SWITCHES TR("tRl""tRr""tEd""tEu""tTd""tTu""tAl""tAr", "\313Rl""\313Rr""\313Ed""\313Eu""\313\313d""\313\313u""\313Al""\313Ar") + +#if defined(PCBSKY9X) + #define TR_ROTARY_ENCODERS "REa\0" + #define TR_ROTENC_SWITCHES "REa" +#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560) + #define TR_ROTARY_ENCODERS "REa\0""REb\0" + #define TR_ROTENC_SWITCHES "REa""REb" +#else + #define TR_ROTARY_ENCODERS + #define TR_ROTENC_SWITCHES +#endif + +#if !defined(PCBTARANIS) + #define TR_PHYS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" +#endif + +#define TR_ON_ONE_SWITCHES "ON\0""One" + +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) + // only special switches here + #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES +#else + #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES +#endif + +#if defined(HELI) +#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3" +#else +#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" +#endif + +#define TR_VSRCRAW "---\0""Lem\0""Pfd\0""Mot\0""Ail\0" TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "MAX\0" TR_CYC_VSRCRAW "TrmL" "TrmP" "TrmM" "TrmA" TR_SW_VSRCRAW + +#define LEN_VTMRMODES "\003" +#define TR_VTMRMODES "OFF""ABS""MTs""MT%""MTt" + +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Master/Jack\0 ""Slave/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" + +#define LEN_VFAILSAFE "\011" +#define TR_VFAILSAFE "Not set\0 ""Hold\0 ""Custom\0 ""No pulses""Receiver\0" + +#if defined(MAVLINK) + #define LEN_MAVLINK_BAUDS "\006" + #define TR_MAVLINK_BAUDS "4800 ""9600 ""14400 ""19200 ""38400 ""57600 ""76800 ""115200" + #define LEN_MAVLINK_AC_MODES "\011" + #define TR_MAVLINK_AC_MODES "Stabilize""Acro ""Alt Hold ""Auto ""Guided ""Loiter ""RTL ""Circle ""Pos Hold ""Land ""OF Loiter""Toy A ""Toy M ""INVALID " + #define LEN_MAVLINK_AP_MODES "\015" + #define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID " +#endif + +#define LEN_VSENSORTYPES "\012" +#define TR_VSENSORTYPES "Custom\0 ""Calculated" + +#define LEN_VFORMULAS "\010" +#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Totalize""Cell\0 ""Consumpt""Distance" + +#define LEN_VPREC "\005" +#define TR_VPREC "PREC0""PREC1""PREC2" + +#define LEN_VCELLINDEX "\007" +#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0" + +// ZERO TERMINATED STRINGS +#define INDENT "\001" +#define LEN_INDENT 1 +#define INDENT_WIDTH (FW/2) + +#if defined(PCBTARANIS) + #define TR_ENTER "[ENTER]" +#else + #define TR_ENTER "[MENU]" +#endif + +#define TR_EXIT "[EXIT]" + +#if defined(PCBTARANIS) + #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +#else + #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define OFS_EXIT sizeof(TR_ENTER) +#endif + +#define TR_MENUWHENDONE CENTER"\006"TR_ENTER"QDO PRONTO" +#define TR_FREE "Livre" +#define TR_DELETEMODEL "EXCLUI MODELO" +#define TR_COPYINGMODEL "Copiando modelo" +#define TR_MOVINGMODEL "Movendo modelo" +#define TR_LOADINGMODEL "Carregar modelo" +#define TR_NAME "Nome" +#define TR_MODELNAME "Model Name" +#define TR_PHASENAME "Phase Name" +#define TR_MIXNAME "Mix Name" +#define TR_INPUTNAME "Input Name" +#if defined(PCBTARANIS) + #define TR_EXPONAME "Line Name" +#else + #define TR_EXPONAME "Expo Name" +#endif +#define TR_BITMAP "Model Image" +#define TR_TIMER "Cronom" +#define TR_ELIMITS "E.Limits" +#define TR_ETRIMS "E.Trims" +#define TR_TRIMINC "Trim Step" +#define TR_DISPLAY_TRIMS "Display Trims" +#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_USE_GLOBAL_FUNCS "Use Global Funcs" +#if defined(PCBSKY9X) && defined(REVX) + #define TR_OUTPUT_TYPE INDENT "Output" +#endif +#define TR_PROTO INDENT"Proto" +#define TR_PPMFRAME "PPM frame" +#define TR_MS "ms" +#define TR_SWITCH "Chave" +#define TR_TRIMS "Trims" +#define TR_FADEIN "Aparecer" +#define TR_FADEOUT "Ocultar" +#define TR_DEFAULT "(default)" +#define TR_CHECKTRIMS "\006Check\012Trims" +#define OFS_CHECKTRIMS (9*FW) +#define TR_SWASHTYPE "Ciclico Tipo" +#define TR_COLLECTIVE "Coletivo" +#define TR_AILERON "Lateral cyc. source" +#define TR_ELEVATOR "Long. cyc. source" +#define TR_SWASHRING "Anel Coletivo" +#define TR_ELEDIRECTION "PFD Sentido" +#define TR_AILDIRECTION "AIL Sentido" +#define TR_COLDIRECTION "COL Sentido" +#define TR_MODE INDENT"Modo" +#define TR_NOFREEEXPO "No free expo!" +#define TR_NOFREEMIXER "No free mixer!" +#define TR_SOURCE INDENT"Fonte" +#define TR_WEIGHT "Quantia" +#define TR_EXPO "Exponen" +#define TR_SIDE "Lado" +#define TR_DIFFERENTIAL "Diferencial" +#define TR_OFFSET INDENT"Desvio" +#define TR_TRIM "Trim" +#define TR_DREX "DRex" +#define DREX_CHBOX_OFFSET 30 +#define TR_CURVE "Curvas" +#define TR_FLMODE "Fase" +#define TR_MIXWARNING "Aviso" +#define TR_OFF "OFF" +#define TR_MULTPX "Aplicar" +#define TR_DELAYDOWN "Atraso Dn" +#define TR_DELAYUP "Atraso Up" +#define TR_SLOWDOWN "Lento Dn" +#define TR_SLOWUP "Lento Up" +#define TR_MIXER "MIXAGENS" +#define TR_CV "CV" +#define TR_GV "GV" +#define TR_ACHANNEL "A\004Canal" +#define TR_RANGE INDENT"Range" +#define TR_CENTER INDENT "Center" +#define TR_BAR "Bar" +#define TR_ALARM INDENT"Alarme" +#define TR_USRDATA "UsrData" +#define TR_BLADES INDENT"Helice" +#define TR_SCREEN "Tela" +#define TR_SOUND_LABEL "Som" +#define TR_LENGTH INDENT"Comprimento" +#define TR_BEEP_LENGTH INDENT "Beep Length" +#define TR_SPKRPITCH INDENT"Pitch" +#define TR_HAPTIC_LABEL "Vibrar" +#define TR_HAPTICSTRENGTH INDENT"Forca" +#define TR_CONTRAST "Contraste" +#define TR_ALARMS_LABEL "Alarmes" +#define TR_BATTERY_RANGE "Battery Range" +#define TR_BATTERYWARNING INDENT"Bateria Baixa" +#define TR_INACTIVITYALARM INDENT"Inactividade" +#define TR_MEMORYWARNING INDENT"Memoria Baixa" +#define TR_ALARMWARNING INDENT"Som Off" +#define TR_RENAVIG "RotEnc Navig" +#define TR_THROTTLE_LABEL "Throttle" +#define TR_THROTTLEREVERSE TR("Inverte Acel.", INDENT "Inverte Acel.") +#define TR_TIMER_NAME INDENT "Name" +#define TR_MINUTEBEEP INDENT "Beep Minuto" +#define TR_BEEPCOUNTDOWN INDENT "Beep Regressivo" +#define TR_PERSISTENT INDENT "Persist." +#define TR_BACKLIGHT_LABEL "Backlight" +#define TR_BLDELAY INDENT "Tempo Backlight" +#define TR_BLONBRIGHTNESS INDENT "ON Brightness" +#define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness" +#define TR_BLCOLOR INDENT "Color" +#define TR_SPLASHSCREEN "Splash screen" +#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_ADJUST_RTC INDENT "Adjust RTC" +#define TR_GPS "GPS" +#define TR_RXCHANNELORD "Ordem Canal RX" +#define TR_STICKS "Sticks" +#define TR_POTS "Pots" +#define TR_SWITCHES "Switches" +#define TR_SWITCHES_DELAY "Switches Delay" +#define TR_SLAVE "Escravo" +#define TR_MODESRC "Modo\006% Fonte" +#define TR_MULTIPLIER "Multiplicar" +#define TR_CAL "Cal" +#define TR_VTRIM "Trim- +" +#define TR_BG "BG:" +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#else + #define TR_MENUTOSTART CENTER"\011" TR_ENTER " INICIAR" + #define TR_SETMIDPOINT TR(CENTER"\005CENTRAR STICK/POT",CENTER"\006CENTRAR STICK/POT") + #define TR_MOVESTICKSPOTS TR(CENTER"\005MOVER STICKS/POTs",CENTER"\006MOVER STICKS/POTs") +#endif +#define TR_RXBATT "Rx Batt:" +#define TR_TXnRX "Tx:\0Rx:" +#define OFS_RX 4 +#define TR_ACCEL "Acc:" +#define TR_NODATA CENTER"SEM DADOS" +#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" +#define TR_TMR1LATMAXUS "Tmr1Lat max\037\124us" +#define STR_US (STR_TMR1LATMAXUS+13) +#define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" +#define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" + +#if defined(CPUARM) + #define TR_TMIXMAXMS "Tmix max" + #define TR_FREESTACKMINB "Free Stack" +#else + #define TR_TMIXMAXMS "Tmix max\037\124ms" + #define TR_FREESTACKMINB "Pilha Livre\037\124b" +#endif + +#define TR_MENUTORESET CENTER TR_ENTER" Reinicia" +#define TR_PPM_TRAINER "TR" +#define TR_CH "CH" +#define TR_MODEL "MODEL" +#define TR_FP "FP" +#define TR_MIX "MIX" +#define TR_EEPROMLOWMEM "EEPROM BX Memoria" +#define TR_ALERT "\016ALERT" +#define TR_PRESSANYKEYTOSKIP "Pulsar Tecla p/ sair" +#define TR_THROTTLENOTIDLE "**ACELERADOR ATIVO**" +#define TR_ALARMSDISABLED "Desabilita Alarmes" +#define TR_PRESSANYKEY "\010Pressione Tecla" +#define TR_BADEEPROMDATA "EEPRON INVALIDA" +#define TR_BAD_RADIO_DATA "Bad Radio Data" +#define TR_EEPROMFORMATTING "Formatando EEPROM" +#define TR_STORAGE_FORMAT "Storage Preparation" +#define TR_EEPROMOVERFLOW "EEPROM CHEIA" +#define TR_MENURADIOSETUP "AJUSTAR RADIO" +#define TR_MENUDATEANDTIME "DATA E HORA" +#define TR_MENUTRAINER "TRAINER" +#define TR_MENUGLOBALFUNCS "GLOBAL FUNCTIONS" +#define TR_MENUVERSION "VERSAO" +#define TR_MENUDIAG "DIAGNOST" +#define TR_MENUANA "ANALOGICOS" +#define TR_MENUCALIBRATION "CALIBRAGEM" +#define TR_TRIMS2OFFSETS "\006Trims => Offsets" +#define TR_MENUMODELSEL "MODELOS" +#define TR_MENUSETUP "SETUP" +#define TR_MENUFLIGHTPHASE "MODO DE VOO" +#define TR_MENUFLIGHTPHASES "MODOS DE VOO" +#define TR_MENUHELISETUP "HELI SETUP" + + +// Alignment + +#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ... + #define TR_MENUINPUTS "STICKS" + #define TR_MENULIMITS "SAIDAS" +#else + #define TR_MENUINPUTS "DR/EXPO" + #define TR_MENULIMITS "LIMITES" +#endif + +#define TR_MENUCURVES "CURVAS" +#define TR_MENUCURVE "CURVA" +#define TR_MENULOGICALSWITCH "CHAVE ESPECIAL" +#define TR_MENULOGICALSWITCHES "CHAVES ESPECIAIS" +#define TR_MENUCUSTOMFUNC "FUNCAO ESPECIAL" +#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" +#define TR_MENUTELEMETRY "TELEMETRIA" +#define TR_MENUTEMPLATES "MODELOS" +#define TR_MENUSTAT "REGISTROS" +#define TR_MENUDEBUG "DEPURAR" +#define TR_RXNUM "RxNum" +#define TR_SYNCMENU "Sync [MENU]" +#define TR_LIMIT INDENT"Limite" +#define TR_MINRSSI "Min Rssi" +#define TR_LATITUDE "Latitude" +#define TR_LONGITUDE "Longitude" +#define TR_GPSCOORD "Gps Coords" +#define TR_VARIO "Vario" +#define TR_PITCH_AT_ZERO INDENT "Pitch at Zero" +#define TR_PITCH_AT_MAX INDENT "Pitch at Max" +#define TR_REPEAT_AT_ZERO INDENT "Repeat at Zero" +#define TR_POWEROFF "\027Power OFF..." +#define TR_SHUTDOWN "DESLIGANDOo" +#define TR_SAVEMODEL "Saving model settings" +#define TR_BATT_CALIB "CALIBRAR BATT" +#define TR_CURRENT_CALIB "Corrente Calib" +#define TR_VOLTAGE INDENT"Volts" +#define TR_CURRENT INDENT"Amperes" +#define TR_SELECT_MODEL "Selec. Modelo" +#define TR_CREATE_CATEGORY "Create Category" +#define TR_RENAME_CATEGORY "Rename Category" +#define TR_DELETE_CATEGORY "Delete Category" +#define TR_CREATE_MODEL "Criar Modelo" +#define TR_DUPLICATE_MODEL "Duplicate Model" +#define TR_CHANGE_CATEGORY "Change category" +#define TR_COPY_MODEL "Copy Model" +#define TR_MOVE_MODEL "Move Model" +#define TR_BACKUP_MODEL "Salvar Modelo" +#define TR_DELETE_MODEL "Apagar Modelo" +#define TR_RESTORE_MODEL "Restaura Modelo" +#define TR_SDCARD_ERROR "SDCARD Erro" +#define TR_NO_SDCARD "Sem SDCARD" +#define TR_SDCARD_FULL "SD Card Full" +#define TR_INCOMPATIBLE "Incompativel" +#define TR_WARNING "AVISO" +#define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" +#define TR_EEPROM_CONVERTING "EEPROM Converting" +#define TR_THROTTLEWARN "ACELERAD" +#define TR_ALARMSWARN "ALARMES" +#define TR_SWITCHWARN "CHAVES" +#define TR_FAILSAFEWARN "FAILSAFE" +#define TR_NO_FAILSAFE "Failsafe not set" +#define TR_KEYSTUCK "Key stuck" +#define TR_INVERT_THR "Inverte Acel?" +#define TR_SPEAKER_VOLUME INDENT "Volume" +#define TR_LCD "LCD" +#define TR_BRIGHTNESS INDENT "Brilho" +#define TR_CPU_TEMP "CPU Temp.\016>" +#define TR_CPU_CURRENT "Current\022>" +#define TR_CPU_MAH "Consumo." +#define TR_COPROC "CoProc." +#define TR_COPROC_TEMP "MB Temp. \016>" +#define TR_CAPAWARNING INDENT "Aviso Capacidade" +#define TR_TEMPWARNING INDENT "Temperat. ALTA" +#define TR_FUNC "Funcao" +#define TR_V1 "V1" +#define TR_V2 "V2" +#define TR_DURATION "Tempo" +#define TR_DELAY "Atraso" +#define TR_SD_CARD "SD CARD" +#define TR_SDHC_CARD "SD-HC CARD" +#define TR_NO_SOUNDS_ON_SD "Sem Som no SD" +#define TR_NO_MODELS_ON_SD "Sem Modelo no SD" +#define TR_NO_BITMAPS_ON_SD "No Bitmaps on SD" +#define TR_NO_SCRIPTS_ON_SD "No Scripts on SD" +#define TR_SCRIPT_SYNTAX_ERROR "Script syntax error" +#define TR_SCRIPT_PANIC "Script panic" +#define TR_SCRIPT_KILLED "Script killed" +#define TR_SCRIPT_ERROR "Unknown error" +#define TR_PLAY_FILE "Play" +#define TR_DELETE_FILE "Apagar" +#define TR_COPY_FILE "Copiar" +#define TR_RENAME_FILE "Renomear" +#define TR_ASSIGN_BITMAP "Assign Bitmap" +#define TR_EXECUTE_FILE "Execute" +#define TR_REMOVED "Remover" +#define TR_SD_INFO "Dados SD" +#define TR_SD_FORMAT "Formatar" +#define TR_NA "N/A" +#define TR_HARDWARE "HARDWARE" +#define TR_FORMATTING "Formatando..." +#define TR_TEMP_CALIB "Temp. Calib" +#define TR_TIME "Time" +#define TR_BAUDRATE "BT Baudrate" +#define TR_SD_INFO_TITLE "SD INFO" +#define TR_SD_TYPE "Tipe" +#define TR_SD_SPEED "Velocidade" +#define TR_SD_SECTORS "Sectores" +#define TR_SD_SIZE "Tamanho" +#define TR_TYPE INDENT "Tipe" +#define TR_GLOBAL_VARS "Variaveis" +#define TR_GVARS "GLOBAL V." +#define TR_GLOBAL_VAR "Global Variable" +#define TR_MENUGLOBALVARS "VARIAVEIS" +#define TR_OWN "Propr." +#define TR_DATE "Data" +#define TR_ROTARY_ENCODER "R.Encs" +#define TR_CHANNELS_MONITOR "CHANNELS MONITOR" +#define TR_MIXERS_MONITOR "MIXERS MONITOR" +#define TR_PATH_TOO_LONG "Path too long" +#define TR_VIEW_TEXT "View text" +#define TR_FLASH_BOOTLOADER "Flash BootLoader" +#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" +#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" +#define TR_WRITING "\032Writing..." +#define TR_CONFIRM_FORMAT "Confirm Format?" +#define TR_INTERNALRF "Internal RF" +#define TR_EXTERNALRF "External RF" +#define TR_FAILSAFE "Failsafe mode" +#define TR_FAILSAFESET "FAILSAFE SETTINGS" +#define TR_MENUSENSOR "SENSOR" +#define TR_SENSOR "SENSOR" +#define TR_COUNTRYCODE "Country Code" +#define TR_VOICELANG "Voice Language" +#define TR_UNITSSYSTEM "Units" +#define TR_EDIT "Edit" +#define TR_INSERT_BEFORE "Insert Before" +#define TR_INSERT_AFTER "Insert After" +#define TR_COPY "Copy" +#define TR_MOVE "Move" +#define TR_PASTE "Paste" +#define TR_DELETE "Delete" +#define TR_INSERT "Insert" +#define TR_RESET_FLIGHT "Reset Flight" +#define TR_RESET_TIMER1 "Reset Timer1" +#define TR_RESET_TIMER2 "Reset Timer2" +#define TR_RESET_TIMER3 "Reset Timer3" +#define TR_RESET_TELEMETRY "Reset Telemetry" +#define TR_STATISTICS "Statistics" +#define TR_ABOUT_US "About Us" +#define TR_SETUP_SCREENS "Setup screens" +#define TR_AND_SWITCH "AND Switch" +#define TR_SF "CF" +#define TR_GF "GF" +#define TR_SPEAKER INDENT"Speaker" +#define TR_BUZZER INDENT"Buzzer" +#define TR_BYTES "bytes" +#define TR_MODULE_BIND "[Bind]" +#define TR_MODULE_RANGE "[Range]" +#define TR_RESET_BTN "[Reset]" +#define TR_SET "[Set]" +#define TR_TRAINER "Trainer" +#define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!" +#define TR_MODELIDUSED TR("ID already used","Model ID already used") +#define TR_MODULE INDENT "Module" +#define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") +#define TR_TELEMETRY_SENSORS "Sensors" +#define TR_VALUE "Value" +#define TR_TOPLCDTIMER "Top LCD Timer" +#define TR_UNIT "Unit" +#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." +#define TR_CHANNELRANGE INDENT "Channel Range" +#define TR_LOWALARM INDENT "Low Alarm" +#define TR_CRITICALALARM INDENT "Critical Alarm" +#define TR_ENABLE_POPUP "Enable Popup" +#define TR_DISABLE_POPUP "Disable Popup" +#define TR_POPUP "Popup" +#define TR_MIN "Min" +#define TR_MAX "Max" +#define TR_CURVE_PRESET "Preset..." +#define TR_PRESET "Preset" +#define TR_MIRROR "Mirror" +#define TR_CLEAR "Clear" +#define TR_RESET "Reset" +#define TR_RESET_SUBMENU "Reset..." +#define TR_COUNT "Count" +#define TR_PT "pt" +#define TR_PTS "pts" +#define TR_SMOOTH "Smooth" +#define TR_COPY_STICKS_TO_OFS "Copy Sticks To Offset" +#define TR_COPY_TRIMS_TO_OFS "Copy trims to subtrim" +#define TR_INCDEC "Inc/Decrement" +#define TR_GLOBALVAR "Global Var" +#define TR_MIXSOURCE "Mixer Source" +#define TR_CONSTANT "Constant" +#define TR_PERSISTENT_MAH INDENT "Store mAh" +#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" +#define TR_SCRIPT "Script" +#define TR_INPUTS "Inputs" +#define TR_OUTPUTS "Outputs" +#define TR_EEBACKUP "\004[ENTER Long] to backup the EEPROM" +#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" +#define TR_CONFIRMRESET "Erase ALL models and settings?" +#define TR_TO_MANY_LUA_SCRIPTS "Too many Lua scripts!" + +#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 "Mavlink Setup" + #define TR_MAVLINK_BAUD_LABEL "Baudrate" + #define TR_MAVLINK_INFOS "INFOS" + #define TR_MAVLINK_MODE "MODE" + #define TR_MAVLINK_CUR_MODE "Current Mode" + #define TR_MAVLINK_ARMED "Armed" + #define TR_MAVLINK_BAT_MENU_TITLE "BAT RSSI" + #define TR_MAVLINK_BATTERY_LABEL "Flight Battery status" + #define TR_MAVLINK_RC_RSSI_LABEL "RC RSSI" + #define TR_MAVLINK_PC_RSSI_LABEL "PC RSSI" + #define TR_MAVLINK_NAV_MENU_TITLE "NAV" + #define TR_MAVLINK_COURSE "Course" + #define TR_MAVLINK_HEADING "Heading" + #define TR_MAVLINK_BEARING "Bearing" + #define TR_MAVLINK_ALTITUDE "Altitude" + #define TR_MAVLINK_GPS "GPS" + #define TR_MAVLINK_NO_FIX "NO Fix" + #define TR_MAVLINK_SAT "SAT" + #define TR_MAVLINK_HDOP "HDOP" + #define TR_MAVLINK_LAT "LAT" + #define TR_MAVLINK_LON "LON" +#endif + +// Taranis column headers +#define TR_PHASES_HEADERS { " Name ", " Switch ", " Rudder Trim ", " Elevator Trim ", " Throttle Trim ", " Aileron Trim ", " Fade In ", " Fade Out " } +#define TR_LIMITS_HEADERS { " Name ", " Offset ", " Min ", " Max ", " Direction ", " Curve ", " PPM Center ", " Symmetrical " } +#define TR_CSW_HEADERS { " Function ", " V1 ", " V2 ", " V2 ", " AND Switch ", " Duration ", " Delay " } + +//Taranis About screen +#define TR_ABOUTUS "ABOUT US" + +#define TR_ABOUT_OPENTX_1 "OpenTX is open source, non-" +#define TR_ABOUT_OPENTX_2 "commercial and comes with no" +#define TR_ABOUT_OPENTX_3 "warranties. It was developed" +#define TR_ABOUT_OPENTX_4 "for free. Support through" +#define TR_ABOUT_OPENTX_5 "donations is welcome!" + +#define TR_ABOUT_BERTRAND_1 "Bertrand Songis" +#define TR_ABOUT_BERTRAND_2 "OpenTX main author" +#define TR_ABOUT_BERTRAND_3 "Companion9x co-developer" + +#define TR_ABOUT_MIKE_1 "Mike Blandford" +#define TR_ABOUT_MIKE_2 "Code and drivers guru" +#define TR_ABOUT_MIKE_3 "Arguably, one of the best" +#define TR_ABOUT_MIKE_4 "Inspirational" + +#define TR_ABOUT_ROMOLO_1 "Romolo Manfredini" +#define TR_ABOUT_ROMOLO_2 "Companion9x main developer" +#define TR_ABOUT_ROMOLO_3 "" + +#define TR_ABOUT_ANDRE_1 "Andre Bernet" +#define TR_ABOUT_ANDRE_2 "Functionality, usability," +#define TR_ABOUT_ANDRE_3 "debugging, documentation" + +#define TR_ABOUT_ROB_1 "Rob Thomson" +#define TR_ABOUT_ROB_2 "openrcforums webmaster" + +#define TR_ABOUT_KJELL_1 "Kjell Kernen" +#define TR_ABOUT_KJELL_2 "www.open-tx.org main author" +#define TR_ABOUT_KJELL_3 "OpenTX Recorder author" +#define TR_ABOUT_KJELL_4 "Companion contributor" + +#define TR_ABOUT_MARTIN_1 "Martin Hotar" +#define TR_ABOUT_MARTIN_2 "Graphics designer" + +#if defined(PCBTARANIS) + #define TR_ABOUT_HARDWARE_1 "FrSky" + #define TR_ABOUT_HARDWARE_2 "Hardware designer/producer" + #define TR_ABOUT_HARDWARE_3 "Firmware contributor" +#else + #define TR_ABOUT_HARDWARE_1 "Brent Nelson" + #define TR_ABOUT_HARDWARE_2 "Sky9x designer/producer" + #define TR_ABOUT_HARDWARE_3 "" +#endif + +#define TR_ABOUT_PARENTS_1 "Parent projects" +#define TR_ABOUT_PARENTS_2 "ersky9x (Mike Blandford)" +#define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" +#define TR_ABOUT_PARENTS_4 "TH9X (Thomas Husterer)" + +#define TR_CHR_SHORT 's' +#define TR_CHR_LONG 'l' +#define TR_CHR_TOGGLE 't' +#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_TOP_BAR "Top Bar" +#define TR_ALTITUDE INDENT "Altitude" +#define TR_SCALE "Scale" +#define TR_VIEW_CHANNELS "View Channels" +#define TR_VIEW_NOTES "View Notes" +#define TR_MODEL_SELECT "Model Select" +#define TR_MODS_FORBIDDEN "Modifications forbidden!" +#define TR_UNLOCKED "Unlocked" +#define TR_ID "ID" +#define TR_PRECISION "Precision" +#define TR_RATIO "Ratio" +#define TR_FORMULA "Formula" +#define TR_CELLINDEX "Cell index" +#define TR_LOGS "Logs" +#define TR_OPTIONS "Options" + +#define TR_ALTSENSOR "Alt sensor" +#define TR_CELLSENSOR "Cell sensor" +#define TR_GPSSENSOR "GPS sensor" +#define TR_CURRENTSENSOR "Sensor" +#define TR_AUTOOFFSET "Auto Offset" +#define TR_ONLYPOSITIVE "Positive" +#define TR_FILTER "Filter" +#define TR_TELEMETRYFULL "All telemetry slots full!" +#define TR_INVERTED_SERIAL INDENT "Invert" +#define TR_IGNORE_INSTANCE INDENT "Ignore instance" +#define TR_DISCOVER_SENSORS INDENT "Discover new sensors" +#define TR_STOP_DISCOVER_SENSORS INDENT "Stop discovery" +#define TR_DELETE_ALL_SENSORS INDENT "Delete all sensors" +#define TR_CONFIRMDELETE "Really delete all?" +#define TR_SELECT_WIDGET "Select widget" +#define TR_REMOVE_WIDGET "Remove widget" +#define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" + +#define TR_MENU_INPUTS "\314Inputs" +#define TR_MENU_LUA "\322Lua scripts" +#define TR_MENU_STICKS "\307Sticks" +#define TR_MENU_POTS "\310Pots" +#define TR_MENU_MAX "\315MAX" +#define TR_MENU_HELI "\316Cyclic" +#define TR_MENU_TRIMS "\313Trims" +#define TR_MENU_SWITCHES "\312Switches" +#define TR_MENU_LOGICAL_SWITCHES "\312Logical Switches" +#define TR_MENU_TRAINER "\317Trainer" +#define TR_MENU_CHANNELS "\320Channels" +#define TR_MENU_GVARS "\311GVars" +#define TR_MENU_TELEMETRY "\321Telemetry" +#define TR_MENU_OTHER "Other" +#define TR_MENU_INVERT "Invert" + +#define ZSTR_RSSI "RSSI" +#define ZSTR_SWR "SWR" +#define ZSTR_A1 "A1" +#define ZSTR_A2 "A2" +#define ZSTR_A3 "A3" +#define ZSTR_A4 "A4" +#define ZSTR_BATT "RxBt" +#define ZSTR_ALT "Alt" +#define ZSTR_TEMP1 "Tmp1" +#define ZSTR_TEMP2 "Tmp2" +#define ZSTR_RPM "RPM" +#define ZSTR_FUEL "Fuel" +#define ZSTR_VSPD "VSpd" +#define ZSTR_ACCX "AccX" +#define ZSTR_ACCY "AccY" +#define ZSTR_ACCZ "AccZ" +#define ZSTR_CURR "Curr" +#define ZSTR_VFAS "VFAS" +#define ZSTR_ASPD "ASpd" +#define ZSTR_GSPD "GSpd" +#define ZSTR_HDG "Hdg" +#define ZSTR_CELLS "Cels" +#define ZSTR_GPSALT "GAlt" +#define ZSTR_GPSDATETIME "Date" +#define ZSTR_GPS "GPS" +#define ZSTR_BATT1_VOLTAGE "RB1V" +#define ZSTR_BATT2_VOLTAGE "RB2V" +#define ZSTR_BATT1_CURRENT "RB1A" +#define ZSTR_BATT2_CURRENT "RB2A" +#define ZSTR_BATT1_CONSUMPTION "RB1C" +#define ZSTR_BATT2_CONSUMPTION "RB2C" +#define ZSTR_RB_STATE "RBS" +#define ZSTR_CHANS_STATE "RBCS" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 09e1ec1ec..7718c2671 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1,1186 +1,1177 @@ -/* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini - * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * - * - * !!!!! DO NOT EDIT se.h - EDIT se.h.txt INSTEAD !!!!!!! - * - * In order to make translations easier se.h.txt is parsed and national - * characters are replaced by bitmap codes. The result is se.h. - * - * See translate.py in the util folder for the list of character codes - * - * !!!!! DO NOT EDIT se.h - EDIT se.h.txt INSTEAD !!!!!!! - */ - /* Formatting octal codes available in TR_ strings: - * \037\x -sets LCD x-coord (x value in octal) - * \036 -newline - * \035 -horizontal tab (ARM only) - * \001 to \034 -extended spacing (value * FW/2) - * \0 -ends current string - */ - - - - - - - - - - - -// NON ZERO TERMINATED STRINGS -#define LEN_OFFON "\003" -#define TR_OFFON "Av ""På\0" - -#define LEN_MMMINV "\003" -#define TR_MMMINV "---""INV" - -#define LEN_NCHANNELS "\004" -#define TR_NCHANNELS "\0014KN\0016KN\0018KN10KN12KN14KN16KN" - -#define LEN_VBEEPMODE "\005" -#define TR_VBEEPMODE "Tyst\0""Alarm""EjKnp""Alla\0" - -#define LEN_VBEEPLEN "\005" -#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0" - -#define LEN_VRENAVIG "\003" -#define TR_VRENAVIG "No REaREb" - -#define LEN_VBLMODE TR("\005", "\010") -#define TR_VBLMODE TR("Av\0 ""Knapp""Spak ""Allt ""På\0 ", "Av\0 ""Knappar ""Spakar\0 ""Allt\0 ""På\0 ") - -#define LEN_TRNMODE "\002" -#define TR_TRNMODE "Av""+="":=" - -#define LEN_TRNCHN "\003" -#define TR_TRNCHN "KN1KN2KN3KN4" - -#define LEN_UART3MODES "\022" -#define TR_UART3MODES "Av\0 ""Spegling av S-Port""Telemetri\0 ""SBUS Trainer\0 ""Debug\0" - -#define LEN_SWTYPES "\006" -#define TR_SWTYPES "Ingen\0""Flipp ""2Pos\0 ""3Pos\0" - -#define LEN_POTTYPES "\020" -#define TR_POTTYPES "Ingen\0 ""Mittläges-pot\0 ""Flerlägesväljare""Potentiometer\0" - -#define LEN_SLIDERTYPES "\006" -#define TR_SLIDERTYPES "Ingen\0""Slider" - -#define LEN_DATETIME "\005" -#define TR_DATETIME "DAG: ""TID: " - -#define LEN_VLCD "\006" -#define TR_VLCD "NormalOptrex" - -#define LEN_VPERSISTENT "\014" -#define TR_VPERSISTENT "Av\0 ""Flygning\0 ""Nolla Själv\0" - -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") - -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF" - -#define LEN_XJT_PROTOCOLS "\004" -#define TR_XJT_PROTOCOLS "Av\0 ""D16\0""D8\0 ""LR12" - -#define LEN_DSM_PROTOCOLS "\004" -#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" - -#define LEN_VTRIMINC TR("\006","\014") -#define TR_VTRIMINC TR("Expo\0 ""xFin\0 ""Fin\0 ""Medium""Grov\0 ","Exponentiell""Extra Fin\0 ""Fin\0 ""Medium\0 ""Grov\0 ") - -#define LEN_VDISPLAYTRIMS "\005" -#define TR_VDISPLAYTRIMS "Nej\0 ""Ändra""Ja\0 " - -#define LEN_VBEEPCOUNTDOWN "\007" -#define TR_VBEEPCOUNTDOWN "Tyst\0 Pip\0 Röst\0 Vibrera" - -#define LEN_VVARIOCENTER "\004" -#define TR_VVARIOCENTER "Pip\0""Tyst" - -#define LEN_CURVE_TYPES "\006" -#define TR_CURVE_TYPES "Normal""Egen\0 " - -#define LEN_RETA123 "\001" - -#if defined(PCBFLAMENCO) - #define TR_RETA123 "RHGS123HV" -#elif defined(PCBTARANIS) && defined(REV9E) - #define TR_RETA123 "RHGS1234HVHV" -#elif defined(PCBTARANIS) || defined(REVX) - #define TR_RETA123 "RHGS123HV" -#elif defined(PCBSKY9X) - #define TR_RETA123 "RHGS123a" -#elif defined(CPUM2560) - #define TR_RETA123 "RHGS123ab" -#else - #define TR_RETA123 "RHGS123" -#endif - -#define LEN_VPROTOS "\006" - -#if defined(PXX) - #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) - #define TR_PXX "[PXX]\0" -#else - #define TR_PXX -#endif - -#if defined(DSM2) - #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" -#else - #define TR_DSM2 -#endif - -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - -#if defined(CPUARM) - #define TR_XPPM -#else - #define TR_XPPM "PPM16\0""PPMsim" -#endif - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS - -#define LEN_POSNEG "\003" -#define TR_POSNEG "Pos""Neg" - -#if defined(PCBSKY9X) && defined(REVX) - #define LEN_VOUTPUT_TYPE "\011" - #define TR_VOUTPUT_TYPE "OpenDrain""PushPull\0" -#endif - -#define LEN_VCURVEFUNC "\003" -#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" - -#define LEN_VMLTPX "\010" -#define TR_VMLTPX "Addera ""Förstärk""Ersätt " - -#define LEN_VMLTPX2 "\002" -#define TR_VMLTPX2 "+=""*="":=" - -#define LEN_VMIXTRIMS "\003" -#define TR_VMIXTRIMS "Av\0""På\0""Rod""Hjd""Gas""Ske" - -#if defined(PCBTARANIS) - #define TR_CSWTIMER "Timer" - #define TR_CSWSTICKY "Seg\0 " - #define TR_CSWRANGE "Vidd\0" - #define TR_CSWSTAY "Kant\0" -#else - #define TR_CSWTIMER "Tim\0 " - #define TR_CSWSTICKY "Seg\0 " - #if defined(CPUARM) - #define TR_CSWRANGE "Vidd\0" - #define TR_CSWSTAY "Kant\0" - #else - #define TR_CSWRANGE - #define TR_CSWSTAY - #endif -#endif - -#if defined(CPUARM) - #define TR_CSWEQUAL "a=x\0 " -#else - #define TR_CSWEQUAL -#endif - -#define LEN_VCSWFUNC "\005" -#if defined(CPUARM) -#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a= 212 - #define TR_SF_SAFETY "Säkra \0 " -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Säkra \0 " -#else - #define TR_SF_SAFETY "---\0 " -#endif - -#if defined(PCBTARANIS) - #define TR_SF_SCREENSHOT "Skärmbild" -#else - #define TR_SF_SCREENSHOT -#endif - -#define TR_SF_RESERVE "[reserve]\0" - -#if defined(CPUARM) - #define TR_VFSWFUNC TR_SF_SAFETY "Trainer\0 ""Sätt Trim\0""Nollställ\0""Sätt\0 " TR_ADJUST_GVAR "Volym\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Belysning\0" TR_SF_SCREENSHOT TR_SF_TEST -#elif defined(PCBGRUVIN9X) - #define TR_VFSWFUNC TR_SF_SAFETY "Trainer \0 ""Sätt Trim\0""Nollställ\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Belysning\0" TR_SF_TEST -#else - #define TR_VFSWFUNC TR_SF_SAFETY "Trainer \0 ""Sätt Trim\0""Nollställ\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC "Belysning\0" TR_SF_TEST -#endif - -#define LEN_VFSWRESET TR("\004", "\011") - -#if defined(FRSKY) - #define TR_FSW_RESET_TELEM TR("Telm", "Telemetry") -#else - #define TR_FSW_RESET_TELEM -#endif - -#if ROTARY_ENCODERS == 2 - #define TR_FSW_RESET_ROTENC TR("REa\0""REb\0", "RotEnk A\0""RotEnk B\0") -#elif ROTARY_ENCODERS == 1 - #define TR_FSW_RESET_ROTENC TR("R.E.", "RotEnk\0 ") -#else - #define TR_FSW_RESET_ROTENC -#endif - -#if defined(PCBTARANIS) - #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " -#elif defined(CPUARM) - #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" -#else - #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2" -#endif - -#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "All\0" TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, TR_FSW_RESET_TIMERS "Alla\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC) - -#define LEN_FUNCSOUNDS TR("\004", "\006") -#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Wrn1""Wrn2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Warn1 ""Warn2 ""Cheep ""Ratata""Tick ""Siren ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") - -#define LEN_VTELEMCHNS TR("\004", "\005") - -#if defined(CPUARM) - #define TR_TELEM_RESERVE TR("[--]", "[---]") - #define TR_TELEM_TIME TR("Tid\0", "Tid\0 ") - #define TR_SWR TR("SWR\0", "SWR\0 ") - #define TR_RX_BATT TR("[NA]", "[NA]\0") - #define TR_A3_A4 TR("A3\0 ""A4\0 ", "A3\0 ""A4\0 ") - #define TR_A3_A4_MIN TR("A3-\0""A4-\0", "A3-\0 ""A4-\0 ") -#else - #define TR_TELEM_RESERVE - #define TR_TELEM_TIME - #define TR_SWR - #define TR_RX_BATT - #define TR_A3_A4 - #define TR_A3_A4_MIN -#endif - -#define TR_ASPD_MAX TR("ASp+", "ASpd+") - -#if defined(PCBTARANIS) - #define TR_TELEM_RSSI_RX "RSSI\0" -#else - #define TR_TELEM_RSSI_RX TR("Rx\0 ", "Rx\0 ") -#endif - -#if defined(CPUARM) - #define TR_TELEM_TIMERS TR("Tmr1""Tmr2""Tmr3", "Tmr1\0""Tmr2\0""Tmr3\0") -#else - #define TR_TELEM_TIMERS TR("Tmr1""Tmr2", "Tmr1\0""Tmr2\0") -#endif - -#if LCD_W >= 212 - #define TR_VTELEMCHNS "---\0 ""Batt\0" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Cells""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\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-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Tid\0 " -#else - #define TR_VTELEMCHNS "---\0""Batt" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\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""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Tid\0" -#endif - -#define LENGTH_UNIT_IMP "fot" -#define SPEED_UNIT_IMP "mph" -#define LENGTH_UNIT_METR "m\0 " -#define SPEED_UNIT_METR "kmh" - -#if defined(CPUARM) - #define LEN_VUNITSSYSTEM TR("\006", "\010") - #define TR_VUNITSSYSTEM TR("Metri.""Imper.", "Metriska""Imperial") - #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" -#else - #if defined(IMPERIAL_UNITS) - #define LENGTH_UNIT LENGTH_UNIT_IMP - #define SPEED_UNIT SPEED_UNIT_IMP - #else - #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 " -#endif - -#define STR_V (STR_VTELEMUNIT+1) -#define STR_A (STR_VTELEMUNIT+4) - -#define LEN_VALARM "\003" -#define TR_VALARM "---""Gul""Ora""Röd" - -#define LEN_VALARMFN "\001" -#define TR_VALARMFN "<>" - -#define LEN_VTELPROTO "\007" -#define TR_VTELPROTO "---\0 ""Hub\0 ""WSHHög." - -#if defined(CPUARM) - #define LEN_AMPSRC TR("\003", "\007") - #define TR_AMPSRC TR("---""A1\0""A2\0""A3\0""A4\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells\0 ") - #define LEN_VOLTSRC TR("\003", "\007") - #define TR_VOLTSRC TR("A1\0""A2\0""A3\0""A4\0""FAS""Cel", "A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells\0 ") -#else - #define LEN_AMPSRC TR("\003", "\007") - #define TR_AMPSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Cells\0 ") -#endif - -#define LEN_VARIOSRC "\005" -#if defined(FRSKY_SPORT) - #define TR_VARIOSRC "Vario""A1\0 ""A2\0" -#else - #define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0" -#endif - -#if defined(CPUARM) - #define LEN_VTELEMSCREENTYPE "\007" - #define TR_VTELEMSCREENTYPE "Inget\0 ""Siffror""Staplar""Script\0" -#else - #define LEN_VTELEMSCREENTYPE "\007" - #define TR_VTELEMSCREENTYPE "Siffror""Staplar" -#endif - -#define LEN_GPSFORMAT "\004" -#define TR_GPSFORMAT "HMS NMEA" - -#define LEN2_VTEMPLATES 13 -#define LEN_VTEMPLATES "\015" -#define TR_VTEMPLATES "Nolla Mixar\0\0""Enkel 4kanal\0""Gasklippning\0""V-Stjärt \0""Deltavinge \0""eCCPM \0""Helikopter \0""Servotest \0" - -#define LEN_VSWASHTYPE "\004" -#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" - -#if defined(PCBHORUS) -#define LEN_VKEYS "\006" -#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Upp\0 ""Ned\0 ""Höger\0""Vänst" -#elif defined(PCBTARANIS) -#define LEN_VKEYS "\005" -#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" -#else -#define LEN_VKEYS "\005" -#define TR_VKEYS "Menu\0""Exit\0""Ned\0 ""Upp\0 ""Höger""Vänst" -#endif - -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - -#define LEN_VSWITCHES "\003" -#define LEN_VSRCRAW "\004" - - -#define TR_STICKS_VSRCRAW TR("Rod\0""Hjd\0""Gas\0""Ske\0", "\307Rod""\307Hjd""\307Gas""\307Ske") -#define TR_TRIMS_VSRCRAW TR("TrmR""TrmH""TrmG""TrmS", "\313Rod""\313Hjd""\313Gas""\313Ske") - -#if defined(PCBHORUS) - #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" -#elif defined(PCBFLAMENCO) - #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " - #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " -#elif defined(PCBTARANIS) && defined(REV9E) - #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" -#elif defined(PCBTARANIS) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" -#else - #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " - #define TR_SW_VSRCRAW "3Pos" - #define TR_9X_3POS_SWITCHES "ID0""ID1""ID2" -#endif - -#if defined(CPUARM) - #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12""L13""L14""L15""L16""L17""L18""L19""L20""L21""L22""L23""L24""L25""L26""L27""L28""L29""L30""L31""L32" -#else - #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12" -#endif - -#define TR_TRIMS_SWITCHES TR("tRv""tRh""tHn""tHu""tGn""tGu""tSv""tSh", "\313Rv""\313Rh""\313Hn""\313Hu""\313Gn""\313Gu""\313Sv""\313Sh") - -#if defined(PCBSKY9X) - #define TR_ROTARY_ENCODERS "REa\0" - #define TR_ROTENC_SWITCHES "REa" -#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560) - #define TR_ROTARY_ENCODERS "REa\0""REb\0" - #define TR_ROTENC_SWITCHES "REa""REb" -#else - #define TR_ROTARY_ENCODERS - #define TR_ROTENC_SWITCHES -#endif - - -#if defined(PCBFLAMENCO) - #define TR_PHYS_SWITCHES "SA\300""SA-""SA\301""SB\300""SB\301""SC1""SC2""SC3""SC4""SC5""SC6""SE\300""SE\301""SF\300""SF-""SF\301" -#elif !defined(PCBTARANIS) && !defined(PCBHORUS) - #define TR_PHYS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" -#endif - -#define TR_ON_ONE_SWITCHES "På\0""Ett" - - -#if defined(PCBFLAMENCO) - #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "På\0""Ett" -#elif defined(PCBTARANIS) || defined(PCBHORUS) - // only special switches here - #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES -#else - #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES -#endif - -#if defined(HELI) - #define TR_CYC_VSRCRAW "CYK1""CYK2""CYK3" -#else - #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" -#endif - -#if defined(CPUARM) - #define TR_RESERVE_VSRCRAW "[--]" - #define TR_EXTRA_VSRCRAW "Batt""Tid\0" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3" -#else - #define TR_EXTRA_VSRCRAW -#endif - -#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "Max\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW - -#define LEN_VTMRMODES "\003" -#define TR_VTMRMODES "Av\0""På\0""GAs""GA%""GAt" - -#define LEN_VTRAINERMODES "\022" -#define TR_VTRAINERMODES "Lärare/Uttag\0 ""Elev./Uttag\0 ""Lärare/SBUS-Modul\0""Lärare/CPPM-Modul\0""Lärare/Batteri\0" - -#define LEN_VFAILSAFE "\011" -#define TR_VFAILSAFE "Ej givet""Lås Servo""Anpassat\0""Pulsfritt""Mottagare" - -#if defined(MAVLINK) - #define LEN_MAVLINK_BAUDS "\006" - #define TR_MAVLINK_BAUDS "4800 ""9600 ""14400 ""19200 ""38400 ""57600 ""76800 ""115200" - #define LEN_MAVLINK_AC_MODES "\011" - #define TR_MAVLINK_AC_MODES "Stabil ""Akrobat ""Lås Höjd ""Automat ""Guidad ""Hovra ""Flyg Hem ""Cirkla ""Håll Pos.""Landa ""OF Hovra ""Leksak A ""Leksak M ""OGILTIG " - #define LEN_MAVLINK_AP_MODES "\015" - #define TR_MAVLINK_AP_MODES "Manuell ""Cirkla ""Stabilisera ""Övning ""Fly by Wire A""Fly by Wire A""Automatisk ""Flyg Hem ""Hovra ""Guidad ""Initialiserar""OGILTIG " -#endif - -#define LEN_VSENSORTYPES "\010" -#define TR_VSENSORTYPES "Egen\0 ""Beräknad" - -#define LEN_VFORMULAS "\014" -#define TR_VFORMULAS "Addera\0 ""Medelvärde\0 ""Min\0 ""Max\0 ""Multiplicera""Totalsumma\0 ""Cell\0 ""Förbrukning ""Sträcka " - -#define LEN_VPREC "\004" -#define TR_VPREC "0.--""0.0 ""0.00" - -#define LEN_VCELLINDEX "\010" -#define TR_VCELLINDEX "Lägsta\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Högsta\0 ""Skillnad" - -// ZERO TERMINATED STRINGS -#if defined(COLORLCD) - #define INDENT " " - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - -#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) - #define TR_ENTER "[ENTER]" -#else - #define TR_ENTER "[MENU]" -#endif - -#define TR_EXIT "[EXIT]" - -#if defined(PCBFLAMENCO) - #define TR_POPUPS TR_EXIT "\010" TR_ENTER -#elif defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -#else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT - #define OFS_EXIT sizeof(TR_ENTER) -#endif - -#define TR_MENUWHENDONE CENTER "\011" TR_ENTER " Avslutar " -#define TR_FREE "kvar" -#define TR_DELETEMODEL "Radera Modell" -#define TR_COPYINGMODEL "Kopierar Modell " -#define TR_MOVINGMODEL "Flyttar Modell " -#define TR_LOADINGMODEL "Laddar Modell " -#define TR_NAME "Namn" -#define TR_MODELNAME "Modellnamn" -#define TR_PHASENAME "Lägesnamn " -#define TR_MIXNAME "Mixnamn " -#define TR_INPUTNAME "Inputnamn" -#if defined(PCBTARANIS) - #define TR_EXPONAME "Radnamn" -#else - #define TR_EXPONAME "Exponamn" -#endif -#define TR_BITMAP "Modellikon" -#define TR_TIMER TR("Timer","Timer ") -#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_DISPLAY_TRIMS "Display Trims" -#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_USE_GLOBAL_FUNCS TR("Glob. Funk","Globala Funktioner") -#if defined(PCBSKY9X) && defined(REVX) - #define TR_OUTPUT_TYPE INDENT "Output" -#endif -#define TR_PROTO TR(INDENT "Proto", INDENT "Protokoll") -#if defined(CPUARM) - #define TR_PPMFRAME INDENT "PPM-paket" -#else - #define TR_PPMFRAME "PPM-paket" -#endif -#define TR_MS "ms" -#define TR_SWITCH "Brytare" -#define TR_TRIMS "Trimmar" -#define TR_FADEIN "Tona In" -#define TR_FADEOUT "Tona Ut" -#define TR_DEFAULT "Standard" -#define TR_CHECKTRIMS CENTER "\006Kolla\012Trimmar" -#define OFS_CHECKTRIMS CENTER_OFS+(9*FW) -#define TR_SWASHTYPE "Swashtyp" -#define TR_COLLECTIVE "Kollektiv" -#define TR_AILERON "Skevroder-källa" -#define TR_ELEVATOR "Höjdroder-källa" -#define TR_SWASHRING "Swashring" -#define TR_ELEDIRECTION "HöJD Riktning" -#define TR_AILDIRECTION "SKEV Riktning" -#define TR_COLDIRECTION "PITCH Riktn. " -#define TR_MODE INDENT"Läge" -#define TR_NOFREEEXPO "Expo saknas!" -#define TR_NOFREEMIXER "Mixer saknas!" -#define TR_SOURCE INDENT"Källa" -#define TR_WEIGHT "Vikt" -#define TR_EXPO TR("Expo","Exponentiell") -#define TR_SIDE "Sida" -#define TR_DIFFERENTIAL "Diff." -#define TR_OFFSET INDENT"Offset" -#define TR_TRIM "Trim" -#define TR_DREX "DRex" -#define DREX_CHBOX_OFFSET 30 -#define TR_CURVE "Kurva" -#define TR_FLMODE TR("Läge","Flyglägen") -#define TR_MIXWARNING "Varning" -#define TR_OFF "Av " -#define TR_MULTPX "Multpx" -#define TR_DELAYDOWN "Dröj Ned" -#define TR_DELAYUP "Dröj Upp" -#define TR_SLOWDOWN "Trög Ned" -#define TR_SLOWUP "Trög Upp" -#define TR_MIXER "MIXAR" -#define TR_CV "KU" -#define TR_GV "GV" -#define TR_ACHANNEL "A\004kanal " -#define TR_RANGE INDENT"MinMax" -#define TR_CENTER INDENT "Center" -#define TR_BAR "Data" -#define TR_ALARM INDENT"Alarm" -#define TR_USRDATA "Användardata" -#define TR_BLADES INDENT"Blad" -#define TR_SCREEN "Skärm " -#define TR_SOUND_LABEL "Ljud " -#define TR_LENGTH INDENT"Tid" -#define TR_BEEP_LENGTH INDENT "Pip-längd" -#define TR_SPKRPITCH INDENT "Pip-ton" -#define TR_HAPTIC_LABEL "Vibrator" -#define TR_HAPTICSTRENGTH INDENT"Styrka" -#define TR_CONTRAST "Kontrast" -#define TR_ALARMS_LABEL "Alarm" -#define TR_BATTERY_RANGE "Batteri-MinMax" -#define TR_BATTERYWARNING INDENT"Batteri" -#define TR_INACTIVITYALARM INDENT"Inaktivitet" -#define TR_MEMORYWARNING INDENT"Lite Minne" -#define TR_ALARMWARNING INDENT"Ljud Av" -#define TR_RENAVIG "RotEnk Navig" -#define TR_THROTTLE_LABEL "Gas" -#define TR_THROTTLEREVERSE TR("Inv.Gas", INDENT "Inverterad Gas") -#define TR_TIMER_NAME INDENT "Namn" -#define TR_MINUTEBEEP INDENT "Minutpip" -#define TR_BEEPCOUNTDOWN INDENT "Nedräkning" -#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_BLCOLOR INDENT "Color" -#define TR_THROTTLEWARNING TR("Gasvarning", INDENT "Gasvarning") -#define TR_SWITCHWARNING TR("Bryt.varn.", INDENT "Brytarvarning") -#define TR_POTWARNING TR("Rattvarn.", INDENT "Rattvarning") -#define TR_TIMEZONE TR("Tidszon", "GPS Tidszon") -#define TR_ADJUST_RTC INDENT "Adjust RTC" -#define TR_GPS "GPS" -#define TR_RXCHANNELORD "Kanaler i RX" -#define TR_STICKS "Sticks" -#define TR_POTS "Pots" -#define TR_SWITCHES "Switches" -#define TR_SWITCHES_DELAY "Brytarfördröjning" -#define TR_SLAVE "Elev" -#define TR_MODESRC " Läge\004% Källa" -#define TR_MULTIPLIER "Styrka" -#define TR_CAL "Kalib." -#define TR_VTRIM "Trim- +" -#define TR_BG "BG:" -#if defined(PCBHORUS) - #define TR_MENUTOSTART "Press [Enter] to start" - #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" - #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" -#elif defined(COLORLCD) - #define TR_MENUTOSTART TR_ENTER " Startar " - #define TR_SETMIDPOINT "Centrera Allt" - #define TR_MOVESTICKSPOTS "Rör Spakar/Rattar" -#else - #define TR_MENUTOSTART CENTER "\011" TR_ENTER " Startar " - #define TR_SETMIDPOINT TR(CENTER "\012Centrera Allt",CENTER "\013Centrera Allt") - #define TR_MOVESTICKSPOTS TR(CENTER "\005Rör Spakar/Rattar",CENTER "\006Rör Spakar/Rattar") -#endif -#define TR_RXBATT "Rx Batt:" -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 -#define TR_ACCEL "Acc:" -#define TR_NODATA CENTER "DATA SAKNAS" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" -#define TR_TMR1LATMAXUS "Tmr1Lat max\037\124us" -#define STR_US (STR_TMR1LATMAXUS+13) -#define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" -#define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" - -#if defined(CPUARM) - #define TR_TMIXMAXMS "Tmix max" - #define TR_FREESTACKMINB "Free Stack" -#else - #define TR_TMIXMAXMS "Tmix max\037\124ms" - #define TR_FREESTACKMINB "Free Stack\037\124b" -#endif - -#define TR_MENUTORESET CENTER TR_ENTER " Nollar" -#define TR_PPM_TRAINER "TR" -#define TR_CH "KN" -#define TR_MODEL "Modell" -#define TR_FP "FL" -#define TR_MIX "MIX" -#define TR_EEPROMLOWMEM "Minnesbrist" -#define TR_ALERT "\016OBS" -#define TR_PRESSANYKEYTOSKIP "Tryck ned en knapp" -#define TR_THROTTLENOTIDLE "Gasen är påslagen!" -#define TR_ALARMSDISABLED "Alarmen Avstängda!" -#define TR_PRESSANYKEY "Tryck ned en knapp" -#define TR_BADEEPROMDATA "Minnet kan inte tolkas" -#define TR_BAD_RADIO_DATA "Data från radion kan inte tolkas" -#define TR_EEPROMFORMATTING "Minnet Nollställs" -#define TR_STORAGE_FORMAT "SD-Lagring förbereds" -#define TR_EEPROMOVERFLOW "Minnesfel" -#define TR_MENURADIOSETUP "INSTÄLLNINGAR" -#define TR_MENUDATEANDTIME "DAG OCH TID" -#define TR_MENUTRAINER "TRAINER (PPM IN)" -#define TR_MENUGLOBALFUNCS "GLOBALA FUNKTIONER" -#define TR_MENUVERSION "VERSION" -#define TR_MENUDIAG TR("BRYTARE","TEST AV BRYTARE") -#define TR_MENUANA "ANALOGA VÄRDEN" -#define TR_MENUCALIBRATION "KALIBRERING" -#if defined(COLORLCD) - #define TR_TRIMS2OFFSETS "[Spara Trimvärden]" -#else - #define TR_TRIMS2OFFSETS "\006[Spara Trimvärden]" -#endif -#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(VIRTUALINPUTS) - #define TR_MENUINPUTS "INPUT" - #define TR_MENULIMITS "SERVON" -#else - #define TR_MENUINPUTS "SPAKAR" - #define TR_MENULIMITS "SERVON" -#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_MENUCUSTOMSCRIPTS "SPECIALKOD" -#define TR_MENUTELEMETRY "TELEMETRI" -#define TR_MENUTEMPLATES "MALLAR" -#define TR_MENUSTAT "STATISTIK" -#define TR_MENUDEBUG "DEBUG" -#if defined(CPUARM) - #define TR_RXNUM TR(INDENT "RxNum", INDENT "Mottagare Nr.") -#else - #define TR_RXNUM "RxNum" -#endif -#define TR_SYNCMENU "Synk [MENU]" -#define TR_LIMIT INDENT "Nivå" -#define TR_MINRSSI "Min Rssi" -#define TR_LATITUDE "Breddgrad" -#define TR_LONGITUDE "Längdgrad" -#define TR_GPSCOORD TR("GPS-Koordinater", "GPS-koordinatsystem") -#define TR_VARIO TR("Vario", "Variometer") -#define TR_PITCH_AT_ZERO INDENT "Ton vid Noll" -#define TR_PITCH_AT_MAX INDENT "Ton vid Max" -#define TR_REPEAT_AT_ZERO INDENT "Repetera vid Noll" -#define TR_POWEROFF "\027Stänger Av..." -#define TR_SHUTDOWN "STÄNGER AV" -#define TR_SAVEMODEL "Spara modellinställn." -#define TR_BATT_CALIB "Kalib. Batteri" -#define TR_CURRENT_CALIB "Kalib. Ström" -#define TR_VOLTAGE INDENT"Volt" -#define TR_CURRENT INDENT"Ampere" -#define TR_SELECT_MODEL "Välj Modell" -#define TR_CREATE_CATEGORY "Skapa Kategori" -#define TR_RENAME_CATEGORY "Byt Kat.namn" -#define TR_DELETE_CATEGORY "Ta Bort Kategori" -#define TR_CREATE_MODEL "Skapa Modell" -#define TR_DUPLICATE_MODEL "Dupl. Modell" -#define TR_CHANGE_CATEGORY "Change category" -#define TR_COPY_MODEL "Kopiera Modell" -#define TR_MOVE_MODEL "Flytta Modell" -#define TR_BACKUP_MODEL "Modell-backup" -#define TR_DELETE_MODEL "Ta Bort Modell" -#define TR_RESTORE_MODEL "Återställ Modell" -#define TR_SDCARD_ERROR "SDCARD-fel" -#define TR_NO_SDCARD "SDCARD saknas" -#define TR_SDCARD_FULL "SD-kort Fullt" -#define TR_INCOMPATIBLE "Inkompatibel" -#define TR_WARNING "VARNING" -#define TR_EEPROMWARN "EEPROM" -#define TR_STORAGE_WARNING "LAGRING" -#define TR_EEPROM_CONVERTING "EEPROM Konvertering" -#define TR_THROTTLEWARN "GAS" -#define TR_ALARMSWARN "ALARM" -#define TR_SWITCHWARN "BRYTARE" -#define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NO_FAILSAFE "Failsafe ej given" -#define TR_KEYSTUCK "Knapp-fel" -#define TR_INVERT_THR TR("Invert.Gas?", "Invertera Gasen?") -#define TR_SPEAKER_VOLUME INDENT "Volym" -#define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Ljusstyrka" -#define TR_CPU_TEMP "CPU temp.\016>" -#define TR_CPU_CURRENT "Ström\022>" -#define TR_CPU_MAH "Förbrukn." -#define TR_COPROC "CoProc." -#define TR_COPROC_TEMP "MB temp. \016>" -#define TR_CAPAWARNING INDENT "Låg Kapacitet" -#define TR_TEMPWARNING TR(INDENT "Hög Temp ", INDENT "Hög Temperatur") -#define TR_FUNC "Funk" -#define TR_V1 "V1" -#define TR_V2 "V2" -#define TR_DURATION "Tidlängd" -#define TR_DELAY "Fördröj" -#define TR_SD_CARD "SD-kort" -#define TR_SDHC_CARD "SD/HC-kort" -#define TR_NO_SOUNDS_ON_SD "Inga ljud i SD" -#define TR_NO_MODELS_ON_SD "Ingen modell i SD" -#define TR_NO_BITMAPS_ON_SD "Ikoner saknas på SD" -#define TR_NO_SCRIPTS_ON_SD "Programkod saknas på SD" -#define TR_SCRIPT_SYNTAX_ERROR "Script syntax error" -#define TR_SCRIPT_PANIC "Script panic" -#define TR_SCRIPT_KILLED "Script killed" -#define TR_SCRIPT_ERROR "Unknown error" -#define TR_PLAY_FILE "Spela" -#define TR_DELETE_FILE "Radera" -#define TR_COPY_FILE "Kopia" -#define TR_RENAME_FILE "Byt namn" -#define TR_ASSIGN_BITMAP "Tilldela ikon" -#define TR_EXECUTE_FILE "Utför" -#define TR_REMOVED " raderad" -#define TR_SD_INFO "Information" -#define TR_SD_FORMAT "Format" -#define TR_NA "N/A" -#define TR_HARDWARE "Hårdvara" -#define TR_FORMATTING "Formaterar..." -#define TR_TEMP_CALIB "Temp. kalib." -#define TR_TIME "Tid " -#define TR_BAUDRATE "BT Baudrate" -#define TR_SD_INFO_TITLE "SD INFO" -#define TR_SD_TYPE "Typ: " -#define TR_SD_SPEED "Hastighet:" -#define TR_SD_SECTORS "Sektorer:" -#define TR_SD_SIZE "Strl:" -#define TR_TYPE INDENT "Typ " -#define TR_GLOBAL_VARS "Globala Variabler" -#define TR_GVARS "GLOBAL V." -#define TR_GLOBAL_VAR "Global Variabel" -#define TR_MENUGLOBALVARS "GLOBALA VARIABLER" -#define TR_OWN "Egen" -#define TR_DATE "Datum" -#define TR_ROTARY_ENCODER "R.Enks" -#define TR_CHANNELS_MONITOR "Kanalöversikt" -#define TR_MIXERS_MONITOR "MIXER-SKÄRM" -#define TR_PATH_TOO_LONG "För lång sökväg" -#define TR_VIEW_TEXT "Visa Text" -#define TR_FLASH_BOOTLOADER "Skriv BootLoader" -#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" -#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" -#define TR_WRITING "\032Skriver..." -#define TR_CONFIRM_FORMAT "Formatera Minnet?" -#define TR_INTERNALRF "Intern Radio" -#define TR_EXTERNALRF "Extern Radiomodul" -#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge") -#define TR_FAILSAFESET "FailsafeInställning" -#define TR_MENUSENSOR "SENSOR" -#define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Landskod" -#define TR_VOICELANG "Röstspråk" -#define TR_UNITSSYSTEM "Enheter" -#define TR_EDIT "Redigera" -#define TR_INSERT_BEFORE "Addera Före" -#define TR_INSERT_AFTER "Addera Efter" -#define TR_COPY "Kopiera" -#define TR_MOVE "Flytta" -#define TR_PASTE "Infoga" -#define TR_DELETE "Radera" -#define TR_INSERT "Addera" -#define TR_RESET_FLIGHT "Nollställ Flygning" -#define TR_RESET_TIMER1 "Nollställ Timer1" -#define TR_RESET_TIMER2 "Nollställ Timer2" -#define TR_RESET_TIMER3 "Nollställ Timer3" -#define TR_RESET_TELEMETRY "Nollställ Telemetri" -#define TR_STATISTICS "Statistik" -#define TR_ABOUT_US "Om Oss" -#define TR_SETUP_SCREENS "Setup screens" -#define TR_AND_SWITCH "OCH Brytare" -#define TR_SF "BF" -#define TR_GF "GF" -#define TR_SPEAKER INDENT"Högtalare" -#define TR_BUZZER INDENT"Summer" -#define TR_BYTES "byte" -#define TR_MODULE_BIND TR("[Bnd]", "[Bind]") -#define TR_MODULE_RANGE TR("[Tst]", "[Testa]") -#define TR_RESET_BTN "[Nollställ]" -#define TR_SET "[Spara]" -#define TR_TRAINER "Trainer" -#define TR_ANTENNAPROBLEM CENTER "Fel på TX-antennen" -#define TR_MODELIDUSED TR("ID finns redan","ModellID används redan") -#define TR_MODULE INDENT "Modul" -#define TR_TELEMETRY_TYPE "Telemetrityp" -#define TR_TELEMETRY_SENSORS "Sensorer" -#define TR_VALUE "Värde" -#define TR_TOPLCDTIMER "Top LCD Timer" -#define TR_UNIT "Enhet" -#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till sensor..." -#define TR_CHANNELRANGE INDENT "Kanalområde" -#define TR_LOWALARM INDENT "Låg-alarm" -#define TR_CRITICALALARM INDENT "Kritiskt alarm" -#define TR_ENABLE_POPUP "Slå på Dialog" -#define TR_DISABLE_POPUP "Slå av Dialog" -#define TR_POPUP "Popup" -#define TR_MIN "Min" -#define TR_MAX "Max" -#define TR_CURVE_PRESET "Lutning..." -#define TR_PRESET "Lutning" -#define TR_MIRROR "Spegla" -#define TR_CLEAR "Töm" -#define TR_RESET "Nollställ" -#define TR_RESET_SUBMENU "Nollställ..." -#define TR_COUNT "Antal" -#define TR_PT "pt" -#define TR_PTS "pkt" -#define TR_SMOOTH "Mjuk" -#define TR_COPY_STICKS_TO_OFS "Spara spakar som subtrim" -#define TR_COPY_TRIMS_TO_OFS "Spara trimmar som subtrim" -#define TR_INCDEC "Inkr/Dekrement" -#define TR_GLOBALVAR "Globala Var" -#define TR_MIXSOURCE "Mixer Källa" -#define TR_CONSTANT "Konstant" -#define TR_PERSISTENT_MAH INDENT "Lagra mAh" -#define TR_PREFLIGHT "Startkontroller" -#define TR_CHECKLIST TR(INDENT "Checklista", INDENT "Visa Checklista") -#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Serieporten" -#define TR_SCRIPT "Programkod" -#define TR_INPUTS "Input" -#define TR_OUTPUTS "Outputs" -#define TR_EEBACKUP "\004[ENTER Lång] säkerhetskopiera EEPROM" -#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" -#define TR_CONFIRMRESET "Erase ALL models and settings?" -#define TR_TO_MANY_LUA_SCRIPTS "För många Lua-scripts!" - -#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_MAVLINK_BAUD_LABEL "Baudrate" - #define TR_MAVLINK_INFOS "INFOS" - #define TR_MAVLINK_MODE "LÄGE" - #define TR_MAVLINK_CUR_MODE "Nuvarande Läge" - #define TR_MAVLINK_ARMED "Osäkrad" - #define TR_MAVLINK_BAT_MENU_TITLE "BAT RSSI" - #define TR_MAVLINK_BATTERY_LABEL "Status för flygbatteri" - #define TR_MAVLINK_RC_RSSI_LABEL "RC RSSI" - #define TR_MAVLINK_PC_RSSI_LABEL "PC RSSI" - #define TR_MAVLINK_NAV_MENU_TITLE "NAV" - #define TR_MAVLINK_COURSE "Kurs" - #define TR_MAVLINK_HEADING "Riktning" - #define TR_MAVLINK_BEARING "Bäring" - #define TR_MAVLINK_ALTITUDE "Höjd" - #define TR_MAVLINK_GPS "GPS" - #define TR_MAVLINK_NO_FIX "EJ Lås" - #define TR_MAVLINK_SAT "SAT" - #define TR_MAVLINK_HDOP "HDOP" - #define TR_MAVLINK_LAT "LAT" - #define TR_MAVLINK_LON "LON" -#endif - -// Taranis column headers -#define TR_PHASES_HEADERS { " Namn ", " Brytare ", " Rodertrim ", " Höjdrodertrim ", " Gastrim ", " Skevrodertrim ", " Tona Upp ", " Tona Ned " } -#define TR_LIMITS_HEADERS { " Namn ", " Subtrim ", " Min ", " Max ", " Riktning ", " Kurva ", " PPM-center ", " Subtrim-läge " } -#define TR_CSW_HEADERS { " Funktion ", " V1 ", " V2 ", " V2 ", " OCH Brytare ", " Tidslängd ", " Fördröj " } -// About screen -#define TR_ABOUTUS "Om Oss" - -#define TR_ABOUT_OPENTX_1 "OpenTX är icke-kommersiell," -#define TR_ABOUT_OPENTX_2 "öppen programvara utan" -#define TR_ABOUT_OPENTX_3 "garantier som uvecklas helt" -#define TR_ABOUT_OPENTX_4 "ideellt. Stöd i form av" -#define TR_ABOUT_OPENTX_5 "donationer välkomnas!" - -#define TR_ABOUT_BERTRAND_1 "Bertrand Songis" -#define TR_ABOUT_BERTRAND_2 "Chefsutvecklare av OpenTX" -#define TR_ABOUT_BERTRAND_3 "Hjälputvecklare av Companion9x" - -#define TR_ABOUT_MIKE_1 "Mike Blandford" -#define TR_ABOUT_MIKE_2 "Kod och drivrutins-guru" -#define TR_ABOUT_MIKE_3 "Stor inspirationskälla" -#define TR_ABOUT_MIKE_4 "" - -#define TR_ABOUT_ROMOLO_1 "Romolo Manfredini" -#define TR_ABOUT_ROMOLO_2 "Chefsutvecklare av Companion9x" -#define TR_ABOUT_ROMOLO_3 "" - -#define TR_ABOUT_ANDRE_1 "Andre Bernet" -#define TR_ABOUT_ANDRE_2 "Funktionalitet, Användbarhet," -#define TR_ABOUT_ANDRE_3 "Felsökning, Dokumentation" - -#define TR_ABOUT_ROB_1 "Rob Thomson" -#define TR_ABOUT_ROB_2 "Webmaster för openRCforums" - -#define TR_ABOUT_KJELL_1 "Kjell Kernen" -#define TR_ABOUT_KJELL_2 "Utvecklare av www.open-tx.org" -#define TR_ABOUT_KJELL_3 "Utvecklare av OpenTX Recorder" -#define TR_ABOUT_KJELL_4 "Hjälputvecklare av Companion" - -#define TR_ABOUT_MARTIN_1 "Martin Hotar" -#define TR_ABOUT_MARTIN_2 "Grafikdesigner" - -#if defined(PCBFLAMENCO) - #define TR_ABOUT_HARDWARE_1 "XXX" - #define TR_ABOUT_HARDWARE_2 "Hardware designer/producer" - #define TR_ABOUT_HARDWARE_3 "" -#elif defined(PCBTARANIS) || defined(PCBHORUS) - #define TR_ABOUT_HARDWARE_1 "FrSky" - #define TR_ABOUT_HARDWARE_2 "Hårdvarudesign/producent" - #define TR_ABOUT_HARDWARE_3 "" -#else - #define TR_ABOUT_HARDWARE_1 "Brent Nelson" - #define TR_ABOUT_HARDWARE_2 "Sky9x design/producent" - #define TR_ABOUT_HARDWARE_3 "" -#endif - -#define TR_ABOUT_PARENTS_1 "Ursprungsprojekt" -#define TR_ABOUT_PARENTS_2 "ersky9x (Mike Blandford)" -#define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" -#define TR_ABOUT_PARENTS_4 "TH9X (Thomas Husterer)" - -#define TR_CHR_SHORT 's' -#define TR_CHR_LONG 'l' -#define TR_CHR_TOGGLE 't' -#define TR_CHR_HOUR 'h' -#define TR_CHR_INPUT 'I' // Values between A-I will work - -#define TR_BEEP_VOLUME "Volym Pip" -#define TR_WAV_VOLUME "Volym Wav" -#define TR_VARIO_VOLUME "Volym Vario" -#define TR_BG_VOLUME "Volym Bg" - -#define TR_TOP_BAR "Titelraden" -#define TR_ALTITUDE INDENT "Höjd" -#define TR_SCALE "Skala" -#define TR_VIEW_CHANNELS "Visa Kanaler" -#define TR_VIEW_NOTES "Visa Noteringars" -#define TR_MODEL_SELECT "Välj Modell" -#define TR_MODS_FORBIDDEN "Modifikationer förbjudna!" -#define TR_UNLOCKED "Olåst" -#define TR_ID "ID" -#define TR_PRECISION "Precision" -#define TR_RATIO "Ratio" -#define TR_FORMULA "Formel" -#define TR_CELLINDEX "Cell index" -#define TR_LOGS "Logga" -#define TR_OPTIONS "Options" - -#define TR_ALTSENSOR "Höjdsensor" -#define TR_CELLSENSOR "Cell sensor" -#define TR_GPSSENSOR "GPS sensor" -#define TR_CURRENTSENSOR "Sensor" -#define TR_AUTOOFFSET "Auto Offset" -#define TR_ONLYPOSITIVE "Positiv" -#define TR_FILTER "Filter" -#define TR_TELEMETRYFULL "Alla telemetriplatser upptagna!" -//TODO: translation -#define TR_INVERTED_SERIAL INDENT "Invert" -#define TR_IGNORE_INSTANCE TR(INDENT "Inst.fel", INDENT "Hantera Instansfel") -#define TR_DISCOVER_SENSORS INDENT "Sök nya sensorer" -#define TR_STOP_DISCOVER_SENSORS INDENT "Avbryt sökning" -#define TR_DELETE_ALL_SENSORS INDENT "Ta bort alla sensorer" -#define TR_CONFIRMDELETE "Ta bort alla?" -#define TR_SELECT_WIDGET "Select widget" -#define TR_REMOVE_WIDGET "Remove widget" -#define TR_WIDGET_SETTINGS "Widget settings" -#define TR_REMOVE_SCREEN "Remove screen" - -#define TR_MENU_INPUTS "\314Inputs" -#define TR_MENU_LUA "\322Lua scripts" -#define TR_MENU_STICKS "\307Spakars" -#define TR_MENU_POTS "\310Rattar" -#define TR_MENU_MAX "\315MAX" -#define TR_MENU_HELI "\316Cyclic" -#define TR_MENU_TRIMS "\313Trimm" -#define TR_MENU_SWITCHES "\312Brytare" -#define TR_MENU_LOGICAL_SWITCHES "\312Logiska Brytare" -#define TR_MENU_TRAINER "\317Trainer" -#define TR_MENU_CHANNELS "\320Servon" -#define TR_MENU_GVARS "\311GVars" -#define TR_MENU_TELEMETRY "\321Telemetri" -#define TR_MENU_OTHER "Annat" -#define TR_MENU_INVERT "Invertera" - -#define ZSTR_RSSI "RSSI" -#define ZSTR_SWR "SWR" -#define ZSTR_A1 "A1" -#define ZSTR_A2 "A2" -#define ZSTR_A3 "A3" -#define ZSTR_A4 "A4" -#define ZSTR_BATT "RxBt" -#define ZSTR_ALT "Alt" -#define ZSTR_TEMP1 "Tmp1" -#define ZSTR_TEMP2 "Tmp2" -#define ZSTR_RPM "RPM" -#define ZSTR_FUEL "Fuel" -#define ZSTR_VSPD "VSpd" -#define ZSTR_ACCX "AccX" -#define ZSTR_ACCY "AccY" -#define ZSTR_ACCZ "AccZ" -#define ZSTR_CURR "Curr" -#define ZSTR_VFAS "VFAS" -#define ZSTR_ASPD "ASpd" -#define ZSTR_GSPD "GSpd" -#define ZSTR_HDG "Hdg" -#define ZSTR_CELLS "Cels" -#define ZSTR_GPSALT "GAlt" -#define ZSTR_GPSDATETIME "Date" -#define ZSTR_GPS "GPS" -#define ZSTR_BATT1_VOLTAGE "RB1V" -#define ZSTR_BATT2_VOLTAGE "RB2V" -#define ZSTR_BATT1_CURRENT "RB1A" -#define ZSTR_BATT2_CURRENT "RB2A" -#define ZSTR_BATT1_CONSUMPTION "RB1C" -#define ZSTR_BATT2_CONSUMPTION "RB2C" -#define ZSTR_RB_STATE "RBS" -#define ZSTR_CHANS_STATE "RBCS" +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +// SE translations author: Kjell Kernen + +/* + * !!!!! DO NOT EDIT se.h - EDIT se.h.txt INSTEAD !!!!!!! + * + * In order to make translations easier se.h.txt is parsed and national + * characters are replaced by bitmap codes. The result is se.h. + * + * See translate.py in the util folder for the list of character codes + * + * !!!!! DO NOT EDIT se.h - EDIT se.h.txt INSTEAD !!!!!!! + */ + +/* + * Formatting octal codes available in TR_ strings: + * \037\x -sets LCD x-coord (x value in octal) + * \036 -newline + * \035 -horizontal tab (ARM only) + * \001 to \034 -extended spacing (value * FW/2) + * \0 -ends current string + */ + + +// NON ZERO TERMINATED STRINGS +#define LEN_OFFON "\003" +#define TR_OFFON "Av ""På\0" + +#define LEN_MMMINV "\003" +#define TR_MMMINV "---""INV" + +#define LEN_NCHANNELS "\004" +#define TR_NCHANNELS "\0014KN\0016KN\0018KN10KN12KN14KN16KN" + +#define LEN_VBEEPMODE "\005" +#define TR_VBEEPMODE "Tyst\0""Alarm""EjKnp""Alla\0" + +#define LEN_VBEEPLEN "\005" +#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0" + +#define LEN_VRENAVIG "\003" +#define TR_VRENAVIG "No REaREb" + +#define LEN_VBLMODE TR("\005", "\010") +#define TR_VBLMODE TR("Av\0 ""Knapp""Spak ""Allt ""På\0 ", "Av\0 ""Knappar ""Spakar\0 ""Allt\0 ""På\0 ") + +#define LEN_TRNMODE "\002" +#define TR_TRNMODE "Av""+="":=" + +#define LEN_TRNCHN "\003" +#define TR_TRNCHN "KN1KN2KN3KN4" + +#define LEN_UART3MODES "\022" +#define TR_UART3MODES "Av\0 ""Spegling av S-Port""Telemetri\0 ""SBUS Trainer\0 ""Debug\0" + +#define LEN_SWTYPES "\006" +#define TR_SWTYPES "Ingen\0""Flipp ""2Pos\0 ""3Pos\0" + +#define LEN_POTTYPES "\020" +#define TR_POTTYPES "Ingen\0 ""Mittläges-pot\0 ""Flerlägesväljare""Potentiometer\0" + +#define LEN_SLIDERTYPES "\006" +#define TR_SLIDERTYPES "Ingen\0""Slider" + +#define LEN_DATETIME "\005" +#define TR_DATETIME "DAG: ""TID: " + +#define LEN_VLCD "\006" +#define TR_VLCD "NormalOptrex" + +#define LEN_VPERSISTENT "\014" +#define TR_VPERSISTENT "Av\0 ""Flygning\0 ""Nolla Själv\0" + +#define LEN_COUNTRYCODES TR("\002", "\007") +#define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") + +#define LEN_TARANIS_PROTOCOLS "\004" +#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF" + +#define LEN_XJT_PROTOCOLS "\004" +#define TR_XJT_PROTOCOLS "Av\0 ""D16\0""D8\0 ""LR12" + +#define LEN_DSM_PROTOCOLS "\004" +#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" + +#define LEN_VTRIMINC TR("\006","\014") +#define TR_VTRIMINC TR("Expo\0 ""xFin\0 ""Fin\0 ""Medium""Grov\0 ","Exponentiell""Extra Fin\0 ""Fin\0 ""Medium\0 ""Grov\0 ") + +#define LEN_VDISPLAYTRIMS "\005" +#define TR_VDISPLAYTRIMS "Nej\0 ""Ändra""Ja\0 " + +#define LEN_VBEEPCOUNTDOWN "\007" +#define TR_VBEEPCOUNTDOWN "Tyst\0 Pip\0 Röst\0 Vibrera" + +#define LEN_VVARIOCENTER "\004" +#define TR_VVARIOCENTER "Pip\0""Tyst" + +#define LEN_CURVE_TYPES "\006" +#define TR_CURVE_TYPES "Normal""Egen\0 " + +#define LEN_RETA123 "\001" + +#if defined(PCBFLAMENCO) + #define TR_RETA123 "RHGS123HV" +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_RETA123 "RHGS1234HVHV" +#elif defined(PCBTARANIS) || defined(REVX) + #define TR_RETA123 "RHGS123HV" +#elif defined(PCBSKY9X) + #define TR_RETA123 "RHGS123a" +#elif defined(CPUM2560) + #define TR_RETA123 "RHGS123ab" +#else + #define TR_RETA123 "RHGS123" +#endif + +#define LEN_VPROTOS "\006" + +#if defined(PXX) + #define TR_PXX "PXX\0 " +#elif defined(DSM2) || defined(IRPROTOS) + #define TR_PXX "[PXX]\0" +#else + #define TR_PXX +#endif + +#if defined(DSM2) + #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " +#elif defined(IRPROTOS) + #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" +#else + #define TR_DSM2 +#endif + +#if defined(IRPROTOS) + #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" +#else + #define TR_IRPROTOS +#endif + +#if defined(CPUARM) + #define TR_XPPM +#else + #define TR_XPPM "PPM16\0""PPMsim" +#endif + +#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS + +#define LEN_POSNEG "\003" +#define TR_POSNEG "Pos""Neg" + +#if defined(PCBSKY9X) && defined(REVX) + #define LEN_VOUTPUT_TYPE "\011" + #define TR_VOUTPUT_TYPE "OpenDrain""PushPull\0" +#endif + +#define LEN_VCURVEFUNC "\003" +#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" + +#define LEN_VMLTPX "\010" +#define TR_VMLTPX "Addera ""Förstärk""Ersätt " + +#define LEN_VMLTPX2 "\002" +#define TR_VMLTPX2 "+=""*="":=" + +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "Av\0""På\0""Rod""Hjd""Gas""Ske" + +#if defined(PCBTARANIS) + #define TR_CSWTIMER "Timer" + #define TR_CSWSTICKY "Seg\0 " + #define TR_CSWRANGE "Vidd\0" + #define TR_CSWSTAY "Kant\0" +#else + #define TR_CSWTIMER "Tim\0 " + #define TR_CSWSTICKY "Seg\0 " + #if defined(CPUARM) + #define TR_CSWRANGE "Vidd\0" + #define TR_CSWSTAY "Kant\0" + #else + #define TR_CSWRANGE + #define TR_CSWSTAY + #endif +#endif + +#if defined(CPUARM) + #define TR_CSWEQUAL "a=x\0 " +#else + #define TR_CSWEQUAL +#endif + +#define LEN_VCSWFUNC "\005" +#if defined(CPUARM) +#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a= 212 + #define TR_SF_SAFETY "Säkra \0 " +#elif defined(OVERRIDE_CHANNEL_FUNCTION) + #define TR_SF_SAFETY "Säkra \0 " +#else + #define TR_SF_SAFETY "---\0 " +#endif + +#if defined(PCBTARANIS) + #define TR_SF_SCREENSHOT "Skärmbild" +#else + #define TR_SF_SCREENSHOT +#endif + +#define TR_SF_RESERVE "[reserve]\0" + +#if defined(CPUARM) + #define TR_VFSWFUNC TR_SF_SAFETY "Trainer\0 ""Sätt Trim\0""Nollställ\0""Sätt\0 " TR_ADJUST_GVAR "Volym\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Belysning\0" TR_SF_SCREENSHOT TR_SF_TEST +#elif defined(PCBGRUVIN9X) + #define TR_VFSWFUNC TR_SF_SAFETY "Trainer \0 ""Sätt Trim\0""Nollställ\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC TR_SDCLOGS "Belysning\0" TR_SF_TEST +#else + #define TR_VFSWFUNC TR_SF_SAFETY "Trainer \0 ""Sätt Trim\0""Nollställ\0" TR_ADJUST_GVAR TR_SOUND TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_VVARIO TR_HAPTIC "Belysning\0" TR_SF_TEST +#endif + +#define LEN_VFSWRESET TR("\004", "\011") + +#if defined(FRSKY) + #define TR_FSW_RESET_TELEM TR("Telm", "Telemetry") +#else + #define TR_FSW_RESET_TELEM +#endif + +#if ROTARY_ENCODERS == 2 + #define TR_FSW_RESET_ROTENC TR("REa\0""REb\0", "RotEnk A\0""RotEnk B\0") +#elif ROTARY_ENCODERS == 1 + #define TR_FSW_RESET_ROTENC TR("R.E.", "RotEnk\0 ") +#else + #define TR_FSW_RESET_ROTENC +#endif + +#if defined(PCBTARANIS) + #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " +#elif defined(CPUARM) + #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" +#else + #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2" +#endif + +#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "All\0" TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, TR_FSW_RESET_TIMERS "Alla\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC) + +#define LEN_FUNCSOUNDS TR("\004", "\006") +#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Wrn1""Wrn2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Warn1 ""Warn2 ""Cheep ""Ratata""Tick ""Siren ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") + +#define LEN_VTELEMCHNS TR("\004", "\005") + +#if defined(CPUARM) + #define TR_TELEM_RESERVE TR("[--]", "[---]") + #define TR_TELEM_TIME TR("Tid\0", "Tid\0 ") + #define TR_SWR TR("SWR\0", "SWR\0 ") + #define TR_RX_BATT TR("[NA]", "[NA]\0") + #define TR_A3_A4 TR("A3\0 ""A4\0 ", "A3\0 ""A4\0 ") + #define TR_A3_A4_MIN TR("A3-\0""A4-\0", "A3-\0 ""A4-\0 ") +#else + #define TR_TELEM_RESERVE + #define TR_TELEM_TIME + #define TR_SWR + #define TR_RX_BATT + #define TR_A3_A4 + #define TR_A3_A4_MIN +#endif + +#define TR_ASPD_MAX TR("ASp+", "ASpd+") + +#if defined(PCBTARANIS) + #define TR_TELEM_RSSI_RX "RSSI\0" +#else + #define TR_TELEM_RSSI_RX TR("Rx\0 ", "Rx\0 ") +#endif + +#if defined(CPUARM) + #define TR_TELEM_TIMERS TR("Tmr1""Tmr2""Tmr3", "Tmr1\0""Tmr2\0""Tmr3\0") +#else + #define TR_TELEM_TIMERS TR("Tmr1""Tmr2", "Tmr1\0""Tmr2\0") +#endif + +#if LCD_W >= 212 + #define TR_VTELEMCHNS "---\0 ""Batt\0" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Cells""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\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-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Tid\0 " +#else + #define TR_VTELEMCHNS "---\0""Batt" TR_TELEM_TIME TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_TIMERS TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\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""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Tid\0" +#endif + +#define LENGTH_UNIT_IMP "fot" +#define SPEED_UNIT_IMP "mph" +#define LENGTH_UNIT_METR "m\0 " +#define SPEED_UNIT_METR "kmh" + +#if defined(CPUARM) + #define LEN_VUNITSSYSTEM TR("\006", "\010") + #define TR_VUNITSSYSTEM TR("Metri.""Imper.", "Metriska""Imperial") + #define LEN_VTELEMUNIT "\003" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" +#else + #if defined(IMPERIAL_UNITS) + #define LENGTH_UNIT LENGTH_UNIT_IMP + #define SPEED_UNIT SPEED_UNIT_IMP + #else + #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 " +#endif + +#define STR_V (STR_VTELEMUNIT+1) +#define STR_A (STR_VTELEMUNIT+4) + +#define LEN_VALARM "\003" +#define TR_VALARM "---""Gul""Ora""Röd" + +#define LEN_VALARMFN "\001" +#define TR_VALARMFN "<>" + +#define LEN_VTELPROTO "\007" +#define TR_VTELPROTO "---\0 ""Hub\0 ""WSHHög." + +#if defined(CPUARM) + #define LEN_AMPSRC TR("\003", "\007") + #define TR_AMPSRC TR("---""A1\0""A2\0""A3\0""A4\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells\0 ") + #define LEN_VOLTSRC TR("\003", "\007") + #define TR_VOLTSRC TR("A1\0""A2\0""A3\0""A4\0""FAS""Cel", "A1\0 ""A2\0 ""A3\0 ""A4\0 ""FAS\0 ""Cells\0 ") +#else + #define LEN_AMPSRC TR("\003", "\007") + #define TR_AMPSRC TR("---""A1\0""A2\0""FAS""Cel", "---\0 ""A1\0 ""A2\0 ""FAS\0 ""Cells\0 ") +#endif + +#define LEN_VARIOSRC "\005" +#if defined(FRSKY_SPORT) + #define TR_VARIOSRC "Vario""A1\0 ""A2\0" +#else + #define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0" +#endif + +#if defined(CPUARM) + #define LEN_VTELEMSCREENTYPE "\007" + #define TR_VTELEMSCREENTYPE "Inget\0 ""Siffror""Staplar""Script\0" +#else + #define LEN_VTELEMSCREENTYPE "\007" + #define TR_VTELEMSCREENTYPE "Siffror""Staplar" +#endif + +#define LEN_GPSFORMAT "\004" +#define TR_GPSFORMAT "HMS NMEA" + +#define LEN2_VTEMPLATES 13 +#define LEN_VTEMPLATES "\015" +#define TR_VTEMPLATES "Nolla Mixar\0\0""Enkel 4kanal\0""Gasklippning\0""V-Stjärt \0""Deltavinge \0""eCCPM \0""Helikopter \0""Servotest \0" + +#define LEN_VSWASHTYPE "\004" +#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" + +#if defined(PCBHORUS) +#define LEN_VKEYS "\006" +#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Upp\0 ""Ned\0 ""Höger\0""Vänst" +#elif defined(PCBTARANIS) +#define LEN_VKEYS "\005" +#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" +#else +#define LEN_VKEYS "\005" +#define TR_VKEYS "Menu\0""Exit\0""Ned\0 ""Upp\0 ""Höger""Vänst" +#endif + +#define LEN_VRENCODERS "\003" +#define TR_VRENCODERS "REa""REb" + +#define LEN_VSWITCHES "\003" +#define LEN_VSRCRAW "\004" + + +#define TR_STICKS_VSRCRAW TR("Rod\0""Hjd\0""Gas\0""Ske\0", "\307Rod""\307Hjd""\307Gas""\307Ske") +#define TR_TRIMS_VSRCRAW TR("TrmR""TrmH""TrmG""TrmS", "\313Rod""\313Hjd""\313Gas""\313Ske") + +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" +#elif defined(PCBTARANIS) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#else + #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " + #define TR_SW_VSRCRAW "3Pos" + #define TR_9X_3POS_SWITCHES "ID0""ID1""ID2" +#endif + +#if defined(CPUARM) + #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12""L13""L14""L15""L16""L17""L18""L19""L20""L21""L22""L23""L24""L25""L26""L27""L28""L29""L30""L31""L32" +#else + #define TR_LOGICALSW "L1\0""L2\0""L3\0""L4\0""L5\0""L6\0""L7\0""L8\0""L9\0""L10""L11""L12" +#endif + +#define TR_TRIMS_SWITCHES TR("tRv""tRh""tHn""tHu""tGn""tGu""tSv""tSh", "\313Rv""\313Rh""\313Hn""\313Hu""\313Gn""\313Gu""\313Sv""\313Sh") + +#if defined(PCBSKY9X) + #define TR_ROTARY_ENCODERS "REa\0" + #define TR_ROTENC_SWITCHES "REa" +#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560) + #define TR_ROTARY_ENCODERS "REa\0""REb\0" + #define TR_ROTENC_SWITCHES "REa""REb" +#else + #define TR_ROTARY_ENCODERS + #define TR_ROTENC_SWITCHES +#endif + + +#if defined(PCBFLAMENCO) + #define TR_PHYS_SWITCHES "SA\300""SA-""SA\301""SB\300""SB\301""SC1""SC2""SC3""SC4""SC5""SC6""SE\300""SE\301""SF\300""SF-""SF\301" +#elif !defined(PCBTARANIS) && !defined(PCBHORUS) + #define TR_PHYS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" +#endif + +#define TR_ON_ONE_SWITCHES "På\0""Ett" + + +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "På\0""Ett" +#elif defined(PCBTARANIS) || defined(PCBHORUS) + // only special switches here + #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES +#else + #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES +#endif + +#if defined(HELI) + #define TR_CYC_VSRCRAW "CYK1""CYK2""CYK3" +#else + #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" +#endif + +#if defined(CPUARM) + #define TR_RESERVE_VSRCRAW "[--]" + #define TR_EXTRA_VSRCRAW "Batt""Tid\0" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3" +#else + #define TR_EXTRA_VSRCRAW +#endif + +#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "Max\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW + +#define LEN_VTMRMODES "\003" +#define TR_VTMRMODES "Av\0""På\0""GAs""GA%""GAt" + +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Lärare/Uttag\0 ""Elev./Uttag\0 ""Lärare/SBUS-Modul\0""Lärare/CPPM-Modul\0""Lärare/Batteri\0" + +#define LEN_VFAILSAFE "\011" +#define TR_VFAILSAFE "Ej givet""Lås Servo""Anpassat\0""Pulsfritt""Mottagare" + +#if defined(MAVLINK) + #define LEN_MAVLINK_BAUDS "\006" + #define TR_MAVLINK_BAUDS "4800 ""9600 ""14400 ""19200 ""38400 ""57600 ""76800 ""115200" + #define LEN_MAVLINK_AC_MODES "\011" + #define TR_MAVLINK_AC_MODES "Stabil ""Akrobat ""Lås Höjd ""Automat ""Guidad ""Hovra ""Flyg Hem ""Cirkla ""Håll Pos.""Landa ""OF Hovra ""Leksak A ""Leksak M ""OGILTIG " + #define LEN_MAVLINK_AP_MODES "\015" + #define TR_MAVLINK_AP_MODES "Manuell ""Cirkla ""Stabilisera ""Övning ""Fly by Wire A""Fly by Wire A""Automatisk ""Flyg Hem ""Hovra ""Guidad ""Initialiserar""OGILTIG " +#endif + +#define LEN_VSENSORTYPES "\010" +#define TR_VSENSORTYPES "Egen\0 ""Beräknad" + +#define LEN_VFORMULAS "\014" +#define TR_VFORMULAS "Addera\0 ""Medelvärde\0 ""Min\0 ""Max\0 ""Multiplicera""Totalsumma\0 ""Cell\0 ""Förbrukning ""Sträcka " + +#define LEN_VPREC "\004" +#define TR_VPREC "0.--""0.0 ""0.00" + +#define LEN_VCELLINDEX "\010" +#define TR_VCELLINDEX "Lägsta\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Högsta\0 ""Skillnad" + +// ZERO TERMINATED STRINGS +#if defined(COLORLCD) + #define INDENT " " + #define LEN_INDENT 3 + #define INDENT_WIDTH 12 + #define BREAKSPACE "\036" +#else + #define INDENT "\001" + #define LEN_INDENT 1 + #define INDENT_WIDTH (FW/2) + #define BREAKSPACE " " +#endif + +#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) + #define TR_ENTER "[ENTER]" +#else + #define TR_ENTER "[MENU]" +#endif + +#define TR_EXIT "[EXIT]" + +#if defined(PCBFLAMENCO) + #define TR_POPUPS TR_EXIT "\010" TR_ENTER +#elif defined(PCBTARANIS) + #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +#else + #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define OFS_EXIT sizeof(TR_ENTER) +#endif + +#define TR_MENUWHENDONE CENTER "\011" TR_ENTER " Avslutar " +#define TR_FREE "kvar" +#define TR_DELETEMODEL "Radera Modell" +#define TR_COPYINGMODEL "Kopierar Modell " +#define TR_MOVINGMODEL "Flyttar Modell " +#define TR_LOADINGMODEL "Laddar Modell " +#define TR_NAME "Namn" +#define TR_MODELNAME "Modellnamn" +#define TR_PHASENAME "Lägesnamn " +#define TR_MIXNAME "Mixnamn " +#define TR_INPUTNAME "Inputnamn" +#if defined(PCBTARANIS) + #define TR_EXPONAME "Radnamn" +#else + #define TR_EXPONAME "Exponamn" +#endif +#define TR_BITMAP "Modellikon" +#define TR_TIMER TR("Timer","Timer ") +#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_DISPLAY_TRIMS "Display Trims" +#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_USE_GLOBAL_FUNCS TR("Glob. Funk","Globala Funktioner") +#if defined(PCBSKY9X) && defined(REVX) + #define TR_OUTPUT_TYPE INDENT "Output" +#endif +#define TR_PROTO TR(INDENT "Proto", INDENT "Protokoll") +#if defined(CPUARM) + #define TR_PPMFRAME INDENT "PPM-paket" +#else + #define TR_PPMFRAME "PPM-paket" +#endif +#define TR_MS "ms" +#define TR_SWITCH "Brytare" +#define TR_TRIMS "Trimmar" +#define TR_FADEIN "Tona In" +#define TR_FADEOUT "Tona Ut" +#define TR_DEFAULT "Standard" +#define TR_CHECKTRIMS CENTER "\006Kolla\012Trimmar" +#define OFS_CHECKTRIMS CENTER_OFS+(9*FW) +#define TR_SWASHTYPE "Swashtyp" +#define TR_COLLECTIVE "Kollektiv" +#define TR_AILERON "Skevroder-källa" +#define TR_ELEVATOR "Höjdroder-källa" +#define TR_SWASHRING "Swashring" +#define TR_ELEDIRECTION "HöJD Riktning" +#define TR_AILDIRECTION "SKEV Riktning" +#define TR_COLDIRECTION "PITCH Riktn. " +#define TR_MODE INDENT"Läge" +#define TR_NOFREEEXPO "Expo saknas!" +#define TR_NOFREEMIXER "Mixer saknas!" +#define TR_SOURCE INDENT"Källa" +#define TR_WEIGHT "Vikt" +#define TR_EXPO TR("Expo","Exponentiell") +#define TR_SIDE "Sida" +#define TR_DIFFERENTIAL "Diff." +#define TR_OFFSET INDENT"Offset" +#define TR_TRIM "Trim" +#define TR_DREX "DRex" +#define DREX_CHBOX_OFFSET 30 +#define TR_CURVE "Kurva" +#define TR_FLMODE TR("Läge","Flyglägen") +#define TR_MIXWARNING "Varning" +#define TR_OFF "Av " +#define TR_MULTPX "Multpx" +#define TR_DELAYDOWN "Dröj Ned" +#define TR_DELAYUP "Dröj Upp" +#define TR_SLOWDOWN "Trög Ned" +#define TR_SLOWUP "Trög Upp" +#define TR_MIXER "MIXAR" +#define TR_CV "KU" +#define TR_GV "GV" +#define TR_ACHANNEL "A\004kanal " +#define TR_RANGE INDENT"MinMax" +#define TR_CENTER INDENT "Center" +#define TR_BAR "Data" +#define TR_ALARM INDENT"Alarm" +#define TR_USRDATA "Användardata" +#define TR_BLADES INDENT"Blad" +#define TR_SCREEN "Skärm " +#define TR_SOUND_LABEL "Ljud " +#define TR_LENGTH INDENT"Tid" +#define TR_BEEP_LENGTH INDENT "Pip-längd" +#define TR_SPKRPITCH INDENT "Pip-ton" +#define TR_HAPTIC_LABEL "Vibrator" +#define TR_HAPTICSTRENGTH INDENT"Styrka" +#define TR_CONTRAST "Kontrast" +#define TR_ALARMS_LABEL "Alarm" +#define TR_BATTERY_RANGE "Batteri-MinMax" +#define TR_BATTERYWARNING INDENT"Batteri" +#define TR_INACTIVITYALARM INDENT"Inaktivitet" +#define TR_MEMORYWARNING INDENT"Lite Minne" +#define TR_ALARMWARNING INDENT"Ljud Av" +#define TR_RENAVIG "RotEnk Navig" +#define TR_THROTTLE_LABEL "Gas" +#define TR_THROTTLEREVERSE TR("Inv.Gas", INDENT "Inverterad Gas") +#define TR_TIMER_NAME INDENT "Namn" +#define TR_MINUTEBEEP INDENT "Minutpip" +#define TR_BEEPCOUNTDOWN INDENT "Nedräkning" +#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_BLCOLOR INDENT "Color" +#define TR_THROTTLEWARNING TR("Gasvarning", INDENT "Gasvarning") +#define TR_SWITCHWARNING TR("Bryt.varn.", INDENT "Brytarvarning") +#define TR_POTWARNING TR("Rattvarn.", INDENT "Rattvarning") +#define TR_TIMEZONE TR("Tidszon", "GPS Tidszon") +#define TR_ADJUST_RTC INDENT "Adjust RTC" +#define TR_GPS "GPS" +#define TR_RXCHANNELORD "Kanaler i RX" +#define TR_STICKS "Sticks" +#define TR_POTS "Pots" +#define TR_SWITCHES "Switches" +#define TR_SWITCHES_DELAY "Brytarfördröjning" +#define TR_SLAVE "Elev" +#define TR_MODESRC " Läge\004% Källa" +#define TR_MULTIPLIER "Styrka" +#define TR_CAL "Kalib." +#define TR_VTRIM "Trim- +" +#define TR_BG "BG:" +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) + #define TR_MENUTOSTART TR_ENTER " Startar " + #define TR_SETMIDPOINT "Centrera Allt" + #define TR_MOVESTICKSPOTS "Rör Spakar/Rattar" +#else + #define TR_MENUTOSTART CENTER "\011" TR_ENTER " Startar " + #define TR_SETMIDPOINT TR(CENTER "\012Centrera Allt",CENTER "\013Centrera Allt") + #define TR_MOVESTICKSPOTS TR(CENTER "\005Rör Spakar/Rattar",CENTER "\006Rör Spakar/Rattar") +#endif +#define TR_RXBATT "Rx Batt:" +#define TR_TXnRX "Tx:\0Rx:" +#define OFS_RX 4 +#define TR_ACCEL "Acc:" +#define TR_NODATA CENTER "DATA SAKNAS" +#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" +#define TR_TMR1LATMAXUS "Tmr1Lat max\037\124us" +#define STR_US (STR_TMR1LATMAXUS+13) +#define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" +#define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" + +#if defined(CPUARM) + #define TR_TMIXMAXMS "Tmix max" + #define TR_FREESTACKMINB "Free Stack" +#else + #define TR_TMIXMAXMS "Tmix max\037\124ms" + #define TR_FREESTACKMINB "Free Stack\037\124b" +#endif + +#define TR_MENUTORESET CENTER TR_ENTER " Nollar" +#define TR_PPM_TRAINER "TR" +#define TR_CH "KN" +#define TR_MODEL "Modell" +#define TR_FP "FL" +#define TR_MIX "MIX" +#define TR_EEPROMLOWMEM "Minnesbrist" +#define TR_ALERT "\016OBS" +#define TR_PRESSANYKEYTOSKIP "Tryck ned en knapp" +#define TR_THROTTLENOTIDLE "Gasen är påslagen!" +#define TR_ALARMSDISABLED "Alarmen Avstängda!" +#define TR_PRESSANYKEY "Tryck ned en knapp" +#define TR_BADEEPROMDATA "Minnet kan inte tolkas" +#define TR_BAD_RADIO_DATA "Data från radion kan inte tolkas" +#define TR_EEPROMFORMATTING "Minnet Nollställs" +#define TR_STORAGE_FORMAT "SD-Lagring förbereds" +#define TR_EEPROMOVERFLOW "Minnesfel" +#define TR_MENURADIOSETUP "INSTÄLLNINGAR" +#define TR_MENUDATEANDTIME "DAG OCH TID" +#define TR_MENUTRAINER "TRAINER (PPM IN)" +#define TR_MENUGLOBALFUNCS "GLOBALA FUNKTIONER" +#define TR_MENUVERSION "VERSION" +#define TR_MENUDIAG TR("BRYTARE","TEST AV BRYTARE") +#define TR_MENUANA "ANALOGA VÄRDEN" +#define TR_MENUCALIBRATION "KALIBRERING" +#if defined(COLORLCD) + #define TR_TRIMS2OFFSETS "[Spara Trimvärden]" +#else + #define TR_TRIMS2OFFSETS "\006[Spara Trimvärden]" +#endif +#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(VIRTUALINPUTS) + #define TR_MENUINPUTS "INPUT" + #define TR_MENULIMITS "SERVON" +#else + #define TR_MENUINPUTS "SPAKAR" + #define TR_MENULIMITS "SERVON" +#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_MENUCUSTOMSCRIPTS "SPECIALKOD" +#define TR_MENUTELEMETRY "TELEMETRI" +#define TR_MENUTEMPLATES "MALLAR" +#define TR_MENUSTAT "STATISTIK" +#define TR_MENUDEBUG "DEBUG" +#if defined(CPUARM) + #define TR_RXNUM TR(INDENT "RxNum", INDENT "Mottagare Nr.") +#else + #define TR_RXNUM "RxNum" +#endif +#define TR_SYNCMENU "Synk [MENU]" +#define TR_LIMIT INDENT "Nivå" +#define TR_MINRSSI "Min Rssi" +#define TR_LATITUDE "Breddgrad" +#define TR_LONGITUDE "Längdgrad" +#define TR_GPSCOORD TR("GPS-Koordinater", "GPS-koordinatsystem") +#define TR_VARIO TR("Vario", "Variometer") +#define TR_PITCH_AT_ZERO INDENT "Ton vid Noll" +#define TR_PITCH_AT_MAX INDENT "Ton vid Max" +#define TR_REPEAT_AT_ZERO INDENT "Repetera vid Noll" +#define TR_POWEROFF "\027Stänger Av..." +#define TR_SHUTDOWN "STÄNGER AV" +#define TR_SAVEMODEL "Spara modellinställn." +#define TR_BATT_CALIB "Kalib. Batteri" +#define TR_CURRENT_CALIB "Kalib. Ström" +#define TR_VOLTAGE INDENT"Volt" +#define TR_CURRENT INDENT"Ampere" +#define TR_SELECT_MODEL "Välj Modell" +#define TR_CREATE_CATEGORY "Skapa Kategori" +#define TR_RENAME_CATEGORY "Byt Kat.namn" +#define TR_DELETE_CATEGORY "Ta Bort Kategori" +#define TR_CREATE_MODEL "Skapa Modell" +#define TR_DUPLICATE_MODEL "Dupl. Modell" +#define TR_CHANGE_CATEGORY "Change category" +#define TR_COPY_MODEL "Kopiera Modell" +#define TR_MOVE_MODEL "Flytta Modell" +#define TR_BACKUP_MODEL "Modell-backup" +#define TR_DELETE_MODEL "Ta Bort Modell" +#define TR_RESTORE_MODEL "Återställ Modell" +#define TR_SDCARD_ERROR "SDCARD-fel" +#define TR_NO_SDCARD "SDCARD saknas" +#define TR_SDCARD_FULL "SD-kort Fullt" +#define TR_INCOMPATIBLE "Inkompatibel" +#define TR_WARNING "VARNING" +#define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "LAGRING" +#define TR_EEPROM_CONVERTING "EEPROM Konvertering" +#define TR_THROTTLEWARN "GAS" +#define TR_ALARMSWARN "ALARM" +#define TR_SWITCHWARN "BRYTARE" +#define TR_FAILSAFEWARN "FAILSAFE" +#define TR_NO_FAILSAFE "Failsafe ej given" +#define TR_KEYSTUCK "Knapp-fel" +#define TR_INVERT_THR TR("Invert.Gas?", "Invertera Gasen?") +#define TR_SPEAKER_VOLUME INDENT "Volym" +#define TR_LCD "LCD" +#define TR_BRIGHTNESS INDENT "Ljusstyrka" +#define TR_CPU_TEMP "CPU temp.\016>" +#define TR_CPU_CURRENT "Ström\022>" +#define TR_CPU_MAH "Förbrukn." +#define TR_COPROC "CoProc." +#define TR_COPROC_TEMP "MB temp. \016>" +#define TR_CAPAWARNING INDENT "Låg Kapacitet" +#define TR_TEMPWARNING TR(INDENT "Hög Temp ", INDENT "Hög Temperatur") +#define TR_FUNC "Funk" +#define TR_V1 "V1" +#define TR_V2 "V2" +#define TR_DURATION "Tidlängd" +#define TR_DELAY "Fördröj" +#define TR_SD_CARD "SD-kort" +#define TR_SDHC_CARD "SD/HC-kort" +#define TR_NO_SOUNDS_ON_SD "Inga ljud i SD" +#define TR_NO_MODELS_ON_SD "Ingen modell i SD" +#define TR_NO_BITMAPS_ON_SD "Ikoner saknas på SD" +#define TR_NO_SCRIPTS_ON_SD "Programkod saknas på SD" +#define TR_SCRIPT_SYNTAX_ERROR "Script syntax error" +#define TR_SCRIPT_PANIC "Script panic" +#define TR_SCRIPT_KILLED "Script killed" +#define TR_SCRIPT_ERROR "Unknown error" +#define TR_PLAY_FILE "Spela" +#define TR_DELETE_FILE "Radera" +#define TR_COPY_FILE "Kopia" +#define TR_RENAME_FILE "Byt namn" +#define TR_ASSIGN_BITMAP "Tilldela ikon" +#define TR_EXECUTE_FILE "Utför" +#define TR_REMOVED " raderad" +#define TR_SD_INFO "Information" +#define TR_SD_FORMAT "Format" +#define TR_NA "N/A" +#define TR_HARDWARE "Hårdvara" +#define TR_FORMATTING "Formaterar..." +#define TR_TEMP_CALIB "Temp. kalib." +#define TR_TIME "Tid " +#define TR_BAUDRATE "BT Baudrate" +#define TR_SD_INFO_TITLE "SD INFO" +#define TR_SD_TYPE "Typ: " +#define TR_SD_SPEED "Hastighet:" +#define TR_SD_SECTORS "Sektorer:" +#define TR_SD_SIZE "Strl:" +#define TR_TYPE INDENT "Typ " +#define TR_GLOBAL_VARS "Globala Variabler" +#define TR_GVARS "GLOBAL V." +#define TR_GLOBAL_VAR "Global Variabel" +#define TR_MENUGLOBALVARS "GLOBALA VARIABLER" +#define TR_OWN "Egen" +#define TR_DATE "Datum" +#define TR_ROTARY_ENCODER "R.Enks" +#define TR_CHANNELS_MONITOR "Kanalöversikt" +#define TR_MIXERS_MONITOR "MIXER-SKÄRM" +#define TR_PATH_TOO_LONG "För lång sökväg" +#define TR_VIEW_TEXT "Visa Text" +#define TR_FLASH_BOOTLOADER "Skriv BootLoader" +#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" +#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" +#define TR_WRITING "\032Skriver..." +#define TR_CONFIRM_FORMAT "Formatera Minnet?" +#define TR_INTERNALRF "Intern Radio" +#define TR_EXTERNALRF "Extern Radiomodul" +#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge") +#define TR_FAILSAFESET "FailsafeInställning" +#define TR_MENUSENSOR "SENSOR" +#define TR_SENSOR "SENSOR" +#define TR_COUNTRYCODE "Landskod" +#define TR_VOICELANG "Röstspråk" +#define TR_UNITSSYSTEM "Enheter" +#define TR_EDIT "Redigera" +#define TR_INSERT_BEFORE "Addera Före" +#define TR_INSERT_AFTER "Addera Efter" +#define TR_COPY "Kopiera" +#define TR_MOVE "Flytta" +#define TR_PASTE "Infoga" +#define TR_DELETE "Radera" +#define TR_INSERT "Addera" +#define TR_RESET_FLIGHT "Nollställ Flygning" +#define TR_RESET_TIMER1 "Nollställ Timer1" +#define TR_RESET_TIMER2 "Nollställ Timer2" +#define TR_RESET_TIMER3 "Nollställ Timer3" +#define TR_RESET_TELEMETRY "Nollställ Telemetri" +#define TR_STATISTICS "Statistik" +#define TR_ABOUT_US "Om Oss" +#define TR_SETUP_SCREENS "Setup screens" +#define TR_AND_SWITCH "OCH Brytare" +#define TR_SF "BF" +#define TR_GF "GF" +#define TR_SPEAKER INDENT"Högtalare" +#define TR_BUZZER INDENT"Summer" +#define TR_BYTES "byte" +#define TR_MODULE_BIND TR("[Bnd]", "[Bind]") +#define TR_MODULE_RANGE TR("[Tst]", "[Testa]") +#define TR_RESET_BTN "[Nollställ]" +#define TR_SET "[Spara]" +#define TR_TRAINER "Trainer" +#define TR_ANTENNAPROBLEM CENTER "Fel på TX-antennen" +#define TR_MODELIDUSED TR("ID finns redan","ModellID används redan") +#define TR_MODULE INDENT "Modul" +#define TR_TELEMETRY_TYPE "Telemetrityp" +#define TR_TELEMETRY_SENSORS "Sensorer" +#define TR_VALUE "Värde" +#define TR_TOPLCDTIMER "Top LCD Timer" +#define TR_UNIT "Enhet" +#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till sensor..." +#define TR_CHANNELRANGE INDENT "Kanalområde" +#define TR_LOWALARM INDENT "Låg-alarm" +#define TR_CRITICALALARM INDENT "Kritiskt alarm" +#define TR_ENABLE_POPUP "Slå på Dialog" +#define TR_DISABLE_POPUP "Slå av Dialog" +#define TR_POPUP "Popup" +#define TR_MIN "Min" +#define TR_MAX "Max" +#define TR_CURVE_PRESET "Lutning..." +#define TR_PRESET "Lutning" +#define TR_MIRROR "Spegla" +#define TR_CLEAR "Töm" +#define TR_RESET "Nollställ" +#define TR_RESET_SUBMENU "Nollställ..." +#define TR_COUNT "Antal" +#define TR_PT "pt" +#define TR_PTS "pkt" +#define TR_SMOOTH "Mjuk" +#define TR_COPY_STICKS_TO_OFS "Spara spakar som subtrim" +#define TR_COPY_TRIMS_TO_OFS "Spara trimmar som subtrim" +#define TR_INCDEC "Inkr/Dekrement" +#define TR_GLOBALVAR "Globala Var" +#define TR_MIXSOURCE "Mixer Källa" +#define TR_CONSTANT "Konstant" +#define TR_PERSISTENT_MAH INDENT "Lagra mAh" +#define TR_PREFLIGHT "Startkontroller" +#define TR_CHECKLIST TR(INDENT "Checklista", INDENT "Visa Checklista") +#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") +#define TR_UART3MODE "Serieporten" +#define TR_SCRIPT "Programkod" +#define TR_INPUTS "Input" +#define TR_OUTPUTS "Outputs" +#define TR_EEBACKUP "\004[ENTER Lång] säkerhetskopiera EEPROM" +#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" +#define TR_CONFIRMRESET "Erase ALL models and settings?" +#define TR_TO_MANY_LUA_SCRIPTS "För många Lua-scripts!" + +#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_MAVLINK_BAUD_LABEL "Baudrate" + #define TR_MAVLINK_INFOS "INFOS" + #define TR_MAVLINK_MODE "LÄGE" + #define TR_MAVLINK_CUR_MODE "Nuvarande Läge" + #define TR_MAVLINK_ARMED "Osäkrad" + #define TR_MAVLINK_BAT_MENU_TITLE "BAT RSSI" + #define TR_MAVLINK_BATTERY_LABEL "Status för flygbatteri" + #define TR_MAVLINK_RC_RSSI_LABEL "RC RSSI" + #define TR_MAVLINK_PC_RSSI_LABEL "PC RSSI" + #define TR_MAVLINK_NAV_MENU_TITLE "NAV" + #define TR_MAVLINK_COURSE "Kurs" + #define TR_MAVLINK_HEADING "Riktning" + #define TR_MAVLINK_BEARING "Bäring" + #define TR_MAVLINK_ALTITUDE "Höjd" + #define TR_MAVLINK_GPS "GPS" + #define TR_MAVLINK_NO_FIX "EJ Lås" + #define TR_MAVLINK_SAT "SAT" + #define TR_MAVLINK_HDOP "HDOP" + #define TR_MAVLINK_LAT "LAT" + #define TR_MAVLINK_LON "LON" +#endif + +// Taranis column headers +#define TR_PHASES_HEADERS { " Namn ", " Brytare ", " Rodertrim ", " Höjdrodertrim ", " Gastrim ", " Skevrodertrim ", " Tona Upp ", " Tona Ned " } +#define TR_LIMITS_HEADERS { " Namn ", " Subtrim ", " Min ", " Max ", " Riktning ", " Kurva ", " PPM-center ", " Subtrim-läge " } +#define TR_CSW_HEADERS { " Funktion ", " V1 ", " V2 ", " V2 ", " OCH Brytare ", " Tidslängd ", " Fördröj " } +// About screen +#define TR_ABOUTUS "Om Oss" + +#define TR_ABOUT_OPENTX_1 "OpenTX är icke-kommersiell," +#define TR_ABOUT_OPENTX_2 "öppen programvara utan" +#define TR_ABOUT_OPENTX_3 "garantier som uvecklas helt" +#define TR_ABOUT_OPENTX_4 "ideellt. Stöd i form av" +#define TR_ABOUT_OPENTX_5 "donationer välkomnas!" + +#define TR_ABOUT_BERTRAND_1 "Bertrand Songis" +#define TR_ABOUT_BERTRAND_2 "Chefsutvecklare av OpenTX" +#define TR_ABOUT_BERTRAND_3 "Hjälputvecklare av Companion9x" + +#define TR_ABOUT_MIKE_1 "Mike Blandford" +#define TR_ABOUT_MIKE_2 "Kod och drivrutins-guru" +#define TR_ABOUT_MIKE_3 "Stor inspirationskälla" +#define TR_ABOUT_MIKE_4 "" + +#define TR_ABOUT_ROMOLO_1 "Romolo Manfredini" +#define TR_ABOUT_ROMOLO_2 "Chefsutvecklare av Companion9x" +#define TR_ABOUT_ROMOLO_3 "" + +#define TR_ABOUT_ANDRE_1 "Andre Bernet" +#define TR_ABOUT_ANDRE_2 "Funktionalitet, Användbarhet," +#define TR_ABOUT_ANDRE_3 "Felsökning, Dokumentation" + +#define TR_ABOUT_ROB_1 "Rob Thomson" +#define TR_ABOUT_ROB_2 "Webmaster för openRCforums" + +#define TR_ABOUT_KJELL_1 "Kjell Kernen" +#define TR_ABOUT_KJELL_2 "Utvecklare av www.open-tx.org" +#define TR_ABOUT_KJELL_3 "Utvecklare av OpenTX Recorder" +#define TR_ABOUT_KJELL_4 "Hjälputvecklare av Companion" + +#define TR_ABOUT_MARTIN_1 "Martin Hotar" +#define TR_ABOUT_MARTIN_2 "Grafikdesigner" + +#if defined(PCBFLAMENCO) + #define TR_ABOUT_HARDWARE_1 "XXX" + #define TR_ABOUT_HARDWARE_2 "Hardware designer/producer" + #define TR_ABOUT_HARDWARE_3 "" +#elif defined(PCBTARANIS) || defined(PCBHORUS) + #define TR_ABOUT_HARDWARE_1 "FrSky" + #define TR_ABOUT_HARDWARE_2 "Hårdvarudesign/producent" + #define TR_ABOUT_HARDWARE_3 "" +#else + #define TR_ABOUT_HARDWARE_1 "Brent Nelson" + #define TR_ABOUT_HARDWARE_2 "Sky9x design/producent" + #define TR_ABOUT_HARDWARE_3 "" +#endif + +#define TR_ABOUT_PARENTS_1 "Ursprungsprojekt" +#define TR_ABOUT_PARENTS_2 "ersky9x (Mike Blandford)" +#define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" +#define TR_ABOUT_PARENTS_4 "TH9X (Thomas Husterer)" + +#define TR_CHR_SHORT 's' +#define TR_CHR_LONG 'l' +#define TR_CHR_TOGGLE 't' +#define TR_CHR_HOUR 'h' +#define TR_CHR_INPUT 'I' // Values between A-I will work + +#define TR_BEEP_VOLUME "Volym Pip" +#define TR_WAV_VOLUME "Volym Wav" +#define TR_VARIO_VOLUME "Volym Vario" +#define TR_BG_VOLUME "Volym Bg" + +#define TR_TOP_BAR "Titelraden" +#define TR_ALTITUDE INDENT "Höjd" +#define TR_SCALE "Skala" +#define TR_VIEW_CHANNELS "Visa Kanaler" +#define TR_VIEW_NOTES "Visa Noteringars" +#define TR_MODEL_SELECT "Välj Modell" +#define TR_MODS_FORBIDDEN "Modifikationer förbjudna!" +#define TR_UNLOCKED "Olåst" +#define TR_ID "ID" +#define TR_PRECISION "Precision" +#define TR_RATIO "Ratio" +#define TR_FORMULA "Formel" +#define TR_CELLINDEX "Cell index" +#define TR_LOGS "Logga" +#define TR_OPTIONS "Options" + +#define TR_ALTSENSOR "Höjdsensor" +#define TR_CELLSENSOR "Cell sensor" +#define TR_GPSSENSOR "GPS sensor" +#define TR_CURRENTSENSOR "Sensor" +#define TR_AUTOOFFSET "Auto Offset" +#define TR_ONLYPOSITIVE "Positiv" +#define TR_FILTER "Filter" +#define TR_TELEMETRYFULL "Alla telemetriplatser upptagna!" +//TODO: translation +#define TR_INVERTED_SERIAL INDENT "Invert" +#define TR_IGNORE_INSTANCE TR(INDENT "Inst.fel", INDENT "Hantera Instansfel") +#define TR_DISCOVER_SENSORS INDENT "Sök nya sensorer" +#define TR_STOP_DISCOVER_SENSORS INDENT "Avbryt sökning" +#define TR_DELETE_ALL_SENSORS INDENT "Ta bort alla sensorer" +#define TR_CONFIRMDELETE "Ta bort alla?" +#define TR_SELECT_WIDGET "Select widget" +#define TR_REMOVE_WIDGET "Remove widget" +#define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" + +#define TR_MENU_INPUTS "\314Inputs" +#define TR_MENU_LUA "\322Lua scripts" +#define TR_MENU_STICKS "\307Spakars" +#define TR_MENU_POTS "\310Rattar" +#define TR_MENU_MAX "\315MAX" +#define TR_MENU_HELI "\316Cyclic" +#define TR_MENU_TRIMS "\313Trimm" +#define TR_MENU_SWITCHES "\312Brytare" +#define TR_MENU_LOGICAL_SWITCHES "\312Logiska Brytare" +#define TR_MENU_TRAINER "\317Trainer" +#define TR_MENU_CHANNELS "\320Servon" +#define TR_MENU_GVARS "\311GVars" +#define TR_MENU_TELEMETRY "\321Telemetri" +#define TR_MENU_OTHER "Annat" +#define TR_MENU_INVERT "Invertera" + +#define ZSTR_RSSI "RSSI" +#define ZSTR_SWR "SWR" +#define ZSTR_A1 "A1" +#define ZSTR_A2 "A2" +#define ZSTR_A3 "A3" +#define ZSTR_A4 "A4" +#define ZSTR_BATT "RxBt" +#define ZSTR_ALT "Alt" +#define ZSTR_TEMP1 "Tmp1" +#define ZSTR_TEMP2 "Tmp2" +#define ZSTR_RPM "RPM" +#define ZSTR_FUEL "Fuel" +#define ZSTR_VSPD "VSpd" +#define ZSTR_ACCX "AccX" +#define ZSTR_ACCY "AccY" +#define ZSTR_ACCZ "AccZ" +#define ZSTR_CURR "Curr" +#define ZSTR_VFAS "VFAS" +#define ZSTR_ASPD "ASpd" +#define ZSTR_GSPD "GSpd" +#define ZSTR_HDG "Hdg" +#define ZSTR_CELLS "Cels" +#define ZSTR_GPSALT "GAlt" +#define ZSTR_GPSDATETIME "Date" +#define ZSTR_GPS "GPS" +#define ZSTR_BATT1_VOLTAGE "RB1V" +#define ZSTR_BATT2_VOLTAGE "RB2V" +#define ZSTR_BATT1_CURRENT "RB1A" +#define ZSTR_BATT2_CURRENT "RB2A" +#define ZSTR_BATT1_CONSUMPTION "RB1C" +#define ZSTR_BATT2_CONSUMPTION "RB2C" +#define ZSTR_RB_STATE "RBS" +#define ZSTR_CHANS_STATE "RBCS" From 5a5f192451cfe7698cc2a6178f1eab2d5b6b01d6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 18:36:29 +0200 Subject: [PATCH 42/69] Remaining trace --- radio/src/gui/taranis/view_main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/gui/taranis/view_main.cpp b/radio/src/gui/taranis/view_main.cpp index 261daaac5..20ae019df 100644 --- a/radio/src/gui/taranis/view_main.cpp +++ b/radio/src/gui/taranis/view_main.cpp @@ -273,7 +273,6 @@ void displayTopBar() } /* Audio volume */ - TRACE("%d", requiredSpeakerVolume); if (requiredSpeakerVolume == 0 || g_eeGeneral.beepMode == e_mode_quiet) LCD_ICON(BAR_VOLUME_X, BAR_Y, ICON_SPEAKER0); else if (requiredSpeakerVolume <= 6) From a3c175f53753cb9705ea94f861a3dafb378803aa Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 19:07:28 +0200 Subject: [PATCH 43/69] Crossfire telemetry protocol start --- radio/src/CMakeLists.txt | 48 ++++-- radio/src/dataconstants.h | 3 +- .../targets/common_avr/telemetry_driver.cpp | 7 +- radio/src/telemetry/crossfire.cpp | 141 ++++++++++++++++++ radio/src/telemetry/crossfire.h | 29 ++++ radio/src/telemetry/frsky.cpp | 39 +++-- radio/src/telemetry/frsky.h | 32 +--- radio/src/telemetry/telemetry.cpp | 6 + radio/src/telemetry/telemetry.h | 27 +++- radio/src/telemetry/telemetry_sensors.cpp | 5 + radio/src/translations/cz.h.txt | 12 +- radio/src/translations/de.h.txt | 12 +- radio/src/translations/en.h.txt | 12 +- radio/src/translations/es.h.txt | 12 +- radio/src/translations/fi.h.txt | 12 +- radio/src/translations/fr.h.txt | 12 +- radio/src/translations/it.h.txt | 12 +- radio/src/translations/nl.h.txt | 12 +- radio/src/translations/pl.h.txt | 12 +- radio/src/translations/pt.h.txt | 12 +- radio/src/translations/se.h.txt | 12 +- 21 files changed, 396 insertions(+), 73 deletions(-) create mode 100644 radio/src/telemetry/crossfire.cpp create mode 100644 radio/src/telemetry/crossfire.h diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 31dfafc44..548c7f21d 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -407,11 +407,22 @@ if(CPU_FAMILY STREQUAL STM32) STM32_USB_Device_Library/Core/src/usbd_ioreq.c STM32_USB_Device_Library/Core/src/usbd_req.c ) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} usb_bsp.c usbd_desc.c usbd_usr.cpp) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + usb_bsp.c + usbd_desc.c + usbd_usr.cpp + ) if(USB STREQUAL SERIAL) add_definitions(-DUSB_SERIAL) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} usbd_cdc.cpp) - set(STM32USB_SRC ${STM32USB_SRC} STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + usbd_cdc.cpp + ) + set(STM32USB_SRC + ${STM32USB_SRC} + STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c + ) elseif(USB STREQUAL MASSSTORAGE) add_definitions(-DUSB_MASS_STORAGE) set(STM32USB_SRC @@ -421,13 +432,22 @@ if(CPU_FAMILY STREQUAL STM32) STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c ) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} usbd_storage_msd.cpp) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + usbd_storage_msd.cpp + ) else() add_definitions(-DUSB_JOYSTICK) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} usbd_hid_joystick.c) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + usbd_hid_joystick.c + ) endif() if(GVARS) - set(GUI_SRC ${GUI_SRC} menu_model_gvars.cpp) + set(GUI_SRC + ${GUI_SRC} + menu_model_gvars.cpp + ) endif() set(FIRMWARE_SRC ${FIRMWARE_SRC} @@ -436,12 +456,22 @@ if(CPU_FAMILY STREQUAL STM32) targets/taranis/configure_pins.cpp ) foreach(FILE ${STM32LIB_SRC}) - set(FIRMWARE_SRC ${FIRMWARE_SRC} ${STM32LIB_DIR}/${FILE}) + set(FIRMWARE_SRC + ${FIRMWARE_SRC} + ${STM32LIB_DIR}/${FILE} + ) endforeach() foreach(FILE ${STM32USB_SRC}) - set(FIRMWARE_SRC ${FIRMWARE_SRC} ${STM32USB_DIR}/${FILE}) + set(FIRMWARE_SRC + ${FIRMWARE_SRC} + ${STM32USB_DIR}/${FILE} + ) endforeach() - set(SRC ${SRC} sbus.cpp) + set(SRC + ${SRC} + sbus.cpp + telemetry/crossfire.cpp + ) endif() if(ARCH STREQUAL ARM) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 55ede0d44..499160814 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -346,6 +346,7 @@ enum TelemetryUnit { UNIT_PERCENT, UNIT_MAH, UNIT_WATTS, + UNIT_MILLIWATTS, UNIT_DB, UNIT_RPMS, UNIT_G, @@ -473,7 +474,7 @@ enum TelemetryUnit { UNIT_SECONDS, UNIT_RPMS, UNIT_G, - UNIT_HDG, + UNIT_HDG }; #endif diff --git a/radio/src/targets/common_avr/telemetry_driver.cpp b/radio/src/targets/common_avr/telemetry_driver.cpp index da3ebbdfc..3fa60635c 100644 --- a/radio/src/targets/common_avr/telemetry_driver.cpp +++ b/radio/src/targets/common_avr/telemetry_driver.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" #if defined(FRSKY) @@ -33,9 +33,6 @@ void telemetryEnableRx(void) UCSRB_N(TLM_USART) |= (1 << RXCIE_N(TLM_USART)); // enable Interrupt } -void processFrskyTelemetryData(uint8_t data); -extern uint8_t frskyRxBufferCount; // TODO not driver, change name - ISR(USART_RX_vect_N(TLM_USART)) { uint8_t stat; @@ -79,7 +76,7 @@ ISR(USART_RX_vect_N(TLM_USART)) if (stat & ((1 << FE_N(TLM_USART)) | (1 << DOR_N(TLM_USART)) | (1 << UPE_N(TLM_USART)))) { // discard buffer and start fresh on any comms error - frskyRxBufferCount = 0; + telemetryRxBufferCount = 0; } else { processFrskyTelemetryData(data); diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp new file mode 100644 index 000000000..130462ca6 --- /dev/null +++ b/radio/src/telemetry/crossfire.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +struct CrossfireSensor { + const uint8_t id; + const uint8_t subId; + const char * name; + const TelemetryUnit unit; + const uint8_t prec; +}; + +const CrossfireSensor crossfireSensors[] = { + {LINK_STATS_ID, 0, ZSTR_RX_RSSI1, UNIT_DB, 0}, + {LINK_STATS_ID, 1, ZSTR_RX_RSSI2, UNIT_DB, 0}, + {LINK_STATS_ID, 2, ZSTR_RX_QUALITY, UNIT_PERCENT, 0}, + {LINK_STATS_ID, 3, ZSTR_RX_SNR, UNIT_DB, 0}, + {LINK_STATS_ID, 4, ZSTR_ANTENNA, UNIT_RAW, 0}, + {LINK_STATS_ID, 5, ZSTR_RF_MODE, UNIT_RAW, 0}, + {LINK_STATS_ID, 6, ZSTR_TX_POWER, UNIT_MILLIWATTS, 0}, + {LINK_STATS_ID, 7, ZSTR_TX_RSSI, UNIT_DB, 0}, + {LINK_STATS_ID, 8, ZSTR_TX_QUALITY, UNIT_PERCENT, 0}, + {LINK_STATS_ID, 9, ZSTR_TX_SNR, UNIT_DB, 0}, + { 0, 0, NULL, UNIT_RAW, 0} // sentinel +}; + +const CrossfireSensor * getCrossfireSensor(uint8_t id, uint8_t subId=0) +{ + const CrossfireSensor * result = NULL; + for (const CrossfireSensor * sensor = crossfireSensors; sensor->id; sensor++) { + if (id == sensor->id && subId == sensor->subId) { + result = sensor; + break; + } + } + return result; +} + +void processCrossfireTelemetryFrame(uint8_t id, uint8_t subId, uint32_t value) +{ + const CrossfireSensor * sensor = getCrossfireSensor(id, subId); + TelemetryUnit unit = UNIT_RAW; + uint8_t precision = 0; + if (sensor) { + unit = sensor->unit; + precision = sensor->prec; + } + setTelemetryValue(TELEM_PROTO_CROSSFIRE, id, 0, subId, value, unit, precision); +} + +bool checkCrossfireTelemetryFrameCRC() +{ + // uint8_t length = telemetryRxBuffer[1]; + return true; +} + +void processCrossfireTelemetryFrame() +{ + if (!checkCrossfireTelemetryFrameCRC()) { + return; + } + + uint8_t id = telemetryRxBuffer[2]; + switch(id) { + case LINK_STATS_ID: + for (int i=0; i<10; i++) { + processCrossfireTelemetryFrame(id, i, telemetryRxBuffer[3+i]); + } + break; + } +} + +void processCrossfireTelemetryData(uint8_t data) +{ + if (telemetryRxBufferCount == 0 && data != 0x00) { + return; + } + + if (telemetryRxBufferCount == 1 && (data < || data > TELEMETRY_RX_PACKET_SIZE-2)) { + telemetryRxBufferCount = 0; + return; + } + + if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; + } + else { + TRACE("processCrossfirePacket(): length error "); + DUMP(telemetryRxBuffer, TELEMETRY_RX_PACKET_SIZE); + telemetryRxBufferCount = 0; + } + + if (telemetryRxBufferCount > 4) { + uint8_t length = telemetryRxBuffer[1]; + if (length + 2 == telemetryRxBufferCount) { + processCrossfireTelemetryFrame(); + telemetryRxBufferCount = 0; + } + } +} + +void crossfireSetDefault(int index, uint8_t id, uint8_t subId) +{ + TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index]; + + telemetrySensor.id = id; + telemetrySensor.instance = subId; + + const CrossfireSensor * sensor = getCrossfireSensor(id, subId); + if (sensor) { + TelemetryUnit unit = sensor->unit; + uint8_t prec = min(2, sensor->prec); + telemetrySensor.init(sensor->name, unit, prec); + if (id == LINK_STATS_ID) { + telemetrySensor.logs = true; + } + } + else { + telemetrySensor.init(id); + } + + storageDirty(EE_MODEL); +} \ No newline at end of file diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h new file mode 100644 index 000000000..5fa88a513 --- /dev/null +++ b/radio/src/telemetry/crossfire.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _CROSSFIRE_H_ +#define _CROSSFIRE_H_ + +#define LINK_STATS_ID 0x14 + +void processCrossfireTelemetryData(uint8_t data); +void crossfireSetDefault(int index, uint8_t id, uint8_t subId); + +#endif // _CROSSFIRE_H_ diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 345002f56..b6f8faf9d 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -20,9 +20,6 @@ #include "opentx.h" -uint8_t frskyRxBuffer[FRSKY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) -uint8_t frskyRxBufferCount = 0; - #if !defined(CPUARM) uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; uint8_t frskyTxBufferCount = 0; @@ -39,6 +36,18 @@ extern uint8_t TrotCount; extern uint8_t TezRotary; #endif +// Receive buffer state machine state enum +enum FrSkyDataState { + STATE_DATA_IDLE, + STATE_DATA_START, + STATE_DATA_IN_FRAME, + STATE_DATA_XOR, +#if defined(TELEMETREZ) + STATE_DATA_PRIVATE_LEN, + STATE_DATA_PRIVATE_VALUE +#endif +}; + NOINLINE void processFrskyTelemetryData(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -72,12 +81,12 @@ NOINLINE void processFrskyTelemetryData(uint8_t data) if (data == START_STOP) { if (IS_FRSKY_SPORT_PROTOCOL()) { dataState = STATE_DATA_IN_FRAME ; - frskyRxBufferCount = 0; + telemetryRxBufferCount = 0; } } else { - if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[frskyRxBufferCount++] = data; + if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; } dataState = STATE_DATA_IN_FRAME; } @@ -90,30 +99,30 @@ NOINLINE void processFrskyTelemetryData(uint8_t data) else if (data == START_STOP) { if (IS_FRSKY_SPORT_PROTOCOL()) { dataState = STATE_DATA_IN_FRAME ; - frskyRxBufferCount = 0; + telemetryRxBufferCount = 0; } else { // end of frame detected - frskyDProcessPacket(frskyRxBuffer); + frskyDProcessPacket(telemetryRxBuffer); dataState = STATE_DATA_IDLE; } break; } - else if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[frskyRxBufferCount++] = data; + else if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; } break; case STATE_DATA_XOR: - if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[frskyRxBufferCount++] = data ^ STUFF_MASK; + if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data ^ STUFF_MASK; } dataState = STATE_DATA_IN_FRAME; break; case STATE_DATA_IDLE: if (data == START_STOP) { - frskyRxBufferCount = 0; + telemetryRxBufferCount = 0; dataState = STATE_DATA_START; } #if defined(TELEMETREZ) @@ -155,8 +164,8 @@ NOINLINE void processFrskyTelemetryData(uint8_t data) } // switch #if defined(FRSKY_SPORT) - if (IS_FRSKY_SPORT_PROTOCOL() && frskyRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) { - processSportPacket(frskyRxBuffer); + if (IS_FRSKY_SPORT_PROTOCOL() && telemetryRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) { + processSportPacket(telemetryRxBuffer); dataState = STATE_DATA_IDLE; } #endif diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 2ede667a1..3c98da665 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -388,20 +388,6 @@ enum AlarmLevel { #define BYTESTUFF 0x7d #define STUFF_MASK 0x20 -// Receive buffer state machine state enum -enum FrSkyDataState { - STATE_DATA_IDLE, - STATE_DATA_START, - STATE_DATA_IN_FRAME, - STATE_DATA_XOR, -#if defined(TELEMETREZ) - STATE_DATA_PRIVATE_LEN, - STATE_DATA_PRIVATE_VALUE -#endif -}; - -#define FRSKY_RX_PACKET_SIZE 19 - #if defined(CPUARM) #define frskySendAlarms() #else @@ -453,6 +439,7 @@ enum TelemetryProtocol { TELEM_PROTO_FRSKY_D, TELEM_PROTO_FRSKY_SPORT, + TELEM_PROTO_CROSSFIRE, }; enum TelemAnas { @@ -496,23 +483,6 @@ void frskyUpdateCells(); void processFrskyTelemetryData(uint8_t data); -#if defined(PCBTARANIS) - inline uint8_t modelTelemetryProtocol() - { -#if defined(CROSSFIRE) - if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) - return PROTOCOL_PULSES_CROSSFIRE; -#endif - if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) - return g_model.telemetryProtocol; - else - return PROTOCOL_FRSKY_SPORT; - } - #define MODEL_TELEMETRY_PROTOCOL() modelTelemetryProtocol() -#elif defined(CPUARM) - #define MODEL_TELEMETRY_PROTOCOL() g_model.telemetryProtocol -#endif - #if defined(LUA) struct LuaTelemetryValue { diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 70e58474f..da756c6ef 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -21,6 +21,8 @@ #include "opentx.h" uint8_t telemetryStreaming = 0; +uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) +uint8_t telemetryRxBufferCount = 0; #if defined(WS_HOW_HIGH) uint8_t wshhStreaming = 0; @@ -60,6 +62,10 @@ lcdint_t applyChannelRatio(source_t channel, lcdint_t val) #if defined(CPUSTM32) void processTelemetryData(uint8_t data) { +#if defined(CROSSFIRE) + if (telemetryProtocol == PROTOCOL_PULSES_CROSSFIRE) + processCrossfireTelemetryData(data); +#endif processFrskyTelemetryData(data); } #endif diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 7ceb1e218..d14f4f0e7 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -21,7 +21,7 @@ #ifndef _TELEMETRY_H_ #define _TELEMETRY_H_ -#if defined (FRSKY) +#if defined(FRSKY) // FrSky Telemetry #include "frsky.h" #elif defined(JETI) @@ -38,6 +38,10 @@ #include "mavlink.h" #endif +#if defined(CROSSFIRE) + #include "crossfire.h" +#endif + extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time #if defined(WS_HOW_HIGH) @@ -55,6 +59,10 @@ enum TelemetryStates { extern uint8_t telemetryState; #endif +#define TELEMETRY_RX_PACKET_SIZE 19 // 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) +extern uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; +extern uint8_t telemetryRxBufferCount; + #if defined(CPUARM) #define TELEMETRY_VALUE_TIMER_CYCLE 200 /*20 seconds*/ #define TELEMETRY_VALUE_OLD_THRESHOLD 150 /*15 seconds*/ @@ -113,6 +121,23 @@ extern uint8_t telemetryProtocol; #define IS_FRSKY_SPORT_PROTOCOL() (false) #endif +#if defined(CPUSTM32) +inline uint8_t modelTelemetryProtocol() +{ +#if defined(CROSSFIRE) + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) + return PROTOCOL_PULSES_CROSSFIRE; +#endif + if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) + return g_model.telemetryProtocol; + else + return PROTOCOL_FRSKY_SPORT; +} +#define MODEL_TELEMETRY_PROTOCOL() modelTelemetryProtocol() +#elif defined(CPUARM) +#define MODEL_TELEMETRY_PROTOCOL() g_model.telemetryProtocol +#endif + #if defined(CPUARM) #include "telemetry_sensors.h" #endif diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index 294c2a951..292bba9f3 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -529,6 +529,11 @@ void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, u case TELEM_PROTO_FRSKY_D: frskyDSetDefault(index, id); break; +#endif +#if defined(CROSSFIRE) + case TELEM_PROTO_CROSSFIRE: + crossfireSetDefault(index, id, instance); + break; #endif default: return; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 84d5f6b50..451443b5a 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -376,7 +376,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metr.\0""Imper.", "Metrické""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1160,3 +1160,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 5cfabed45..30c5c5e87 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -383,7 +383,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\012") #define TR_VUNITSSYSTEM TR("Metrik""Imper.", "Metrisch\0 ""Imperial\0 ") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1163,3 +1163,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 8a6e47b40..62f4fe04f 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -378,7 +378,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1178,3 +1178,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 09df0af3a..6ea0b7a14 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -376,7 +376,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1120,3 +1120,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index a1f96a504..18f76acfd 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -376,7 +376,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1120,3 +1120,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index ec285a68e..476f1be43 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -378,7 +378,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\012") #define TR_VUNITSSYSTEM TR("Métr.\0""Impér.", "Métriques\0""Impériales") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1150,3 +1150,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index d3079fa3d..65c11566f 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -378,7 +378,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\011") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metriche\0""Imperiali") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1159,3 +1159,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 239b26ed2..b08f7e28f 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -379,7 +379,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metrs.""Engels", "Metrisch\0 ""Engels\0 ") #define LEN_VTELEMUNIT "\003" -#define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" +#define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1174,3 +1174,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 1114573f5..6260b1593 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -380,7 +380,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") /*8 decimal*/ #define TR_VUNITSSYSTEM TR("Metr. ""Imper.", "Metryczn""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1161,3 +1161,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 3ea2ba070..3b3bd29c9 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -370,7 +370,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1114,3 +1114,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 7718c2671..54cde89ab 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -376,7 +376,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metri.""Imper.", "Metriska""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -1175,3 +1175,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file From f2fb6b20de44de238019c4ed1b968a35ec535998 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 20:31:42 +0200 Subject: [PATCH 44/69] Crossfire CRC added --- radio/src/crc16.cpp | 55 ++++++++++++++++++++++++++++--- radio/src/opentx.h | 3 +- radio/src/telemetry/crossfire.cpp | 9 +++-- radio/src/tests/crossfire.cpp | 7 ++++ 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/radio/src/crc16.cpp b/radio/src/crc16.cpp index d9cfbcaf8..56319e271 100644 --- a/radio/src/crc16.cpp +++ b/radio/src/crc16.cpp @@ -20,8 +20,8 @@ #include -/* CRC16 implementation according to CCITT standards */ -static const unsigned short crc16tab[256]= { +// CRC16 implementation according to CCITT standards +static const unsigned short crc16tab[256] = { 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6, @@ -56,11 +56,56 @@ static const unsigned short crc16tab[256]= { 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0 }; -uint16_t crc16(uint8_t * buf, uint32_t len) +uint16_t crc16(const uint8_t * buf, uint32_t len) { uint16_t crc = 0; - for (uint32_t counter=0; counter>8) ^ *buf++ ) & 0x00FF]; + for (uint32_t i=0; i>8) ^ *buf++) & 0x00FF]; } return crc; } + +// CRC8 implementation with polynom = x^8+x^7+x^6+x^4+x^2+1 (0xD5) +unsigned char crc8tab[256] = { + 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54, + 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D, + 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06, + 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F, + 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0, + 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9, + 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2, + 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B, + 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9, + 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0, + 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B, + 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2, + 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D, + 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44, + 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F, + 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16, + 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB, + 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92, + 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9, + 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0, + 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F, + 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36, + 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D, + 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64, + 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26, + 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F, + 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74, + 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D, + 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82, + 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB, + 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0, + 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9 +}; + +uint8_t crc8(const uint8_t * ptr, uint32_t len) +{ + uint8_t crc = 0; + for (uint32_t i=0; i TELEMETRY_RX_PACKET_SIZE-2)) { + if (telemetryRxBufferCount == 1 && (data < 2 || data > TELEMETRY_RX_PACKET_SIZE-2)) { telemetryRxBufferCount = 0; return; } diff --git a/radio/src/tests/crossfire.cpp b/radio/src/tests/crossfire.cpp index cc7f69e14..317a35676 100644 --- a/radio/src/tests/crossfire.cpp +++ b/radio/src/tests/crossfire.cpp @@ -35,5 +35,12 @@ TEST(Crossfire, createCrossfireFrame) // TODO check } + +TEST(Crossfire, crc8) +{ + uint8_t frame[] = { 0x00, 0x0C, 0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x03, 0x00, 0x00, 0x00, 0xF4 }; + uint8_t crc = crc8(&frame[2], frame[1]-1); + ASSERT_EQ(frame[frame[1]+1], crc); +} #endif From 554f2306960c746c927cb4cf5dbc3e7ce084f66b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 20:56:48 +0200 Subject: [PATCH 45/69] Prevent from using the internal module when there is a Crossfire module plugged into the bay --- radio/src/gui/gui_helpers.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/radio/src/gui/gui_helpers.cpp b/radio/src/gui/gui_helpers.cpp index cc267cbca..f35f358a7 100644 --- a/radio/src/gui/gui_helpers.cpp +++ b/radio/src/gui/gui_helpers.cpp @@ -457,11 +457,21 @@ bool isSourceAvailableInResetSpecialFunction(int index) bool isModuleAvailable(int module) { +#if defined(CROSSFIRE) + if (module == MODULE_TYPE_CROSSFIRE && g_model.moduleData[INTERNAL_MODULE].rfProtocol != RF_PROTO_OFF) { + return false; + } +#endif return true; } bool isRfProtocolAvailable(int protocol) { +#if defined(CROSSFIRE) + if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) { + return false; + } +#endif #if defined(MODULE_D16_EU_ONLY_SUPPORT) if (protocol == RF_PROTO_D8) { return false; From be1526a86d1095a92dac388bbabdf8203e45bfa3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 20:57:01 +0200 Subject: [PATCH 46/69] Cosmetics --- radio/src/gui/taranis/menu_model_telemetry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/taranis/menu_model_telemetry.cpp b/radio/src/gui/taranis/menu_model_telemetry.cpp index 601cecbb4..e2950ad3e 100644 --- a/radio/src/gui/taranis/menu_model_telemetry.cpp +++ b/radio/src/gui/taranis/menu_model_telemetry.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" enum menuModelTelemetryItems { ITEM_TELEMETRY_PROTOCOL_TYPE, From 6a2e26272e2073d45a7891362d952c843b463a27 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 23:16:22 +0200 Subject: [PATCH 47/69] [Horus] Unused code removed --- radio/src/gui/horus/bitmapbuffer.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/radio/src/gui/horus/bitmapbuffer.cpp b/radio/src/gui/horus/bitmapbuffer.cpp index 309c35c35..a35c0504f 100644 --- a/radio/src/gui/horus/bitmapbuffer.cpp +++ b/radio/src/gui/horus/bitmapbuffer.cpp @@ -256,7 +256,7 @@ void BitmapBuffer::drawFontPattern(coord_t x, coord_t y, const uint8_t * font, c lcdNextPos = x + width; } -void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const pm_char * s, uint8_t len, LcdFlags flags) +void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlags flags) { int width = getTextWidth(s, len, flags); int height = getFontHeight(flags); @@ -279,12 +279,6 @@ void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const pm_char * s, uint8_ drawSolidFilledRect(x-INVERT_HORZ_MARGIN, y, width+2*INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR); } - char str[256]; - if (flags & ZCHAR) - strcat_zchar(str, s, len); - else - strAppend(str, s, len); - const coord_t orig_x = x; bool setx = false; while (len--) { From 83a7859f6f5a2ad9603ae8391460561fd45790ac Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 23:17:20 +0200 Subject: [PATCH 48/69] Cosmetics --- radio/src/gui/horus/menu_general_version.cpp | 2 +- radio/src/targets/horus/usb_bsp.c | 44 +++++++++--------- radio/src/targets/horus/usb_driver.c | 2 +- radio/src/targets/horus/usbd_cdc.cpp | 42 ++++++++--------- radio/src/targets/horus/usbd_conf.h | 48 ++++++++++---------- 5 files changed, 69 insertions(+), 69 deletions(-) diff --git a/radio/src/gui/horus/menu_general_version.cpp b/radio/src/gui/horus/menu_general_version.cpp index 3acd45539..546bdd8b8 100644 --- a/radio/src/gui/horus/menu_general_version.cpp +++ b/radio/src/gui/horus/menu_general_version.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" bool menuGeneralVersion(evt_t event) { diff --git a/radio/src/targets/horus/usb_bsp.c b/radio/src/targets/horus/usb_bsp.c index 87791feae..a1a2fe25e 100644 --- a/radio/src/targets/horus/usb_bsp.c +++ b/radio/src/targets/horus/usb_bsp.c @@ -1,29 +1,29 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + /* Includes ------------------------------------------------------------------*/ #include "usb_bsp.h" -#include "../horus/board_horus.h" -#include "../horus/usbd_conf.h" +#include "board_horus.h" +#include "usbd_conf.h" extern uint32_t SystemCoreClock; diff --git a/radio/src/targets/horus/usb_driver.c b/radio/src/targets/horus/usb_driver.c index c0ccf50d0..92905ecf9 100644 --- a/radio/src/targets/horus/usb_driver.c +++ b/radio/src/targets/horus/usb_driver.c @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../horus/board_horus.h" +#include "board_horus.h" #include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc/usb_dcd_int.h" int usbPlugged(void) diff --git a/radio/src/targets/horus/usbd_cdc.cpp b/radio/src/targets/horus/usbd_cdc.cpp index 149868c00..daaa70cfb 100644 --- a/radio/src/targets/horus/usbd_cdc.cpp +++ b/radio/src/targets/horus/usbd_cdc.cpp @@ -1,28 +1,28 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED #pragma data_alignment = 4 #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -#include "../../opentx.h" +#include "opentx.h" extern "C" { diff --git a/radio/src/targets/horus/usbd_conf.h b/radio/src/targets/horus/usbd_conf.h index d17d4742e..5dcfeeb45 100644 --- a/radio/src/targets/horus/usbd_conf.h +++ b/radio/src/targets/horus/usbd_conf.h @@ -1,29 +1,29 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef _USBD_CONF_H_ -#define _USBD_CONF_H_ +#ifndef _USBD_CONF_H_ +#define _USBD_CONF_H_ /* Includes ------------------------------------------------------------------*/ -#include "../horus/usb_conf.h" +#include "usb_conf.h" #define USBD_CFG_MAX_NUM 1 #define USBD_ITF_MAX_NUM 1 @@ -57,7 +57,7 @@ #define APP_RX_DATA_SIZE 512 // USB serial port output buffer. TODO: tune this buffer size /* Total size of IN buffer: APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */ #define APP_FOPS VCP_fops -#endif // _USBD_CONF_H_ +#endif // _USBD_CONF_H_ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From ed30b5a8ed06965978f07e1a55237431fc5dc19a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 23:17:55 +0200 Subject: [PATCH 49/69] =?UTF-8?q?[Horus]=C2=A0USB=20icon=20only=20displaye?= =?UTF-8?q?d=20when=20USB=20plugged?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- radio/src/gui/horus/topbar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/horus/topbar.cpp b/radio/src/gui/horus/topbar.cpp index 5b287784e..3d9139817 100644 --- a/radio/src/gui/horus/topbar.cpp +++ b/radio/src/gui/horus/topbar.cpp @@ -56,7 +56,7 @@ void drawTopBar() theme->drawTopbarBackground(NULL); // USB icon - if (1/*usbPlugged()*/) { + if (usbPlugged()) { lcdDrawBitmapPattern(LCD_W-98, 8, LBM_TOPMENU_USB, MENU_TITLE_COLOR); } From a6a07e971422f52754d1fbb19d574dbe32a218b6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 28 Mar 2016 23:18:32 +0200 Subject: [PATCH 50/69] [Horus] Speedup when switching from the main view to any other menu --- radio/src/gui/horus/view_main.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/horus/view_main.cpp b/radio/src/gui/horus/view_main.cpp index a85cdebe7..a04ca2859 100644 --- a/radio/src/gui/horus/view_main.cpp +++ b/radio/src/gui/horus/view_main.cpp @@ -137,10 +137,6 @@ bool menuMainView(evt_t event) killEvents(KEY_DOWN); break; - case EVT_ENTRY_UP: - LOAD_MODEL_BITMAP(); - break; - case EVT_KEY_LONG(KEY_ENTER): killEvents(event); POPUP_MENU_ADD_ITEM(STR_MODEL_SELECT); @@ -157,17 +153,17 @@ bool menuMainView(evt_t event) case EVT_KEY_LONG(KEY_MODEL): killEvents(event); pushMenu(menuTabModel[0]); - break; + return false; case EVT_KEY_LONG(KEY_RADIO): killEvents(event); pushMenu(menuTabGeneral[0]); - break; + return false; case EVT_KEY_LONG(KEY_TELEM): killEvents(event); pushMenu(menuTabScreensSetup[1]); - break; + return false; case EVT_KEY_BREAK(KEY_PGDN): storageDirty(EE_GENERAL); From 38dbfd130a2fc13cc42b52b9f62cf6ec766b0e5a Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 29 Mar 2016 15:17:01 +0200 Subject: [PATCH 51/69] Fix travis (clang 3.8 -> 3.9) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a108c9eaa..8ebbbddd8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ before_install: - sudo apt-get update -qq install: - - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 + - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.9 libclang-3.9-dev python-qt4 - export CXX="g++-5" CC="gcc-5" - wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb - wget --quiet http://firmware.ardupilot.org/Tools/Travis/libmpfr4_3.1.2-1_amd64.deb From 86076bbf328703ac445936f20b6ac0fff209b5c6 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 25 Mar 2016 14:04:30 +0100 Subject: [PATCH 52/69] Also backup members inside unions, the code is a bit more complicated since unions can have structs or simple types. Also change Telemetry sensor to be a struct, since a class with all public is identical to a struct in C++ --- radio/src/datastructs.h | 4 +- radio/src/storage/datacopy.cpp | 35 +++++++++++++++- radio/util/generate_datacopy.py | 74 ++++++++++++++++++++++++++------- 3 files changed, 94 insertions(+), 19 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 89930a61f..c431ee37a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -622,9 +622,7 @@ PACK(struct MavlinkTelemetryData { */ #if defined(CPUARM) -// TODO struct as others -PACK(class TelemetrySensor { - public: +PACK(struct TelemetrySensor { union { uint16_t id; // data identifier, for FrSky we can reuse existing ones. Source unit is derived from type. uint16_t persistentValue; diff --git a/radio/src/storage/datacopy.cpp b/radio/src/storage/datacopy.cpp index 239db541d..6afc7fb06 100644 --- a/radio/src/storage/datacopy.cpp +++ b/radio/src/storage/datacopy.cpp @@ -1,4 +1,4 @@ -//This file was auto-generated by generate_datacopy.py script on Wed Mar 16 20:12:19 2016. Do not edit this file! +//This file was auto-generated by generate_datacopy.py script on Fri Mar 25 14:17:31 2016. Do not edit this file! @@ -77,6 +77,7 @@ void copyCustomFunctionData(A * dest, B * src) { dest->swtch = src->swtch; dest->func = src->func; + copyCustomFunctionData_all(&dest->all, &src->all); dest->active = src->active; } @@ -165,6 +166,24 @@ void copyFrSkyTelemetryData(A * dest, B * src) } } +template +void copyTelemetrySensor(A * dest, B * src) +{ + dest->id = src->id; + dest->instance = src->instance; + memcpy(dest->label, src->label, sizeof(dest->label)); + dest->type = src->type; + dest->unit = src->unit; + dest->prec = src->prec; + dest->autoOffset = src->autoOffset; + dest->filter = src->filter; + dest->logs = src->logs; + dest->persistent = src->persistent; + dest->onlyPositive = src->onlyPositive; + dest->subId = src->subId; + copyTelemetrySensor_custom(&dest->custom, &src->custom); +} + template void copyModuleData(A * dest, B * src) { @@ -305,3 +324,17 @@ void copyRadioData(A * dest, B * src) dest->potsConfig = src->potsConfig; } +template +void copyCustomFunctionData_all(A * dest, B * src) +{ + dest->val = src->val; + dest->mode = src->mode; + dest->param = src->param; +} + +template +void copyTelemetrySensor_custom(A * dest, B * src) +{ + dest->ratio = src->ratio; + dest->offset = src->offset; +} diff --git a/radio/util/generate_datacopy.py b/radio/util/generate_datacopy.py index 22e87d6d9..493ece838 100755 --- a/radio/util/generate_datacopy.py +++ b/radio/util/generate_datacopy.py @@ -12,33 +12,77 @@ if sys.platform == "darwin": structs = [] +extrastructs = [] + +def build_struct(cursor, anonymousUnion=False): + if not anonymousUnion: + structs.append(cursor.spelling) + print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) -def build_struct(cursor): - structs.append(cursor.spelling) - print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) for c in cursor.get_children(): - if c.kind == clang.cindex.CursorKind.FIELD_DECL: - if c.type.get_array_size() > 0: - if c.type.get_array_element_type().spelling in structs: - print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) - print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, c.spelling, c.spelling)) - print(" }") + if c.kind == clang.cindex.CursorKind.UNION_DECL: + if c.spelling: + raise "Cannot handle non anonymous unions" + + copiedUnionMember = False + for uc in c.get_children(): + if not uc.spelling or uc.kind == clang.cindex.CursorKind.PACKED_ATTR: + # Ignore + pass else: - print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (c.spelling, c.spelling, c.spelling)) - elif c.type.get_declaration().spelling in structs: - print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, c.spelling, c.spelling)) - else: - print(" dest->%s = src->%s;" % (c.spelling, c.spelling)) - print("}\n") + # per default we copy only the first member of a union and warn if there are more + # members (declare the other members NOBACKUP) + if copiedUnionMember: + print ("Warning more than one union member (%s) in anynomous union inside struct %s, consider NOBACKUP statements" % (uc.spelling, cursor.spelling), file=sys.stderr) + else: + copy_decl(uc, uc.spelling) + copiedUnionMember = True + + elif c.kind == clang.cindex.CursorKind.FIELD_DECL: + copy_decl(c, c.spelling) + + + if not anonymousUnion: + print("}\n") def build(cursor): result = [] for c in cursor.get_children(): if c.kind == clang.cindex.CursorKind.STRUCT_DECL: build_struct(c) + for c, spelling in extrastructs: + print("template \nvoid copy%s(A * dest, B * src)\n{" % spelling) + build_struct(c, True) + print ("}\n") + return result +def copy_decl(c, spelling): + childs = [ch for ch in c.get_children()] + if c.type.get_array_size() > 0: + if c.type.get_array_element_type().spelling in structs: + print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) + print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, spelling, spelling)) + print(" }") + else: + print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (spelling, spelling, spelling)) + elif c.type.kind == clang.cindex.TypeKind.UNEXPOSED and len(childs)==1 and childs[0].kind == clang.cindex.CursorKind.STRUCT_DECL: + # inline declared structs + if c.semantic_parent.spelling: + spellingFunc = c.semantic_parent.spelling + "_" + spelling + else: + spellingFunc = c.semantic_parent.semantic_parent.spelling + "_" + spelling + + extrastructs.append((childs[0], spellingFunc)) + print(" copy%s(&dest->%s, &src->%s);" % (spellingFunc, spelling, spelling)) + + elif c.type.get_declaration().spelling in structs: + print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, spelling, spelling)) + else: + print(" dest->%s = src->%s;" % (spelling, spelling)) + + def header(): print("//This file was auto-generated by %s script on %s. Do not edit this file!\n\n\n" % (os.path.basename(sys.argv[0]), time.asctime())) From fb5feb8a912593b053b223f25d42f549675e2c14 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 29 Mar 2016 18:10:42 +0200 Subject: [PATCH 53/69] Fix companion build on OS X --- companion/src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 4c34b7f2c..a74bb6bc3 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -283,7 +283,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") install(FILES ../targets/linux/45-companion-taranis.rules DESTINATION /lib/udev/rules.d RENAME 45-companion${C9X_NAME_SUFFIX}-taranis.rules) # Linux specific code set(OperatingSystem "Linux") -else() +elseif(WIN32) get_target_property(QtCore_LOCATION Qt5::Core LOCATION) get_filename_component(QT_DLL_DIR ${QtCore_LOCATION} PATH) get_filename_component(SDL_DIR ${SDL_LIBRARY} PATH) From 90f67cd5efbce66be4a361cab035c883624867cb Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 29 Mar 2016 18:53:58 +0200 Subject: [PATCH 54/69] Fix crash of simulator if directory does not exist. --- radio/src/targets/simu/simpgmspace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 2c930e562..a8fee3ef4 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -880,7 +880,7 @@ FRESULT f_opendir (DIR * rep, const TCHAR * name) FRESULT f_closedir (DIR * rep) { TRACE("f_closedir(%p)", rep); - simu::closedir((simu::DIR *)rep->fs); + if (rep->fs) simu::closedir((simu::DIR *)rep->fs); return FR_OK; } From f2eadf0ff0d9a7b1268386e4639f9f50c47151a5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 29 Mar 2016 20:09:09 +0200 Subject: [PATCH 55/69] [Horus] Introduction of a button to remove an existing view --- radio/src/gui/horus/screens_setup.cpp | 57 +++++++++++++-------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/radio/src/gui/horus/screens_setup.cpp b/radio/src/gui/horus/screens_setup.cpp index b2971561e..f6ca654bb 100644 --- a/radio/src/gui/horus/screens_setup.cpp +++ b/radio/src/gui/horus/screens_setup.cpp @@ -487,18 +487,21 @@ bool menuScreenSetup(int index, evt_t event) currentContainer = currentScreen; bool needsOffsetCheck = (menuVerticalPosition != 0 || menuHorizontalPosition < 0); - const ZoneOption * options = currentScreen->getFactory()->getOptions(); - int optionsCount = getOptionsCount(options); - linesCount = ITEM_SCREEN_SETUP_LAYOUT_OPTION1 + optionsCount; - char title[] = "Main view X"; title[sizeof(title)-2] = '1' + index; menuPageCount = updateMainviewsMenu(); - uint8_t mstate_tab[2 + MAX_LAYOUT_OPTIONS] = { uint8_t(NAVIGATION_LINE_BY_LINE|uint8_t(countRegisteredLayouts-1)), ORPHAN_ROW }; + const ZoneOption * options = currentScreen->getFactory()->getOptions(); + int optionsCount = getOptionsCount(options); + linesCount = ITEM_SCREEN_SETUP_LAYOUT_OPTION1 + optionsCount; + if (menuPageCount > 3) + ++linesCount; + + uint8_t mstate_tab[2 + MAX_LAYOUT_OPTIONS + 1] = { uint8_t(NAVIGATION_LINE_BY_LINE|uint8_t(countRegisteredLayouts-1)), ORPHAN_ROW }; for (int i=0; igetOptionValue(index); + uint8_t o = k - ITEM_SCREEN_SETUP_LAYOUT_OPTION1; + if (o < optionsCount) { + const ZoneOption * option = &options[o]; + ZoneOptionValue * value = currentScreen->getOptionValue(o); if (editZoneOption(y, option, value, attr, EE_MODEL, event)) { currentScreen->update(); } } + else if (menuPageCount > 3 && o == optionsCount) { + drawButton(SCREENS_SETUP_2ND_COLUMN, y, STR_REMOVE_SCREEN, attr); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { + delete currentScreen; + if (index != MAX_CUSTOM_SCREENS-1) { + memmove(&g_model.screenData[index], &g_model.screenData[index + 1], sizeof(CustomScreenData) * (MAX_CUSTOM_SCREENS - index - 1)); + memmove(&customScreens[index], &customScreens[index + 1], sizeof(Layout *) * (MAX_CUSTOM_SCREENS - index - 1)); + } + memset(&g_model.screenData[MAX_CUSTOM_SCREENS-1], 0, sizeof(CustomScreenData)); + customScreens[MAX_CUSTOM_SCREENS-1] = NULL; + chainMenu(menuTabScreensSetup[index > 0 ? index : 1]); + return false; + } + } break; } } } - if (menuVerticalPosition == -1 && index > 0 && event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(KEY_ENTER); - menuHorizontalPosition = index; - POPUP_MENU_ADD_ITEM(STR_REMOVE_SCREEN); - popupMenuHandler = onScreenSetupMenu; - } - return true; } @@ -592,23 +602,10 @@ bool menuScreenAdd(evt_t event) if (event == EVT_KEY_BREAK(KEY_ENTER)) { customScreens[menuPageCount-2] = registeredLayouts[0]->create(&g_model.screenData[menuPageCount-2].layoutData); s_editMode = 0; + menuHorizontalPosition = -1; return false; } SIMPLE_MENU_WITH_OPTIONS("Add main view", LBM_SCREENS_SETUP_ICONS, menuTabScreensSetup, menuPageCount, menuPageCount-1, 0); return true; } - -void onScreenSetupMenu(const char * result) -{ - if (result == STR_REMOVE_SCREEN) { - delete customScreens[menuHorizontalPosition]; - if (menuHorizontalPosition != MAX_CUSTOM_SCREENS-1) { - memmove(&g_model.screenData[menuHorizontalPosition], &g_model.screenData[menuHorizontalPosition + 1], sizeof(CustomScreenData) * (MAX_CUSTOM_SCREENS - menuHorizontalPosition - 1)); - memmove(&customScreens[menuHorizontalPosition], &customScreens[menuHorizontalPosition + 1], sizeof(Layout *) * (MAX_CUSTOM_SCREENS - menuHorizontalPosition - 1)); - } - memset(&g_model.screenData[MAX_CUSTOM_SCREENS-1], 0, sizeof(CustomScreenData)); - customScreens[MAX_CUSTOM_SCREENS-1] = NULL; - // chainMenu(menuMainviews[menuHorizontalPosition > 0 ? menuHorizontalPosition-1 : 0]); - } -} From 2e6570e20907ad683cdaad5cad8fea3a41508753 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 29 Mar 2016 21:35:33 +0200 Subject: [PATCH 56/69] New script to check AVR firmware size, as it seems it increased over time in the 'next' branch ... --- radio/util/checksize.py | 51 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 radio/util/checksize.py diff --git a/radio/util/checksize.py b/radio/util/checksize.py new file mode 100644 index 000000000..6cc194f61 --- /dev/null +++ b/radio/util/checksize.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +import os +import sys +import subprocess + +index = -1 +size = None + +options = sys.argv[1:] +srcdir = os.path.dirname(os.path.realpath(__file__)) + "/../.." +buildir = os.getcwd() + +while 1: + sys.stdout.flush() + index += 1 + + os.chdir(srcdir) + cmd = ["git", "reset", "--hard", "origin/next~%d" % index] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode != 0: + print "HEAD~%d git reset failed" % index + continue + + os.chdir(buildir) + cmd = ["cmake"] + options + [srcdir] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode != 0: + print "HEAD~%d cmake failed" % index + continue + + cmd = ["make", "-j4", "firmware"] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode != 0: + print "HEAD~%d make firmware failed" % index + continue + + oldsize = int(subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % "firmware.hex", shell=True)) + if size: + if size > oldsize: + print "HEAD~%d %d: increase by %d bytes" % (index-1, size, size-oldsize) + elif size < oldsize: + print "HEAD~%d %d: decrease by %d bytes" % (index-1, size, oldsize-size) + else: + print "HEAD~%d %d" % (index-1, size) + size = oldsize + + From a2e5efa6c7c5de9ad97dde6571bc7bd4572983a3 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 29 Mar 2016 21:34:13 +0200 Subject: [PATCH 57/69] Make simulator sound functional again in OS X (and probably Linux) The radio/src/simu/CMakeLists.txt was missing the SDL defines/includes required for SDL audio --- CMakeLists.txt | 8 ++++++++ companion/src/CMakeLists.txt | 7 +------ radio/src/targets/simu/CMakeLists.txt | 9 ++++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 79ea8adaa..2180c7516 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,14 @@ find_package(Qt5LinguistTools) find_package(Qt5PrintSupport) find_package(Qt5Multimedia) +message(STATUS "Looking for SDL ") +find_package(Sdl) +if(SDL_FOUND) + message("SDL Include Path: " ${SDL_INCLUDE_DIR}) +else() + message("SDL not found! Joysticks support will be disabled. Simulator audio will not work.") +endif() + include(Macros) today(DATE) now(TIME) diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index a74bb6bc3..ebb139596 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -25,15 +25,10 @@ if(TABLE_LAYOUT) message(STATUS "Using QTableWidget") endif(TABLE_LAYOUT) -message(STATUS "Looking for SDL ") -find_package(Sdl) if(SDL_FOUND) include_directories(${SDL_INCLUDE_DIR}) - message("SDL Include Path: " ${SDL_INCLUDE_DIR}) - add_definitions(-DJOYSTICKS) add_definitions(-DSIMU_AUDIO) -else() - message("SDL not found! Joysticks support will be disabled. Simulator audio will not work.") + add_definitions(-DJOYSTICKS) endif() message(STATUS "Looking for QT lupdate ") diff --git a/radio/src/targets/simu/CMakeLists.txt b/radio/src/targets/simu/CMakeLists.txt index 8f8b45d82..b917969f8 100644 --- a/radio/src/targets/simu/CMakeLists.txt +++ b/radio/src/targets/simu/CMakeLists.txt @@ -7,6 +7,12 @@ set(SIMU_SRC ${SIMU_SRC} simpgmspace.cpp) add_definitions(-DSIMU) remove_definitions(-DCLI) +if(SDL_FOUND) + include_directories(${SDL_INCLUDE_DIR}) + add_definitions(-DSIMU_AUDIO) + add_definitions(-DJOYSTICKS) +endif() + if(Qt5Widgets_FOUND) set(SIMULATOR_FLAVOUR opentx-${FLAVOUR}) set(SIMULATOR_TARGET ${SIMULATOR_FLAVOUR}-simulator) @@ -14,6 +20,7 @@ if(Qt5Widgets_FOUND) include_directories(${COMPANION_SRC_DIRECTORY} ${COMPANION_SRC_DIRECTORY}/simulation) add_library(${SIMULATOR_TARGET} SHARED ${SIMU_SRC} opentxsimulator.cpp) add_dependencies(${SIMULATOR_TARGET} ${FIRMWARE_DEPENDENCIES}) + target_link_libraries(${SIMULATOR_TARGET} ${SDL_LIBRARY}) qt5_use_modules(${SIMULATOR_TARGET} Core) add_custom_target(libsimulator DEPENDS ${SIMULATOR_TARGET}) endif() @@ -30,7 +37,7 @@ if(NOT WIN32) add_executable(simu WIN32 ${SIMU_SRC} ../../simu.cpp) add_dependencies(simu ${FIRMWARE_DEPENDENCIES}) target_include_directories(simu PUBLIC /usr/local/include/fox-1.6 PUBLIC /usr/include/fox-1.6 /opt/local/include/fox-1.6) - target_link_libraries(simu FOX-1.6 pthread) + target_link_libraries(simu FOX-1.6 pthread ${SDL_LIBRARY}) endif() if(APPLE) From 3f4cae8cb1e1d190e7c42eaa7fcee546cc255d6f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 29 Mar 2016 22:25:56 +0200 Subject: [PATCH 58/69] PPM_UNIT = PERCENT_PREC1 by default (as in 2.1) --- radio/src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 548c7f21d..ac867ed73 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -9,7 +9,7 @@ option(CURVES "Curves" ON) option(GVARS "Global variables") option(GUI "GUI enabled" ON) option(SPLASH "Splash enabled" ON) -option(PPM_UNIT "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)" PERCENT_PREC0) +option(PPM_UNIT "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)" PERCENT_PREC1) option(PPM_CENTER_ADJUSTABLE "PPM center adjustable" OFF) option(PPM_LIMITS_SYMETRICAL "PPM limits symetrical" OFF) option(OVERRIDE_CHANNEL_FUNCTION "OverrideChannel function available" OFF) From 9cd9616ecee675144c7c680be51048b20b458e0b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 29 Mar 2016 22:27:27 +0200 Subject: [PATCH 59/69] OVERRIDE_CHANNEL_FUNCTION = YES by default (as in 2.1) --- radio/src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index ac867ed73..4a55a63e0 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -12,7 +12,7 @@ option(SPLASH "Splash enabled" ON) option(PPM_UNIT "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)" PERCENT_PREC1) option(PPM_CENTER_ADJUSTABLE "PPM center adjustable" OFF) option(PPM_LIMITS_SYMETRICAL "PPM limits symetrical" OFF) -option(OVERRIDE_CHANNEL_FUNCTION "OverrideChannel function available" OFF) +option(OVERRIDE_CHANNEL_FUNCTION "OverrideChannel function available" ON) option(DANGEROUS_MODULE_FUNCTIONS "Dangerous module functions (RangeCheck / Bind / Module OFF, etc.) available" OFF) option(FAI "Competition mode (no telemetry)" OFF) option(AUTOSOURCE "Automatic source detection in menus" ON) From 791a2e5f7546d88e913b47b87e9f770aee6add8e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 29 Mar 2016 22:30:38 +0200 Subject: [PATCH 60/69] PPM_UNIT = PERCENT_PREC1 by default (as in 2.1) --- radio/src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 4a55a63e0..c834933ed 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -9,7 +9,7 @@ option(CURVES "Curves" ON) option(GVARS "Global variables") option(GUI "GUI enabled" ON) option(SPLASH "Splash enabled" ON) -option(PPM_UNIT "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)" PERCENT_PREC1) +set(PPM_UNIT "PERCENT_PREC1" CACHE STRING "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)") option(PPM_CENTER_ADJUSTABLE "PPM center adjustable" OFF) option(PPM_LIMITS_SYMETRICAL "PPM limits symetrical" OFF) option(OVERRIDE_CHANNEL_FUNCTION "OverrideChannel function available" ON) From 9fb5416ac97b46ae9f4a581aebbc71dfdf503f9a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 29 Mar 2016 22:40:29 +0200 Subject: [PATCH 61/69] Makefile removed as it doesn't work anymore. CMake is used instead. --- radio/src/Makefile | 2087 -------------------------------------------- 1 file changed, 2087 deletions(-) delete mode 100644 radio/src/Makefile diff --git a/radio/src/Makefile b/radio/src/Makefile deleted file mode 100644 index 13d356d8d..000000000 --- a/radio/src/Makefile +++ /dev/null @@ -1,2087 +0,0 @@ -# !!!! BETA Makefile !!!! -# !!!! Use at own risk !!!! -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make install = Install the most recently compiled hex file. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -#----------- INSTALL OPTIONS --------------------------- - -# Data directory we write hex files to. -DATA_DIR = /tmp - -# Backup the old flash (YES, NO) -BACKUP_FLASH = YES - -# Backup the old EEPROM (YES, NO) -BACKUP_EEPROM = YES - -# Restore EEPROM to 9x (YES, NO) (will set BACKUP_EEPROM to YES). -RESTORE_EEPROM = NO - -# Double write OK (YES, NO) -# Set this *if only if* your programmer can correctly write the EEPROM -# and FLASH in one command. If it doesn't, try setting the 9x fuse to -# not erase the eeprom when you erase the flash. -DOUBLE_WRITE_OK = NO - -# Command to read/write FLASH/EEPROM images. Currently -# Must have avrdude interface -AVRDUDE = /usr/local/bin/avrdude - -# Device options for AVRDUDE Command. -AVRDEVICE = -c usbasp -p m64 - -# Delay to start second AVRDUDE command (required by some). -DELAY = 5 - -#----------- BUILD OPTIONS --------------------------- - -# PCB version -# Values: 9X, 9X128, 9X2561, 9XR, 9XR128, 9XR2561, GRUVIN9X, MEGA2560, SKY9X, 9XRPRO, AR9X, TARANIS -# Old values STD and STD128 are mapped to 9X and 9X128 for compatibility -PCB = 9X - -# PCB revision -PCBREV = - -# LCD -# Values: DEFAULT, ST7565P, ST7565R, ERC12864FSF, ST7920 -LCD = DEFAULT - -# Enable JETI-Telemetry or FrSky Telemetry reception on UART0 -# For this option you need to modify your hardware! -# More information at [insertURLhere] -# Values = STD, FRSKY, FRSKY_SPORT, JETI, NMEA, ARDUPILOT, MAVLINK, TELEMETREZ -EXT = STD - -# GUI enabled -# Values = YES, NO -GUI = YES - -# FAI mode -# Values = YES, NO, CHOICE -FAI = NO - -# the latests deliveries for Turnigy 9x transmitters (since 2 years now, 2014) do not stop sending if no pulses are generated. -# This fact totally breaks the nice throttle and switch warning concept, because even we prevent sending pulses the -# transmitter module ignores this, and continues to send the last value or 0 at beginning. And 0 means in the middle of throttle -> 50%. -# To cope with this situation, we need a new concept how to handle throttle and switch warnings. -# if you have a 0 value (50% ) for throttle, while throttle warning is active, you should activate this switch -# Values = YES, NO -TURNIGY_TRANSMITTER_FIX = NO - -# Enable heli menu -# Values = YES, NO -HELI = NO - -# Enable templates menu -# Values = YES, NO -TEMPLATES = $(GUI) - -# Enable navigation with Pots / Sticks / Rotary encoders -# Values = NO -# POT1 (only POT1 available for fields modification), -# POT2 (menus scroll), -# POT3 (cursor down/up), -# POTS (POT1, POT2, POT3), -# STICKS -# ROTENC (Rotary encoder) -NAVIGATION = NO - -# Switches automatic selection -# Values = YES, NO -AUTOSWITCH = NO - -# Stock sticks replaced by FrSky ones -# Values = YES, NO -FRSKY_STICKS = NO - -# Sources automatic selection -# Values = YES, NO -AUTOSOURCE = NO - -# Double keys support (+/- means invert, +/up means max, -/dwn means min, up/down means reset to default) -# Values = YES, NO -DBLKEYS = NO - -# AUDIO Mods -# Values = YES, NO -AUDIO = NO - -# VOICE Mods -# Values = YES, NO -VOICE = NO - -# corrects different rounding for negative values. So instead of -99.9 you will see again -100.0 -# Values = YES, NO -CORRECT_NEGATIVE_VALUES = YES - -# adds additional code to prevent arithmetic overflows. MAX or MIN values stays. Not yet guaranteed!! Just improved -# Values = YES, NO -ARITHMETIC_OVERFLOW_CHECK = NO - -# increases resolution for throttle statistics and throttle counting, in very rare cases. -# this will be only true if an output channel is used for throttle calculation, and this channel has changed limits, e.g. -90% to +80% -# if you use standard limits for throttle or directly the throttle stick you do not need to bother about this option -# not valid for ARM based transmitters like Taranis, They do not have this rounding issue at all -# Values = YES, NO -ACCURAT_THROTTLE_STATS = NO - -# HAPTIC Mods -# Values = YES, NO -HAPTIC = NO - -# SmartieParts 2.2 Backlight support (inverted) -# Values = YES, NO -SP22 = NO - -# Fade Backlight using PWM -# Values = YES, NO -PWM_BACKLIGHT = NO - -# SPLASH on START -# Values = YES, NO, FIXED -SPLASH = $(GUI) - -# GRAPHICS (sliders / checkboxes / bold / batt graph) -GRAPHICS = YES -BOLD = YES -BATTGRAPH = NO - -# FONT TYPE -# Values = STD, SQT5 -FONT = STD - -# PPM center adjustable -# Values = YES, NO -PPM_CENTER_ADJUSTABLE = NO - -# PPM symmetrical limits -# Values = YES, NO -PPM_LIMITS_SYMETRICAL = NO - -# PPM display unit -# Values = PERCENT_PREC1, PERCENT_PREC0, US -PPM_UNIT = PERCENT_PREC1 - -# OverrideCHxx functions enable -# Values = YES, NO -OVERRIDE_CHANNEL_FUNCTION = YES - -# Dangerous functions available in Custom Functions (range test, bind, module off) -# Values = YES, NO -DANGEROUS_MODULE_FUNCTIONS = NO - -# FrSky Hub -# Values = YES, NO -FRSKY_HUB = YES - -# FrSky FAS current sensor offset compensation -# Values = YES, NO -FAS_OFFSET = NO - -# WS HowHigh -# Values = YES, NO -WS_HOW_HIGH = YES - -# Gauges in Telemetry screen -# Values = YES, NO -GAUGES = YES - -# GPS -# Values = YES, NO -GPS = YES - -# Vario -# Values = YES, NO -VARIO = YES - -# RTCLOCK -# Values = YES, NO -# default = YES (means enabled when available) -RTCLOCK = YES - -# Hardware volume -# Values = YES, NO -# default = YES (AR9X board doesn't have a hardware volume control as delivered but it can be fitted optionally) -HARDWARE_VOLUME = YES - -# BLUETOOTH -# Values = YES, NO -BLUETOOTH = NO - -# PXX (FrSky PCM) protocol -PXX = NO - -# DSM2 (Spektrum) protocol -# Values = NO, SERIAL, PPM -DSM2 = NO - -# HUBSAN protocol -# Values = NO, YES -HUBSAN = NO - -# DSM/PPM TX caddy PCB (Gruvin) -# For auto-switching switching between DSM2/X and Fr-Sky transmitter modules -# Values = YES, NO -TX_CADDY = NO - -#IR protocols (SILV / TRAC09 / PICZ / SWIFT) -IRPROTOS = NO - -# TRANSLATIONS -# Values = cz, de, en, fi, fr, it, se, es, pl, pt, nl -TRANSLATIONS = EN - -# TTS -# Values = en, fr, hu -TTS = $(TRANSLATIONS) - -# UNITS -# Values = imperial, metric -UNITS = METRIC - -# Default Tx Mode -# Values = NO / 1 / 2 / 3 / 4 -DEFAULT_MODE = NO - -# EEPROM_PROGRESS_BAR -# Values = YES, NO -EEPROM_PROGRESS_BAR = NO - -# Shutdown confirmation (for boards which have soft power) -# Values = NO, YES -SHUTDOWN_CONFIRMATION = NO - -# Activates the DEBUG Mode (all boards) -# On G9X V4 board, when VOICE=NO: -# PORTH:7 --> Transition LOW to HIGH = start of setupPulses(). Transition HIGH to LOW = end of setupPulses(). -# PORTH:6 --> LOW->HIGH = start of mixer calcs. HIGH->LOW, end of mixer calcs. -# Values = YES, NO -DEBUG = NO - -# Activate Command Line Interpreter -# Values = NO, YES -CLI = NO - -# Activate writing of telemetry received data to telemetry.log file -# Values = YES, NO -LOG_TELEMETRY = NO - -# Timers Count -# Values = 1, 2, 3 (on ARM boards) -TIMERS = 2 - -# Flight Modes -# Values = YES, NO -FLIGHT_MODES = YES - -# Curves -# Values = YES, NO -CURVES = YES - -# Global Vars -# Values = YES, NO -GVARS = NO - -# Enable another 3 positions switch to replace a pot -# Values = NO, POT1, POT2, POT3, -3POS = NO - -# Lua interpreter embedded -# Values = NO, NO_MODEL_SCRIPTS, YES -LUA = NO - -# Menu Lock modes -# Values = NO, READONLY, NOMENUS -MENUS_LOCK = NO - -# USB options in the main image -# Values = JOYSTICK, MASSSTORAGE, SERIAL -# JOYSTICK: The TX will appear as a joystick -# MASSSTORAGE: The TX will appear as a drive -# SERIAL: The TX will appear as a serial port -USB = JOYSTICK - -# Mixers monitor view added to Channels monitor one -# Values = NO, YES -# YES - Adds mixers output view to Channels monitor screen, -# pressing [ENT] switches between views. -# NO - classic Channels monitor -MIXERS_MONITOR = NO - -# Use newlib-nano -# Values = NO, YES -NANO = NO - -# Use custom bin based allocator for Lua -# Values = NO, YES -# YES - use our bin based allocator -# NO - use default Lua allocator -USE_BIN_ALLOCATOR = NO - -# Enable trace of events into Trace Buffer for debugging purposes -# Activating any of these options also activates DEBUG and DEBUG_TRACE_BUFFER -# Values = NO, YES -# TRACE_SD_CARD SD card operations (read, write, etc) -# TRACE_FATFS FatFs file operations -# TRACE_AUDIO Audio processing (not yet implemented) -TRACE_SD_CARD = NO -TRACE_FATFS = NO -TRACE_AUDIO = NO - -# Enable double buffering for LCD. Only for TARANIS PLUS and 9XE targets. -# Activating requires about 6kB of RAM, but it enables menus task to -# immediately start to compose a new LCD image while the current one is -# being written to LCD by DMA. -# If this option is NO, then first function that affects LCD buffer is -# delayed until DMA transfer is finished. -# Values = NO, YES -LCD_DUAL_BUFFER = NO - -# Enable internal module PPM mode for Taranis -# Values = NO, YES -TARANIS_INTERNAL_PPM = NO - -# Support for D16-EU only (no D8, no LR12 which are not EU compatible) -# Value = NO, YES -SUPPORT_D16_EU_ONLY = NO - -# Enable disk IO simulation in simulator -# Simulator will use FatFs module and simulated IO layer that -# uses "./sdcard.image" file as image of SD card. -# This file must contain whole SD card from first to last sector -# Values = NO, YES -SIMU_DISKIO = NO - -# Enable audio in simulator -# Values = NO, YES -SIMU_AUDIO = NO - -# Enable Watchdog test (DANGEROUS) -# Values = NO, YES -WATCHDOG_TEST = NO - -# Treat compiler warnings as errors -# Values = NO, YES -WARNINGS_AS_ERRORS = NO - -# Enable saving of Lua byte-code of all loaded scripts -# Values = NO, YES -LUA_COMPILER = NO - -# Enable ADC jitter measurement -# Values = NO, YES -JITTER_MEASURE = NO - -# Enable ADC jitter filtering -# Values = NO, YES -JITTER_FILTER = YES - -#------- END BUILD OPTIONS --------------------------- - -# Define programs and commands. -SHELL = sh - -IMG2LBM = -python ../util/img2lbm.py -BIN2LBM = -python ../util/bin2lbm.py -ifeq ($(OS), Windows_NT) - FONT2PNG = -python ../util/font2png.py -else - FONT2PNG = -xvfb-run --server-args="-screen 0 1024x768x24" python ../util/font2png.py -endif -TRANSLATE = -python ../util/translate.py - -VERSION_MAJOR = 2 -VERSION_MINOR = 2 -VERSION_REVISION = 0 - -VERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_REVISION)$(OPENTX_VERSION_SUFFIX) - -THIRDPARTY = thirdparty -COOSDIR = $(THIRDPARTY)/CoOS -FATFSDIR = $(THIRDPARTY)/FatFs -LUADIR = $(THIRDPARTY)/Lua/src - -SRC = -CPPSRC = -INCDIRS = . translations -LUADEP = -DEBUG_TRACE_BUFFER = NO - -# MCU name -ifeq ($(PCB), $(filter $(PCB), HORUS)) - $(error You have to use CMake to compile OpenTX for this PCB $(PCB)) -else ifneq ($(PCB), $(filter $(PCB), STD 9X 9XR STD128 9X128 9XR128 9X2561 9XR2561 GRUVIN9X MEGA2560 SKY9X 9XRPRO AR9X TARANIS FLAMENCO)) - $(error Sorry, the PCB $(PCB) is not supported yet in OpenTX) -endif - -GVARS_VARIANT = +1 -FRSKY_VARIANT = +2 -3POS_VARIANT = +4 -MAVLINK_VARIANT = +8 -M128_VARIANT = +32768 -M2561_VARIANT = +16384 -EEPROM_VARIANT = 0 - -GUIMODELSRC = gui/$(GUIDIRECTORY)/menu_model.cpp gui/$(GUIDIRECTORY)/menu_model_select.cpp gui/$(GUIDIRECTORY)/menu_model_setup.cpp gui/$(GUIDIRECTORY)/menu_model_limits.cpp gui/$(GUIDIRECTORY)/menu_model_logical_switches.cpp gui/$(GUIDIRECTORY)/menu_model_custom_functions.cpp gui/$(GUIDIRECTORY)/menu_model_telemetry.cpp -GUIGENERALSRC = gui/$(GUIDIRECTORY)/menu_general.cpp gui/$(GUIDIRECTORY)/menu_general_setup.cpp gui/$(GUIDIRECTORY)/menu_general_trainer.cpp gui/$(GUIDIRECTORY)/menu_general_version.cpp gui/$(GUIDIRECTORY)/menu_general_calib.cpp - -BITMAPS = bitmaps/sticks.lbm - -FONTS = $(patsubst %.png,%.lbm,$(wildcard fonts/std/*.png)) - -ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR)) - # 9x/9xr radio - GUIDIRECTORY = 9x - ARCH = AVR - LCDSIZE = 128 - TRGT = avr- - MCU = atmega64 - OPT = s - SDCARD = NO - THR_TRACE = NO - INCDIRS += targets/9x bitmaps bitmaps/9x - CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM64 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) - BOARDSRC = main_avr.cpp targets/9x/board_stock.cpp - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/common_avr/telemetry_driver.cpp - ifeq ($(GUI), YES) - EXTRABOARDSRC += targets/9x/lcd_driver.cpp - endif - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - ifeq ($(PCB), 9XR) - FLAVOUR = 9xr - CPPDEFS += -DPCB9XR - else - FLAVOUR = 9x - CPPDEFS += -DPCB9X - endif - - ifeq ($(TELEMETRY_MOD), 14051) - CPPDEFS += -DTELEMETRY_MOD_14051 - endif - - ifeq ($(TELEMETRY_MOD), 14051_SWAPPED) - CPPDEFS += -DTELEMETRY_MOD_14051_SWAPPED - endif - - ifeq ($(AUDIO), YES) - CPPDEFS += -DAUDIO - CPPSRC += audio_avr.cpp - BUZZER = NO - else - BUZZER = YES - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/9x/voice.cpp - endif - - ifeq ($(PWM_BACKLIGHT), YES) - ifeq ($(VOICE), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod) - endif - ifeq ($(AUDIO), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with AUDIO mod) - endif - CPPDEFS += -DPWM_BACKLIGHT - endif - - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - endif - - ifeq ($(SP22), YES) - CPPDEFS += -DSP22 - endif - - ifeq ($(FAS_OFFSET), YES) - CPPDEFS += -DFAS_OFFSET - endif -endif - -ifeq ($(PCB), $(filter $(PCB), STD128 9X128 9XR128)) - # 9X/9XR radio with ATmega64 replaced by ATmega128 - GUIDIRECTORY = 9x - ARCH = AVR - LCDSIZE = 128 - TRGT = avr- - MCU = atmega128 - OPT = s - SDCARD = NO - THR_TRACE = NO - EEPROM_VARIANT += ${M128_VARIANT} - CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM128 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) - INCDIRS += targets/9x bitmaps bitmaps/9x - BOARDSRC = main_avr.cpp targets/9x/board_stock.cpp - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/9x/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - ifeq ($(PCB), 9XR128) - FLAVOUR = 9xr128 - CPPDEFS += -DPCB9XR128 - else - FLAVOUR = 9x128 - CPPDEFS += -DPCB9X128 - endif - - ifeq ($(TELEMETRY_MOD), 14051) - CPPDEFS += -DTELEMETRY_MOD_14051 - endif - - ifeq ($(TELEMETRY_MOD), 14051_SWAPPED) - CPPDEFS += -DTELEMETRY_MOD_14051_SWAPPED - endif - - ifeq ($(AUDIO), YES) - CPPDEFS += -DAUDIO - CPPSRC += audio_avr.cpp - BUZZER = NO - else - BUZZER = YES - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/9x/voice.cpp - endif - - ifeq ($(PWM_BACKLIGHT), YES) - ifeq ($(VOICE), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod) - endif - ifeq ($(AUDIO), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with AUDIO mod) - endif - CPPDEFS += -DPWM_BACKLIGHT - endif - - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - endif - - ifeq ($(SP22), YES) - CPPDEFS += -DSP22 - endif -endif - -ifeq ($(PCB), $(filter $(PCB), 9X2561)) - # 9X/9XR radio with ATmega64 replaced by ATmega2561 - GUIDIRECTORY = 9x - ARCH = AVR - LCDSIZE = 128 - TRGT = avr- - MCU = atmega2561 - OPT = s - SDCARD = NO - THR_TRACE = YES - EEPROM_VARIANT += ${M2561_VARIANT} - CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM2561 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) - INCDIRS += targets/9x bitmaps bitmaps/9x - BOARDSRC = main_avr.cpp targets/9x/board_stock.cpp - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/9x/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - ifeq ($(PCB), 9XR2561) - FLAVOUR = 9xr2561 - CPPDEFS += -DPCB9XR2561 - else - FLAVOUR = 9x2561 - CPPDEFS += -DPCB9X2561 - endif - - ifeq ($(AUDIO), YES) - CPPDEFS += -DAUDIO - CPPSRC += audio_avr.cpp - BUZZER = NO - else - BUZZER = YES - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/9x/voice.cpp - endif - - ifeq ($(PWM_BACKLIGHT), YES) - ifeq ($(VOICE), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod) - endif - ifeq ($(AUDIO), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with AUDIO mod) - endif - CPPDEFS += -DPWM_BACKLIGHT - endif - - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - endif - - ifeq ($(SP22), YES) - CPPDEFS += -DSP22 - endif -endif - -ifeq ($(PCB), GRUVIN9X) - # 9x radio with a gruvin9x replacement board - GUIDIRECTORY = 9x - FLAVOUR = gruvin9x - ARCH = AVR - LCDSIZE = 128 - ifeq ($(PCBREV), REV0) - CPPDEFS = -DREV0 - else - CPPDEFS = -DREV1 - endif - TRGT = avr- - MCU = atmega2560 - OPT = s - CPPDEFS += -DF_CPU=$(F_CPU)UL -DPCBGRUVIN9X -DCPUM2560 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=0 -DAUDIO -DHAPTIC - SDCARD = NO - BUZZER = NO - THR_TRACE = YES - INCDIRS += targets/gruvin9x targets/9x bitmaps bitmaps/9x $(FATFSDIR) $(FATFSDIR)/option - BOARDSRC = main_avr.cpp targets/gruvin9x/board_gruvin9x.cpp - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/9x/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += audio_avr.cpp haptic.cpp debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - ifeq ($(SDCARD), YES) - CPPDEFS += -DRTCLOCK -DSDCARD - CPPSRC += rtc.cpp sdcard.cpp logs.cpp targets/gruvin9x/rtc_driver.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/gruvin9x/diskio.cpp - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/gruvin9x/somo14d.cpp - endif - - # Enable extra rotary encoders (Gruvin9x board only) - # Values = YES, NO - ROTARY_ENCODERS = 2 - CPPDEFS += -DROTARY_ENCODERS=${ROTARY_ENCODERS} -endif - -ifeq ($(PCB), MEGA2560) - # ARDUINO2560 DIY RADIO - GUIDIRECTORY = 9x - FLAVOUR = mega2560 - ARCH = AVR - LCDSIZE = 128 - TRGT = avr- - MCU = atmega2560 - OPT = s - CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBMEGA2560 -DCPUM2560 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=0 - SDCARD = NO - THR_TRACE = YES - PWRMANAGE = NO - INCDIRS += targets/mega2560 targets/9x bitmaps bitmaps/9x $(FATFSDIR) $(FATFSDIR)/option - BOARDSRC = main_avr.cpp targets/mega2560/board_mega2560.cpp - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/9x/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp - - ifeq ($(PWRMANAGE), YES) - CPPDEFS += -DPWRMANAGE - endif - - ifeq ($(SDCARD), YES) - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/gruvin9x/diskio.cpp - CPPDEFS += -DSDCARD -DRTCLOCK - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp - CPPSRC += rtc.cpp sdcard.cpp logs.cpp targets/gruvin9x/rtc_driver.cpp - endif - - ifeq ($(AUDIO), YES) - CPPDEFS += -DAUDIO - CPPSRC += audio_avr.cpp - BUZZER = NO - else - BUZZER = YES - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/gruvin9x/somo14d.cpp - endif - - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - endif - - # Enable extra rotary encoders - ROTARY_ENCODERS = 2 - CPPDEFS += -DROTARY_ENCODERS=${ROTARY_ENCODERS} -endif - -ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X)) - # 9x/9XR radio with a sky9x replacement board - GUIDIRECTORY = 9x - ARCH = ARM - LCDSIZE = 128 - CPPDEFS = -Dat91sam3s4 -DPPM_PIN_HW_SERIAL - ifeq ($(PCB), 9XRPRO) - CPPDEFS = -Dat91sam3s8 - FLAVOUR = 9xrpro - CPPDEFS += -DREVX - LDSCRIPT = targets/sky9x/sam3s8c_flash.ld - else ifeq ($(PCB), AR9X) - CPPDEFS = -Dat91sam3s8 - FLAVOUR = ar9x - CPPDEFS += -DAR9X - LDSCRIPT = targets/sky9x/sam3s8c_flash.ld - else ifeq ($(PCBREV), REVA) - FLAVOUR = sky9x - CPPDEFS += -DREVA - LDSCRIPT = targets/sky9x/sam3s2c_flash.ld - CPPSRC += targets/sky9x/coproc_driver.cpp - else ifeq ($(PCBREV), REVB) - FLAVOUR = sky9x - CPPDEFS += -DREVB -DCOPROCESSOR - LDSCRIPT = targets/sky9x/sam3s4c_flash.ld - CPPSRC += targets/sky9x/coproc_driver.cpp - else - FLAVOUR = sky9x - CPPDEFS += -DREVC -DCOPROCESSOR - LDSCRIPT = targets/sky9x/sam3s4c_flash.ld - CPPSRC += targets/sky9x/coproc_driver.cpp - endif - TRGT = arm-none-eabi- - MCU = cortex-m3 - OPT = s - SDCARD = YES - BUZZER = NO - THR_TRACE = YES - EXT = FRSKY_SPORT - CPPDEFS += -DPCBSKY9X -DCPUARM -DEEPROM -DEEPROM_VARIANT=0 -DAUDIO -DHAPTIC -DDSM2 -DDSM2_PPM -DPXX - ifeq ($(PCB), SKY9X) - CPPDEFS += -DROTARY_ENCODERS=1 - CPPSRC += targets/sky9x/rotenc_driver.cpp - endif - ifeq ($(LOG_TELEMETRY), YES) - CPPDEFS += -DLOG_TELEMETRY - endif - INCDIRS += targets/sky9x bitmaps bitmaps/9x $(COOSDIR) $(COOSDIR)/kernel $(COOSDIR)/portable - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - BOARDSRC = main_arm.cpp targets/sky9x/board_sky9x.cpp targets/sky9x/trainer_driver.cpp - EXTRABOARDSRC = targets/sky9x/lcd_driver.cpp - SRC += targets/sky9x/core_cm3.c targets/sky9x/board_lowlevel.c targets/sky9x/crt.c targets/sky9x/vectors_sam3s.c - SRC += $(COOSDIR)/kernel/core.c $(COOSDIR)/kernel/hook.c $(COOSDIR)/kernel/task.c $(COOSDIR)/kernel/event.c $(COOSDIR)/kernel/time.c $(COOSDIR)/kernel/timer.c $(COOSDIR)/kernel/flag.c $(COOSDIR)/kernel/mutex.c $(COOSDIR)/kernel/serviceReq.c $(COOSDIR)/portable/GCC/port.c $(COOSDIR)/portable/arch.c - SRC += targets/sky9x/usb/device/core/USBD_UDP.c targets/sky9x/usb/device/core/USBDDriver.c - SRC += targets/sky9x/usb/device/massstorage/MSDDriver.c targets/sky9x/usb/device/massstorage/MSDDStateMachine.c targets/sky9x/usb/device/massstorage/MSDLun.c targets/sky9x/usb/device/massstorage/MSDDriverDescriptors.c targets/sky9x/usb/device/massstorage/SBCMethods.c - SRC += targets/sky9x/usb/common/core/USBEndpointDescriptor.c targets/sky9x/usb/common/core/USBGenericRequest.c targets/sky9x/usb/common/core/USBFeatureRequest.c targets/sky9x/usb/common/core/USBInterfaceRequest.c targets/sky9x/usb/common/core/USBGetDescriptorRequest.c targets/sky9x/usb/common/core/USBSetAddressRequest.c targets/sky9x/usb/common/core/USBSetConfigurationRequest.c targets/sky9x/usb/common/core/USBConfigurationDescriptor.c targets/sky9x/usb/common/core/USBGenericDescriptor.c - SRC += targets/sky9x/MEDSdcard.c - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_raw.cpp storage/eeprom_conversions.cpp - PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp pulses/dsm2_arm.cpp - CPPSRC += tasks_arm.cpp audio_arm.cpp haptic.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp telemetry/telemetry.cpp - CPPSRC += targets/sky9x/telemetry_driver.cpp targets/sky9x/serial2_driver.cpp targets/sky9x/pwr_driver.cpp targets/sky9x/adc_driver.cpp targets/sky9x/eeprom_driver.cpp targets/sky9x/pulses_driver.cpp targets/sky9x/keys_driver.cpp targets/sky9x/audio_driver.cpp targets/sky9x/buzzer_driver.cpp targets/sky9x/haptic_driver.cpp targets/sky9x/sdcard_driver.cpp targets/sky9x/massstorage.cpp - CPPSRC += debug.cpp - EXTRABOARDSRC += loadboot.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - ifeq ($(SDCARD), YES) - CPPDEFS += -DSDCARD -DVOICE - INCDIRS += $(FATFSDIR) $(FATFSDIR)/option - CPPSRC += sdcard.cpp logs.cpp - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/sky9x/diskio.cpp - endif - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - ifeq ($(RTCLOCK), YES) - CPPDEFS += -DRTCLOCK - CPPSRC += rtc.cpp targets/sky9x/rtc_driver.cpp - else ifeq ($(PCB), SKY9X) - CPPSRC += targets/sky9x/rtc_driver.cpp - endif - ifeq ($(BLUETOOTH), YES) - CPPDEFS += -DBLUETOOTH - CPPSRC += targets/sky9x/bluetooth.cpp - endif - ifeq ($(DEBUG), YES) - SRC += syscalls.c - endif - ifeq ($(HARDWARE_VOLUME), NO) - CPPDEFS += -DNO_HARDWARE_VOLUME - endif -endif - -ifeq ($(PCB), TARANIS) - # TARANIS radio - ARCH = ARM - LCDSIZE = 212 - GUIDIRECTORY = taranis - ifeq ($(PCBREV), REV9E) - MCU = cortex-m4 - FLAVOUR = taranis-x9e - CPPDEFS = -DREVPLUS -DREV9E - ifeq ($(LCD_DUAL_BUFFER), YES) - CPPDEFS += -DLCD_DUAL_BUFFER - endif - HAPTIC = YES - EXTRABOARDSRC += targets/taranis/bluetooth_driver.cpp - else ifeq ($(PCBREV), REVPLUS) - MCU = cortex-m3 - FLAVOUR = taranis-plus - CPPDEFS = -DREVPLUS - ifeq ($(LCD_DUAL_BUFFER), YES) - CPPDEFS += -DLCD_DUAL_BUFFER - endif - HAPTIC = YES - else ifeq ($(PCBREV), REV4a) - MCU = cortex-m3 - FLAVOUR = taranis - CPPDEFS = -DREV4a - else - MCU = cortex-m3 - FLAVOUR = taranis - CPPDEFS = -DREV4 - endif - ifeq ($(LOG_TELEMETRY), YES) - CPPDEFS += -DLOG_TELEMETRY - endif - ifeq ($(TRACE_SD_CARD), YES) - DEBUG = YES - DEBUG_TRACE_BUFFER = YES - CPPDEFS += -DTRACE_SD_CARD - endif - ifeq ($(TRACE_FATFS), YES) - DEBUG = YES - DEBUG_TRACE_BUFFER = YES - CPPDEFS += -DTRACE_FATFS - endif - ifeq ($(TRACE_AUDIO), YES) - DEBUG = YES - DEBUG_TRACE_BUFFER = YES - CPPDEFS += -DTRACE_AUDIO - endif - ifeq ($(DEBUG_TRACE_BUFFER), YES) - CPPDEFS += -DDEBUG_TRACE_BUFFER - endif - ifeq ($(TARANIS_INTERNAL_PPM), YES) - CPPDEFS += -DTARANIS_INTERNAL_PPM - endif - ifeq ($(SUPPORT_D16_EU_ONLY), YES) - CPPDEFS += -DMODULE_D16_EU_ONLY_SUPPORT - endif - TRGT = arm-none-eabi- - OPT = s - BITMAPS += $(patsubst %.png,%.lbm,$(wildcard bitmaps/taranis/*.png)) - SDCARD = YES - THR_TRACE = YES - EXT = FRSKY_SPORT - AUTOSWITCH = YES - AUTOSOURCE = YES - DBLKEYS = YES - TIMERS = 2 - CPPDEFS += -DTIMERS=$(TIMERS) - PPM_LIMITS_SYMETRICAL = YES - PPM_CENTER_ADJUSTABLE = YES - DSM2 = PPM - CPPDEFS += -DPCBTARANIS -DCPUARM -DCPUSTM32 -DVIRTUALINPUTS -DLUAINPUTS -DXCURVES -DEEPROM -DEEPROM_RLC -DAUDIO -DPXX -DSBUS -DCROSSFIRE - INCDIRS += targets/taranis bitmaps bitmaps/taranis $(THIRDPARTY) $(COOSDIR) $(COOSDIR)/kernel $(COOSDIR)/portable - CPPDEFS += -DHSE_VALUE=12000000 - ifeq ($(PCBREV), REV9E) - STM32LIBPATH = $(THIRDPARTY)/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries - CPPDEFS += -DSTM32F4 -DSTM32F40_41xxx -DEEPROM_VARIANT=32768 - INCDIRS += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Include $(STM32LIBPATH)/CMSIS/Include $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/inc - LDSCRIPT = targets/taranis/stm32f4_flash.ld - else - STM32LIBPATH= $(THIRDPARTY)/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries - CPPDEFS += -DEEPROM_VARIANT=0 - INCDIRS += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/inc $(STM32LIBPATH)/CMSIS/Device/ST/STM32F2xx/Include $(STM32LIBPATH)/CMSIS/include - LDSCRIPT = targets/taranis/stm32f2_flash.ld - endif - STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - INCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp - BOARDSRC = main_arm.cpp targets/taranis/board_taranis.cpp - EXTRABOARDSRC += targets/taranis/configure_pins.cpp targets/taranis/lcd_driver.cpp targets/taranis/flash_driver.cpp targets/taranis/i2c_driver.cpp targets/taranis/aspi.c targets/taranis/delays.c serial.cpp - SRC += $(COOSDIR)/kernel/core.c $(COOSDIR)/kernel/hook.c $(COOSDIR)/kernel/task.c $(COOSDIR)/kernel/event.c $(COOSDIR)/kernel/time.c $(COOSDIR)/kernel/timer.c $(COOSDIR)/kernel/flag.c $(COOSDIR)/kernel/mutex.c $(COOSDIR)/kernel/serviceReq.c $(COOSDIR)/portable/GCC/port.c $(COOSDIR)/portable/arch.c - SRC += targets/taranis/pwr_driver.c targets/taranis/usb_driver.c - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp storage/eeprom_conversions.cpp - PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp pulses/crossfire.cpp - CPPSRC += tasks_arm.cpp audio_arm.cpp sbus.cpp telemetry/telemetry.cpp - CPPSRC += targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/serial2_driver.cpp targets/taranis/telemetry_driver.cpp - CPPSRC += gui/$(GUIDIRECTORY)/bmp.cpp gui/$(GUIDIRECTORY)/view_channels.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp debug.cpp - EXTRABOARDSRC += loadboot.cpp - ifeq ($(PCBREV), REV9E) - CPPSRC += targets/taranis/top_lcd_driver.cpp - SRC += targets/taranis/system_stm32f4xx.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/misc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dbgmcu.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rtc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_pwr.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c - SRC += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f40_41xxx.s - else - SRC += targets/taranis/system_stm32f2xx.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/misc.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dbgmcu.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dma.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rtc.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_pwr.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_usart.c - SRC += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s - endif - SRC += targets/taranis/usb_bsp.c targets/taranis/usbd_desc.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_core.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd_int.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_core.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_ioreq.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_req.c - EXTRABOARDSRC += targets/taranis/usbd_usr.cpp - SRC += syscalls.c - ifeq ($(USB), JOYSTICK) - CPPDEFS += -DUSB_JOYSTICK - SRC += targets/taranis/usbd_hid_joystick.c - else ifeq ($(USB), SERIAL) - CPPDEFS += -DUSB_SERIAL - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c - EXTRABOARDSRC += targets/taranis/usbd_cdc.cpp - else - CPPDEFS += -DUSB_MASS_STORAGE - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c - EXTRABOARDSRC += targets/taranis/usbd_storage_msd.cpp - endif - ifeq ($(NANO), YES) - # use newlib-nano for linking - NEWLIB_NANO_FLAGS = --specs=nano.specs -u _printf_float - CPPDEFS += -DNANO - endif - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs.cpp gui/$(GUIDIRECTORY)/menu_model_mixes.cpp - ifeq ($(GVARS), YES) - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_gvars.cpp - endif - ifneq ($(LUA), NO) - ifeq ($(LUA), YES) - CPPDEFS += -DLUA_MODEL_SCRIPTS - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_custom_scripts.cpp - endif - CPPDEFS += -DLUA - INCDIRS += $(LUADIR) - CPPSRC += lua/interface.cpp lua/api_general.cpp lua/api_lcd.cpp lua/api_model.cpp - LUASRC = $(LUADIR)/lapi.c $(LUADIR)/lcode.c $(LUADIR)/lctype.c $(LUADIR)/ldebug.c $(LUADIR)/ldo.c $(LUADIR)/ldump.c $(LUADIR)/lfunc.c $(LUADIR)/lgc.c $(LUADIR)/llex.c $(LUADIR)/lmem.c \ - $(LUADIR)/lobject.c $(LUADIR)/lopcodes.c $(LUADIR)/lparser.c $(LUADIR)/lstate.c $(LUADIR)/lstring.c $(LUADIR)/ltable.c $(LUADIR)/lrotable.c $(LUADIR)/ltm.c $(LUADIR)/lundump.c $(LUADIR)/lvm.c $(LUADIR)/lzio.c \ - $(LUADIR)/lbaselib.c $(LUADIR)/linit.c $(LUADIR)/lmathlib.c $(LUADIR)/lbitlib.c $(LUADIR)/loadlib.c $(LUADIR)/lauxlib.c $(LUADIR)/ltablib.c $(LUADIR)/lcorolib.c $(LUADIR)/liolib.c $(LUADIR)/lstrlib.c - SRC += $(LUASRC) - ifeq ($(PCBREV), REV9E) - LUADEP = lua/lua_exports_taranis_x9e.inc - else - LUADEP = lua/lua_exports_taranis.inc - endif - ifeq ($(USE_BIN_ALLOCATOR), YES) - CPPDEFS += -DUSE_BIN_ALLOCATOR - CPPSRC += bin_allocator.cpp - endif - endif - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/taranis/diskio.cpp - CPPSRC += sdcard.cpp logs.cpp rtc.cpp targets/taranis/rtc_driver.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - CPPDEFS += -DSDCARD -DVOICE -DRTCLOCK - INCDIRS += $(FATFSDIR) $(FATFSDIR)/option - ifeq ($(DSM2), PPM) - CPPSRC += pulses/dsm2_arm.cpp - endif - ifeq ($(HUBSAN), YES) - CPPDEFS += -DHUBSAN - CPPSRC += pulses/hubsan.cpp - CPPSRC += targets/taranis/a7105_driver.cpp - endif - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - CPPSRC += targets/taranis/haptic_driver.cpp - endif - ifeq ($(MIXERS_MONITOR), YES) - CPPDEFS += -DMIXERS_MONITOR - endif - ifeq ($(WATCHDOG_TEST), YES) - CPPDEFS += -DWATCHDOG_TEST - endif - ifeq ($(JITTER_MEASURE), YES) - CPPDEFS += -DJITTER_MEASURE - endif - ifeq ($(JITTER_FILTER), YES) - CPPDEFS += -DJITTER_FILTER - endif -endif - -ifeq ($(PCB), FLAMENCO) - # FLAMENCO radio - ARCH = ARM - LCDSIZE = 320 - GUIDIRECTORY = flamenco - FLAVOUR = FLAMENCO - LDSCRIPT = targets/flamenco/stm32f4_flash.ld - STM32LIBPATH = $(THIRDPARTY)/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries - STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - TRGT = arm-none-eabi- - MCU = cortex-m4 - OPT = 2 - CPPDEFS += -DHSE_VALUE=12000000 -DCOLORLCD -DSTM32F40_41xxx -DPPM_PIN_HW_SERIAL - BITMAPS += $(patsubst %.png,%.lbm,$(wildcard bitmaps/flamenco/*.png)) - FONTS = fonts/flamenco/font_stdsize.lbm fonts/flamenco/font_tinsize.lbm fonts/flamenco/font_smlsize.lbm fonts/flamenco/font_midsize.lbm fonts/flamenco/font_dblsize.lbm fonts/flamenco/font_xxlsize.lbm - SDCARD = YES - THR_TRACE = YES - EXT = FRSKY_SPORT - AUTOSWITCH = YES - AUTOSOURCE = YES - DBLKEYS = YES - PPM_LIMITS_SYMETRICAL = YES - PPM_CENTER_ADJUSTABLE = YES - DSM2 = PPM - TIMERS = 2 - CPPDEFS += -DTIMERS=$(TIMERS) - CPPDEFS += -DPCBFLAMENCO -DCPUARM -DCPUSTM32 -DEEPROM -DVIRTUALINPUTS -DLUAINPUTS -DXCURVES -DEEPROM_VARIANT=0 -DAUDIO -DPXX - INCDIRS += targets/flamenco bitmaps/flamenco $(THIRDPARTY) $(COOSDIR) $(COOSDIR)/kernel $(COOSDIR)/portable - INCDIRS += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/inc $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Include $(STM32LIBPATH)/CMSIS/include - STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - INCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc - BOARDSRC = main_arm.cpp targets/flamenco/board_flamenco.cpp - EXTRABOARDSRC += targets/flamenco/lcd_driver.cpp targets/flamenco/delays.c targets/flamenco/i2c_driver.cpp targets/taranis/configure_pins.cpp serial.cpp # targets/taranis/flash_driver.cpp - SRC += $(COOSDIR)/kernel/core.c $(COOSDIR)/kernel/hook.c $(COOSDIR)/kernel/task.c $(COOSDIR)/kernel/event.c $(COOSDIR)/kernel/time.c $(COOSDIR)/kernel/timer.c $(COOSDIR)/kernel/flag.c $(COOSDIR)/kernel/mutex.c $(COOSDIR)/kernel/serviceReq.c $(COOSDIR)/portable/GCC/port.c $(COOSDIR)/portable/arch.c - SRC += targets/flamenco/pwr_driver.c targets/flamenco/usb_driver.c - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_raw.cpp - PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp - CPPSRC += tasks_arm.cpp audio_arm.cpp sbus.cpp telemetry/telemetry.cpp - CPPSRC += targets/flamenco/tw8823_driver.cpp targets/flamenco/pulses_driver.cpp targets/flamenco/keys_driver.cpp targets/flamenco/adc_driver.cpp targets/flamenco/eeprom_driver.cpp targets/flamenco/trainer_driver.cpp targets/flamenco/audio_driver.cpp targets/flamenco/serial2_driver.cpp targets/flamenco/telemetry_driver.cpp - CPPSRC += gui/$(GUIDIRECTORY)/view_channels.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp debug.cpp - SRC += targets/flamenco/system_stm32f4xx.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/misc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dbgmcu.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rtc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_pwr.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_sdio.c - SRC += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f40_41xxx.s - SRC += targets/flamenco/sdio_sd.c targets/flamenco/usb_bsp.c targets/flamenco/usbd_desc.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_core.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd_int.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_core.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_ioreq.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_req.c - EXTRABOARDSRC += targets/flamenco/usbd_usr.cpp - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - SRC += syscalls.c - ifeq ($(USB), JOYSTICK) - CPPDEFS += -DUSB_JOYSTICK - SRC += targets/flamenco/usbd_hid_joystick.c - else - CPPDEFS += -DUSB_MASS_STORAGE - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c - EXTRABOARDSRC += targets/flamenco/usbd_storage_msd.cpp - endif - ifeq ($(GVARS), YES) - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_gvars.cpp - endif - ifneq ($(LUA), NO) - ifeq ($(LUA), YES) - CPPDEFS += -DLUA_MODEL_SCRIPTS - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_custom_scripts.cpp - endif - CPPDEFS += -DLUA - INCDIRS += $(LUADIR) - CPPSRC += lua/interface.cpp lua/api_general.cpp lua/api_lcd.cpp lua/api_model.cpp - LUASRC = $(LUADIR)/lapi.c $(LUADIR)/lcode.c $(LUADIR)/lctype.c $(LUADIR)/ldebug.c $(LUADIR)/ldo.c $(LUADIR)/ldump.c $(LUADIR)/lfunc.c $(LUADIR)/lgc.c $(LUADIR)/llex.c $(LUADIR)/lmem.c \ - $(LUADIR)/lobject.c $(LUADIR)/lopcodes.c $(LUADIR)/lparser.c $(LUADIR)/lstate.c $(LUADIR)/lstring.c $(LUADIR)/ltable.c $(LUADIR)/lrotable.c $(LUADIR)/ltm.c $(LUADIR)/lundump.c $(LUADIR)/lvm.c $(LUADIR)/lzio.c \ - $(LUADIR)/lbaselib.c $(LUADIR)/linit.c $(LUADIR)/lmathlib.c $(LUADIR)/lbitlib.c $(LUADIR)/loadlib.c $(LUADIR)/lauxlib.c $(LUADIR)/ltablib.c $(LUADIR)/lcorolib.c $(LUADIR)/liolib.c $(LUADIR)/lstrlib.c - SRC += $(LUASRC) - LUADEP = lua/lua_exports_flamenco.inc - endif - - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/flamenco/diskio.cpp - CPPDEFS += -DSDCARD -DVOICE -DRTCLOCK - CPPSRC += sdcard.cpp rtc.cpp logs.cpp targets/taranis/rtc_driver.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp - INCDIRS += $(FATFSDIR) $(FATFSDIR)/option - - ifeq ($(DSM2), PPM) - CPPSRC += pulses/dsm2_arm.cpp - endif - - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - CPPSRC += targets/flamenco/haptic_driver.cpp - EXTRABOARDSRC += - - ifeq ($(TW8823_TRACES), YES) - CPPDEFS += -DTW8823_TRACES - endif - - ifeq ($(TW8823_BITMAPS), YES) - CPPDEFS += -DTW8823_BITMAPS - endif - - ifeq ($(TW8823_SERIAL), YES) - CPPDEFS += -DTW8823_SERIAL - endif -endif - -CC = $(TRGT)gcc -CPP = $(TRGT)cpp -AS = $(TRGT)as -OBJCOPY = $(TRGT)objcopy -OBJDUMP = $(TRGT)objdump -SIZE = $(TRGT)size -NM = $(TRGT)nm - -REMOVE = rm -f -REMOVEDIR = rm -rf - -SLEEP = sleep - -# Processor frequency. -F_CPU = 16000000 - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - -# Target file name (without extension). -TARGET = opentx - -# List C++ source files here. (C dependencies are automatically generated.) -ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X TARANIS FLAMENCO)) - TTS_SRC = translations/tts_cz.cpp translations/tts_de.cpp translations/tts_en.cpp translations/tts_es.cpp translations/tts_fr.cpp translations/tts_it.cpp translations/tts_nl.cpp translations/tts_pt.cpp translations/tts_sk.cpp translations/tts_se.cpp translations/tts_pl.cpp translations/tts_hu.cpp -else - STD_TTS_SRC = translations/tts_$(shell sh -c "echo $(TTS) | tr '[:upper:]' '[:lower:]'").cpp - TTS_SRC = $(shell sh -c "if test -f $(STD_TTS_SRC); then echo $(STD_TTS_SRC); else echo translations/tts_en.cpp; fi") -endif - -ifeq ($(GUI), YES) - GUISRC = gui/$(GUIDIRECTORY)/helpers.cpp gui/$(GUIDIRECTORY)/navigation.cpp gui/$(GUIDIRECTORY)/popups.cpp gui/$(GUIDIRECTORY)/widgets.cpp gui/$(GUIDIRECTORY)/menus.cpp $(GUIMODELSRC) $(GUIGENERALSRC) gui/$(GUIDIRECTORY)/view_main.cpp gui/$(GUIDIRECTORY)/view_statistics.cpp - ifeq ($(ARCH), ARM) - GUISRC += gui/gui_helpers.cpp - endif - CPPDEFS += -DGUI -endif - -CPPSRC += opentx.cpp functions.cpp strhelpers.cpp $(PULSESSRC) switches.cpp curves.cpp mixer.cpp stamp.cpp $(GUISRC) $(EEPROMSRC) timers.cpp trainer_input.cpp - -ifeq ($(GUI), YES) - GUISRC += gui/$(GUIDIRECTORY)/lcd.cpp gui/$(GUIDIRECTORY)/splash.cpp gui/$(GUIDIRECTORY)/fonts.cpp -endif - -GUISRC += keys.cpp maths.cpp translations.cpp $(TTS_SRC) - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DBGFMT = dwarf-2 - -CPPDEFS += -DTRANSLATIONS_$(TRANSLATIONS) - -# TTS language -CPPDEFS += -DTTS_$(TTS) - -ifeq ($(UNITS), IMPERIAL) - CPPDEFS += -DIMPERIAL_UNITS -endif - -ifneq ($(DEFAULT_MODE), NO) - CPPDEFS += -DDEFAULT_MODE=$(DEFAULT_MODE) -endif - -# If POTS are used for fields modification -ifeq ($(NAVIGATION), POT1) - CPPDEFS += -DNAVIGATION_POT1 -endif -ifeq ($(NAVIGATION), POT2) - CPPDEFS += -DNAVIGATION_POT2 -endif -ifeq ($(NAVIGATION), POT3) - CPPDEFS += -DNAVIGATION_POT3 -endif -ifeq ($(NAVIGATION), POTS) - CPPDEFS += -DNAVIGATION_POT1 -DNAVIGATION_POT2 -DNAVIGATION_POT3 -endif -ifeq ($(NAVIGATION), STICKS) - CPPDEFS += -DNAVIGATION_STICKS -endif -ifeq ($(NAVIGATION), ROTENC) - CPPDEFS += -DROTARY_ENCODER_NAVIGATION -endif - -ifeq ($(TURNIGY_TRANSMITTER_FIX), YES) - ifeq ($(PCB), $(filter $(PCB), TARANIS FLAMENCO)) - $(warning TURNIGY_TRANSMITTER_FIX is not available on this radio) - else - CPPDEFS += -DMODULE_ALWAYS_SEND_PULSES - endif -endif - -ifeq ($(LCD), ST7565R) - CPPDEFS += -DLCD_ST7565R -else ifeq ($(LCD), ERC12864FSF) - CPPDEFS += -DLCD_ERC12864FSF -else ifeq ($(LCD), ST7920) - CPPDEFS += -DLCD_ST7920 -endif - -ifeq ($(AUTOSWITCH), YES) - CPPDEFS += -DAUTOSWITCH -endif - -ifeq ($(AUTOSOURCE), YES) - CPPDEFS += -DAUTOSOURCE -endif - -ifeq ($(FRSKY_STICKS), YES) - CPPDEFS += -DFRSKY_STICKS -endif - -ifeq ($(DBLKEYS), YES) - ifeq ($(PCB), $(filter $(PCB), 9XR 9XR128 9XR2561)) - $(warning Sorry, DBLKEYS doesnt work on 9XR) - else - CPPDEFS += -DDBLKEYS - endif -endif - -ifeq ($(SPLASH), YES) - CPPDEFS += -DSPLASH -endif - -ifeq ($(SPLASH), FIXED) - CPPDEFS += -DSPLASH -DFSPLASH -endif - -ifeq ($(GRAPHICS), YES) - CPPDEFS += -DGRAPHICS -endif - -ifeq ($(BOLD), YES) - CPPDEFS += -DBOLD_FONT -endif - -ifneq ($(PCB), $(filter $(PCB), TARANIS FLAMENCO)) - ifeq ($(BATTGRAPH), YES) - CPPDEFS += -DBATTGRAPH - endif -endif - -ifneq ($(FONT), STD) - FONTDIR = $(shell sh -c "echo $(FONT) | tr '[:upper:]' '[:lower:]'") - FONTS += $(patsubst %.png,%.lbm,$(wildcard fonts/$(FONTDIR)/*.png)) - INCDIRS += fonts/$(FONTDIR) -endif - -INCDIRS += gui -INCDIRS += fonts/std - -ifeq ($(THR_TRACE), YES) - CPPDEFS += -DTHRTRACE -endif - -CPPDEFS += -DTIMERS=$(TIMERS) - -ifeq ($(FLIGHT_MODES), YES) - CPPDEFS += -DFLIGHT_MODES - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_flightmodes.cpp -endif - -ifeq ($(CURVES), YES) - CPPDEFS += -DCURVES - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_curves.cpp -endif - -ifeq ($(GVARS), YES) - CPPDEFS += -DGVARS - EEPROM_VARIANT += ${GVARS_VARIANT} -endif - -ifeq ($(MENUS_LOCK), READONLY) - CPPDEFS += -DMENUS_LOCK=1 -endif - -ifeq ($(MENUS_LOCK), NOMENUS) - CPPDEFS += -DMENUS_LOCK=2 -endif - -ifeq ($(CORRECT_NEGATIVE_VALUES), YES) - CPPDEFS += -DCORRECT_NEGATIVE_SHIFTS -endif - -ifeq ($(ARITHMETIC_OVERFLOW_CHECK), YES) - CPPDEFS += -DPREVENT_ARITHMETIC_OVERFLOW -endif - -ifeq ($(ACCURAT_THROTTLE_STATS), YES) - CPPDEFS += -DACCURAT_THROTTLE_TIMER -endif - -# EXTENSIONS (for Telemetry protocols) -ifneq ($(EXT), $(filter $(EXT), STD FRSKY FRSKY_SPORT ARDUPILOT NMEA JETI MAVLINK TELEMETREZ)) - $(error Sorry, the EXT $(EXT) is not supported yet in openTx) -endif - -ifeq ($(EXT), STD) - CPPDEFS += -DEXTSTD -endif - -ifeq ($(EXT), ARDUPILOT) - CPPDEFS += -DARDUPILOT - CPPSRC += telemetry/ardupilot.cpp -endif - -ifeq ($(EXT), NMEA) - CPPDEFS += -DNMEA - CPPSRC += telemetry/nmea.cpp -endif - -ifeq ($(EXT), JETI) - CPPDEFS += -DJETI - CPPSRC += telemetry/jeti.cpp -endif - -ifeq ($(EXT), MAVLINK) - CPPDEFS += -DMAVLINK - INCDIRS += thirdparty targets/common_avr/ - CPPSRC += telemetry/mavlink.cpp gui/$(GUIDIRECTORY)/view_mavlink.cpp targets/common_avr/serial_driver.cpp - EEPROM_VARIANT += ${MAVLINK_VARIANT} -endif - -ifeq ($(EXT), TELEMETREZ) - CPPDEFS += -DTELEMETREZ -endif - -ifeq ($(EXT), $(filter $(EXT), FRSKY FRSKY_SPORT TELEMETREZ)) - CPPDEFS += -DFRSKY - - ifeq ($(ARCH), ARM) - CPPSRC += telemetry/frsky.cpp telemetry/frsky_d_arm.cpp - else - CPPSRC += telemetry/frsky.cpp telemetry/frsky_d.cpp - endif - - ifeq ($(EXT), FRSKY_SPORT) - CPPSRC += telemetry/frsky_sport.cpp - CPPSRC += crc16.cpp - CPPDEFS += -DFRSKY_SPORT - endif - - CPPSRC += gui/$(GUIDIRECTORY)/view_telemetry.cpp - - ifeq ($(FRSKY_HUB), YES) - CPPDEFS += -DFRSKY_HUB - endif - - ifeq ($(WS_HOW_HIGH), YES) - CPPDEFS += -DWS_HOW_HIGH - endif - - ifeq ($(GAUGES), YES) - CPPDEFS += -DGAUGES - endif - - ifeq ($(GPS), YES) - CPPDEFS += -DGPS - endif - - ifeq ($(VARIO), YES) - CPPSRC += vario.cpp - CPPDEFS += -DVARIO - endif - EEPROM_VARIANT += ${FRSKY_VARIANT} -endif - -ifeq ($(SIMU), YES) - CPPDEFS += -DDEBUG - CPPSRC += dump.cpp -else ifeq ($(CLI), YES) - CPPDEFS += -DCLI - CPPSRC += cli.cpp dump.cpp -else ifeq ($(DEBUG), YES) - CPPSRC += dump.cpp -endif - -ifeq ($(DEBUG), YES) - CPPDEFS += -DDEBUG -endif - -ifeq ($(EEPROM_PROGRESS_BAR), YES) - CPPDEFS += -DEEPROM_PROGRESS_BAR -endif - -ifeq ($(SHUTDOWN_CONFIRMATION), YES) - CPPDEFS += -DSHUTDOWN_CONFIRMATION -endif - -RUN_FROM_FLASH = 1 - -### Global Build-Option Directives ### - -ifeq ($(PPM_CENTER_ADJUSTABLE), YES) - CPPDEFS += -DPPM_CENTER_ADJUSTABLE -endif - -ifeq ($(PPM_LIMITS_SYMETRICAL), YES) - CPPDEFS += -DPPM_LIMITS_SYMETRICAL -endif - -ifeq ($(OVERRIDE_CHANNEL_FUNCTION), YES) - CPPDEFS += -DOVERRIDE_CHANNEL_FUNCTION -endif - -ifeq ($(DANGEROUS_MODULE_FUNCTIONS), YES) - CPPDEFS += -DDANGEROUS_MODULE_FUNCTIONS -endif - -ifeq ($(PPM_UNIT), US) - CPPDEFS += -DPPM_UNIT_US -endif - -ifeq ($(PPM_UNIT), PERCENT_PREC1) - CPPDEFS += -DPPM_UNIT_PERCENT_PREC1 -endif - -ifeq ($(PPM_UNIT), PERCENT_PREC0) - CPPDEFS += -DPPM_UNIT_PERCENT_PREC0 -endif - -ifeq ($(FAI), YES) - CPPDEFS += -DFAI -endif -ifeq ($(FAI), CHOICE) - CPPDEFS += -DFAI_CHOICE -endif - -ifeq ($(HELI), YES) - CPPDEFS += -DHELI - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_heli.cpp -endif - -ifeq ($(TEMPLATES), YES) - ifneq ($(PCB), $(filter $(PCB), TARANIS FLAMENCO)) - CPPDEFS += -DTEMPLATES - CPPSRC += templates.cpp - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_templates.cpp - endif -endif - -ifeq ($(PXX), YES) - CPPDEFS += -DPXX -endif - -ifeq ($(DSM2), SERIAL) - CPPDEFS += -DDSM2 -DDSM2_SERIAL -endif - -ifeq ($(DSM2), PPM) - CPPDEFS += -DDSM2 -DDSM2_PPM -endif - -ifeq ($(TX_CADDY), YES) - CPPDEFS += -DTX_CADDY -endif - -ifeq ($(IRPROTOS), YES) - CPPDEFS += -DIRPROTOS -endif - -ifeq ($(LUA_COMPILER), YES) - CPPDEFS += -DLUA_COMPILER -endif - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DBGFMT) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -Wall -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wno-strict-aliasing -CPPFLAGS += -Wformat -Wreturn-type -Wunused -Wuninitialized -Wunknown-pragmas -Wno-switch -Wtype-limits -INCFLAGS = $(patsubst %,-I%,$(INCDIRS)) - -ifeq ($(WARNINGS_AS_ERRORS), YES) - CPPFLAGS += -Werror -endif - -MATH_LIB = -lm - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += $(MATH_LIB) - -# Define Messages -# English -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_COMPILING = Compiling C++: -MSG_CLEANING = Cleaning project: - -# Combine all necessary flags and optional flags. -# Add target processor to flags. - -CPPFLAGS += -DFLAVOUR=\"$(FLAVOUR)\" -ARMCPPFLAGS = -c -mcpu=$(MCU) -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=opentx.lst -DRUN_FROM_FLASH=1 -O$(OPT) $(CPPFLAGS) -fdata-sections -ffunction-sections $(INCFLAGS) $(GENDEPFLAGS) -AVRCPPFLAGS = -mmcu=$(MCU) -I. -x c++ -O$(OPT) $(CPPFLAGS) $(INCFLAGS) $(GENDEPFLAGS) -fwhole-program - -ifeq ($(ARCH), AVR) - GCCVERSIONGTE462 := $(shell expr 4.6.2 \<= `$(CC) -dumpversion`) - ifeq ($(GCCVERSIONGTE462),1) - CPPFLAGS += -flto - endif - - AVRCPPFLAGS += -fno-inline-small-functions - - GCCVERSIONGTE470 := $(shell expr 4.7.0 \<= `$(CC) -dumpversion`) - ifeq ($(GCCVERSIONGTE470),1) - AVRCPPFLAGS += -mstrict-X - endif -endif - -MAJ_VER = ${shell sh -c "grep \"MAJ_VERS\" opentx.h | cut -d\ -f3 | egrep -o \"[[:digit:]]\""} -MIN_VER = ${shell sh -c "grep \"MIN_VERS\" opentx.h | cut -d\ -f3"} - -.SECONDARY: - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -ifeq ($(ARCH), AVR) - build: stamp.h tra lbm allsrc.cpp elf remallsrc hex -else ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X TARANIS)) - build: stamp.h tra lbm bootloader.lbm $(LUADEP) allsrc.cpp elf remallsrc bin -else - build: stamp.h tra lbm $(LUADEP) allsrc.cpp elf remallsrc bin -endif - -# build bootloader -ifeq ($(PCB), $(filter $(PCB), TARANIS)) -bootloader.lbm: targets/taranis/bootloader/bootloader_ramBoot.bin - $(BIN2LBM) $^ $@ -.PHONY targets/taranis/bootloader/bootloader_ramBoot.bin: - @echo "Building bootloader..." - $(MAKE) -C targets/taranis/bootloader PCB=$(PCB) PCBREV=$(PCBREV) NANO=$(NANO) WARNINGS_AS_ERRORS=$(WARNINGS_AS_ERRORS) -else ifeq ($(PCB), $(filter $(PCB), 9XRPRO AR9X)) -bootloader.lbm: - @echo "Fetching Mike's bootloader..." - wget https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/bootflash8.lbm - mv bootflash8.lbm $@ -else ifeq ($(PCB), SKY9X) -bootloader.lbm: - @echo "Fetching Mike's bootloader..." - wget https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/bootflash4.lbm - mv bootflash4.lbm $@ -endif - -tra: translations/en.h translations/cz.h translations/de.h translations/es.h translations/fi.h translations/fr.h translations/it.h translations/nl.h translations/pl.h translations/pt.h translations/se.h -lbm: fonts bitmaps - -elf: $(TARGET).elf -bin: $(TARGET).bin -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym - -# Build stamp-file -.PHONY : stamp.h -.PHONY : opentx-stamp - -stamp.h: - @echo "// Automatically generated file (Makefile) - do not edit" > stamp.h - @echo "#define DATE \"`date +%Y-%m-%d | tr -d '\r\n'`\"" > stamp.h - @echo "#define TIME \"`date +%H:%M:%S | tr -d '\r\n'`\"" >> stamp.h - @echo "#define VERSION \"$(VERSION)\"" >> stamp.h - @echo "" >> stamp.h - @echo "#define VERSION_MAJOR $(VERSION_MAJOR)" >> stamp.h - @echo "#define VERSION_MINOR $(VERSION_MINOR)" >> stamp.h - @echo "#define VERSION_REVISION $(VERSION_REVISION)" >> stamp.h - @echo "#define GIT_STR \"$(shell git rev-parse HEAD)\"" >> stamp.h - -opentx-stamp: - @echo "#define DATE_STR \"`date +%Y-%m-%d`\"" > stamp-opentx.txt - @echo "#define TIME_STR \"`date +%H:%M:%S`\"" >> stamp-opentx.txt - @echo "#define VERS_STR \"$(VERSION)\"" >> stamp-opentx.txt - @echo "#define GIT_STR \"$(shell git rev-parse HEAD)\"" >> stamp-opentx.txt - @cat stamp-opentx.txt - - -translations/en.h: translations/en.h.txt - @echo - @echo "Create English language specific header files" - $(TRANSLATE) translations/en.h.txt translations/en.h en - -translations/cz.h: translations/cz.h.txt - @echo - @echo "Create Czech language specific header files" - $(TRANSLATE) translations/cz.h.txt translations/cz.h cz - -translations/de.h: translations/de.h.txt - @echo - @echo "Create German language specific header files" - $(TRANSLATE) translations/de.h.txt translations/de.h de - -translations/es.h: translations/es.h.txt - @echo - @echo "Create Spanish language specific header files" - $(TRANSLATE) translations/es.h.txt translations/es.h es - -translations/fi.h: translations/fi.h.txt - @echo - @echo "Create Finnish language specific header files" - $(TRANSLATE) translations/fi.h.txt translations/fi.h fi - -translations/fr.h: translations/fr.h.txt - @echo - @echo "Create French language specific header files" - $(TRANSLATE) translations/fr.h.txt translations/fr.h fr - -translations/it.h: translations/it.h.txt - @echo - @echo "Create Italian language specific header files" - $(TRANSLATE) translations/it.h.txt translations/it.h it - -translations/nl.h: translations/nl.h.txt - @echo - @echo "Create Nederlands language specific header files" - $(TRANSLATE) translations/nl.h.txt translations/nl.h nl - -translations/pl.h: translations/pl.h.txt - @echo - @echo "Create Polish language specific header files" - $(TRANSLATE) translations/pl.h.txt translations/pl.h pl - -translations/pt.h: translations/pt.h.txt - @echo - @echo "Create Portugese language specific header files" - $(TRANSLATE) translations/pt.h.txt translations/pt.h pt - -translations/se.h: translations/se.h.txt - @echo - @echo "Create Swedish language specific header files" - $(TRANSLATE) translations/se.h.txt translations/se.h se - -ifeq ($(PCB), $(filter $(PCB), FLAMENCO)) - FONTDIR = flamenco - FONTNAME = Roboto - TINSIZE = 5 - SMLSIZE = 7 - STDSIZE = 11 - MIDSIZE = 11 - DBLSIZE = 14 - DBLBOLD = False - XXLSIZE = 38 - MASKFORMAT = 4bits -endif - -.PHONY: fonts -fonts: $(FONTS) - -fonts/$(FONTDIR)/font_%size.lbm: fonts/$(FONTDIR)/font_%size.png - $(IMG2LBM) $^ $@ $(LCDSIZE) $(MASKFORMAT) - -fonts/$(FONTDIR)/font_tinsize.png: - $(FONT2PNG) $(FONTNAME) $(TINSIZE) False fonts/$(FONTDIR)/font_tinsize - -fonts/$(FONTDIR)/font_smlsize.png: - $(FONT2PNG) $(FONTNAME) $(SMLSIZE) False fonts/$(FONTDIR)/font_smlsize - -fonts/$(FONTDIR)/font_stdsize.png: - $(FONT2PNG) $(FONTNAME) $(STDSIZE) False fonts/$(FONTDIR)/font_stdsize - -fonts/$(FONTDIR)/font_midsize.png: - $(FONT2PNG) $(FONTNAME) $(MIDSIZE) False fonts/$(FONTDIR)/font_midsize - -fonts/$(FONTDIR)/font_dblsize.png: - $(FONT2PNG) $(FONTNAME) $(DBLSIZE) $(DBLBOLD) fonts/$(FONTDIR)/font_dblsize - -fonts/$(FONTDIR)/font_xxlsize.png: - $(FONT2PNG) $(FONTNAME) $(XXLSIZE) False fonts/$(FONTDIR)/font_xxlsize - -fonts/%.lbm: fonts/%.png - $(IMG2LBM) $^ $@ $(LCDSIZE) - -.PHONY: bitmaps -bitmaps: $(BITMAPS) - -bitmaps/sticks.lbm: bitmaps/sticks.xbm - $(IMG2LBM) $^ $@ $(LCDSIZE) 1bit 4 - -bitmaps/9x/%.lbm: bitmaps/9x/%.png - $(IMG2LBM) $^ $@ $(LCDSIZE) 1bit - -bitmaps/taranis/%.lbm: bitmaps/taranis/%.png - $(IMG2LBM) $^ $@ $(LCDSIZE) 4bits - -bitmaps/flamenco/%.lbm: bitmaps/flamenco/%.png - $(IMG2LBM) $^ $@ $(LCDSIZE) 4/4/4/4 - -ifeq ($(OS),Windows_NT) - PARSER = avr-cpp -else - PARSER = gcc -E -x c++ -endif - -lua/lua_exports_taranis.inc: myeeprom.h ../util/luaexport.py - @echo "Generating a list of Lua exported constants in lua/lua_exports_taranis.txt" - @$(PARSER) -DEXPORT -DPCBTARANIS -DLUA -DVIRTUALINPUTS myeeprom.h | grep LEXP > lua/lua_exports_taranis.txt - @echo "Parsing and generating C Lua exports in lua/lua_exports_taranis.inc" - @python ../util/luaexport.py $(VERSION) lua/lua_exports_taranis.txt lua/lua_exports_taranis.inc lua/lua_fields_taranis.txt - @rm lua/lua_exports_taranis.txt - -lua/lua_exports_taranis_x9e.inc: myeeprom.h ../util/luaexport.py - @echo "Generating a list of Lua exported constants in lua/lua_exports_taranis_x9e.txt" - @$(PARSER) -DEXPORT -DPCBTARANIS -DREVPLUS -DREV9E -DLUA -DVIRTUALINPUTS myeeprom.h | grep LEXP > lua/lua_exports_taranis_x9e.txt - @echo "Parsing and generating C Lua exports in lua/lua_exports_taranis_x9e.inc" - @python ../util/luaexport.py $(VERSION) lua/lua_exports_taranis_x9e.txt lua/lua_exports_taranis_x9e.inc lua/lua_fields_taranis_x9e.txt - @rm lua/lua_exports_taranis_x9e.txt - -lua/lua_exports_flamenco.inc: myeeprom.h ../util/luaexport.py - @echo "Generating a list of Lua exported constants in lua/lua_exports_flamenco.txt" - @$(PARSER) -DEXPORT -DPCBFLAMENCO -DLUA -DVIRTUALINPUTS myeeprom.h | grep LEXP > lua/lua_exports_flamenco.txt - @echo "Parsing and generating C Lua exports in lua/lua_exports_flamenco.inc" - @python ../util/luaexport.py $(VERSION) lua/lua_exports_flamenco.txt lua/lua_exports_flamenco.inc lua/lua_fields_flamenco.txt - @rm lua/lua_exports_flamenco.txt - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. - -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - -# Display size of file. -ifeq ($(ARCH), AVR) - MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) - FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -else - ELFSIZE = $(SIZE) $(TARGET).elf -endif - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); fi - -# Display compiler version information. -gccversion: - @$(CC) --version - -FOXINC=-I/usr/local/include/fox-1.6 -I/usr/include/fox-1.6 \ - -I$(FOXPATH)/include \ - -I/opt/local/include/fox-1.6 -FOXLIB=-L/usr/local/lib \ - -L$(FOXPATH)/src/.libs \ - -L/opt/local/lib \ - -lFOX-1.6 \ - -Wl,-rpath,$(FOXPATH)/src/.libs - -SIMUDEFS = -DSIMU -DLUA_USE_APICHECK -ifeq ($(SIMU_AUDIO), YES) - AUDIOLIB = -L/usr/lib/x86_64-linux-gnu/ -lSDLmain -lSDL - AUDIOINC = -I/usr/include/SDL - SIMUDEFS += -DSIMU_AUDIO -endif - -ifeq ($(SIMU_DISKIO), YES) - CPPSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/option/ccsbcs.c - SIMUDEFS += -DSIMU_DISKIO -endif - -simu: $(LUADEP) stamp.h allsimusrc.cpp Makefile simu.cpp targets/simu/simpgmspace.cpp *.h tra lbm eeprom.bin - gcc $(CPPFLAGS) $(SIMUCPPFLAGS) $(INCFLAGS) simu.cpp allsimusrc.cpp $(LUASRC) targets/simu/simpgmspace.cpp -MD $(SIMUDEFS) -O0 -o simu $(FOXINC) $(FOXLIB) $(AUDIOINC) $(AUDIOLIB) -pthread -fexceptions -lstdc++ -lm - -eeprom.bin: - dd if=/dev/zero of=$@ bs=1 count=2048 - - -# Create final output files (.hex, .eep) from ELF output file. -ifeq ($(ARCH), AVR) -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ -else -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O ihex opentx.elf opentx.hex -endif - -%.bin: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O binary $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S $< > $@ - -# Concatenate all sources files in one big file to optimize size -allsrc.cpp: Makefile $(BOARDSRC) $(CPPSRC) $(EXTRABOARDSRC) - @rm -f allsrc.cpp - for f in $(BOARDSRC) $(CPPSRC) $(EXTRABOARDSRC) ; do echo "# 1 \"$$f\"" >> allsrc.cpp; cat "$$f" >> allsrc.cpp; done - -allsimusrc.cpp: Makefile $(BOARDSRC) $(CPPSRC) - @rm -f allsimusrc.cpp - for f in $(BOARDSRC) $(CPPSRC) ; do echo "# 1 \"$$f\"" >> allsimusrc.cpp; cat "$$f" >> allsimusrc.cpp; done - -remallsrc: - $(REMOVE) allsrc.cpp - $(REMOVE) allsimusrc.cpp - -# Link: create ELF output file from object files. -ifeq ($(ARCH), AVR) -opentx.elf: allsrc.cpp - @echo - @echo $(MSG_COMPILING) $@ - $(CC) $(AVRCPPFLAGS) $< --output $@ $(LDFLAGS) -else -%.o: %.c - $(CC) $(ARMCPPFLAGS) -Wimplicit $< -o $@ -%.o: %.s - $(AS) $< -o $@ -TMP = $(SRC:.c=.o) -OBJS = $(TMP:.s=.o) -opentx.elf: allsrc.cpp $(OBJS) - @echo - @echo $(MSG_COMPILING) $@ - $(CC) $(ARMCPPFLAGS) $< -o allsrc.o - $(CC) $(OBJS) allsrc.o -mcpu=$(MCU) -mthumb -nostartfiles -lm -T$(LDSCRIPT) -Wl,-Map=$(TARGET).map,--cref,--no-warn-mismatch,--gc-sections $(NEWLIB_NANO_FLAGS) -o $@ -endif - -# Target: clean project. -clean: begin clean_list end - -CLEAN_SRC=$(filter %.c,$(SRC)) -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) simu - $(REMOVE) gtests - $(REMOVE) gtest.a - $(REMOVE) gtest_main.a - $(REMOVE) $(TARGET).bin - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(TARGET).lst - $(REMOVE) $(CLEAN_SRC:.c=.s) - $(REMOVE) `find . -name "*.o"` - $(REMOVE) *.d - $(REMOVE) *.lst - $(REMOVE) allsrc.cpp - $(REMOVE) allsimusrc.cpp - $(REMOVE) stamp.h - $(REMOVE) *.lbm - $(REMOVE) bitmaps/*.lbm - $(REMOVE) bitmaps/*/*.lbm - $(REMOVE) fonts/*/*.lbm - $(REMOVE) translations/*.h - $(REMOVE) lua/lua_exports*.txt lua/lua_fields*.txt lua/lua_exports*.inc - $(MAKE) -C targets/taranis/bootloader clean - -#### Install - -DATE = ${shell sh -c "date +%F:%T" } -AVRCOMMAND = $(AVRDUDE) $(AVRDEVICE) - -WRITE_COMMAND = $(AVRCOMMAND) -U flash:w:opentx.hex:i -ifeq ($(RESTORE_EEPROM), YES) - BACKUP_EEPROM = YES - ifeq ($(DOUBLE_WRITE_OK), YES) - WRITE_COMMAND += -U eeprom:w:$(DATA_DIR)/eeprom-$(DATE).hex:i - else - SECOND_WRITE_COMMAND = -U eeprom:w:$(DATA_DIR)/eeprom-$(DATE).hex:i - endif -endif - -ifeq ($(BACKUP_FLASH), YES) - BACKUP_ARGS += -U eeprom:r:$(DATA_DIR)/eeprom-$(DATE).hex:i $(BACKUPFLASH) -endif -ifeq ($(BACKUP_EEPROM), YES) - BACKUP_ARGS += -U flash:r:$(DATA_DIR)/opentx-$(DATE).hex:i -endif - -install: all -ifdef BACKUP_ARGS - $(AVRCOMMAND) $(BACKUP_ARGS) - $(SLEEP) $(DELAY) -endif - $(WRITE_COMMAND) -ifdef SECOND_WRITE_COMMAND - $(SLEEP) $(DELAY) - $(SECOND_WRITE_COMMAND) -endif - -#### GOOGLE TESTS - -GTEST_INCDIR = /usr/include/gtest -GTEST_SRCDIR = /usr/src/gtest/ - -# Where to find user code. -USER_DIR = ./ - -# All Google Test headers. Usually you shouldn't change this -# definition. -GTEST_HEADERS = $(GTEST_INCDIR)/*.h \ - $(GTEST_INCDIR)/internal/*.h - -# House-keeping build targets. - -# Builds gtest.a and gtest_main.a. - -# Usually you shouldn't tweak such internal variables, indicated by a -# trailing _. -GTEST_SRCS = $(GTEST_SRCDIR)/src/*.cc $(GTEST_HEADERS) - -# For simplicity and to avoid depending on Google Test's -# implementation details, the dependencies specified below are -# conservative and not optimized. This is fine as Google Test -# compiles fast and for ordinary users its source rarely changes. -gtest-all.o : $(GTEST_SRCS) - $(CXX) $(CPPFLAGS) -I$(GTEST_SRCDIR) -I$(GTEST_INCDIR) -c $(GTEST_SRCDIR)/src/gtest-all.cc - -# Builds a sample test. A test should link with either gtest.a or -# gtest_main.a, depending on whether it defines its own main() -# function. - -#use all .cpp files from tests/ dir -GTEST_TESTS_SRCS = $(shell find tests/ -type f -name '*.cpp') - -gtests: allsimusrc.cpp $(GTEST_TESTS_SRCS) targets/simu/simpgmspace.cpp *.h tests/gtests.h gtest-all.o - gcc -std=gnu++0x $(CPPFLAGS) $(SIMUCPPFLAGS) allsimusrc.cpp $(LUASRC) $(GTEST_TESTS_SRCS) targets/simu/simpgmspace.cpp ${INCFLAGS} -I$(GTEST_INCDIR) -I/usr/include/qt4 -o gtests -lpthread -MD -DSIMU -lQtCore -lQtGui gtest-all.o -fexceptions -lstdc++ -lm From 4382445123e26bdfa2aacb3811537165e6058a4c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 30 Mar 2016 07:55:53 +0200 Subject: [PATCH 62/69] Cosmetics --- radio/util/checksize.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/radio/util/checksize.py b/radio/util/checksize.py index 6cc194f61..adfb07a6f 100644 --- a/radio/util/checksize.py +++ b/radio/util/checksize.py @@ -16,7 +16,7 @@ while 1: index += 1 os.chdir(srcdir) - cmd = ["git", "reset", "--hard", "origin/next~%d" % index] + cmd = ["git", "reset", "--hard", "FETCH_HEAD~%d" % index] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = proc.communicate() if proc.returncode != 0: @@ -38,7 +38,10 @@ while 1: print "HEAD~%d make firmware failed" % index continue - oldsize = int(subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % "firmware.hex", shell=True)) + if os.path.isfile("firmware.bin"): + oldsize = os.stat("firmware.bin").st_size + else: + oldsize = int(subprocess.check_output('avr-size -A firmware.hex | grep Total | cut -f2- -d " "', shell=True)) if size: if size > oldsize: print "HEAD~%d %d: increase by %d bytes" % (index-1, size, size-oldsize) From 438f81aef9b4bf8d7399642e51bcfc678de2693d Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Wed, 30 Mar 2016 20:14:37 +0400 Subject: [PATCH 63/69] Reorganize / clarify board types by relevance --- .../src/firmwares/opentx/opentxinterface.cpp | 255 +++++++++--------- 1 file changed, 127 insertions(+), 128 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 2dacafe0b..d58715375 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1171,8 +1171,117 @@ void registerOpenTxFirmwares() Option nav_options[] = { { "rotenc", QObject::tr("Rotary Encoder use in menus navigation") }, { "potscroll", QObject::tr("Pots use in menus navigation") }, { NULL } }; Option dsm2_options[] = { { "DSM2", QObject::tr("Support for DSM2 modules"), 0 }, { "DSM2PPM", QObject::tr("Support for DSM2 modules using ppm instead of true serial"), 0 }, { NULL } }; + /* Taranis Plus board */ + firmware = new OpenTxFirmware("opentx-taranisplus", QObject::tr("FrSky Taranis Plus"), BOARD_TARANIS_PLUS); + addOpenTxTaranisOptions(firmware); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* Taranis board */ + firmware = new OpenTxFirmware("opentx-taranis", QObject::tr("FrSky Taranis"), BOARD_TARANIS); + firmware->addOption("haptic", QObject::tr("Haptic module installed")); + addOpenTxTaranisOptions(firmware); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* Taranis X9E board */ + firmware = new OpenTxFirmware("opentx-taranisx9e", QObject::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E); + firmware->addOption("shutdownconfirm", QObject::tr("Confirmation before radio shutdown")); + addOpenTxTaranisOptions(firmware); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* Horus board */ + firmware = new OpenTxFirmware("opentx-horus", QObject::tr("FrSky Horus"), BOARD_HORUS); + firmware->addOption("noheli", QObject::tr("Disable HELI menu and cyclic mix support")); + firmware->addOption("nogvars", QObject::tr("Disable Global variables")); + firmware->addOption("lua", QObject::tr("Support for Lua model scripts")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* 9XR-Pro */ + firmware = new OpenTxFirmware("opentx-9xrpro", QObject::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); + firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); + firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); + firmware->addOption("nofp", QObject::tr("No flight modes")); + firmware->addOption("nocurves", QObject::tr("Disable curves menus")); + firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); + firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); + firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("timer3", QObject::tr("Support for a third timer")); + firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); + firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); + firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); + firmware->addOption("battgraph", QObject::tr("Battery graph")); + firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); + firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* 9XR board with M128 chip */ + firmware = new OpenTxFirmware("opentx-9xr128", QObject::tr("Turnigy 9XR with m128 chip"), BOARD_M128); + firmware->addOptions(extr_options); + firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); + firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); + firmware->addOption("nosplash", QObject::tr("No splash screen")); + firmware->addOption("nofp", QObject::tr("No flight modes")); + firmware->addOption("nocurves", QObject::tr("Disable curves menus")); + firmware->addOption("audio", QObject::tr("Support for radio modified with regular speaker")); + firmware->addOption("voice", QObject::tr("Used if you have modified your radio with voice mode")); + firmware->addOption("haptic", QObject::tr("Used if you have modified your radio with haptic mode")); + // NOT TESTED firmware->addOption("PXX", QObject::tr("Support of FrSky PXX protocol")); + firmware->addOption("DSM2", QObject::tr("Support for DSM2 modules")); + firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); + firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); + firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); + firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); + firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); + firmware->addOption("battgraph", QObject::tr("Battery graph")); + firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); + firmware->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics")); + firmware->addOption("pgbar", QObject::tr("EEprom write Progress bar")); + firmware->addOption("imperial", QObject::tr("Imperial units")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* 9XR board */ + firmware = new OpenTxFirmware("opentx-9xr", QObject::tr("Turnigy 9XR"), BOARD_STOCK); + firmware->addOptions(extr_options); + firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); + firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); + firmware->addOption("nosplash", QObject::tr("No splash screen")); + firmware->addOption("nofp", QObject::tr("No flight modes")); + firmware->addOption("nocurves", QObject::tr("Disable curves menus")); + firmware->addOption("audio", QObject::tr("Support for radio modified with regular speaker")); + firmware->addOption("voice", QObject::tr("Used if you have modified your radio with voice mode")); + firmware->addOption("haptic", QObject::tr("Used if you have modified your radio with haptic mode")); + // NOT TESTED firmware->addOption("PXX", QObject::tr("Support of FrSky PXX protocol")); + firmware->addOption("DSM2", QObject::tr("Support for DSM2 modules")); + firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); + firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); + firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); + firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); + firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); + firmware->addOption("battgraph", QObject::tr("Battery graph")); + firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); + firmware->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics")); + firmware->addOption("pgbar", QObject::tr("EEprom write Progress bar")); + firmware->addOption("imperial", QObject::tr("Imperial units")); + firmware->addOption("nowshh", QObject::tr("No Winged Shadow How High support")); + firmware->addOption("novario", QObject::tr("No vario support")); + firmware->addOption("nogps", QObject::tr("No GPS support")); + firmware->addOption("nogauges", QObject::tr("No gauges in the custom telemetry screen")); + firmware->addOption("stickrev", QObject::tr("Add support for reversing stick inputs (e.g. needed for FrSky gimbals)")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + /* 9x board */ - firmware = new OpenTxFirmware("opentx-9x", QObject::tr("9X board"), BOARD_STOCK); + firmware = new OpenTxFirmware("opentx-9x", QObject::tr("9X with stock board"), BOARD_STOCK); firmware->addOptions(ext_options); firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); @@ -1208,7 +1317,7 @@ void registerOpenTxFirmwares() firmwares.push_back(firmware); /* 9x board with M128 chip */ - firmware = new OpenTxFirmware("opentx-9x128", QObject::tr("M128 / 9X board"), BOARD_M128); + firmware = new OpenTxFirmware("opentx-9x128", QObject::tr("9X with stock board and m128 chip"), BOARD_M128); firmware->addOptions(ext_options); firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); @@ -1237,69 +1346,52 @@ void registerOpenTxFirmwares() addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); - /* 9XR board */ - firmware = new OpenTxFirmware("opentx-9xr", QObject::tr("9XR"), BOARD_STOCK); - firmware->addOptions(extr_options); - firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); + /* ar9x board */ + firmware = new OpenTxFirmware("opentx-ar9x", QObject::tr("9X with AR9X board"), BOARD_AR9X); + firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nosplash", QObject::tr("No splash screen")); firmware->addOption("nofp", QObject::tr("No flight modes")); firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("audio", QObject::tr("Support for radio modified with regular speaker")); - firmware->addOption("voice", QObject::tr("Used if you have modified your radio with voice mode")); - firmware->addOption("haptic", QObject::tr("Used if you have modified your radio with haptic mode")); - // NOT TESTED firmware->addOption("PXX", QObject::tr("Support of FrSky PXX protocol")); - firmware->addOption("DSM2", QObject::tr("Support for DSM2 modules")); firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("timer3", QObject::tr("Support for a third timer")); firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); firmware->addOption("battgraph", QObject::tr("Battery graph")); firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics")); - firmware->addOption("pgbar", QObject::tr("EEprom write Progress bar")); - firmware->addOption("imperial", QObject::tr("Imperial units")); - firmware->addOption("nowshh", QObject::tr("No Winged Shadow How High support")); - firmware->addOption("novario", QObject::tr("No vario support")); - firmware->addOption("nogps", QObject::tr("No GPS support")); - firmware->addOption("nogauges", QObject::tr("No gauges in the custom telemetry screen")); - firmware->addOption("stickrev", QObject::tr("Add support for reversing stick inputs (e.g. needed for FrSky gimbals)")); + firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); +// firmware->addOption("rtc", QObject::tr("Optional RTC added")); +// firmware->addOption("volume", QObject::tr("i2c volume control added")); addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); - /* 9XR board with M128 chip */ - firmware = new OpenTxFirmware("opentx-9xr128", QObject::tr("9XR with M128 chip"), BOARD_M128); - firmware->addOptions(extr_options); - firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); + /* Sky9x board */ + firmware = new OpenTxFirmware("opentx-sky9x", QObject::tr("9X with Sky9x board"), BOARD_SKY9X); + firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nosplash", QObject::tr("No splash screen")); firmware->addOption("nofp", QObject::tr("No flight modes")); firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("audio", QObject::tr("Support for radio modified with regular speaker")); - firmware->addOption("voice", QObject::tr("Used if you have modified your radio with voice mode")); - firmware->addOption("haptic", QObject::tr("Used if you have modified your radio with haptic mode")); - // NOT TESTED firmware->addOption("PXX", QObject::tr("Support of FrSky PXX protocol")); - firmware->addOption("DSM2", QObject::tr("Support for DSM2 modules")); firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("timer3", QObject::tr("Support for a third timer")); firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); firmware->addOption("battgraph", QObject::tr("Battery graph")); firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics")); - firmware->addOption("pgbar", QObject::tr("EEprom write Progress bar")); - firmware->addOption("imperial", QObject::tr("Imperial units")); + firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); /* Gruvin9x board */ - firmware = new OpenTxFirmware("opentx-gruvin9x", QObject::tr("Gruvin9x board / 9X"), BOARD_GRUVIN9X); + firmware = new OpenTxFirmware("opentx-gruvin9x", QObject::tr("9X with Gruvin9x board"), BOARD_GRUVIN9X); firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); firmware->addOption("nofp", QObject::tr("No flight modes")); @@ -1324,7 +1416,7 @@ void registerOpenTxFirmwares() firmwares.push_back(firmware); /* MEGA2560 board */ - firmware = new OpenTxFirmware("opentx-mega2560", QObject::tr("MEGA2560 board"), BOARD_MEGA2560); + firmware = new OpenTxFirmware("opentx-mega2560", QObject::tr("DIY MEGA2560 radio"), BOARD_MEGA2560); addOpenTxLcdOptions(firmware); firmware->addOption("PWR", QObject::tr("Power management by soft-off circuitry")); firmware->addOptions(ext_options); @@ -1353,99 +1445,6 @@ void registerOpenTxFirmwares() addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); - /* Sky9x board */ - firmware = new OpenTxFirmware("opentx-sky9x", QObject::tr("Sky9x board / 9X"), BOARD_SKY9X); - firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); - firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nofp", QObject::tr("No flight modes")); - firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); - firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); - firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); - firmware->addOption("timer3", QObject::tr("Support for a third timer")); - firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); - firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); - firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); - firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); - firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); - firmware->addOption("battgraph", QObject::tr("Battery graph")); - firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* ar9x board */ - firmware = new OpenTxFirmware("opentx-ar9x", QObject::tr("ar9x board / 9X"), BOARD_AR9X); - firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); - firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nofp", QObject::tr("No flight modes")); - firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); - firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); - firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); - firmware->addOption("timer3", QObject::tr("Support for a third timer")); - firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); - firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); - firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); - firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); - firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); - firmware->addOption("battgraph", QObject::tr("Battery graph")); - firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); -// firmware->addOption("rtc", QObject::tr("Optional RTC added")); -// firmware->addOption("volume", QObject::tr("i2c volume control added")); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* 9XR-Pro */ - firmware = new OpenTxFirmware("opentx-9xrpro", QObject::tr("9XR-PRO"), BOARD_9XRPRO); - firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); - firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nofp", QObject::tr("No flight modes")); - firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); - firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); - firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); - firmware->addOption("timer3", QObject::tr("Support for a third timer")); - firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); - firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); - firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); - firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); - firmware->addOption("battgraph", QObject::tr("Battery graph")); - firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* Taranis board */ - firmware = new OpenTxFirmware("opentx-taranis", QObject::tr("FrSky Taranis"), BOARD_TARANIS); - firmware->addOption("haptic", QObject::tr("Haptic module installed")); - addOpenTxTaranisOptions(firmware); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* Taranis Plus board */ - firmware = new OpenTxFirmware("opentx-taranisplus", QObject::tr("FrSky Taranis Plus"), BOARD_TARANIS_PLUS); - addOpenTxTaranisOptions(firmware); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* Taranis X9E board */ - firmware = new OpenTxFirmware("opentx-taranisx9e", QObject::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E); - firmware->addOption("shutdownconfirm", QObject::tr("Confirmation before radio shutdown")); - firmware->addOption("horussticks", QObject::tr("Horus magnetic sticks")); - addOpenTxTaranisOptions(firmware); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* Horus board */ - firmware = new OpenTxFirmware("opentx-horus", QObject::tr("FrSky Horus"), BOARD_HORUS); - firmware->addOption("noheli", QObject::tr("Disable HELI menu and cyclic mix support")); - firmware->addOption("nogvars", QObject::tr("Disable Global variables")); - firmware->addOption("lua", QObject::tr("Support for Lua model scripts")); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - default_firmware_variant = GetFirmware("opentx-taranisplus-en"); current_firmware_variant = default_firmware_variant; } From 7076889e1aa0c722823bebad6b800128e1abd0b6 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Wed, 30 Mar 2016 20:27:28 +0400 Subject: [PATCH 64/69] Channel range fix --- companion/src/modeledit/setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 351500a85..fd141b128 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -331,8 +331,8 @@ void ModulePanel::update() ui->failsafesFrame->setVisible(mask & MASK_FAILSAFES); if (mask & MASK_CHANNELS_RANGE) { - ui->channelsStart->setMaximum(32 - ui->channelsCount->value()); - ui->channelsCount->setMaximum(qMin(16, 32-ui->channelsStart->value())); + ui->channelsStart->setMaximum(33 - ui->channelsCount->value()); + ui->channelsCount->setMaximum(qMin(16, 33-ui->channelsStart->value())); } } From e4d820b11e9f592b3edea1787470666f00b2b4fd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 30 Mar 2016 18:42:36 +0200 Subject: [PATCH 65/69] Dockerfile cosmetics --- radio/util/Dockerfile | 55 ++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile index 9d095ef72..aa4c1d4cb 100644 --- a/radio/util/Dockerfile +++ b/radio/util/Dockerfile @@ -1,33 +1,34 @@ # An Debian image for compiling OpenTX 2.2 -FROM debian:jessie -MAINTAINER bsongis +FROM debian:jessie -RUN apt-get update && apt-get install -y \ - software-properties-common \ - wget \ - lib32z1 \ - lib32ncurses5 \ - git \ - cmake \ - gcc \ - avr-libc \ - build-essential \ - libfox-1.6-dev \ - python-qt4 \ - qt5-default \ - qttools5-dev \ - qtmultimedia5-dev \ - qttools5-dev-tools \ - libsdl1.2-dev +RUN apt-get update && \ + apt-get install -y \ + avr-libc \ + build-essential \ + cmake \ + gcc \ + git \ + lib32ncurses5 \ + lib32z1 \ + libfox-1.6-dev \ + libsdl1.2-dev \ + python-qt4 \ + qt5-default \ + qtmultimedia5-dev \ + qttools5-dev \ + qttools5-dev-tools \ + software-properties-common \ + wget -RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ - tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ - mv gcc-arm-none-eabi-4_7-2013q3 /opt/gcc-arm-none-eabi +RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ + tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ + mv gcc-arm-none-eabi-4_7-2013q3 /opt/gcc-arm-none-eabi -RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb && \ - wget -q http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb && \ - dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb +RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb && \ + wget -q http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb && \ + dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb -VOLUME ["/opentx"] -ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin:/opentx/code/radio/util +VOLUME ["/opentx"] + +ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin:/opentx/code/radio/util From 3c1221452a98337c0b9967fcd81c7dd3c63c85dd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 30 Mar 2016 22:47:25 +0200 Subject: [PATCH 66/69] Taranis bootloader Makefile removed (CMake now) --- radio/src/targets/taranis/bootloader/Makefile | 342 ------------------ 1 file changed, 342 deletions(-) delete mode 100644 radio/src/targets/taranis/bootloader/Makefile diff --git a/radio/src/targets/taranis/bootloader/Makefile b/radio/src/targets/taranis/bootloader/Makefile deleted file mode 100644 index 80b9a7479..000000000 --- a/radio/src/targets/taranis/bootloader/Makefile +++ /dev/null @@ -1,342 +0,0 @@ -# -# !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!! -# -############################################################################################## -# -# On command line: -# -# make all = Create project -# -# make clean = Clean project files. -# -# To rebuild project do "make clean" and "make all". -# - -############################################################################################## -# Start of default section -# - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CP = $(TRGT)objcopy -CLSS = $(TRGT)objdump -AS = $(TRGT)as -#gcc -x assembler-with-cpp -BIN = $(CP) -O ihex -BINX = $(CP) -O binary - -OBJDIR = . - -THIRDPARTY = ../../../thirdparty -FATFSDIR = $(THIRDPARTY)/FatFs - -ifeq ($(PCBREV), REV9E) - MCU = cortex-m4 - STM32LIBPATH = $(THIRDPARTY)/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries -else - MCU = cortex-m3 - STM32LIBPATH = $(THIRDPARTY)/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries -endif - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -MEMORIES = sram - -EXT = STD - -# -# End of default section -############################################################################################## - -############################################################################################## -# Start of user section -# - -# -# Define project name and Ram/Flash mode here -PROJECT = bootloader - -ifeq ($(PCB), TARANIS) -RUN_FROM_FLASH = 0 - else - ifeq ($(PCB), X9D) - RUN_FROM_FLASH = 0 - else - RUN_FROM_FLASH = 1 - endif -endif - -# PCB revision -PCBREV = - -EXTRAINCDIRS = $(THIRDPARTY) $(FATFSDIR) $(FATFSDIR)/option - -STM32USBPATH = ../../../thirdparty/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - -# -# Define linker script file here -# -ifeq ($(PCB), TARANIS) - ARCH = ARM - LDSCRIPT = ../stm32_ramboot.ld - TRGT = arm-none-eabi- - CPPDEFS += -DHSE_VALUE=12000000 - CPPDEFS += -DPCBTARANIS -DEEPROM_RLC -DUSB_MASS_STORAGE - FULL_PRJ = $(PROJECT)_ramBoot - ifeq ($(PCBREV), REV9E) - CPPDEFS += -DSTM32F40_41xxx - EXTRAINCDIRS += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/inc - EXTRAINCDIRS += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Include - EXTRAINCDIRS += $(STM32LIBPATH)/CMSIS/Include - else - EXTRAINCDIRS += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/inc - EXTRAINCDIRS += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F2xx/Include - EXTRAINCDIRS += $(STM32LIBPATH)/CMSIS/include - endif - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc - EXTRAINCDIRS += .. ../../.. ../../../fonts/std - ifeq ($(PCBREV), REV4a) - CPPDEFS += -DREV4a - else ifeq ($(PCBREV), REVPLUS) - CPPDEFS += -DREVPLUS - HAPTIC = YES - else ifeq ($(PCBREV), REV9E) - CPPDEFS += -DREVPLUS -DREV9E - HAPTIC = YES - else - CPPDEFS += -DREV4 - endif -endif - -# List all user C define here, like -D_DEBUG=1 - -# Define ASM defines here -UADEFS = - -SRC = - -ifeq ($(PCBREV), REV9E) - SRC += ../system_stm32f4xx.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/misc.c -else - SRC += ../system_stm32f2xx.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/misc.c -endif - -SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_core.c -SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd.c -SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd_int.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_core.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_ioreq.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_req.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c -SRC += ../delays.c -SRC += $(THIRDPARTY)/FatFs/ff.c $(THIRDPARTY)/FatFs/option/ccsbcs.c -SRC += ../usbd_desc.c -SRC += ../aspi.c -SRC += ../usb_bsp.c -SRC += ../usb_driver.c -SRC += ../pwr_driver.c -SRC += init.c - -CPPSRC = ../lcd_driver.cpp \ - ../configure_pins.cpp \ - ../keys_driver.cpp \ - ../i2c_driver.cpp \ - ../flash_driver.cpp \ - ../diskio.cpp \ - ../usbd_usr.cpp \ - ../usbd_storage_msd.cpp \ - ../../../gui/taranis/lcd.cpp \ - ../../../keys.cpp \ - ../../../fonts.cpp \ - ../../../strhelpers.cpp \ - boot.cpp - -# List ASM source files here - -ifeq ($(PCBREV), REV9E) - ASRC = $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f40_41xxx.s -else - ASRC = $(STM32LIBPATH)/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s -endif - -# List all user directories here -UINCDIR = ./inc -# \ -# ./cmsis/core \ -# ./cmsis/device - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# Define optimisation level here -OPT = -Os - -# -# End of user defines -############################################################################################## - - -VPATH = $(DIRS) - -INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR)) -LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) - -ifeq ($(RUN_FROM_FLASH), 0) -DEFS = $(DDEFS) $(UDEFS) -DRUN_FROM_FLASH=0 -else -DEFS = $(DDEFS) $(UDEFS) -DRUN_FROM_FLASH=1 -endif - -ADEFS = $(DADEFS) $(UADEFS) - -AXOBJS = $(ASRC:%.s=%.o) -CXOBJS = $(SRC:%.c=%.o) -CPPXOBJS = $(CPPSRC:%.cpp=%.o) - -LIBS = $(DLIBS) $(ULIBS) -MCFLAGS = -mcpu=$(MCU) - -ifeq ($(NANO), YES) - # use newlib-nano for linking - # NEWLIB_NANO_FLAGS = --specs=nano.specs -u _printf_float #use this version if printf for floats is needed! - NEWLIB_NANO_FLAGS = --specs=nano.specs -endif - -#ASFLAGS = $(MCFLAGS) -g -gdwarf-2 -Wa,-amhls=$(OBJDIR)/$(notdir $(<:.s=.lst)) $(ADEFS) -CPFLAGS = $(MCFLAGS) $(OPT) -gdwarf-2 -mthumb -fomit-frame-pointer -Wall -Wstrict-prototypes -fverbose-asm $(DEFS) -LDFLAGS = $(MCFLAGS) -mthumb -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(FULL_PRJ).map,--cref,--no-warn-mismatch,--gc-sections $(LIBDIR) $(NEWLIB_NANO_FLAGS) -CPPFLAGS = $(MCFLAGS) $(OPT) -gdwarf-2 -mthumb -fomit-frame-pointer -fdata-sections -ffunction-sections -Wall -fverbose-asm $(DEFS) - -ifeq ($(WARNINGS_AS_ERRORS), YES) - CPFLAGS += -Werror - CPPFLAGS += -Werror -endif - -CPPFLAGS += $(CPPDEFS) -CPFLAGS += $(CPPDEFS) -CPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) - -AOBJS = $(patsubst %,$(OBJDIR)/%,$(notdir $(AXOBJS) )) -COBJS = $(patsubst %,$(OBJDIR)/%,$(notdir $(CXOBJS) )) -CPPOBJS = $(patsubst %,$(OBJDIR)/%,$(notdir $(CPPXOBJS) )) -DIRS = $(sort $(dir $(AXOBJS) $(CXOBJS) $(CPPXOBJS) ) ) - - -CPPDEFS += -DCPUARM - -ifeq ($(PCB), TARANIS) - CPPDEFS += -DCPUSTM32 -endif - -CPPDEFS += -DTIMERS=0 - -# If serial Debug required -ifeq ($(DEBUG), 1) - CPPDEFS += -DDEBUG -endif - -CPPDEFS += -DBOOT - -# Generate dependency information -CPFLAGS += -MD -MP -MF .dep/$(@F).d -CPPFLAGS += -MD -MP -MF .dep/$(@F).d -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) - -# -# makefile rules -# - -all: size_before $(OBJS) $(COBJS) $(CPPOBJS) $(FULL_PRJ).elf $(FULL_PRJ).hex $(FULL_PRJ).lss $(FULL_PRJ).bin size - -#begin: -# @echo $(AXOBJS) $(CXOBJS) $(CPPXOBJS) -# @echo -# @echo $(OBJS) $(COBJS) $(CPPOBJS) -# @echo -# @echo $(DIRS) - -size_before: -# arm-none-eabi-size $(FULL_PRJ).elf - @if test -f $(FULL_PRJ).elf; then arm-none-eabi-size $(FULL_PRJ).elf; fi - -size: -# arm-none-eabi-size $(FULL_PRJ).elf - @if test -f $(FULL_PRJ).elf; then arm-none-eabi-size $(FULL_PRJ).elf; fi - -$(CPPOBJS) : $(OBJDIR)/%.o : %.cpp - $(CC) -c $(CPPFLAGS) -fno-exceptions -I . $(INCDIR) $< -o $@ - -$(COBJS) : $(OBJDIR)/%.o : %.c - $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@ - - -$(AOBJS) : $(OBJDIR)/%.o : %.s - $(AS) -c $(ASFLAGS) $< -o $@ - -%elf: $(AOBJS) $(COBJS) $(CPPOBJS) - $(CC) $(AOBJS) $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS) -o $@ - -# Create extended listing file from ELF output file. -%.lss: %.elf - $(CLSS) -h -S $< > $@ - -%hex: %elf - $(BIN) $< $@ - -%bin: %elf - $(BINX) $< $@ - -# $(PROJECT)_flash8 -# $(PROJECT)_flash4 -# $(PROJECT)_ramBootS -# $(PROJECT)_ramBootT - -clean: - -rm -f *.o - -rm -f *.elf - -rm -f *.map - -rm -f *.hex - -rm -f *.bin - -rm -f *.lss - -rm -fR .dep - - -# -# Include the dependency files, should be the last of the makefile -# --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - -# *** EOF *** From 1f54c61e41aff13f75923a4aca4f4aa9aa123f15 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 30 Mar 2016 23:14:17 +0200 Subject: [PATCH 67/69] Dockerfile fixes ported to 'next' --- radio/util/Dockerfile | 7 ++++++- radio/util/build.py | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile index aa4c1d4cb..88566c8f2 100644 --- a/radio/util/Dockerfile +++ b/radio/util/Dockerfile @@ -26,9 +26,14 @@ RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+downl mv gcc-arm-none-eabi-4_7-2013q3 /opt/gcc-arm-none-eabi RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb && \ + wget -q http://ftp.de.debian.org/debian/pool/main/a/avr-libc/avr-libc_1.8.0-2_all.deb && \ + wget -q http://ftp.de.debian.org/debian/pool/main/b/binutils-avr/binutils-avr_2.24+Atmel3.4.4-1_amd64.deb && \ wget -q http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb && \ - dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb + dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb avr-libc_1.8.0-2_all.deb binutils-avr_2.24+Atmel3.4.4-1_amd64.deb VOLUME ["/opentx"] ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin:/opentx/code/radio/util +ARG OPENTX_VERSION_SUFFIX= +ENV OPENTX_VERSION_SUFFIX ${OPENTX_VERSION_SUFFIX} + diff --git a/radio/util/build.py b/radio/util/build.py index 814755eab..1e7ff6bc5 100755 --- a/radio/util/build.py +++ b/radio/util/build.py @@ -139,6 +139,8 @@ elif what == "libsimulator": ext = ".so" target = "libopentx-" + options[optcount] + "-simulator.so" filename = "libopentx" +else: + exit(INVALID_BOARD) filename += "-" + options[optcount] optcount += 1 @@ -207,7 +209,7 @@ if not os.path.isfile(path): if what == "firmware": # Check binary size if board_family == BOARD_FAMILY_ARM: - size = os.stat(firmware).st_size + size = os.stat(target).st_size else: size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % target, shell=True) size = int(size.strip()) From 02dfff319fa7839e278ade56b630882a1a2727a9 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Thu, 31 Mar 2016 16:51:20 +0400 Subject: [PATCH 68/69] [Horus] Cosmetics --- radio/src/gui/horus/menu_model_telemetry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/horus/menu_model_telemetry.cpp b/radio/src/gui/horus/menu_model_telemetry.cpp index 90355d580..1bfea4c62 100644 --- a/radio/src/gui/horus/menu_model_telemetry.cpp +++ b/radio/src/gui/horus/menu_model_telemetry.cpp @@ -426,7 +426,7 @@ bool menuModelTelemetry(evt_t event) lcdDrawSizedText(60, y, g_model.telemetrySensors[index].label, TELEM_LABEL_LEN, ZCHAR); TelemetryItem & telemetryItem = telemetryItems[index]; if (telemetryItem.isFresh()) { - lcdDrawText(100, y, "*"); + lcdDrawText(130, y, "*"); } if (telemetryItem.isAvailable()) { LcdFlags color = telemetryItem.isOld() ? ALARM_COLOR : TEXT_COLOR; From 009eaa38937739b90a5177b12528a3013bb482c6 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Thu, 31 Mar 2016 18:06:20 +0200 Subject: [PATCH 69/69] Cmake compiler optimization flags fixed, now release build uses -Os instead of -O3 which is cmake's default. --- radio/src/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index c834933ed..ec8530b73 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -950,7 +950,13 @@ if(ARCH STREQUAL ARM) set(COMMON_FLAGS "-mcpu=${MCU} -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=firmware.lst -O${OPT} -gdwarf-2 -DHSE_VALUE=${HSE_VALUE} -fno-exceptions -fdata-sections -ffunction-sections ${WARNING_FLAGS}") set(CMAKE_C_FLAGS "${COMMON_FLAGS} -Wimplicit") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} -Wimplicit -g") + set(CMAKE_C_FLAGS_RELEASE "${COMMON_FLAGS} -Wimplicit") + set(CMAKE_C_FLAGS_DEBUG "${COMMON_FLAGS} -Wimplicit -g") set(CMAKE_CXX_FLAGS "${COMMON_FLAGS}") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} -g") + set(CMAKE_CXX_FLAGS_RELEASE "${COMMON_FLAGS}") + set(CMAKE_CXX_FLAGS_DEBUG "${COMMON_FLAGS} -g") set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -lm -T${RADIO_SRC_DIRECTORY}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections") if(PCB STREQUAL TARANIS)