1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-21 11:54:15 +01:00

Merge remote-tracking branch 'remotes/origin/bugfix-ground' into OP-512-PTDreamer

Conflicts:
	ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp
This commit is contained in:
zedamota 2011-06-01 14:02:55 +01:00
commit 844bc79f45
169 changed files with 5934 additions and 4115 deletions

View File

@ -112,17 +112,18 @@ C: Oleg Semyonov (osnwt)
D: May 2011
V: http://www.youtube.com/watch?v=-J8cxqzxxWw
M: First Y6 CopterControl flight
C: ?
D: ?
V:
M: First V8 Octo OpenPilot flight
C: Sami Korhonen (Sambas)
D: May 2011
V: http://vimeo.com/24258192
An incomplete list of some future Milestones is below:
* First Y6 CopterControl flight
* First Helicopter flight with OpenPilot
* First Octo flight with OpenPilot
* First successful flight using the GCS only and no RC TX
* First use of Magic Waypoint
* First Flybarless Helicopter flight with OpenPilot

359
Makefile
View File

@ -77,19 +77,24 @@ help:
@echo " all_flight - Build all firmware, bootloaders and bootloader updaters"
@echo " all_fw - Build only firmware for all boards"
@echo " all_bl - Build only bootloaders for all boards"
@echo " all_blupd - Build only bootloader updaters for all boards"
@echo " all_bu - Build only bootloader updaters for all boards"
@echo
@echo " all_clean - Remove your build directory ($(BUILD_DIR))"
@echo " all_flight_clean - Remove all firmware, bootloaders and bootloader updaters"
@echo " all_fw_clean - Remove firmware for all boards"
@echo " all_bl_clean - Remove bootlaoders for all boards"
@echo " all_blupd_clean - Remove bootloader updaters for all boards"
@echo " all_bu_clean - Remove bootloader updaters for all boards"
@echo
@echo " all_<board> - Build all available images for <board>"
@echo " all_<board>_clean - Remove all available images for <board>"
@echo
@echo " [Firmware]"
@echo " <board> - Build firmware for <board>"
@echo " supported boards are ($(ALL_BOARDS))"
@echo " fw_<board> - Build firmware for <board>"
@echo " supported boards are ($(FW_TARGETS))"
@echo " <board>_clean - Remove firmware for <board>"
@echo " <board>_program - Use OpenOCD + JTAG to write firmware to <board>"
@echo " fw_<board>_clean - Remove firmware for <board>"
@echo " fw_<board>_program - Use OpenOCD + JTAG to write firmware to <board>"
@echo
@echo " [Bootloader]"
@echo " bl_<board> - Build bootloader for <board>"
@ -98,9 +103,9 @@ help:
@echo " bl_<board>_program - Use OpenOCD + JTAG to write bootloader to <board>"
@echo
@echo " [Bootloader Updater]"
@echo " blupd_<board> - Build bootloader updater for <board>"
@echo " supported boards are ($(BLUPD_TARGETS))"
@echo " blupd_<board>_clean - Remove bootloader updater for <board>"
@echo " bu_<board> - Build bootloader updater for <board>"
@echo " supported boards are ($(BU_TARGETS))"
@echo " bu_<board>_clean - Remove bootloader updater for <board>"
@echo
@echo " [Simulation]"
@echo " sim_posix - Build OpenPilot simulation firmware for"
@ -311,254 +316,128 @@ uavobjects_clean:
#
##############################
FW_TARGETS := openpilot ahrs coptercontrol pipxtreme ins
BL_TARGETS := $(addprefix bl_, $(FW_TARGETS))
BLUPD_TARGETS := $(addprefix blupd_, $(FW_TARGETS))
# $(1) = Canonical board name all in lower case (e.g. coptercontrol)
# $(2) = Name of board used in source tree (e.g. CopterControl)
define FW_TEMPLATE
.PHONY: $(1) fw_$(1)
$(1): fw_$(1)_opfw
fw_$(1): fw_$(1)_opfw
fw_$(1)_%: uavobjects_flight
$(V1) mkdir -p $(BUILD_DIR)/fw_$(1)/dep
$(V1) cd $(ROOT_DIR)/flight/$(2) && \
$$(MAKE) -r --no-print-directory \
BOARD_NAME=$(1) \
TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \
$$*
.PHONY: $(1)_clean
$(1)_clean: fw_$(1)_clean
fw_$(1)_clean:
$(V0) @echo " CLEAN $$@"
$(V1) $(RM) -fr $(BUILD_DIR)/fw_$(1)
endef
# $(1) = Canonical board name all in lower case (e.g. coptercontrol)
# $(2) = Name of board used in source tree (e.g. CopterControl)
define BL_TEMPLATE
.PHONY: bl_$(1)
bl_$(1): bl_$(1)_bin
bl_$(1)_bino: bl_$(1)_bin
bl_$(1)_%:
$(V1) mkdir -p $(BUILD_DIR)/bl_$(1)/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/$(2) && \
$$(MAKE) -r --no-print-directory \
BOARD_NAME=$(1) \
TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \
$$*
.PHONY: bl_$(1)_clean
bl_$(1)_clean:
$(V0) @echo " CLEAN $$@"
$(V1) $(RM) -fr $(BUILD_DIR)/bl_$(1)
endef
# $(1) = Canonical board name all in lower case (e.g. coptercontrol)
define BU_TEMPLATE
.PHONY: bu_$(1)
bu_$(1): bu_$(1)_opfw
bu_$(1)_%: bl_$(1)_bino
$(V1) mkdir -p $(BUILD_DIR)/bu_$(1)/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/BootloaderUpdater && \
$$(MAKE) -r --no-print-directory \
BOARD_NAME=$(1) \
TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \
$$*
.PHONY: bu_$(1)_clean
bu_$(1)_clean:
$(V0) @echo " CLEAN $$@"
$(V1) $(RM) -fr $(BUILD_DIR)/bu_$(1)
endef
# $(1) = Canonical board name all in lower case (e.g. coptercontrol)
define BOARD_PHONY_TEMPLATE
.PHONY: all_$(1)
all_$(1): $$(filter fw_$(1), $$(FW_TARGETS))
all_$(1): $$(filter bl_$(1), $$(BL_TARGETS))
all_$(1): $$(filter bu_$(1), $$(BU_TARGETS))
.PHONY: all_$(1)_clean
all_$(1)_clean: $$(addsuffix _clean, $$(filter fw_$(1), $$(FW_TARGETS)))
all_$(1)_clean: $$(addsuffix _clean, $$(filter bl_$(1), $$(BL_TARGETS)))
all_$(1)_clean: $$(addsuffix _clean, $$(filter bu_$(1), $$(BU_TARGETS)))
endef
ALL_BOARDS := openpilot ahrs coptercontrol pipxtreme ins
# Friendly names of each board (used to find source tree)
openpilot_friendly := OpenPilot
coptercontrol_friendly := CopterControl
pipxtreme_friendly := PipXtreme
ins_friendly := INS
ahrs_friendly := AHRS
FW_TARGETS := $(addprefix fw_, $(ALL_BOARDS))
BL_TARGETS := $(addprefix bl_, $(ALL_BOARDS))
BU_TARGETS := $(addprefix bu_, $(ALL_BOARDS))
# FIXME: The INS build doesn't have a bootloader or bootloader
# updater yet so we need to filter them out to prevent errors.
BL_TARGETS := $(filter-out bl_ins, $(BL_TARGETS))
BLUPD_TARGETS := $(filter-out blupd_ins, $(BLUPD_TARGETS))
BU_TARGETS := $(filter-out bu_ins, $(BU_TARGETS))
.PHONY: all_fw all_fw_clean
all_fw: $(addsuffix _bin, $(FW_TARGETS))
all_fw: $(addsuffix _opfw, $(FW_TARGETS))
all_fw_clean: $(addsuffix _clean, $(FW_TARGETS))
.PHONY: all_bl all_bl_clean
all_bl: $(addsuffix _bin, $(BL_TARGETS))
all_bl_clean: $(addsuffix _clean, $(BL_TARGETS))
.PHONY: all_blupd all_blupd_clean
all_blupd: $(addsuffix _bin, $(BLUPD_TARGETS))
all_blupd_clean: $(addsuffix _clean, $(BLUPD_TARGETS))
.PHONY: all_bu all_bu_clean
all_bu: $(addsuffix _opfw, $(BU_TARGETS))
all_bu_clean: $(addsuffix _clean, $(BU_TARGETS))
.PHONY: all_flight all_flight_clean
all_flight: all_fw all_bl all_blupd
all_flight_clean: all_fw_clean all_bl_clean all_blupd_clean
all_flight: all_fw all_bl all_bu
all_flight_clean: all_fw_clean all_bl_clean all_bu_clean
.PHONY: openpilot
openpilot: openpilot_bin
$(foreach board, $(ALL_BOARDS), $(eval $(call BOARD_PHONY_TEMPLATE,$(board))))
openpilot_%: uavobjects_flight
$(V1) mkdir -p $(BUILD_DIR)/openpilot/dep
$(V1) cd $(ROOT_DIR)/flight/OpenPilot && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/openpilot" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
# Expand the bootloader updater rules
$(foreach board, $(ALL_BOARDS), $(eval $(call BU_TEMPLATE,$(board),$($(board)_friendly))))
.PHONY: openpilot_clean
openpilot_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/openpilot
.PHONY: bl_openpilot
bl_openpilot: bl_openpilot_bin
bl_openpilot_bino: bl_openpilot_bin
bl_openpilot_%:
$(V1) mkdir -p $(BUILD_DIR)/bl_openpilot/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/OpenPilot && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/bl_openpilot" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: bl_openpilot_clean
bl_openpilot_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/bl_openpilot
.PHONY: blupd_openpilot
blupd_openpilot: blupd_openpilot_bin
blupd_openpilot_%: bl_openpilot_bino
$(V1) mkdir -p $(BUILD_DIR)/blupd_openpilot/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/BootloaderUpdater && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/blupd_openpilot" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \
BOARD=STM3210E_OP MODEL=HD MODEL_SUFFIX=_OP \
BLOBJ=$(BUILD_DIR)/bl_openpilot/OpenPilot_BL.bin.o $*
.PHONY: blupd_openpilot_clean
blupd_openpilot_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/blupd_openpilot
.PHONY: ahrs
ahrs: ahrs_bin
ahrs_%: uavobjects_flight
$(V1) mkdir -p $(BUILD_DIR)/ahrs/dep
$(V1) cd $(ROOT_DIR)/flight/AHRS && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/ahrs" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: ahrs_clean
ahrs_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/ahrs
.PHONY: bl_ahrs
bl_ahrs: bl_ahrs_bin
bl_ahrs_bino: bl_ahrs_bin
bl_ahrs_%:
$(V1) mkdir -p $(BUILD_DIR)/bl_ahrs/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/AHRS && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/bl_ahrs" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: bl_ahrs_clean
bl_ahrs_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/bl_ahrs
.PHONY: blupd_ahrs
blupd_ahrs: blupd_ahrs_bin
blupd_ahrs_%: bl_ahrs_bino bl_ahrs
$(V1) mkdir -p $(BUILD_DIR)/blupd_ahrs/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/BootloaderUpdater && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/blupd_ahrs" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \
BOARD=STM32103CB_AHRS MODEL=MD \
BLOBJ=$(BUILD_DIR)/bl_ahrs/AHRS_BL.bin.o $*
.PHONY: blupd_ahrs_clean
blupd_ahrs_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/blupd_ahrs
.PHONY: coptercontrol
coptercontrol: coptercontrol_bin
coptercontrol_%: uavobjects_flight
$(V1) mkdir -p $(BUILD_DIR)/coptercontrol/dep
$(V1) cd $(ROOT_DIR)/flight/CopterControl && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/coptercontrol" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: coptercontrol_clean
coptercontrol_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/coptercontrol
.PHONY: bl_coptercontrol
bl_coptercontrol: bl_coptercontrol_bin
bl_coptercontrol_bino: bl_coptercontrol_bin
bl_coptercontrol_%:
$(V1) mkdir -p $(BUILD_DIR)/bl_coptercontrol/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/CopterControl && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/bl_coptercontrol" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: bl_coptercontrol_clean
bl_coptercontrol_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/bl_coptercontrol
.PHONY: blupd_coptercontrol
blupd_coptercontrol: blupd_coptercontrol_bin
blupd_coptercontrol_%: bl_coptercontrol_bino
$(V1) mkdir -p $(BUILD_DIR)/blupd_coptercontrol/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/BootloaderUpdater && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/blupd_coptercontrol" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \
BOARD=STM32103CB_CC_Rev1 MODEL=MD MODEL_SUFFIX=_CC \
BLOBJ=$(BUILD_DIR)/bl_coptercontrol/CopterControl_BL.bin.o $*
.PHONY: blupd_coptercontrol_clean
blupd_coptercontrol_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/blupd_coptercontrol
.PHONY: pipxtreme
pipxtreme: pipxtreme_bin
pipxtreme_%: uavobjects_flight
$(V1) mkdir -p $(BUILD_DIR)/pipxtreme/dep
$(V1) cd $(ROOT_DIR)/flight/PipXtreme && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/pipxtreme" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: pipxtreme_clean
pipxtreme_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/pipxtreme
.PHONY: bl_pipxtreme
bl_pipxtreme: bl_pipxtreme_bin
bl_pipxtreme_bino: bl_pipxtreme_bin
bl_pipxtreme_%:
$(V1) mkdir -p $(BUILD_DIR)/bl_pipxtreme/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/PipXtreme && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/bl_pipxtreme" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: bl_pipxtreme_clean
bl_pipxtreme_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/bl_pipxtreme
.PHONY: blupd_pipxtreme
blupd_pipxtreme: blupd_pipxtreme_bin
blupd_pipxtreme_%: bl_pipxtreme_bino
$(V1) mkdir -p $(BUILD_DIR)/blupd_pipxtreme/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/BootloaderUpdater && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/blupd_pipxtreme" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" \
BOARD=STM32103CB_PIPXTREME MODEL=MD MODEL_SUFFIX=_CC \
BLOBJ=$(BUILD_DIR)/bl_pipxtreme/PipXtreme_BL.bin.o $*
.PHONY: blupd_pipxtreme_clean
blupd_pipxtreme_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/blupd_pipxtreme
.PHONY: ins
ins: ins_bin
ins_%: uavobjects_flight
$(V1) mkdir -p $(BUILD_DIR)/ins/dep
$(V1) cd $(ROOT_DIR)/flight/INS && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/ins" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: ins_clean
ins_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/ins
.PHONY: bl_ins
bl_ins: bl_ins_elf
bl_ins_%:
$(V1) mkdir -p $(BUILD_DIR)/bl_ins/dep
$(V1) cd $(ROOT_DIR)/flight/Bootloaders/INS && \
$(MAKE) -r --no-print-directory \
OUTDIR="$(BUILD_DIR)/bl_ins" TCHAIN_PREFIX="$(ARM_SDK_PREFIX)" \
REMOVE_CMD="$(RM)" OOCD_EXE="$(OPENOCD)" $*
.PHONY: bl_ins_clean
bl_ins_clean:
$(V0) @echo " CLEAN $@"
$(V1) $(RM) -fr $(BUILD_DIR)/bl_ins
# Expand the firmware rules
$(foreach board, $(ALL_BOARDS), $(eval $(call FW_TEMPLATE,$(board),$($(board)_friendly))))
# Expand the bootloader rules
$(foreach board, $(ALL_BOARDS), $(eval $(call BL_TEMPLATE,$(board),$($(board)_friendly))))
.PHONY: sim_posix
sim_posix: sim_posix_elf
@ -578,9 +457,9 @@ sim_win32_%: uavobjects_flight
##############################
#
# Release packaging components
# Packaging components
#
##############################
.PHONY: release
release:
.PHONY: package
package:
$(V1) cd $@ && $(MAKE) --no-print-directory $@

View File

@ -16,5 +16,7 @@ Symbols:
Capital A = OpenPilot Logo
Capital B = CC-BY-SA
Capital B = CC-BY-NC-SA
Capital D = RoHS

Binary file not shown.

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg2757" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs id="defs2759">
<radialGradient id="radialGradient2436" gradientUnits="userSpaceOnUse" cy="4.625" cx="62.625" gradientTransform="matrix(2.1647 0 0 .75294 -111.56 36.518)" r="10.625">
<stop id="stop8840" offset="0"/>
<stop id="stop8842" style="stop-opacity:0" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient2750" y2="3.0816" gradientUnits="userSpaceOnUse" x2="18.379" gradientTransform="matrix(.95844 0 0 .95844 .99752 1.9975)" y1="44.98" x1="18.379">
<stop id="stop2492" style="stop-color:#791235" offset="0"/>
<stop id="stop2494" style="stop-color:#dd3b27" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient2748" gradientUnits="userSpaceOnUse" cy="3.99" cx="23.896" gradientTransform="matrix(0 2.2875 -3.0194 0 36.047 -50.63)" r="20.397">
<stop id="stop3244" style="stop-color:#f8b17e" offset="0"/>
<stop id="stop3246" style="stop-color:#e35d4f" offset=".26238"/>
<stop id="stop3248" style="stop-color:#c6262e" offset=".66094"/>
<stop id="stop3250" style="stop-color:#690b54" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient2745" y2="5.4676" gradientUnits="userSpaceOnUse" x2="63.397" gradientTransform="matrix(2.1154 0 0 2.1153 -107.58 32.427)" y1="-12.489" x1="63.397">
<stop id="stop4875" style="stop-color:#fff" offset="0"/>
<stop id="stop4877" style="stop-color:#fff;stop-opacity:0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient2742" y2="45.074" gradientUnits="userSpaceOnUse" x2="24.481" y1="5.0809" x1="24.481">
<stop id="stop3783" style="stop-color:#fff" offset="0"/>
<stop id="stop3785" style="stop-color:#fff;stop-opacity:0" offset="1"/>
</linearGradient>
</defs>
<g id="layer1">
<path id="path8836" style="opacity:.3;fill-rule:evenodd;fill:url(#radialGradient2436)" d="m47 40c0 4.418-10.297 8-23 8s-23-3.582-23-8 10.297-8 23-8 23 3.582 23 8z"/>
<path id="path2555" style="stroke-linejoin:round;stroke:url(#linearGradient2750);stroke-linecap:round;stroke-width:1.0037;fill:url(#radialGradient2748)" d="m24 5.5018c-10.758 0-19.498 8.7402-19.498 19.498-0.0002 10.758 8.74 19.498 19.498 19.498s19.498-8.74 19.498-19.498-8.74-19.498-19.498-19.498zm0 6.2602c7.314 0 13.238 5.924 13.238 13.238 0 3.07-1.063 5.872-2.815 8.117l-16.773-19.738c1.885-1.031 4.049-1.617 6.35-1.617zm-10.603 5.331l16.713 19.648c-1.828 0.952-3.905 1.497-6.11 1.497-7.314 0-13.238-5.924-13.238-13.238 0-2.971 0.984-5.699 2.635-7.907z"/>
<path id="path8655" style="opacity:.4;stroke:url(#linearGradient2745);fill:none" d="m42.5 24.999c0 10.218-8.283 18.501-18.5 18.501s-18.5-8.283-18.5-18.501c0-10.217 8.283-18.499 18.5-18.499s18.5 8.282 18.5 18.499z"/>
<path id="path3270" style="opacity:.4;stroke:url(#linearGradient2742);stroke-linecap:round;stroke-width:1px;fill:none" d="m17.05 14.239l16.702 19.687"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg3675" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata id="metadata29">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs3677">
<linearGradient id="linearGradient2407" y2="5.4676" gradientUnits="userSpaceOnUse" x2="63.397" gradientTransform="matrix(2.1154 0 0 2.1153 -107.58 32.427)" y1="-12.489" x1="63.397">
<stop id="stop4875" style="stop-color:#fff" offset="0"/>
<stop id="stop4877" style="stop-color:#fff;stop-opacity:0" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient2410" gradientUnits="userSpaceOnUse" cy="3.99" cx="23.896" gradientTransform="matrix(0 2.2875 -3.0194 0 36.047 -50.63)" r="20.397">
<stop id="stop2778" style="stop-color:#8badea" offset="0"/>
<stop id="stop2780" style="stop-color:#6396cd" offset=".26238"/>
<stop id="stop2782" style="stop-color:#3b7caf" offset=".66094"/>
<stop id="stop2784" style="stop-color:#194c70" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient2412" y2="3.0816" gradientUnits="userSpaceOnUse" x2="18.379" gradientTransform="matrix(.95844 0 0 .95844 .99752 1.9975)" y1="44.98" x1="18.379">
<stop id="stop2788" style="stop-color:#1f4b6a" offset="0"/>
<stop id="stop2790" style="stop-color:#4083c2" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient2415" gradientUnits="userSpaceOnUse" cy="4.625" cx="62.625" gradientTransform="matrix(2.1647 0 0 .75294 -111.56 36.518)" r="10.625">
<stop id="stop8840" offset="0"/>
<stop id="stop8842" style="stop-opacity:0" offset="1"/>
</radialGradient>
</defs>
<path id="path8836" style="opacity:.3;fill-rule:evenodd;fill:url(#radialGradient2415)" d="m47 40c0 4.418-10.297 8-23 8s-23-3.582-23-8 10.297-8 23-8 23 3.582 23 8z"/>
<path id="path2555" style="stroke-linejoin:round;stroke:url(#linearGradient2412);stroke-linecap:round;stroke-width:1.0037;fill:url(#radialGradient2410)" d="m24 5.5018c-10.758 0-19.498 8.7402-19.498 19.498-0.0002 10.758 8.74 19.498 19.498 19.498s19.498-8.74 19.498-19.498-8.74-19.498-19.498-19.498z"/>
<path id="path8655" style="opacity:.4;stroke:url(#linearGradient2407);fill:none" d="m42.5 24.999c0 10.218-8.283 18.501-18.5 18.501s-18.5-8.283-18.5-18.501c0-10.217 8.283-18.499 18.5-18.499s18.5 8.282 18.5 18.499z"/>
<path id="path9053" style="opacity:.2" d="m24.91 30.164c-0.066-2.359 0.463-4.649 2.691-6.271 2.354-1.834 4.621-4.129 4.382-6.835-0.053-2.609-3.093-4.653-6.368-4.947-3.684-0.511-8.142 0.751-9.377 3.629-0.626 1.399-0.045 3.91 2.056 3.91 1.229 0 1.794-0.794 1.887-1.521 0.07-0.549-0.156-1.04-0.289-1.494-0.152-0.517 0.496-1.519 1.202-1.928 0.59-0.341 1.207-0.455 1.298-0.477 2.118-0.509 4.229 0.615 5.11 1.984 0.881 1.368-0.088 3.444-1.482 5.463-1.395 2.018-2.891 4.311-2.885 6.746 0 0.928-0.082 1.243-0.024 1.618 0.047 0.299 1.039 0.263 1.799 0.123zm-0.966 3.174c-2.025-0.11-3.427 2.186-2.211 3.649 1.087 1.615 4.133 1.217 4.656-0.612 0.542-1.423-0.764-3.06-2.445-3.037z"/>
<path id="path3298" style="fill:#fff" d="m24.91 31.164c-0.066-2.359 0.463-4.649 2.691-6.271 2.354-1.834 4.621-4.129 4.382-6.835-0.053-2.609-3.093-4.653-6.368-4.947-3.684-0.511-8.142 0.751-9.377 3.629-0.626 1.399-0.045 3.91 2.056 3.91 1.229 0 1.794-0.794 1.887-1.521 0.07-0.549-0.156-1.04-0.289-1.494-0.152-0.517 0.496-1.519 1.202-1.928 0.59-0.341 1.207-0.455 1.298-0.477 2.118-0.509 4.229 0.615 5.11 1.984 0.881 1.368-0.088 3.444-1.482 5.463-1.395 2.018-2.891 4.311-2.885 6.746 0 0.928-0.082 1.243-0.024 1.618 0.047 0.299 1.039 0.263 1.799 0.123zm-0.966 3.174c-2.025-0.11-3.427 2.186-2.211 3.649 1.087 1.615 4.133 1.217 4.656-0.612 0.542-1.423-0.764-3.06-2.445-3.037z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg2515" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs id="defs2517">
<radialGradient id="radialGradient2415" gradientUnits="userSpaceOnUse" cy="4.625" cx="62.625" gradientTransform="matrix(2.1647 0 0 .75294 -111.56 36.518)" r="10.625">
<stop id="stop8840" offset="0"/>
<stop id="stop8842" style="stop-opacity:0" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient2412" y2="3.0816" gradientUnits="userSpaceOnUse" x2="18.379" gradientTransform="matrix(.95844 0 0 .95844 .99752 1.9975)" y1="44.98" x1="18.379">
<stop id="stop2788" style="stop-color:#1f4b6a" offset="0"/>
<stop id="stop2790" style="stop-color:#4083c2" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient2410" gradientUnits="userSpaceOnUse" cy="3.99" cx="23.896" gradientTransform="matrix(0 2.2875 -3.0194 0 36.047 -50.63)" r="20.397">
<stop id="stop2778" style="stop-color:#8badea" offset="0"/>
<stop id="stop2780" style="stop-color:#6396cd" offset=".26238"/>
<stop id="stop2782" style="stop-color:#3b7caf" offset=".66094"/>
<stop id="stop2784" style="stop-color:#194c70" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient2407" y2="5.4676" gradientUnits="userSpaceOnUse" x2="63.397" gradientTransform="matrix(2.1154 0 0 2.1153 -107.58 32.427)" y1="-12.489" x1="63.397">
<stop id="stop4875" style="stop-color:#fff" offset="0"/>
<stop id="stop4877" style="stop-color:#fff;stop-opacity:0" offset="1"/>
</linearGradient>
</defs>
<g id="layer1">
<path id="path8836" style="opacity:.3;fill-rule:evenodd;fill:url(#radialGradient2415)" d="m47 40c0 4.418-10.297 8-23 8s-23-3.582-23-8 10.297-8 23-8 23 3.582 23 8z"/>
<path id="path2555" style="stroke-linejoin:round;stroke:url(#linearGradient2412);stroke-linecap:round;stroke-width:1.0037;fill:url(#radialGradient2410)" d="m24 5.5018c-10.758 0-19.498 8.7402-19.498 19.498-0.0002 10.758 8.74 19.498 19.498 19.498s19.498-8.74 19.498-19.498-8.74-19.498-19.498-19.498z"/>
<path id="path8655" style="opacity:.4;stroke:url(#linearGradient2407);fill:none" d="m42.5 24.999c0 10.218-8.283 18.501-18.5 18.501s-18.5-8.283-18.5-18.501c0-10.217 8.283-18.499 18.5-18.499s18.5 8.282 18.5 18.499z"/>
<g id="g3243" transform="translate(51.075 .56862)">
<path id="path3295" style="opacity:.2" d="m-29.451 12.554c0.563 5.5 1.208 10.961 1.687 16.482h1.53c0.397-5.302 1.038-10.571 1.501-15.867 0.236-1.254-0.408-2.742-1.732-3.047-1.308-0.3824-2.77 0.565-2.944 1.918-0.029 0.17-0.042 0.342-0.042 0.514zm-0.167 22.359c-0.059 1.637 1.742 2.92 3.28 2.401 1.489-0.38 2.274-2.252 1.51-3.583-0.683-1.375-2.687-1.829-3.84-0.776-0.582 0.479-0.968 1.194-0.95 1.958z"/>
<path id="text2315" style="fill:#fff" d="m-29.451 13.555c0.563 5.499 1.208 10.96 1.687 16.481h1.53c0.397-5.301 1.038-10.571 1.501-15.866 0.236-1.254-0.408-2.743-1.732-3.048-1.308-0.382-2.77 0.565-2.944 1.918-0.029 0.17-0.042 0.342-0.042 0.515zm-0.167 22.358c-0.059 1.637 1.742 2.921 3.28 2.402 1.489-0.381 2.274-2.253 1.51-3.584-0.683-1.375-2.687-1.828-3.84-0.776-0.582 0.479-0.968 1.194-0.95 1.958z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg2405" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs id="defs2407">
<radialGradient id="radialGradient2177" gradientUnits="userSpaceOnUse" cy="35.127" cx="23.071" gradientTransform="matrix(.91481 .012650 -.0082150 .21356 2.2539 27.189)" r="10.319">
<stop id="stop2093" offset="0"/>
<stop id="stop2095" style="stop-opacity:0" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient2181" y2="32.85" gradientUnits="userSpaceOnUse" x2="16.145" gradientTransform="matrix(1.0318 -1.0287 1.0318 1.0287 -26.553 23.964)" y1="17.13" x1="31.865">
<stop id="stop7918" style="stop-color:#fff" offset="0"/>
<stop id="stop7920" style="stop-color:#fff;stop-opacity:.34021" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient2179" y2="46.421" gradientUnits="userSpaceOnUse" x2="34.163" gradientTransform="matrix(1.0318 -1.0287 1.0318 1.0287 -59.146 28.538)" y1="30.701" x1="49.882">
<stop id="stop1324" style="stop-color:#b4b4b4" offset="0"/>
<stop id="stop1326" style="stop-color:#505050" offset="1"/>
</linearGradient>
</defs>
<g id="layer1">
<path id="path1361" style="opacity:.25571;fill:url(#radialGradient2177)" d="m33.278 34.941a10.319 2.3202 0 1 1 -20.639 0 10.319 2.3202 0 1 1 20.639 0z" transform="matrix(2.3012 0 0 1.919 -28.833 -24.805)"/>
<path id="text1314" style="stroke-linejoin:round;stroke:#4d4d4d;stroke-width:.98170;fill:#555753" d="m41.892 35.011-10.392-10.017 10-10.494-7.209-6.5-10.291 10-10.5-10-7.5 6.739 10.5 10.212-10.5 10.049 7.5 7 10.488-10.5 10.512 10.5 7.392-6.989z"/>
<path id="path7076" style="opacity:.40860;stroke-linejoin:round;stroke:url(#linearGradient2181);stroke-width:.98170;fill:url(#linearGradient2179)" d="m40.5 35-10.5-10 10-10.5-5.708-4.9586-10.292 9.9586-10.5-10-6 5.5 10.5 9.945-10.5 10.055 6 5.5 10.5-10.5 10.5 10.5 6-5.5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 436 KiB

After

Width:  |  Height:  |  Size: 438 KiB

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := fw_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES for debugging
@ -41,21 +48,6 @@ endif
FLASH_TOOL = OPENOCD
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103CBT
BOARD = STM32103CB_AHRS
MODEL = MD
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/ahrs
# Target file name (without extension).
TARGET = AHRS
# Paths
AHRS = ./
AHRSINC = $(AHRS)/inc
@ -160,7 +152,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL).S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -223,7 +215,6 @@ CDEFS = -DSTM32F10X_$(MODEL)
CDEFS += -DUSE_STDPERIPH_DRIVER
CDEFS += -DUSE_$(BOARD)
CDEFS += -DIN_AHRS
CDEFS += -DUSE_BOOTLOADER
# Place project-specific -D and/or -U options for
# Assembler with preprocessor here.
@ -299,21 +290,8 @@ LDFLAGS += -lc -lgcc
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08002000 bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08002000 bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
OOCD_CL+=-c shutdown
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -345,14 +323,6 @@ endif
endif
endif
# Program the device.
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).bin
@echo ${quote}Programming with OPENOCD${quote}
$(OOCD_EXE) $(OOCD_CL)
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -382,29 +352,33 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
.PHONY: elf lss sym hex bin bino
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
sym: $(OUTDIR)/$(TARGET).sym
hex: $(OUTDIR)/$(TARGET).hex
bin: $(OUTDIR)/$(TARGET).bin
bino: $(OUTDIR)/$(TARGET).bin.o
opfw: $(OUTDIR)/$(TARGET).opfw
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
install: $(OUTDIR)/$(TARGET).opfw
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).opfw
else
$(error INSTALL_DIR must be specified for $@)
endif
@ -445,4 +419,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program install
.PHONY : all build clean clean_list install

View File

@ -33,6 +33,7 @@
/* OpenPilot Includes */
#include "ahrs.h"
#include <pios_board_info.h>
#include "pios.h"
#include "ahrs_timer.h"
#include "ahrs_spi_comm.h"
@ -1228,6 +1229,8 @@ void homelocation_callback(AhrsObjHandle obj)
void firmwareiapobj_callback(AhrsObjHandle obj)
{
const struct pios_board_info * bdinfo = &pios_board_info_blob;
FirmwareIAPObjData firmwareIAPObj;
FirmwareIAPObjGet(&firmwareIAPObj);
if(firmwareIAPObj.ArmReset==0)
@ -1235,7 +1238,7 @@ void firmwareiapobj_callback(AhrsObjHandle obj)
if(firmwareIAPObj.ArmReset==1)
{
if((firmwareIAPObj.BoardType==BOARD_TYPE) || (firmwareIAPObj.BoardType==0xFF))
if((firmwareIAPObj.BoardType==bdinfo->board_type) || (firmwareIAPObj.BoardType==0xFF))
{
++reset_count;
@ -1247,11 +1250,11 @@ void firmwareiapobj_callback(AhrsObjHandle obj)
}
}
}
else if(firmwareIAPObj.BoardType==BOARD_TYPE && firmwareIAPObj.crc!=PIOS_BL_HELPER_CRC_Memory_Calc())
else if(firmwareIAPObj.BoardType==bdinfo->board_type && firmwareIAPObj.crc!=PIOS_BL_HELPER_CRC_Memory_Calc())
{
PIOS_BL_HELPER_FLASH_Read_Description(firmwareIAPObj.Description,SIZE_OF_DESCRIPTION);
PIOS_BL_HELPER_FLASH_Read_Description(firmwareIAPObj.Description,bdinfo->desc_size);
firmwareIAPObj.crc=PIOS_BL_HELPER_CRC_Memory_Calc();
firmwareIAPObj.BoardRevision=BOARD_REVISION;
firmwareIAPObj.BoardRevision=bdinfo->board_rev;
FirmwareIAPObjSet(&firmwareIAPObj);
}
}

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := bl_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES for debugging
@ -41,23 +48,6 @@ endif
FLASH_TOOL = OPENOCD
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103CBT
BOARD = STM32103CB_AHRS
MODEL = MD
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/bl_ahrs
# Target file name (without extension).
TARGET = AHRS_BL
# Paths
AHRS_BL = ./
AHRS_BLINC = $(AHRS_BL)/inc
@ -149,7 +139,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL).S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -209,6 +199,15 @@ CDEFS = -DSTM32F10X_$(MODEL)
CDEFS += -DUSE_STDPERIPH_DRIVER
CDEFS += -DUSE_$(BOARD)
# Provide (only) the bootloader with board-specific defines
BLONLY_CDEFS += -DBOARD_TYPE=$(BOARD_TYPE)
BLONLY_CDEFS += -DBOARD_REVISION=$(BOARD_REVISION)
BLONLY_CDEFS += -DHW_TYPE=$(HW_TYPE)
BLONLY_CDEFS += -DBOOTLOADER_VERSION=$(BOOTLOADER_VERSION)
BLONLY_CDEFS += -DFW_BANK_BASE=$(FW_BANK_BASE)
BLONLY_CDEFS += -DFW_BANK_SIZE=$(FW_BANK_SIZE)
BLONLY_CDEFS += -DFW_DESC_SIZE=$(FW_DESC_SIZE)
# Place project-specific -D and/or -U options for
# Assembler with preprocessor here.
#ADEFS = -DUSE_IRQ_ASM_WRAPPER
@ -243,8 +242,9 @@ CFLAGS += -O$(OPT)
ifeq ($(DEBUG),NO)
CFLAGS += -fdata-sections -ffunction-sections
endif
CFLAGS += -mcpu=$(MCU) -mthumb
CFLAGS += -mcpu=$(MCU)
CFLAGS += $(CDEFS)
CFLAGS += $(BLONLY_CDEFS)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -I.
CFLAGS += -mapcs-frame
@ -266,7 +266,7 @@ CONLYFLAGS += $(CSTANDARD)
# Assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlns: create listing
ASFLAGS = -mcpu=$(MCU) -mthumb -I. -x assembler-with-cpp
ASFLAGS = -mcpu=$(MCU) -I. -x assembler-with-cpp
ASFLAGS += $(ADEFS)
ASFLAGS += -Wa,-adhlns=$(addprefix $(OUTDIR)/, $(notdir $(addsuffix .lst, $(basename $<))))
ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
@ -291,20 +291,8 @@ LDFLAGS += -lc -lgcc
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_BL_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08000000 bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08000000 bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
OOCD_CL+=-c shutdown
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -336,14 +324,6 @@ endif
endif
endif
# Program the device.
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).bin
@echo "Programming with OPENOCD"
$(OOCD_EXE) $(OOCD_CL)
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -373,6 +353,9 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
@ -383,8 +366,6 @@ bino: $(OUTDIR)/$(TARGET).bin.o
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
@ -437,4 +418,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program install
.PHONY : all build clean clean_list install

View File

@ -33,6 +33,7 @@
/* OpenPilot Includes */
#include "ahrs_bl.h"
#include <pios_board_info.h>
#include "pios_opahrs_proto.h"
#include "bl_fsm.h" /* lfsm_state */
#include "stm32f10x_flash.h"
@ -108,6 +109,7 @@ static struct opahrs_msg_v0 link_rx_v0;
static struct opahrs_msg_v0 user_tx_v0;
static struct opahrs_msg_v0 user_rx_v0;
void process_spi_request(void) {
const struct pios_board_info * bdinfo = &pios_board_info_blob;
bool msg_to_process = FALSE;
PIOS_IRQ_Disable();
@ -166,15 +168,15 @@ void process_spi_request(void) {
break;
case OPAHRS_MSG_V0_REQ_MEM_MAP:
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_MEM_MAP);
user_tx_v0.payload.user.v.rsp.mem_map.density = HW_TYPE;
user_tx_v0.payload.user.v.rsp.mem_map.density = bdinfo->hw_type;
user_tx_v0.payload.user.v.rsp.mem_map.rw_flags = (BOARD_READABLE
| (BOARD_WRITABLA << 1));
| (BOARD_WRITABLE << 1));
user_tx_v0.payload.user.v.rsp.mem_map.size_of_code_memory
= SIZE_OF_CODE;
= bdinfo->fw_size;
user_tx_v0.payload.user.v.rsp.mem_map.size_of_description
= SIZE_OF_DESCRIPTION;
= bdinfo->desc_size;
user_tx_v0.payload.user.v.rsp.mem_map.start_of_user_code
= START_OF_USER_CODE;
= bdinfo->fw_base;
lfsm_user_set_tx_v0(&user_tx_v0);
break;
case OPAHRS_MSG_V0_REQ_SERIAL:
@ -192,7 +194,7 @@ void process_spi_request(void) {
PIOS_LED_On(LED1);
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWUP_STATUS);
if (!(user_rx_v0.payload.user.v.req.fwup_data.adress
< START_OF_USER_CODE)) {
< bdinfo->fw_base)) {
for (uint8_t x = 0; x
< user_rx_v0.payload.user.v.req.fwup_data.size; ++x) {
if (FLASH_ProgramWord(
@ -250,13 +252,10 @@ void process_spi_request(void) {
return;
}
void jump_to_app() {
//while(TRUE)
//{
// PIOS_LED_Toggle(LED1);
// PIOS_DELAY_WaitmS(1000);
//}
const struct pios_board_info * bdinfo = &pios_board_info_blob;
PIOS_LED_On(LED1);
if (((*(__IO uint32_t*) START_OF_USER_CODE) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
if (((*(__IO uint32_t*) bdinfo->fw_base) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
FLASH_Lock();
RCC_APB2PeriphResetCmd(0xffffffff, ENABLE);
RCC_APB1PeriphResetCmd(0xffffffff, ENABLE);
@ -265,10 +264,10 @@ void jump_to_app() {
//_SetCNTR(0); // clear interrupt mask
//_SetISTR(0); // clear all requests
JumpAddress = *(__IO uint32_t*) (START_OF_USER_CODE + 4);
JumpAddress = *(__IO uint32_t*) (bdinfo->fw_base + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) START_OF_USER_CODE);
__set_MSP(*(__IO uint32_t*) bdinfo->fw_base);
Jump_To_Application();
} else {
boot_status = jump_failed;

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET = bu_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES to compile for debugging
@ -51,21 +58,6 @@ endif
FLASH_TOOL = OPENOCD
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103CBT
BOARD ?= NULL
MODEL ?= NULL
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = ../../../build/bootloaders/BootloaderUpdater
# Target file name (without extension).
TARGET = BL_Updater
# Paths
OPSYSTEM = .
OPSYSTEMINC = $(OPSYSTEM)/inc
@ -224,7 +216,6 @@ endif
ifeq ($(ENABLE_AUX_UART), YES)
CDEFS += -DPIOS_ENABLE_AUX_UART
endif
CDEFS += -DUSE_BOOTLOADER
# Place project-specific -D and/or -U options for
# Assembler with preprocessor here.
@ -309,9 +300,9 @@ LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08003000 bin"
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) $(START_OF_FW_CODE) bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08003000 bin"
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) $(START_OF_FW_CODE) bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
@ -364,6 +355,7 @@ program: $(OUTDIR)/$(TARGET).bin
endif
# Link: create ELF output file from object files.
BLOBJ := $(TOP)/build/bl_$(BOARD_NAME)/bl_$(BOARD_NAME).bin.o
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ) $(BLOBJ)))
# Assemble: create object files from assembler source files.
@ -392,14 +384,16 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
.PHONY: elf lss sym hex bin bino
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
.PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf
elf.stripped: $(OUTDIR)/$(TARGET).elf.stripped
lss: $(OUTDIR)/$(TARGET).lss
sym: $(OUTDIR)/$(TARGET).sym
hex: $(OUTDIR)/$(TARGET).hex
bin: $(OUTDIR)/$(TARGET).bin
bino: $(OUTDIR)/$(TARGET).bin.o
opfw: $(OUTDIR)/$(TARGET).opfw
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
@ -411,11 +405,11 @@ docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
install: $(OUTDIR)/$(TARGET).opfw
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).opfw
else
$(error INSTALL_DIR must be specified for $@)
endif

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := bl_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES to compile for debugging
@ -48,21 +55,6 @@ endif
FLASH_TOOL = OPENOCD
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103CBT
BOARD = STM32103CB_CC_Rev1
MODEL = MD
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/bl_coptercontrol
# Target file name (without extension).
TARGET = CopterControl_BL
# Paths
OPSYSTEM = .
OPSYSTEMINC = $(OPSYSTEM)/inc
@ -181,7 +173,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL).S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -260,6 +252,15 @@ ifeq ($(ENABLE_AUX_UART), YES)
CDEFS += -DPIOS_ENABLE_AUX_UART
endif
# Provide (only) the bootloader with board-specific defines
BLONLY_CDEFS += -DBOARD_TYPE=$(BOARD_TYPE)
BLONLY_CDEFS += -DBOARD_REVISION=$(BOARD_REVISION)
BLONLY_CDEFS += -DHW_TYPE=$(HW_TYPE)
BLONLY_CDEFS += -DBOOTLOADER_VERSION=$(BOOTLOADER_VERSION)
BLONLY_CDEFS += -DFW_BANK_BASE=$(FW_BANK_BASE)
BLONLY_CDEFS += -DFW_BANK_SIZE=$(FW_BANK_SIZE)
BLONLY_CDEFS += -DFW_DESC_SIZE=$(FW_DESC_SIZE)
# Place project-specific -D and/or -U options for
# Assembler with preprocessor here.
#ADEFS = -DUSE_IRQ_ASM_WRAPPER
@ -295,8 +296,9 @@ ifeq ($(DEBUG),NO)
CFLAGS += -ffunction-sections
endif
CFLAGS += -mcpu=$(MCU) -mthumb
CFLAGS += -mcpu=$(MCU)
CFLAGS += $(CDEFS)
CFLAGS += $(BLONLY_CDEFS)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -I.
CFLAGS += -mapcs-frame
@ -316,7 +318,7 @@ CONLYFLAGS += $(CSTANDARD)
# Assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlns: create listing
ASFLAGS = -mcpu=$(MCU) -mthumb -I. -x assembler-with-cpp
ASFLAGS = -mcpu=$(MCU) -I. -x assembler-with-cpp
ASFLAGS += $(ADEFS)
ASFLAGS += -Wa,-adhlns=$(addprefix $(OUTDIR)/, $(notdir $(addsuffix .lst, $(basename $<))))
ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
@ -341,20 +343,8 @@ LDFLAGS += -lc -lgcc
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_BL_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08000000 bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08000000 bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
OOCD_CL+=-c shutdown
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -394,14 +384,6 @@ ${OUTDIR}/InitMods.c: Makefile
@echo ${quote}${foreach MOD, ${MODNAMES}, ${MOD}Initialize();}${quote} >> ${OUTDIR}/InitMods.c
@echo ${quote}}${quote} >> ${OUTDIR}/InitMods.c
# Program the device.
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).bin
@echo ${quote}Programming with OPENOCD${quote}
$(OOCD_EXE) $(OOCD_CL)
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -431,6 +413,9 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
@ -441,8 +426,6 @@ bino: $(OUTDIR)/$(TARGET).bin.o
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
@ -495,4 +478,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program install
.PHONY : all build clean clean_list install

View File

@ -27,6 +27,7 @@
*/
/* Bootloader Includes */
#include <pios.h>
#include <pios_board_info.h>
#include "stopwatch.h"
#include "op_dfu.h"
#include "usb_lib.h"
@ -163,7 +164,9 @@ int main() {
}
void jump_to_app() {
if (((*(__IO uint32_t*) START_OF_USER_CODE) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
const struct pios_board_info * bdinfo = &pios_board_info_blob;
if (((*(__IO uint32_t*) bdinfo->fw_base) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
FLASH_Lock();
RCC_APB2PeriphResetCmd(0xffffffff, ENABLE);
RCC_APB1PeriphResetCmd(0xffffffff, ENABLE);
@ -171,10 +174,10 @@ void jump_to_app() {
RCC_APB1PeriphResetCmd(0xffffffff, DISABLE);
_SetCNTR(0); // clear interrupt mask
_SetISTR(0); // clear all requests
JumpAddress = *(__IO uint32_t*) (START_OF_USER_CODE + 4);
JumpAddress = *(__IO uint32_t*) (bdinfo->fw_base + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) START_OF_USER_CODE);
__set_MSP(*(__IO uint32_t*) bdinfo->fw_base);
Jump_To_Application();
} else {
DeviceState = failed_jump;

View File

@ -30,6 +30,7 @@
#include "pios.h"
#include "op_dfu.h"
#include "pios_bl_helper.h"
#include <pios_board_info.h>
//programmable devices
Device devicesTable[10];
uint8_t numberOfDevices = 0;
@ -382,16 +383,18 @@ void processComand(uint8_t *xReceive_Buffer) {
return;
}
void OPDfuIni(uint8_t discover) {
const struct pios_board_info * bdinfo = &pios_board_info_blob;
Device dev;
dev.programmingType = Self_flash;
dev.readWriteFlags = (BOARD_READABLE | (BOARD_WRITABLA << 1));
dev.startOfUserCode = START_OF_USER_CODE;
dev.sizeOfCode = SIZE_OF_CODE;
dev.sizeOfDescription = SIZE_OF_DESCRIPTION;
dev.BL_Version = BOOTLOADER_VERSION;
dev.readWriteFlags = (BOARD_READABLE | (BOARD_WRITABLE << 1));
dev.startOfUserCode = bdinfo->fw_base;
dev.sizeOfCode = bdinfo->fw_size;
dev.sizeOfDescription = bdinfo->desc_size;
dev.BL_Version = bdinfo->bl_rev;
dev.FW_Crc = CalcFirmCRC();
dev.devID = (BOARD_TYPE << 8) | BOARD_REVISION;
dev.devType = HW_TYPE;
dev.devID = (bdinfo->board_type << 8) | (bdinfo->board_rev);
dev.devType = bdinfo->hw_type;
numberOfDevices = 1;
devicesTable[0] = dev;
if (discover) {

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := bl_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES to compile for debugging
@ -48,21 +55,6 @@ endif
FLASH_TOOL = OPENOCD
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103RET
BOARD = STM3210E_OP
MODEL = HD
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/bl_openpilot
# Target file name (without extension).
TARGET = OpenPilot_BL
# Paths
OPSYSTEM = .
OPSYSTEMINC = $(OPSYSTEM)/inc
@ -184,7 +176,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)_OP.S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -263,6 +255,15 @@ ifeq ($(ENABLE_AUX_UART), YES)
CDEFS += -DPIOS_ENABLE_AUX_UART
endif
# Provide (only) the bootloader with board-specific defines
BLONLY_CDEFS += -DBOARD_TYPE=$(BOARD_TYPE)
BLONLY_CDEFS += -DBOARD_REVISION=$(BOARD_REVISION)
BLONLY_CDEFS += -DHW_TYPE=$(HW_TYPE)
BLONLY_CDEFS += -DBOOTLOADER_VERSION=$(BOOTLOADER_VERSION)
BLONLY_CDEFS += -DFW_BANK_BASE=$(FW_BANK_BASE)
BLONLY_CDEFS += -DFW_BANK_SIZE=$(FW_BANK_SIZE)
BLONLY_CDEFS += -DFW_DESC_SIZE=$(FW_DESC_SIZE)
# Place project-specific -D and/or -U options for
# Assembler with preprocessor here.
#ADEFS = -DUSE_IRQ_ASM_WRAPPER
@ -300,6 +301,7 @@ endif
CFLAGS += -mcpu=$(MCU)
CFLAGS += $(CDEFS)
CFLAGS += $(BLONLY_CDEFS)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -I.
CFLAGS += -mapcs-frame
@ -344,20 +346,8 @@ LDFLAGS += -lc -lgcc
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_BL_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08000000 bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08000000 bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
OOCD_CL+=-c shutdown
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -397,14 +387,6 @@ ${OUTDIR}/InitMods.c: Makefile
@echo ${quote}${foreach MOD, ${MODNAMES}, ${MOD}Initialize();}${quote} >> ${OUTDIR}/InitMods.c
@echo ${quote}}${quote} >> ${OUTDIR}/InitMods.c
# Program the device.
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).bin
@echo ${quote}Programming with OPENOCD${quote}
$(OOCD_EXE) $(OOCD_CL)
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -434,6 +416,9 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
@ -444,8 +429,6 @@ bino: $(OUTDIR)/$(TARGET).bin.o
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
@ -498,4 +481,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program install
.PHONY : all build clean clean_list install

View File

@ -27,6 +27,7 @@
*/
/* Bootloader Includes */
#include <pios.h>
#include <pios_board_info.h>
#include "pios_opahrs.h"
#include "stopwatch.h"
#include "op_dfu.h"
@ -216,7 +217,9 @@ int main() {
}
void jump_to_app() {
if (((*(__IO uint32_t*) START_OF_USER_CODE) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
const struct pios_board_info * bdinfo = &pios_board_info_blob;
if (((*(__IO uint32_t*) bdinfo->fw_base) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
FLASH_Lock();
RCC_APB2PeriphResetCmd(0xffffffff, ENABLE);
RCC_APB1PeriphResetCmd(0xffffffff, ENABLE);
@ -225,10 +228,10 @@ void jump_to_app() {
_SetCNTR(0); // clear interrupt mask
_SetISTR(0); // clear all requests
JumpAddress = *(__IO uint32_t*) (START_OF_USER_CODE + 4);
JumpAddress = *(__IO uint32_t*) (bdinfo->fw_base + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) START_OF_USER_CODE);
__set_MSP(*(__IO uint32_t*) bdinfo->fw_base);
Jump_To_Application();
} else {
DeviceState = failed_jump;

View File

@ -30,6 +30,7 @@
#include "pios.h"
#include "op_dfu.h"
#include "pios_bl_helper.h"
#include <pios_board_info.h>
#include "pios_opahrs.h"
#include "ssp.h"
/* Private typedef -----------------------------------------------------------*/
@ -447,16 +448,18 @@ void processComand(uint8_t *xReceive_Buffer) {
return;
}
void OPDfuIni(uint8_t discover) {
const struct pios_board_info * bdinfo = &pios_board_info_blob;
Device dev;
dev.programmingType = Self_flash;
dev.readWriteFlags = (BOARD_READABLE | (BOARD_WRITABLA << 1));
dev.startOfUserCode = START_OF_USER_CODE;
dev.sizeOfCode = SIZE_OF_CODE;
dev.sizeOfDescription = SIZE_OF_DESCRIPTION;
dev.BL_Version = BOOTLOADER_VERSION;
dev.readWriteFlags = (BOARD_READABLE | (BOARD_WRITABLE << 1));
dev.startOfUserCode = bdinfo->fw_base;
dev.sizeOfCode = bdinfo->fw_size;
dev.sizeOfDescription = bdinfo->desc_size;
dev.BL_Version = bdinfo->bl_rev;
dev.FW_Crc = CalcFirmCRC();
dev.devID = (BOARD_TYPE << 8) | BOARD_REVISION;
dev.devType = HW_TYPE;
dev.devID = (bdinfo->board_type << 8) | (bdinfo->board_rev);
dev.devType = bdinfo->hw_type;
numberOfDevices = 1;
devicesTable[0] = dev;
if (discover) {

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := bl_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES to compile for debugging
@ -48,21 +55,6 @@ endif
FLASH_TOOL = OPENOCD
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103CBT
BOARD = STM32103CB_PIPXTREME
MODEL = MD
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/bl_pipxtreme
# Target file name (without extension).
TARGET = PipXtreme_BL
# Paths
OPSYSTEM = .
OPSYSTEMINC = $(OPSYSTEM)/inc
@ -180,7 +172,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL).S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -259,6 +251,17 @@ ifeq ($(ENABLE_AUX_UART), YES)
CDEFS += -DPIOS_ENABLE_AUX_UART
endif
# Provide (only) the bootloader with board-specific defines
BLONLY_CDEFS += -DBOARD_TYPE=$(BOARD_TYPE)
BLONLY_CDEFS += -DBOARD_REVISION=$(BOARD_REVISION)
BLONLY_CDEFS += -DHW_TYPE=$(HW_TYPE)
BLONLY_CDEFS += -DBOOTLOADER_VERSION=$(BOOTLOADER_VERSION)
BLONLY_CDEFS += -DFW_BANK_BASE=$(FW_BANK_BASE)
BLONLY_CDEFS += -DFW_BANK_SIZE=$(FW_BANK_SIZE)
BLONLY_CDEFS += -DFW_DESC_SIZE=$(FW_DESC_SIZE)
BLONLY_CDEFS += -DEE_BANK_BASE=$(EE_BANK_BASE)
BLONLY_CDEFS += -DEE_BANK_SIZE=$(EE_BANK_SIZE)
# Place project-specific -D and/or -U options for
# Assembler with preprocessor here.
#ADEFS = -DUSE_IRQ_ASM_WRAPPER
@ -294,8 +297,9 @@ ifeq ($(DEBUG),NO)
CFLAGS += -ffunction-sections
endif
CFLAGS += -mcpu=$(MCU) -mthumb
CFLAGS += -mcpu=$(MCU)
CFLAGS += $(CDEFS)
CFLAGS += $(BLONLY_CDEFS)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -I.
CFLAGS += -mapcs-frame
@ -315,7 +319,7 @@ CONLYFLAGS += $(CSTANDARD)
# Assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlns: create listing
ASFLAGS = -mcpu=$(MCU) -mthumb -I. -x assembler-with-cpp
ASFLAGS = -mcpu=$(MCU) -I. -x assembler-with-cpp
ASFLAGS += $(ADEFS)
ASFLAGS += -Wa,-adhlns=$(addprefix $(OUTDIR)/, $(notdir $(addsuffix .lst, $(basename $<))))
ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
@ -340,20 +344,8 @@ LDFLAGS += -lc -lgcc
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_BL_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08000000 bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08000000 bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
OOCD_CL+=-c shutdown
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -393,14 +385,6 @@ ${OUTDIR}/InitMods.c: Makefile
@echo ${quote}${foreach MOD, ${MODNAMES}, ${MOD}Initialize();}${quote} >> ${OUTDIR}/InitMods.c
@echo ${quote}}${quote} >> ${OUTDIR}/InitMods.c
# Program the device.
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).bin
@echo ${quote}Programming with OPENOCD${quote}
$(OOCD_EXE) $(OOCD_CL)
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -430,6 +414,9 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
@ -440,8 +427,6 @@ bino: $(OUTDIR)/$(TARGET).bin.o
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
@ -494,4 +479,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program install
.PHONY : all build clean clean_list install

View File

@ -27,6 +27,7 @@
*/
/* Bootloader Includes */
#include <pios.h>
#include <pios_board_info.h>
#include "stopwatch.h"
#include "op_dfu.h"
#include "usb_lib.h"
@ -170,7 +171,9 @@ int main() {
}
void jump_to_app() {
if (((*(__IO uint32_t*) START_OF_USER_CODE) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
const struct pios_board_info * bdinfo = &pios_board_info_blob;
if (((*(__IO uint32_t*) bdinfo->fw_base) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
FLASH_Lock();
RCC_APB2PeriphResetCmd(0xffffffff, ENABLE);
RCC_APB1PeriphResetCmd(0xffffffff, ENABLE);
@ -179,10 +182,10 @@ void jump_to_app() {
_SetCNTR(0); // clear interrupt mask
_SetISTR(0); // clear all requests
JumpAddress = *(__IO uint32_t*) (START_OF_USER_CODE + 4);
JumpAddress = *(__IO uint32_t*) (bdinfo->fw_base + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) START_OF_USER_CODE);
__set_MSP(*(__IO uint32_t*) bdinfo->fw_base);
Jump_To_Application();
} else {
DeviceState = failed_jump;

View File

@ -30,6 +30,7 @@
#include "pios.h"
#include "op_dfu.h"
#include "pios_bl_helper.h"
#include <pios_board_info.h>
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@ -414,16 +415,18 @@ void processComand(uint8_t *xReceive_Buffer) {
return;
}
void OPDfuIni(uint8_t discover) {
const struct pios_board_info * bdinfo = &pios_board_info_blob;
Device dev;
dev.programmingType = Self_flash;
dev.readWriteFlags = (BOARD_READABLE | (BOARD_WRITABLA << 1));
dev.startOfUserCode = START_OF_USER_CODE;
dev.sizeOfCode = SIZE_OF_CODE;
dev.sizeOfDescription = SIZE_OF_DESCRIPTION;
dev.BL_Version = BOOTLOADER_VERSION;
dev.readWriteFlags = (BOARD_READABLE | (BOARD_WRITABLE << 1));
dev.startOfUserCode = bdinfo->fw_base;
dev.sizeOfCode = bdinfo->fw_size;
dev.sizeOfDescription = bdinfo->desc_size;
dev.BL_Version = bdinfo->bl_rev;
dev.FW_Crc = CalcFirmCRC();
dev.devID = (BOARD_TYPE << 8) | BOARD_REVISION;
dev.devType = HW_TYPE;
dev.devID = (bdinfo->board_type << 8) | (bdinfo->board_rev);
dev.devType = bdinfo->hw_type;
numberOfDevices = 1;
devicesTable[0] = dev;
if (discover) {

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := fw_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES to compile for debugging
@ -57,21 +64,6 @@ FLASH_TOOL = OPENOCD
# List of modules to include
MODULES = Telemetry Attitude Stabilization Actuator ManualControl FirmwareIAP
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103CBT
BOARD = STM32103CB_CC_Rev1
MODEL = MD
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/coptercontrol
# Target file name (without extension).
TARGET = CopterControl
# Paths
OPSYSTEM = ./System
OPSYSTEMINC = $(OPSYSTEM)/inc
@ -195,6 +187,7 @@ SRC += $(PIOSSTM32F10X)/pios_spektrum.c
SRC += $(PIOSSTM32F10X)/pios_debug.c
SRC += $(PIOSSTM32F10X)/pios_gpio.c
SRC += $(PIOSSTM32F10X)/pios_exti.c
SRC += $(PIOSSTM32F10X)/pios_rtc.c
SRC += $(PIOSSTM32F10X)/pios_wdg.c
@ -299,7 +292,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)_CC.S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -381,7 +374,6 @@ endif
ifeq ($(ENABLE_AUX_UART), YES)
CDEFS += -DPIOS_ENABLE_AUX_UART
endif
CDEFS += -DUSE_BOOTLOADER
ifeq ($(ERASE_FLASH), YES)
CDEFS += -DERASE_FLASH
endif
@ -475,21 +467,9 @@ LDFLAGS += -lc -lgcc
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08003000 bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08003000 bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
OOCD_CL+=-c shutdown
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
PYTHON = python
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -540,13 +520,6 @@ ${OUTDIR}/InitMods.c: Makefile
# @$(PYTHON) $(PYMITETOOLS)/pmGenPmFeatures.py $(PYMITEPLAT)/pmfeatures.py > $(OUTDIR)/pmfeatures.h
# @$(PYTHON) $(PYMITETOOLS)/pmImgCreator.py -f $(PYMITEPLAT)/pmfeatures.py -c -u -o $(OUTDIR)/pmlibusr_img.c --native-file=$(OUTDIR)/pmlibusr_nat.c $(FLIGHTPLANS)/test.py
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).bin
@echo ${quote}Programming with OPENOCD${quote}
$(OOCD_EXE) $(OOCD_CL)
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -576,29 +549,33 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
.PHONY: elf lss sym hex bin bino
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
sym: $(OUTDIR)/$(TARGET).sym
hex: $(OUTDIR)/$(TARGET).hex
bin: $(OUTDIR)/$(TARGET).bin
bino: $(OUTDIR)/$(TARGET).bin.o
opfw: $(OUTDIR)/$(TARGET).opfw
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
install: $(OUTDIR)/$(TARGET).opfw
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).opfw
else
$(error INSTALL_DIR must be specified for $@)
endif
@ -642,4 +619,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program gencode install
.PHONY : all build clean clean_list gencode install

View File

@ -64,6 +64,7 @@
#define PIOS_INCLUDE_FREERTOS
#define PIOS_INCLUDE_GPIO
#define PIOS_INCLUDE_EXTI
#define PIOS_INCLUDE_RTC
#define PIOS_INCLUDE_WDG
#define PIOS_INCLUDE_BL_HELPER
@ -92,7 +93,7 @@
/* Task stack sizes */
#define PIOS_ACTUATOR_STACK_SIZE 1020
#define PIOS_MANUAL_STACK_SIZE 724
#define PIOS_SYSTEM_STACK_SIZE 504
#define PIOS_SYSTEM_STACK_SIZE 560
#define PIOS_STABILIZATION_STACK_SIZE 524
#define PIOS_TELEM_STACK_SIZE 500

View File

@ -348,39 +348,38 @@ void PIOS_USART_spektrum_irq_handler(void)
}
#include <pios_spektrum_priv.h>
void TIM2_IRQHandler();
void TIM2_IRQHandler() __attribute__ ((alias ("PIOS_TIM2_irq_handler")));
void RTC_IRQHandler();
void RTC_IRQHandler() __attribute__ ((alias ("PIOS_SUPV_irq_handler")));
const struct pios_spektrum_cfg pios_spektrum_cfg = {
.pios_usart_spektrum_cfg = &pios_usart_spektrum_cfg,
.tim_base_init = {
.TIM_Prescaler = (PIOS_MASTER_CLOCK / 1000000) - 1, /* For 1 uS accuracy */
.TIM_ClockDivision = TIM_CKD_DIV1,
.TIM_CounterMode = TIM_CounterMode_Up,
.TIM_Period = ((1000000 / 120) - 1), //11ms-10*16b/115200bps atleast one interrupt between frames
.TIM_RepetitionCounter = 0x0000,
},
.gpio_init = { //used for bind feature
.GPIO_Mode = GPIO_Mode_Out_PP,
.GPIO_Speed = GPIO_Speed_2MHz,
},
.remap = 0,
.irq = {
.handler = TIM2_IRQHandler,
.handler = RTC_IRQHandler,
.init = {
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
.NVIC_IRQChannelSubPriority = 0,
.NVIC_IRQChannelCmd = ENABLE,
},
},
.timer = TIM2,
.port = GPIOB,
.ccr = TIM_IT_Update,
.pin = GPIO_Pin_11,
};
void PIOS_TIM2_irq_handler()
void PIOS_SUPV_irq_handler() {
if (RTC_GetITStatus(RTC_IT_SEC))
{
/* Call the right handler */
PIOS_SPEKTRUM_irq_handler(pios_usart_spektrum_id);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Clear the RTC Second interrupt */
RTC_ClearITPendingBit(RTC_IT_SEC);
}
}
#endif /* PIOS_INCLUDE_SPEKTRUM */
@ -441,14 +440,12 @@ const struct pios_servo_channel pios_servo_channels[] = {
.channel = TIM_Channel_1,
.pin = GPIO_Pin_4,
},
#ifndef PIOS_INCLUDE_SPEKTRUM
{
.timer = TIM2,
.port = GPIOA,
.channel = TIM_Channel_3,
.pin = GPIO_Pin_2,
},
#endif
};
const struct pios_servo_cfg pios_servo_cfg = {

View File

@ -25,11 +25,17 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := fw_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES for debugging
DEBUG ?= YES
USE_BOOTLOADER ?= NO
# Set to YES when using Code Sourcery toolchain
CODE_SOURCERY ?= YES
@ -42,26 +48,6 @@ endif
FLASH_TOOL = OPENOCD
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103RET
BOARD = STM3210E_INS
MODEL = HD
ifeq ($(USE_BOOTLOADER), YES)
BOOT_MODEL = $(MODEL)_BL
else
BOOT_MODEL = $(MODEL)_NB
endif
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/ins
# Target file name (without extension).
TARGET = INS
# Paths
INS = ./
INSINC = $(INS)/inc
@ -168,7 +154,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL).S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -231,9 +217,7 @@ CDEFS = -DSTM32F10X_$(MODEL)
CDEFS += -DUSE_STDPERIPH_DRIVER
CDEFS += -DUSE_$(BOARD)
CDEFS += -DIN_INS
ifeq ($(USE_BOOTLOADER), YES)
CDEFS += -DUSE_BOOTLOADER
endif
# Place project-specific -D and/or -U options for
# Assembler with preprocessor here.
#ADEFS = -DUSE_IRQ_ASM_WRAPPER
@ -311,22 +295,11 @@ LDFLAGS += $(MATH_LIB)
LDFLAGS += -lc -lgcc
# Set linker-script name depending on selected submodel name
LDFLAGS +=-T$(LINKERSCRIPTPATH)/link_$(BOARD)_$(BOOT_MODEL).ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).elf
# Program
OOCD_CL+=-c "flash write_image $(OOCD_LOADFILE)"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE)"
# reset target
OOCD_CL+=-c "reset run"
# # terminate OOCD after programming
OOCD_CL+=-c shutdown
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_sections.ld
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -358,21 +331,6 @@ endif
endif
endif
# Program the device.
ifeq ($(USE_BOOTLOADER), YES)
# Program the device with OP Upload Tool".
program: $(OUTDIR)/$(TARGET).bin
@echo ${quote}Programming with OP Upload Tool${quote}
../../ground/src/experimental/upload-build-desktop/debug/OPUploadTool -d 1 -p $(OUTDIR)/$(TARGET).bin
else
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).elf
@echo ${quote}Programming with OPENOCD${quote}
$(OOCD_EXE) $(OOCD_CL)
endif
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -400,28 +358,35 @@ $(eval $(call PARTIAL_COMPILE_TEMPLATE, SRC))
# Compile: create assembler files from C source files. ARM only
$(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
.PHONY: elf lss sym hex bin
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
sym: $(OUTDIR)/$(TARGET).sym
hex: $(OUTDIR)/$(TARGET).hex
bin: $(OUTDIR)/$(TARGET).bin
bino: $(OUTDIR)/$(TARGET).bin.o
opfw: $(OUTDIR)/$(TARGET).opfw
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
install: $(OUTDIR)/$(TARGET).opfw
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).opfw
else
$(error INSTALL_DIR must be specified for $@)
endif
@ -461,4 +426,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program install
.PHONY : all build clean clean_list install

View File

@ -27,6 +27,7 @@
#include <stdint.h>
#include "pios.h"
#include <pios_board_info.h>
#include "openpilot.h"
#include "firmwareiap.h"
#include "firmwareiapobj.h"
@ -90,10 +91,12 @@ static void resetTask(UAVObjEvent *);
int32_t FirmwareIAPInitialize()
{
data.BoardType= BOARD_TYPE;
const struct pios_board_info * bdinfo = &pios_board_info_blob;
data.BoardType= bdinfo->board_type;
PIOS_BL_HELPER_FLASH_Read_Description(data.Description,FIRMWAREIAPOBJ_DESCRIPTION_NUMELEM);
PIOS_SYS_SerialNumberGetBinary(data.CPUSerial);
data.BoardRevision= BOARD_REVISION;
data.BoardRevision= bdinfo->board_rev;
data.ArmReset=0;
data.crc = 0;
FirmwareIAPObjSet( &data );
@ -112,6 +115,7 @@ int32_t FirmwareIAPInitialize()
static uint8_t iap_state = IAP_STATE_READY;
static void FirmwareIAPCallback(UAVObjEvent* ev)
{
const struct pios_board_info * bdinfo = &pios_board_info_blob;
static uint32_t last_time = 0;
uint32_t this_time;
uint32_t delta;
@ -125,11 +129,11 @@ static void FirmwareIAPCallback(UAVObjEvent* ev)
this_time = get_time();
delta = this_time - last_time;
last_time = this_time;
if((data.BoardType==BOARD_TYPE)&&(data.crc != PIOS_BL_HELPER_CRC_Memory_Calc()))
if((data.BoardType==bdinfo->board_type)&&(data.crc != PIOS_BL_HELPER_CRC_Memory_Calc()))
{
PIOS_BL_HELPER_FLASH_Read_Description(data.Description,FIRMWAREIAPOBJ_DESCRIPTION_NUMELEM);
PIOS_SYS_SerialNumberGetBinary(data.CPUSerial);
data.BoardRevision=BOARD_REVISION;
data.BoardRevision=bdinfo->board_rev;
data.crc = PIOS_BL_HELPER_CRC_Memory_Calc();
FirmwareIAPObjSet( &data );
}

View File

@ -268,8 +268,8 @@ static void manualControlTask(void *parameters)
// Set accessory channels
cmd.Accessory1 = (settings.Accessory1 != MANUALCONTROLSETTINGS_ACCESSORY1_NONE) ? scaledChannel[settings.Accessory1] : 0;
cmd.Accessory2 = (settings.Accessory1 != MANUALCONTROLSETTINGS_ACCESSORY2_NONE) ? scaledChannel[settings.Accessory2] : 0;
cmd.Accessory3 = (settings.Accessory1 != MANUALCONTROLSETTINGS_ACCESSORY3_NONE) ? scaledChannel[settings.Accessory3] : 0;
cmd.Accessory2 = (settings.Accessory2 != MANUALCONTROLSETTINGS_ACCESSORY2_NONE) ? scaledChannel[settings.Accessory2] : 0;
cmd.Accessory3 = (settings.Accessory3 != MANUALCONTROLSETTINGS_ACCESSORY3_NONE) ? scaledChannel[settings.Accessory3] : 0;
processFlightMode(&settings, flightMode);
processArm(&cmd, &settings);

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := fw_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Set developer code and compile options
# Set to YES to compile for debugging
@ -59,21 +66,6 @@ PYMODULES = FlightPlan
#MODULES = Telemetry
#MODULES += Osd/OsdEtStd
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103RET
BOARD = STM3210E_OP
MODEL = HD
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/openpilot
# Target file name (without extension).
TARGET = OpenPilot
# Paths
OPSYSTEM = ./System
OPSYSTEMINC = $(OPSYSTEM)/inc
@ -287,7 +279,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)_OP.S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -369,7 +361,6 @@ endif
ifeq ($(ENABLE_AUX_UART), YES)
CDEFS += -DPIOS_ENABLE_AUX_UART
endif
CDEFS += -DUSE_BOOTLOADER
ifeq ($(USE_SPEKTRUM), YES)
CDEFS += -DUSE_SPEKTRUM
@ -451,22 +442,9 @@ LDFLAGS += -lc -lgcc
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08005000 bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08005000 bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
OOCD_CL+=-c shutdown
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
PYTHON = python
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -519,14 +497,6 @@ ${OUTDIR}/pmlib_img.c ${OUTDIR}/pmlib_nat.c ${OUTDIR}/pmlibusr_img.c ${OUTDIR}/p
@$(PYTHON) $(PYMITETOOLS)/pmGenPmFeatures.py $(PYMITEPLAT)/pmfeatures.py > $(OUTDIR)/pmfeatures.h
@$(PYTHON) $(PYMITETOOLS)/pmImgCreator.py -f $(PYMITEPLAT)/pmfeatures.py -c -u -o $(OUTDIR)/pmlibusr_img.c --native-file=$(OUTDIR)/pmlibusr_nat.c $(FLIGHTPLANS)/test.py
# Program the device.
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).bin
@echo ${quote}Programming with OPENOCD${quote}
$(OOCD_EXE) $(OOCD_CL)
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -556,29 +526,33 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
.PHONY: elf lss sym hex bin bino
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
sym: $(OUTDIR)/$(TARGET).sym
hex: $(OUTDIR)/$(TARGET).hex
bin: $(OUTDIR)/$(TARGET).bin
bino: $(OUTDIR)/$(TARGET).bin.o
opfw: $(OUTDIR)/$(TARGET).opfw
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
install: $(OUTDIR)/$(TARGET).opfw
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).opfw
else
$(error INSTALL_DIR must be specified for $@)
endif
@ -622,4 +596,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program gencode install
.PHONY : all build clean clean_list gencode install

View File

@ -75,7 +75,7 @@ NVIC value of 255. */
#if defined(DEBUG)
#define configGENERATE_RUN_TIME_STATS 1
#define INCLUDE_uxTaskGetRunTime 1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() PIOS_RTC_Start()
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() PIOS_RTC_Init()
// Note: Using the tick count defeats the purpose here, need some timer on the scale of 10khz
#define portGET_RUN_TIME_COUNTER_VALUE() PIOS_RTC_Counter()
#endif

View File

@ -504,39 +504,38 @@ void PIOS_USART_spektrum_irq_handler(void)
}
#include <pios_spektrum_priv.h>
void TIM6_IRQHandler();
void TIM6_IRQHandler() __attribute__ ((alias ("PIOS_TIM6_irq_handler")));
void RTC_IRQHandler();
void RTC_IRQHandler() __attribute__ ((alias ("PIOS_SUPV_irq_handler")));
const struct pios_spektrum_cfg pios_spektrum_cfg = {
.pios_usart_spektrum_cfg = &pios_usart_spektrum_cfg,
.tim_base_init = {
.TIM_Prescaler = (PIOS_MASTER_CLOCK / 1000000) - 1, /* For 1 uS accuracy */
.TIM_ClockDivision = TIM_CKD_DIV1,
.TIM_CounterMode = TIM_CounterMode_Up,
.TIM_Period = ((1000000 / 120) - 1), //11ms-10*16b/115200bps, atleast one interrupt between frames
.TIM_RepetitionCounter = 0x0000,
},
.gpio_init = { //used for bind feature
.GPIO_Mode = GPIO_Mode_Out_PP,
.GPIO_Speed = GPIO_Speed_2MHz,
},
.remap = 0,
.irq = {
.handler = TIM6_IRQHandler,
.handler = RTC_IRQHandler,
.init = {
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
.NVIC_IRQChannelSubPriority = 0,
.NVIC_IRQChannelCmd = ENABLE,
},
},
.timer = TIM6,
.port = GPIOA,
.ccr = TIM_IT_Update,
.pin = GPIO_Pin_10,
};
void PIOS_TIM6_irq_handler()
void PIOS_SUPV_irq_handler() {
if (RTC_GetITStatus(RTC_IT_SEC))
{
PIOS_SPEKTRUM_irq_handler();
/* Call the right handler */
PIOS_SPEKTRUM_irq_handler(pios_usart_spektrum_id);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Clear the RTC Second interrupt */
RTC_ClearITPendingBit(RTC_IT_SEC);
}
}
#endif /* PIOS_COM_SPEKTRUM */
@ -1049,6 +1048,7 @@ void PIOS_Board_Init(void) {
#if defined(PIOS_INCLUDE_SPEKTRUM)
/* SPEKTRUM init must come before comms */
PIOS_RTC_Init(); // Spektrum uses RTC to check for frame failures
PIOS_SPEKTRUM_Init();
if (PIOS_USART_Init(&pios_usart_spektrum_id, &pios_usart_spektrum_cfg)) {

View File

@ -64,25 +64,8 @@ TIM8 | | | |
//------------------------
// BOOTLOADER_SETTINGS
//------------------------
//#define FUNC_ID 2
//#define HW_VERSION 69
#define BOOTLOADER_VERSION 0
#define BOARD_TYPE 0x02
#define BOARD_REVISION 0x01
//#define HW_VERSION (BOARD_TYPE << 8) | BOARD_REVISION
#define MEM_SIZE 0x20000 //128K
#define SIZE_OF_DESCRIPTION 100
#define START_OF_USER_CODE (uint32_t)0x08002000
#define SIZE_OF_CODE (uint32_t)(MEM_SIZE-(START_OF_USER_CODE-0x08000000)-SIZE_OF_DESCRIPTION)
#ifdef STM32F10X_HD
#define HW_TYPE 0 //0=high_density 1=medium_density;
#elif STM32F10X_MD
#define HW_TYPE 1 //0=high_density 1=medium_density;
#endif
#define BOARD_READABLE TRUE
#define BOARD_WRITABLA TRUE
#define BOARD_WRITABLE TRUE
#define MAX_DEL_RETRYS 3
//------------------------
@ -107,11 +90,6 @@ TIM8 | | | |
//-------------------------
#define PIOS_MASTER_CLOCK 72000000
#define PIOS_PERIPHERAL_CLOCK (PIOS_MASTER_CLOCK / 2)
#if defined(USE_BOOTLOADER)
#define PIOS_NVIC_VECTTAB_FLASH (START_OF_USER_CODE)
#else
#define PIOS_NVIC_VECTTAB_FLASH ((uint32_t)0x08000000)
#endif
//-------------------------
// Interrupt Priorities

View File

@ -60,23 +60,8 @@ TIM4 | RC In 1 | Servo 3 | Servo 2 | Servo 1
//------------------------
// BOOTLOADER_SETTINGS
//------------------------
//#define FUNC_ID 2
//#define HW_VERSION 69
#define BOOTLOADER_VERSION 0
#define BOARD_TYPE 0x04
#define BOARD_REVISION 0x01
#define MEM_SIZE 0x20000 //128K
#define SIZE_OF_DESCRIPTION 100
#define START_OF_USER_CODE (uint32_t)0x08003000
#define SIZE_OF_CODE (uint32_t)(MEM_SIZE-(START_OF_USER_CODE-0x08000000)-SIZE_OF_DESCRIPTION)
#ifdef STM32F10X_HD
#define HW_TYPE 0 //0=high_density 1=medium_density;
#elif STM32F10X_MD
#define HW_TYPE 1 //0=high_density 1=medium_density;
#endif
#define BOARD_READABLE TRUE
#define BOARD_WRITABLA TRUE
#define BOARD_WRITABLE TRUE
#define MAX_DEL_RETRYS 3
@ -117,11 +102,6 @@ TIM4 | RC In 1 | Servo 3 | Servo 2 | Servo 1
//-------------------------
#define PIOS_MASTER_CLOCK 72000000
#define PIOS_PERIPHERAL_CLOCK (PIOS_MASTER_CLOCK / 2)
#if defined(USE_BOOTLOADER)
#define PIOS_NVIC_VECTTAB_FLASH (START_OF_USER_CODE)
#else
#define PIOS_NVIC_VECTTAB_FLASH ((uint32_t)0x08000000)
#endif
//-------------------------
// Interrupt Priorities

View File

@ -58,20 +58,8 @@ TIM4 | STOPWATCH |
//------------------------
// BOOTLOADER_SETTINGS
//------------------------
#define BOOTLOADER_VERSION 0
#define BOARD_TYPE 0x03
#define BOARD_REVISION 0x01
#define MEM_SIZE (0x20000 - 0x00400) // 128K - 1K (reserved for config data)
#define SIZE_OF_DESCRIPTION 100
#define START_OF_USER_CODE (uint32_t)0x08003000
#define SIZE_OF_CODE (uint32_t)(MEM_SIZE-(START_OF_USER_CODE-0x08000000)-SIZE_OF_DESCRIPTION)
#ifdef STM32F10X_HD
#define HW_TYPE 0 //0=high_density 1=medium_density;
#elif STM32F10X_MD
#define HW_TYPE 1 //0=high_density 1=medium_density;
#endif
#define BOARD_READABLE TRUE
#define BOARD_WRITABLA TRUE
#define BOARD_WRITABLE TRUE
#define MAX_DEL_RETRYS 3
@ -81,12 +69,6 @@ TIM4 | STOPWATCH |
#define PIOS_MASTER_CLOCK 72000000ul
#define PIOS_PERIPHERAL_CLOCK (PIOS_MASTER_CLOCK / 2)
#if defined(USE_BOOTLOADER)
#define PIOS_NVIC_VECTTAB_FLASH (START_OF_USER_CODE)
#else
#define PIOS_NVIC_VECTTAB_FLASH ((uint32_t)0x08000000)
#endif
// *****************************************************************
// Interrupt Priorities

View File

@ -69,27 +69,8 @@ TIM8 | | | |
//------------------------
// BOOTLOADER_SETTINGS
//------------------------
//#define FUNC_ID 1
//#define HW_VERSION 01
#define BOOTLOADER_VERSION 0
#define BOARD_TYPE 0x05 // INS board
#define BOARD_REVISION 0x01 // Beta version
//#define HW_VERSION (BOARD_TYPE << 8) | BOARD_REVISION
#define MEM_SIZE 524288 //512K
#define SIZE_OF_DESCRIPTION (uint8_t) 100
#define START_OF_USER_CODE (uint32_t)0x08005000//REMEMBER SET ALSO IN link_stm32f10x_HD_BL.ld
#define SIZE_OF_CODE (uint32_t) (MEM_SIZE-(START_OF_USER_CODE-0x08000000)-SIZE_OF_DESCRIPTION)
#ifdef STM32F10X_HD
#define HW_TYPE 0 //0=high_density 1=medium_density;
#elif STM32F10X_MD
#define HW_TYPE 1 //0=high_density 1=medium_density;
#endif
#define BOARD_READABLE TRUE
#define BOARD_WRITABLA TRUE
#define BOARD_WRITABLE TRUE
#define MAX_DEL_RETRYS 3
//------------------------
@ -176,11 +157,6 @@ extern uint32_t pios_com_aux_id;
//-------------------------
#define PIOS_MASTER_CLOCK 72000000
#define PIOS_PERIPHERAL_CLOCK (PIOS_MASTER_CLOCK / 2)
#if defined(USE_BOOTLOADER)
#define PIOS_NVIC_VECTTAB_FLASH (START_OF_USER_CODE)
#else
#define PIOS_NVIC_VECTTAB_FLASH ((uint32_t)0x08000000)
#endif
//-------------------------
// Interrupt Priorities

View File

@ -68,27 +68,8 @@ TIM8 | Servo 5 | Servo 6 | Servo 7 | Servo 8
//------------------------
// BOOTLOADER_SETTINGS
//------------------------
//#define FUNC_ID 1
//#define HW_VERSION 01
#define BOOTLOADER_VERSION 0
#define BOARD_TYPE 0x01 // OpenPilot board
#define BOARD_REVISION 0x01 // Beta version
//#define HW_VERSION (BOARD_TYPE << 8) | BOARD_REVISION
#define MEM_SIZE 524288 //512K
#define SIZE_OF_DESCRIPTION (uint8_t) 100
#define START_OF_USER_CODE (uint32_t)0x08005000//REMEMBER SET ALSO IN link_stm32f10x_HD_BL.ld
#define SIZE_OF_CODE (uint32_t) (MEM_SIZE-(START_OF_USER_CODE-0x08000000)-SIZE_OF_DESCRIPTION)
#ifdef STM32F10X_HD
#define HW_TYPE 0 //0=high_density 1=medium_density;
#elif STM32F10X_MD
#define HW_TYPE 1 //0=high_density 1=medium_density;
#endif
#define BOARD_READABLE TRUE
#define BOARD_WRITABLA TRUE
#define BOARD_WRITABLE TRUE
#define MAX_DEL_RETRYS 3
//------------------------
@ -203,11 +184,6 @@ extern uint32_t pios_com_spektrum_id;
//-------------------------
#define PIOS_MASTER_CLOCK 72000000
#define PIOS_PERIPHERAL_CLOCK (PIOS_MASTER_CLOCK / 2)
#if defined(USE_BOOTLOADER)
#define PIOS_NVIC_VECTTAB_FLASH (START_OF_USER_CODE)
#else
#define PIOS_NVIC_VECTTAB_FLASH ((uint32_t)0x08000000)
#endif
//-------------------------
// Interrupt Priorities

View File

@ -31,6 +31,7 @@
/* Project Includes */
#include "pios.h"
#if defined(PIOS_INCLUDE_BL_HELPER)
#include <pios_board_info.h>
#include "stm32f10x_flash.h"
uint8_t *PIOS_BL_HELPER_FLASH_If_Read(uint32_t SectorAddress)
@ -47,10 +48,10 @@ uint8_t PIOS_BL_HELPER_FLASH_Ini()
uint8_t PIOS_BL_HELPER_FLASH_Start()
{
uint32_t pageAdress;
pageAdress = START_OF_USER_CODE;
const struct pios_board_info * bdinfo = &pios_board_info_blob;
uint32_t pageAdress = bdinfo->fw_base;
uint8_t fail = FALSE;
while ((pageAdress < START_OF_USER_CODE + SIZE_OF_CODE + SIZE_OF_DESCRIPTION)
while ((pageAdress < (bdinfo->fw_base + bdinfo->fw_size + bdinfo->desc_size))
|| (fail == TRUE)) {
for (int retry = 0; retry < MAX_DEL_RETRYS; ++retry) {
if (FLASH_ErasePage(pageAdress) == FLASH_COMPLETE) {
@ -75,17 +76,20 @@ uint8_t PIOS_BL_HELPER_FLASH_Start()
uint32_t PIOS_BL_HELPER_CRC_Memory_Calc()
{
const struct pios_board_info * bdinfo = &pios_board_info_blob;
PIOS_BL_HELPER_CRC_Ini();
CRC_ResetDR();
CRC_CalcBlockCRC((uint32_t *) START_OF_USER_CODE, (SIZE_OF_CODE) >> 2);
CRC_CalcBlockCRC((uint32_t *) bdinfo->fw_base, (bdinfo->fw_size) >> 2);
return CRC_GetCRC();
}
void PIOS_BL_HELPER_FLASH_Read_Description(uint8_t * array, uint8_t size)
{
const struct pios_board_info * bdinfo = &pios_board_info_blob;
uint8_t x = 0;
if (size>SIZE_OF_DESCRIPTION) size = SIZE_OF_DESCRIPTION;
for (uint32_t i = START_OF_USER_CODE + SIZE_OF_CODE; i < START_OF_USER_CODE + SIZE_OF_CODE + size; ++i) {
if (size > bdinfo->desc_size) size = bdinfo->desc_size;
for (uint32_t i = bdinfo->fw_base + bdinfo->fw_size; i < bdinfo->fw_base + bdinfo->fw_size + size; ++i) {
array[x] = *PIOS_BL_HELPER_FLASH_If_Read(i);
++x;
}

View File

@ -9,8 +9,12 @@ const struct pios_board_info __attribute__((__used__)) __attribute__((__section_
.board_rev = BOARD_REVISION,
.bl_rev = BOOTLOADER_VERSION,
.hw_type = HW_TYPE,
.fw_base = START_OF_USER_CODE,
.fw_size = SIZE_OF_CODE,
.desc_base = START_OF_USER_CODE + SIZE_OF_CODE,
.desc_size = SIZE_OF_DESCRIPTION,
.fw_base = FW_BANK_BASE,
.fw_size = FW_BANK_SIZE - FW_DESC_SIZE,
.desc_base = FW_BANK_BASE + FW_BANK_SIZE - FW_DESC_SIZE,
.desc_size = FW_DESC_SIZE,
#ifdef EE_BANK_BASE
.ee_base = EE_BANK_BASE,
.ee_size = EE_BANK_SIZE,
#endif
};

View File

@ -138,7 +138,7 @@ extern void vPortYieldFromISR( void );
extern void vPortEnterCritical( void );
extern void vPortExitCritical( void );
void PIOS_RTC_Start();
void PIOS_RTC_Init();
uint32_t PIOS_RTC_Counter();
#define portDISABLE_INTERRUPTS() portSET_INTERRUPT_MASK()

View File

@ -5,6 +5,7 @@ SECTIONS
{
.text :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)

View File

@ -1,16 +1,13 @@
PROVIDE(pios_board_info_blob = ORIGIN(BD_INFO));
_estack = 0x20004FF0;
/* Section Definitions */
SECTIONS
{
.boardinfo :
{
. = ALIGN(4);
PROVIDE(pios_board_info_blob = .);
} > BD_INFO
.text :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)

View File

@ -10,6 +10,7 @@ SECTIONS
{
.text :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)

View File

@ -3,19 +3,16 @@ PROVIDE ( vPortSVCHandler = 0 ) ;
PROVIDE ( xPortPendSVHandler = 0 ) ;
PROVIDE ( xPortSysTickHandler = 0 ) ;
PROVIDE(pios_board_info_blob = ORIGIN(BD_INFO));
_estack = 0x20004FF0;
/* Section Definitions */
SECTIONS
{
.boardinfo :
{
. = ALIGN(4);
PROVIDE(pios_board_info_blob = .);
} > BD_INFO
.text :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)

View File

@ -10,6 +10,7 @@ SECTIONS
{
.text :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)

View File

@ -2,6 +2,7 @@ MEMORY
{
BL_FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x03000 - 0x00080
BD_INFO (r) : ORIGIN = 0x08003000 - 0x80, LENGTH = 0x00080
FLASH (rx) : ORIGIN = 0x08003000, LENGTH = 0x20000 - 0x03000
FLASH (rx) : ORIGIN = 0x08003000, LENGTH = 0x20000 - 0x03000 - 0x00400
EE_FLASH (rw) : ORIGIN = 0x0801FC00, LENGTH = 0x00400
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x05000
}

View File

@ -3,19 +3,16 @@ PROVIDE ( vPortSVCHandler = 0 ) ;
PROVIDE ( xPortPendSVHandler = 0 ) ;
PROVIDE ( xPortSysTickHandler = 0 ) ;
PROVIDE(pios_board_info_blob = ORIGIN(BD_INFO));
_estack = 0x20004FF0;
/* Section Definitions */
SECTIONS
{
.boardinfo :
{
. = ALIGN(4);
PROVIDE(pios_board_info_blob = .);
} > BD_INFO
.text :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)

View File

@ -1,7 +1,7 @@
/**
******************************************************************************
*
* @file link_STM3210E_INS_HD_BL.ld
* @file link_STM3210E_INS_HD_NB.ld
* @author David "Buzz" Carlson (buzz@chebuzz.com)
* The OpenPilot Team, http://www.openpilot.org Copyright (C) 2011.
* @brief PiOS linker for the OpenPilot INS board
@ -24,26 +24,11 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Memory Spaces Definitions */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x08005000, LENGTH = 492K
FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
}
_estack = 0x20004FF0;
/* This is the size of the stack for early init and for all FreeRTOS IRQs */
_irq_stack_size = 0x400;
/* Check valid alignment for VTOR */
ASSERT(ORIGIN(FLASH) == ALIGN(ORIGIN(FLASH), 0x80), "Start of memory region flash not aligned for startup vector table");
ASSERT(ORIGIN(BL_FLASH) == ALIGN(ORIGIN(BL_FLASH), 0x80), "Start of memory region flash not aligned for startup vector table");
/*
this sends all unreferenced IRQHandlers to reset
@ -208,9 +193,10 @@ SECTIONS
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
.isr_vector :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
} > BL_FLASH
/* for some STRx devices, the beginning of the startup code is stored in the .flashtext section, which goes to FLASH */
.flashtext :
@ -218,7 +204,7 @@ SECTIONS
. = ALIGN(4);
*(.flashtext) /* Startup code */
. = ALIGN(4);
} >FLASH
} > BL_FLASH
/* init sections */
@ -229,7 +215,7 @@ SECTIONS
KEEP(*(.initcalluavobj.init))
. = ALIGN(4);
__uavobj_initcall_end = .;
} >FLASH
} > BL_FLASH
/* the program code is stored in the .text section, which goes to Flash */
.text :
@ -247,7 +233,7 @@ SECTIONS
_etext = .;
/* This is used by the startup in order to initialize the .data secion */
_sidata = _etext;
} >FLASH
} > BL_FLASH
/*
@ -354,6 +340,13 @@ SECTIONS
__exidx_start = .;
__exidx_end = .;
.boardinfo :
{
. = ALIGN(4);
KEEP(*(.boardinfo))
. = ALIGN(4);
} > BD_INFO
/* after that it's only debugging information. */
/* remove the debugging information from the standard libraries */

View File

@ -0,0 +1,13 @@
/* Memory Spaces Definitions */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x10000
BL_FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x05000 - 0x00080
BD_INFO (r) : ORIGIN = 0x08005000 - 0x80, LENGTH = 0x00080
FLASH (rx) : ORIGIN = 0x08005000, LENGTH = 0x80000 - 0x05000
FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
}

View File

@ -24,21 +24,6 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Memory Spaces Definitions */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
}
_estack = 0x20004FF0;
/* This is the size of the stack for early init and for all FreeRTOS IRQs */
_irq_stack_size = 0x400;
@ -62,10 +47,10 @@ PROVIDE ( HardFault_Handler = 0 ) ;
PROVIDE ( MemManage_Handler = 0 ) ;
PROVIDE ( BusFault_Handler = 0 ) ;
PROVIDE ( UsageFault_Handler = 0 ) ;
PROVIDE ( SVC_Handler = 0 ) ;
PROVIDE ( vPortSVCHandler = 0 ) ;
PROVIDE ( DebugMon_Handler = 0 ) ;
PROVIDE ( PendSV_Handler = 0 ) ;
PROVIDE ( SysTick_Handler = 0 ) ;
PROVIDE ( xPortPendSVHandler = 0 ) ;
PROVIDE ( xPortSysTickHandler = 0 ) ;
PROVIDE ( WWDG_IRQHandler = 0 ) ;
PROVIDE ( PVD_IRQHandler = 0 ) ;
@ -199,15 +184,16 @@ PROVIDE ( SysTick = (SCS_BASE + 0x0010) ) ;
PROVIDE ( NVIC = (SCS_BASE + 0x0100) ) ;
PROVIDE ( SCB = (SCS_BASE + 0x0D00) ) ;
PROVIDE(pios_board_info_blob = ORIGIN(BD_INFO));
/* Sections Definitions */
SECTIONS
{
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
.isr_vector :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} > FLASH

View File

@ -2,7 +2,7 @@
_irq_stack_size = 0x400;
/* Check valid alignment for VTOR */
ASSERT(ORIGIN(FLASH) == ALIGN(ORIGIN(FLASH), 0x80), "Start of memory region flash not aligned for startup vector table");
ASSERT(ORIGIN(BL_FLASH) == ALIGN(ORIGIN(BL_FLASH), 0x80), "Start of memory region flash not aligned for startup vector table");
/*
this sends all unreferenced IRQHandlers to reset
@ -166,6 +166,7 @@ SECTIONS
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
.isr_vector :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} > BL_FLASH

View File

@ -158,20 +158,16 @@ PROVIDE ( SysTick = (SCS_BASE + 0x0010) ) ;
PROVIDE ( NVIC = (SCS_BASE + 0x0100) ) ;
PROVIDE ( SCB = (SCS_BASE + 0x0D00) ) ;
PROVIDE(pios_board_info_blob = ORIGIN(BD_INFO));
/* Sections Definitions */
SECTIONS
{
.boardinfo :
{
. = ALIGN(4);
PROVIDE(pios_board_info_blob = .);
} > BD_INFO
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
.isr_vector :
{
PROVIDE (pios_isr_vector_table_base = .);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH

View File

@ -104,6 +104,28 @@ int32_t PIOS_DELAY_WaitmS(uint16_t mS)
return 0;
}
/**
* @brief Query the Delay timer for the current uS
* @return A microsecond value
*/
uint16_t PIOS_DELAY_GetuS()
{
return PIOS_DELAY_TIMER->CNT;
}
/**
* @brief Compute the difference between now and a reference time
* @param[in] the reference time to compare now to
* @return The number of uS since the delay
*
* @note the user is responsible for worrying about rollover on the 16 bit uS counter
*/
int32_t PIOS_DELAY_DiffuS(uint16_t ref)
{
int32_t ret_t = ref;
return (int16_t) (PIOS_DELAY_GetuS() - ret_t);
}
#endif
/**

View File

@ -33,7 +33,11 @@
#if defined(PIOS_INCLUDE_RTC)
void PIOS_RTC_Start()
#ifndef PIOS_RTC_PRESCALAR
#define PIOS_RTC_PRESCALAR 100
#endif
void PIOS_RTC_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,
ENABLE);
@ -44,7 +48,14 @@ void PIOS_RTC_Start()
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_SetPrescaler(0); // counting at 8e6 / 128
#if defined(PIOS_INCLUDE_SPEKTRUM)
/* Enable the RTC Second interrupt */
RTC_ITConfig( RTC_IT_SEC, ENABLE );
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
#endif
RTC_SetPrescaler(PIOS_RTC_PRESCALAR); // counting at 8e6 / 128
RTC_WaitForLastTask();
RTC_SetCounter(0);
RTC_WaitForLastTask();
@ -55,6 +66,15 @@ uint32_t PIOS_RTC_Counter()
return RTC_GetCounter();
}
float PIOS_RTC_Rate()
{
return (float) (8e6 / 128) / (1 + PIOS_RTC_PRESCALAR);
}
float PIOS_RTC_MsPerTick()
{
return 1000.0f / PIOS_RTC_Rate();
}
#endif

View File

@ -41,16 +41,24 @@
#error "AUX com cannot be used with SPEKTRUM"
#endif
/**
* @Note Framesyncing:
* The code resets the watchdog timer whenever a single byte is received, so what watchdog code
* is never called if regularly getting bytes.
* RTC timer is running @625Hz, supervisor timer has divider 5 so frame sync comes every 1/125Hz=8ms.
* Good for both 11ms and 22ms framecycles
*/
/* Global Variables */
/* Local Variables, use pios_usart */
/* Local Variables */
static uint16_t CaptureValue[12],CaptureValueTemp[12];
static uint8_t prev_byte = 0xFF, sync = 0, bytecount = 0, datalength=0, frame_error=0, byte_array[20] = { 0 };
uint8_t sync_of = 0;
uint16_t supv_timer=0;
/**
* Initialise the onboard USARTs
* Bind and Initialise Spektrum satellite receiver
*/
void PIOS_SPEKTRUM_Init(void)
{
@ -59,62 +67,15 @@ void PIOS_SPEKTRUM_Init(void)
PIOS_SPEKTRUM_Bind();
}
NVIC_InitTypeDef NVIC_InitStructure = pios_spektrum_cfg.irq.init;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = pios_spektrum_cfg.tim_base_init;
/* Enable appropriate clock to timer module */
switch((int32_t) pios_spektrum_cfg.timer) {
case (int32_t)TIM1:
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
break;
case (int32_t)TIM2:
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
break;
case (int32_t)TIM3:
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
break;
case (int32_t)TIM4:
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
break;
#ifdef STM32F10X_HD
case (int32_t)TIM5:
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
break;
case (int32_t)TIM6:
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
break;
case (int32_t)TIM7:
NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
break;
case (int32_t)TIM8:
NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
break;
#endif
}
/* Init RTC supervisor timer interrupt */
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Configure timer clocks */
TIM_InternalClockConfig(pios_spektrum_cfg.timer);
TIM_TimeBaseInit(pios_spektrum_cfg.timer, &TIM_TimeBaseStructure);
/* Enable the Capture Compare Interrupt Request */
TIM_ITConfig(pios_spektrum_cfg.timer, pios_spektrum_cfg.ccr, ENABLE);
/* Clear update pending flag */
TIM_ClearFlag(pios_spektrum_cfg.timer, TIM_FLAG_Update);
/* Enable timers */
TIM_Cmd(pios_spektrum_cfg.timer, ENABLE);
/* Init RTC clock */
PIOS_RTC_Init();
}
/**
@ -263,8 +224,7 @@ int32_t PIOS_SPEKTRUM_Decode(uint8_t b)
}
/* Interrupt handler for USART */
void SPEKTRUM_IRQHandler(uint32_t usart_id)
{
void SPEKTRUM_IRQHandler(uint32_t usart_id) {
/* by always reading DR after SR make sure to clear any error interrupts */
volatile uint16_t sr = pios_spektrum_cfg.pios_usart_spektrum_cfg->regs->SR;
volatile uint8_t b = pios_spektrum_cfg.pios_usart_spektrum_cfg->regs->DR;
@ -280,34 +240,35 @@ void SPEKTRUM_IRQHandler(uint32_t usart_id)
/* Disable TXE interrupt (TXEIE=0) */
USART_ITConfig(pios_spektrum_cfg.pios_usart_spektrum_cfg->regs, USART_IT_TXE, DISABLE);
}
/* clear "watchdog" timer */
TIM_SetCounter(pios_spektrum_cfg.timer, 0);
/* byte arrived so clear "watchdog" timer */
supv_timer=0;
}
/**
* This function handles TIM6 global interrupt request.
*@brief This function is called between frames and when a spektrum word hasnt been decoded for too long
*@brief clears the channel values
*/
void PIOS_SPEKTRUM_irq_handler() {
//PIOS_SPEKTRUM_SUPV_IRQ_FUNC {
/* Clear timer interrupt pending bit */
TIM_ClearITPendingBit(pios_spektrum_cfg.timer, TIM_IT_Update);
/* 125hz */
supv_timer++;
if(supv_timer > 5) {
/* sync between frames */
sync = 0;
bytecount = 0;
prev_byte = 0xFF;
frame_error = 0;
sync_of++;
/* watchdog activated */
/* watchdog activated after 100ms silence */
if (sync_of > 12) {
/* signal lost */
sync_of = 0;
for (int i = 0; i < 12; i++)
{
for (int i = 0; i < 12; i++) {
CaptureValue[i] = 0;
CaptureValueTemp[i] = 0;
}
}
supv_timer = 0;
}
}
#endif

View File

@ -186,7 +186,8 @@ int32_t PIOS_SYS_SerialNumberGet(char *str)
void NVIC_Configuration(void)
{
/* Set the Vector Table base address as specified in .ld file */
NVIC_SetVectorTable(PIOS_NVIC_VECTTAB_FLASH, 0x0);
extern void pios_isr_vector_table_base;
NVIC_SetVectorTable((uint32_t)&pios_isr_vector_table_base, 0x0);
/* 4 bits for Interrupt priorities so no sub priorities */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

View File

@ -10,6 +10,8 @@ struct pios_board_info {
uint32_t fw_size;
uint32_t desc_base;
uint32_t desc_size;
uint32_t ee_base;
uint32_t ee_size;
} __attribute__((packed));
extern const struct pios_board_info pios_board_info_blob;

View File

@ -36,6 +36,8 @@
extern int32_t PIOS_DELAY_Init(void);
extern int32_t PIOS_DELAY_WaituS(uint16_t uS);
extern int32_t PIOS_DELAY_WaitmS(uint16_t mS);
extern uint16_t PIOS_DELAY_GetuS();
extern int32_t PIOS_DELAY_DiffuS(uint16_t ref);
#endif /* PIOS_DELAY_H */

View File

@ -27,12 +27,14 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef PIOS_SERVO_H
#define PIOS_SERVO_H
#ifndef PIOS_RTC_H
#define PIOS_RTC_H
/* Public Functions */
extern void PIOS_RTC_Start();
extern void PIOS_RTC_Init();
extern uint32_t PIOS_RTC_Counter();
extern float PIOS_RTC_Rate();
extern float PIOS_RTC_MsPerTick();
#endif /* PIOS_SERVO_H */

View File

@ -37,13 +37,10 @@
struct pios_spektrum_cfg {
const struct pios_usart_cfg * pios_usart_spektrum_cfg;
TIM_TimeBaseInitTypeDef tim_base_init;
GPIO_InitTypeDef gpio_init;
uint32_t remap; /* GPIO_Remap_* */
struct stm32_irq irq;
TIM_TypeDef * timer;
GPIO_TypeDef * port;
uint16_t ccr;
uint16_t pin;
};

View File

@ -73,6 +73,7 @@
#include <pios_irq.h>
#include <pios_adc.h>
#include <pios_servo.h>
#include <pios_rtc.h>
#include <pios_i2c.h>
#include <pios_spi.h>
#include <pios_ppm.h>

View File

@ -25,6 +25,13 @@
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
TOP := $(realpath $(WHEREAMI)/../../)
include $(TOP)/make/firmware-defs.mk
include $(TOP)/make/boards/$(BOARD_NAME)/board-info.mk
# Target file name (without extension).
TARGET := fw_$(BOARD_NAME)
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR := $(TOP)/build/$(TARGET)
# Debugging (YES/NO) ?
DEBUG ?= NO
@ -43,23 +50,6 @@ FLASH_TOOL = OPENOCD
# Include the USB files (YES/NO) ?
USE_USB = YES
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define
# - BOARD just passed as define (optional)
MCU = cortex-m3
CHIP = STM32F103CBT
BOARD = STM32103CB_PIPXTREME
#CHIP = STM32F103C8T
#BOARD = STM32103C8_PIPXTREME
MODEL = MD
# Directory for output files (lst, obj, dep, elf, sym, map, hex, bin etc.)
OUTDIR = $(TOP)/build/pipxtreme
# Target file name (without extension).
TARGET = PipXtreme
# Paths
HOME_DIR = ./
HOME_DIR_INC = $(HOME_DIR)/inc
@ -192,7 +182,7 @@ CPPSRCARM =
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL).S
ASRC = $(PIOSSTM32F10X)/startup_stm32f10x_$(MODEL)$(MODEL_SUFFIX).S
# List Assembler source files here which must be assembled in ARM-Mode..
ASRCARM =
@ -257,7 +247,6 @@ DEBUGF = dwarf-2
CDEFS = -DSTM32F10X_$(MODEL)
CDEFS += -DUSE_STDPERIPH_DRIVER
CDEFS += -DUSE_$(BOARD)
CDEFS += -DUSE_BOOTLOADER
# Place project-specific -D and/or -U options for
# Assembler with preprocessor here.
@ -340,20 +329,8 @@ LDFLAGS += -lc -lgcc
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_memory.ld
LDFLAGS += -T$(LINKERSCRIPTPATH)/link_$(BOARD)_sections.ld
OOCD_LOADFILE+=$(OUTDIR)/$(TARGET).bin
# Program
OOCD_CL+=-c "flash write_image erase $(OOCD_LOADFILE) 0x08003000 bin"
# Verify
OOCD_CL+=-c "verify_image $(OOCD_LOADFILE) 0x08003000 bin"
# reset target
OOCD_CL+=-c "reset run"
# terminate OOCD after programming
OOCD_CL+=-c shutdown
# Define programs and commands.
REMOVE = $(REMOVE_CMD) -f
###SHELL = sh
###COPY = cp
# List of all source files.
ALLSRC = $(ASRCARM) $(ASRC) $(SRCARM) $(SRC) $(CPPSRCARM) $(CPPSRC)
@ -385,14 +362,6 @@ endif
endif
endif
# Program the device.
ifeq ($(FLASH_TOOL),OPENOCD)
# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script".
program: $(OUTDIR)/$(TARGET).bin
@echo ${quote}Programming with OPENOCD${quote}
$(OOCD_EXE) $(OOCD_CL)
endif
# Link: create ELF output file from object files.
$(eval $(call LINK_TEMPLATE, $(OUTDIR)/$(TARGET).elf, $(ALLOBJ)))
@ -422,29 +391,33 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
.PHONY: elf lss sym hex bin bino
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE)))
.PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf
lss: $(OUTDIR)/$(TARGET).lss
sym: $(OUTDIR)/$(TARGET).sym
hex: $(OUTDIR)/$(TARGET).hex
bin: $(OUTDIR)/$(TARGET).bin
bino: $(OUTDIR)/$(TARGET).bin.o
opfw: $(OUTDIR)/$(TARGET).opfw
# Display sizes of sections.
$(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
install: $(OUTDIR)/$(TARGET).opfw
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).opfw
else
$(error INSTALL_DIR must be specified for $@)
endif
@ -486,4 +459,4 @@ else
endif
# Listing of phony targets.
.PHONY : all build clean clean_list program install
.PHONY : all build clean clean_list install

View File

@ -52,11 +52,21 @@ equals(copydata, 1) {
data_copy.commands += $(COPY_FILE) $$targetPath(\"$$[QT_INSTALL_PLUGINS]/sqldrivers/$$dll\") $$targetPath(\"$$GCS_APP_PATH/sqldrivers/$$dll\") $$addNewline()
}
# copy SDL (if available) - Simple DirectMedia Layer (www.libsdl.org)
# copy SDL - Simple DirectMedia Layer (www.libsdl.org)
# Check the wiki for SDL installation, it should be copied first
# (make sure that the Qt installation path below is correct)
#
# - For qt-sdk-win-opensource-2010.05.exe:
# xcopy /s /e <SDL>\bin\SDL.dll C:\Qt\2010.05\mingw\bin\SDL.dll
# xcopy /s /e <SDL>\include\SDL\* C:\Qt\2010.05\mingw\include\SDL
# xcopy /s /e <SDL>\lib\* C:\Qt\2010.05\mingw\lib
#
# - For Qt_SDK_Win_offline_v1_1_1_en.exe:
# xcopy /s /e <SDL>\bin\SDL.dll C:\QtSDK\Desktop\Qt\4.7.3\mingw\bin\SDL.dll
# xcopy /s /e <SDL>\include\SDL\* C:\QtSDK\Desktop\Qt\4.7.3\mingw\include\SDL
# xcopy /s /e <SDL>\lib\* C:\QtSDK\Desktop\Qt\4.7.3\mingw\lib
SDL_DLL = SDL.dll
exists($$targetPath(\"$$[QT_INSTALL_BINS]/../../mingw/bin/$$SDL_DLL\")) {
data_copy.commands += $(COPY_FILE) $$targetPath(\"$$[QT_INSTALL_BINS]/../../mingw/bin/$$SDL_DLL\") $$targetPath(\"$$GCS_APP_PATH/$$SDL_DLL\") $$addNewline()
}
data_copy.target = FORCE
QMAKE_EXTRA_TARGETS += data_copy

View File

@ -4,10 +4,12 @@ include(../shared/qtsingleapplication/qtsingleapplication.pri)
TEMPLATE = app
TARGET = $$GCS_APP_TARGET
DESTDIR = $$GCS_APP_PATH
QT += xml
SOURCES += main.cpp
include(../rpath.pri)
include(../libs/utils/utils.pri)
win32 {
CONFIG(debug, debug|release):LIBS *= -lExtensionSystemd -lAggregationd -lQExtSerialPortd

View File

@ -27,6 +27,7 @@
*/
#include "qtsingleapplication.h"
#include "utils/xmlconfig.h"
#include <extensionsystem/pluginmanager.h>
#include <extensionsystem/pluginspec.h>
@ -243,10 +244,10 @@ int main(int argc, char **argv)
QString locale = QLocale::system().name();
// Must be done before any QSettings class is created
QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope,
QSettings::setPath(XmlConfig::XmlSettingsFormat, QSettings::SystemScope,
QCoreApplication::applicationDirPath()+QLatin1String(SHARE_PATH));
// keep this in sync with the MainWindow ctor in coreplugin/mainwindow.cpp
QSettings settings(QSettings::IniFormat, QSettings::UserScope,
QSettings settings(XmlConfig::XmlSettingsFormat, QSettings::UserScope,
QLatin1String("OpenPilot"), QLatin1String("OpenPilotGCS"));
overrideSettings(settings, argc, argv);

View File

@ -26,6 +26,7 @@
*/
#include "pathutils.h"
#include "xmlconfig.h"
#include <stdint.h>
#include <QDebug>
@ -97,7 +98,7 @@ QString PathUtils::GetStoragePath()
{
// This routine works with "/" as the standard:
// Work out where the settings are stored on the machine
QSettings set(QSettings::IniFormat, QSettings::UserScope,QLatin1String("OpenPilot"), QLatin1String("OpenPilotGCS"));
QSettings set(XmlConfig::XmlSettingsFormat, QSettings::UserScope,QLatin1String("OpenPilot"), QLatin1String("OpenPilotGCS"));
QFileInfo f(set.fileName());
QDir dir(f.absoluteDir());

View File

@ -2,7 +2,8 @@ TEMPLATE = lib
TARGET = Utils
QT += gui \
network
network \
xml
DEFINES += QTCREATOR_UTILS_LIB
@ -45,6 +46,7 @@ SOURCES += reloadpromptutils.cpp \
pathutils.cpp \
worldmagmodel.cpp \
homelocationutil.cpp
SOURCES += xmlconfig.cpp
win32 {
SOURCES += abstractprocess_win.cpp \
@ -95,6 +97,7 @@ HEADERS += utils_global.h \
pathutils.h \
worldmagmodel.h \
homelocationutil.h
HEADERS += xmlconfig.h
FORMS += filewizardpage.ui \
projectintropage.ui \

View File

@ -38,6 +38,7 @@
#include <QRect>
#include <QSize>
#include <QPoint>
#include <QtCore/QUrl>
#define NUM_PREFIX "arr_"
@ -84,6 +85,10 @@ void XmlConfig::handleNode(QDomElement* node, QSettings::SettingsMap &map, QStri
if ( nodeName.startsWith(NUM_PREFIX) ){
nodeName.replace(NUM_PREFIX, "");
}
// Xml tags are restrictive with allowed characters,
// so we urlencode and replace % with __PCT__ on file
nodeName = nodeName.replace("__PCT__", "%");
nodeName = QUrl::fromPercentEncoding(nodeName.toAscii());
if ( nodeName == XmlConfig::rootName )
;
@ -99,7 +104,7 @@ void XmlConfig::handleNode(QDomElement* node, QSettings::SettingsMap &map, QStri
handleNode( static_cast<QDomElement*>(&child), map, path);
}
else if ( child.isText() ){
qDebug() << "Key: " << path << " Value:" << node->text();
// qDebug() << "Key: " << path << " Value:" << node->text();
map.insert(path, stringToVariant(node->text()));
}
else{
@ -123,6 +128,10 @@ bool XmlConfig::writeXmlFile(QIODevice &device, const QSettings::SettingsMap &ma
if ( elem == "" ){
continue;
}
// Xml tags are restrictive with allowed characters,
// so we urlencode and replace % with __PCT__ on file
elem = QString(QUrl::toPercentEncoding(elem));
elem = elem.replace("%", "__PCT__");
// For arrays, QT will use simple numbers as keys, which is not a valid element in XML.
// Therefore we prefixed these.
if ( elem.startsWith(NUM_PREFIX) ){
@ -236,8 +245,9 @@ QString XmlConfig::variantToString(const QVariant &v)
result = QLatin1String("@Variant(");
result += QString::fromLatin1(a.toBase64().constData());
result += QLatin1Char(')');
qDebug() << "Variant Type: " << v.type();
qDebug()<< "Variant: " << result;
// These were being much too noisy!!
//qDebug() << "Variant Type: " << v.type();
//qDebug()<< "Variant: " << result;
#else
Q_ASSERT(!"QSettings: Cannot save custom types without QDataStream support");
#endif

View File

@ -26,13 +26,18 @@
#ifndef XMLCONFIG_H
#define XMLCONFIG_H
#include "importexport_global.h"
#if defined(QTCREATOR_UTILS_LIB)
# define XMLCONFIG_EXPORT Q_DECL_EXPORT
#else
# define XMLCONFIG_EXPORT Q_DECL_IMPORT
#endif
#include <QtCore/qglobal.h>
#include <QSettings>
#include <QDomElement>
#include <QObject>
class IMPORTEXPORT_EXPORT XmlConfig : QObject
class XMLCONFIG_EXPORT XmlConfig : QObject
{
public:

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>720</width>
<height>509</height>
<height>537</height>
</rect>
</property>
<property name="windowTitle">
@ -17,7 +17,7 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab_2">
<attribute name="title">
@ -42,29 +42,6 @@
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="multiPointHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="font">
@ -152,29 +129,6 @@
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QPushButton" name="sensorNoiseHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="font">
@ -278,23 +232,6 @@ Hint: run this with engines at cruising speed.</string>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<widget class="QPushButton" name="accelBiasHelp">
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="font">
@ -368,23 +305,6 @@ Hint: run this with engines at cruising speed.</string>
<layout class="QVBoxLayout" name="gyroDriftLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_11">
<item>
<widget class="QPushButton" name="gyroDriftHelp">
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="font">
@ -580,29 +500,6 @@ p, li { white-space: pre-wrap; }
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QHBoxLayout" name="ahrsSettingsLayout">
<item>
<widget class="QPushButton" name="insAlgorithmHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
@ -638,29 +535,6 @@ p, li { white-space: pre-wrap; }
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="homeLocationHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="font">
@ -757,7 +631,7 @@ new home location unless it is in indoor mode.</string>
</spacer>
</item>
<item>
<widget class="QPushButton" name="commandHelp">
<widget class="QPushButton" name="ahrsHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -766,16 +640,36 @@ new home location unless it is in indoor mode.</string>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="font">
<font>
<kerning>true</kerning>
</font>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
<iconset resource="../coreplugin/core.qrc">
<normaloff>:/core/images/helpicon.svg</normaloff>:/core/images/helpicon.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="shortcut">
<string>Ctrl+S</string>
</property>
<property name="default">
<bool>false</bool>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
@ -820,7 +714,7 @@ specific calibration button on top of the screen.</string>
</layout>
</widget>
<resources>
<include location="configgadget.qrc"/>
<include location="../coreplugin/core.qrc"/>
</resources>
<connections/>
<buttongroups>

View File

@ -29,29 +29,6 @@
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="acftTypeHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="font">
@ -102,7 +79,7 @@
<item>
<widget class="QStackedWidget" name="airframesWidget">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="fixedWing">
<property name="enabled">
@ -116,23 +93,6 @@
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="airplaneTypeHelp">
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
@ -172,23 +132,6 @@
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_23">
<item>
<widget class="QPushButton" name="channelAssignmentHelp">
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="font">
@ -451,23 +394,6 @@
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_15">
<item>
<widget class="QPushButton" name="throttleCurveHelp">
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_13">
<property name="font">
@ -586,29 +512,6 @@
<layout class="QVBoxLayout" name="verticalLayout_24">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QPushButton" name="multiFrameTypeHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_15">
<property name="font">
@ -650,29 +553,6 @@
<layout class="QVBoxLayout" name="verticalLayout_20">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_25">
<item>
<widget class="QPushButton" name="mixLevelHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="font">
@ -885,29 +765,6 @@ Typical value is 50% for + or X configuration on quads.</string>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="throttleCurveHelp_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_24">
<property name="font">
@ -985,7 +842,7 @@ Typical value is 50% for + or X configuration on quads.</string>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6" stretch="1,0,3">
<layout class="QHBoxLayout" name="horizontalLayout_6" stretch="1,3">
<property name="spacing">
<number>10</number>
</property>
@ -993,29 +850,6 @@ Typical value is 50% for + or X configuration on quads.</string>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_26">
<item>
<widget class="QPushButton" name="tricopterYawHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_23">
<property name="font">
@ -1085,46 +919,6 @@ Typical value is 50% for + or X configuration on quads.</string>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_26">
<item>
<widget class="QPushButton" name="motorOutputChanHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
@ -2137,19 +1931,34 @@ p, li { white-space: pre-wrap; }
</spacer>
</item>
<item>
<widget class="QPushButton" name="commandHelp">
<widget class="QPushButton" name="airframeHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
<iconset resource="../coreplugin/core.qrc">
<normaloff>:/core/images/helpicon.svg</normaloff>:/core/images/helpicon.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
@ -2196,29 +2005,6 @@ p, li { white-space: pre-wrap; }
<layout class="QVBoxLayout" name="verticalLayout_11" stretch="0,1,0,0,0,0">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_24">
<item>
<widget class="QPushButton" name="feedForwardHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_19">
<property name="font">
@ -2530,29 +2316,6 @@ p, li { white-space: pre-wrap; }
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="commandHelp_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="ffGetCurrent">
<property name="toolTip">
@ -2608,7 +2371,7 @@ p, li { white-space: pre-wrap; }
</customwidget>
</customwidgets>
<resources>
<include location="configgadget.qrc"/>
<include location="../coreplugin/core.qrc"/>
</resources>
<connections>
<connection>

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>331</width>
<height>324</height>
<width>455</width>
<height>428</height>
</rect>
</property>
<property name="windowTitle">
@ -18,29 +18,6 @@
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QPushButton" name="attitudeRotationHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="font">
@ -158,29 +135,6 @@
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QPushButton" name="attitudeCalibHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="font">
@ -284,29 +238,6 @@
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="zeroOnArmHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="zeroGyroBiasOnArming">
<property name="toolTip">
@ -363,7 +294,7 @@ arming it in that case!</string>
</spacer>
</item>
<item>
<widget class="QPushButton" name="commandHelp">
<widget class="QPushButton" name="ccAttitudeHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -372,16 +303,25 @@ arming it in that case!</string>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
<iconset resource="../coreplugin/core.qrc">
<normaloff>:/core/images/helpicon.svg</normaloff>:/core/images/helpicon.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
@ -411,23 +351,10 @@ arming it in that case!</string>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources>
<include location="configgadget.qrc"/>
<include location="../coreplugin/core.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -37,7 +37,8 @@
#include <QThread>
#include <iostream>
#include <Eigen/align-function.h>
#include <QSignalMapper>
#include <QDesktopServices>
#include <QUrl>
#include "assertions.h"
#include "calibration.h"
@ -228,25 +229,8 @@ ConfigAHRSWidget::ConfigAHRSWidget(QWidget *parent) : ConfigTaskWidget(parent)
connect(m_ahrs->startDriftCalib, SIGNAL(clicked()),this, SLOT(launchGyroDriftCalibration()));
connect(parent, SIGNAL(autopilotConnected()),this, SLOT(ahrsSettingsRequest()));
// Connect all the help buttons to signal mapper that passes button name to SLOT function
QSignalMapper* signalMapper = new QSignalMapper(this);
connect( m_ahrs->multiPointHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_ahrs->multiPointHelp, m_ahrs->multiPointHelp->objectName());
connect( m_ahrs->sensorNoiseHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_ahrs->sensorNoiseHelp, m_ahrs->sensorNoiseHelp->objectName());
connect( m_ahrs->accelBiasHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_ahrs->accelBiasHelp, m_ahrs->accelBiasHelp->objectName());
connect( m_ahrs->gyroDriftHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_ahrs->gyroDriftHelp, m_ahrs->gyroDriftHelp->objectName());
connect( m_ahrs->commandHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_ahrs->commandHelp, QString("commandHelp"));
connect( m_ahrs->insAlgorithmHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_ahrs->insAlgorithmHelp, m_ahrs->insAlgorithmHelp->objectName());
connect( m_ahrs->homeLocationHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_ahrs->homeLocationHelp, m_ahrs->homeLocationHelp->objectName());
connect(signalMapper, SIGNAL(mapped(const QString &)), parent, SLOT(showHelp(const QString &)));
// Connect the help button
connect(m_ahrs->ahrsHelp, SIGNAL(clicked()), this, SLOT(openHelp()));
}
ConfigAHRSWidget::~ConfigAHRSWidget()
@ -1222,6 +1206,11 @@ void ConfigAHRSWidget::ahrsSettingsSaveSD()
}
void ConfigAHRSWidget::openHelp()
{
QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/INS+Configuration", QUrl::StrictMode) );
}
/**
@}

View File

@ -126,6 +126,7 @@ private slots:
void enableHomeLocSave(UAVObject *obj);
void launchAHRSCalibration();
void saveAHRSCalibration();
void openHelp();
void launchAccelBiasCalibration();
void calibPhase2();
void incrementProgress();

View File

@ -34,7 +34,8 @@
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>
#include <math.h>
#include <QSignalMapper>
#include <QDesktopServices>
#include <QUrl>
/**
Helper delegate for the custom mixer editor table.
@ -193,32 +194,8 @@ ConfigAirframeWidget::ConfigAirframeWidget(QWidget *parent) : ConfigTaskWidget(p
connect(parent, SIGNAL(autopilotConnected()),this, SLOT(requestAircraftUpdate()));
// Connect all the help buttons to signal mapper that passes button name to SLOT function
QSignalMapper* signalMapper = new QSignalMapper(this);
connect( m_aircraft->acftTypeHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->acftTypeHelp, m_aircraft->acftTypeHelp->objectName());
connect( m_aircraft->airplaneTypeHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->airplaneTypeHelp, m_aircraft->airplaneTypeHelp->objectName());
connect( m_aircraft->channelAssignmentHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->channelAssignmentHelp, m_aircraft->channelAssignmentHelp->objectName());
connect( m_aircraft->commandHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->commandHelp, QString("commandHelp"));
connect( m_aircraft->throttleCurveHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->throttleCurveHelp, QString("throttleCurveHelp"));
connect( m_aircraft->multiFrameTypeHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->multiFrameTypeHelp, m_aircraft->multiFrameTypeHelp->objectName());
connect( m_aircraft->throttleCurveHelp_2, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->throttleCurveHelp_2, QString("throttleCurveHelp"));
connect( m_aircraft->tricopterYawHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->tricopterYawHelp, m_aircraft->tricopterYawHelp->objectName());
connect( m_aircraft->motorOutputChanHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->motorOutputChanHelp, m_aircraft->motorOutputChanHelp->objectName());
connect( m_aircraft->feedForwardHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->feedForwardHelp, m_aircraft->feedForwardHelp->objectName());
connect( m_aircraft->commandHelp_2, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_aircraft->commandHelp_2, QString("commandHelp"));
connect(signalMapper, SIGNAL(mapped(const QString &)), parent, SLOT(showHelp(const QString &)));
// Connect the help button
connect(m_aircraft->airframeHelp, SIGNAL(clicked()), this, SLOT(openHelp()));
}
ConfigAirframeWidget::~ConfigAirframeWidget()
@ -2161,3 +2138,9 @@ void ConfigAirframeWidget::saveAircraftUpdate()
}
void ConfigAirframeWidget::openHelp()
{
QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Airframe+configuration", QUrl::StrictMode) );
}

View File

@ -89,6 +89,7 @@ private slots:
void updateCustomThrottle1CurveValue(QList<double> list, double value);
void updateCustomThrottle2CurveValue(QList<double> list, double value);
void enableFFTest();
void openHelp();
protected:
void showEvent(QShowEvent *event);

View File

@ -30,7 +30,8 @@
#include <QMutexLocker>
#include <QMessageBox>
#include <QDebug>
#include <QSignalMapper>
#include <QDesktopServices>
#include <QUrl>
ConfigCCAttitudeWidget::ConfigCCAttitudeWidget(QWidget *parent) :
ConfigTaskWidget(parent),
@ -46,18 +47,8 @@ ConfigCCAttitudeWidget::ConfigCCAttitudeWidget(QWidget *parent) :
connect(parent, SIGNAL(autopilotConnected()),this, SLOT(getCurrentAttitudeSettings()));
getCurrentAttitudeSettings(); // The 1st time this panel is instanciated, the autopilot is already connected.
// Connect all the help buttons to signal mapper that passes button name to SLOT function
QSignalMapper* signalMapper = new QSignalMapper(this);
connect( ui->attitudeRotationHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(ui->attitudeRotationHelp, ui->attitudeRotationHelp->objectName());
connect( ui->attitudeCalibHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(ui->attitudeCalibHelp, ui->attitudeCalibHelp->objectName());
connect( ui->zeroOnArmHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(ui->zeroOnArmHelp, ui->zeroOnArmHelp->objectName());
connect( ui->commandHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(ui->commandHelp, QString("commandHelp"));
connect(signalMapper, SIGNAL(mapped(const QString &)), parent, SLOT(showHelp(const QString &)));
// Connect the help button
connect(ui->ccAttitudeHelp, SIGNAL(clicked()), this, SLOT(openHelp()));
}
ConfigCCAttitudeWidget::~ConfigCCAttitudeWidget()
@ -183,3 +174,10 @@ void ConfigCCAttitudeWidget::saveAttitudeSettings() {
UAVDataObject * obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("AttitudeSettings")));
saveObjectToSD(obj);
}
void ConfigCCAttitudeWidget::openHelp()
{
QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/CopterControl+Attitude+Configuration", QUrl::StrictMode) );
}

View File

@ -53,6 +53,7 @@ private slots:
void saveAttitudeSettings();
void applyAttitudeSettings();
void getCurrentAttitudeSettings();
void openHelp();
private:
QMutex startStop;

View File

@ -140,43 +140,5 @@ void ConfigGadgetWidget::onAutopilotConnect() {
emit autopilotConnected();
}
void ConfigGadgetWidget::showHelp(const QString &helpName)
{
// Close any previous help windows still open
if(help != 0) {
help->close();
}
// Make help windows with given filename and resize to config gadget width
help = new QTextBrowser(this);
help->setSource(QUrl::fromLocalFile( QString(Utils::PathUtils().InsertDataPath("%%DATAPATH%%help/")) +
helpName + QString(".html") ));
QSize size = help->sizeHint();
size.setWidth(this->width());
help->resize(size);
// Now catch closing events, show the window and give it focus
help->installEventFilter(this);
help->show();
help->setFocus();
}
bool ConfigGadgetWidget::eventFilter(QObject *obj, QEvent *event)
{
// If help is open and we get a close event, close the help window
// Close events currently are any key press and the mouse leaving the help window
//printf("event type: %d\n",event->type());
if(help != 0) {
if (event->type() == QEvent::Leave || event->type() == QEvent::KeyPress) {
help->close();
help=0;
return true;
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}

View File

@ -52,10 +52,6 @@ public:
public slots:
void onAutopilotConnect();
void showHelp(const QString &helpName);
private slots:
bool eventFilter(QObject *obj, QEvent *event);
signals:
void autopilotConnected();

View File

@ -35,7 +35,8 @@
#include <QtGui/QTextEdit>
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>
#include <QSignalMapper>
#include <QDesktopServices>
#include <QUrl>
ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent)
{
@ -156,16 +157,6 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent)
connect(m_config->saveRCInputToRAM, SIGNAL(clicked()), this, SLOT(sendRCInputUpdate()));
connect(m_config->getRCInputCurrent, SIGNAL(clicked()), this, SLOT(requestRCInputUpdate()));
// Flightmode panel is connected to the same as rcinput because
// the underlying object is the same!
connect(m_config->saveFmsToSD, SIGNAL(clicked()), this, SLOT(saveRCInputObject()));
connect(m_config->saveFmsToRAM, SIGNAL(clicked()), this, SLOT(sendRCInputUpdate()));
connect(m_config->getFmsCurrent, SIGNAL(clicked()), this, SLOT(requestRCInputUpdate()));
connect(m_config->saveArmToSD, SIGNAL(clicked()), this, SLOT(saveRCInputObject()));
connect(m_config->saveArmToRAM, SIGNAL(clicked()), this, SLOT(sendRCInputUpdate()));
connect(m_config->getArmCurrent, SIGNAL(clicked()), this, SLOT(requestRCInputUpdate()));
connect(parent, SIGNAL(autopilotConnected()),this, SLOT(requestRCInputUpdate()));
connect(m_config->inSlider0, SIGNAL(valueChanged(int)),this, SLOT(onInSliderValueChanged0(int)));
@ -201,29 +192,8 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent)
}
}
// Connect all the help buttons to signal mapper that passes button name to SLOT function
QSignalMapper* signalMapper = new QSignalMapper(this);
connect( m_config->receiverTypeHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->receiverTypeHelp, m_config->receiverTypeHelp->objectName());
connect( m_config->runCalibrationHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->runCalibrationHelp, m_config->runCalibrationHelp->objectName());
connect( m_config->commandHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->commandHelp, QString("commandHelp"));
connect( m_config->flightModeSwPosHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->flightModeSwPosHelp, m_config->flightModeSwPosHelp->objectName());
connect( m_config->stabilizationModePerAxis, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->stabilizationModePerAxis, m_config->stabilizationModePerAxis->objectName());
connect( m_config->commandHelp_2, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->commandHelp_2, QString("commandHelp"));
connect( m_config->armPositionHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->armPositionHelp, m_config->armPositionHelp->objectName());
connect( m_config->armingTimeoutHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->armingTimeoutHelp, m_config->armingTimeoutHelp->objectName());
connect( m_config->commandHelp_3, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->commandHelp_2, QString("commandHelp"));
connect(signalMapper, SIGNAL(mapped(const QString &)), parent, SLOT(showHelp(const QString &)));
// Connect the help button
connect(m_config->inputHelp, SIGNAL(clicked()), this, SLOT(openHelp()));
}
ConfigInputWidget::~ConfigInputWidget()
@ -322,15 +292,6 @@ void ConfigInputWidget::enableControls(bool enable)
m_config->saveRCInputToRAM->setEnabled(enable);
m_config->saveRCInputToSD->setEnabled(enable);
m_config->saveFmsToSD->setEnabled(enable);
m_config->saveFmsToRAM->setEnabled(enable);
m_config->getFmsCurrent->setEnabled(enable);
m_config->saveArmToSD->setEnabled(enable);
m_config->saveArmToRAM->setEnabled(enable);
m_config->getArmCurrent->setEnabled(enable);
m_config->doRCInputCalibration->setEnabled(enable);
m_config->ch0Assign->setEnabled(enable);
@ -719,3 +680,10 @@ void ConfigInputWidget::updateChannelInSlider(QSlider *slider, QLabel *min, QLab
slider->setValue(value);
}
}
void ConfigInputWidget::openHelp()
{
QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Input+Configuration", QUrl::StrictMode) );
}

View File

@ -90,6 +90,7 @@ private slots:
void sendRCInputUpdate();
void saveRCInputObject();
void reverseCheckboxClicked(bool state);
void openHelp();
};
#endif

View File

@ -36,7 +36,8 @@
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>
#include <QMessageBox>
#include <QSignalMapper>
#include <QDesktopServices>
#include <QUrl>
ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(parent)
{
@ -154,20 +155,8 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren
}
}
// Connect all the help buttons to signal mapper that passes button name to SLOT function
QSignalMapper* signalMapper = new QSignalMapper(this);
connect( m_config->channelRateHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->channelRateHelp, m_config->channelRateHelp->objectName());
connect( m_config->channelValuesHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->channelValuesHelp, m_config->channelValuesHelp->objectName());
connect( m_config->spinningArmedlHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->spinningArmedlHelp, m_config->spinningArmedlHelp->objectName());
connect( m_config->testOutputsHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->testOutputsHelp, m_config->testOutputsHelp->objectName());
connect( m_config->commandHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_config->commandHelp, QString("commandHelp"));
connect(signalMapper, SIGNAL(mapped(const QString &)), parent, SLOT(showHelp(const QString &)));
// Connect the help button
connect(m_config->outputHelp, SIGNAL(clicked()), this, SLOT(openHelp()));
}
ConfigOutputWidget::~ConfigOutputWidget()
@ -627,5 +616,10 @@ void ConfigOutputWidget::reverseChannel(bool state)
}
void ConfigOutputWidget::openHelp()
{
QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Output+Configuration", QUrl::StrictMode) );
}

View File

@ -87,6 +87,7 @@ private slots:
void reverseChannel(bool state);
void linkToggled(bool state);
void setSpinningArmed(bool val);
void openHelp();
};
#endif

View File

@ -32,8 +32,8 @@
#include <QtGui/QTextEdit>
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>
#include <QSignalMapper>
#include <QDesktopServices>
#include <QUrl>
ConfigStabilizationWidget::ConfigStabilizationWidget(QWidget *parent) : ConfigTaskWidget(parent)
{
@ -74,20 +74,8 @@ ConfigStabilizationWidget::ConfigStabilizationWidget(QWidget *parent) : ConfigTa
connect(m_stabilization->pitchKi, SIGNAL(valueChanged(double)), this, SLOT(updatePitchKI(double)));
connect(m_stabilization->pitchILimit, SIGNAL(valueChanged(double)), this, SLOT(updatePitchILimit(double)));
// Connect all the help buttons to signal mapper that passes button name to SLOT function
QSignalMapper* signalMapper = new QSignalMapper(this);
connect( m_stabilization->rateStabiHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_stabilization->rateStabiHelp, m_stabilization->rateStabiHelp->objectName());
connect( m_stabilization->attitudeStabiHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_stabilization->attitudeStabiHelp, m_stabilization->attitudeStabiHelp->objectName());
connect( m_stabilization->angleLimitsHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_stabilization->angleLimitsHelp, m_stabilization->angleLimitsHelp->objectName());
connect( m_stabilization->updateRealTimeHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_stabilization->updateRealTimeHelp, m_stabilization->updateRealTimeHelp->objectName());
connect( m_stabilization->commandHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_stabilization->commandHelp, m_stabilization->commandHelp->objectName());
connect(signalMapper, SIGNAL(mapped(const QString &)), parent, SLOT(showHelp(const QString &)));
// Connect the help button
connect(m_stabilization->stabilizationHelp, SIGNAL(clicked()), this, SLOT(openHelp()));
}
ConfigStabilizationWidget::~ConfigStabilizationWidget()
@ -290,3 +278,9 @@ void ConfigStabilizationWidget::realtimeUpdateToggle(bool state)
updateTimer.stop();
}
void ConfigStabilizationWidget::openHelp()
{
QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Stabilization+panel", QUrl::StrictMode) );
}

View File

@ -55,6 +55,7 @@ private slots:
void sendStabilizationUpdate();
void saveStabilizationUpdate();
void realtimeUpdateToggle(bool);
void openHelp();
void updateRateRollKP(double);
void updateRateRollKI(double);

View File

@ -32,7 +32,6 @@
#include <QtGui/QTextEdit>
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>
#include <QSignalMapper>
ConfigTelemetryWidget::ConfigTelemetryWidget(QWidget *parent) : ConfigTaskWidget(parent)
@ -54,15 +53,6 @@ ConfigTelemetryWidget::ConfigTelemetryWidget(QWidget *parent) : ConfigTaskWidget
connect(m_telemetry->getTelemetryCurrent, SIGNAL(clicked()), this, SLOT(requestTelemetryUpdate()));
connect(parent, SIGNAL(autopilotConnected()),this, SLOT(requestTelemetryUpdate()));
// Connect all the help buttons to signal mapper that passes button name to SLOT function
QSignalMapper* signalMapper = new QSignalMapper(this);
connect( m_telemetry->telemetryHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_telemetry->telemetryHelp, m_telemetry->telemetryHelp->objectName());
connect( m_telemetry->commandHelp, SIGNAL(clicked()), signalMapper, SLOT(map()) );
signalMapper->setMapping(m_telemetry->commandHelp, QString("commandHelp"));
connect(signalMapper, SIGNAL(mapped(const QString &)), parent, SLOT(showHelp(const QString &)));
}
ConfigTelemetryWidget::~ConfigTelemetryWidget()

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 436 KiB

After

Width:  |  Height:  |  Size: 438 KiB

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>617</width>
<height>395</height>
<width>557</width>
<height>462</height>
</rect>
</property>
<property name="windowTitle">
@ -17,719 +17,90 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>2</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<widget class="QWidget" name="RCInput">
<attribute name="title">
<string>RC Input</string>
</attribute>
<widget class="QLabel" name="ch0Max">
<property name="geometry">
<rect>
<x>530</x>
<y>40</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
<widget class="QLabel" name="ch0Cur">
<property name="geometry">
<rect>
<x>150</x>
<y>40</y>
<width>51</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
<widget class="QLabel" name="ch1Min">
<property name="geometry">
<rect>
<x>205</x>
<y>70</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="ch6Min">
<property name="geometry">
<rect>
<x>205</x>
<y>220</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="ch7Cur">
<property name="geometry">
<rect>
<x>150</x>
<y>250</y>
<width>51</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
<widget class="QLabel" name="ch4Max">
<property name="geometry">
<rect>
<x>530</x>
<y>160</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
<widget class="QLabel" name="ch7Min">
<property name="geometry">
<rect>
<x>205</x>
<y>250</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QPushButton" name="getRCInputCurrent">
<property name="geometry">
<rect>
<x>260</x>
<y>280</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Retrieve settings from OpenPilot</string>
</property>
<property name="text">
<string>Get Current</string>
</property>
</widget>
<widget class="QLabel" name="ch2Min">
<property name="geometry">
<rect>
<x>205</x>
<y>100</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="ch6Max">
<property name="geometry">
<rect>
<x>530</x>
<y>220</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
<widget class="QLabel" name="ch5Max">
<property name="geometry">
<rect>
<x>530</x>
<y>190</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
<widget class="QLabel" name="ch3Max">
<property name="geometry">
<rect>
<x>530</x>
<y>130</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
<widget class="QPushButton" name="saveRCInputToSD">
<property name="geometry">
<rect>
<x>460</x>
<y>280</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Be sure to set the Neutral position on all sliders before sending!
Applies and Saves all settings to SD</string>
</property>
<property name="text">
<string>Save</string>
</property>
</widget>
<widget class="QLabel" name="ch4Cur">
<property name="geometry">
<rect>
<x>150</x>
<y>160</y>
<width>51</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
<widget class="QLabel" name="ch4Min">
<property name="geometry">
<rect>
<x>205</x>
<y>160</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QPushButton" name="saveRCInputToRAM">
<property name="geometry">
<rect>
<x>360</x>
<y>280</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Send to OpenPilot but don't write in SD.
Be sure to set the Neutral position on all sliders before sending!</string>
</property>
<property name="text">
<string>Apply</string>
</property>
</widget>
<widget class="QComboBox" name="ch0Assign">
<property name="geometry">
<rect>
<x>20</x>
<y>40</y>
<width>121</width>
<height>21</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QComboBox" name="ch1Assign">
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="iconSize">
<size>
<width>16</width>
<height>16</height>
</size>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="ch1Cur">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="frame">
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="ch1Min">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="3" colspan="3">
<widget class="QSlider" name="inSlider1">
<property name="mouseTracking">
<bool>true</bool>
</property>
</widget>
<widget class="QLabel" name="ch3Min">
<property name="geometry">
<rect>
<x>205</x>
<y>130</y>
<width>36</width>
<height>17</height>
</rect>
<property name="minimum">
<number>1000</number>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
<property name="maximum">
<number>2000</number>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<property name="value">
<number>1500</number>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="ch7Max">
<property name="geometry">
<rect>
<x>530</x>
<y>250</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
<widget class="QLabel" name="ch2Cur">
<property name="geometry">
<rect>
<x>150</x>
<y>100</y>
<width>51</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
<widget class="QLabel" name="ch5Cur">
<property name="geometry">
<rect>
<x>150</x>
<y>190</y>
<width>51</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
<widget class="QLabel" name="ch5Min">
<property name="geometry">
<rect>
<x>205</x>
<y>190</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="ch1Cur">
<property name="geometry">
<rect>
<x>150</x>
<y>70</y>
<width>51</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
<widget class="QLabel" name="ch6Cur">
<property name="geometry">
<rect>
<x>150</x>
<y>220</y>
<width>51</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
<widget class="QLabel" name="ch3Cur">
<property name="geometry">
<rect>
<x>150</x>
<y>130</y>
<width>51</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
<widget class="QLabel" name="ch2Max">
<property name="geometry">
<rect>
<x>530</x>
<y>100</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="6">
<widget class="QLabel" name="ch1Max">
<property name="geometry">
<rect>
<x>530</x>
<y>70</y>
<width>36</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<family>FreeSans</family>
@ -748,15 +119,53 @@ p, li { white-space: pre-wrap; }
<string>2000</string>
</property>
</widget>
<widget class="QLabel" name="ch0Min">
<property name="geometry">
<rect>
<x>205</x>
<y>40</y>
<width>36</width>
<height>17</height>
</rect>
</item>
<item row="2" column="7">
<widget class="QCheckBox" name="ch1Rev">
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QComboBox" name="ch2Assign">
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
<pointsize>8</pointsize>
</font>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="ch2Cur">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="ch2Min">
<property name="font">
<font>
<family>FreeSans</family>
@ -778,47 +187,61 @@ p, li { white-space: pre-wrap; }
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QComboBox" name="ch1Assign">
<property name="geometry">
<rect>
<x>20</x>
<y>70</y>
<width>121</width>
<height>21</height>
</rect>
</item>
<item row="3" column="3" colspan="3">
<widget class="QSlider" name="inSlider2">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="6">
<widget class="QLabel" name="ch2Max">
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
</widget>
<widget class="QComboBox" name="ch2Assign">
<property name="geometry">
<rect>
<x>20</x>
<y>100</y>
<width>121</width>
<height>21</height>
</rect>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
<pointsize>8</pointsize>
</font>
<property name="text">
<string>2000</string>
</property>
</widget>
</item>
<item row="3" column="7">
<widget class="QCheckBox" name="ch2Rev">
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QComboBox" name="ch3Assign">
<property name="geometry">
<rect>
<x>20</x>
<y>130</y>
<width>121</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
@ -826,15 +249,107 @@ p, li { white-space: pre-wrap; }
</font>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="ch3Cur">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="ch3Min">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="3" colspan="3">
<widget class="QSlider" name="inSlider3">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="4" column="6">
<widget class="QLabel" name="ch3Max">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
</item>
<item row="4" column="7">
<widget class="QCheckBox" name="ch3Rev">
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QComboBox" name="ch4Assign">
<property name="geometry">
<rect>
<x>20</x>
<y>160</y>
<width>121</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
@ -842,15 +357,107 @@ p, li { white-space: pre-wrap; }
</font>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="ch4Cur">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="ch4Min">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="3" colspan="3">
<widget class="QSlider" name="inSlider4">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QLabel" name="ch4Max">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
</item>
<item row="5" column="7">
<widget class="QCheckBox" name="ch4Rev">
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QComboBox" name="ch5Assign">
<property name="geometry">
<rect>
<x>20</x>
<y>190</y>
<width>121</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
@ -858,15 +465,107 @@ p, li { white-space: pre-wrap; }
</font>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLabel" name="ch5Cur">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QLabel" name="ch5Min">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="6" column="3" colspan="3">
<widget class="QSlider" name="inSlider5">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="6" column="6">
<widget class="QLabel" name="ch5Max">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
</item>
<item row="6" column="7">
<widget class="QCheckBox" name="ch5Rev">
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QComboBox" name="ch6Assign">
<property name="geometry">
<rect>
<x>20</x>
<y>220</y>
<width>121</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
@ -874,15 +573,107 @@ p, li { white-space: pre-wrap; }
</font>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QLabel" name="ch6Cur">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QLabel" name="ch6Min">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="7" column="3" colspan="3">
<widget class="QSlider" name="inSlider6">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="7" column="6">
<widget class="QLabel" name="ch6Max">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
</item>
<item row="7" column="7">
<widget class="QCheckBox" name="ch6Rev">
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QComboBox" name="ch7Assign">
<property name="geometry">
<rect>
<x>20</x>
<y>250</y>
<width>121</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
@ -890,15 +681,107 @@ p, li { white-space: pre-wrap; }
</font>
</property>
</widget>
<widget class="QCheckBox" name="doRCInputCalibration">
<property name="geometry">
<rect>
<x>40</x>
<y>283</y>
<width>181</width>
<height>22</height>
</rect>
</item>
<item row="8" column="1">
<widget class="QLabel" name="ch7Cur">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item row="8" column="2">
<widget class="QLabel" name="ch7Min">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="8" column="3" colspan="3">
<widget class="QSlider" name="inSlider7">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="8" column="6">
<widget class="QLabel" name="ch7Max">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
</item>
<item row="8" column="7">
<widget class="QCheckBox" name="ch7Rev">
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="9" column="0" colspan="2">
<widget class="QCheckBox" name="doRCInputCalibration">
<property name="font">
<font>
<weight>75</weight>
@ -916,15 +799,144 @@ Neutral should be put at the bottom of the slider for the throttle.</string>
<string>Run Calibration</string>
</property>
</widget>
<widget class="QLabel" name="RCInputConnected">
<property name="geometry">
<rect>
<x>260</x>
<y>0</y>
<width>291</width>
<height>41</height>
</rect>
</item>
<item row="10" column="0" colspan="8">
<widget class="QLabel" name="label_20">
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt; font-weight:600; color:#ff0000;&quot;&gt;BEWARE: make sure your engines are not connected when running calibration!&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="7">
<widget class="QLabel" name="label">
<property name="text">
<string>Rev.</string>
</property>
</widget>
</item>
<item row="1" column="7">
<widget class="QCheckBox" name="ch0Rev">
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="6">
<widget class="QLabel" name="ch0Max">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Maximum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>2000</string>
</property>
</widget>
</item>
<item row="1" column="3" colspan="3">
<widget class="QSlider" name="inSlider0">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="ch0Min">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Minimum channel pulse width&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(microseconds)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="ch0Cur">
<property name="font">
<font>
<family>FreeSans</family>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;Current channel value.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QComboBox" name="ch0Assign">
<property name="font">
<font>
<family>MS Shell Dlg 2</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="iconSize">
<size>
<width>16</width>
<height>16</height>
</size>
</property>
<property name="frame">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="3" colspan="4">
<widget class="QLabel" name="RCInputConnected">
<property name="font">
<font>
<pointsize>11</pointsize>
@ -942,15 +954,9 @@ Neutral should be put at the bottom of the slider for the throttle.</string>
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QComboBox" name="receiverType">
<property name="geometry">
<rect>
<x>140</x>
<y>10</y>
<width>91</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>Select the receiver type here:
- PWM is the most usual type
@ -958,15 +964,9 @@ Neutral should be put at the bottom of the slider for the throttle.</string>
- Spektrum is used with Spektrum 'satellite' receivers</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>20</x>
<y>10</y>
<width>111</width>
<height>17</height>
</rect>
</property>
<property name="font">
<font>
<weight>75</weight>
@ -980,526 +980,17 @@ Neutral should be put at the bottom of the slider for the throttle.</string>
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_20">
<property name="geometry">
<rect>
<x>20</x>
<y>310</y>
<width>561</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:600; color:#ff0000;&quot;&gt;BEWARE: make sure your engines are not connected when running calibration!&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QSlider" name="inSlider0">
<property name="geometry">
<rect>
<x>250</x>
<y>40</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSlider" name="inSlider1">
<property name="geometry">
<rect>
<x>250</x>
<y>70</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSlider" name="inSlider2">
<property name="geometry">
<rect>
<x>250</x>
<y>100</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSlider" name="inSlider3">
<property name="geometry">
<rect>
<x>250</x>
<y>130</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSlider" name="inSlider4">
<property name="geometry">
<rect>
<x>250</x>
<y>160</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSlider" name="inSlider5">
<property name="geometry">
<rect>
<x>250</x>
<y>190</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSlider" name="inSlider6">
<property name="geometry">
<rect>
<x>250</x>
<y>220</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSlider" name="inSlider7">
<property name="geometry">
<rect>
<x>250</x>
<y>250</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="minimum">
<number>1000</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1500</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QCheckBox" name="ch0Rev">
<property name="geometry">
<rect>
<x>560</x>
<y>40</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>560</x>
<y>20</y>
<width>31</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Rev.</string>
</property>
</widget>
<widget class="QCheckBox" name="ch1Rev">
<property name="geometry">
<rect>
<x>560</x>
<y>70</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QCheckBox" name="ch2Rev">
<property name="geometry">
<rect>
<x>560</x>
<y>100</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QCheckBox" name="ch3Rev">
<property name="geometry">
<rect>
<x>560</x>
<y>130</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QCheckBox" name="ch4Rev">
<property name="geometry">
<rect>
<x>560</x>
<y>160</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QCheckBox" name="ch5Rev">
<property name="geometry">
<rect>
<x>560</x>
<y>190</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QCheckBox" name="ch6Rev">
<property name="geometry">
<rect>
<x>560</x>
<y>220</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QCheckBox" name="ch7Rev">
<property name="geometry">
<rect>
<x>560</x>
<y>250</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string>Check this to reverse the channel.
(Useful for transmitters without channel
reversal capabilities).</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QPushButton" name="commandHelp">
<property name="geometry">
<rect>
<x>230</x>
<y>284</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
<widget class="QPushButton" name="runCalibrationHelp">
<property name="geometry">
<rect>
<x>10</x>
<y>284</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
<widget class="QPushButton" name="receiverTypeHelp">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Flight Mode Switch Settings</string>
</attribute>
<widget class="QPushButton" name="getFmsCurrent">
<property name="geometry">
<rect>
<x>270</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Retrieve settings from OpenPilot</string>
</property>
<property name="text">
<string>Get Current</string>
</property>
</widget>
<widget class="QPushButton" name="saveFmsToRAM">
<property name="geometry">
<rect>
<x>380</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Send to OpenPilot but don't write in SD.
Be sure to set the Neutral position on all sliders before sending!</string>
</property>
<property name="text">
<string>Apply</string>
</property>
</widget>
<widget class="QPushButton" name="saveFmsToSD">
<property name="geometry">
<rect>
<x>490</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Be sure to set the Neutral position on all sliders before sending!
Applies and Saves all settings to SD</string>
</property>
<property name="text">
<string>Save</string>
</property>
</widget>
<widget class="QLabel" name="label_15">
<property name="geometry">
<rect>
<x>390</x>
<x>310</x>
<y>10</y>
<width>201</width>
<height>17</height>
@ -1518,7 +1009,7 @@ Applies and Saves all settings to SD</string>
<widget class="QLabel" name="label_16">
<property name="geometry">
<rect>
<x>390</x>
<x>310</x>
<y>30</y>
<width>201</width>
<height>17</height>
@ -1760,87 +1251,6 @@ if you have not done so already.</string>
</property>
</widget>
</widget>
<widget class="QPushButton" name="flightModeSwPosHelp">
<property name="geometry">
<rect>
<x>5</x>
<y>0</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
<widget class="QPushButton" name="stabilizationModePerAxis">
<property name="geometry">
<rect>
<x>5</x>
<y>130</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
<widget class="QPushButton" name="commandHelp_2">
<property name="geometry">
<rect>
<x>240</x>
<y>314</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
@ -1849,29 +1259,6 @@ if you have not done so already.</string>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="armPositionHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_17">
<property name="font">
@ -1909,29 +1296,6 @@ if you have not done so already.</string>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="armingTimeoutHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_18">
<property name="text">
@ -1971,6 +1335,13 @@ if you have not done so already.</string>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Airframe disarm is done by throttle off and opposite of above combination.</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
@ -1984,10 +1355,14 @@ if you have not done so already.</string>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<spacer name="horizontalSpacer_3">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -2000,7 +1375,7 @@ if you have not done so already.</string>
</spacer>
</item>
<item>
<widget class="QPushButton" name="commandHelp_3">
<widget class="QPushButton" name="inputHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -2009,35 +1384,55 @@ if you have not done so already.</string>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
<iconset resource="../coreplugin/core.qrc">
<normaloff>:/core/images/helpicon.svg</normaloff>:/core/images/helpicon.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="getArmCurrent">
<widget class="QPushButton" name="getRCInputCurrent">
<property name="toolTip">
<string>Retrieve settings from OpenPilot</string>
</property>
<property name="text">
<string>Get Current</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="saveArmToRAM">
<widget class="QPushButton" name="saveRCInputToRAM">
<property name="toolTip">
<string>Send to OpenPilot but don't write in SD.
Be sure to set the Neutral position on all sliders before sending!</string>
</property>
<property name="text">
<string>Apply</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="saveArmToSD">
<widget class="QPushButton" name="saveRCInputToSD">
<property name="toolTip">
<string>Be sure to set the Neutral position on all sliders before sending!
Applies and Saves all settings to SD</string>
</property>
<property name="text">
<string>Save</string>
</property>
@ -2047,10 +1442,6 @@ if you have not done so already.</string>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>ch0Assign</tabstop>
<tabstop>ch1Assign</tabstop>
@ -2062,9 +1453,6 @@ if you have not done so already.</string>
<tabstop>ch7Assign</tabstop>
<tabstop>receiverType</tabstop>
<tabstop>doRCInputCalibration</tabstop>
<tabstop>getRCInputCurrent</tabstop>
<tabstop>saveRCInputToRAM</tabstop>
<tabstop>saveRCInputToSD</tabstop>
<tabstop>fmsSlider</tabstop>
<tabstop>fmsModePos3</tabstop>
<tabstop>fmsSsPos3Roll</tabstop>
@ -2078,12 +1466,9 @@ if you have not done so already.</string>
<tabstop>fmsSsPos1Roll</tabstop>
<tabstop>fmsSsPos1Pitch</tabstop>
<tabstop>fmsSsPos1Yaw</tabstop>
<tabstop>getFmsCurrent</tabstop>
<tabstop>saveFmsToRAM</tabstop>
<tabstop>saveFmsToSD</tabstop>
</tabstops>
<resources>
<include location="configgadget.qrc"/>
<include location="../coreplugin/core.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -136,29 +136,6 @@ Leave at 50Hz for fixed wing.</string>
</item>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QPushButton" name="channelRateHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
@ -1052,29 +1029,6 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="channelValuesHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
@ -1092,29 +1046,6 @@ p, li { white-space: pre-wrap; }
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="spinningArmedlHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="spinningArmed">
<property name="text">
@ -1152,29 +1083,6 @@ p, li { white-space: pre-wrap; }
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="testOutputsHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="channelOutTest">
<property name="enabled">
@ -1204,7 +1112,7 @@ p, li { white-space: pre-wrap; }
</spacer>
</item>
<item>
<widget class="QPushButton" name="commandHelp">
<widget class="QPushButton" name="outputHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -1213,16 +1121,25 @@ p, li { white-space: pre-wrap; }
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
<iconset resource="../coreplugin/core.qrc">
<normaloff>:/core/images/helpicon.svg</normaloff>:/core/images/helpicon.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
@ -1313,7 +1230,7 @@ Applies and Saves all settings to SD</string>
<tabstop>saveRCOutputToSD</tabstop>
</tabstops>
<resources>
<include location="configgadget.qrc"/>
<include location="../coreplugin/core.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>639</width>
<height>657</height>
<height>461</height>
</rect>
</property>
<property name="windowTitle">
@ -21,29 +21,6 @@
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="rateStabiHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="font">
@ -272,29 +249,6 @@ value as YawRate Kp.</string>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="attitudeStabiHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_9">
<property name="font">
@ -527,29 +481,6 @@ flying style.</string>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="angleLimitsHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="font">
@ -651,29 +582,6 @@ flying style.</string>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="updateRealTimeHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="realTimeUpdates">
<property name="toolTip">
@ -699,7 +607,7 @@ automatically every 300ms, which will help for fast tuning.</string>
</spacer>
</item>
<item>
<widget class="QPushButton" name="commandHelp">
<widget class="QPushButton" name="stabilizationHelp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -708,16 +616,25 @@ automatically every 300ms, which will help for fast tuning.</string>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
<iconset resource="../coreplugin/core.qrc">
<normaloff>:/core/images/helpicon.svg</normaloff>:/core/images/helpicon.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
@ -747,7 +664,7 @@ automatically every 300ms, which will help for fast tuning.</string>
</layout>
</widget>
<resources>
<include location="configgadget.qrc"/>
<include location="../coreplugin/core.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -6,22 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
<width>720</width>
<height>480</height>
<width>505</width>
<height>389</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="frame">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>411</width>
<height>321</height>
</rect>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
@ -130,68 +124,10 @@ Beware of not locking yourself out!</string>
<string>Save</string>
</property>
</widget>
<widget class="QPushButton" name="telemetryHelp">
<property name="geometry">
<rect>
<x>45</x>
<y>198</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</widget>
<widget class="QPushButton" name="commandHelp">
<property name="geometry">
<rect>
<x>45</x>
<y>284</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="configgadget.qrc">
<normaloff>:/configgadget/images/help2.png</normaloff>:/configgadget/images/help2.png</iconset>
</property>
</item>
</layout>
</widget>
</widget>
</widget>
<resources>
<include location="configgadget.qrc"/>
</resources>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,2832 @@
<gcs>
<General>
<OverrideLanguage>en_AU</OverrideLanguage>
<SaveSettingsOnExit>true</SaveSettingsOnExit>
</General>
<KeyBindings>
<size>0</size>
</KeyBindings>
<MainWindow>
<Color>#666666</Color>
<FullScreen>false</FullScreen>
<Maximized>true</Maximized>
</MainWindow>
<Plugins>
<SoundNotifyPlugin>
<configInfo>
<locked>false</locked>
<version>1.0.0</version>
</configInfo>
<data>
<Current>
<arr_1>
<CurrentLanguage></CurrentLanguage>
<DataObject></DataObject>
<ExpireTimeout>0</ExpireTimeout>
<ObjectField></ObjectField>
<Repeat></Repeat>
<SayOrder></SayOrder>
<Sound1></Sound1>
<Sound2></Sound2>
<Sound3></Sound3>
<SoundCollectionPath></SoundCollectionPath>
<Value></Value>
<ValueSpinBox>0</ValueSpinBox>
</arr_1>
<size>1</size>
</Current>
<EnableSound>false</EnableSound>
<listNotifies>
<size>0</size>
</listNotifies>
</data>
</SoundNotifyPlugin>
</Plugins>
<UAVGadgetConfigurations>
<ConfigGadget>
<default>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
</default>
</ConfigGadget>
<DialGadget>
<Attitude>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/default/attitude.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>AttitudeActual</needle1DataObject>
<needle1Factor>-1</needle1Factor>
<needle1MaxValue>360</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Roll</needle1ObjectField>
<needle2DataObject>AttitudeActual</needle2DataObject>
<needle2Factor>75</needle2Factor>
<needle2MaxValue>20</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Vertical</needle2Move>
<needle2ObjectField>Pitch</needle2ObjectField>
<needle3DataObject>AttitudeActual</needle3DataObject>
<needle3Factor>-1</needle3Factor>
<needle3MaxValue>360</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Roll</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Attitude>
<Baro__PCT__20Altimeter>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/default/altimeter.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle2</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>1</needle1Factor>
<needle1MaxValue>10</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Altitude</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Baro__PCT__20Altimeter>
<Barometer>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/default/barometer.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>10</needle1Factor>
<needle1MaxValue>1120</needle1MaxValue>
<needle1MinValue>1000</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Pressure</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Barometer>
<Climbrate>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/default/vsi.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>VelocityActual</needle1DataObject>
<needle1Factor>0.01</needle1Factor>
<needle1MaxValue>12</needle1MaxValue>
<needle1MinValue>-12</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Down</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Climbrate>
<Compass>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/default/compass.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>AttitudeActual</needle1DataObject>
<needle1Factor>-1</needle1Factor>
<needle1MaxValue>360</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Yaw</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Compass>
<Deluxe__PCT__20Attitude>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/deluxe/attitude.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>AttitudeActual</needle1DataObject>
<needle1Factor>-1</needle1Factor>
<needle1MaxValue>360</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Roll</needle1ObjectField>
<needle2DataObject>AttitudeActual</needle2DataObject>
<needle2Factor>75</needle2Factor>
<needle2MaxValue>20</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Vertical</needle2Move>
<needle2ObjectField>Pitch</needle2ObjectField>
<needle3DataObject>AttitudeActual</needle3DataObject>
<needle3Factor>-1</needle3Factor>
<needle3MaxValue>360</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Roll</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Deluxe__PCT__20Attitude>
<Deluxe__PCT__20Baro__PCT__20Altimeter>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/deluxe/altimeter.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle2</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>1</needle1Factor>
<needle1MaxValue>10</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Altitude</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Deluxe__PCT__20Baro__PCT__20Altimeter>
<Deluxe__PCT__20Barometer>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/deluxe/barometer.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>10</needle1Factor>
<needle1MaxValue>1120</needle1MaxValue>
<needle1MinValue>1000</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Pressure</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Deluxe__PCT__20Barometer>
<Deluxe__PCT__20Climbrate>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/deluxe/vsi.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>VelocityActual</needle1DataObject>
<needle1Factor>0.01</needle1Factor>
<needle1MaxValue>11.2</needle1MaxValue>
<needle1MinValue>-11.2</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Down</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Deluxe__PCT__20Climbrate>
<Deluxe__PCT__20Compass>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/deluxe/compass.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>AttitudeActual</needle1DataObject>
<needle1Factor>-1</needle1Factor>
<needle1MaxValue>360</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Yaw</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Deluxe__PCT__20Compass>
<Deluxe__PCT__20Groundspeed__PCT__20kph>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/deluxe/speed.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>GPSPosition</needle1DataObject>
<needle1Factor>3.6</needle1Factor>
<needle1MaxValue>120</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Groundspeed</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Deluxe__PCT__20Groundspeed__PCT__20kph>
<Deluxe__PCT__20Temperature>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/deluxe/thermometer.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle2</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>1</needle1Factor>
<needle1MaxValue>120</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Temperature</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Deluxe__PCT__20Temperature>
<Deluxe__PCT__20Turn__PCT__20Coordinator>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>/home/lafargue/OP/OpenPilot/trunk/artwork/Dials/deluxe/turncoordinator.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle2</dialNeedleID2>
<dialNeedleID3>needle2</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>AttitudeActual</needle1DataObject>
<needle1Factor>-1</needle1Factor>
<needle1MaxValue>360</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Roll</needle1ObjectField>
<needle2DataObject>AttitudeRaw</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>20</needle2MaxValue>
<needle2MinValue>-20</needle2MinValue>
<needle2Move>Horizontal</needle2Move>
<needle2ObjectField>accels-X</needle2ObjectField>
<needle3DataObject>AttitudeRaw</needle3DataObject>
<needle3Factor>-1</needle3Factor>
<needle3MaxValue>360</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>accels-X</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Deluxe__PCT__20Turn__PCT__20Coordinator>
<Groundspeed__PCT__20kph>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/default/speed.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>GPSPosition</needle1DataObject>
<needle1Factor>3.6</needle1Factor>
<needle1MaxValue>120</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Groundspeed</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Groundspeed__PCT__20kph>
<HiContrast__PCT__20Attitude>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/hi-contrast/attitude.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>AttitudeActual</needle1DataObject>
<needle1Factor>-1</needle1Factor>
<needle1MaxValue>360</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Roll</needle1ObjectField>
<needle2DataObject>AttitudeActual</needle2DataObject>
<needle2Factor>75</needle2Factor>
<needle2MaxValue>20</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Vertical</needle2Move>
<needle2ObjectField>Pitch</needle2ObjectField>
<needle3DataObject>AttitudeActual</needle3DataObject>
<needle3Factor>-1</needle3Factor>
<needle3MaxValue>360</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Roll</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</HiContrast__PCT__20Attitude>
<HiContrast__PCT__20Baro__PCT__20Altimeter>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/hi-contrast/altimeter.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle2</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>1</needle1Factor>
<needle1MaxValue>10</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Altitude</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</HiContrast__PCT__20Baro__PCT__20Altimeter>
<HiContrast__PCT__20Barometer>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/hi-contrast/barometer.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>10</needle1Factor>
<needle1MaxValue>1120</needle1MaxValue>
<needle1MinValue>1000</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Pressure</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</HiContrast__PCT__20Barometer>
<HiContrast__PCT__20Climbrate>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/hi-contrast/vsi.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>VelocityActual</needle1DataObject>
<needle1Factor>0.01</needle1Factor>
<needle1MaxValue>12</needle1MaxValue>
<needle1MinValue>-12</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Down</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</HiContrast__PCT__20Climbrate>
<HiContrast__PCT__20Compass>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/hi-contrast/compass.svg</dialFile>
<dialForegroundID>foreground</dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>AttitudeActual</needle1DataObject>
<needle1Factor>-1</needle1Factor>
<needle1MaxValue>360</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Yaw</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</HiContrast__PCT__20Compass>
<HiContrast__PCT__20Groundspeed__PCT__20kph>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/hi-contrast/speed.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2></dialNeedleID2>
<dialNeedleID3></dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>GPSPosition</needle1DataObject>
<needle1Factor>3.6</needle1Factor>
<needle1MaxValue>120</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Groundspeed</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</HiContrast__PCT__20Groundspeed__PCT__20kph>
<HiContrast__PCT__20Temperature>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/hi-contrast/thermometer.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle2</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>1</needle1Factor>
<needle1MaxValue>120</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Temperature</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</HiContrast__PCT__20Temperature>
<Servo__PCT__20Channel__PCT__201>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/default/thermometer.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle2</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>ManualControlCommand</needle1DataObject>
<needle1Factor>1</needle1Factor>
<needle1MaxValue>2000</needle1MaxValue>
<needle1MinValue>1000</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Channel-3</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Servo__PCT__20Channel__PCT__201>
<Temperature>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialBackgroundID>background</dialBackgroundID>
<dialFile>%%DATAPATH%%dials/default/thermometer.svg</dialFile>
<dialForegroundID></dialForegroundID>
<dialNeedleID1>needle</dialNeedleID1>
<dialNeedleID2>needle2</dialNeedleID2>
<dialNeedleID3>needle3</dialNeedleID3>
<font>Ubuntu,11,-1,5,50,0,0,0,0,0</font>
<needle1DataObject>BaroAltitude</needle1DataObject>
<needle1Factor>1</needle1Factor>
<needle1MaxValue>120</needle1MaxValue>
<needle1MinValue>0</needle1MinValue>
<needle1Move>Rotate</needle1Move>
<needle1ObjectField>Temperature</needle1ObjectField>
<needle2DataObject>BaroAltitude</needle2DataObject>
<needle2Factor>1</needle2Factor>
<needle2MaxValue>100</needle2MaxValue>
<needle2MinValue>0</needle2MinValue>
<needle2Move>Rotate</needle2Move>
<needle2ObjectField>Altitude</needle2ObjectField>
<needle3DataObject>BaroAltitude</needle3DataObject>
<needle3Factor>1</needle3Factor>
<needle3MaxValue>1000</needle3MaxValue>
<needle3MinValue>0</needle3MinValue>
<needle3Move>Rotate</needle3Move>
<needle3ObjectField>Altitude</needle3ObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</Temperature>
</DialGadget>
<GCSControlGadget>
<MS__PCT__20Sidewinder>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<button0Action>0</button0Action>
<button0Amount>0</button0Amount>
<button0Function>0</button0Function>
<button1Action>0</button1Action>
<button1Amount>0</button1Amount>
<button1Function>0</button1Function>
<button2Action>0</button2Action>
<button2Amount>0.1</button2Amount>
<button2Function>3</button2Function>
<button3Action>0</button3Action>
<button3Amount>0.1</button3Amount>
<button3Function>3</button3Function>
<button4Action>0</button4Action>
<button4Amount>0</button4Amount>
<button4Function>0</button4Function>
<button5Action>0</button5Action>
<button5Amount>0</button5Amount>
<button5Function>0</button5Function>
<button6Action>0</button6Action>
<button6Amount>0</button6Amount>
<button6Function>0</button6Function>
<button7Action>0</button7Action>
<button7Amount>0</button7Amount>
<button7Function>0</button7Function>
<channel0Reverse>false</channel0Reverse>
<channel1Reverse>false</channel1Reverse>
<channel2Reverse>true</channel2Reverse>
<channel3Reverse>false</channel3Reverse>
<channel4Reverse>false</channel4Reverse>
<channel5Reverse>false</channel5Reverse>
<channel6Reverse>false</channel6Reverse>
<channel7Reverse>false</channel7Reverse>
<controlsMode>2</controlsMode>
<pitchChannel>1</pitchChannel>
<rollChannel>0</rollChannel>
<throttleChannel>2</throttleChannel>
<yawChannel>3</yawChannel>
</data>
</MS__PCT__20Sidewinder>
</GCSControlGadget>
<GpsDisplayGadget>
<Flight__PCT__20GPS>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<connectionMode>Telemetry</connectionMode>
<defaultDataBits>3</defaultDataBits>
<defaultFlow>0</defaultFlow>
<defaultParity>0</defaultParity>
<defaultPort>Serial port 0</defaultPort>
<defaultSpeed>11</defaultSpeed>
<defaultStopBits>0</defaultStopBits>
</data>
</Flight__PCT__20GPS>
<GPS__PCT__20Mouse>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<connectionMode>Serial</connectionMode>
<defaultDataBits>3</defaultDataBits>
<defaultFlow>0</defaultFlow>
<defaultParity>0</defaultParity>
<defaultPort>Serial port 0</defaultPort>
<defaultSpeed>17</defaultSpeed>
<defaultStopBits>0</defaultStopBits>
</data>
</GPS__PCT__20Mouse>
</GpsDisplayGadget>
<HITL>
<Flightgear__PCT__20HITL>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<binPath>\usr\games\fgfs</binPath>
<dataPath>\usr\share\games\FlightGear</dataPath>
<hostAddress>127.0.0.1</hostAddress>
<inPort>9009</inPort>
<latitude></latitude>
<longitude></longitude>
<manual>false</manual>
<outPort>9010</outPort>
<remoteHostAddress>127.0.0.1</remoteHostAddress>
<simulatorId>FG</simulatorId>
<startSim>true</startSim>
</data>
</Flightgear__PCT__20HITL>
<XPlane__PCT__20HITL>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<binPath>\home\lafargue\X-Plane 9\X-Plane-i686</binPath>
<dataPath>\usr\share\games\FlightGear</dataPath>
<hostAddress>127.0.0.3</hostAddress>
<inPort>6756</inPort>
<latitude></latitude>
<longitude></longitude>
<manual>false</manual>
<outPort>49000</outPort>
<remoteHostAddress>127.0.0.1</remoteHostAddress>
<simulatorId>X-Plane</simulatorId>
<startSim>false</startSim>
</data>
</XPlane__PCT__20HITL>
</HITL>
<ImportExportGadget>
<default>
<configInfo>
<locked>false</locked>
<version>1.0.1</version>
</configInfo>
<data>
<iniFile>gcs.ini</iniFile>
</data>
</default>
</ImportExportGadget>
<LineardialGadget>
<AHRS__PCT__20CPU>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>50</greenMax>
<greenMin>0</greenMin>
<maxValue>100</maxValue>
<minValue>0</minValue>
<redMax>100</redMax>
<redMin>80</redMin>
<sourceDataObject>AhrsStatus</sourceDataObject>
<sourceObjectField>CPULoad</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>80</yellowMax>
<yellowMin>50</yellowMin>
</data>
</AHRS__PCT__20CPU>
<Accel__PCT__20Horizontal__PCT__20X>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-horizontal.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,8,-1,5,50,0,0,0,0,0</font>
<greenMax>-9</greenMax>
<greenMin>-10</greenMin>
<maxValue>11</maxValue>
<minValue>-11</minValue>
<redMax>11</redMax>
<redMin>-11</redMin>
<sourceDataObject>AttitudeRaw</sourceDataObject>
<sourceObjectField>accels-X</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>-5</yellowMax>
<yellowMin>-11</yellowMin>
</data>
</Accel__PCT__20Horizontal__PCT__20X>
<Accel__PCT__20Horizontal__PCT__20Y>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-horizontal.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,6,-1,5,50,0,0,0,0,0</font>
<greenMax>-9</greenMax>
<greenMin>-10</greenMin>
<maxValue>11</maxValue>
<minValue>-11</minValue>
<redMax>11</redMax>
<redMin>-11</redMin>
<sourceDataObject>AttitudeRaw</sourceDataObject>
<sourceObjectField>accels-Y</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>-5</yellowMax>
<yellowMin>-11</yellowMin>
</data>
</Accel__PCT__20Horizontal__PCT__20Y>
<Accel__PCT__20Horizontal__PCT__20Z>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-horizontal.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,8,-1,5,50,0,0,0,0,0</font>
<greenMax>-9</greenMax>
<greenMin>-10</greenMin>
<maxValue>11</maxValue>
<minValue>-11</minValue>
<redMax>11</redMax>
<redMin>-11</redMin>
<sourceDataObject>AttitudeRaw</sourceDataObject>
<sourceObjectField>accels-Z</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>-5</yellowMax>
<yellowMin>-11</yellowMin>
</data>
</Accel__PCT__20Horizontal__PCT__20Z>
<Arm__PCT__20Status>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/arm-status.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>1</factor>
<font>,12,-1,5,50,0,0,0,0,0</font>
<greenMax>100</greenMax>
<greenMin>66</greenMin>
<maxValue>100</maxValue>
<minValue>0</minValue>
<redMax>33</redMax>
<redMin>0</redMin>
<sourceDataObject>FlightStatus</sourceDataObject>
<sourceObjectField>Armed</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>66</yellowMax>
<yellowMin>33</yellowMin>
</data>
</Arm__PCT__20Status>
<Flight__PCT__20Time>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/textonly.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>0.001</factor>
<font>,12,-1,5,50,0,0,0,0,0</font>
<greenMax>100</greenMax>
<greenMin>66</greenMin>
<maxValue>100</maxValue>
<minValue>0</minValue>
<redMax>33</redMax>
<redMin>0</redMin>
<sourceDataObject>SystemStats</sourceDataObject>
<sourceObjectField>FlightTime</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>66</yellowMax>
<yellowMin>33</yellowMin>
</data>
</Flight__PCT__20Time>
<Flight__PCT__20mode>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/flightmode-status.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>1</factor>
<font>,12,-1,5,50,0,0,0,0,0</font>
<greenMax>100</greenMax>
<greenMin>66</greenMin>
<maxValue>100</maxValue>
<minValue>0</minValue>
<redMax>33</redMax>
<redMin>0</redMin>
<sourceDataObject>FlightStatus</sourceDataObject>
<sourceObjectField>FlightMode</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>66</yellowMax>
<yellowMin>33</yellowMin>
</data>
</Flight__PCT__20mode>
<GPS__PCT__20Sats>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/gps-signal.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>1</factor>
<font>,12,-1,5,50,0,0,0,0,0</font>
<greenMax>0</greenMax>
<greenMin>0</greenMin>
<maxValue>12</maxValue>
<minValue>0</minValue>
<redMax>0</redMax>
<redMin>0</redMin>
<sourceDataObject>GPSPosition</sourceDataObject>
<sourceObjectField>Satellites</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0</yellowMax>
<yellowMin>0</yellowMin>
</data>
</GPS__PCT__20Sats>
<GPS__PCT__20Status>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/gps-status.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>1</factor>
<font>,12,-1,5,50,0,0,0,0,0</font>
<greenMax>100</greenMax>
<greenMin>66</greenMin>
<maxValue>100</maxValue>
<minValue>0</minValue>
<redMax>33</redMax>
<redMin>0</redMin>
<sourceDataObject>GPSPosition</sourceDataObject>
<sourceObjectField>Status</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>66</yellowMax>
<yellowMin>33</yellowMin>
</data>
</GPS__PCT__20Status>
<Mainboard__PCT__20CPU>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>50</greenMax>
<greenMin>0</greenMin>
<maxValue>100</maxValue>
<minValue>0</minValue>
<redMax>100</redMax>
<redMin>80</redMin>
<sourceDataObject>SystemStats</sourceDataObject>
<sourceObjectField>CPULoad</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>80</yellowMax>
<yellowMin>50</yellowMin>
</data>
</Mainboard__PCT__20CPU>
<Pitch__PCT__20Desired>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>0.5</greenMax>
<greenMin>-0.5</greenMin>
<maxValue>1</maxValue>
<minValue>-1</minValue>
<redMax>1</redMax>
<redMin>-1</redMin>
<sourceDataObject>ActuatorDesired</sourceDataObject>
<sourceObjectField>Pitch</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0.8</yellowMax>
<yellowMin>-0.8</yellowMin>
</data>
</Pitch__PCT__20Desired>
<Pitch>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>0.5</greenMax>
<greenMin>-0.5</greenMin>
<maxValue>1</maxValue>
<minValue>-1</minValue>
<redMax>1</redMax>
<redMin>-1</redMin>
<sourceDataObject>ManualControlCommand</sourceDataObject>
<sourceObjectField>Pitch</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0.8</yellowMax>
<yellowMin>-0.8</yellowMin>
</data>
</Pitch>
<PitchActual>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>0.8</greenMax>
<greenMin>0.3</greenMin>
<maxValue>90</maxValue>
<minValue>-90</minValue>
<redMax>1</redMax>
<redMin>0</redMin>
<sourceDataObject>AttitudeActual</sourceDataObject>
<sourceObjectField>Pitch</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0.9</yellowMax>
<yellowMin>0.1</yellowMin>
</data>
</PitchActual>
<Roll__PCT__20Desired>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>0.5</greenMax>
<greenMin>-0.5</greenMin>
<maxValue>1</maxValue>
<minValue>-1</minValue>
<redMax>1</redMax>
<redMin>-1</redMin>
<sourceDataObject>ActuatorDesired</sourceDataObject>
<sourceObjectField>Roll</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0.8</yellowMax>
<yellowMin>-0.8</yellowMin>
</data>
</Roll__PCT__20Desired>
<Roll>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>0.5</greenMax>
<greenMin>-0.5</greenMin>
<maxValue>1</maxValue>
<minValue>-1</minValue>
<redMax>1</redMax>
<redMin>-1</redMin>
<sourceDataObject>ManualControlCommand</sourceDataObject>
<sourceObjectField>Roll</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0.8</yellowMax>
<yellowMin>-0.8</yellowMin>
</data>
</Roll>
<Telemetry__PCT__20RX__PCT__20Rate__PCT__20Horizontal>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-horizontal.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>650</greenMax>
<greenMin>0</greenMin>
<maxValue>1200</maxValue>
<minValue>0</minValue>
<redMax>1200</redMax>
<redMin>900</redMin>
<sourceDataObject>GCSTelemetryStats</sourceDataObject>
<sourceObjectField>RxDataRate</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>900</yellowMax>
<yellowMin>650</yellowMin>
</data>
</Telemetry__PCT__20RX__PCT__20Rate__PCT__20Horizontal>
<Telemetry__PCT__20TX__PCT__20Rate__PCT__20Horizontal>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-horizontal.svg</dFile>
<decimalPlaces>0</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>650</greenMax>
<greenMin>0</greenMin>
<maxValue>1200</maxValue>
<minValue>0</minValue>
<redMax>1200</redMax>
<redMin>900</redMin>
<sourceDataObject>GCSTelemetryStats</sourceDataObject>
<sourceObjectField>TxDataRate</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>900</yellowMax>
<yellowMin>650</yellowMin>
</data>
</Telemetry__PCT__20TX__PCT__20Rate__PCT__20Horizontal>
<Throttle>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>0.5</greenMax>
<greenMin>0</greenMin>
<maxValue>1</maxValue>
<minValue>0</minValue>
<redMax>1</redMax>
<redMin>0.75</redMin>
<sourceDataObject>ManualControlCommand</sourceDataObject>
<sourceObjectField>Throttle</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0.75</yellowMax>
<yellowMin>0.5</yellowMin>
</data>
</Throttle>
<Yaw__PCT__20Desired>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>0.5</greenMax>
<greenMin>-0.5</greenMin>
<maxValue>1</maxValue>
<minValue>-1</minValue>
<redMax>1</redMax>
<redMin>-1</redMin>
<sourceDataObject>ActuatorDesired</sourceDataObject>
<sourceObjectField>Yaw</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0.8</yellowMax>
<yellowMin>-0.8</yellowMin>
</data>
</Yaw__PCT__20Desired>
<Yaw>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<dFile>%%DATAPATH%%dials/default/lineardial-vertical.svg</dFile>
<decimalPlaces>2</decimalPlaces>
<factor>1</factor>
<font>Andale Mono,12,-1,5,75,0,0,0,0,0</font>
<greenMax>0.5</greenMax>
<greenMin>-0.5</greenMin>
<maxValue>1</maxValue>
<minValue>-1</minValue>
<redMax>1</redMax>
<redMin>-1</redMin>
<sourceDataObject>ManualControlCommand</sourceDataObject>
<sourceObjectField>Yaw</sourceObjectField>
<useOpenGLFlag>false</useOpenGLFlag>
<yellowMax>0.8</yellowMax>
<yellowMin>-0.8</yellowMin>
</data>
</Yaw>
</LineardialGadget>
<ModelViewGadget>
<Aeroquad__PCT__20__PCT__2B>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/multi/aeroquad/aeroquad_+.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Aeroquad__PCT__20__PCT__2B>
<Easyquad__PCT__20X>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/multi/easy_quad/easy_quad_X.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Easyquad__PCT__20X>
<Easystar>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/planes/Easystar/easystar.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Easystar>
<Firecracker>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/planes/firecracker/firecracker.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Firecracker>
<Funjet>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/planes/funjet/funjet.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Funjet>
<Gaui__PCT__20330X>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/multi/gaui_330x/gaui_330x.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Gaui__PCT__20330X>
<Helicopter__PCT__20-__PCT__20TRex__PCT__20450>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/helis/t-rex/t-rex_450_xl.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Helicopter__PCT__20-__PCT__20TRex__PCT__20450>
<Hexacopter>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/multi/mikrokopter/MK_Hexa.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Hexacopter>
<Quadcopter>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/multi/mikrokopter/MK_L4-ME.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Quadcopter>
<Scorpion__PCT__20Tricopter>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/multi/scorpion_tricopter/scorpion_tricopter.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Scorpion__PCT__20Tricopter>
<Test__PCT__20Quad__PCT__20__PCT__2B>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/multi/test_quad/test_quad_+.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Test__PCT__20Quad__PCT__20__PCT__2B>
<Test__PCT__20Quad__PCT__20X>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<acFilename>%%DATAPATH%%models/multi/test_quad/test_quad_X.3ds</acFilename>
<bgFilename>%%DATAPATH%%models/backgrounds/default_background.png</bgFilename>
<enableVbo>false</enableVbo>
</data>
</Test__PCT__20Quad__PCT__20X>
</ModelViewGadget>
<OPMapGadget>
<Google__PCT__20Sat>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<accessMode>ServerAndCache</accessMode>
<cacheLocation>%%STOREPATH%%mapscache/</cacheLocation>
<defaultLatitude>0</defaultLatitude>
<defaultLongitude>0</defaultLongitude>
<defaultZoom>2</defaultZoom>
<mapProvider>GoogleSatellite</mapProvider>
<maxUpdateRate>2000</maxUpdateRate>
<showTileGridLines>false</showTileGridLines>
<uavSymbol>mapquad.png</uavSymbol>
<useMemoryCache>true</useMemoryCache>
<useOpenGL>false</useOpenGL>
</data>
</Google__PCT__20Sat>
<Memory__PCT__20Only>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<accessMode>CacheOnly</accessMode>
<cacheLocation>%%STOREPATH%%mapscache/</cacheLocation>
<defaultLatitude>0</defaultLatitude>
<defaultLongitude>0</defaultLongitude>
<defaultZoom>2</defaultZoom>
<mapProvider>GoogleMap</mapProvider>
<maxUpdateRate>2000</maxUpdateRate>
<showTileGridLines>false</showTileGridLines>
<uavSymbol>airplanepip.png</uavSymbol>
<useMemoryCache>true</useMemoryCache>
<useOpenGL>false</useOpenGL>
</data>
</Memory__PCT__20Only>
<default>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<accessMode>ServerAndCache</accessMode>
<cacheLocation>%%STOREPATH%%mapscache/</cacheLocation>
<defaultLatitude>0</defaultLatitude>
<defaultLongitude>0</defaultLongitude>
<defaultZoom>2</defaultZoom>
<mapProvider>GoogleMap</mapProvider>
<maxUpdateRate>2000</maxUpdateRate>
<showTileGridLines>false</showTileGridLines>
<uavSymbol>mapquad.png</uavSymbol>
<useMemoryCache>true</useMemoryCache>
<useOpenGL>false</useOpenGL>
</data>
</default>
</OPMapGadget>
<PFDGadget>
<raw>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>false</beSmooth>
<dialFile>%%DATAPATH%%pfd/default/pfd.svg</dialFile>
<hqFonts>false</hqFonts>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</raw>
<smooth>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<beSmooth>true</beSmooth>
<dialFile>%%DATAPATH%%pfd/default/pfd.svg</dialFile>
<hqFonts>false</hqFonts>
<useOpenGLFlag>false</useOpenGLFlag>
</data>
</smooth>
</PFDGadget>
<PipXtreme>
<default>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
</default>
</PipXtreme>
<ScopeGadget>
<Accel>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>60</dataSize>
<plotCurve0>
<color>4294901760</color>
<uavField>accels-X</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4283782655</color>
<uavField>accels-Y</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve2>
<color>4283804160</color>
<uavField>accels-Z</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurveCount>3</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>100</refreshInterval>
</data>
</Accel>
<Actuators>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>20</dataSize>
<plotCurve0>
<color>4294901760</color>
<uavField>Channel-4</uavField>
<uavObject>ActuatorCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4294901760</color>
<uavField>Channel-5</uavField>
<uavObject>ActuatorCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve2>
<color>4289374847</color>
<uavField>Channel-6</uavField>
<uavObject>ActuatorCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurve3>
<color>4289374847</color>
<uavField>Channel-7</uavField>
<uavObject>ActuatorCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve3>
<plotCurveCount>4</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>100</refreshInterval>
</data>
</Actuators>
<Attitude>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>60</dataSize>
<plotCurve0>
<color>4283760895</color>
<uavField>Roll</uavField>
<uavObject>AttitudeActual</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4278233600</color>
<uavField>Yaw</uavField>
<uavObject>AttitudeActual</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve2>
<color>4294901760</color>
<uavField>Pitch</uavField>
<uavObject>AttitudeActual</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurveCount>3</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>100</refreshInterval>
</data>
</Attitude>
<Barometer>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>60</dataSize>
<plotCurve0>
<color>4278190080</color>
<uavField>Pressure</uavField>
<uavObject>BaroAltitude</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurveCount>1</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>1000</refreshInterval>
</data>
</Barometer>
<Inputs>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>40</dataSize>
<plotCurve0>
<color>4278190207</color>
<uavField>Channel-1</uavField>
<uavObject>ManualControlCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4294901760</color>
<uavField>Channel-4</uavField>
<uavObject>ManualControlCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve2>
<color>4294901760</color>
<uavField>Channel-5</uavField>
<uavObject>ManualControlCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurve3>
<color>4294901760</color>
<uavField>Channel-6</uavField>
<uavObject>ManualControlCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve3>
<plotCurve4>
<color>4294901760</color>
<uavField>Channel-7</uavField>
<uavObject>ManualControlCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve4>
<plotCurve5>
<color>4283825920</color>
<uavField>Channel-2</uavField>
<uavObject>ManualControlCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve5>
<plotCurve6>
<color>4294923520</color>
<uavField>Channel-3</uavField>
<uavObject>ManualControlCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve6>
<plotCurve7>
<color>4294967040</color>
<uavField>Channel-0</uavField>
<uavObject>ManualControlCommand</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve7>
<plotCurveCount>8</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>200</refreshInterval>
</data>
</Inputs>
<Raw__PCT__20Accels>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>60</dataSize>
<plotCurve0>
<color>4294901760</color>
<uavField>accels-X</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4283782655</color>
<uavField>accels-Y</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve2>
<color>4283804160</color>
<uavField>accels-Z</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurveCount>3</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>500</refreshInterval>
</data>
</Raw__PCT__20Accels>
<Raw__PCT__20Gyros>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>60</dataSize>
<plotCurve0>
<color>4283804160</color>
<uavField>gyros-Z</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4283782655</color>
<uavField>gyros-Y</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve2>
<color>4294901760</color>
<uavField>gyros-X</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurveCount>3</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>500</refreshInterval>
</data>
</Raw__PCT__20Gyros>
<Raw__PCT__20magnetometers>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>60</dataSize>
<plotCurve0>
<color>4294901760</color>
<uavField>magnetometers-X</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4283782655</color>
<uavField>magnetometers-Y</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve2>
<color>4283804160</color>
<uavField>magnetometers-Z</uavField>
<uavObject>AttitudeRaw</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurveCount>3</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>500</refreshInterval>
</data>
</Raw__PCT__20magnetometers>
<Stacks__PCT__20monitor>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>240</dataSize>
<plotCurve0>
<color>4294945280</color>
<uavField>StackRemaining-System</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4294945280</color>
<uavField>StackRemaining-Actuator</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve10>
<color>4294945280</color>
<uavField>StackRemaining-Guidance</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve10>
<plotCurve11>
<color>4294945280</color>
<uavField>StackRemaining-Watchdog</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve11>
<plotCurve2>
<color>4294945280</color>
<uavField>StackRemaining-TelemetryTx</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurve3>
<color>4294945280</color>
<uavField>StackRemaining-TelemetryTxPri</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve3>
<plotCurve4>
<color>4294945280</color>
<uavField>StackRemaining-TelemetryRx</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve4>
<plotCurve5>
<color>4294945280</color>
<uavField>StackRemaining-GPS</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve5>
<plotCurve6>
<color>4294945280</color>
<uavField>StackRemaining-ManualControl</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve6>
<plotCurve7>
<color>4294945280</color>
<uavField>StackRemaining-Altitude</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve7>
<plotCurve8>
<color>4294945280</color>
<uavField>StackRemaining-AHRSComms</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve8>
<plotCurve9>
<color>4294945280</color>
<uavField>StackRemaining-Stabilization</uavField>
<uavObject>TaskInfo</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve9>
<plotCurveCount>12</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>1000</refreshInterval>
</data>
</Stacks__PCT__20monitor>
<Telemetry__PCT__20quality>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>20</dataSize>
<plotCurve0>
<color>4289374847</color>
<uavField>TxFailures</uavField>
<uavObject>GCSTelemetryStats</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4283782655</color>
<uavField>RxFailures</uavField>
<uavObject>GCSTelemetryStats</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurve2>
<color>4294901760</color>
<uavField>TxRetries</uavField>
<uavObject>GCSTelemetryStats</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve2>
<plotCurveCount>3</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>100</refreshInterval>
</data>
</Telemetry__PCT__20quality>
<Uptimes>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<LoggingEnabled>false</LoggingEnabled>
<LoggingNewFileOnConnect>false</LoggingNewFileOnConnect>
<LoggingPath></LoggingPath>
<configurationStreamVersion>1000</configurationStreamVersion>
<dataSize>240</dataSize>
<plotCurve0>
<color>4289374847</color>
<uavField>RunningTime</uavField>
<uavObject>AhrsStatus</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve0>
<plotCurve1>
<color>4294945407</color>
<uavField>FlightTime</uavField>
<uavObject>SystemStats</uavObject>
<yMaximum>0</yMaximum>
<yMinimum>0</yMinimum>
<yScalePower>0</yScalePower>
</plotCurve1>
<plotCurveCount>2</plotCurveCount>
<plotType>1</plotType>
<refreshInterval>800</refreshInterval>
</data>
</Uptimes>
</ScopeGadget>
<SystemHealthGadget>
<default>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<diagram>%%DATAPATH%%diagrams/default/system-health.svg</diagram>
</data>
</default>
</SystemHealthGadget>
<UAVObjectBrowser>
<default>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<manuallyChangedColor>#5baa56</manuallyChangedColor>
<recentlyUpdatedColor>#ff7957</recentlyUpdatedColor>
<recentlyUpdatedTimeout>500</recentlyUpdatedTimeout>
</data>
</default>
</UAVObjectBrowser>
<Uploader>
<default>
<configInfo>
<locked>false</locked>
<version>0.0.0</version>
</configInfo>
<data>
<defaultDataBits>3</defaultDataBits>
<defaultFlow>0</defaultFlow>
<defaultParity>0</defaultParity>
<defaultPort>/dev/ttyS0</defaultPort>
<defaultSpeed>14</defaultSpeed>
<defaultStopBits>0</defaultStopBits>
</data>
</default>
</Uploader>
<configInfo>
<locked>false</locked>
<version>1.2.0</version>
</configInfo>
</UAVGadgetConfigurations>
<UAVGadgetManager>
<Mode1>
<showToolbars>false</showToolbars>
<splitter>
<side0>
<side0>
<side0>
<side0>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Flight Time</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>GPS Sats</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Flight mode</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Arm Status</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAA1wAAAAIAAADt)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<classId>PFDGadget</classId>
<gadget>
<activeConfiguration>raw</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAAkAAAAAIAAAJg)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<classId>ModelViewGadget</classId>
<gadget>
<activeConfiguration>Test Quad X</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<side0>
<classId>SystemHealthGadget</classId>
<gadget>
<activeConfiguration>default</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Mainboard CPU</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>AHRS CPU</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAAQAAAAAIAAABA)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABIwAAAAIAAACN)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Telemetry RX Rate Horizontal</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Telemetry TX Rate Horizontal</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABJQAAAAIAAABA)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABMAAAAAIAAAGx)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABxQAAAAIAAAFH)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<classId>OPMapGadget</classId>
<gadget>
<activeConfiguration>Google Sat</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<side0>
<side0>
<side0>
<classId>DialGadget</classId>
<gadget>
<activeConfiguration>Deluxe Groundspeed kph</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>DialGadget</classId>
<gadget>
<activeConfiguration>Deluxe Barometer</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<classId>DialGadget</classId>
<gadget>
<activeConfiguration>Deluxe Attitude</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>DialGadget</classId>
<gadget>
<activeConfiguration>Deluxe Compass</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAAgwAAAAIAAACK)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<classId>DialGadget</classId>
<gadget>
<activeConfiguration>Deluxe Baro Altimeter</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>DialGadget</classId>
<gadget>
<activeConfiguration>Deluxe Climbrate</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABFQAAAAIAAACH)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Throttle</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Roll Desired</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Pitch Desired</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Yaw Desired</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAAQAAAAAIAAAE3)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAAQAAAAAIAAAF4)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAAQAAAAAIAAAG5)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABuQAAAAIAAAED)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAB7AAAAAIAAAEg)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAC4gAAAAIAAAK9)</splitterSizes>
<type>splitter</type>
</splitter>
<version>UAVGadgetManagerV1</version>
</Mode1>
<Mode2>
<showToolbars>false</showToolbars>
<splitter>
<side0>
<side0>
<classId>ConfigGadget</classId>
<gadget>
<activeConfiguration>default</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Telemetry RX Rate Horizontal</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Telemetry TX Rate Horizontal</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAACNQAAAAIAAABC)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<classId>UAVObjectBrowser</classId>
<gadget>
<activeConfiguration>default</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>GCSControlGadget</classId>
<gadget>
<activeConfiguration>MS Sidewinder</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABqgAAAAIAAAFi)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAC3gAAAAIAAAJ3)</splitterSizes>
<type>splitter</type>
</splitter>
<version>UAVGadgetManagerV1</version>
</Mode2>
<Mode3>
<showToolbars>false</showToolbars>
<splitter>
<side0>
<classId>OPMapGadget</classId>
<gadget>
<activeConfiguration>default</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<classId>ModelViewGadget</classId>
<gadget>
<activeConfiguration>Test Quad X</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<classId>DialGadget</classId>
<gadget>
<activeConfiguration>Attitude</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>DialGadget</classId>
<gadget>
<activeConfiguration>Compass</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABiwAAAAIAAADs)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAD1AAAAAIAAAGB)</splitterSizes>
<type>splitter</type>
</splitter>
<version>UAVGadgetManagerV1</version>
</Mode3>
<Mode4>
<showToolbars>false</showToolbars>
<splitter>
<side0>
<side0>
<classId>ScopeGadget</classId>
<gadget>
<activeConfiguration>Accel</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>ScopeGadget</classId>
<gadget>
<activeConfiguration>Raw Gyros</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<side0>
<side0>
<classId>ScopeGadget</classId>
<gadget>
<activeConfiguration>Attitude</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>ScopeGadget</classId>
<gadget>
<activeConfiguration>Uptimes</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABhgAAAAIAAAEO)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<classId>LoggingGadget</classId>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAClQAAAAIAAAB3)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAACjQAAAAIAAAKU)</splitterSizes>
<type>splitter</type>
</splitter>
<version>UAVGadgetManagerV1</version>
</Mode4>
<Mode5>
<showToolbars>false</showToolbars>
<splitter>
<side0>
<side0>
<classId>HITL</classId>
<gadget>
<activeConfiguration>XPlane HITL</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<classId>GCSControlGadget</classId>
<gadget>
<activeConfiguration>MS Sidewinder</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<side0>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Pitch Desired</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>PitchActual</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<classId>LineardialGadget</classId>
<gadget>
<activeConfiguration>Pitch</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABFAAAAAIAAABA)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAAB6AAAAAIAAADC)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABaQAAAAIAAAEO)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<classId>UAVObjectBrowser</classId>
<gadget>
<activeConfiguration>default</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAADDAAAAAIAAAJJ)</splitterSizes>
<type>splitter</type>
</splitter>
<version>UAVGadgetManagerV1</version>
</Mode5>
<Mode6>
<showToolbars>false</showToolbars>
<splitter>
<side0>
<classId>Uploader</classId>
<gadget>
<activeConfiguration>default</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<side0>
<side0>
<classId>SystemHealthGadget</classId>
<gadget>
<activeConfiguration>default</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side0>
<side1>
<classId>PFDGadget</classId>
<gadget>
<activeConfiguration>raw</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABQgAAAAIAAAGM)</splitterSizes>
<type>splitter</type>
</side0>
<side1>
<classId>ScopeGadget</classId>
<gadget>
<activeConfiguration>Uptimes</activeConfiguration>
</gadget>
<type>uavGadget</type>
</side1>
<splitterOrientation>2</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABEgAAAAIAAAH6)</splitterSizes>
<type>splitter</type>
</side1>
<splitterOrientation>1</splitterOrientation>
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
<type>splitter</type>
</splitter>
<version>UAVGadgetManagerV1</version>
</Mode6>
</UAVGadgetManager>
<ViewGroup_Default>@ByteArray(AAAA/wAAAAD9AAAAAAAABQAAAALCAAAABAAAAAQAAAABAAAACPwAAAAA)</ViewGroup_Default>
<Workspace>
<Icon1>:/core/images/ah.png</Icon1>
<Icon10>:/core/images/openpilot_logo_64.png</Icon10>
<Icon2>:/core/images/config.png</Icon2>
<Icon3>:/core/images/world.png</Icon3>
<Icon4>:/core/images/scopes.png</Icon4>
<Icon5>:/core/images/joystick.png</Icon5>
<Icon6>:/core/images/cog.png</Icon6>
<Icon7>:/core/images/openpilot_logo_64.png</Icon7>
<Icon8>:/core/images/openpilot_logo_64.png</Icon8>
<Icon9>:/core/images/openpilot_logo_64.png</Icon9>
<NumberOfWorkspaces>6</NumberOfWorkspaces>
<Workspace1>Flight data</Workspace1>
<Workspace10>Workspace10</Workspace10>
<Workspace2>Configuration</Workspace2>
<Workspace3>Flight Planner</Workspace3>
<Workspace4>Scopes</Workspace4>
<Workspace5>HITL</Workspace5>
<Workspace6>Firmware</Workspace6>
<Workspace7>Workspace7</Workspace7>
<Workspace8>Workspace8</Workspace8>
<Workspace9>Workspace9</Workspace9>
</Workspace>
</gcs>

View File

@ -50,7 +50,6 @@
<file>images/optionsicon.png</file>
<file>images/helpicon.png</file>
<file>images/openpiloticon.png</file>
<file>OpenPilotGCS.ini</file>
<file>CREDITS.html</file>
<file>images/ah.png</file>
<file>images/config.png</file>
@ -60,5 +59,7 @@
<file>images/scopes.png</file>
<file>images/world.png</file>
<file>images/cog.png</file>
<file>OpenPilotGCS.xml</file>
<file>images/helpicon.svg</file>
</qresource>
</RCC>

View File

@ -141,3 +141,5 @@ unix:!macx {
INSTALLS += images
}
OTHER_FILES += Core.pluginspec
include(gcsversioninfo.pri)

View File

@ -32,6 +32,7 @@
#include <coreplugin/core_global.h>
#include <QtCore/QObject>
#include <QtGui/QIcon>
QT_BEGIN_NAMESPACE
class QWidget;
@ -43,9 +44,14 @@ class CORE_EXPORT IOptionsPage : public QObject
{
Q_OBJECT
public:
IOptionsPage(QObject *parent = 0) : QObject(parent) {}
IOptionsPage(QObject *parent = 0) :
QObject(parent),
m_icon(QIcon()) {}
virtual ~IOptionsPage() {}
void setIcon(QIcon icon) { m_icon = icon; }
QIcon icon() { return m_icon; }
/* gadget options pages can leave these 4 functions as is,
since they are decorated by UAVGadgetOptionsPageDecorator,
all other options pages must override these */
@ -57,6 +63,8 @@ public:
virtual QWidget *createPage(QWidget *parent) = 0;
virtual void apply() = 0;
virtual void finish() = 0;
private:
QIcon m_icon;
};
} // namespace Core

View File

@ -59,10 +59,13 @@ bool optionsPageLessThan(const IOptionsPage *p1, const IOptionsPage *p2)
const UAVGadgetOptionsPageDecorator *gp2 = qobject_cast<const UAVGadgetOptionsPageDecorator*>(p2);
if (gp1 && (gp2 == NULL))
return false;
if (gp2 && (gp1 == NULL))
return true;
if (const int cc = QString::localeAwareCompare(p1->trCategory(), p2->trCategory()))
return cc < 0;
return QString::localeAwareCompare(p1->trName(), p2->trName()) < 0;
}
@ -97,6 +100,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &categoryId,
}
if (m_windowWidth > 0 && m_windowHeight > 0)
resize(m_windowWidth, m_windowHeight);
buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(apply()));
@ -105,10 +109,12 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &categoryId,
connect(this, SIGNAL(settingsDialogShown(Core::Internal::SettingsDialog*)), m_instanceManager, SLOT(settingsDialogShown(Core::Internal::SettingsDialog*)));
connect(this, SIGNAL(settingsDialogRemoved()), m_instanceManager, SLOT(settingsDialogRemoved()));
connect(this, SIGNAL(categoryItemSelected()), this, SLOT(categoryItemSelectedShowChildInstead()), Qt::QueuedConnection);
splitter->setCollapsible(0, false);
splitter->setCollapsible(1, false);
pageTree->header()->setVisible(false);
// pageTree->setIconSize(QSize(24, 24));
connect(pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
this, SLOT(pageSelected()));
@ -129,44 +135,34 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &categoryId,
item->setText(0, page->trName());
item->setData(0, Qt::UserRole, qVariantFromValue(pageData));
QStringList categoriesId = page->category().split(QLatin1Char('|'));
QStringList trCategories = page->trCategory().split(QLatin1Char('|'));
QString currentCategory = categoriesId.at(0);
QString trCategories = page->trCategory();
QString currentCategory = page->category();
QTreeWidgetItem *treeitem;
QTreeWidgetItem *categoryItem;
if (!categories.contains(currentCategory)) {
if (!firstUavGadgetOptionsPageFound)
{
// Above the first gadget option we insert a separator
if (!firstUavGadgetOptionsPageFound) {
UAVGadgetOptionsPageDecorator *pd = qobject_cast<UAVGadgetOptionsPageDecorator*>(page);
if (pd)
{
if (pd) {
firstUavGadgetOptionsPageFound = true;
QTreeWidgetItem *separator = new QTreeWidgetItem(pageTree);
separator->setFlags(item->flags() & ~Qt::ItemIsSelectable & ~Qt::ItemIsEnabled);
separator->setFlags(separator->flags() & ~Qt::ItemIsSelectable & ~Qt::ItemIsEnabled);
separator->setText(0, QString(30, 0xB7));
}
}
treeitem = new QTreeWidgetItem(pageTree);
treeitem->setText(0, trCategories.at(0));
treeitem->setData(0, Qt::UserRole, qVariantFromValue(pageData));
categories.insert(currentCategory, treeitem);
categoryItem = new QTreeWidgetItem(pageTree);
categoryItem->setIcon(0, page->icon());
categoryItem->setText(0, trCategories);
categoryItem->setData(0, Qt::UserRole, qVariantFromValue(pageData));
categories.insert(currentCategory, categoryItem);
}
int catCount = 1;
while (catCount < categoriesId.count()) {
if (!categories.contains(currentCategory + QLatin1Char('|') + categoriesId.at(catCount))) {
treeitem = new QTreeWidgetItem(categories.value(currentCategory));
currentCategory += QLatin1Char('|') + categoriesId.at(catCount);
treeitem->setText(0, trCategories.at(catCount));
treeitem->setData(0, Qt::UserRole, qVariantFromValue(pageData));
categories.insert(currentCategory, treeitem);
} else {
currentCategory += QLatin1Char('|') + categoriesId.at(catCount);
QList<QTreeWidgetItem *> *categoryItemList = m_categoryItemsMap.value(currentCategory);
if (!categoryItemList) {
categoryItemList = new QList<QTreeWidgetItem *>();
m_categoryItemsMap.insert(currentCategory, categoryItemList);
}
++catCount;
}
categories.value(currentCategory)->addChild(item);
categoryItemList->append(item);
m_pages.append(page);
stackedPages->addWidget(page->createPage(stackedPages));
@ -179,6 +175,16 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &categoryId,
index++;
}
foreach(QString category, m_categoryItemsMap.keys()) {
QList<QTreeWidgetItem *> *categoryItemList = m_categoryItemsMap.value(category);
if (categoryItemList->size() > 1) {
foreach (QTreeWidgetItem *item, *categoryItemList) {
QTreeWidgetItem *categoryItem = categories.value(category);
categoryItem->addChild(item);
}
}
}
QList<int> sizes;
sizes << 150 << 300;
splitter->setSizes(sizes);
@ -189,22 +195,49 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &categoryId,
SettingsDialog::~SettingsDialog()
{
foreach(QString category, m_categoryItemsMap.keys()) {
QList<QTreeWidgetItem *> *categoryItemList = m_categoryItemsMap.value(category);
delete categoryItemList;
}
}
void SettingsDialog::pageSelected()
{
QTreeWidgetItem *item = pageTree->currentItem();
if (!item)
return;
PageData data = item->data(0, Qt::UserRole).value<PageData>();
int index = data.index;
m_currentCategory = data.category;
m_currentPage = data.id;
stackedPages->setCurrentIndex(index);
// If user selects a toplevel item, select the first child for them
// I.e. Top level items are not really selectable
if ((pageTree->indexOfTopLevelItem(item) >= 0) && (item->childCount() > 0)) {
emit categoryItemSelected();
}
}
void SettingsDialog::categoryItemSelectedShowChildInstead()
{
QTreeWidgetItem *item = pageTree->currentItem();
item->setExpanded(true);
pageTree->setCurrentItem(item->child(0), 0, QItemSelectionModel::SelectCurrent);
}
void SettingsDialog::deletePage()
{
QTreeWidgetItem *item = pageTree->currentItem();
item->parent()->removeChild(item);
PageData data = item->data(0, Qt::UserRole).value<PageData>();
QString category = data.category;
QList<QTreeWidgetItem *> *categoryItemList = m_categoryItemsMap.value(category);
QTreeWidgetItem *parentItem = item->parent();
parentItem->removeChild(item);
categoryItemList->removeOne(item);
if (parentItem->childCount() == 1) {
parentItem->removeChild(parentItem->child(0));
}
pageSelected();
}
@ -227,11 +260,20 @@ void SettingsDialog::insertPage(IOptionsPage* page)
if (!categoryItem)
return;
// If this category has no child right now
// we need to add the "default child"
QList<QTreeWidgetItem *> *categoryItemList = m_categoryItemsMap.value(page->category());
if (categoryItem->childCount() == 0) {
QTreeWidgetItem *defaultItem = categoryItemList->at(0);
categoryItem->addChild(defaultItem);
}
QTreeWidgetItem *item = new QTreeWidgetItem;
item->setText(0, page->trName());
item->setData(0, Qt::UserRole, qVariantFromValue(pageData));
categoryItem->addChild(item);
categoryItemList->append(item);
m_pages.append(page);
stackedPages->addWidget(page->createPage(stackedPages));
@ -266,14 +308,15 @@ void SettingsDialog::reject()
{
foreach (IOptionsPage *page, m_pages)
page->finish();
done(QDialog::Rejected);
}
void SettingsDialog::apply()
{
foreach (IOptionsPage *page, m_pages) {
foreach (IOptionsPage *page, m_pages)
page->apply();
}
m_applied = true;
}

View File

@ -62,6 +62,7 @@ public:
signals:
void settingsDialogShown(Core::Internal::SettingsDialog*);
void settingsDialogRemoved();
void categoryItemSelected();
public slots:
void done(int);
@ -71,9 +72,13 @@ private slots:
void accept();
void reject();
void apply();
void categoryItemSelectedShowChildInstead();
private:
QList<Core::IOptionsPage*> m_pages;
QMap<QString, QList<QTreeWidgetItem *> *> m_categoryItemsMap;
UAVGadgetInstanceManager *m_instanceManager;
bool m_applied;
QString m_currentCategory;

View File

@ -0,0 +1,35 @@
#
# This qmake file generates a header with the GCS version info string.
#
# This is a bit tricky since the script should be run always and before
# the other dependencies evaluation.
#
# Since debug_and_release option is set, we need this
!debug_and_release|build_pass {
ROOT_DIR = $$GCS_SOURCE_TREE/../..
VERSION_INFO_HEADER = $$GCS_BUILD_TREE/gcsversioninfo.h
VERSION_INFO_SCRIPT = $$ROOT_DIR/make/scripts/version-info.py
VERSION_INFO_TEMPLATE = $$ROOT_DIR/make/templates/gcsversioninfotemplate.h
VERSION_INFO_COMMAND = python \"$$VERSION_INFO_SCRIPT\"
# Create custom version_info target which generates a header
version_info.target = $$VERSION_INFO_HEADER
version_info.commands = $$VERSION_INFO_COMMAND \
--path=\"$$GCS_SOURCE_TREE\" \
--template=\"$$VERSION_INFO_TEMPLATE\" \
--outfile=\"$$VERSION_INFO_HEADER\"
version_info.depends = FORCE
QMAKE_EXTRA_TARGETS += version_info
# Hook version_info target in between qmake's Makefile update and
# the actual project target
version_info_hook.depends = version_info
debug_and_release {
CONFIG(debug,debug|release):version_info_hook.target = Makefile.Debug
CONFIG(release,debug|release):version_info_hook.target = Makefile.Release
} else {
version_info_hook.target = Makefile
}
QMAKE_EXTRA_TARGETS += version_info_hook
}

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg3675" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata id="metadata29">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs3677">
<linearGradient id="linearGradient2407" y2="5.4676" gradientUnits="userSpaceOnUse" x2="63.397" gradientTransform="matrix(2.1154 0 0 2.1153 -107.58 32.427)" y1="-12.489" x1="63.397">
<stop id="stop4875" style="stop-color:#fff" offset="0"/>
<stop id="stop4877" style="stop-color:#fff;stop-opacity:0" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient2410" gradientUnits="userSpaceOnUse" cy="3.99" cx="23.896" gradientTransform="matrix(0 2.2875 -3.0194 0 36.047 -50.63)" r="20.397">
<stop id="stop2778" style="stop-color:#8badea" offset="0"/>
<stop id="stop2780" style="stop-color:#6396cd" offset=".26238"/>
<stop id="stop2782" style="stop-color:#3b7caf" offset=".66094"/>
<stop id="stop2784" style="stop-color:#194c70" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient2412" y2="3.0816" gradientUnits="userSpaceOnUse" x2="18.379" gradientTransform="matrix(.95844 0 0 .95844 .99752 1.9975)" y1="44.98" x1="18.379">
<stop id="stop2788" style="stop-color:#1f4b6a" offset="0"/>
<stop id="stop2790" style="stop-color:#4083c2" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient2415" gradientUnits="userSpaceOnUse" cy="4.625" cx="62.625" gradientTransform="matrix(2.1647 0 0 .75294 -111.56 36.518)" r="10.625">
<stop id="stop8840" offset="0"/>
<stop id="stop8842" style="stop-opacity:0" offset="1"/>
</radialGradient>
</defs>
<path id="path8836" style="opacity:.3;fill-rule:evenodd;fill:url(#radialGradient2415)" d="m47 40c0 4.418-10.297 8-23 8s-23-3.582-23-8 10.297-8 23-8 23 3.582 23 8z"/>
<path id="path2555" style="stroke-linejoin:round;stroke:url(#linearGradient2412);stroke-linecap:round;stroke-width:1.0037;fill:url(#radialGradient2410)" d="m24 5.5018c-10.758 0-19.498 8.7402-19.498 19.498-0.0002 10.758 8.74 19.498 19.498 19.498s19.498-8.74 19.498-19.498-8.74-19.498-19.498-19.498z"/>
<path id="path8655" style="opacity:.4;stroke:url(#linearGradient2407);fill:none" d="m42.5 24.999c0 10.218-8.283 18.501-18.5 18.501s-18.5-8.283-18.5-18.501c0-10.217 8.283-18.499 18.5-18.499s18.5 8.282 18.5 18.499z"/>
<path id="path9053" style="opacity:.2" d="m24.91 30.164c-0.066-2.359 0.463-4.649 2.691-6.271 2.354-1.834 4.621-4.129 4.382-6.835-0.053-2.609-3.093-4.653-6.368-4.947-3.684-0.511-8.142 0.751-9.377 3.629-0.626 1.399-0.045 3.91 2.056 3.91 1.229 0 1.794-0.794 1.887-1.521 0.07-0.549-0.156-1.04-0.289-1.494-0.152-0.517 0.496-1.519 1.202-1.928 0.59-0.341 1.207-0.455 1.298-0.477 2.118-0.509 4.229 0.615 5.11 1.984 0.881 1.368-0.088 3.444-1.482 5.463-1.395 2.018-2.891 4.311-2.885 6.746 0 0.928-0.082 1.243-0.024 1.618 0.047 0.299 1.039 0.263 1.799 0.123zm-0.966 3.174c-2.025-0.11-3.427 2.186-2.211 3.649 1.087 1.615 4.133 1.217 4.656-0.612 0.542-1.423-0.764-3.06-2.445-3.037z"/>
<path id="path3298" style="fill:#fff" d="m24.91 31.164c-0.066-2.359 0.463-4.649 2.691-6.271 2.354-1.834 4.621-4.129 4.382-6.835-0.053-2.609-3.093-4.653-6.368-4.947-3.684-0.511-8.142 0.751-9.377 3.629-0.626 1.399-0.045 3.91 2.056 3.91 1.229 0 1.794-0.794 1.887-1.521 0.07-0.549-0.156-1.04-0.289-1.494-0.152-0.517 0.496-1.519 1.202-1.928 0.59-0.341 1.207-0.455 1.298-0.477 2.118-0.509 4.229 0.615 5.11 1.984 0.881 1.368-0.088 3.444-1.482 5.463-1.395 2.018-2.891 4.311-2.885 6.746 0 0.928-0.082 1.243-0.024 1.618 0.047 0.299 1.039 0.263 1.799 0.123zm-0.966 3.174c-2.025-0.11-3.427 2.186-2.211 3.649 1.087 1.615 4.133 1.217 4.656-0.612 0.542-1.423-0.764-3.06-2.445-3.037z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

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