1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-18 03:52:11 +01:00

Merge remote-tracking branch 'remotes/origin/james/revolution' into osd_test

Conflicts:
	ground/openpilotgcs/src/plugins/scope/scopegadgetwidget.cpp
This commit is contained in:
Sambas 2012-03-11 09:39:51 +02:00
commit 742f3ff24d
245 changed files with 38863 additions and 7172 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "overo"]
path = overo
url = git@github.com:peabody124/op_overo.git

View File

@ -1,5 +1,9 @@
Short summary of changes. For a complete list see the git log. Short summary of changes. For a complete list see the git log.
2012-02-14
New QML based system to allow more flexible UI. Upgraded stabilization
configuration.
2012-01-02 2012-01-02
CC FW now supports USB Virtual Com Port (VCP/CDC) in addition to the original HID interface CC FW now supports USB Virtual Com Port (VCP/CDC) in addition to the original HID interface
New ComUsbBridge module can bridge any serial port to the USB CDC port New ComUsbBridge module can bridge any serial port to the USB CDC port

127
Makefile
View File

@ -200,7 +200,9 @@ arm_sdk_clean:
$(V1) [ ! -d "$(ARM_SDK_DIR)" ] || $(RM) -r $(ARM_SDK_DIR) $(V1) [ ! -d "$(ARM_SDK_DIR)" ] || $(RM) -r $(ARM_SDK_DIR)
# Set up openocd tools # Set up openocd tools
OPENOCD_DIR := $(TOOLS_DIR)/openocd OPENOCD_DIR := $(TOOLS_DIR)/openocd
OPENOCD_WIN_DIR := $(TOOLS_DIR)/openocd_win
OPENOCD_BUILD_DIR := $(DL_DIR)/openocd-build
.PHONY: openocd_install .PHONY: openocd_install
openocd_install: | $(DL_DIR) $(TOOLS_DIR) openocd_install: | $(DL_DIR) $(TOOLS_DIR)
@ -211,42 +213,139 @@ openocd_install: openocd_clean
$(V1) wget -N -P "$(DL_DIR)" --trust-server-name "$(OPENOCD_URL)" $(V1) wget -N -P "$(DL_DIR)" --trust-server-name "$(OPENOCD_URL)"
# extract the source # extract the source
$(V1) [ ! -d "$(DL_DIR)/openocd-build" ] || $(RM) -r "$(DL_DIR)/openocd-build" $(V1) [ ! -d "$(OPENOCD_BUILD_DIR)" ] || $(RM) -r "$(OPENOCD_BUILD_DIR)"
$(V1) mkdir -p "$(DL_DIR)/openocd-build" $(V1) mkdir -p "$(OPENOCD_BUILD_DIR)"
$(V1) tar -C $(DL_DIR)/openocd-build -xjf "$(DL_DIR)/$(OPENOCD_FILE)" $(V1) tar -C $(OPENOCD_BUILD_DIR) -xjf "$(DL_DIR)/$(OPENOCD_FILE)"
# build and install # build and install
$(V1) mkdir -p "$(OPENOCD_DIR)" $(V1) mkdir -p "$(OPENOCD_DIR)"
$(V1) ( \ $(V1) ( \
cd $(DL_DIR)/openocd-build/openocd-0.5.0 ; \ cd $(OPENOCD_BUILD_DIR)/openocd-0.5.0 ; \
./configure --prefix="$(OPENOCD_DIR)" --enable-ft2232_libftdi --enable-buspirate; \ ./configure --prefix="$(OPENOCD_DIR)" --enable-ft2232_libftdi --enable-buspirate; \
$(MAKE) --silent ; \ $(MAKE) --silent ; \
$(MAKE) --silent install ; \ $(MAKE) --silent install ; \
) )
# delete the extracted source when we're done # delete the extracted source when we're done
$(V1) [ ! -d "$(DL_DIR)/openocd-build" ] || $(RM) -rf "$(DL_DIR)/openocd-build" $(V1) [ ! -d "$(OPENOCD_BUILD_DIR)" ] || $(RM) -rf "$(OPENOCD_BUILD_DIR)"
.PHONY: ftd2xx_install
FTD2XX_DIR := $(DL_DIR)/ftd2xx
ftd2xx_install: | $(DL_DIR)
ftd2xx_install: FTD2XX_URL := http://www.ftdichip.com/Drivers/CDM/Beta/CDM20817.zip
ftd2xx_install: FTD2XX_FILE := CDM20817.zip
ftd2xx_install: ftd2xx_clean
# download the file only if it's newer than what we already have
$(V0) @echo " DOWNLOAD $(FTD2XX_URL)"
$(V1) wget -q -N -P "$(DL_DIR)" "$(FTD2XX_URL)"
# extract the source
$(V0) @echo " EXTRACT $(FTD2XX_FILE) -> $(FTD2XX_DIR)"
$(V1) mkdir -p "$(FTD2XX_DIR)"
$(V1) unzip -q -d "$(FTD2XX_DIR)" "$(DL_DIR)/$(FTD2XX_FILE)"
.PHONY: ftd2xx_clean
ftd2xx_clean:
$(V0) @echo " CLEAN $(FTD2XX_DIR)"
$(V1) [ ! -d "$(FTD2XX_DIR)" ] || $(RM) -r "$(FTD2XX_DIR)"
.PHONY: ftd2xx_install
LIBUSB_WIN_DIR := $(DL_DIR)/libusb-win32-bin-1.2.6.0
libusb_win_install: | $(DL_DIR)
libusb_win_install: LIBUSB_WIN_URL := http://sourceforge.net/projects/libusb-win32/files/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip/download
libusb_win_install: LIBUSB_WIN_FILE := libusb-win32-bin-1.2.6.0.zip
libusb_win_install: libusb_win_clean
# download the file only if it's newer than what we already have
$(V0) @echo " DOWNLOAD $(LIBUSB_WIN_URL)"
$(V1) wget -q -N -P "$(DL_DIR)" --trust-server-name "$(LIBUSB_WIN_URL)"
# extract the source
$(V0) @echo " EXTRACT $(LIBUSB_WIN_FILE) -> $(LIBUSB_WIN_DIR)"
$(V1) mkdir -p "$(LIBUSB_WIN_DIR)"
$(V1) unzip -q -d "$(DL_DIR)" "$(DL_DIR)/$(LIBUSB_WIN_FILE)"
# fixup .h file needed by openocd build
$(V0) @echo " FIXUP $(LIBUSB_WIN_DIR)"
$(V1) ln -s "$(LIBUSB_WIN_DIR)/include/lusb0_usb.h" "$(LIBUSB_WIN_DIR)/include/usb.h"
.PHONY: libusb_win_clean
libusb_win_clean:
$(V0) @echo " CLEAN $(LIBUSB_WIN_DIR)"
$(V1) [ ! -d "$(LIBUSB_WIN_DIR)" ] || $(RM) -r "$(LIBUSB_WIN_DIR)"
.PHONY: openocd_git_win_install
openocd_git_win_install: | $(DL_DIR) $(TOOLS_DIR)
openocd_git_win_install: OPENOCD_URL := git://openocd.git.sourceforge.net/gitroot/openocd/openocd
openocd_git_win_install: OPENOCD_REV := c59a4419fcc5568d59fbaee775132f91cb7fd26b
openocd_git_win_install: openocd_win_clean libusb_win_install ftd2xx_install
# download the source
$(V0) @echo " DOWNLOAD $(OPENOCD_URL) @ $(OPENOCD_REV)"
$(V1) [ ! -d "$(OPENOCD_BUILD_DIR)" ] || $(RM) -rf "$(OPENOCD_BUILD_DIR)"
$(V1) mkdir -p "$(OPENOCD_BUILD_DIR)"
$(V1) git clone --depth 1 --no-checkout $(OPENOCD_URL) "$(DL_DIR)/openocd-build"
$(V1) ( \
cd $(OPENOCD_BUILD_DIR) ; \
git checkout -q $(OPENOCD_REV) ; \
)
# apply patches
$(V0) @echo " PATCH $(OPENOCD_BUILD_DIR)"
$(V1) ( \
cd $(OPENOCD_BUILD_DIR) ; \
git apply < $(ROOT_DIR)/flight/Project/OpenOCD/0001-armv7m-remove-dummy-FP-regs-for-new-gdb.patch ; \
git apply < $(ROOT_DIR)/flight/Project/OpenOCD/0002-rtos-add-stm32_stlink-to-FreeRTOS-targets.patch ; \
)
# build and install
$(V0) @echo " BUILD $(OPENOCD_WIN_DIR)"
$(V1) mkdir -p "$(OPENOCD_WIN_DIR)"
$(V1) ( \
cd $(OPENOCD_BUILD_DIR) ; \
./bootstrap ; \
./configure --enable-maintainer-mode --prefix="$(OPENOCD_WIN_DIR)" \
--build=i686-pc-linux-gnu --host=i586-mingw32msvc \
CPPFLAGS=-I$(LIBUSB_WIN_DIR)/include \
LDFLAGS=-L$(LIBUSB_WIN_DIR)/lib/gcc \
--enable-ft2232_ftd2xx --with-ftd2xx-win32-zipdir=$(FTD2XX_DIR) \
--disable-werror \
--enable-stlink ; \
$(MAKE) ; \
$(MAKE) install ; \
)
# delete the extracted source when we're done
$(V1) [ ! -d "$(OPENOCD_BUILD_DIR)" ] || $(RM) -rf "$(OPENOCD_BUILD_DIR)"
.PHONY: openocd_win_clean
openocd_win_clean:
$(V0) @echo " CLEAN $(OPENOCD_WIN_DIR)"
$(V1) [ ! -d "$(OPENOCD_WIN_DIR)" ] || $(RM) -r "$(OPENOCD_WIN_DIR)"
.PHONY: openocd_git_install .PHONY: openocd_git_install
openocd_git_install: | $(DL_DIR) $(TOOLS_DIR) openocd_git_install: | $(DL_DIR) $(TOOLS_DIR)
openocd_git_install: OPENOCD_URL := git://openocd.git.sourceforge.net/gitroot/openocd/openocd openocd_git_install: OPENOCD_URL := git://openocd.git.sourceforge.net/gitroot/openocd/openocd
openocd_git_install: OPENOCD_REV := bce7009e31b23250d4325637c7b7cdbae0efed9a openocd_git_install: OPENOCD_REV := c59a4419fcc5568d59fbaee775132f91cb7fd26b
openocd_git_install: openocd_clean openocd_git_install: openocd_clean
# download the source # download the source
$(V0) @echo " DOWNLOAD $(OPENOCD_URL) @ $(OPENOCD_REV)" $(V0) @echo " DOWNLOAD $(OPENOCD_URL) @ $(OPENOCD_REV)"
$(V1) [ ! -d "$(DL_DIR)/openocd-build" ] || $(RM) -rf "$(DL_DIR)/openocd-build" $(V1) [ ! -d "$(OPENOCD_BUILD_DIR)" ] || $(RM) -rf "$(OPENOCD_BUILD_DIR)"
$(V1) mkdir -p "$(DL_DIR)/openocd-build" $(V1) mkdir -p "$(OPENOCD_BUILD_DIR)"
$(V1) git clone --depth 1 --no-checkout $(OPENOCD_URL) "$(DL_DIR)/openocd-build" $(V1) git clone --depth 1 --no-checkout $(OPENOCD_URL) "$(OPENOCD_BUILD_DIR)"
$(V1) ( \ $(V1) ( \
cd $(DL_DIR)/openocd-build ; \ cd $(OPENOCD_BUILD_DIR) ; \
git checkout -q $(OPENOCD_REV) ; \ git checkout -q $(OPENOCD_REV) ; \
) )
# apply patches # apply patches
$(V0) @echo " PATCH $(OPENOCD_DIR)" $(V0) @echo " PATCH $(OPENOCD_DIR)"
$(V1) ( \ $(V1) ( \
cd $(DL_DIR)/openocd-build ; \ cd $(OPENOCD_BUILD_DIR) ; \
git apply < $(ROOT_DIR)/flight/Project/OpenOCD/0001-armv7m-remove-dummy-FP-regs-for-new-gdb.patch ; \ git apply < $(ROOT_DIR)/flight/Project/OpenOCD/0001-armv7m-remove-dummy-FP-regs-for-new-gdb.patch ; \
git apply < $(ROOT_DIR)/flight/Project/OpenOCD/0002-rtos-add-stm32_stlink-to-FreeRTOS-targets.patch ; \ git apply < $(ROOT_DIR)/flight/Project/OpenOCD/0002-rtos-add-stm32_stlink-to-FreeRTOS-targets.patch ; \
) )
@ -255,7 +354,7 @@ openocd_git_install: openocd_clean
$(V0) @echo " BUILD $(OPENOCD_DIR)" $(V0) @echo " BUILD $(OPENOCD_DIR)"
$(V1) mkdir -p "$(OPENOCD_DIR)" $(V1) mkdir -p "$(OPENOCD_DIR)"
$(V1) ( \ $(V1) ( \
cd $(DL_DIR)/openocd-build ; \ cd $(OPENOCD_BUILD_DIR) ; \
./bootstrap ; \ ./bootstrap ; \
./configure --enable-maintainer-mode --prefix="$(OPENOCD_DIR)" --enable-ft2232_libftdi --enable-buspirate --enable-stlink ; \ ./configure --enable-maintainer-mode --prefix="$(OPENOCD_DIR)" --enable-ft2232_libftdi --enable-buspirate --enable-stlink ; \
$(MAKE) ; \ $(MAKE) ; \
@ -263,7 +362,7 @@ openocd_git_install: openocd_clean
) )
# delete the extracted source when we're done # delete the extracted source when we're done
$(V1) [ ! -d "$(DL_DIR)/openocd-build" ] || $(RM) -r "$(DL_DIR)/openocd-build" $(V1) [ ! -d "$(OPENOCD_BUILD_DIR)" ] || $(RM) -rf "$(OPENOCD_BUILD_DIR)"
.PHONY: openocd_clean .PHONY: openocd_clean
openocd_clean: openocd_clean:

135
artwork/Dials/deluxe/lineardial-horizontal.svg Normal file → Executable file
View File

@ -14,8 +14,8 @@
height="70.597504" height="70.597504"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.48.1 " inkscape:version="0.48.2 r9819"
sodipodi:docname="lineardial-horizontal.svg" sodipodi:docname="lineardial-horizontal-old2.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
inkscape:export-ydpi="103.61" inkscape:export-ydpi="103.61"
@ -25,15 +25,19 @@
<linearGradient <linearGradient
id="linearGradient4439"> id="linearGradient4439">
<stop <stop
style="stop-color:#1a1a1a;stop-opacity:1" style="stop-color:#666666;stop-opacity:0;"
offset="0" offset="0"
id="stop4441" /> id="stop4441" />
<stop <stop
id="stop4443" id="stop4443"
offset="0.19742694" offset="0.31684026"
style="stop-color:#808080;stop-opacity:1" /> style="stop-color:#a3a3a3;stop-opacity:1;" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#757575;stop-opacity:0.90517241;"
offset="0.62995511"
id="stop3987" />
<stop
style="stop-color:#666666;stop-opacity:0;"
offset="1" offset="1"
id="stop4445" /> id="stop4445" />
</linearGradient> </linearGradient>
@ -57,15 +61,11 @@
<stop <stop
id="stop4389" id="stop4389"
offset="0" offset="0"
style="stop-color:#4d4d4d;stop-opacity:1" /> style="stop-color:#8a8a8a;stop-opacity:1;" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#181818;stop-opacity:1;"
offset="0.60976541"
id="stop4391" />
<stop
id="stop4393"
offset="1" offset="1"
style="stop-color:#4d4d4d;stop-opacity:1" /> id="stop4391" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient4361"> id="linearGradient4361">
@ -237,15 +237,15 @@
<stop <stop
id="stop3905" id="stop3905"
offset="0" offset="0"
style="stop-color:#000000;stop-opacity:1" /> style="stop-color:#676767;stop-opacity:1;" />
<stop <stop
style="stop-color:#ffffff;stop-opacity:1" style="stop-color:#ffffff;stop-opacity:1"
offset="0.3220683" offset="0.43894145"
id="stop3907" /> id="stop3907" />
<stop <stop
id="stop3909" id="stop3909"
offset="1" offset="1"
style="stop-color:#000000;stop-opacity:1" /> style="stop-color:#7d7d7d;stop-opacity:1;" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5375"> id="linearGradient5375">
@ -425,46 +425,34 @@
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5116"> id="linearGradient5116">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop5118" />
<stop <stop
id="stop5124" id="stop5124"
offset="0.35911319" offset="0"
style="stop-color:#dcaf28;stop-opacity:1" /> style="stop-color:#ffc001;stop-opacity:1;" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#844700;stop-opacity:1;"
offset="1" offset="1"
id="stop5120" /> id="stop5120" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5106"> id="linearGradient5106">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop5108" />
<stop <stop
id="stop5114" id="stop5114"
offset="0.36023793" offset="0"
style="stop-color:#00a000;stop-opacity:1" /> style="stop-color:#00a000;stop-opacity:1" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#003d00;stop-opacity:1;"
offset="1" offset="1"
id="stop5110" /> id="stop5110" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5096"> id="linearGradient5096">
<stop
style="stop-color:#100000;stop-opacity:1"
offset="0"
id="stop5098" />
<stop <stop
id="stop5104" id="stop5104"
offset="0.36453304" offset="0"
style="stop-color:#aa0000;stop-opacity:1" /> style="stop-color:#e60000;stop-opacity:1;" />
<stop <stop
style="stop-color:#0c0000;stop-opacity:1" style="stop-color:#710000;stop-opacity:1;"
offset="1" offset="1"
id="stop5100" /> id="stop5100" />
</linearGradient> </linearGradient>
@ -687,7 +675,7 @@
x2="87.074203" x2="87.074203"
y2="168.83261" y2="168.83261"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,0.99999995,-0.99999975,0,-11.23354,-270.8763)" /> gradientTransform="matrix(0,1.0110991,-1.0062411,0,-10.360287,-272.19756)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5106" xlink:href="#linearGradient5106"
@ -697,7 +685,7 @@
x2="86.644958" x2="86.644958"
y2="173.46591" y2="173.46591"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,0.99999997,-1,0,-11.23354,-270.8763)" /> gradientTransform="matrix(0,1.0224134,-1.0048488,0,-10.554719,-273.54528)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5116" xlink:href="#linearGradient5116"
@ -707,7 +695,7 @@
x2="86.547356" x2="86.547356"
y2="168.82289" y2="168.82289"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,1,-1,0,-11.23354,-270.8763)" /> gradientTransform="matrix(0,1,-1.0055415,0,-10.459485,-270.8763)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5129" xlink:href="#linearGradient5129"
@ -932,7 +920,7 @@
xlink:href="#linearGradient3903" xlink:href="#linearGradient3903"
id="linearGradient3899" id="linearGradient3899"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,-0.99999988,1.7142859,0,35.373449,-317.43383)" gradientTransform="matrix(0,-0.99937716,1.7523173,0,32.05963,-317.33185)"
x1="-150.75359" x1="-150.75359"
y1="68.860146" y1="68.860146"
x2="-150.75359" x2="-150.75359"
@ -1120,16 +1108,16 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="3.1841238" inkscape:zoom="5.5410688"
inkscape:cx="140.38399" inkscape:cx="55.238424"
inkscape:cy="35.455778" inkscape:cy="35.455778"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer5" inkscape:current-layer="background"
showgrid="false" showgrid="false"
inkscape:window-width="1366" inkscape:window-width="1680"
inkscape:window-height="706" inkscape:window-height="957"
inkscape:window-x="-8" inkscape:window-x="-5"
inkscape:window-y="-8" inkscape:window-y="2"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -1163,8 +1151,7 @@
inkscape:label="Dark background" inkscape:label="Dark background"
id="g2932" id="g2932"
inkscape:groupmode="layer" inkscape:groupmode="layer"
transform="translate(-368.2988,-507.08981)" transform="translate(-368.2988,-507.08981)">
sodipodi:insensitive="true">
<g <g
id="background" id="background"
inkscape:label="#g4447"> inkscape:label="#g4447">
@ -1225,17 +1212,16 @@
id="layer5" id="layer5"
inkscape:label="Green Zone" inkscape:label="Green Zone"
style="display:inline" style="display:inline"
transform="translate(-140.85549,-141.35611)" transform="translate(-140.85549,-141.35611)">
sodipodi:insensitive="true">
<rect <rect
inkscape:label="#rect5741" inkscape:label="#rect5741"
style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline"
id="green" id="green"
width="260.53882" width="261.80212"
height="32.20755" height="32.929432"
x="-411.77084" x="-413.03415"
y="-184.00433" y="-184.72621"
ry="2.3767958" ry="2.430068"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -1246,17 +1232,16 @@
id="layer4" id="layer4"
inkscape:label="Yellow Zone" inkscape:label="Yellow Zone"
style="display:none" style="display:none"
transform="translate(-140.85549,-141.35611)" transform="translate(-140.85549,-141.35611)">
sodipodi:insensitive="true">
<rect <rect
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="2.4231479" ry="2.4231479"
y="-184.63248" y="-184.63248"
x="-411.45679" x="-412.90054"
height="32.835663" height="32.835663"
width="260.53882" width="261.98257"
id="yellow" id="yellow"
style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline"
inkscape:label="#rect5741" inkscape:label="#rect5741"
@ -1267,17 +1252,16 @@
id="layer3" id="layer3"
inkscape:label="Red zone" inkscape:label="Red zone"
style="display:none" style="display:none"
transform="translate(-140.85549,-141.35611)" transform="translate(-140.85549,-141.35611)">
sodipodi:insensitive="true">
<rect <rect
inkscape:label="#rect5741" inkscape:label="#rect5741"
style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline"
id="red" id="red"
width="260.23901" width="261.86325"
height="32.519711" height="32.880653"
x="-411.38739" x="-413.01163"
y="-184.35484" y="-184.71579"
ry="2.399832" ry="2.4264681"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -1288,17 +1272,18 @@
id="layer6" id="layer6"
inkscape:label="Indicator" inkscape:label="Indicator"
style="display:inline" style="display:inline"
transform="translate(-140.85549,-141.35611)" transform="translate(-140.85549,-141.35611)">
sodipodi:insensitive="true">
<rect <rect
style="fill:url(#linearGradient3899);fill-opacity:1;stroke:#000000;stroke-width:0.2964696;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#linearGradient3899);fill-opacity:1;stroke:#000000;stroke-width:0.4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="needle" id="needle"
width="32.035065" width="33.114704"
height="6.0045304" height="5.0989962"
x="152.63882" x="151.5576"
y="-157.12926" y="-156.22531"
inkscape:label="#rect5246" inkscape:label="#rect5246"
transform="matrix(0,1,-1,0,0,0)" /> transform="matrix(0,1,-1,0,0,0)"
ry="2.5494981"
rx="1.9392394" />
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

219
artwork/Dials/deluxe/lineardial-vertical.svg Normal file → Executable file
View File

@ -14,20 +14,31 @@
height="322.58304" height="322.58304"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.48.1 " inkscape:version="0.48.2 r9819"
sodipodi:docname="lineardial-vertical.svg" sodipodi:docname="lineardial-vertical-old2.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
inkscape:export-ydpi="103.61" inkscape:export-ydpi="103.61"
style="display:inline"> style="display:inline">
<defs <defs
id="defs10070"> id="defs10070">
<linearGradient
id="linearGradient3894">
<stop
style="stop-color:#171717;stop-opacity:1;"
offset="0"
id="stop3896" />
<stop
style="stop-color:#b0b0b0;stop-opacity:1;"
offset="1"
id="stop3898" />
</linearGradient>
<linearGradient <linearGradient
id="linearGradient3903"> id="linearGradient3903">
<stop <stop
id="stop3905" id="stop3905"
offset="0" offset="0"
style="stop-color:#000000;stop-opacity:1" /> style="stop-color:#656565;stop-opacity:1;" />
<stop <stop
style="stop-color:#ffffff;stop-opacity:1" style="stop-color:#ffffff;stop-opacity:1"
offset="0.39386007" offset="0.39386007"
@ -35,7 +46,7 @@
<stop <stop
id="stop3909" id="stop3909"
offset="1" offset="1"
style="stop-color:#000000;stop-opacity:1" /> style="stop-color:#757575;stop-opacity:1;" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5375"> id="linearGradient5375">
@ -83,15 +94,19 @@
<stop <stop
id="stop5348" id="stop5348"
offset="0" offset="0"
style="stop-color:#1a1a1a;stop-opacity:1" /> style="stop-color:#9c9c9c;stop-opacity:0;" />
<stop <stop
style="stop-color:#666666;stop-opacity:1" id="stop3921"
offset="0.35277387" offset="0.359375"
id="stop5350" /> style="stop-color:#6c6c6c;stop-opacity:0.88793105;" />
<stop
style="stop-color:#5f5f5f;stop-opacity:0.62931037;"
offset="0.62630206"
id="stop3923" />
<stop <stop
id="stop5352" id="stop5352"
offset="1" offset="1"
style="stop-color:#1a1a1a;stop-opacity:1" /> style="stop-color:#9c9c9c;stop-opacity:0;" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5326"> id="linearGradient5326">
@ -215,46 +230,34 @@
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5116"> id="linearGradient5116">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop5118" />
<stop <stop
id="stop5124" id="stop5124"
offset="0.37640449" offset="0"
style="stop-color:#dcaf28;stop-opacity:1" /> style="stop-color:#ffc001;stop-opacity:1;" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#844700;stop-opacity:1;"
offset="1" offset="1"
id="stop5120" /> id="stop5120" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5106"> id="linearGradient5106">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop5108" />
<stop <stop
id="stop5114" id="stop5114"
offset="0.38184431" offset="0"
style="stop-color:#00a000;stop-opacity:1" /> style="stop-color:#00a000;stop-opacity:1" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#003d00;stop-opacity:1;"
offset="1" offset="1"
id="stop5110" /> id="stop5110" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5096"> id="linearGradient5096">
<stop
style="stop-color:#100000;stop-opacity:1"
offset="0"
id="stop5098" />
<stop <stop
id="stop5104" id="stop5104"
offset="0.39717463" offset="0"
style="stop-color:#aa0000;stop-opacity:1" /> style="stop-color:#e60000;stop-opacity:1;" />
<stop <stop
style="stop-color:#0c0000;stop-opacity:1" style="stop-color:#710000;stop-opacity:1;"
offset="1" offset="1"
id="stop5100" /> id="stop5100" />
</linearGradient> </linearGradient>
@ -475,7 +478,8 @@
y1="132.84332" y1="132.84332"
x2="-58.661255" x2="-58.661255"
y2="169.46072" y2="169.46072"
gradientUnits="userSpaceOnUse" /> gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0045664,0,0,0.98072534,3.8285685,3.8328979)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5106" xlink:href="#linearGradient5106"
@ -484,7 +488,8 @@
y1="133.15433" y1="133.15433"
x2="-38.946774" x2="-38.946774"
y2="168.58655" y2="168.58655"
gradientUnits="userSpaceOnUse" /> gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0048708,0,0,1.0000284,3.816285,2.2385824)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5116" xlink:href="#linearGradient5116"
@ -493,7 +498,8 @@
y1="133.16322" y1="133.16322"
x2="-17.108463" x2="-17.108463"
y2="168.82289" y2="168.82289"
gradientUnits="userSpaceOnUse" /> gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0057658,0,0,0.99502095,3.8176724,2.8357789)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5129" xlink:href="#linearGradient5129"
@ -711,7 +717,8 @@
x1="-246.82069" x1="-246.82069"
y1="353.9455" y1="353.9455"
x2="-247.44464" x2="-247.44464"
y2="412.00528" /> y2="412.00528"
gradientTransform="matrix(1,0,0,0.98663274,0,3.8538758)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5375" xlink:href="#linearGradient5375"
@ -727,11 +734,21 @@
xlink:href="#linearGradient3903" xlink:href="#linearGradient3903"
id="linearGradient3899" id="linearGradient3899"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.99999998,0,0,1.7142857,306.20028,-235.50286)" gradientTransform="matrix(1.0304804,0,0,1.7130087,311.94981,-242.17845)"
x1="-172.33069" x1="-172.33069"
y1="74.562233" y1="74.562233"
x2="-135.50557" x2="-136.75557"
y2="74.562233" /> y2="74.015358" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3894"
id="linearGradient3900"
x1="-353.51318"
y1="324.74451"
x2="-355.30441"
y2="355.70587"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0187536,0,0,1.2873355,10.177224,-58.104213)" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -740,16 +757,16 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1.9843492" inkscape:zoom="7.87"
inkscape:cx="13.888309" inkscape:cx="0.68217946"
inkscape:cy="302.67927" inkscape:cy="151.28502"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer6" inkscape:current-layer="layer4"
showgrid="false" showgrid="false"
inkscape:window-width="1366" inkscape:window-width="1680"
inkscape:window-height="706" inkscape:window-height="957"
inkscape:window-x="-8" inkscape:window-x="0"
inkscape:window-y="-8" inkscape:window-y="0"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -765,7 +782,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title /> <dc:title></dc:title>
<dc:creator> <dc:creator>
<cc:Agent> <cc:Agent>
<dc:title>Edouard Lafargue</dc:title> <dc:title>Edouard Lafargue</dc:title>
@ -779,8 +796,7 @@
inkscape:label="Dark background" inkscape:label="Dark background"
id="g2932" id="g2932"
inkscape:groupmode="layer" inkscape:groupmode="layer"
transform="translate(-357.06525,-236.21351)" transform="translate(-357.06525,-236.21351)">
sodipodi:insensitive="true">
<g <g
id="background" id="background"
inkscape:label="#g5354"> inkscape:label="#g5354">
@ -789,39 +805,39 @@
style="fill:url(#linearGradient5344);fill-opacity:1;stroke:none" style="fill:url(#linearGradient5344);fill-opacity:1;stroke:none"
id="rect2936" id="rect2936"
width="318.58304" width="318.58304"
height="46.756046" height="46.131046"
x="-556.79657" x="-556.79657"
y="358.44128" y="357.50378"
ry="3.4504199" ry="3.4042974"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" /> inkscape:export-ydpi="88.809998" />
<rect
transform="matrix(0,-1,1,0,0,0)"
style="fill:#332d2d;fill-opacity:1;stroke:none"
id="bargraph"
width="260.53882"
height="34.835861"
x="-519.56018"
y="362.7359"
ry="2.5707548"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" />
<rect <rect
transform="matrix(0,-1,1,0,0,0)" transform="matrix(0,-1,1,0,0,0)"
inkscape:label="#rect4388" inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="2.2944832" ry="2.9537699"
y="365.23175" y="360.57819"
x="-519.56018" x="-519.12665"
height="31.09215" height="40.026031"
width="260.53882" width="265.4249"
id="bargraph-outer" id="bargraph-outer"
style="fill:#332d2d;fill-opacity:1;stroke:none" /> style="fill:url(#linearGradient3900);fill-opacity:1;stroke:none" />
<rect
transform="matrix(0,-1,1,0,0,0)"
style="fill:#332d2d;fill-opacity:1;stroke:none"
id="bargraph"
width="262.19809"
height="33.195633"
x="-516.71185"
y="363.7984"
ry="16.597816"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" />
</g> </g>
</g> </g>
<g <g
@ -829,17 +845,16 @@
id="layer5" id="layer5"
inkscape:label="Green Zone" inkscape:label="Green Zone"
style="display:inline" style="display:inline"
transform="translate(-129.62194,129.52019)" transform="translate(-129.62194,129.52019)">
sodipodi:insensitive="true">
<rect <rect
inkscape:label="#rect5741" inkscape:label="#rect5741"
style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline"
id="green" id="green"
width="260.53882" width="261.80789"
height="34.0919" height="34.092869"
x="-153.97397" x="-150.90765"
y="134.02345" y="136.26584"
ry="2.5158536" ry="2.5159254"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -849,18 +864,17 @@
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer4" id="layer4"
inkscape:label="Yellow Zone" inkscape:label="Yellow Zone"
style="display:none" style="display:inline"
transform="translate(-129.62194,129.52019)" transform="translate(-129.62194,129.52019)">
sodipodi:insensitive="true">
<rect <rect
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="2.5158532" ry="2.5033269"
y="134.02345" y="136.19191"
x="-153.97397" x="-151.04408"
height="34.091896" height="33.92215"
width="260.53882" width="262.04108"
id="yellow" id="yellow"
style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline"
inkscape:label="#rect5741" inkscape:label="#rect5741"
@ -871,17 +885,16 @@
id="layer3" id="layer3"
inkscape:label="Red zone" inkscape:label="Red zone"
style="display:none" style="display:none"
transform="translate(-129.62194,129.52019)" transform="translate(-129.62194,129.52019)">
sodipodi:insensitive="true">
<rect <rect
inkscape:label="#rect5741" inkscape:label="#rect5741"
style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline"
id="red" id="red"
width="260.53882" width="261.72849"
height="34.589863" height="33.923153"
x="-154.0755" x="-150.95049"
y="134.00487" y="135.25487"
ry="2.5526016" ry="2.503401"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -894,35 +907,35 @@
style="display:inline" style="display:inline"
transform="translate(-129.62194,129.52019)"> transform="translate(-129.62194,129.52019)">
<rect <rect
style="fill:url(#linearGradient3899);fill-opacity:1;stroke:#000000;stroke-width:0.30000000999999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#linearGradient3899);fill-opacity:1;stroke:#000000;stroke-width:0.30442432;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="needle" id="needle"
width="33.162418" width="34.173222"
height="5.9393759" height="5.9349518"
x="135.64999" x="136.20108"
y="-107.91632" y="-114.68695"
inkscape:label="#rect5246" /> inkscape:label="#rect5246"
ry="2.4981377" />
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1" id="layer1"
inkscape:label="Text" inkscape:label="Text"
style="display:inline" style="display:inline"
transform="translate(-129.62194,129.52019)" transform="translate(-129.62194,129.52019)">
sodipodi:insensitive="true">
<rect <rect
style="fill:#ffffff;fill-opacity:1;stroke:none" style="fill:#ffffff;fill-opacity:1;stroke:none"
id="field" id="field"
width="33.853165" width="46.305515"
height="12.626906" height="12.626906"
x="128.30692" x="129.09726"
y="157.31393" y="157.31393"
inkscape:label="#rect2878" /> inkscape:label="#rect2878" />
<rect <rect
inkscape:label="#rect2878" inkscape:label="#rect2878"
y="170.91206" y="170.91206"
x="128.88902" x="129.9335"
height="12.626906" height="12.626906"
width="32.851257" width="45.176544"
id="value" id="value"
style="fill:#ffffff;fill-opacity:1;stroke:none" /> style="fill:#ffffff;fill-opacity:1;stroke:none" />
</g> </g>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -414,7 +414,7 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
# Add jtag targets (program and wipe) # Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE),$(OPENOCD_CONFIG))) $(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE),$(OPENOCD_JTAG_CONFIG),$(OPENOCD_CONFIG)))
.PHONY: elf lss sym hex bin bino .PHONY: elf lss sym hex bin bino
elf: $(OUTDIR)/$(TARGET).elf elf: $(OUTDIR)/$(TARGET).elf

View File

@ -418,7 +418,7 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
# Add jtag targets (program and wipe) # Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE),$(OPENOCD_CONFIG))) $(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE),$(OPENOCD_JTAG_CONFIG),$(OPENOCD_CONFIG)))
.PHONY: elf lss sym hex bin bino .PHONY: elf lss sym hex bin bino
elf: $(OUTDIR)/$(TARGET).elf elf: $(OUTDIR)/$(TARGET).elf

View File

@ -46,10 +46,8 @@ else
REMOVE_CMD = rm REMOVE_CMD = rm
endif endif
FLASH_TOOL = OPENOCD
# Paths # Paths
REVO_BL = ./ REVO_BL = $(WHEREAMI)
REVO_BLINC = $(REVO_BL)/inc REVO_BLINC = $(REVO_BL)/inc
PIOS = ../../PiOS PIOS = ../../PiOS
PIOSINC = $(PIOS)/inc PIOSINC = $(PIOS)/inc
@ -64,16 +62,8 @@ STMLIBDIR = $(APPLIBDIR)
STMSPDDIR = $(STMLIBDIR)/STM32F4xx_StdPeriph_Driver STMSPDDIR = $(STMLIBDIR)/STM32F4xx_StdPeriph_Driver
STMSPDSRCDIR = $(STMSPDDIR)/src STMSPDSRCDIR = $(STMSPDDIR)/src
STMSPDINCDIR = $(STMSPDDIR)/inc STMSPDINCDIR = $(STMSPDDIR)/inc
OPDIR = ../OpenPilot
OPUAVOBJ = ../UAVObjects
OPUAVOBJINC = $(OPUAVOBJ)/inc
OPSYSINC = $(OPDIR)/System/inc
BOOT = ../Bootloaders/Revolution
BOOTINC = $(BOOT)/inc
HWDEFSINC = ../../board_hw_defs/$(BOARD_NAME) HWDEFSINC = ../../board_hw_defs/$(BOARD_NAME)
OPUAVSYNTHDIR = $(OUTDIR)/../uavobject-synthetics/flight
# List C source files here. (C dependencies are automatically generated.) # List C source files here. (C dependencies are automatically generated.)
# use file-extension c for "c-only"-files # use file-extension c for "c-only"-files
@ -81,16 +71,12 @@ OPUAVSYNTHDIR = $(OUTDIR)/../uavobject-synthetics/flight
SRC += main.c SRC += main.c
SRC += pios_board.c SRC += pios_board.c
SRC += pios_usb_board_data.c SRC += pios_usb_board_data.c
SRC += bl_fsm.c SRC += op_dfu.c
## PIOS Hardware (STM32F4xx) ## PIOS Hardware (STM32F4xx)
include $(PIOS)/STM32F4xx/library.mk include $(PIOS)/STM32F4xx/library.mk
## Library files
SRC += $(FLIGHTLIB)/fifo_buffer.c
# PIOS Hardware (Common) # PIOS Hardware (Common)
#SRC += $(PIOSCOMMON)/pios_com.c
SRC += $(PIOSCOMMON)/pios_board_info.c SRC += $(PIOSCOMMON)/pios_board_info.c
SRC += $(PIOSCOMMON)/pios_com_msg.c SRC += $(PIOSCOMMON)/pios_com_msg.c
SRC += $(PIOSCOMMON)/printf-stdarg.c SRC += $(PIOSCOMMON)/printf-stdarg.c
@ -121,7 +107,6 @@ EXTRAINCDIRS += $(PIOSBOARDS)
EXTRAINCDIRS += $(STMSPDINCDIR) EXTRAINCDIRS += $(STMSPDINCDIR)
EXTRAINCDIRS += $(CMSISDIR) EXTRAINCDIRS += $(CMSISDIR)
EXTRAINCDIRS += $(REVO_BLINC) EXTRAINCDIRS += $(REVO_BLINC)
EXTRAINCDIRS += $(BOOTINC)
EXTRAINCDIRS += $(HWDEFSINC) EXTRAINCDIRS += $(HWDEFSINC)
# List any extra directories to look for library files here. # List any extra directories to look for library files here.
@ -163,7 +148,9 @@ DEBUGF = dwarf-2
# Place project-specific -D (define) and/or # Place project-specific -D (define) and/or
# -U options for C here. # -U options for C here.
CDEFS = -DSTM32F10X_$(MODEL) CDEFS = -DSTM32F4XX
CDEFS += -DSYSCLK_FREQ=$(SYSCLK_FREQ)
CDEFS += -DHSE_VALUE=$(OSCILLATOR_FREQ)
CDEFS += -DUSE_STDPERIPH_DRIVER CDEFS += -DUSE_STDPERIPH_DRIVER
CDEFS += -DUSE_$(BOARD) CDEFS += -DUSE_$(BOARD)
@ -328,7 +315,7 @@ $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION))) $(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe) # Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE),$(OPENOCD_CONFIG))) $(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE),$(OPENOCD_JTAG_CONFIG),$(OPENOCD_CONFIG)))
.PHONY: elf lss sym hex bin bino .PHONY: elf lss sym hex bin bino
elf: $(OUTDIR)/$(TARGET).elf elf: $(OUTDIR)/$(TARGET).elf

View File

@ -1,34 +0,0 @@
#include "ahrs_bl.h"
#include "ahrs_spi_program.h"
uint8_t buf[256];
bool StartProgramming(void) {
PIOS_COM_SendFormattedString(PIOS_COM_AUX, "Started programming\r\n");
return (true);
}
bool WriteData(uint32_t offset, uint8_t *buffer, uint32_t size) {
if (size > SPI_MAX_PROGRAM_DATA_SIZE) {
PIOS_COM_SendFormattedString(PIOS_COM_AUX, "oversize: %d\r\n", size);
return (false);
}
PIOS_COM_SendFormattedString(PIOS_COM_AUX, "Wrote %d bytes to %d\r\n",
size, offset);
memcpy(buf, buffer, size);
PIOS_LED_Toggle(LED1);
return (true);
}
bool ReadData(uint32_t offset, uint8_t *buffer, uint32_t size) {
if (size > SPI_MAX_PROGRAM_DATA_SIZE) {
PIOS_COM_SendFormattedString(PIOS_COM_AUX, "oversize: %d\r\n", size);
return (false);
}
PIOS_COM_SendFormattedString(PIOS_COM_AUX, "Read %d bytes from %d\r\n",
size, offset);
memcpy(buffer, buf, size);
PIOS_LED_Toggle(LED1);
return (true);
}

View File

@ -1,65 +0,0 @@
#include <stdint.h>
#include "ahrs_spi_program.h"
// Static CRC polynomial table
static uint32_t crcTable[256] = { 0x00000000, 0x77073096, 0xEE0E612C,
0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832,
0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07,
0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D,
0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A,
0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8,
0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD,
0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3,
0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180,
0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E,
0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB,
0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,
0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162,
0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49,
0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC,
0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3,
0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF,
0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2,
0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9,
0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C,
0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703,
0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D, };
/**generate CRC32 from a program packet
this is slightly overkill but we want to be sure
*/
uint32_t GenerateCRC(AhrsProgramPacket * packet) {
uint8_t * ptr = (uint8_t *) packet;
int size = ((int) &packet->crc) - (int) packet;
uint32_t crc = 0xFFFFFFFF;
for (int ct = 0; ct < size; ct++) {
crc = ((crc) >> 8) ^ crcTable[(*ptr++) ^ ((crc) & 0x000000FF)];
}
return (~crc);
}

View File

@ -1,131 +0,0 @@
/**
******************************************************************************
*
* @file ahrs_spi_program_master.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief AHRS programming over SPI link - master(OpenPilot) end.
*
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "openpilot.h"
#include "ahrs_spi_program_master.h"
#include "ahrs_spi_program.h"
#include "pios_spi.h"
PROGERR TransferPacket(uint32_t spi_id, AhrsProgramPacket *txBuf,
AhrsProgramPacket *rxBuf);
#define MAX_CONNECT_TRIES 500 //half a second
bool AhrsProgramConnect(uint32_t spi_id) {
AhrsProgramPacket rxBuf;
AhrsProgramPacket txBuf;
memset(&rxBuf, 0, sizeof(AhrsProgramPacket));
memcpy(&txBuf, SPI_PROGRAM_REQUEST, SPI_PROGRAM_REQUEST_LENGTH);
for (int ct = 0; ct < MAX_CONNECT_TRIES; ct++) {
PIOS_SPI_RC_PinSet(spi_id, 0);
uint32_t res = PIOS_SPI_TransferBlock(spi_id, (uint8_t *) &txBuf,
(uint8_t *) &rxBuf, SPI_PROGRAM_REQUEST_LENGTH + 1, NULL);
PIOS_SPI_RC_PinSet(spi_id, 1);
if (res == 0 && memcmp(&rxBuf, SPI_PROGRAM_ACK,
SPI_PROGRAM_REQUEST_LENGTH) == 0) {
return (true);
}
vTaskDelay(1 / portTICK_RATE_MS);
}
return (false);
}
PROGERR AhrsProgramWrite(uint32_t spi_id, uint32_t address, void * data,
uint32_t size) {
AhrsProgramPacket rxBuf;
AhrsProgramPacket txBuf;
memset(&rxBuf, 0, sizeof(AhrsProgramPacket));
memcpy(txBuf.data, data, size);
txBuf.size = size;
txBuf.type = PROGRAM_WRITE;
txBuf.address = address;
PROGERR ret = TransferPacket(spi_id, &txBuf, &rxBuf);
if (ret != PROGRAM_ERR_OK) {
return (ret);
}
return (PROGRAM_ERR_OK);
}
PROGERR AhrsProgramRead(uint32_t spi_id, uint32_t address, void * data,
uint32_t size) {
AhrsProgramPacket rxBuf;
AhrsProgramPacket txBuf;
memset(&rxBuf, 0, sizeof(AhrsProgramPacket));
txBuf.size = size;
txBuf.type = PROGRAM_READ;
txBuf.address = address;
PROGERR ret = TransferPacket(spi_id, &txBuf, &rxBuf);
if (ret != PROGRAM_ERR_OK) {
return (ret);
}
memcpy(data, rxBuf.data, size);
return (PROGRAM_ERR_OK);
}
PROGERR AhrsProgramReboot(uint32_t spi_id) {
AhrsProgramPacket rxBuf;
AhrsProgramPacket txBuf;
memset(&rxBuf, 0, sizeof(AhrsProgramPacket));
txBuf.type = PROGRAM_REBOOT;
memcpy(txBuf.data, REBOOT_CONFIRMATION, REBOOT_CONFIRMATION_LENGTH);
PROGERR ret = TransferPacket(spi_id, &txBuf, &rxBuf);
//If AHRS has rebooted we will get comms errors
if (ret == PROGRAM_ERR_LINK) {
return (PROGRAM_ERR_OK);
}
return (PROGRAM_ERR_FUNCTION);
}
PROGERR TransferPacket(uint32_t spi_id, AhrsProgramPacket *txBuf,
AhrsProgramPacket *rxBuf) {
static uint32_t pktId = 0;
pktId++;
txBuf->packetId = pktId;
txBuf->crc = GenerateCRC(txBuf);
int ct = 0;
for (; ct < MAX_CONNECT_TRIES; ct++) {
PIOS_SPI_RC_PinSet(spi_id, 0);
uint32_t res = PIOS_SPI_TransferBlock(spi_id, (uint8_t *) txBuf,
(uint8_t *) rxBuf, sizeof(AhrsProgramPacket), NULL);
PIOS_SPI_RC_PinSet(spi_id, 1);
if (res == 0) {
if (rxBuf->type != PROGRAM_NULL && rxBuf->crc == GenerateCRC(rxBuf)
&& rxBuf->packetId == pktId) {
break;
}
}
vTaskDelay(1 / portTICK_RATE_MS);
}
if (ct == MAX_CONNECT_TRIES) {
return (PROGRAM_ERR_LINK);
}
if (rxBuf->type != PROGRAM_ACK) {
return (PROGRAM_ERR_FUNCTION);
}
return (PROGRAM_ERR_OK);
}

View File

@ -1,137 +0,0 @@
/**
******************************************************************************
*
* @file ahrs_spi_program_slave.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief AHRS programming over SPI link - slave(AHRS) end.
*
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdint.h>
#include <string.h>
#include "pios_opahrs_proto.h"
#include "pios_spi.h"
#include "pios_board.h"
#include "ahrs_bl.h"
#include "ahrs_spi_program_slave.h"
#include "ahrs_spi_program.h"
static AhrsProgramPacket txBuf;
static AhrsProgramPacket rxBuf;
static bool done = false;
static void ProcessPacket();
#define WAIT_IF_RECEIVING() while(!(GPIOB->IDR & GPIO_Pin_12)){}; //NSS must be high
//Number of crc failures to allow before giving up
#define PROGRAM_PACKET_TRIES 4
void AhrsProgramReceive(uint32_t spi_id) {
done = false;
memset(&txBuf, 0, sizeof(AhrsProgramPacket));
//wait for a program request
int count = PROGRAM_PACKET_TRIES;
while (1) {
WAIT_IF_RECEIVING();
while ((PIOS_SPI_Busy(spi_id) != 0)) {
};
memset(&rxBuf, 'a', sizeof(AhrsProgramPacket));
int32_t res = PIOS_SPI_TransferBlock(spi_id, NULL, (uint8_t*) &rxBuf,
SPI_PROGRAM_REQUEST_LENGTH + 1, NULL);
if (res == 0 && memcmp(&rxBuf, SPI_PROGRAM_REQUEST,
SPI_PROGRAM_REQUEST_LENGTH) == 0) {
break;
}
if (count-- == 0) {
return;
}
}
if (!StartProgramming()) {
//Couldn't erase FLASH. Nothing we can do.
return;
}
//send ack
memcpy(&txBuf, SPI_PROGRAM_ACK, SPI_PROGRAM_REQUEST_LENGTH);
WAIT_IF_RECEIVING();
while (0 != PIOS_SPI_TransferBlock(spi_id, (uint8_t*) &txBuf, NULL,
SPI_PROGRAM_REQUEST_LENGTH + 1, NULL)) {
};
txBuf.type = PROGRAM_NULL;
while (!done) {
WAIT_IF_RECEIVING();
if (0 == PIOS_SPI_TransferBlock(spi_id, (uint8_t*) &txBuf,
(uint8_t*) &rxBuf, sizeof(AhrsProgramPacket), NULL)) {
uint32_t crc = GenerateCRC(&rxBuf);
if (crc != rxBuf.crc || txBuf.packetId == rxBuf.packetId) {
continue;
}
ProcessPacket();
txBuf.packetId = rxBuf.packetId;
txBuf.crc = GenerateCRC(&txBuf);
}
}
}
void ProcessPacket() {
switch (rxBuf.type) {
case PROGRAM_NULL:
txBuf.type = PROGRAM_NULL;
break;
case PROGRAM_WRITE:
if (WriteData(rxBuf.address, rxBuf.data, rxBuf.size)) {
txBuf.type = PROGRAM_ACK;
txBuf.size = rxBuf.size;
} else {
txBuf.type = PROGRAM_ERR;
}
break;
case PROGRAM_READ:
if (ReadData(rxBuf.address, txBuf.data, rxBuf.size)) {
txBuf.type = PROGRAM_ACK;
txBuf.size = rxBuf.size;
} else {
txBuf.type = PROGRAM_ERR;
}
break;
case PROGRAM_REBOOT:
if (0 == memcmp(rxBuf.data, REBOOT_CONFIRMATION,
REBOOT_CONFIRMATION_LENGTH)) {
done = true;
txBuf.type = PROGRAM_ACK;
} else {
txBuf.type = PROGRAM_ERR;
}
break;
default:
txBuf.type = PROGRAM_ERR;
}
}

View File

@ -1,591 +0,0 @@
#include <stdint.h> /* uint*_t */
#include <stddef.h> /* NULL */
#include "bl_fsm.h"
#include "pios_opahrs_proto.h"
#include "pios.h"
struct lfsm_context {
enum lfsm_state curr_state;
enum opahrs_msg_link_state link_state;
enum opahrs_msg_type user_payload_type;
uint32_t user_payload_len;
uint32_t errors;
uint8_t * rx;
uint8_t * tx;
uint8_t * link_rx;
uint8_t * link_tx;
uint8_t * user_rx;
uint8_t * user_tx;
struct lfsm_link_stats stats;
};
static struct lfsm_context context = { 0 };
static void lfsm_update_link_tx(struct lfsm_context * context);
static void lfsm_init_rx(struct lfsm_context * context);
static uint32_t PIOS_SPI_OP;
void lfsm_attach(uint32_t spi_id) {
PIOS_SPI_OP = spi_id;
}
/*
*
* Link Finite State Machine
*
*/
struct lfsm_transition {
void (*entry_fn)(struct lfsm_context * context);
enum lfsm_state next_state[LFSM_EVENT_NUM_EVENTS];
};
static void go_faulted(struct lfsm_context * context);
static void go_stopped(struct lfsm_context * context);
static void go_stopping(struct lfsm_context * context);
static void go_inactive(struct lfsm_context * context);
static void go_user_busy(struct lfsm_context * context);
static void go_user_busy_rx_pending(struct lfsm_context * context);
static void go_user_busy_tx_pending(struct lfsm_context * context);
static void go_user_busy_rxtx_pending(struct lfsm_context * context);
static void go_user_rx_pending(struct lfsm_context * context);
static void go_user_tx_pending(struct lfsm_context * context);
static void go_user_rxtx_pending(struct lfsm_context * context);
static void go_user_rx_active(struct lfsm_context * context);
static void go_user_tx_active(struct lfsm_context * context);
static void go_user_rxtx_active(struct lfsm_context * context);
const static struct lfsm_transition lfsm_transitions[LFSM_STATE_NUM_STATES] = {
[LFSM_STATE_FAULTED] = {
.entry_fn = go_faulted,
}, [LFSM_STATE_STOPPED] = {
.entry_fn = go_stopped,
.next_state = {
[LFSM_EVENT_INIT_LINK] = LFSM_STATE_INACTIVE,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_STOPPED,
},
}, [LFSM_STATE_STOPPING] = {
.entry_fn = go_stopping,
.next_state = {
[LFSM_EVENT_RX_LINK] = LFSM_STATE_STOPPED,
[LFSM_EVENT_RX_USER] = LFSM_STATE_STOPPED,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_STOPPED,
},
}, [LFSM_STATE_INACTIVE] = {
.entry_fn = go_inactive,
.next_state = {
[LFSM_EVENT_STOP] = LFSM_STATE_STOPPING,
[LFSM_EVENT_USER_SET_RX] = LFSM_STATE_USER_BUSY_RX_PENDING,
[LFSM_EVENT_USER_SET_TX] = LFSM_STATE_USER_BUSY_TX_PENDING,
[LFSM_EVENT_RX_LINK] = LFSM_STATE_INACTIVE,
[LFSM_EVENT_RX_USER] = LFSM_STATE_INACTIVE,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_INACTIVE,
},
}, [LFSM_STATE_USER_BUSY] = {
.entry_fn = go_user_busy,
.next_state = {
[LFSM_EVENT_STOP] = LFSM_STATE_STOPPING,
[LFSM_EVENT_USER_SET_RX] = LFSM_STATE_USER_BUSY_RX_PENDING,
[LFSM_EVENT_USER_SET_TX] = LFSM_STATE_USER_BUSY_TX_PENDING,
[LFSM_EVENT_USER_DONE] = LFSM_STATE_INACTIVE,
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_BUSY,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_BUSY,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_BUSY,
},
}, [LFSM_STATE_USER_BUSY_RX_PENDING] = {
.entry_fn = go_user_busy_rx_pending,
.next_state = {
[LFSM_EVENT_USER_SET_TX] = LFSM_STATE_USER_BUSY_RXTX_PENDING,
[LFSM_EVENT_USER_DONE] = LFSM_STATE_USER_RX_PENDING,
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_BUSY_RX_PENDING,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_BUSY_RX_PENDING,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_BUSY_RX_PENDING,
},
}, [LFSM_STATE_USER_BUSY_TX_PENDING] = {
.entry_fn = go_user_busy_tx_pending,
.next_state = {
[LFSM_EVENT_USER_SET_RX] = LFSM_STATE_USER_BUSY_RXTX_PENDING,
[LFSM_EVENT_USER_DONE] = LFSM_STATE_USER_TX_PENDING,
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_BUSY_TX_PENDING,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_BUSY_TX_PENDING,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_BUSY_TX_PENDING,
},
}, [LFSM_STATE_USER_BUSY_RXTX_PENDING] = {
.entry_fn = go_user_busy_rxtx_pending,
.next_state = {
[LFSM_EVENT_USER_DONE] = LFSM_STATE_USER_RXTX_PENDING,
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_BUSY_RXTX_PENDING,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_BUSY_RXTX_PENDING,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_BUSY_RXTX_PENDING,
},
}, [LFSM_STATE_USER_RX_PENDING] = {
.entry_fn = go_user_rx_pending,
.next_state = {
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_RX_ACTIVE,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_RX_ACTIVE,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_RX_ACTIVE,
},
}, [LFSM_STATE_USER_TX_PENDING] = {
.entry_fn = go_user_tx_pending,
.next_state = {
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_TX_ACTIVE,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_TX_ACTIVE,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_TX_ACTIVE,
},
}, [LFSM_STATE_USER_RXTX_PENDING] = {
.entry_fn = go_user_rxtx_pending,
.next_state = {
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_RXTX_ACTIVE,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_RXTX_ACTIVE,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_RXTX_ACTIVE,
},
}, [LFSM_STATE_USER_RX_ACTIVE] = {
.entry_fn = go_user_rx_active,
.next_state = {
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_RX_ACTIVE,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_BUSY,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_RX_ACTIVE,
},
}, [LFSM_STATE_USER_TX_ACTIVE] = {
.entry_fn = go_user_tx_active,
.next_state = {
[LFSM_EVENT_RX_LINK] = LFSM_STATE_INACTIVE,
[LFSM_EVENT_RX_USER] = LFSM_STATE_INACTIVE,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_INACTIVE,
},
}, [LFSM_STATE_USER_RXTX_ACTIVE] = {
.entry_fn = go_user_rxtx_active,
.next_state = {
[LFSM_EVENT_RX_LINK] = LFSM_STATE_USER_RX_ACTIVE,
[LFSM_EVENT_RX_USER] = LFSM_STATE_USER_BUSY,
[LFSM_EVENT_RX_UNKNOWN] = LFSM_STATE_USER_RX_ACTIVE,
},
}, };
/*
* FSM State Entry Functions
*/
static void go_faulted(struct lfsm_context * context) {
PIOS_DEBUG_Assert(0);
}
static void go_stopped(struct lfsm_context * context) {
#if 0
PIOS_SPI_Stop(PIOS_SPI_OP);
#endif
}
static void go_stopping(struct lfsm_context * context) {
context->link_tx = NULL;
context->tx = NULL;
}
static void go_inactive(struct lfsm_context * context) {
context->link_state = OPAHRS_MSG_LINK_STATE_INACTIVE;
lfsm_update_link_tx(context);
context->user_rx = NULL;
context->user_tx = NULL;
context->rx = context->link_rx;
context->tx = context->link_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_busy(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_rx);
context->user_rx = NULL;
context->user_tx = NULL;
context->link_state = OPAHRS_MSG_LINK_STATE_BUSY;
lfsm_update_link_tx(context);
context->rx = context->link_rx;
context->tx = context->link_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_busy_rx_pending(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_rx);
context->link_state = OPAHRS_MSG_LINK_STATE_BUSY;
lfsm_update_link_tx(context);
context->rx = context->link_rx;
context->tx = context->link_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_busy_tx_pending(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_tx);
context->link_state = OPAHRS_MSG_LINK_STATE_BUSY;
lfsm_update_link_tx(context);
context->rx = context->link_rx;
context->tx = context->link_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_busy_rxtx_pending(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_rx); PIOS_DEBUG_Assert(context->user_tx);
context->link_state = OPAHRS_MSG_LINK_STATE_BUSY;
lfsm_update_link_tx(context);
context->rx = context->link_rx;
context->tx = context->link_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_rx_pending(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_rx);
context->link_state = OPAHRS_MSG_LINK_STATE_BUSY;
lfsm_update_link_tx(context);
context->rx = context->link_rx;
context->tx = context->link_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_tx_pending(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_tx);
context->link_state = OPAHRS_MSG_LINK_STATE_BUSY;
lfsm_update_link_tx(context);
context->rx = context->link_rx;
context->tx = context->link_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_rxtx_pending(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_rx); PIOS_DEBUG_Assert(context->user_tx);
context->link_state = OPAHRS_MSG_LINK_STATE_BUSY;
lfsm_update_link_tx(context);
context->rx = context->link_rx;
context->tx = context->link_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_rx_active(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_rx);
context->rx = context->user_rx;
context->tx = context->link_tx;
context->link_state = OPAHRS_MSG_LINK_STATE_READY;
lfsm_update_link_tx(context);
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_tx_active(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_tx);
context->link_state = OPAHRS_MSG_LINK_STATE_BUSY;
context->rx = context->link_rx;
context->tx = context->user_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
static void go_user_rxtx_active(struct lfsm_context * context) {
/* Sanity checks */
PIOS_DEBUG_Assert(context->user_rx); PIOS_DEBUG_Assert(context->user_tx);
context->link_state = OPAHRS_MSG_LINK_STATE_READY;
context->rx = context->user_rx;
context->tx = context->user_tx;
lfsm_init_rx(context);
PIOS_SPI_TransferBlock(PIOS_SPI_OP, context->tx, context->rx,
context->user_payload_len, lfsm_irq_callback);
}
/*
*
* Misc Helper Functions
*
*/
static void lfsm_update_link_tx_v0(struct opahrs_msg_v0 * msg,
enum opahrs_msg_link_state state, uint16_t errors) {
opahrs_msg_v0_init_link_tx(msg, OPAHRS_MSG_LINK_TAG_NOP);
msg->payload.link.state = state;
msg->payload.link.errors = errors;
}
static void lfsm_update_link_tx_v1(struct opahrs_msg_v1 * msg,
enum opahrs_msg_link_state state, uint16_t errors) {
opahrs_msg_v1_init_link_tx(msg, OPAHRS_MSG_LINK_TAG_NOP);
msg->payload.link.state = state;
msg->payload.link.errors = errors;
}
static void lfsm_update_link_tx(struct lfsm_context * context) {
PIOS_DEBUG_Assert(context->link_tx);
switch (context->user_payload_type) {
case OPAHRS_MSG_TYPE_USER_V0:
lfsm_update_link_tx_v0((struct opahrs_msg_v0 *) context->link_tx,
context->link_state, context->errors);
break;
case OPAHRS_MSG_TYPE_USER_V1:
lfsm_update_link_tx_v1((struct opahrs_msg_v1 *) context->link_tx,
context->link_state, context->errors);
break;
case OPAHRS_MSG_TYPE_LINK:
PIOS_DEBUG_Assert(0);
}
}
static void lfsm_init_rx(struct lfsm_context * context) {
PIOS_DEBUG_Assert(context->rx);
switch (context->user_payload_type) {
case OPAHRS_MSG_TYPE_USER_V0:
opahrs_msg_v0_init_rx((struct opahrs_msg_v0 *) context->rx);
break;
case OPAHRS_MSG_TYPE_USER_V1:
opahrs_msg_v1_init_rx((struct opahrs_msg_v1 *) context->rx);
break;
case OPAHRS_MSG_TYPE_LINK:
PIOS_DEBUG_Assert(0);
}
}
/*
*
* External API
*
*/
void lfsm_inject_event(enum lfsm_event event) {
PIOS_IRQ_Disable();
/*
* Move to the next state
*
* This is done prior to calling the new state's entry function to
* guarantee that the entry function never depends on the previous
* state. This way, it cannot ever know what the previous state was.
*/
context.curr_state = lfsm_transitions[context.curr_state].next_state[event];
/* Call the entry function (if any) for the next state. */
if (lfsm_transitions[context.curr_state].entry_fn) {
lfsm_transitions[context.curr_state].entry_fn(&context);
}
PIOS_IRQ_Enable();
}
void lfsm_init(void) {
context.curr_state = LFSM_STATE_STOPPED;
go_stopped(&context);
}
void lfsm_set_link_proto_v0(struct opahrs_msg_v0 * link_tx,
struct opahrs_msg_v0 * link_rx) {
PIOS_DEBUG_Assert(link_tx);
context.link_tx = (uint8_t *) link_tx;
context.link_rx = (uint8_t *) link_rx;
context.user_payload_type = OPAHRS_MSG_TYPE_USER_V0;
context.user_payload_len = sizeof(*link_tx);
lfsm_update_link_tx_v0(link_tx, context.link_state, context.errors);
lfsm_inject_event(LFSM_EVENT_INIT_LINK);
}
void lfsm_set_link_proto_v1(struct opahrs_msg_v1 * link_tx,
struct opahrs_msg_v1 * link_rx) {
PIOS_DEBUG_Assert(link_tx);
context.link_tx = (uint8_t *) link_tx;
context.link_rx = (uint8_t *) link_rx;
context.user_payload_type = OPAHRS_MSG_TYPE_USER_V1;
context.user_payload_len = sizeof(*link_tx);
lfsm_update_link_tx_v1(link_tx, context.link_state, context.errors);
lfsm_inject_event(LFSM_EVENT_INIT_LINK);
}
void lfsm_user_set_tx_v0(struct opahrs_msg_v0 * user_tx) {
PIOS_DEBUG_Assert(user_tx);
PIOS_DEBUG_Assert(context.user_payload_type == OPAHRS_MSG_TYPE_USER_V0);
context.user_tx = (uint8_t *) user_tx;
lfsm_inject_event(LFSM_EVENT_USER_SET_TX);
}
void lfsm_user_set_rx_v0(struct opahrs_msg_v0 * user_rx) {
PIOS_DEBUG_Assert(user_rx); PIOS_DEBUG_Assert(context.user_payload_type == OPAHRS_MSG_TYPE_USER_V0);
context.user_rx = (uint8_t *) user_rx;
lfsm_inject_event(LFSM_EVENT_USER_SET_RX);
}
void lfsm_user_set_tx_v1(struct opahrs_msg_v1 * user_tx) {
PIOS_DEBUG_Assert(user_tx); PIOS_DEBUG_Assert(context.user_payload_type == OPAHRS_MSG_TYPE_USER_V1);
context.user_tx = (uint8_t *) user_tx;
lfsm_inject_event(LFSM_EVENT_USER_SET_TX);
}
void lfsm_user_set_rx_v1(struct opahrs_msg_v1 * user_rx) {
PIOS_DEBUG_Assert(user_rx); PIOS_DEBUG_Assert(context.user_payload_type == OPAHRS_MSG_TYPE_USER_V1);
context.user_rx = (uint8_t *) user_rx;
lfsm_inject_event(LFSM_EVENT_USER_SET_RX);
}
void lfsm_user_done(void) {
lfsm_inject_event(LFSM_EVENT_USER_DONE);
}
void lfsm_stop(void) {
lfsm_inject_event(LFSM_EVENT_STOP);
}
void lfsm_get_link_stats(struct lfsm_link_stats * stats) {
PIOS_DEBUG_Assert(stats);
*stats = context.stats;
}
enum lfsm_state lfsm_get_state(void) {
return context.curr_state;
}
/*
*
* ISR Callback
*
*/
void lfsm_irq_callback(uint8_t crc_ok, uint8_t crc_val) {
if (!crc_ok) {
context.stats.rx_badcrc++;
lfsm_inject_event(LFSM_EVENT_RX_UNKNOWN);
return;
}
if (!context.rx) {
/* No way to know what we just received, assume invalid */
lfsm_inject_event(LFSM_EVENT_RX_UNKNOWN);
return;
}
/* Recover the head and tail pointers from the message */
struct opahrs_msg_link_head * head = 0;
struct opahrs_msg_link_tail * tail = 0;
switch (context.user_payload_type) {
case OPAHRS_MSG_TYPE_USER_V0:
head = &((struct opahrs_msg_v0 *) context.rx)->head;
tail = &((struct opahrs_msg_v0 *) context.rx)->tail;
break;
case OPAHRS_MSG_TYPE_USER_V1:
head = &((struct opahrs_msg_v1 *) context.rx)->head;
tail = &((struct opahrs_msg_v1 *) context.rx)->tail;
break;
case OPAHRS_MSG_TYPE_LINK:
/* Should never be rx'ing before the link protocol version is known */
PIOS_DEBUG_Assert(0);
break;
}
/* Check for bad magic */
if ((head->magic != OPAHRS_MSG_MAGIC_HEAD) || (tail->magic
!= OPAHRS_MSG_MAGIC_TAIL)) {
if (head->magic != OPAHRS_MSG_MAGIC_HEAD) {
context.stats.rx_badmagic_head++;
}
if (tail->magic != OPAHRS_MSG_MAGIC_TAIL) {
context.stats.rx_badmagic_tail++;
}
lfsm_inject_event(LFSM_EVENT_RX_UNKNOWN);
return;
}
/* Good magic, find out what type of payload we've got */
switch (head->type) {
case OPAHRS_MSG_TYPE_LINK:
context.stats.rx_link++;
lfsm_inject_event(LFSM_EVENT_RX_LINK);
break;
case OPAHRS_MSG_TYPE_USER_V0:
case OPAHRS_MSG_TYPE_USER_V1:
if (head->type == context.user_payload_type) {
context.stats.rx_user++;
lfsm_inject_event(LFSM_EVENT_RX_USER);
} else {
/* Mismatched user payload type */
context.stats.rx_badver++;
lfsm_inject_event(LFSM_EVENT_RX_UNKNOWN);
}
break;
default:
/* Unidentifiable payload type */
context.stats.rx_badtype++;
lfsm_inject_event(LFSM_EVENT_RX_UNKNOWN);
}
}

View File

@ -1,65 +0,0 @@
#ifndef AHRS_SPI_PROGRAM_H
#define AHRS_SPI_PROGRAM_H
/* Special packets to enter programming mode.
Note: these must both be SPI_PROGRAM_REQUEST_LENGTH long.
Pad with spaces if needed.
*/
#define SPI_PROGRAM_REQUEST "AHRS START PROGRAMMING "
#define SPI_PROGRAM_ACK "AHRS PROGRAMMING STARTED"
#define SPI_PROGRAM_REQUEST_LENGTH 24
/**Proposed programming protocol:
In the master:
1) Send a AhrsProgramPacket containing the relevant data.
Note crc is a CRC32 as the CRC8 used in hardware can be fooled.
2) Keep sending PROGRAM_NULL packets and wait for an ack.
Time out if we waited too long.
3) Compare ack packet with transmitted packet. The data
should be the bitwise inverse of the data transmitted.
packetId should correspond to the transmitted packet.
4) repeat for next packet until finished
5) Repeat using verify packets
Returned data should be exactly as read from memory
In the slave:
1) Wait for an AhrsProgramPacket
2) Check CRC then write to memory
3) Bitwise invert data and add it to the return packet
4) Copy packetId from received packet
5) Transmit packet.
6) repeat until we receive a read packet
7) read memory as requested until we receive a reboot packet
Reboot packets had better have some sort of magic number in the data,
just to be absolutely sure
*/
typedef enum {
PROGRAM_NULL,
PROGRAM_WRITE,
PROGRAM_READ,
PROGRAM_ACK,
PROGRAM_REBOOT,
PROGRAM_ERR
} ProgramType;
#define SPI_MAX_PROGRAM_DATA_SIZE (14 * 4) //USB comms uses 14x 32 bit words
#define REBOOT_CONFIRMATION "AHRS REBOOT"
#define REBOOT_CONFIRMATION_LENGTH 11
/** Proposed program packet defintion
*/
typedef struct {
ProgramType type;
uint32_t packetId; //Transmission packet ID
uint32_t address; //base address to place data
uint32_t size; //Size of data (0 to SPI_MAX_PROGRAM_DATA_SIZE)
uint8_t data[SPI_MAX_PROGRAM_DATA_SIZE];
uint32_t crc; //CRC32 - hardware CRC8 can be fooled
uint8_t dummy; //for some reason comms trashes the last byte sent
} AhrsProgramPacket;
uint32_t GenerateCRC(AhrsProgramPacket * packet);
#endif

View File

@ -1,66 +0,0 @@
/**
******************************************************************************
*
* @file ahrs_spi_program_master.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief AHRS programming over SPI link - master(OpenPilot) end.
*
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef AHRS_PROGRAM_MASTER_H
#define AHRS_PROGRAM_MASTER_H
typedef enum {
PROGRAM_ERR_OK, //OK
PROGRAM_ERR_LINK, //comms error
PROGRAM_ERR_FUNCTION,
//function failed
} PROGERR;
/** Connect to AHRS and request programming mode
* returns: false if failed.
*/
bool AhrsProgramConnect(uint32_t spi_id);
/** Write data to AHRS
* size must be between 1 and SPI_MAX_PROGRAM_DATA_SIZE
* returns: error status
*/
PROGERR AhrsProgramWrite(uint32_t spi_id, uint32_t address, void * data,
uint32_t size);
/** Read data from AHRS
* size must be between 1 and SPI_MAX_PROGRAM_DATA_SIZE
* returns: error status
*/
PROGERR AhrsProgramRead(uint32_t spi_id, uint32_t address, void * data,
uint32_t size);
/** reboot AHRS
* returns: error status
*/
PROGERR AhrsProgramReboot(uint32_t spi_id);
//TODO: Implement programming protocol
#endif //AHRS_PROGRAM_MASTER_H

View File

@ -1,97 +0,0 @@
/**
******************************************************************************
*
* @file ahrs_fsm.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef BL_FSM_H
#define BL_FSM_H
#include "pios_opahrs_proto.h"
enum lfsm_state {
LFSM_STATE_FAULTED = 0, /* Must be zero so undefined transitions land here */
LFSM_STATE_STOPPED,
LFSM_STATE_STOPPING,
LFSM_STATE_INACTIVE,
LFSM_STATE_USER_BUSY,
LFSM_STATE_USER_BUSY_RX_PENDING,
LFSM_STATE_USER_BUSY_TX_PENDING,
LFSM_STATE_USER_BUSY_RXTX_PENDING,
LFSM_STATE_USER_RX_PENDING,
LFSM_STATE_USER_TX_PENDING,
LFSM_STATE_USER_RXTX_PENDING,
LFSM_STATE_USER_RX_ACTIVE,
LFSM_STATE_USER_TX_ACTIVE,
LFSM_STATE_USER_RXTX_ACTIVE,
LFSM_STATE_NUM_STATES
/* Must be last */
};
enum lfsm_event {
LFSM_EVENT_INIT_LINK,
LFSM_EVENT_STOP,
LFSM_EVENT_USER_SET_RX,
LFSM_EVENT_USER_SET_TX,
LFSM_EVENT_USER_DONE,
LFSM_EVENT_RX_LINK,
LFSM_EVENT_RX_USER,
LFSM_EVENT_RX_UNKNOWN,
LFSM_EVENT_NUM_EVENTS
/* Must be last */
};
struct lfsm_link_stats {
uint32_t rx_badcrc;
uint32_t rx_badmagic_head;
uint32_t rx_badmagic_tail;
uint32_t rx_link;
uint32_t rx_user;
uint32_t tx_user;
uint32_t rx_badtype;
uint32_t rx_badver;
};
extern void lfsm_attach(uint32_t spi_id);
extern void lfsm_init(void);
extern void lfsm_inject_event(enum lfsm_event event);
extern void lfsm_irq_callback(uint8_t crc_ok, uint8_t crc_val);
extern void lfsm_get_link_stats(struct lfsm_link_stats * stats);
extern enum lfsm_state lfsm_get_state(void);
extern void lfsm_set_link_proto_v0(struct opahrs_msg_v0 * link_tx,
struct opahrs_msg_v0 * link_rx);
extern void lfsm_user_set_rx_v0(struct opahrs_msg_v0 * user_rx);
extern void lfsm_user_set_tx_v0(struct opahrs_msg_v0 * user_tx);
extern void lfsm_set_link_proto_v1(struct opahrs_msg_v1 * link_tx,
struct opahrs_msg_v1 * link_rx);
extern void lfsm_user_set_rx_v1(struct opahrs_msg_v1 * user_rx);
extern void lfsm_user_set_tx_v1(struct opahrs_msg_v1 * user_tx);
extern void lfsm_user_done(void);
#endif /* BL_FSM_H */

View File

@ -0,0 +1,115 @@
/**
******************************************************************************
* @addtogroup CopterControlBL CopterControl BootLoader
* @brief These files contain the code to the CopterControl Bootloader.
*
* @{
* @file common.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief This file contains various common defines for the BootLoader
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef COMMON_H_
#define COMMON_H_
//#include "board.h"
typedef enum {
start, keepgoing,
} DownloadAction;
/**************************************************/
/* OP_DFU states */
/**************************************************/
typedef enum {
DFUidle, //0
uploading, //1
wrong_packet_received, //2
too_many_packets, //3
too_few_packets, //4
Last_operation_Success, //5
downloading, //6
BLidle, //7
Last_operation_failed, //8
uploadingStarting, //9
outsideDevCapabilities, //10
CRC_Fail,//11
failed_jump,
//12
} DFUStates;
/**************************************************/
/* OP_DFU commands */
/**************************************************/
typedef enum {
Reserved, //0
Req_Capabilities, //1
Rep_Capabilities, //2
EnterDFU, //3
JumpFW, //4
Reset, //5
Abort_Operation, //6
Upload, //7
Op_END, //8
Download_Req, //9
Download, //10
Status_Request, //11
Status_Rep
//12
} DFUCommands;
typedef enum {
High_Density, Medium_Density
} DeviceType;
/**************************************************/
/* OP_DFU transfer types */
/**************************************************/
typedef enum {
FW, //0
Descript
//2
} DFUTransfer;
/**************************************************/
/* OP_DFU transfer port */
/**************************************************/
typedef enum {
Usb, //0
Serial
//2
} DFUPort;
/**************************************************/
/* OP_DFU programable programable HW types */
/**************************************************/
typedef enum {
Self_flash, //0
Remote_flash_via_spi
//1
} DFUProgType;
/**************************************************/
/* OP_DFU programable sources */
/**************************************************/
#define USB 0
#define SPI 1
#define DownloadDelay 100000
#define MAX_DEL_RETRYS 3
#define MAX_WRI_RETRYS 3
#endif /* COMMON_H_ */

View File

@ -0,0 +1,60 @@
/**
******************************************************************************
*
* @file op_dfu.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __OP_DFU_H
#define __OP_DFU_H
#include "common.h"
/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
typedef struct {
uint8_t programmingType;
uint8_t readWriteFlags;
uint32_t startOfUserCode;
uint32_t sizeOfCode;
uint8_t sizeOfDescription;
uint8_t BL_Version;
uint16_t devID;
DeviceType devType;
uint32_t FW_Crc;
} Device;
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported define -----------------------------------------------------------*/
#define COMMAND 0
#define COUNT 1
#define DATA 5
/* Exported functions ------------------------------------------------------- */
void processComand(uint8_t *Receive_Buffer);
uint32_t baseOfAdressType(uint8_t type);
uint8_t isBiggerThanAvailable(uint8_t type, uint32_t size);
void OPDfuIni(uint8_t discover);
void DataDownload(DownloadAction);
bool flash_read(uint8_t * buffer, uint32_t adr, DFUProgType type);
#endif /* __OP_DFU_H */
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/

View File

@ -37,7 +37,7 @@
#define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB
#define PIOS_INCLUDE_USB_HID #define PIOS_INCLUDE_USB_HID
#define PIOS_INCLUDE_COM_MSG #define PIOS_INCLUDE_COM_MSG
//#define PIOS_INCLUDE_BL_HELPER #define PIOS_INCLUDE_BL_HELPER
//#define PIOS_INCLUDE_BL_HELPER_WRITE_SUPPORT #define PIOS_INCLUDE_BL_HELPER_WRITE_SUPPORT
#endif /* PIOS_CONFIG_H */ #endif /* PIOS_CONFIG_H */

View File

@ -1,17 +1,12 @@
/** /**
****************************************************************************** ******************************************************************************
* @addtogroup AHRS BOOTLOADER * @addtogroup RevolutionBL Revolution BootLoader
* @brief The AHRS Modules perform * @brief These files contain the code to the Revolution Bootloader.
* *
* @{ * @{
* @addtogroup AHRS_BOOTLOADER_Main
* @brief Main function which does the hardware dependent stuff
* @{
*
*
* @file main.c * @file main.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief * @brief This is the file with the main function of the Revolution BootLoader
* @see The GNU Public License (GPL) Version 3 * @see The GNU Public License (GPL) Version 3
* *
*****************************************************************************/ *****************************************************************************/
@ -30,42 +25,146 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
/* Bootloader Includes */
/* OpenPilot Includes */ #include <pios.h>
#include "ahrs_bl.h"
#include <pios_board_info.h> #include <pios_board_info.h>
#include "pios_opahrs_proto.h" #include <stdbool.h>
#include "bl_fsm.h" /* lfsm_state */ #include "op_dfu.h"
//#include "stm32f2xx_flash.h" #include "pios_iap.h"
#include "fifo_buffer.h"
#include "pios_com_msg.h"
#include "pios_usbhook.h" /* PIOS_USBHOOK_* */
/* Prototype of PIOS_Board_Init() function */
extern void PIOS_Board_Init(void); extern void PIOS_Board_Init(void);
extern void FLASH_Download();
#define BSL_HOLD_STATE ((PIOS_USB_DETECT_GPIO_PORT->IDR & PIOS_USB_DETECT_GPIO_PIN) ? 0 : 1)
#define NSS_HOLD_STATE ((GPIOB->IDR & GPIO_Pin_12) ? 0 : 1)
enum bootloader_status boot_status;
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
typedef void typedef void (*pFunction)(void);
(*pFunction)(void); /* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
pFunction Jump_To_Application; pFunction Jump_To_Application;
uint32_t JumpAddress; uint32_t JumpAddress;
/* Function Prototypes */
//void /// LEDs PWM
//process_spi_request(void); uint32_t period1 = 5000; // 5 mS
void uint32_t sweep_steps1 = 100; // * 5 mS -> 500 mS
jump_to_app(); uint32_t period2 = 5000; // 5 mS
uint32_t Fw_crc; uint32_t sweep_steps2 = 100; // * 5 mS -> 500 mS
/**
* @brief Bootloader Main function
*/ ////////////////////////////////////////
uint8_t tempcount = 0;
/* Extern variables ----------------------------------------------------------*/
DFUStates DeviceState;
int16_t status = 0;
bool JumpToApp = false;
bool GO_dfu = false;
bool USB_connected = false;
bool User_DFU_request = false;
static uint8_t mReceive_Buffer[63];
/* Private function prototypes -----------------------------------------------*/
uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count);
uint8_t processRX();
void jump_to_app();
int main() { int main() {
/* Brings up System using CMSIS functions, enables the LEDs. */
PIOS_SYS_Init(); PIOS_SYS_Init();
PIOS_Board_Init(); PIOS_Board_Init();
PIOS_IAP_Init();
jump_to_app(); USB_connected = PIOS_USB_CheckAvailable(0);
return 0;
if (PIOS_IAP_CheckRequest() == true) {
PIOS_DELAY_WaitmS(1000);
User_DFU_request = true;
PIOS_IAP_ClearRequest();
}
GO_dfu = (USB_connected == true) || (User_DFU_request == true);
if (GO_dfu == true) {
PIOS_Board_Init();
if (User_DFU_request == true)
DeviceState = DFUidle;
else
DeviceState = BLidle;
} else
JumpToApp = true;
uint32_t stopwatch = 0;
uint32_t prev_ticks = PIOS_DELAY_GetuS();
while (true) {
/* Update the stopwatch */
uint32_t elapsed_ticks = PIOS_DELAY_GetuSSince(prev_ticks);
prev_ticks += elapsed_ticks;
stopwatch += elapsed_ticks;
if (JumpToApp == true)
jump_to_app();
switch (DeviceState) {
case Last_operation_Success:
case uploadingStarting:
case DFUidle:
period1 = 5000;
sweep_steps1 = 100;
PIOS_LED_Off(PIOS_LED_HEARTBEAT);
period2 = 0;
break;
case uploading:
period1 = 5000;
sweep_steps1 = 100;
period2 = 2500;
sweep_steps2 = 50;
break;
case downloading:
period1 = 2500;
sweep_steps1 = 50;
PIOS_LED_Off(PIOS_LED_HEARTBEAT);
period2 = 0;
break;
case BLidle:
period1 = 0;
PIOS_LED_On(PIOS_LED_HEARTBEAT);
period2 = 0;
break;
default://error
period1 = 5000;
sweep_steps1 = 100;
period2 = 5000;
sweep_steps2 = 100;
}
if (period1 != 0) {
if (LedPWM(period1, sweep_steps1, stopwatch))
PIOS_LED_On(PIOS_LED_HEARTBEAT);
else
PIOS_LED_Off(PIOS_LED_HEARTBEAT);
} else
PIOS_LED_On(PIOS_LED_HEARTBEAT);
if (period2 != 0) {
if (LedPWM(period2, sweep_steps2, stopwatch))
PIOS_LED_On(PIOS_LED_HEARTBEAT);
else
PIOS_LED_Off(PIOS_LED_HEARTBEAT);
} else
PIOS_LED_Off(PIOS_LED_HEARTBEAT);
if (stopwatch > 50 * 1000 * 1000)
stopwatch = 0;
if ((stopwatch > 6 * 1000 * 1000) && (DeviceState
== BLidle))
JumpToApp = true;
processRX();
DataDownload(start);
}
} }
void jump_to_app() { void jump_to_app() {
const struct pios_board_info * bdinfo = &pios_board_info_blob; const struct pios_board_info * bdinfo = &pios_board_info_blob;
@ -76,8 +175,8 @@ void jump_to_app() {
RCC_APB1PeriphResetCmd(0xffffffff, ENABLE); RCC_APB1PeriphResetCmd(0xffffffff, ENABLE);
RCC_APB2PeriphResetCmd(0xffffffff, DISABLE); RCC_APB2PeriphResetCmd(0xffffffff, DISABLE);
RCC_APB1PeriphResetCmd(0xffffffff, DISABLE); RCC_APB1PeriphResetCmd(0xffffffff, DISABLE);
//_SetCNTR(0); // clear interrupt mask
//_SetISTR(0); // clear all requests PIOS_USBHOOK_Deactivate();
JumpAddress = *(__IO uint32_t*) (bdinfo->fw_base + 4); JumpAddress = *(__IO uint32_t*) (bdinfo->fw_base + 4);
Jump_To_Application = (pFunction) JumpAddress; Jump_To_Application = (pFunction) JumpAddress;
@ -85,7 +184,25 @@ void jump_to_app() {
__set_MSP(*(__IO uint32_t*) bdinfo->fw_base); __set_MSP(*(__IO uint32_t*) bdinfo->fw_base);
Jump_To_Application(); Jump_To_Application();
} else { } else {
boot_status = jump_failed; DeviceState = failed_jump;
return; return;
} }
} }
uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) {
uint32_t curr_step = (count / pwm_period) % pwm_sweep_steps; /* 0 - pwm_sweep_steps */
uint32_t pwm_duty = pwm_period * curr_step / pwm_sweep_steps; /* fraction of pwm_period */
uint32_t curr_sweep = (count / (pwm_period * pwm_sweep_steps)); /* ticks once per full sweep */
if (curr_sweep & 1) {
pwm_duty = pwm_period - pwm_duty; /* reverse direction in odd sweeps */
}
return ((count % pwm_period) > pwm_duty) ? 1 : 0;
}
uint8_t processRX() {
if (PIOS_COM_MSG_Receive(PIOS_COM_TELEM_USB, mReceive_Buffer, sizeof(mReceive_Buffer))) {
processComand(mReceive_Buffer);
}
return true;
}

View File

@ -0,0 +1,468 @@
/**
******************************************************************************
* @addtogroup CopterControlBL CopterControl BootLoader
* @brief These files contain the code to the CopterControl Bootloader.
*
* @{
* @file op_dfu.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief This file contains the DFU commands handling code
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Includes ------------------------------------------------------------------*/
#include "pios.h"
#include <stdbool.h>
#include "op_dfu.h"
#include "pios_bl_helper.h"
#include "pios_com_msg.h"
#include <pios_board_info.h>
//programmable devices
Device devicesTable[10];
uint8_t numberOfDevices = 0;
DFUProgType currentProgrammingDestination; //flash, flash_trough spi
uint8_t currentDeviceCanRead;
uint8_t currentDeviceCanWrite;
Device currentDevice;
uint8_t Buffer[64];
uint8_t echoBuffer[64];
uint8_t SendBuffer[64];
uint8_t Command = 0;
uint8_t EchoReqFlag = 0;
uint8_t EchoAnsFlag = 0;
uint8_t StartFlag = 0;
uint32_t Aditionals = 0;
uint32_t SizeOfTransfer = 0;
uint32_t Expected_CRC = 0;
uint8_t SizeOfLastPacket = 0;
uint32_t Next_Packet = 0;
uint8_t TransferType;
uint32_t Count = 0;
uint32_t Data;
uint8_t Data0;
uint8_t Data1;
uint8_t Data2;
uint8_t Data3;
uint8_t offset = 0;
uint32_t aux;
//Download vars
uint32_t downSizeOfLastPacket = 0;
uint32_t downPacketTotal = 0;
uint32_t downPacketCurrent = 0;
DFUTransfer downType = 0;
/* Extern variables ----------------------------------------------------------*/
extern DFUStates DeviceState;
extern uint8_t JumpToApp;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void sendData(uint8_t * buf, uint16_t size);
uint32_t CalcFirmCRC(void);
void DataDownload(DownloadAction action) {
if ((DeviceState == downloading)) {
uint8_t packetSize;
uint32_t offset;
uint32_t partoffset;
SendBuffer[0] = 0x01;
SendBuffer[1] = Download;
SendBuffer[2] = downPacketCurrent >> 24;
SendBuffer[3] = downPacketCurrent >> 16;
SendBuffer[4] = downPacketCurrent >> 8;
SendBuffer[5] = downPacketCurrent;
if (downPacketCurrent == downPacketTotal - 1) {
packetSize = downSizeOfLastPacket;
} else {
packetSize = 14;
}
for (uint8_t x = 0; x < packetSize; ++x) {
partoffset = (downPacketCurrent * 14 * 4) + (x * 4);
offset = baseOfAdressType(downType) + partoffset;
if (!flash_read(SendBuffer + (6 + x * 4), offset,
currentProgrammingDestination)) {
DeviceState = Last_operation_failed;
}
}
downPacketCurrent = downPacketCurrent + 1;
if (downPacketCurrent > downPacketTotal - 1) {
DeviceState = Last_operation_Success;
Aditionals = (uint32_t) Download;
}
sendData(SendBuffer + 1, 63);
}
}
void processComand(uint8_t *xReceive_Buffer) {
Command = xReceive_Buffer[COMMAND];
#ifdef DEBUG_SSP
char str[63]= {0};
sprintf(str,"Received COMMAND:%d|",Command);
PIOS_COM_SendString(PIOS_COM_TELEM_USB,str);
#endif
EchoReqFlag = (Command >> 7);
EchoAnsFlag = (Command >> 6) & 0x01;
StartFlag = (Command >> 5) & 0x01;
Count = xReceive_Buffer[COUNT] << 24;
Count += xReceive_Buffer[COUNT + 1] << 16;
Count += xReceive_Buffer[COUNT + 2] << 8;
Count += xReceive_Buffer[COUNT + 3];
Data = xReceive_Buffer[DATA] << 24;
Data += xReceive_Buffer[DATA + 1] << 16;
Data += xReceive_Buffer[DATA + 2] << 8;
Data += xReceive_Buffer[DATA + 3];
Data0 = xReceive_Buffer[DATA];
Data1 = xReceive_Buffer[DATA + 1];
Data2 = xReceive_Buffer[DATA + 2];
Data3 = xReceive_Buffer[DATA + 3];
Command = Command & 0b00011111;
if (EchoReqFlag == 1) {
memcpy(echoBuffer, xReceive_Buffer, 64);
}
switch (Command) {
case EnterDFU:
if (((DeviceState == BLidle) && (Data0 < numberOfDevices))
|| (DeviceState == DFUidle)) {
if (Data0 > 0)
OPDfuIni(true);
DeviceState = DFUidle;
currentProgrammingDestination = devicesTable[Data0].programmingType;
currentDeviceCanRead = devicesTable[Data0].readWriteFlags & 0x01;
currentDeviceCanWrite = devicesTable[Data0].readWriteFlags >> 1
& 0x01;
currentDevice = devicesTable[Data0];
uint8_t result = 0;
switch (currentProgrammingDestination) {
case Self_flash:
result = PIOS_BL_HELPER_FLASH_Ini();
break;
case Remote_flash_via_spi:
result = true;
break;
default:
DeviceState = Last_operation_failed;
Aditionals = (uint16_t) Command;
}
if (result != 1) {
DeviceState = Last_operation_failed;
Aditionals = (uint32_t) Command;
}
}
break;
case Upload:
if ((DeviceState == DFUidle) || (DeviceState == uploading)) {
if ((StartFlag == 1) && (Next_Packet == 0)) {
TransferType = Data0;
SizeOfTransfer = Count;
Next_Packet = 1;
Expected_CRC = Data2 << 24;
Expected_CRC += Data3 << 16;
Expected_CRC += xReceive_Buffer[DATA + 4] << 8;
Expected_CRC += xReceive_Buffer[DATA + 5];
SizeOfLastPacket = Data1;
if (isBiggerThanAvailable(TransferType, (SizeOfTransfer - 1)
* 14 * 4 + SizeOfLastPacket * 4) == true) {
DeviceState = outsideDevCapabilities;
Aditionals = (uint32_t) Command;
} else {
uint8_t result = 1;
if (TransferType == FW) {
switch (currentProgrammingDestination) {
case Self_flash:
result = PIOS_BL_HELPER_FLASH_Start();
break;
case Remote_flash_via_spi:
result = false;
break;
default:
break;
}
}
if (result != 1) {
DeviceState = Last_operation_failed;
Aditionals = (uint32_t) Command;
} else {
DeviceState = uploading;
}
}
} else if ((StartFlag != 1) && (Next_Packet != 0)) {
if (Count > SizeOfTransfer) {
DeviceState = too_many_packets;
Aditionals = Count;
} else if (Count == Next_Packet - 1) {
uint8_t numberOfWords = 14;
if (Count == SizeOfTransfer - 1)//is this the last packet?
{
numberOfWords = SizeOfLastPacket;
}
uint8_t result = 0;
switch (currentProgrammingDestination) {
case Self_flash:
for (uint8_t x = 0; x < numberOfWords; ++x) {
offset = 4 * x;
Data = xReceive_Buffer[DATA + offset] << 24;
Data += xReceive_Buffer[DATA + 1 + offset] << 16;
Data += xReceive_Buffer[DATA + 2 + offset] << 8;
Data += xReceive_Buffer[DATA + 3 + offset];
aux = baseOfAdressType(TransferType) + (uint32_t)(
Count * 14 * 4 + x * 4);
result = 0;
for (int retry = 0; retry < MAX_WRI_RETRYS; ++retry) {
if (result == 0) {
result = (FLASH_ProgramWord(aux, Data)
== FLASH_COMPLETE) ? 1 : 0;
}
}
}
break;
case Remote_flash_via_spi:
result = false; // No support for this for the PipX
break;
default:
result = 0;
break;
}
if (result != 1) {
DeviceState = Last_operation_failed;
Aditionals = (uint32_t) Command;
}
++Next_Packet;
} else {
DeviceState = wrong_packet_received;
Aditionals = Count;
}
} else {
DeviceState = Last_operation_failed;
Aditionals = (uint32_t) Command;
}
}
break;
case Req_Capabilities:
OPDfuIni(true);
Buffer[0] = 0x01;
Buffer[1] = Rep_Capabilities;
if (Data0 == 0) {
Buffer[2] = 0;
Buffer[3] = 0;
Buffer[4] = 0;
Buffer[5] = 0;
Buffer[6] = 0;
Buffer[7] = numberOfDevices;
uint16_t WRFlags = 0;
for (int x = 0; x < numberOfDevices; ++x) {
WRFlags = ((devicesTable[x].readWriteFlags << (x * 2))
| WRFlags);
}
Buffer[8] = WRFlags >> 8;
Buffer[9] = WRFlags;
} else {
Buffer[2] = devicesTable[Data0 - 1].sizeOfCode >> 24;
Buffer[3] = devicesTable[Data0 - 1].sizeOfCode >> 16;
Buffer[4] = devicesTable[Data0 - 1].sizeOfCode >> 8;
Buffer[5] = devicesTable[Data0 - 1].sizeOfCode;
Buffer[6] = Data0;
Buffer[7] = devicesTable[Data0 - 1].BL_Version;
Buffer[8] = devicesTable[Data0 - 1].sizeOfDescription;
Buffer[9] = devicesTable[Data0 - 1].devID;
Buffer[10] = devicesTable[Data0 - 1].FW_Crc >> 24;
Buffer[11] = devicesTable[Data0 - 1].FW_Crc >> 16;
Buffer[12] = devicesTable[Data0 - 1].FW_Crc >> 8;
Buffer[13] = devicesTable[Data0 - 1].FW_Crc;
Buffer[14] = devicesTable[Data0 - 1].devID >> 8;
Buffer[15] = devicesTable[Data0 - 1].devID;
}
sendData(Buffer + 1, 63);
break;
case JumpFW:
if (Data == 0x5AFE) {
/* Force board into safe mode */
PIOS_IAP_WriteBootCount(0xFFFF);
}
FLASH_Lock();
JumpToApp = 1;
break;
case Reset:
PIOS_SYS_Reset();
break;
case Abort_Operation:
Next_Packet = 0;
DeviceState = DFUidle;
break;
case Op_END:
if (DeviceState == uploading) {
if (Next_Packet - 1 == SizeOfTransfer) {
Next_Packet = 0;
if ((TransferType != FW) || (Expected_CRC == CalcFirmCRC())) {
DeviceState = Last_operation_Success;
} else {
DeviceState = CRC_Fail;
}
}
if (Next_Packet - 1 < SizeOfTransfer) {
Next_Packet = 0;
DeviceState = too_few_packets;
}
}
break;
case Download_Req:
#ifdef DEBUG_SSP
sprintf(str,"COMMAND:DOWNLOAD_REQ 1 Status=%d|",DeviceState);
PIOS_COM_SendString(PIOS_COM_TELEM_USB,str);
#endif
if (DeviceState == DFUidle) {
#ifdef DEBUG_SSP
PIOS_COM_SendString(PIOS_COM_TELEM_USB,"COMMAND:DOWNLOAD_REQ 1|");
#endif
downType = Data0;
downPacketTotal = Count;
downSizeOfLastPacket = Data1;
if (isBiggerThanAvailable(downType, (downPacketTotal - 1) * 14 * 4
+ downSizeOfLastPacket * 4) == 1) {
DeviceState = outsideDevCapabilities;
Aditionals = (uint32_t) Command;
} else {
downPacketCurrent = 0;
DeviceState = downloading;
}
} else {
DeviceState = Last_operation_failed;
Aditionals = (uint32_t) Command;
}
break;
case Status_Request:
Buffer[0] = 0x01;
Buffer[1] = Status_Rep;
if (DeviceState == wrong_packet_received) {
Buffer[2] = Aditionals >> 24;
Buffer[3] = Aditionals >> 16;
Buffer[4] = Aditionals >> 8;
Buffer[5] = Aditionals;
} else {
Buffer[2] = 0;
Buffer[3] = ((uint16_t) Aditionals) >> 8;
Buffer[4] = ((uint16_t) Aditionals);
Buffer[5] = 0;
}
Buffer[6] = DeviceState;
Buffer[7] = 0;
Buffer[8] = 0;
Buffer[9] = 0;
sendData(Buffer + 1, 63);
if (DeviceState == Last_operation_Success) {
DeviceState = DFUidle;
}
break;
case Status_Rep:
break;
}
if (EchoReqFlag == 1) {
echoBuffer[0] = echoBuffer[0] | (1 << 6);
sendData(echoBuffer, 63);
}
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_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 = (bdinfo->board_type << 8) | (bdinfo->board_rev);
dev.devType = bdinfo->hw_type;
numberOfDevices = 1;
devicesTable[0] = dev;
if (discover) {
//TODO check other devices trough spi or whatever
}
}
uint32_t baseOfAdressType(DFUTransfer type) {
switch (type) {
case FW:
return currentDevice.startOfUserCode;
break;
case Descript:
return currentDevice.startOfUserCode + currentDevice.sizeOfCode;
break;
default:
return 0;
}
}
uint8_t isBiggerThanAvailable(DFUTransfer type, uint32_t size) {
switch (type) {
case FW:
return (size > currentDevice.sizeOfCode) ? 1 : 0;
break;
case Descript:
return (size > currentDevice.sizeOfDescription) ? 1 : 0;
break;
default:
return true;
}
}
uint32_t CalcFirmCRC() {
switch (currentProgrammingDestination) {
case Self_flash:
return PIOS_BL_HELPER_CRC_Memory_Calc();
break;
case Remote_flash_via_spi:
return 0;
break;
default:
return 0;
break;
}
}
void sendData(uint8_t * buf, uint16_t size) {
PIOS_COM_MSG_Send(PIOS_COM_TELEM_USB, buf, size);
}
bool flash_read(uint8_t * buffer, uint32_t adr, DFUProgType type) {
switch (type) {
case Remote_flash_via_spi:
return false; // We should not get this for the PipX
break;
case Self_flash:
for (uint8_t x = 0; x < 4; ++x) {
buffer[x] = *PIOS_BL_HELPER_FLASH_If_Read(adr + x);
}
return true;
break;
default:
return false;
}
}

View File

@ -23,6 +23,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
/* Pull in the board-specific static HW definitions.
* Including .c files is a bit ugly but this allows all of
* the HW definitions to be const and static to limit their
* scope.
*
* NOTE: THIS IS THE ONLY PLACE THAT SHOULD EVER INCLUDE THIS FILE
*/
#include "board_hw_defs.c" #include "board_hw_defs.c"
#include <pios_board_info.h> #include <pios_board_info.h>
@ -39,10 +46,11 @@ void PIOS_Board_Init() {
/* Delay system */ /* Delay system */
PIOS_DELAY_Init(); PIOS_DELAY_Init();
#if defined(PIOS_INCLUDE_LED)
PIOS_LED_Init(&pios_led_cfg); PIOS_LED_Init(&pios_led_cfg);
#endif /* PIOS_INCLUDE_LED */
#if defined(PIOS_INCLUDE_USB)
#if 0 && defined(PIOS_INCLUDE_USB)
/* Initialize board specific USB data */ /* Initialize board specific USB data */
PIOS_USB_BOARD_DATA_Init(); PIOS_USB_BOARD_DATA_Init();

View File

@ -583,7 +583,7 @@ $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION))) $(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe) # Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE),$(OPENOCD_CONFIG))) $(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE),$(OPENOCD_JTAG_CONFIG),$(OPENOCD_CONFIG)))
.PHONY: elf lss sym hex bin bino opfw .PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf elf: $(OUTDIR)/$(TARGET).elf

View File

@ -678,9 +678,10 @@ void PIOS_Board_Init(void) {
#if defined(PIOS_INCLUDE_GCSRCVR) #if defined(PIOS_INCLUDE_GCSRCVR)
GCSReceiverInitialize(); GCSReceiverInitialize();
PIOS_GCSRCVR_Init(); uint32_t pios_gcsrcvr_id;
PIOS_GCSRCVR_Init(&pios_gcsrcvr_id);
uint32_t pios_gcsrcvr_rcvr_id; uint32_t pios_gcsrcvr_rcvr_id;
if (PIOS_RCVR_Init(&pios_gcsrcvr_rcvr_id, &pios_gcsrcvr_rcvr_driver, 0)) { if (PIOS_RCVR_Init(&pios_gcsrcvr_rcvr_id, &pios_gcsrcvr_rcvr_driver, pios_gcsrcvr_id)) {
PIOS_Assert(0); PIOS_Assert(0);
} }
pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_GCS] = pios_gcsrcvr_rcvr_id; pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_GCS] = pios_gcsrcvr_rcvr_id;

View File

@ -46,20 +46,12 @@
// Private constants // Private constants
#define STACK_SIZE_BYTES 500 #define STACK_SIZE_BYTES 500
#define TASK_PRIORITY (tskIDLE_PRIORITY+1) #define TASK_PRIORITY (tskIDLE_PRIORITY+1)
//#define UPDATE_PERIOD 100
#define UPDATE_PERIOD 25
// Private types // Private types
// Private variables // Private variables
static xTaskHandle taskHandle; static xTaskHandle taskHandle;
// down sampling variables
#define alt_ds_size 4
static int32_t alt_ds_temp = 0;
static int32_t alt_ds_pres = 0;
static int alt_ds_count = 0;
// Private functions // Private functions
static void altitudeTask(void *parameters); static void altitudeTask(void *parameters);
@ -88,11 +80,6 @@ int32_t AltitudeInitialize()
{ {
BaroAltitudeInitialize(); BaroAltitudeInitialize();
// init down-sampling data
alt_ds_temp = 0;
alt_ds_pres = 0;
alt_ds_count = 0;
return 0; return 0;
} }
MODULE_INITCALL(AltitudeInitialize, AltitudeStart) MODULE_INITCALL(AltitudeInitialize, AltitudeStart)
@ -144,12 +131,12 @@ static void altitudeTask(void *parameters)
// Update the temperature data // Update the temperature data
PIOS_MS5611_StartADC(TemperatureConv); PIOS_MS5611_StartADC(TemperatureConv);
vTaskDelay(5); vTaskDelay(PIOS_MS5611_GetDelay());
PIOS_MS5611_ReadADC(); PIOS_MS5611_ReadADC();
// Update the pressure data // Update the pressure data
PIOS_MS5611_StartADC(PressureConv); PIOS_MS5611_StartADC(PressureConv);
vTaskDelay(5); vTaskDelay(PIOS_MS5611_GetDelay());
PIOS_MS5611_ReadADC(); PIOS_MS5611_ReadADC();

View File

@ -0,0 +1,372 @@
/**
******************************************************************************
*
* @file guidance.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief This module compared @ref PositionActuatl to @ref ActiveWaypoint
* and sets @ref AttitudeDesired. It only does this when the FlightMode field
* of @ref ManualControlCommand is Auto.
*
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* Input object: ActiveWaypoint
* Input object: PositionActual
* Input object: ManualControlCommand
* Output object: AttitudeDesired
*
* This module will periodically update the value of the AttitudeDesired object.
*
* The module executes in its own thread in this example.
*
* Modules have no API, all communication to other modules is done through UAVObjects.
* However modules may use the API exposed by shared libraries.
* See the OpenPilot wiki for more details.
* http://www.openpilot.org/OpenPilot_Application_Architecture
*
*/
#include "openpilot.h"
#include <math.h>
#include "CoordinateConversions.h"
#include "altholdsmoothed.h"
#include "attitudeactual.h"
#include "altitudeholdsettings.h"
#include "altitudeholddesired.h" // object that will be updated by the module
#include "baroaltitude.h"
#include "positionactual.h"
#include "flightstatus.h"
#include "stabilizationdesired.h"
#include "accels.h"
// Private constants
#define MAX_QUEUE_SIZE 2
#define STACK_SIZE_BYTES 1024
#define TASK_PRIORITY (tskIDLE_PRIORITY+1)
// Private types
// Private variables
static xTaskHandle altitudeHoldTaskHandle;
static xQueueHandle queue;
static AltitudeHoldSettingsData altitudeHoldSettings;
// Private functions
static void altitudeHoldTask(void *parameters);
static void SettingsUpdatedCb(UAVObjEvent * ev);
/**
* Initialise the module, called on startup
* \returns 0 on success or -1 if initialisation failed
*/
int32_t AltitudeHoldStart()
{
// Start main task
xTaskCreate(altitudeHoldTask, (signed char *)"AltitudeHold", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &altitudeHoldTaskHandle);
TaskMonitorAdd(TASKINFO_RUNNING_ALTITUDEHOLD, altitudeHoldTaskHandle);
return 0;
}
/**
* Initialise the module, called on startup
* \returns 0 on success or -1 if initialisation failed
*/
int32_t AltitudeHoldInitialize()
{
AltitudeHoldSettingsInitialize();
AltitudeHoldDesiredInitialize();
AltHoldSmoothedInitialize();
// Create object queue
queue = xQueueCreate(MAX_QUEUE_SIZE, sizeof(UAVObjEvent));
// Listen for updates.
AltitudeHoldDesiredConnectQueue(queue);
BaroAltitudeConnectQueue(queue);
FlightStatusConnectQueue(queue);
AccelsConnectQueue(queue);
AltitudeHoldSettingsConnectCallback(&SettingsUpdatedCb);
return 0;
}
MODULE_INITCALL(AltitudeHoldInitialize, AltitudeHoldStart)
float tau;
float throttleIntegral;
float velocity;
float decay;
float velocity_decay;
bool running = false;
float error;
float switchThrottle;
float smoothed_altitude;
float starting_altitude;
/**
* Module thread, should not return.
*/
static void altitudeHoldTask(void *parameters)
{
AltitudeHoldDesiredData altitudeHoldDesired;
StabilizationDesiredData stabilizationDesired;
portTickType thisTime, lastUpdateTime;
UAVObjEvent ev;
// Force update of the settings
SettingsUpdatedCb(&ev);
BaroAltitudeAltitudeGet(&smoothed_altitude);
running = false;
enum init_state {WAITING_BARO, WAITIING_INIT, INITED} init = WAITING_BARO;
// Main task loop
bool baro_updated = false;
while (1) {
// Wait until the AttitudeRaw object is updated, if a timeout then go to failsafe
if ( xQueueReceive(queue, &ev, 100 / portTICK_RATE_MS) != pdTRUE )
{
if(!running)
throttleIntegral = 0;
// Todo: Add alarm if it should be running
continue;
} else if (ev.obj == BaroAltitudeHandle()) {
baro_updated = true;
init = (init == WAITING_BARO) ? WAITIING_INIT : init;
} else if (ev.obj == FlightStatusHandle()) {
FlightStatusData flightStatus;
FlightStatusGet(&flightStatus);
if(flightStatus.FlightMode == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD && !running) {
// Copy the current throttle as a starting point for integral
StabilizationDesiredThrottleGet(&throttleIntegral);
switchThrottle = throttleIntegral;
error = 0;
velocity = 0;
running = true;
AltHoldSmoothedData altHold;
AltHoldSmoothedGet(&altHold);
starting_altitude = altHold.Altitude;
} else if (flightStatus.FlightMode != FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD)
running = false;
} else if (ev.obj == AccelsHandle()) {
static uint32_t timeval;
static float z[4] = {0, 0, 0, 0};
float z_new[4];
float P[4][4], K[4][2], x[2];
float G[4] = {1.0e-15f, 1.0e-15f, 1.0e-3f, 1.0e-7};
static float V[4][4] = {{10.0f, 0, 0, 0}, {0, 100.0f, 0, 0}, {0, 0, 100.0f, 0}, {0, 0, 0, 1000.0f}};
float dT;
static float S[2] = {1.0f,10.0f};
thisTime = xTaskGetTickCount();
/* Somehow this always assigns to zero. Compiler bug? Race condition? */
S[0] = altitudeHoldSettings.PressureNoise;
S[1] = altitudeHoldSettings.AccelNoise;
G[2] = altitudeHoldSettings.AccelDrift;
AccelsData accels;
AccelsGet(&accels);
AttitudeActualData attitudeActual;
AttitudeActualGet(&attitudeActual);
BaroAltitudeData baro;
BaroAltitudeGet(&baro);
if (init == WAITIING_INIT) {
z[0] = baro.Altitude;
z[1] = 0;
z[2] = accels.z;
z[3] = 0;
init = INITED;
} else if (init == WAITING_BARO)
continue;
x[0] = baro.Altitude;
//rotate avg accels into earth frame and store it
if(1) {
float q[4], Rbe[3][3];
q[0]=attitudeActual.q1;
q[1]=attitudeActual.q2;
q[2]=attitudeActual.q3;
q[3]=attitudeActual.q4;
Quaternion2R(q, Rbe);
x[1] = -(Rbe[0][2]*accels.x+ Rbe[1][2]*accels.y + Rbe[2][2]*accels.z + 9.81f);
} else {
x[1] = -accels.z + 9.81f;
}
dT = PIOS_DELAY_DiffuS(timeval) / 1.0e6f;
timeval = PIOS_DELAY_GetRaw();
P[0][0] = dT*(V[0][1]+dT*V[1][1])+V[0][0]+G[0]+dT*V[1][0];
P[0][1] = dT*(V[0][2]+dT*V[1][2])+V[0][1]+dT*V[1][1];
P[0][2] = V[0][2]+dT*V[1][2];
P[0][3] = V[0][3]+dT*V[1][3];
P[1][0] = dT*(V[1][1]+dT*V[2][1])+V[1][0]+dT*V[2][0];
P[1][1] = dT*(V[1][2]+dT*V[2][2])+V[1][1]+G[1]+dT*V[2][1];
P[1][2] = V[1][2]+dT*V[2][2];
P[1][3] = V[1][3]+dT*V[2][3];
P[2][0] = V[2][0]+dT*V[2][1];
P[2][1] = V[2][1]+dT*V[2][2];
P[2][2] = V[2][2]+G[2];
P[2][3] = V[2][3];
P[3][0] = V[3][0]+dT*V[3][1];
P[3][1] = V[3][1]+dT*V[3][2];
P[3][2] = V[3][2];
P[3][3] = V[3][3]+G[3];
if (baro_updated) {
K[0][0] = -(V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1])/(V[0][0]*G[2]+V[0][0]*G[3]+V[2][2]*G[0]+V[2][3]*G[0]+V[3][2]*G[0]+V[3][3]*G[0]+V[0][0]*S[1]+V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]+V[0][0]*V[3][2]-V[0][2]*V[3][0]-V[2][0]*V[0][3]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[2]+G[0]*G[3]+G[0]*S[1]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]-(dT*dT)*V[2][1]*V[1][3]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+dT*V[0][1]*S[1]+dT*V[1][0]*S[1]+(dT*dT)*V[1][1]*G[2]+(dT*dT)*V[1][1]*G[3]+(dT*dT)*V[1][1]*S[1]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[2][3]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3])+1.0f;
K[0][1] = ((V[0][2]+V[0][3])*S[0]+dT*(V[1][2]+V[1][3])*S[0])/(V[0][0]*G[2]+V[0][0]*G[3]+V[2][2]*G[0]+V[2][3]*G[0]+V[3][2]*G[0]+V[3][3]*G[0]+V[0][0]*S[1]+V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]+V[0][0]*V[3][2]-V[0][2]*V[3][0]-V[2][0]*V[0][3]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[2]+G[0]*G[3]+G[0]*S[1]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]-(dT*dT)*V[2][1]*V[1][3]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+dT*V[0][1]*S[1]+dT*V[1][0]*S[1]+(dT*dT)*V[1][1]*G[2]+(dT*dT)*V[1][1]*G[3]+(dT*dT)*V[1][1]*S[1]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[2][3]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3]);
K[1][0] = (V[1][0]*G[2]+V[1][0]*G[3]+V[1][0]*S[1]+V[1][0]*V[2][2]-V[2][0]*V[1][2]+V[1][0]*V[2][3]+V[1][0]*V[3][2]-V[2][0]*V[1][3]-V[1][2]*V[3][0]+V[1][0]*V[3][3]-V[3][0]*V[1][3]+(dT*dT)*V[2][1]*V[3][2]-(dT*dT)*V[2][2]*V[3][1]+(dT*dT)*V[2][1]*V[3][3]-(dT*dT)*V[3][1]*V[2][3]+dT*V[1][1]*G[2]+dT*V[2][0]*G[2]+dT*V[1][1]*G[3]+dT*V[2][0]*G[3]+dT*V[1][1]*S[1]+dT*V[2][0]*S[1]+(dT*dT)*V[2][1]*G[2]+(dT*dT)*V[2][1]*G[3]+(dT*dT)*V[2][1]*S[1]+dT*V[1][1]*V[2][2]-dT*V[1][2]*V[2][1]+dT*V[1][1]*V[2][3]+dT*V[1][1]*V[3][2]+dT*V[2][0]*V[3][2]-dT*V[1][2]*V[3][1]-dT*V[2][1]*V[1][3]-dT*V[3][0]*V[2][2]+dT*V[1][1]*V[3][3]+dT*V[2][0]*V[3][3]-dT*V[3][0]*V[2][3]-dT*V[1][3]*V[3][1])/(V[0][0]*G[2]+V[0][0]*G[3]+V[2][2]*G[0]+V[2][3]*G[0]+V[3][2]*G[0]+V[3][3]*G[0]+V[0][0]*S[1]+V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]+V[0][0]*V[3][2]-V[0][2]*V[3][0]-V[2][0]*V[0][3]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[2]+G[0]*G[3]+G[0]*S[1]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]-(dT*dT)*V[2][1]*V[1][3]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+dT*V[0][1]*S[1]+dT*V[1][0]*S[1]+(dT*dT)*V[1][1]*G[2]+(dT*dT)*V[1][1]*G[3]+(dT*dT)*V[1][1]*S[1]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[2][3]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3]);
K[1][1] = (V[1][2]*G[0]+V[1][3]*G[0]+V[1][2]*S[0]+V[1][3]*S[0]+V[0][0]*V[1][2]-V[1][0]*V[0][2]+V[0][0]*V[1][3]-V[1][0]*V[0][3]+(dT*dT)*V[0][1]*V[2][2]+(dT*dT)*V[1][0]*V[2][2]-(dT*dT)*V[0][2]*V[2][1]-(dT*dT)*V[2][0]*V[1][2]+(dT*dT)*V[0][1]*V[2][3]+(dT*dT)*V[1][0]*V[2][3]-(dT*dT)*V[2][0]*V[1][3]-(dT*dT)*V[0][3]*V[2][1]+(dT*dT*dT)*V[1][1]*V[2][2]-(dT*dT*dT)*V[1][2]*V[2][1]+(dT*dT*dT)*V[1][1]*V[2][3]-(dT*dT*dT)*V[2][1]*V[1][3]+dT*V[2][2]*G[0]+dT*V[2][3]*G[0]+dT*V[2][2]*S[0]+dT*V[2][3]*S[0]+dT*V[0][0]*V[2][2]+dT*V[0][1]*V[1][2]-dT*V[0][2]*V[1][1]-dT*V[0][2]*V[2][0]+dT*V[0][0]*V[2][3]+dT*V[0][1]*V[1][3]-dT*V[1][1]*V[0][3]-dT*V[2][0]*V[0][3])/(V[0][0]*G[2]+V[0][0]*G[3]+V[2][2]*G[0]+V[2][3]*G[0]+V[3][2]*G[0]+V[3][3]*G[0]+V[0][0]*S[1]+V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]+V[0][0]*V[3][2]-V[0][2]*V[3][0]-V[2][0]*V[0][3]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[2]+G[0]*G[3]+G[0]*S[1]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]-(dT*dT)*V[2][1]*V[1][3]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+dT*V[0][1]*S[1]+dT*V[1][0]*S[1]+(dT*dT)*V[1][1]*G[2]+(dT*dT)*V[1][1]*G[3]+(dT*dT)*V[1][1]*S[1]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[2][3]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3]);
K[2][0] = (V[2][0]*G[3]-V[3][0]*G[2]+V[2][0]*S[1]+V[2][0]*V[3][2]-V[3][0]*V[2][2]+V[2][0]*V[3][3]-V[3][0]*V[2][3]+dT*V[2][1]*G[3]-dT*V[3][1]*G[2]+dT*V[2][1]*S[1]+dT*V[2][1]*V[3][2]-dT*V[2][2]*V[3][1]+dT*V[2][1]*V[3][3]-dT*V[3][1]*V[2][3])/(V[0][0]*G[2]+V[0][0]*G[3]+V[2][2]*G[0]+V[2][3]*G[0]+V[3][2]*G[0]+V[3][3]*G[0]+V[0][0]*S[1]+V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]+V[0][0]*V[3][2]-V[0][2]*V[3][0]-V[2][0]*V[0][3]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[2]+G[0]*G[3]+G[0]*S[1]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]-(dT*dT)*V[2][1]*V[1][3]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+dT*V[0][1]*S[1]+dT*V[1][0]*S[1]+(dT*dT)*V[1][1]*G[2]+(dT*dT)*V[1][1]*G[3]+(dT*dT)*V[1][1]*S[1]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[2][3]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3]);
K[2][1] = (V[0][0]*G[2]+V[2][2]*G[0]+V[2][3]*G[0]+V[2][2]*S[0]+V[2][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]-V[2][0]*V[0][3]+G[0]*G[2]+G[2]*S[0]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]-(dT*dT)*V[2][1]*V[1][3]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+(dT*dT)*V[1][1]*G[2]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[1][0]*V[2][3]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1])/(V[0][0]*G[2]+V[0][0]*G[3]+V[2][2]*G[0]+V[2][3]*G[0]+V[3][2]*G[0]+V[3][3]*G[0]+V[0][0]*S[1]+V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]+V[0][0]*V[3][2]-V[0][2]*V[3][0]-V[2][0]*V[0][3]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[2]+G[0]*G[3]+G[0]*S[1]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]-(dT*dT)*V[2][1]*V[1][3]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+dT*V[0][1]*S[1]+dT*V[1][0]*S[1]+(dT*dT)*V[1][1]*G[2]+(dT*dT)*V[1][1]*G[3]+(dT*dT)*V[1][1]*S[1]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[2][3]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3]);
K[3][0] = (-V[2][0]*G[3]+V[3][0]*G[2]+V[3][0]*S[1]-V[2][0]*V[3][2]+V[3][0]*V[2][2]-V[2][0]*V[3][3]+V[3][0]*V[2][3]-dT*V[2][1]*G[3]+dT*V[3][1]*G[2]+dT*V[3][1]*S[1]-dT*V[2][1]*V[3][2]+dT*V[2][2]*V[3][1]-dT*V[2][1]*V[3][3]+dT*V[3][1]*V[2][3])/(V[0][0]*G[2]+V[0][0]*G[3]+V[2][2]*G[0]+V[2][3]*G[0]+V[3][2]*G[0]+V[3][3]*G[0]+V[0][0]*S[1]+V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]+V[0][0]*V[3][2]-V[0][2]*V[3][0]-V[2][0]*V[0][3]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[2]+G[0]*G[3]+G[0]*S[1]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]-(dT*dT)*V[2][1]*V[1][3]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+dT*V[0][1]*S[1]+dT*V[1][0]*S[1]+(dT*dT)*V[1][1]*G[2]+(dT*dT)*V[1][1]*G[3]+(dT*dT)*V[1][1]*S[1]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[2][3]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3]);
K[3][1] = (V[0][0]*G[3]+V[3][2]*G[0]+V[3][3]*G[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[3][2]-V[0][2]*V[3][0]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[3]+G[3]*S[0]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+(dT*dT)*V[1][1]*G[3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3])/(V[0][0]*G[2]+V[0][0]*G[3]+V[2][2]*G[0]+V[2][3]*G[0]+V[3][2]*G[0]+V[3][3]*G[0]+V[0][0]*S[1]+V[2][2]*S[0]+V[2][3]*S[0]+V[3][2]*S[0]+V[3][3]*S[0]+V[0][0]*V[2][2]-V[0][2]*V[2][0]+V[0][0]*V[2][3]+V[0][0]*V[3][2]-V[0][2]*V[3][0]-V[2][0]*V[0][3]+V[0][0]*V[3][3]-V[0][3]*V[3][0]+G[0]*G[2]+G[0]*G[3]+G[0]*S[1]+G[2]*S[0]+G[3]*S[0]+S[0]*S[1]+(dT*dT)*V[1][1]*V[2][2]-(dT*dT)*V[1][2]*V[2][1]+(dT*dT)*V[1][1]*V[2][3]+(dT*dT)*V[1][1]*V[3][2]-(dT*dT)*V[1][2]*V[3][1]-(dT*dT)*V[2][1]*V[1][3]+(dT*dT)*V[1][1]*V[3][3]-(dT*dT)*V[1][3]*V[3][1]+dT*V[0][1]*G[2]+dT*V[1][0]*G[2]+dT*V[0][1]*G[3]+dT*V[1][0]*G[3]+dT*V[0][1]*S[1]+dT*V[1][0]*S[1]+(dT*dT)*V[1][1]*G[2]+(dT*dT)*V[1][1]*G[3]+(dT*dT)*V[1][1]*S[1]+dT*V[0][1]*V[2][2]+dT*V[1][0]*V[2][2]-dT*V[0][2]*V[2][1]-dT*V[2][0]*V[1][2]+dT*V[0][1]*V[2][3]+dT*V[0][1]*V[3][2]+dT*V[1][0]*V[2][3]+dT*V[1][0]*V[3][2]-dT*V[0][2]*V[3][1]-dT*V[2][0]*V[1][3]-dT*V[0][3]*V[2][1]-dT*V[1][2]*V[3][0]+dT*V[0][1]*V[3][3]+dT*V[1][0]*V[3][3]-dT*V[0][3]*V[3][1]-dT*V[3][0]*V[1][3]);
z_new[0] = -K[0][0]*(dT*z[1]-x[0]+z[0])+dT*z[1]-K[0][1]*(-x[1]+z[2]+z[3])+z[0];
z_new[1] = -K[1][0]*(dT*z[1]-x[0]+z[0])+dT*z[2]-K[1][1]*(-x[1]+z[2]+z[3])+z[1];
z_new[2] = -K[2][0]*(dT*z[1]-x[0]+z[0])-K[2][1]*(-x[1]+z[2]+z[3])+z[2];
z_new[3] = -K[3][0]*(dT*z[1]-x[0]+z[0])-K[3][1]*(-x[1]+z[2]+z[3])+z[3];
memcpy(z, z_new, sizeof(z_new));
V[0][0] = -K[0][1]*P[2][0]-K[0][1]*P[3][0]-P[0][0]*(K[0][0]-1.0f);
V[0][1] = -K[0][1]*P[2][1]-K[0][1]*P[3][2]-P[0][1]*(K[0][0]-1.0f);
V[0][2] = -K[0][1]*P[2][2]-K[0][1]*P[3][2]-P[0][2]*(K[0][0]-1.0f);
V[0][3] = -K[0][1]*P[2][3]-K[0][1]*P[3][3]-P[0][3]*(K[0][0]-1.0f);
V[1][0] = P[1][0]-K[1][0]*P[0][0]-K[1][1]*P[2][0]-K[1][1]*P[3][0];
V[1][1] = P[1][1]-K[1][0]*P[0][1]-K[1][1]*P[2][1]-K[1][1]*P[3][2];
V[1][2] = P[1][2]-K[1][0]*P[0][2]-K[1][1]*P[2][2]-K[1][1]*P[3][2];
V[1][3] = P[1][3]-K[1][0]*P[0][3]-K[1][1]*P[2][3]-K[1][1]*P[3][3];
V[2][0] = -K[2][0]*P[0][0]-K[2][1]*P[3][0]-P[2][0]*(K[2][1]-1.0f);
V[2][1] = -K[2][0]*P[0][1]-K[2][1]*P[3][2]-P[2][1]*(K[2][1]-1.0f);
V[2][2] = -K[2][0]*P[0][2]-K[2][1]*P[3][2]-P[2][2]*(K[2][1]-1.0f);
V[2][3] = -K[2][0]*P[0][3]-K[2][1]*P[3][3]-P[2][3]*(K[2][1]-1.0f);
V[3][0] = -K[3][0]*P[0][0]-K[3][1]*P[2][0]-P[3][0]*(K[3][1]-1.0f);
V[3][1] = -K[3][0]*P[0][1]-K[3][1]*P[2][1]-P[3][2]*(K[3][1]-1.0f);
V[3][2] = -K[3][0]*P[0][2]-K[3][1]*P[2][2]-P[3][2]*(K[3][1]-1.0f);
V[3][3] = -K[3][0]*P[0][3]-K[3][1]*P[2][3]-P[3][3]*(K[3][1]-1.0f);
baro_updated = false;
} else {
K[0][0] = (V[0][2]+V[0][3]+dT*V[1][2]+dT*V[1][3])/(V[2][2]+V[2][3]+V[3][2]+V[3][3]+G[2]+G[3]+S[1]);
K[1][0] = (V[1][2]+V[1][3]+dT*V[2][2]+dT*V[2][3])/(V[2][2]+V[2][3]+V[3][2]+V[3][3]+G[2]+G[3]+S[1]);
K[2][0] = (V[2][2]+V[2][3]+G[2])/(V[2][2]+V[2][3]+V[3][2]+V[3][3]+G[2]+G[3]+S[1]);
K[3][0] = (V[3][2]+V[3][3]+G[3])/(V[2][2]+V[2][3]+V[3][2]+V[3][3]+G[2]+G[3]+S[1]);
z_new[0] = dT*z[1]-K[0][0]*(-x[1]+z[2]+z[3])+z[0];
z_new[1] = dT*z[2]-K[1][0]*(-x[1]+z[2]+z[3])+z[1];
z_new[2] = -K[2][0]*(-x[1]+z[2]+z[3])+z[2];
z_new[3] = -K[3][0]*(-x[1]+z[2]+z[3])+z[3];
memcpy(z, z_new, sizeof(z_new));
V[0][0] = P[0][0]-K[0][0]*P[2][0]-K[0][0]*P[3][0];
V[0][1] = P[0][1]-K[0][0]*P[2][1]-K[0][0]*P[3][2];
V[0][2] = P[0][2]-K[0][0]*P[2][2]-K[0][0]*P[3][2];
V[0][3] = P[0][3]-K[0][0]*P[2][3]-K[0][0]*P[3][3];
V[1][0] = P[1][0]-K[1][0]*P[2][0]-K[1][0]*P[3][0];
V[1][1] = P[1][1]-K[1][0]*P[2][1]-K[1][0]*P[3][2];
V[1][2] = P[1][2]-K[1][0]*P[2][2]-K[1][0]*P[3][2];
V[1][3] = P[1][3]-K[1][0]*P[2][3]-K[1][0]*P[3][3];
V[2][0] = -K[2][0]*P[3][0]-P[2][0]*(K[2][0]-1.0f);
V[2][1] = -K[2][0]*P[3][2]-P[2][1]*(K[2][0]-1.0f);
V[2][2] = -K[2][0]*P[3][2]-P[2][2]*(K[2][0]-1.0f);
V[2][3] = -K[2][0]*P[3][3]-P[2][3]*(K[2][0]-1.0f);
V[3][0] = -K[3][0]*P[2][0]-P[3][0]*(K[3][0]-1.0f);
V[3][1] = -K[3][0]*P[2][1]-P[3][2]*(K[3][0]-1.0f);
V[3][2] = -K[3][0]*P[2][2]-P[3][2]*(K[3][0]-1.0f);
V[3][3] = -K[3][0]*P[2][3]-P[3][3]*(K[3][0]-1.0f);
}
AltHoldSmoothedData altHold;
AltHoldSmoothedGet(&altHold);
altHold.Altitude = z[0];
altHold.Velocity = z[1];
altHold.Accel = z[2];
AltHoldSmoothedSet(&altHold);
AltHoldSmoothedGet(&altHold);
// Verify that we are in altitude hold mode
FlightStatusData flightStatus;
FlightStatusGet(&flightStatus);
if(flightStatus.FlightMode != FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD) {
running = false;
}
if (!running)
continue;
// Compute the altitude error
error = (starting_altitude + altitudeHoldDesired.Altitude) - altHold.Altitude;
// Compute integral off altitude error
throttleIntegral += error * altitudeHoldSettings.Ki * dT;
// Only update stabilizationDesired less frequently
if((thisTime - lastUpdateTime) < 20)
continue;
lastUpdateTime = thisTime;
// Instead of explicit limit on integral you output limit feedback
StabilizationDesiredGet(&stabilizationDesired);
stabilizationDesired.Throttle = error * altitudeHoldSettings.Kp + throttleIntegral -
altHold.Velocity * altitudeHoldSettings.Kd - altHold.Accel * altitudeHoldSettings.Ka;
if(stabilizationDesired.Throttle > 1) {
throttleIntegral -= (stabilizationDesired.Throttle - 1);
stabilizationDesired.Throttle = 1;
}
else if (stabilizationDesired.Throttle < 0) {
throttleIntegral -= stabilizationDesired.Throttle;
stabilizationDesired.Throttle = 0;
}
stabilizationDesired.StabilizationMode[STABILIZATIONDESIRED_STABILIZATIONMODE_ROLL] = STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE;
stabilizationDesired.StabilizationMode[STABILIZATIONDESIRED_STABILIZATIONMODE_PITCH] = STABILIZATIONDESIRED_STABILIZATIONMODE_ATTITUDE;
stabilizationDesired.StabilizationMode[STABILIZATIONDESIRED_STABILIZATIONMODE_YAW] = STABILIZATIONDESIRED_STABILIZATIONMODE_AXISLOCK;
stabilizationDesired.Roll = altitudeHoldDesired.Roll;
stabilizationDesired.Pitch = altitudeHoldDesired.Pitch;
stabilizationDesired.Yaw = altitudeHoldDesired.Yaw;
StabilizationDesiredSet(&stabilizationDesired);
} else if (ev.obj == AltitudeHoldDesiredHandle()) {
AltitudeHoldDesiredGet(&altitudeHoldDesired);
}
}
}
static void SettingsUpdatedCb(UAVObjEvent * ev)
{
AltitudeHoldSettingsGet(&altitudeHoldSettings);
}

View File

@ -1,9 +1,9 @@
/** /**
****************************************************************************** ******************************************************************************
* *
* @file ahrs_spi_program_slave.h * @file examplemodperiodic.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief AHRS programming over SPI link - slave(AHRS) end. * @brief Example module to be used as a template for actual modules.
* *
* @see The GNU Public License (GPL) Version 3 * @see The GNU Public License (GPL) Version 3
* *
@ -23,13 +23,9 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef EXAMPLEMODPERIODIC_H
#define EXAMPLEMODPERIODIC_H
#ifndef AHRS_SPI_PROGRAM_SLAVE_H int32_t ExampleModPeriodicInitialize();
#define AHRS_SPI_PROGRAM_SLAVE_H int32_t GuidanceInitialize(void);
#endif // EXAMPLEMODPERIODIC_H
/** Check if OpenPilot is trying to program AHRS
* If so, it will program the FLASH then return
* If not it just returns.
*/
void AhrsProgramReceive(uint32_t spi_id);
#endif //AHRS_PROGRAM_SLAVE_H

View File

@ -234,6 +234,12 @@ static int32_t updateAttitudeComplimentary(bool first_run)
AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE,SYSTEMALARMS_ALARM_WARNING); AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE,SYSTEMALARMS_ALARM_WARNING);
return -1; return -1;
} }
if ( xQueueReceive(accelQueue, &ev, 0) != pdTRUE )
{
// When one of these is updated so should the other
AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE,SYSTEMALARMS_ALARM_WARNING);
return -1;
}
// During initialization and // During initialization and
FlightStatusData flightStatus; FlightStatusData flightStatus;
@ -290,7 +296,8 @@ static int32_t updateAttitudeComplimentary(bool first_run)
accel_err[1] /= accel_mag; accel_err[1] /= accel_mag;
accel_err[2] /= accel_mag; accel_err[2] /= accel_mag;
if (1) { if ( xQueueReceive(magQueue, &ev, 0) != pdTRUE )
{
// Rotate gravity to body frame and cross with accels // Rotate gravity to body frame and cross with accels
float brot[3]; float brot[3];
float Rbe[3][3]; float Rbe[3][3];
@ -378,6 +385,14 @@ static int32_t updateAttitudeComplimentary(bool first_run)
AttitudeActualSet(&attitudeActual); AttitudeActualSet(&attitudeActual);
// Flush these queues for avoid errors
if ( xQueueReceive(baroQueue, &ev, 0) != pdTRUE )
{
}
if ( xQueueReceive(gpsQueue, &ev, 0) != pdTRUE )
{
}
AlarmsClear(SYSTEMALARMS_ALARM_ATTITUDE); AlarmsClear(SYSTEMALARMS_ALARM_ATTITUDE);
return 0; return 0;

View File

@ -39,6 +39,7 @@ typedef enum {FLIGHTMODE_UNDEFINED = 0, FLIGHTMODE_MANUAL = 1, FLIGHTMODE_STABIL
(x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED1) ? FLIGHTMODE_STABILIZED : \ (x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED1) ? FLIGHTMODE_STABILIZED : \
(x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED2) ? FLIGHTMODE_STABILIZED : \ (x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED2) ? FLIGHTMODE_STABILIZED : \
(x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED3) ? FLIGHTMODE_STABILIZED : \ (x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED3) ? FLIGHTMODE_STABILIZED : \
(x == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD) ? FLIGHTMODE_GUIDANCE : \
(x == FLIGHTSTATUS_FLIGHTMODE_VELOCITYCONTROL) ? FLIGHTMODE_GUIDANCE : \ (x == FLIGHTSTATUS_FLIGHTMODE_VELOCITYCONTROL) ? FLIGHTMODE_GUIDANCE : \
(x == FLIGHTSTATUS_FLIGHTMODE_POSITIONHOLD) ? FLIGHTMODE_GUIDANCE : FLIGHTMODE_UNDEFINED \ (x == FLIGHTSTATUS_FLIGHTMODE_POSITIONHOLD) ? FLIGHTMODE_GUIDANCE : FLIGHTMODE_UNDEFINED \
) )

View File

@ -44,6 +44,9 @@
#include "flightstatus.h" #include "flightstatus.h"
#include "accessorydesired.h" #include "accessorydesired.h"
#include "receiveractivity.h" #include "receiveractivity.h"
#include "altitudeholddesired.h"
#include "positionactual.h"
#include "baroaltitude.h"
// Private constants // Private constants
#if defined(PIOS_MANUAL_STACK_SIZE) #if defined(PIOS_MANUAL_STACK_SIZE)
@ -79,6 +82,7 @@ static portTickType lastSysTime;
// Private functions // Private functions
static void updateActuatorDesired(ManualControlCommandData * cmd); static void updateActuatorDesired(ManualControlCommandData * cmd);
static void updateStabilizationDesired(ManualControlCommandData * cmd, ManualControlSettingsData * settings); static void updateStabilizationDesired(ManualControlCommandData * cmd, ManualControlSettingsData * settings);
static void altitudeHoldDesired(ManualControlCommandData * cmd);
static void processFlightMode(ManualControlSettingsData * settings, float flightMode); static void processFlightMode(ManualControlSettingsData * settings, float flightMode);
static void processArm(ManualControlCommandData * cmd, ManualControlSettingsData * settings); static void processArm(ManualControlCommandData * cmd, ManualControlSettingsData * settings);
static void setArmedIfChanged(uint8_t val); static void setArmedIfChanged(uint8_t val);
@ -375,7 +379,13 @@ static void manualControlTask(void *parameters)
updateStabilizationDesired(&cmd, &settings); updateStabilizationDesired(&cmd, &settings);
break; break;
case FLIGHTMODE_GUIDANCE: case FLIGHTMODE_GUIDANCE:
// TODO: Implement switch(flightStatus.FlightMode) {
case FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD:
altitudeHoldDesired(&cmd);
break;
default:
AlarmsSet(SYSTEMALARMS_ALARM_MANUALCONTROL, SYSTEMALARMS_ALARM_CRITICAL);
}
break; break;
} }
} }
@ -588,6 +598,52 @@ static void updateStabilizationDesired(ManualControlCommandData * cmd, ManualCon
StabilizationDesiredSet(&stabilization); StabilizationDesiredSet(&stabilization);
} }
#if defined(REVOLUTION)
// TODO: Need compile flag to exclude this from copter control
static void altitudeHoldDesired(ManualControlCommandData * cmd)
{
const float DEADBAND_HIGH = 0.55;
const float DEADBAND_LOW = 0.45;
static portTickType lastSysTime;
static bool zeroed = false;
portTickType thisSysTime;
float dT;
AltitudeHoldDesiredData altitudeHoldDesired;
AltitudeHoldDesiredGet(&altitudeHoldDesired);
StabilizationSettingsData stabSettings;
StabilizationSettingsGet(&stabSettings);
thisSysTime = xTaskGetTickCount();
dT = (thisSysTime - lastSysTime) / portTICK_RATE_MS / 1000.0f;
lastSysTime = thisSysTime;
altitudeHoldDesired.Roll = cmd->Roll * stabSettings.RollMax;
altitudeHoldDesired.Pitch = cmd->Pitch * stabSettings.PitchMax;
altitudeHoldDesired.Yaw = cmd->Yaw * stabSettings.ManualRate[STABILIZATIONSETTINGS_MANUALRATE_YAW];
float currentDown;
PositionActualDownGet(&currentDown);
if(dT > 1) {
// After not being in this mode for a while init at current height
altitudeHoldDesired.Altitude = 0;
zeroed = false;
} else if (cmd->Throttle > DEADBAND_HIGH && zeroed)
altitudeHoldDesired.Altitude += (cmd->Throttle - DEADBAND_HIGH) * dT;
else if (cmd->Throttle < DEADBAND_LOW && zeroed)
altitudeHoldDesired.Altitude += (cmd->Throttle - DEADBAND_LOW) * dT;
else if (cmd->Throttle >= DEADBAND_LOW && cmd->Throttle <= DEADBAND_HIGH) // Require the stick to enter the dead band before they can move height
zeroed = true;
AltitudeHoldDesiredSet(&altitudeHoldDesired);
}
#else
static void altitudeHoldDesired(ManualControlCommandData * cmd)
{
AlarmsSet(SYSTEMALARMS_ALARM_MANUALCONTROL, SYSTEMALARMS_ALARM_ERROR);
}
#endif
/** /**
* Convert channel from servo pulse duration (microseconds) to scaled -1/+1 range. * Convert channel from servo pulse duration (microseconds) to scaled -1/+1 range.
*/ */

View File

@ -1,9 +1,19 @@
/** /**
****************************************************************************** ******************************************************************************
* @addtogroup OpenPilotModules OpenPilot Modules
* @{
* @addtogroup TelemetryModule Telemetry Module
* @brief Main telemetry module
* Starts three tasks (RX, TX, and priority TX) that watch event queues
* and handle all the telemetry of the UAVobjects
* @{
* *
* @file ahrs_bl.h * @file telemetry.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief Main AHRS_BL header. * @brief Include file of the telemetry module.
* As with all modules only the initialize function is exposed all other
* interactions with the module take place through the event queue and
* objects.
* @see The GNU Public License (GPL) Version 3 * @see The GNU Public License (GPL) Version 3
* *
*****************************************************************************/ *****************************************************************************/
@ -23,31 +33,14 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef TELEMETRY_H
#define TELEMETRY_H
#ifndef INS_BL_H int32_t TelemetryInitialize(void);
#define INS_BL_H
#endif // TELEMETRY_H
/* PIOS Includes */ /**
#include <pios.h> * @}
* @}
/** Start programming */
returns: true if FLASH erased and ready to program
*/
bool StartProgramming(void);
/** Write a block to FLASH
buffer contains the data to be written
returns: true if FLASH programmed correctly
*/
bool WriteData(uint32_t offset, uint8_t *buffer, uint32_t size);
/** Read a block from FLASH
returns: true if FLASH read correctly.
Buffer is set to the read data
*/
bool ReadData(uint32_t offset, uint8_t *buffer, uint32_t size);
#endif /* AHRS_BL_H */

View File

@ -0,0 +1,371 @@
/**
******************************************************************************
* @addtogroup OpenPilotModules OpenPilot Modules
* @{
* @addtogroup TelemetryModule Telemetry Module
* @brief Main telemetry module
* Starts three tasks (RX, TX, and priority TX) that watch event queues
* and handle all the telemetry of the UAVobjects
* @{
*
* @file telemetry.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief Telemetry module, handles telemetry and UAVObject updates
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "openpilot.h"
#include "overosync.h"
#include "overosyncstats.h"
#include "systemstats.h"
// Private constants
#define OVEROSYNC_PACKET_SIZE 1024
#define MAX_QUEUE_SIZE 10
#define STACK_SIZE_BYTES 4096
#define TASK_PRIORITY (tskIDLE_PRIORITY + 0)
// Private types
// Private variables
static xQueueHandle queue;
static UAVTalkConnection uavTalkCon;
static xTaskHandle overoSyncTaskHandle;
volatile bool buffer_swap_failed;
volatile uint32_t buffer_swap_timeval;
// Private functions
static void overoSyncTask(void *parameters);
static int32_t packData(uint8_t * data, int32_t length);
static int32_t transmitData();
static void transmitDataDone(bool crc_ok, uint8_t crc_val);
static void registerObject(UAVObjHandle obj);
// External variables
extern int32_t pios_spi_overo_id;
struct dma_transaction {
uint8_t tx_buffer[OVEROSYNC_PACKET_SIZE] __attribute__ ((aligned(4)));
uint8_t rx_buffer[OVEROSYNC_PACKET_SIZE] __attribute__ ((aligned(4)));
};
struct overosync {
struct dma_transaction transactions[2];
uint32_t active_transaction_id;
uint32_t loading_transaction_id;
xSemaphoreHandle transaction_lock;
xSemaphoreHandle buffer_lock;
volatile bool transaction_done;
uint32_t sent_bytes;
uint32_t write_pointer;
uint32_t sent_objects;
uint32_t failed_objects;
uint32_t received_objects;
uint32_t framesync_error;
};
struct overosync *overosync;
static void PIOS_OVERO_IRQHandler();
static const struct pios_exti_cfg pios_exti_overo_cfg __exti_config = {
.vector = PIOS_OVERO_IRQHandler,
.line = EXTI_Line15,
.pin = {
.gpio = GPIOA,
.init = {
.GPIO_Pin = GPIO_Pin_15,
.GPIO_Speed = GPIO_Speed_100MHz,
.GPIO_Mode = GPIO_Mode_IN,
.GPIO_OType = GPIO_OType_OD,
.GPIO_PuPd = GPIO_PuPd_NOPULL,
},
},
.irq = {
.init = {
.NVIC_IRQChannel = EXTI15_10_IRQn,
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
.NVIC_IRQChannelSubPriority = 0,
.NVIC_IRQChannelCmd = ENABLE,
},
},
.exti = {
.init = {
.EXTI_Line = EXTI_Line15, // matches above GPIO pin
.EXTI_Mode = EXTI_Mode_Interrupt,
.EXTI_Trigger = EXTI_Trigger_Rising,
.EXTI_LineCmd = ENABLE,
},
},
};
/**
* On the rising edge of NSS schedule a new transaction. This cannot be
* done by the DMA complete because there is 150 us between that and the
* Overo deasserting the CS line. We don't want to spin that long in an
* isr
*/
void PIOS_OVERO_IRQHandler()
{
// transmitData must not block to get semaphore for when we get out of
// frame and transaction is still running here. -1 indicates the transaction
// semaphore is blocked and we are still in a transaction, thus a framesync
// error occurred. This shouldn't happen. Race condition?
if(transmitData() == -1)
overosync->framesync_error++;
}
/**
* Initialise the telemetry module
* \return -1 if initialisation failed
* \return 0 on success
*/
int32_t OveroSyncInitialize(void)
{
if(pios_spi_overo_id == 0)
return -1;
OveroSyncStatsInitialize();
PIOS_EXTI_Init(&pios_exti_overo_cfg);
// Create object queues
queue = xQueueCreate(MAX_QUEUE_SIZE, sizeof(UAVObjEvent));
// Initialise UAVTalk
uavTalkCon = UAVTalkInitialize(&packData);
return 0;
}
/**
* Initialise the telemetry module
* \return -1 if initialisation failed
* \return 0 on success
*/
int32_t OveroSyncStart(void)
{
if(pios_spi_overo_id == 0)
return -1;
overosync = (struct overosync *) pvPortMalloc(sizeof(*overosync));
if(overosync == NULL)
return -1;
overosync->transaction_lock = xSemaphoreCreateMutex();
if(overosync->transaction_lock == NULL)
return -1;
overosync->buffer_lock = xSemaphoreCreateMutex();
if(overosync->buffer_lock == NULL)
return -1;
overosync->active_transaction_id = 0;
overosync->loading_transaction_id = 0;
overosync->write_pointer = 0;
overosync->sent_bytes = 0;
overosync->framesync_error = 0;
// Process all registered objects and connect queue for updates
UAVObjIterate(&registerObject);
// Start telemetry tasks
xTaskCreate(overoSyncTask, (signed char *)"OveroSync", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &overoSyncTaskHandle);
TaskMonitorAdd(TASKINFO_RUNNING_OVEROSYNC, overoSyncTaskHandle);
return 0;
}
MODULE_INITCALL(OveroSyncInitialize, OveroSyncStart)
/**
* Register a new object, adds object to local list and connects the queue depending on the object's
* telemetry settings.
* \param[in] obj Object to connect
*/
static void registerObject(UAVObjHandle obj)
{
int32_t eventMask;
eventMask = EV_UPDATED | EV_UPDATED_MANUAL | EV_UPDATE_REQ;
if (UAVObjIsMetaobject(obj)) {
eventMask |= EV_UNPACKED; // we also need to act on remote updates (unpack events)
}
UAVObjConnectQueue(obj, queue, eventMask);
}
/**
* Telemetry transmit task, regular priority
*
* Logic: We need to double buffer the DMA transfers. Pack the buffer until either
* 1) it is full (and then we should record the number of missed events then)
* 2) the current transaction is done (we should immediately schedule since we are slave)
* when done packing the buffer we should call PIOS_SPI_TransferBlock, change the active buffer
* and then take the semaphrore
*/
static void overoSyncTask(void *parameters)
{
UAVObjEvent ev;
// Kick off SPI transfers (once one is completed another will automatically transmit)
overosync->transaction_done = true;
overosync->sent_objects = 0;
overosync->failed_objects = 0;
overosync->received_objects = 0;
portTickType lastUpdateTime = xTaskGetTickCount();
portTickType updateTime;
// Loop forever
while (1) {
// Wait for queue message
if (xQueueReceive(queue, &ev, portMAX_DELAY) == pdTRUE) {
// Process event. This calls transmitData
UAVTalkSendObject(uavTalkCon, ev.obj, ev.instId, false, 0);
updateTime = xTaskGetTickCount();
if(((portTickType) (updateTime - lastUpdateTime)) > 1000) {
// Update stats. This will trigger a local send event too
OveroSyncStatsData syncStats;
syncStats.Send = overosync->sent_bytes;
syncStats.Received = 0;
syncStats.Connected = syncStats.Send > 500 ? OVEROSYNCSTATS_CONNECTED_TRUE : OVEROSYNCSTATS_CONNECTED_FALSE;
syncStats.DroppedUpdates = overosync->failed_objects;
OveroSyncStatsSet(&syncStats);
overosync->failed_objects = 0;
overosync->sent_bytes = 0;
lastUpdateTime = updateTime;
}
}
}
}
static void transmitDataDone(bool crc_ok, uint8_t crc_val)
{
uint8_t *rx_buffer;
static signed portBASE_TYPE xHigherPriorityTaskWoken;
rx_buffer = overosync->transactions[overosync->active_transaction_id].rx_buffer;
// Release the semaphore and start another transaction (which grabs semaphore again but then
// returns instantly). Because this is called by the DMA ISR we need to be aware of context
// switches.
xSemaphoreGiveFromISR(overosync->transaction_lock, &xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
overosync->transaction_done = true;
// Parse the data from overo
for (uint32_t i = 0; rx_buffer[0] != 0 && i < sizeof(rx_buffer) ; i++)
UAVTalkProcessInputStream(uavTalkCon, rx_buffer[i]);
}
/**
* Transmit data buffer to the modem or USB port.
* \param[in] data Data buffer to send
* \param[in] length Length of buffer
* \return -1 on failure
* \return number of bytes transmitted on success
*/
uint32_t too_long = 0;
static int32_t packData(uint8_t * data, int32_t length)
{
uint8_t *tx_buffer;
portTickType tickTime = xTaskGetTickCount();
// Get the lock for manipulating the buffer
xSemaphoreTake(overosync->buffer_lock, portMAX_DELAY);
// Check this packet will fit
if ((overosync->write_pointer + length + sizeof(tickTime)) >
sizeof(overosync->transactions[overosync->loading_transaction_id].tx_buffer)) {
overosync->failed_objects ++;
xSemaphoreGive(overosync->buffer_lock);
return -1;
}
// Get offset into buffer and copy contents
tx_buffer = overosync->transactions[overosync->loading_transaction_id].tx_buffer +
overosync->write_pointer;
memcpy(tx_buffer, &tickTime, sizeof(tickTime));
memcpy(tx_buffer + sizeof(tickTime),data,length);
overosync->write_pointer += length + sizeof(tickTime);
overosync->sent_bytes += length;
overosync->sent_objects++;
xSemaphoreGive(overosync->buffer_lock);
// When the NSS line rises while we are packing data then a transaction doesn't start
// because that means we will be here very shortly afterwards (priority of task making that
// not always perfectly true) schedule the transaction here.
if (buffer_swap_failed && (PIOS_DELAY_DiffuS(buffer_swap_timeval) < 50)) {
buffer_swap_failed = false;
transmitData();
} else if (buffer_swap_failed) {
buffer_swap_failed = false;
too_long++;
}
return length;
}
static int32_t transmitData()
{
uint8_t *tx_buffer, *rx_buffer;
static signed portBASE_TYPE xHigherPriorityTaskWoken;
// Get this lock first so we don't swap buffers and then fail
// to start
if (xSemaphoreTake(overosync->transaction_lock, 0) == pdFALSE)
return -1;
// Get lock to manipulate buffers
if(xSemaphoreTake(overosync->buffer_lock, 0) == pdFALSE) {
xSemaphoreGiveFromISR(overosync->transaction_lock, &xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
buffer_swap_failed = true;
buffer_swap_timeval = PIOS_DELAY_GetRaw();
return -2;
}
overosync->transaction_done = false;
// Swap buffers
overosync->active_transaction_id = overosync->loading_transaction_id;
overosync->loading_transaction_id = (overosync->loading_transaction_id + 1) %
NELEMENTS(overosync->transactions);
tx_buffer = overosync->transactions[overosync->active_transaction_id].tx_buffer;
rx_buffer = overosync->transactions[overosync->active_transaction_id].rx_buffer;
// Prepare the new loading buffer
memset(overosync->transactions[overosync->loading_transaction_id].tx_buffer, 0xff,
sizeof(overosync->transactions[overosync->loading_transaction_id].tx_buffer));
overosync->write_pointer = 0;
xSemaphoreGiveFromISR(overosync->buffer_lock, &xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
return PIOS_SPI_TransferBlock(pios_spi_overo_id, (uint8_t *) tx_buffer, (uint8_t *) rx_buffer, sizeof(overosync->transactions[overosync->active_transaction_id].tx_buffer), &transmitDataDone) == 0 ? 0 : -3;
}
/**
* @}
* @}
*/

View File

@ -147,7 +147,6 @@ int32_t mag_test;
uint32_t sensor_dt_us; uint32_t sensor_dt_us;
static void SensorsTask(void *parameters) static void SensorsTask(void *parameters)
{ {
uint8_t init = 0;
portTickType lastSysTime; portTickType lastSysTime;
uint32_t accel_samples; uint32_t accel_samples;
uint32_t gyro_samples; uint32_t gyro_samples;
@ -192,6 +191,7 @@ static void SensorsTask(void *parameters)
// Main task loop // Main task loop
lastSysTime = xTaskGetTickCount(); lastSysTime = xTaskGetTickCount();
bool error = false; bool error = false;
uint32_t mag_update_time = PIOS_DELAY_GetRaw();
while (1) { while (1) {
// TODO: add timeouts to the sensor reads and set an error if the fail // TODO: add timeouts to the sensor reads and set an error if the fail
sensor_dt_us = PIOS_DELAY_DiffuS(timeval); sensor_dt_us = PIOS_DELAY_DiffuS(timeval);
@ -347,7 +347,8 @@ static void SensorsTask(void *parameters)
// and make it average zero (weakly) // and make it average zero (weakly)
MagnetometerData mag; MagnetometerData mag;
bool mag_updated = false; bool mag_updated = false;
if (PIOS_HMC5883_NewDataAvailable()) {
if (PIOS_HMC5883_NewDataAvailable() || PIOS_DELAY_DiffuS(mag_update_time) > 150000) {
mag_updated = true; mag_updated = true;
int16_t values[3]; int16_t values[3];
PIOS_HMC5883_ReadMag(values); PIOS_HMC5883_ReadMag(values);
@ -355,6 +356,7 @@ static void SensorsTask(void *parameters)
mag.y = values[0] * mag_scale[1] - mag_bias[1]; mag.y = values[0] * mag_scale[1] - mag_bias[1];
mag.z = -values[2] * mag_scale[2] - mag_bias[2]; mag.z = -values[2] * mag_scale[2] - mag_bias[2];
MagnetometerSet(&mag); MagnetometerSet(&mag);
mag_update_time = PIOS_DELAY_GetRaw();
} }
// For debugging purposes here we can output all of the sensors. Do it as a single transaction // For debugging purposes here we can output all of the sensors. Do it as a single transaction

View File

@ -461,7 +461,7 @@ static void SettingsUpdatedCb(UAVObjEvent * ev)
if(settings.GyroTau < 0.0001) if(settings.GyroTau < 0.0001)
gyro_alpha = 0; // not trusting this to resolve to 0 gyro_alpha = 0; // not trusting this to resolve to 0
else else
gyro_alpha = exp(-fakeDt / settings.GyroTau); gyro_alpha = expf(-fakeDt / settings.GyroTau);
} }

View File

@ -30,7 +30,7 @@
#ifndef STM3210E_INS_H_ #ifndef STM3210E_INS_H_
#define STM3210E_INS_H_ #define STM3210E_INS_H_
#include <stdbool.h>
//------------------------ //------------------------
// Timers and Channels Used // Timers and Channels Used
@ -68,8 +68,8 @@ TIM8 | | | |
//------------------------ //------------------------
// BOOTLOADER_SETTINGS // BOOTLOADER_SETTINGS
//------------------------ //------------------------
#define BOARD_READABLE TRUE #define BOARD_READABLE true
#define BOARD_WRITABLE TRUE #define BOARD_WRITABLE true
#define MAX_DEL_RETRYS 3 #define MAX_DEL_RETRYS 3

View File

@ -39,22 +39,97 @@ static GCSReceiverData gcsreceiverdata;
/* Provide a RCVR driver */ /* Provide a RCVR driver */
static int32_t PIOS_GCSRCVR_Get(uint32_t rcvr_id, uint8_t channel); static int32_t PIOS_GCSRCVR_Get(uint32_t rcvr_id, uint8_t channel);
static void PIOS_gcsrcvr_Supervisor(uint32_t ppm_id);
const struct pios_rcvr_driver pios_gcsrcvr_rcvr_driver = { const struct pios_rcvr_driver pios_gcsrcvr_rcvr_driver = {
.read = PIOS_GCSRCVR_Get, .read = PIOS_GCSRCVR_Get,
}; };
/* Local Variables */
enum pios_gcsrcvr_dev_magic {
PIOS_GCSRCVR_DEV_MAGIC = 0xe9da5c56,
};
struct pios_gcsrcvr_dev {
enum pios_gcsrcvr_dev_magic magic;
uint8_t supv_timer;
bool Fresh;
};
static struct pios_gcsrcvr_dev *global_gcsrcvr_dev;
static bool PIOS_gcsrcvr_validate(struct pios_gcsrcvr_dev *gcsrcvr_dev)
{
return (gcsrcvr_dev->magic == PIOS_GCSRCVR_DEV_MAGIC);
}
#if defined(PIOS_INCLUDE_FREERTOS)
static struct pios_gcsrcvr_dev *PIOS_gcsrcvr_alloc(void)
{
struct pios_gcsrcvr_dev * gcsrcvr_dev;
gcsrcvr_dev = (struct pios_gcsrcvr_dev *)pvPortMalloc(sizeof(*gcsrcvr_dev));
if (!gcsrcvr_dev) return(NULL);
gcsrcvr_dev->magic = PIOS_GCSRCVR_DEV_MAGIC;
gcsrcvr_dev->Fresh = FALSE;
gcsrcvr_dev->supv_timer = 0;
/* The update callback cannot receive the device pointer, so set it in a global */
global_gcsrcvr_dev = gcsrcvr_dev;
return(gcsrcvr_dev);
}
#else
static struct pios_gcsrcvr_dev pios_gcsrcvr_devs[PIOS_GCSRCVR_MAX_DEVS];
static uint8_t pios_gcsrcvr_num_devs;
static struct pios_gcsrcvr_dev *PIOS_gcsrcvr_alloc(void)
{
struct pios_gcsrcvr_dev *gcsrcvr_dev;
if (pios_gcsrcvr_num_devs >= PIOS_GCSRCVR_MAX_DEVS) {
return (NULL);
}
gcsrcvr_dev = &pios_gcsrcvr_devs[pios_gcsrcvr_num_devs++];
gcsrcvr_dev->magic = PIOS_GCSRCVR_DEV_MAGIC;
gcsrcvr_dev->Fresh = FALSE;
gcsrcvr_dev->supv_timer = 0;
global_gcsrcvr_dev = gcsrcvr_dev;
return (gcsrcvr_dev);
}
#endif
static void gcsreceiver_updated(UAVObjEvent * ev) static void gcsreceiver_updated(UAVObjEvent * ev)
{ {
struct pios_gcsrcvr_dev *gcsrcvr_dev = global_gcsrcvr_dev;
if (ev->obj == GCSReceiverHandle()) { if (ev->obj == GCSReceiverHandle()) {
GCSReceiverGet(&gcsreceiverdata); GCSReceiverGet(&gcsreceiverdata);
gcsrcvr_dev->Fresh = TRUE;
} }
} }
void PIOS_GCSRCVR_Init(void) extern int32_t PIOS_GCSRCVR_Init(uint32_t *gcsrcvr_id)
{ {
struct pios_gcsrcvr_dev *gcsrcvr_dev;
/* Allocate the device structure */
gcsrcvr_dev = (struct pios_gcsrcvr_dev *)PIOS_gcsrcvr_alloc();
if (!gcsrcvr_dev)
return -1;
/* Register uavobj callback */ /* Register uavobj callback */
GCSReceiverConnectCallback (gcsreceiver_updated); GCSReceiverConnectCallback (gcsreceiver_updated);
/* Register the failsafe timer callback. */
if (!PIOS_RTC_RegisterTickCallback(PIOS_gcsrcvr_Supervisor, (uint32_t)gcsrcvr_dev)) {
PIOS_DEBUG_Assert(0);
}
return 0;
} }
static int32_t PIOS_GCSRCVR_Get(uint32_t rcvr_id, uint8_t channel) static int32_t PIOS_GCSRCVR_Get(uint32_t rcvr_id, uint8_t channel)
@ -67,6 +142,31 @@ static int32_t PIOS_GCSRCVR_Get(uint32_t rcvr_id, uint8_t channel)
return (gcsreceiverdata.Channel[channel]); return (gcsreceiverdata.Channel[channel]);
} }
static void PIOS_gcsrcvr_Supervisor(uint32_t gcsrcvr_id) {
/* Recover our device context */
struct pios_gcsrcvr_dev * gcsrcvr_dev = (struct pios_gcsrcvr_dev *)gcsrcvr_id;
if (!PIOS_gcsrcvr_validate(gcsrcvr_dev)) {
/* Invalid device specified */
return;
}
/*
* RTC runs at 625Hz so divide down the base rate so
* that this loop runs at 25Hz.
*/
if(++(gcsrcvr_dev->supv_timer) < 25) {
return;
}
gcsrcvr_dev->supv_timer = 0;
if (!gcsrcvr_dev->Fresh)
for (int32_t i = 0; i < GCSRECEIVER_CHANNEL_NUMELEM; i++)
gcsreceiverdata.Channel[i] = PIOS_RCVR_TIMEOUT;
gcsrcvr_dev->Fresh = FALSE;
}
#endif /* PIOS_INCLUDE_GCSRCVR */ #endif /* PIOS_INCLUDE_GCSRCVR */
/** /**

View File

@ -43,12 +43,10 @@ ConversionTypeTypeDef CurrentRead;
MS5611CalibDataTypeDef CalibData; MS5611CalibDataTypeDef CalibData;
/* Straight from the datasheet */ /* Straight from the datasheet */
static int32_t X1, X2, X3, B3, B5, B6, P; static uint32_t RawTemperature;
static uint32_t B4, B7; static uint32_t RawPressure;
static volatile int32_t RawTemperature; static int64_t Pressure;
static volatile int32_t RawPressure; static int64_t Temperature;
static volatile float Pressure;
static volatile float Temperature;
static int32_t PIOS_MS5611_Read(uint8_t address, uint8_t * buffer, uint8_t len); static int32_t PIOS_MS5611_Read(uint8_t address, uint8_t * buffer, uint8_t len);
static int32_t PIOS_MS5611_WriteCommand(uint8_t command); static int32_t PIOS_MS5611_WriteCommand(uint8_t command);
@ -58,9 +56,11 @@ static uint32_t oversampling;
static const struct pios_ms5611_cfg * dev_cfg; static const struct pios_ms5611_cfg * dev_cfg;
static int32_t i2c_id; static int32_t i2c_id;
static enum pios_ms5611_osr osr = MS5611_OSR_256;
/** /**
* Initialise the BMP085 sensor * Initialise the MS5611 sensor
*/ */
int32_t ms5611_read_flag; int32_t ms5611_read_flag;
void PIOS_MS5611_Init(const struct pios_ms5611_cfg * cfg, int32_t i2c_device) void PIOS_MS5611_Init(const struct pios_ms5611_cfg * cfg, int32_t i2c_device)
{ {
@ -90,10 +90,10 @@ int32_t PIOS_MS5611_StartADC(ConversionTypeTypeDef Type)
{ {
/* Start the conversion */ /* Start the conversion */
if (Type == TemperatureConv) { if (Type == TemperatureConv) {
while (PIOS_MS5611_WriteCommand(MS5611_TEMP_ADDR) != 0) while (PIOS_MS5611_WriteCommand(MS5611_TEMP_ADDR + osr) != 0)
continue; continue;
} else if (Type == PressureConv) { } else if (Type == PressureConv) {
while (PIOS_MS5611_WriteCommand(MS5611_PRES_ADDR) != 0) while (PIOS_MS5611_WriteCommand(MS5611_PRES_ADDR + osr) != 0)
continue; continue;
} }
@ -102,6 +102,26 @@ int32_t PIOS_MS5611_StartADC(ConversionTypeTypeDef Type)
return 0; return 0;
} }
/**
* @brief Return the delay for the current osr
*/
int32_t PIOS_MS5611_GetDelay() {
switch(osr) {
case MS5611_OSR_256:
return 2;
case MS5611_OSR_512:
return 2;
case MS5611_OSR_1024:
return 3;
case MS5611_OSR_2048:
return 5;
case MS5611_OSR_4096:
return 10;
default:
break;
}
return 10;
}
/** /**
* Read the ADC conversion value (once ADC conversion has completed) * Read the ADC conversion value (once ADC conversion has completed)
* \param[in] PresOrTemp BMP085_PRES_ADDR or BMP085_TEMP_ADDR * \param[in] PresOrTemp BMP085_PRES_ADDR or BMP085_TEMP_ADDR
@ -114,7 +134,8 @@ int32_t PIOS_MS5611_ReadADC(void)
Data[1] = 0; Data[1] = 0;
Data[2] = 0; Data[2] = 0;
static float dT; static int64_t deltaTemp;
/* Read and store the 16bit result */ /* Read and store the 16bit result */
if (CurrentRead == TemperatureConv) { if (CurrentRead == TemperatureConv) {
/* Read the temperature conversion */ /* Read the temperature conversion */
@ -123,24 +144,23 @@ int32_t PIOS_MS5611_ReadADC(void)
RawTemperature = (Data[0] << 16) | (Data[1] << 8) | Data[2]; RawTemperature = (Data[0] << 16) | (Data[1] << 8) | Data[2];
dT = RawTemperature - CalibData.C[4] * (1 << 8); deltaTemp = RawTemperature - (CalibData.C[4] << 8);
Temperature = 2000 + dT * CalibData.C[5] / (1<<23); Temperature = 2000l + ((deltaTemp * CalibData.C[5]) >> 23);
Temperature /= 100.0f;
} else { } else {
float Offset; int64_t Offset;
float Sens; int64_t Sens;
/* Read the pressure conversion */ /* Read the pressure conversion */
if (PIOS_MS5611_Read(MS5611_ADC_READ, Data, 3) != 0) if (PIOS_MS5611_Read(MS5611_ADC_READ, Data, 3) != 0)
return -1; return -1;
RawPressure = ((Data[0] << 16) | (Data[1] << 8) | Data[2]); RawPressure = ((Data[0] << 16) | (Data[1] << 8) | Data[2]);
Offset = (float) CalibData.C[1] * (1<<16) +(float) CalibData.C[3] * (float) dT / (1<<7); Offset = (((int64_t) CalibData.C[1]) << 16) + ((((int64_t) CalibData.C[3]) * deltaTemp) >> 7);
Sens = (float) CalibData.C[0] * (1<<15) + ((float) CalibData.C[2] * (float) dT) / (1<<8); Sens = ((int64_t) CalibData.C[0]) << 15;
Sens = Sens + ((((int64_t) CalibData.C[2]) * deltaTemp) >> 8);
Pressure = (RawPressure * Sens / (1<<21) - Offset) / (1<<15); Pressure = (((((int64_t) RawPressure) * Sens) >> 21) - Offset) >> 15;
Pressure /= 1000.0f;
} }
return 0; return 0;
} }
@ -150,7 +170,7 @@ int32_t PIOS_MS5611_ReadADC(void)
*/ */
float PIOS_MS5611_GetTemperature(void) float PIOS_MS5611_GetTemperature(void)
{ {
return Temperature; return ((float) Temperature) / 100.0f;
} }
/** /**
@ -158,7 +178,7 @@ float PIOS_MS5611_GetTemperature(void)
*/ */
float PIOS_MS5611_GetPressure(void) float PIOS_MS5611_GetPressure(void)
{ {
return Pressure; return ((float) Pressure) / 1000.0f;
} }
/** /**

View File

@ -250,7 +250,7 @@ int32_t PIOS_USB_DESC_HID_CDC_Init(void)
PIOS_USBHOOK_RegisterDevice((uint8_t *)&device_desc, sizeof(device_desc)); PIOS_USBHOOK_RegisterDevice((uint8_t *)&device_desc, sizeof(device_desc));
PIOS_USB_HID_RegisterHidInterface((uint8_t *)&(config_hid_cdc.hid_if), sizeof(config_hid_cdc.hid_if)); PIOS_USB_HID_RegisterHidDescriptor((uint8_t *)&(config_hid_cdc.hid), sizeof(config_hid_cdc.hid));
PIOS_USB_HID_RegisterHidReport((uint8_t *)hid_report_desc, sizeof(hid_report_desc)); PIOS_USB_HID_RegisterHidReport((uint8_t *)hid_report_desc, sizeof(hid_report_desc));
return 0; return 0;

View File

@ -158,7 +158,7 @@ int32_t PIOS_USB_DESC_HID_ONLY_Init(void)
PIOS_USBHOOK_RegisterDevice((uint8_t *)&device_desc, sizeof(device_desc)); PIOS_USBHOOK_RegisterDevice((uint8_t *)&device_desc, sizeof(device_desc));
PIOS_USB_HID_RegisterHidInterface((uint8_t *)&(config_hid_only.hid_if), sizeof(config_hid_only.hid_if)); PIOS_USB_HID_RegisterHidDescriptor((uint8_t *)&(config_hid_only.hid), sizeof(config_hid_only.hid));
PIOS_USB_HID_RegisterHidReport((uint8_t *)hid_report_desc, sizeof(hid_report_desc)); PIOS_USB_HID_RegisterHidReport((uint8_t *)hid_report_desc, sizeof(hid_report_desc));
return 0; return 0;

View File

@ -65,12 +65,12 @@ void PIOS_USBHOOK_RegisterString(enum usb_string_desc string_id, const uint8_t *
} }
} }
static ONE_DESCRIPTOR Hid_Interface_Descriptor; static ONE_DESCRIPTOR Hid_Descriptor;
void PIOS_USB_HID_RegisterHidInterface(const uint8_t * desc, uint16_t desc_size) void PIOS_USB_HID_RegisterHidDescriptor(const uint8_t * desc, uint16_t desc_size)
{ {
Hid_Interface_Descriptor.Descriptor = desc; Hid_Descriptor.Descriptor = desc;
Hid_Interface_Descriptor.Descriptor_Size = desc_size; Hid_Descriptor.Descriptor_Size = desc_size;
} }
static ONE_DESCRIPTOR Hid_Report_Descriptor; static ONE_DESCRIPTOR Hid_Report_Descriptor;
@ -468,7 +468,7 @@ static const uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length)
*******************************************************************************/ *******************************************************************************/
static const uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length) static const uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length)
{ {
return Standard_GetDescriptorData(Length, &Hid_Interface_Descriptor); return Standard_GetDescriptorData(Length, &Hid_Descriptor);
} }
/******************************************************************************* /*******************************************************************************

View File

@ -670,8 +670,6 @@ static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum)
len32b = (len + 3) / 4; len32b = (len + 3) / 4;
txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS); txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS);
while (txstatus.b.txfspcavail > len32b && while (txstatus.b.txfspcavail > len32b &&
ep->xfer_count < ep->xfer_len && ep->xfer_count < ep->xfer_len &&
ep->xfer_len != 0) ep->xfer_len != 0)
@ -693,6 +691,13 @@ static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum)
txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS); txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS);
} }
if (ep->xfer_count == ep->xfer_len || ep->xfer_len == 0) {
/* Turn off the Fifo Empty Interrupt */
uint32_t fifoemptymsk;
fifoemptymsk = 0x1 << epnum;
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
}
return 1; return 1;
} }

View File

@ -33,6 +33,7 @@
#if defined(PIOS_INCLUDE_BL_HELPER) #if defined(PIOS_INCLUDE_BL_HELPER)
#include <pios_board_info.h> #include <pios_board_info.h>
#include "stm32f4xx_flash.h" #include "stm32f4xx_flash.h"
#include <stdbool.h>
uint8_t *PIOS_BL_HELPER_FLASH_If_Read(uint32_t SectorAddress) uint8_t *PIOS_BL_HELPER_FLASH_If_Read(uint32_t SectorAddress)
{ {
@ -43,34 +44,127 @@ uint8_t *PIOS_BL_HELPER_FLASH_If_Read(uint32_t SectorAddress)
uint8_t PIOS_BL_HELPER_FLASH_Ini() uint8_t PIOS_BL_HELPER_FLASH_Ini()
{ {
FLASH_Unlock(); FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
return 1; return 1;
} }
struct device_flash_sector {
uint32_t start;
uint32_t size;
uint16_t st_sector;
};
static struct device_flash_sector flash_sectors[] = {
[0] = {
.start = 0x08000000,
.size = 16 * 1024,
.st_sector = FLASH_Sector_0,
},
[1] = {
.start = 0x08004000,
.size = 16 * 1024,
.st_sector = FLASH_Sector_1,
},
[2] = {
.start = 0x08008000,
.size = 16 * 1024,
.st_sector = FLASH_Sector_2,
},
[3] = {
.start = 0x0800C000,
.size = 16 * 1024,
.st_sector = FLASH_Sector_3,
},
[4] = {
.start = 0x08010000,
.size = 64 * 1024,
.st_sector = FLASH_Sector_4,
},
[5] = {
.start = 0x08020000,
.size = 128 * 1024,
.st_sector = FLASH_Sector_5,
},
[6] = {
.start = 0x08040000,
.size = 128 * 1024,
.st_sector = FLASH_Sector_6,
},
[7] = {
.start = 0x08060000,
.size = 128 * 1024,
.st_sector = FLASH_Sector_7,
},
[8] = {
.start = 0x08080000,
.size = 128 * 1024,
.st_sector = FLASH_Sector_8,
},
[9] = {
.start = 0x080A0000,
.size = 128 * 1024,
.st_sector = FLASH_Sector_9,
},
[10] = {
.start = 0x080C0000,
.size = 128 * 1024,
.st_sector = FLASH_Sector_10,
},
[11] = {
.start = 0x080E0000,
.size = 128 * 1024,
.st_sector = FLASH_Sector_11,
},
};
static bool PIOS_BL_HELPER_FLASH_GetSectorInfo(uint32_t address, uint8_t * sector_number, uint32_t *sector_start, uint32_t *sector_size)
{
for (uint8_t i = 0; i < NELEMENTS(flash_sectors); i++) {
struct device_flash_sector * sector = &flash_sectors[i];
if ((address >= sector->start) &&
(address < (sector->start + sector->size))) {
/* address lies within this sector */
*sector_number = sector->st_sector;
*sector_start = sector->start;
*sector_size = sector->size;
return (true);
}
}
return (false);
}
uint8_t PIOS_BL_HELPER_FLASH_Start() uint8_t PIOS_BL_HELPER_FLASH_Start()
{ {
const struct pios_board_info * bdinfo = &pios_board_info_blob; const struct pios_board_info * bdinfo = &pios_board_info_blob;
uint32_t pageAdress = bdinfo->fw_base; uint32_t pageAddress = bdinfo->fw_base;
uint8_t fail = FALSE; bool fail = false;
while ((pageAdress < (bdinfo->fw_base + bdinfo->fw_size + bdinfo->desc_size)) while ((pageAddress < (bdinfo->fw_base + bdinfo->fw_size + bdinfo->desc_size))
|| (fail == TRUE)) { && (fail == false)) {
uint8_t sector_number;
uint32_t sector_start;
uint32_t sector_size;
if (!PIOS_BL_HELPER_FLASH_GetSectorInfo(pageAddress,
&sector_number,
&sector_start,
&sector_size)) {
/* We're asking for an invalid flash address */
PIOS_Assert(0);
}
for (int retry = 0; retry < MAX_DEL_RETRYS; ++retry) { for (int retry = 0; retry < MAX_DEL_RETRYS; ++retry) {
if (FLASH_ErasePage(pageAdress) == FLASH_COMPLETE) { if (FLASH_EraseSector(sector_number, VoltageRange_2) == FLASH_COMPLETE) {
fail = FALSE; fail = false;
break; break;
} else { } else {
fail = TRUE; fail = true;
} }
} }
/* Move to the next sector */
#ifdef STM32F10X_HD pageAddress += sector_size;
pageAdress += 2048;
#elif defined (STM32F10X_MD)
pageAdress += 1024;
#endif
} }
return (fail == TRUE) ? 0 : 1; return (fail == true) ? 0 : 1;
} }
#endif #endif

View File

@ -68,19 +68,17 @@
*/ */
void PIOS_IAP_Init( void ) void PIOS_IAP_Init( void )
{ {
#if 0
/* Enable CRC clock */ /* Enable CRC clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
/* Enable PWR and BKP clock */ /* Enable PWR and BKP clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_AHB1Periph_BKPSRAM, ENABLE);
/* Enable write access to Backup domain */ /* Enable write access to Backup domain */
PWR_BackupAccessCmd(ENABLE); PWR_BackupAccessCmd(ENABLE);
/* Clear Tamper pin Event(TE) pending flag */ /* Clear Tamper pin Event(TE) pending flag */
RTC_ClearFlag(); RTC_ClearFlag(RTC_FLAG_TAMP1F);
#endif
} }
/*! /*!
@ -93,8 +91,7 @@ void PIOS_IAP_Init( void )
*/ */
uint32_t PIOS_IAP_CheckRequest( void ) uint32_t PIOS_IAP_CheckRequest( void )
{ {
#if 0 uint32_t retval = false;
uint32_t retval = FALSE;
uint16_t reg1; uint16_t reg1;
uint16_t reg2; uint16_t reg2;
@ -103,13 +100,11 @@ uint32_t PIOS_IAP_CheckRequest( void )
if( reg1 == IAP_MAGIC_WORD_1 && reg2 == IAP_MAGIC_WORD_2 ) { if( reg1 == IAP_MAGIC_WORD_1 && reg2 == IAP_MAGIC_WORD_2 ) {
// We have a match. // We have a match.
retval = TRUE; retval = true;
} else { } else {
retval = FALSE; retval = false;
} }
return retval; return retval;
#endif
return 0;
} }
@ -122,24 +117,18 @@ uint32_t PIOS_IAP_CheckRequest( void )
*/ */
void PIOS_IAP_SetRequest1(void) void PIOS_IAP_SetRequest1(void)
{ {
#if 0
RTC_WriteBackupRegister( MAGIC_REG_1, IAP_MAGIC_WORD_1); RTC_WriteBackupRegister( MAGIC_REG_1, IAP_MAGIC_WORD_1);
#endif
} }
void PIOS_IAP_SetRequest2(void) void PIOS_IAP_SetRequest2(void)
{ {
#if 0
RTC_WriteBackupRegister( MAGIC_REG_2, IAP_MAGIC_WORD_2); RTC_WriteBackupRegister( MAGIC_REG_2, IAP_MAGIC_WORD_2);
#endif
} }
void PIOS_IAP_ClearRequest(void) void PIOS_IAP_ClearRequest(void)
{ {
#if 0
RTC_WriteBackupRegister( MAGIC_REG_1, 0); RTC_WriteBackupRegister( MAGIC_REG_1, 0);
RTC_WriteBackupRegister( MAGIC_REG_2, 0); RTC_WriteBackupRegister( MAGIC_REG_2, 0);
#endif
} }
uint16_t PIOS_IAP_ReadBootCount(void) uint16_t PIOS_IAP_ReadBootCount(void)

View File

@ -117,6 +117,7 @@ int32_t PIOS_SPI_Init(uint32_t * spi_id, const struct pios_spi_cfg * cfg)
/* only legal for single-slave config */ /* only legal for single-slave config */
PIOS_Assert(spi_dev->cfg->slave_count == 1); PIOS_Assert(spi_dev->cfg->slave_count == 1);
init_ssel = 1; init_ssel = 1;
SPI_SSOutputCmd(spi_dev->cfg->regs, (spi_dev->cfg->init.SPI_Mode == SPI_Mode_Master) ? ENABLE : DISABLE);
/* FIXME: Should this also call SPI_SSOutputCmd()? */ /* FIXME: Should this also call SPI_SSOutputCmd()? */
break; break;
@ -145,22 +146,28 @@ int32_t PIOS_SPI_Init(uint32_t * spi_id, const struct pios_spi_cfg * cfg)
GPIO_Init(spi_dev->cfg->sclk.gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->sclk.init)); GPIO_Init(spi_dev->cfg->sclk.gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->sclk.init));
GPIO_Init(spi_dev->cfg->mosi.gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->mosi.init)); GPIO_Init(spi_dev->cfg->mosi.gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->mosi.init));
GPIO_Init(spi_dev->cfg->miso.gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->miso.init)); GPIO_Init(spi_dev->cfg->miso.gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->miso.init));
for (uint32_t i = 0; i < init_ssel; i++) {
/* Since we're driving the SSEL pin in software, ensure that the slave is deselected */ if(spi_dev->cfg->init.SPI_NSS != SPI_NSS_Hard) {
/* XXX multi-slave support - maybe have another SPI_NSS_ mode? */ for (uint32_t i = 0; i < init_ssel; i++) {
GPIO_SetBits(spi_dev->cfg->ssel[i].gpio, spi_dev->cfg->ssel[i].init.GPIO_Pin); /* Since we're driving the SSEL pin in software, ensure that the slave is deselected */
GPIO_Init(spi_dev->cfg->ssel[i].gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->ssel[i].init)); /* XXX multi-slave support - maybe have another SPI_NSS_ mode? */
GPIO_SetBits(spi_dev->cfg->ssel[i].gpio, spi_dev->cfg->ssel[i].init.GPIO_Pin);
GPIO_Init(spi_dev->cfg->ssel[i].gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->ssel[i].init));
}
} }
/* Configure DMA for SPI Rx */ /* Configure DMA for SPI Rx */
DMA_DeInit(spi_dev->cfg->dma.rx.channel);
DMA_Cmd(spi_dev->cfg->dma.rx.channel, DISABLE); DMA_Cmd(spi_dev->cfg->dma.rx.channel, DISABLE);
DMA_Init(spi_dev->cfg->dma.rx.channel, (DMA_InitTypeDef*)&(spi_dev->cfg->dma.rx.init)); DMA_Init(spi_dev->cfg->dma.rx.channel, (DMA_InitTypeDef*)&(spi_dev->cfg->dma.rx.init));
/* Configure DMA for SPI Tx */ /* Configure DMA for SPI Tx */
DMA_DeInit(spi_dev->cfg->dma.tx.channel);
DMA_Cmd(spi_dev->cfg->dma.tx.channel, DISABLE); DMA_Cmd(spi_dev->cfg->dma.tx.channel, DISABLE);
DMA_Init(spi_dev->cfg->dma.tx.channel, (DMA_InitTypeDef*)&(spi_dev->cfg->dma.tx.init)); DMA_Init(spi_dev->cfg->dma.tx.channel, (DMA_InitTypeDef*)&(spi_dev->cfg->dma.tx.init));
/* Initialize the SPI block */ /* Initialize the SPI block */
SPI_DeInit(spi_dev->cfg->regs);
SPI_Init(spi_dev->cfg->regs, (SPI_InitTypeDef*)&(spi_dev->cfg->init)); SPI_Init(spi_dev->cfg->regs, (SPI_InitTypeDef*)&(spi_dev->cfg->init));
/* Configure CRC calculation */ /* Configure CRC calculation */
@ -181,7 +188,6 @@ int32_t PIOS_SPI_Init(uint32_t * spi_id, const struct pios_spi_cfg * cfg)
/* Configure DMA interrupt */ /* Configure DMA interrupt */
NVIC_Init((NVIC_InitTypeDef*)&(spi_dev->cfg->dma.irq.init)); NVIC_Init((NVIC_InitTypeDef*)&(spi_dev->cfg->dma.irq.init));
DMA_ITConfig(spi_dev->cfg->dma.tx.channel, spi_dev->cfg->dma.irq.flags, ENABLE); /* XXX is this correct? */
return(0); return(0);
@ -389,7 +395,19 @@ static int32_t SPI_DMA_TransferBlock(uint32_t spi_id, const uint8_t *send_buffer
while(DMA_GetCmdStatus(spi_dev->cfg->dma.tx.channel) == ENABLE); while(DMA_GetCmdStatus(spi_dev->cfg->dma.tx.channel) == ENABLE);
/* Disable the SPI peripheral */ /* Disable the SPI peripheral */
/* Initialize the SPI block */
SPI_DeInit(spi_dev->cfg->regs);
SPI_Init(spi_dev->cfg->regs, (SPI_InitTypeDef*)&(spi_dev->cfg->init));
SPI_Cmd(spi_dev->cfg->regs, DISABLE); SPI_Cmd(spi_dev->cfg->regs, DISABLE);
/* Configure CRC calculation */
if (spi_dev->cfg->use_crc) {
SPI_CalculateCRC(spi_dev->cfg->regs, ENABLE);
} else {
SPI_CalculateCRC(spi_dev->cfg->regs, DISABLE);
}
/* Enable SPI interrupts to DMA */
SPI_I2S_DMACmd(spi_dev->cfg->regs, SPI_I2S_DMAReq_Tx | SPI_I2S_DMAReq_Rx, ENABLE);
/* Set callback function */ /* Set callback function */
spi_dev->callback = callback; spi_dev->callback = callback;
@ -400,7 +418,7 @@ static int32_t SPI_DMA_TransferBlock(uint32_t spi_id, const uint8_t *send_buffer
/* Start with the default configuration for this peripheral */ /* Start with the default configuration for this peripheral */
dma_init = spi_dev->cfg->dma.rx.init; dma_init = spi_dev->cfg->dma.rx.init;
DMA_DeInit(spi_dev->cfg->dma.rx.channel);
if (receive_buffer != NULL) { if (receive_buffer != NULL) {
/* Enable memory addr. increment - bytes written into receive buffer */ /* Enable memory addr. increment - bytes written into receive buffer */
dma_init.DMA_Memory0BaseAddr = (uint32_t) receive_buffer; dma_init.DMA_Memory0BaseAddr = (uint32_t) receive_buffer;
@ -425,7 +443,7 @@ static int32_t SPI_DMA_TransferBlock(uint32_t spi_id, const uint8_t *send_buffer
/* Start with the default configuration for this peripheral */ /* Start with the default configuration for this peripheral */
dma_init = spi_dev->cfg->dma.tx.init; dma_init = spi_dev->cfg->dma.tx.init;
DMA_DeInit(spi_dev->cfg->dma.tx.channel);
if (send_buffer != NULL) { if (send_buffer != NULL) {
/* Enable memory addr. increment - bytes written into receive buffer */ /* Enable memory addr. increment - bytes written into receive buffer */
dma_init.DMA_Memory0BaseAddr = (uint32_t) send_buffer; dma_init.DMA_Memory0BaseAddr = (uint32_t) send_buffer;
@ -613,7 +631,6 @@ void PIOS_SPI_SetPrescalar(uint32_t spi_id, uint32_t prescaler)
spi_dev->cfg->regs->CR1 = (spi_dev->cfg->regs->CR1 & ~0x0038) | prescaler; spi_dev->cfg->regs->CR1 = (spi_dev->cfg->regs->CR1 & ~0x0038) | prescaler;
} }
void PIOS_SPI_IRQ_Handler(uint32_t spi_id) void PIOS_SPI_IRQ_Handler(uint32_t spi_id)
{ {
struct pios_spi_dev * spi_dev = (struct pios_spi_dev *)spi_id; struct pios_spi_dev * spi_dev = (struct pios_spi_dev *)spi_id;
@ -624,11 +641,13 @@ void PIOS_SPI_IRQ_Handler(uint32_t spi_id)
// FIXME XXX Only RX channel or better clear flags for both channels? // FIXME XXX Only RX channel or better clear flags for both channels?
DMA_ClearFlag(spi_dev->cfg->dma.rx.channel, spi_dev->cfg->dma.irq.flags); DMA_ClearFlag(spi_dev->cfg->dma.rx.channel, spi_dev->cfg->dma.irq.flags);
/* Wait for the final bytes of the transfer to complete, including CRC byte(s). */ if(spi_dev->cfg->init.SPI_Mode == SPI_Mode_Master) {
while (!(SPI_I2S_GetFlagStatus(spi_dev->cfg->regs, SPI_I2S_FLAG_TXE))) ; /* Wait for the final bytes of the transfer to complete, including CRC byte(s). */
while (!(SPI_I2S_GetFlagStatus(spi_dev->cfg->regs, SPI_I2S_FLAG_TXE))) ;
/* Wait for the final bytes of the transfer to complete, including CRC byte(s). */ /* Wait for the final bytes of the transfer to complete, including CRC byte(s). */
while (SPI_I2S_GetFlagStatus(spi_dev->cfg->regs, SPI_I2S_FLAG_BSY)) ; while (SPI_I2S_GetFlagStatus(spi_dev->cfg->regs, SPI_I2S_FLAG_BSY)) ;
}
if (spi_dev->callback != NULL) { if (spi_dev->callback != NULL) {
bool crc_ok = true; bool crc_ok = true;

View File

@ -193,27 +193,6 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
/* Configure USB D-/D+ (DM/DP) pins */ /* Configure USB D-/D+ (DM/DP) pins */
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
#define FORCE_USB_DP_DM_LOW 1
#if FORCE_USB_DP_DM_LOW
/* Force D-/D+ low for 50ms to trigger a disconnect */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, 0);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, 0);
GPIO_ResetBits(GPIOA, GPIO_Pin_12);
GPIO_ResetBits(GPIOA, GPIO_Pin_11);
PIOS_DELAY_WaitmS(50);
#endif
/* Set up D-/D+ as USB function again */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

View File

@ -40,6 +40,7 @@
#include "pios_usbhook.h" /* PIOS_USBHOOK_* */ #include "pios_usbhook.h" /* PIOS_USBHOOK_* */
#define MIN(x,y) (((x) < (y)) ? (x) : (y)) #define MIN(x,y) (((x) < (y)) ? (x) : (y))
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbhid_id, pios_com_callback tx_out_cb, uint32_t context); static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbhid_id, pios_com_callback tx_out_cb, uint32_t context);
static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callback rx_in_cb, uint32_t context); static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callback rx_in_cb, uint32_t context);
@ -68,8 +69,13 @@ struct pios_usb_hid_dev {
pios_com_callback tx_out_cb; pios_com_callback tx_out_cb;
uint32_t tx_out_context; uint32_t tx_out_context;
bool usb_if_enabled;
uint8_t rx_packet_buffer[PIOS_USB_BOARD_HID_DATA_LENGTH]; uint8_t rx_packet_buffer[PIOS_USB_BOARD_HID_DATA_LENGTH];
bool rx_active;
uint8_t tx_packet_buffer[PIOS_USB_BOARD_HID_DATA_LENGTH]; uint8_t tx_packet_buffer[PIOS_USB_BOARD_HID_DATA_LENGTH];
bool tx_active;
uint32_t rx_dropped; uint32_t rx_dropped;
uint32_t rx_oversize; uint32_t rx_oversize;
@ -138,7 +144,12 @@ int32_t PIOS_USB_HID_Init(uint32_t * usbhid_id, const struct pios_usb_hid_cfg *
usb_hid_dev->cfg = cfg; usb_hid_dev->cfg = cfg;
usb_hid_dev->lower_id = lower_id; usb_hid_dev->lower_id = lower_id;
/* Rx and Tx are not active yet */
usb_hid_dev->rx_active = false;
usb_hid_dev->tx_active = false;
/* Register class specific interface callbacks with the USBHOOK layer */ /* Register class specific interface callbacks with the USBHOOK layer */
usb_hid_dev->usb_if_enabled = false;
PIOS_USBHOOK_RegisterIfOps(cfg->data_if, &usb_hid_ifops, (uint32_t) usb_hid_dev); PIOS_USBHOOK_RegisterIfOps(cfg->data_if, &usb_hid_ifops, (uint32_t) usb_hid_dev);
*usbhid_id = (uint32_t) usb_hid_dev; *usbhid_id = (uint32_t) usb_hid_dev;
@ -150,12 +161,12 @@ out_fail:
} }
static struct pios_usbhook_descriptor hid_if_desc; static struct pios_usbhook_descriptor hid_desc;
void PIOS_USB_HID_RegisterHidInterface(const uint8_t * desc, uint16_t length) void PIOS_USB_HID_RegisterHidDescriptor(const uint8_t * desc, uint16_t length)
{ {
hid_if_desc.descriptor = desc; hid_desc.descriptor = desc;
hid_if_desc.length = length; hid_desc.length = length;
} }
static struct pios_usbhook_descriptor hid_report_desc; static struct pios_usbhook_descriptor hid_report_desc;
@ -192,18 +203,24 @@ static bool PIOS_USB_HID_SendReport(struct pios_usb_hid_dev * usb_hid_dev)
return false; return false;
} }
/*
* Mark this endpoint as being tx active _before_ actually transmitting
* to make sure we don't race with the Tx completion interrupt
*/
usb_hid_dev->tx_active = true;
/* Always set type as report ID */ /* Always set type as report ID */
usb_hid_dev->tx_packet_buffer[0] = 1; usb_hid_dev->tx_packet_buffer[0] = 1;
#ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE #ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE
PIOS_USBHOOK_EndpointTx(usb_hid_dev->cfg->data_tx_ep, PIOS_USBHOOK_EndpointTx(usb_hid_dev->cfg->data_tx_ep,
usb_hid_dev->tx_packet_buffer, usb_hid_dev->tx_packet_buffer,
bytes_to_tx + 1); sizeof(usb_hid_dev->tx_packet_buffer));
#else #else
usb_hid_dev->tx_packet_buffer[1] = bytes_to_tx; usb_hid_dev->tx_packet_buffer[1] = bytes_to_tx;
PIOS_USBHOOK_EndpointTx(usb_hid_dev->cfg->data_tx_ep, PIOS_USBHOOK_EndpointTx(usb_hid_dev->cfg->data_tx_ep,
usb_hid_dev->tx_packet_buffer, usb_hid_dev->tx_packet_buffer,
bytes_to_tx + 2); sizeof(usb_hid_dev->tx_packet_buffer));
#endif #endif
#if defined(PIOS_INCLUDE_FREERTOS) #if defined(PIOS_INCLUDE_FREERTOS)
@ -221,6 +238,11 @@ static void PIOS_USB_HID_RxStart(uint32_t usbhid_id, uint16_t rx_bytes_avail) {
bool valid = PIOS_USB_HID_validate(usb_hid_dev); bool valid = PIOS_USB_HID_validate(usb_hid_dev);
PIOS_Assert(valid); PIOS_Assert(valid);
/* Make sure this USB interface has been initialized */
if (!usb_hid_dev->usb_if_enabled) {
return;
}
if (!PIOS_USB_CheckAvailable(usb_hid_dev->lower_id)) { if (!PIOS_USB_CheckAvailable(usb_hid_dev->lower_id)) {
return; return;
} }
@ -232,16 +254,12 @@ static void PIOS_USB_HID_RxStart(uint32_t usbhid_id, uint16_t rx_bytes_avail) {
uint16_t max_payload_length = PIOS_USB_BOARD_HID_DATA_LENGTH - 2; uint16_t max_payload_length = PIOS_USB_BOARD_HID_DATA_LENGTH - 2;
#endif #endif
PIOS_IRQ_Disable(); if (!usb_hid_dev->rx_active && (rx_bytes_avail >= max_payload_length)) {
if (rx_bytes_avail >= max_payload_length) {
/*
* FIXME should make sure we do not already have a buffer queued
*/
PIOS_USBHOOK_EndpointRx(usb_hid_dev->cfg->data_rx_ep, PIOS_USBHOOK_EndpointRx(usb_hid_dev->cfg->data_rx_ep,
usb_hid_dev->rx_packet_buffer, usb_hid_dev->rx_packet_buffer,
sizeof(usb_hid_dev->rx_packet_buffer)); sizeof(usb_hid_dev->rx_packet_buffer));
usb_hid_dev->rx_active = true;
} }
PIOS_IRQ_Enable();
} }
static void PIOS_USB_HID_TxStart(uint32_t usbhid_id, uint16_t tx_bytes_avail) static void PIOS_USB_HID_TxStart(uint32_t usbhid_id, uint16_t tx_bytes_avail)
@ -251,22 +269,19 @@ static void PIOS_USB_HID_TxStart(uint32_t usbhid_id, uint16_t tx_bytes_avail)
bool valid = PIOS_USB_HID_validate(usb_hid_dev); bool valid = PIOS_USB_HID_validate(usb_hid_dev);
PIOS_Assert(valid); PIOS_Assert(valid);
/* Make sure this USB interface has been initialized */
if (!usb_hid_dev->usb_if_enabled) {
return;
}
if (!PIOS_USB_CheckAvailable(usb_hid_dev->lower_id)) { if (!PIOS_USB_CheckAvailable(usb_hid_dev->lower_id)) {
return; return;
} }
#if 0 if (!usb_hid_dev->tx_active) {
if (GetEPTxStatus(usb_hid_dev->cfg->data_tx_ep) == EP_TX_VALID) { /* Transmitter is not currently active, send a report */
/* Endpoint is already transmitting */ PIOS_USB_HID_SendReport(usb_hid_dev);
return;
} }
#else
/*
* FIXME start transmitter
*/
#endif
PIOS_USB_HID_SendReport(usb_hid_dev);
} }
static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callback rx_in_cb, uint32_t context) static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callback rx_in_cb, uint32_t context)
@ -309,13 +324,15 @@ static void PIOS_USB_HID_IF_Init(uint32_t usb_hid_id)
/* Register endpoint specific callbacks with the USBHOOK layer */ /* Register endpoint specific callbacks with the USBHOOK layer */
PIOS_USBHOOK_RegisterEpInCallback(usb_hid_dev->cfg->data_tx_ep, PIOS_USBHOOK_RegisterEpInCallback(usb_hid_dev->cfg->data_tx_ep,
sizeof(usb_hid_dev->rx_packet_buffer), sizeof(usb_hid_dev->tx_packet_buffer),
PIOS_USB_HID_EP_IN_Callback, PIOS_USB_HID_EP_IN_Callback,
(uint32_t) usb_hid_dev); (uint32_t) usb_hid_dev);
PIOS_USBHOOK_RegisterEpOutCallback(usb_hid_dev->cfg->data_rx_ep, PIOS_USBHOOK_RegisterEpOutCallback(usb_hid_dev->cfg->data_rx_ep,
sizeof(usb_hid_dev->rx_packet_buffer), sizeof(usb_hid_dev->rx_packet_buffer),
PIOS_USB_HID_EP_OUT_Callback, PIOS_USB_HID_EP_OUT_Callback,
(uint32_t) usb_hid_dev); (uint32_t) usb_hid_dev);
usb_hid_dev->usb_if_enabled = true;
} }
static void PIOS_USB_HID_IF_DeInit(uint32_t usb_hid_id) static void PIOS_USB_HID_IF_DeInit(uint32_t usb_hid_id)
@ -327,6 +344,7 @@ static void PIOS_USB_HID_IF_DeInit(uint32_t usb_hid_id)
} }
/* DeRegister endpoint specific callbacks with the USBHOOK layer */ /* DeRegister endpoint specific callbacks with the USBHOOK layer */
usb_hid_dev->usb_if_enabled = false;
PIOS_USBHOOK_DeRegisterEpInCallback(usb_hid_dev->cfg->data_tx_ep); PIOS_USBHOOK_DeRegisterEpInCallback(usb_hid_dev->cfg->data_tx_ep);
PIOS_USBHOOK_DeRegisterEpOutCallback(usb_hid_dev->cfg->data_rx_ep); PIOS_USBHOOK_DeRegisterEpOutCallback(usb_hid_dev->cfg->data_rx_ep);
} }
@ -358,8 +376,8 @@ static bool PIOS_USB_HID_IF_Setup(uint32_t usb_hid_id, struct usb_setup_request
MIN(hid_report_desc.length, req->wLength)); MIN(hid_report_desc.length, req->wLength));
break; break;
case USB_DESC_TYPE_HID: case USB_DESC_TYPE_HID:
PIOS_USBHOOK_CtrlTx(hid_if_desc.descriptor, PIOS_USBHOOK_CtrlTx(hid_desc.descriptor,
MIN(hid_if_desc.length, req->wLength)); MIN(hid_desc.length, req->wLength));
break; break;
default: default:
/* Unhandled descriptor request */ /* Unhandled descriptor request */
@ -429,11 +447,15 @@ static bool PIOS_USB_HID_EP_IN_Callback(uint32_t usb_hid_id, uint8_t epnum, uint
return false; return false;
} }
if (!PIOS_USB_CheckAvailable(usb_hid_dev->lower_id)) { if (PIOS_USB_CheckAvailable(usb_hid_dev->lower_id) &&
PIOS_USB_HID_SendReport(usb_hid_dev)) {
/* More data has been queued, leave tx_active set to true */
return true;
} else {
/* Nothing new sent, transmitter is now inactive */
usb_hid_dev->tx_active = false;
return false; return false;
} }
return (PIOS_USB_HID_SendReport(usb_hid_dev));
} }
/** /**
@ -453,6 +475,7 @@ static bool PIOS_USB_HID_EP_OUT_Callback(uint32_t usb_hid_id, uint8_t epnum, uin
if (!usb_hid_dev->rx_in_cb) { if (!usb_hid_dev->rx_in_cb) {
/* No Rx call back registered, disable the receiver */ /* No Rx call back registered, disable the receiver */
usb_hid_dev->rx_active = false;
return false; return false;
} }
@ -484,6 +507,7 @@ static bool PIOS_USB_HID_EP_OUT_Callback(uint32_t usb_hid_id, uint8_t epnum, uin
return true; return true;
} else { } else {
/* Not enough room left for a message, apply backpressure */ /* Not enough room left for a message, apply backpressure */
usb_hid_dev->rx_active = false;
return false; return false;
} }

View File

@ -86,6 +86,13 @@ void PIOS_USBHOOK_Activate(void)
&user_callbacks); &user_callbacks);
} }
void PIOS_USBHOOK_Deactivate(void)
{
DCD_DevDisconnect(&pios_usb_otg_core_handle);
USBD_DeInit(&pios_usb_otg_core_handle);
USB_OTG_StopDevice(&pios_usb_otg_core_handle);
}
void OTG_FS_IRQHandler(void) void OTG_FS_IRQHandler(void)
{ {
if(!USBD_OTG_ISR_Handler(&pios_usb_otg_core_handle)) { if(!USBD_OTG_ISR_Handler(&pios_usb_otg_core_handle)) {
@ -333,7 +340,7 @@ static uint8_t PIOS_USBHOOK_CLASS_Setup(void *pdev, USB_SETUP_REQ *req)
usb_if_table[ifnum].ifops->setup(usb_if_table[ifnum].context, usb_if_table[ifnum].ifops->setup(usb_if_table[ifnum].context,
(struct usb_setup_request *)req); (struct usb_setup_request *)req);
if (req->bmRequest & 0x80 && req->wLength > 0) { if (req->bmRequest & 0x80 && req->wLength > 0) {
/* Request is a host-to-device data setup packet, keep track of the request details for the EP0_RxRead call */ /* Request is a host-to-device data setup packet, keep track of the request details for the EP0_RxReady call */
usb_ep0_active_req.bmRequestType = req->bmRequest; usb_ep0_active_req.bmRequestType = req->bmRequest;
usb_ep0_active_req.bRequest = req->bRequest; usb_ep0_active_req.bRequest = req->bRequest;
usb_ep0_active_req.wValue = req->wValue; usb_ep0_active_req.wValue = req->wValue;
@ -379,11 +386,14 @@ static uint8_t PIOS_USBHOOK_CLASS_DataIn(void *pdev, uint8_t epnum)
DCD_EP_Flush(pdev, epnum); /* NOT SURE IF THIS IS REQUIRED */ DCD_EP_Flush(pdev, epnum); /* NOT SURE IF THIS IS REQUIRED */
/* Remove the direction bit so we can use this as an index */ /* Remove the direction bit so we can use this as an index */
epnum = epnum & 0xF; uint8_t epnum_idx = epnum & 0x7F;
if ((epnum < NELEMENTS(usb_epin_table)) && usb_epin_table[epnum].cb) { if ((epnum_idx < NELEMENTS(usb_epin_table)) && usb_epin_table[epnum_idx].cb) {
struct usb_ep_entry *ep = &(usb_epin_table[epnum]); struct usb_ep_entry *ep = &(usb_epin_table[epnum_idx]);
ep->cb(ep->context, epnum, ep->max_len); if (!ep->cb(ep->context, epnum_idx, ep->max_len)) {
/* NOTE: use real endpoint number including direction bit */
DCD_SetEPStatus(pdev, epnum, USB_OTG_EP_TX_NAK);
}
} }
return USBD_OK; return USBD_OK;
@ -392,11 +402,14 @@ static uint8_t PIOS_USBHOOK_CLASS_DataIn(void *pdev, uint8_t epnum)
static uint8_t PIOS_USBHOOK_CLASS_DataOut(void *pdev, uint8_t epnum) static uint8_t PIOS_USBHOOK_CLASS_DataOut(void *pdev, uint8_t epnum)
{ {
/* Remove the direction bit so we can use this as an index */ /* Remove the direction bit so we can use this as an index */
epnum = epnum & 0xF; uint8_t epnum_idx = epnum & 0x7F;
if ((epnum < NELEMENTS(usb_epout_table)) && usb_epout_table[epnum].cb) { if ((epnum_idx < NELEMENTS(usb_epout_table)) && usb_epout_table[epnum_idx].cb) {
struct usb_ep_entry *ep = &(usb_epout_table[epnum]); struct usb_ep_entry *ep = &(usb_epout_table[epnum_idx]);
ep->cb(ep->context, epnum, ep->max_len); if (!ep->cb(ep->context, epnum_idx, ep->max_len)) {
/* NOTE: use real endpoint number including direction bit */
DCD_SetEPStatus(pdev, epnum, USB_OTG_EP_RX_NAK);
}
} }
return USBD_OK; return USBD_OK;
@ -457,441 +470,3 @@ static USBD_Class_cb_TypeDef class_callbacks = {
#endif /* USB_SUPPORT_USER_STRING_DESC */ #endif /* USB_SUPPORT_USER_STRING_DESC */
}; };
#if 0
#include "stm32f10x.h" /* __IO */
__IO uint8_t EXTI_Enable;
uint32_t ProtocolValue;
DEVICE Device_Table = {
PIOS_USB_BOARD_EP_NUM,
1
};
static void PIOS_USBHOOK_Init(void);
static void PIOS_USBHOOK_Reset(void);
static void PIOS_USBHOOK_Status_In(void);
static void PIOS_USBHOOK_Status_Out(void);
static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo);
static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo);
static RESULT PIOS_USBHOOK_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting);
static const uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length);
static const uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length);
static const uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length);
DEVICE_PROP Device_Property = {
.Init = PIOS_USBHOOK_Init,
.Reset = PIOS_USBHOOK_Reset,
.Process_Status_IN = PIOS_USBHOOK_Status_In,
.Process_Status_OUT = PIOS_USBHOOK_Status_Out,
.Class_Data_Setup = PIOS_USBHOOK_Data_Setup,
.Class_NoData_Setup = PIOS_USBHOOK_NoData_Setup,
.Class_Get_Interface_Setting = PIOS_USBHOOK_Get_Interface_Setting,
.GetDeviceDescriptor = PIOS_USBHOOK_GetDeviceDescriptor,
.GetConfigDescriptor = PIOS_USBHOOK_GetConfigDescriptor,
.GetStringDescriptor = PIOS_USBHOOK_GetStringDescriptor,
.RxEP_buffer = 0,
.MaxPacketSize = 0x40,
};
static void PIOS_USBHOOK_SetConfiguration(void);
static void PIOS_USBHOOK_SetDeviceAddress(void);
USER_STANDARD_REQUESTS User_Standard_Requests = {
.User_GetConfiguration = NOP_Process,
.User_SetConfiguration = PIOS_USBHOOK_SetConfiguration,
.User_GetInterface = NOP_Process,
.User_SetInterface = NOP_Process,
.User_GetStatus = NOP_Process,
.User_ClearFeature = NOP_Process,
.User_SetEndPointFeature = NOP_Process,
.User_SetDeviceFeature = NOP_Process,
.User_SetDeviceAddress = PIOS_USBHOOK_SetDeviceAddress
};
static RESULT PIOS_USBHOOK_SetProtocol(void);
static const uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length);
static const uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length);
static const uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length);
/*******************************************************************************
* Function Name : PIOS_USBHOOK_Init.
* Description : Custom HID init routine.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
static void PIOS_USBHOOK_Init(void)
{
pInformation->Current_Configuration = 0;
/* Connect the device */
PowerOn();
/* Perform basic device initialization operations */
USB_SIL_Init();
bDeviceState = UNCONNECTED;
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_Reset.
* Description : Custom HID reset routine.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
static void PIOS_USBHOOK_Reset(void)
{
/* Set DEVICE as not configured */
pInformation->Current_Configuration = 0;
pInformation->Current_Interface = 0; /*the default Interface */
/* Current Feature initialization */
pInformation->Current_Feature = 0;
#ifdef STM32F10X_CL
/* EP0 is already configured in DFU_Init() by USB_SIL_Init() function */
/* Init EP1 IN as Interrupt endpoint */
OTG_DEV_EP_Init(EP1_IN, OTG_DEV_EP_TYPE_INT, 2);
/* Init EP1 OUT as Interrupt endpoint */
OTG_DEV_EP_Init(EP1_OUT, OTG_DEV_EP_TYPE_INT, 2);
#else
SetBTABLE(BTABLE_ADDRESS);
/* Initialize Endpoint 0 (Control) */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
SetEPTxStatus(ENDP0, EP_TX_STALL);
Clear_Status_Out(ENDP0);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);
#if defined(PIOS_INCLUDE_USB_HID)
/* Initialize Endpoint 1 (HID) */
SetEPType(ENDP1, EP_INTERRUPT);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxCount(ENDP1, PIOS_USB_BOARD_HID_DATA_LENGTH);
SetEPTxStatus(ENDP1, EP_TX_NAK);
SetEPRxAddr(ENDP1, ENDP1_RXADDR);
SetEPRxCount(ENDP1, PIOS_USB_BOARD_HID_DATA_LENGTH);
SetEPRxStatus(ENDP1, EP_RX_VALID);
#endif /* PIOS_INCLUDE_USB_HID */
#if defined(PIOS_INCLUDE_USB_CDC)
/* Initialize Endpoint 2 (CDC Call Control) */
SetEPType(ENDP2, EP_INTERRUPT);
SetEPTxAddr(ENDP2, ENDP2_TXADDR);
SetEPTxStatus(ENDP2, EP_TX_NAK);
SetEPRxAddr(ENDP2, ENDP2_RXADDR);
SetEPRxCount(ENDP2, PIOS_USB_BOARD_CDC_MGMT_LENGTH);
SetEPRxStatus(ENDP2, EP_RX_DIS);
/* Initialize Endpoint 3 (CDC Data) */
SetEPType(ENDP3, EP_BULK);
SetEPTxAddr(ENDP3, ENDP3_TXADDR);
SetEPTxStatus(ENDP3, EP_TX_NAK);
SetEPRxAddr(ENDP3, ENDP3_RXADDR);
SetEPRxCount(ENDP3, PIOS_USB_BOARD_CDC_DATA_LENGTH);
SetEPRxStatus(ENDP3, EP_RX_VALID);
#endif /* PIOS_INCLUDE_USB_CDC */
/* Set this device to response on default address */
SetDeviceAddress(0);
#endif /* STM32F10X_CL */
bDeviceState = ATTACHED;
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_SetConfiguration.
* Description : Update the device state to configured
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
static void PIOS_USBHOOK_SetConfiguration(void)
{
if (pInformation->Current_Configuration != 0) {
/* Device configured */
bDeviceState = CONFIGURED;
}
/* Enable transfers */
PIOS_USB_ChangeConnectionState(pInformation->Current_Configuration != 0);
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_SetConfiguration.
* Description : Update the device state to addressed.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
static void PIOS_USBHOOK_SetDeviceAddress(void)
{
bDeviceState = ADDRESSED;
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_Status_In.
* Description : status IN routine.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
static void PIOS_USBHOOK_Status_In(void)
{
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_Status_Out
* Description : status OUT routine.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
static void PIOS_USBHOOK_Status_Out(void)
{
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_Data_Setup
* Description : Handle the data class specific requests.
* Input : Request Nb.
* Output : None.
* Return : USB_UNSUPPORT or USB_SUCCESS.
*******************************************************************************/
static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo)
{
const uint8_t *(*CopyRoutine) (uint16_t);
CopyRoutine = NULL;
switch (Type_Recipient) {
case (STANDARD_REQUEST | INTERFACE_RECIPIENT):
switch (pInformation->USBwIndex0) {
case 0: /* HID Interface */
switch (RequestNo) {
case GET_DESCRIPTOR:
switch (pInformation->USBwValue1) {
case USB_DESC_TYPE_REPORT:
CopyRoutine = PIOS_USBHOOK_GetReportDescriptor;
break;
case USB_DESC_TYPE_HID:
CopyRoutine = PIOS_USBHOOK_GetHIDDescriptor;
break;
}
}
}
break;
case (CLASS_REQUEST | INTERFACE_RECIPIENT):
switch (pInformation->USBwIndex0) {
case 0: /* HID Interface */
switch (RequestNo) {
case GET_PROTOCOL:
CopyRoutine = PIOS_USBHOOK_GetProtocolValue;
break;
}
break;
#if defined(PIOS_INCLUDE_USB_CDC)
case 1: /* CDC Call Control Interface */
switch (RequestNo) {
case GET_LINE_CODING:
CopyRoutine = PIOS_USB_CDC_GetLineCoding;
break;
}
break;
case 2: /* CDC Data Interface */
switch (RequestNo) {
case 0:
break;
}
break;
#endif /* PIOS_INCLUDE_USB_CDC */
}
break;
}
if (CopyRoutine == NULL) {
return USB_UNSUPPORT;
}
pInformation->Ctrl_Info.CopyDataIn = CopyRoutine;
pInformation->Ctrl_Info.Usb_wOffset = 0;
(*CopyRoutine) (0);
return USB_SUCCESS;
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_NoData_Setup
* Description : handle the no data class specific requests
* Input : Request Nb.
* Output : None.
* Return : USB_UNSUPPORT or USB_SUCCESS.
*******************************************************************************/
static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo)
{
switch (Type_Recipient) {
case (CLASS_REQUEST | INTERFACE_RECIPIENT):
switch (pInformation->USBwIndex0) {
case 0: /* HID */
switch (RequestNo) {
case SET_PROTOCOL:
return PIOS_USBHOOK_SetProtocol();
break;
}
break;
#if defined(PIOS_INCLUDE_USB_CDC)
case 1: /* CDC Call Control Interface */
switch (RequestNo) {
case SET_LINE_CODING:
return PIOS_USB_CDC_SetLineCoding();
break;
case SET_CONTROL_LINE_STATE:
return PIOS_USB_CDC_SetControlLineState();
break;
}
break;
#endif /* PIOS_INCLUDE_USB_CDC */
}
break;
}
return USB_UNSUPPORT;
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_GetDeviceDescriptor.
* Description : Gets the device descriptor.
* Input : Length
* Output : None.
* Return : The address of the device descriptor.
*******************************************************************************/
static const uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length)
{
return Standard_GetDescriptorData(Length, &Device_Descriptor);
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_GetConfigDescriptor.
* Description : Gets the configuration descriptor.
* Input : Length
* Output : None.
* Return : The address of the configuration descriptor.
*******************************************************************************/
static const uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length)
{
return Standard_GetDescriptorData(Length, &Config_Descriptor);
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_GetStringDescriptor
* Description : Gets the string descriptors according to the needed index
* Input : Length
* Output : None.
* Return : The address of the string descriptors.
*******************************************************************************/
static const uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length)
{
uint8_t wValue0 = pInformation->USBwValue0;
if (wValue0 > 4) {
return NULL;
} else {
return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]);
}
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_GetReportDescriptor.
* Description : Gets the HID report descriptor.
* Input : Length
* Output : None.
* Return : The address of the configuration descriptor.
*******************************************************************************/
static const uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length)
{
return Standard_GetDescriptorData(Length, &Hid_Report_Descriptor);
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_GetHIDDescriptor.
* Description : Gets the HID descriptor.
* Input : Length
* Output : None.
* Return : The address of the configuration descriptor.
*******************************************************************************/
static const uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length)
{
return Standard_GetDescriptorData(Length, &Hid_Interface_Descriptor);
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_Get_Interface_Setting.
* Description : tests the interface and the alternate setting according to the
* supported one.
* Input : - Interface : interface number.
* - AlternateSetting : Alternate Setting number.
* Output : None.
* Return : USB_SUCCESS or USB_UNSUPPORT.
*******************************************************************************/
static RESULT PIOS_USBHOOK_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting)
{
if (AlternateSetting > 0) {
return USB_UNSUPPORT;
} else if (Interface > 0) {
return USB_UNSUPPORT;
}
return USB_SUCCESS;
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_SetProtocol
* Description : Set Protocol request routine.
* Input : None.
* Output : None.
* Return : USB SUCCESS.
*******************************************************************************/
static RESULT PIOS_USBHOOK_SetProtocol(void)
{
uint8_t wValue0 = pInformation->USBwValue0;
ProtocolValue = wValue0;
return USB_SUCCESS;
}
/*******************************************************************************
* Function Name : PIOS_USBHOOK_GetProtocolValue
* Description : get the protocol value
* Input : Length.
* Output : None.
* Return : address of the protcol value.
*******************************************************************************/
static const uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length)
{
if (Length == 0) {
pInformation->Ctrl_Info.Usb_wLength = 1;
return NULL;
} else {
return (uint8_t *) (&ProtocolValue);
}
}
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
#endif

View File

@ -37,7 +37,7 @@
extern const struct pios_rcvr_driver pios_gcsrcvr_rcvr_driver; extern const struct pios_rcvr_driver pios_gcsrcvr_rcvr_driver;
extern void PIOS_GCSRCVR_Init(void); extern int32_t PIOS_GCSRCVR_Init(uint32_t *gcsrcvr_id);
#endif /* PIOS_GCSRCVR_PRIV_H */ #endif /* PIOS_GCSRCVR_PRIV_H */

View File

@ -58,6 +58,14 @@ struct pios_ms5611_cfg {
uint32_t oversampling; uint32_t oversampling;
}; };
enum pios_ms5611_osr {
MS5611_OSR_256 = 0,
MS5611_OSR_512 = 2,
MS5611_OSR_1024 = 4,
MS5611_OSR_2048 = 6,
MS5611_OSR_4096 = 8,
};
/* Public Functions */ /* Public Functions */
extern void PIOS_MS5611_Init(const struct pios_ms5611_cfg * cfg, int32_t i2c_device); extern void PIOS_MS5611_Init(const struct pios_ms5611_cfg * cfg, int32_t i2c_device);
extern int32_t PIOS_MS5611_StartADC(ConversionTypeTypeDef Type); extern int32_t PIOS_MS5611_StartADC(ConversionTypeTypeDef Type);
@ -65,6 +73,7 @@ extern int32_t PIOS_MS5611_ReadADC(void);
extern float PIOS_MS5611_GetTemperature(void); extern float PIOS_MS5611_GetTemperature(void);
extern float PIOS_MS5611_GetPressure(void); extern float PIOS_MS5611_GetPressure(void);
extern int32_t PIOS_MS5611_Test(); extern int32_t PIOS_MS5611_Test();
extern int32_t PIOS_MS5611_GetDelay();
#endif /* PIOS_MS5611_H */ #endif /* PIOS_MS5611_H */

View File

@ -35,7 +35,7 @@ extern int32_t PIOS_USB_HID_Reenumerate(void);
extern int32_t PIOS_USB_HID_ChangeConnectionState(uint32_t Connected); extern int32_t PIOS_USB_HID_ChangeConnectionState(uint32_t Connected);
extern bool PIOS_USB_HID_CheckAvailable(uint8_t id); extern bool PIOS_USB_HID_CheckAvailable(uint8_t id);
extern void PIOS_USB_HID_RegisterHidInterface(const uint8_t * desc, uint16_t length); extern void PIOS_USB_HID_RegisterHidDescriptor(const uint8_t * desc, uint16_t length);
extern void PIOS_USB_HID_RegisterHidReport(const uint8_t * desc, uint16_t length); extern void PIOS_USB_HID_RegisterHidReport(const uint8_t * desc, uint16_t length);
#endif /* PIOS_USB_HID_H */ #endif /* PIOS_USB_HID_H */

View File

@ -72,6 +72,7 @@ extern void PIOS_USBHOOK_CtrlRx(uint8_t *buf, uint16_t len);
extern void PIOS_USBHOOK_EndpointTx(uint8_t epnum, const uint8_t *buf, uint16_t len); extern void PIOS_USBHOOK_EndpointTx(uint8_t epnum, const uint8_t *buf, uint16_t len);
extern void PIOS_USBHOOK_EndpointRx(uint8_t epnum, uint8_t *buf, uint16_t len); extern void PIOS_USBHOOK_EndpointRx(uint8_t epnum, uint8_t *buf, uint16_t len);
extern void PIOS_USBHOOK_Activate(void); extern void PIOS_USBHOOK_Activate(void);
extern void PIOS_USBHOOK_Deactivate(void);
#endif /* PIOS_USBHOOK_H */ #endif /* PIOS_USBHOOK_H */

View File

@ -50,6 +50,7 @@
/* STM32 Std Perf Lib */ /* STM32 Std Perf Lib */
#if defined(STM32F4XX) #if defined(STM32F4XX)
# include <stm32f4xx.h> # include <stm32f4xx.h>
# include <stm32f4xx_rcc.h>
#elif defined(STM32F2XX) #elif defined(STM32F2XX)
#include <stm32f2xx.h> #include <stm32f2xx.h>
#include <stm32f2xx_syscfg.h> #include <stm32f2xx_syscfg.h>

View File

@ -392,7 +392,7 @@ $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION))) $(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe) # Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE),$(OPENOCD_CONFIG))) $(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE),$(OPENOCD_JTAG_CONFIG),$(OPENOCD_CONFIG)))
.PHONY: elf lss sym hex bin bino opfw .PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf elf: $(OUTDIR)/$(TARGET).elf

View File

@ -1,58 +1,58 @@
From 7a8a1dbf856a2183c91f441cfdd2eee5b3d9151b Mon Sep 17 00:00:00 2001 From 8fd5040df32511f57b898bdbff412f61fbe28516 Mon Sep 17 00:00:00 2001
From: Stacey Sheldon <stac@solidgoldbomb.org> From: Stacey Sheldon <stac@solidgoldbomb.org>
Date: Thu, 2 Feb 2012 22:42:03 -0500 Date: Thu, 2 Feb 2012 22:42:03 -0500
Subject: [PATCH 1/2] armv7m: remove dummy FP regs for new gdb Subject: [PATCH 1/2] armv7m: remove dummy FP regs for new gdb
--- ---
src/rtos/rtos_standard_stackings.c | 6 ++++++ src/rtos/rtos_standard_stackings.c | 7 +++++++
src/target/armv7m.c | 16 ++++++++++++++++ src/target/armv7m.c | 16 ++++++++++++++++
2 files changed, 22 insertions(+), 0 deletions(-) 2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/src/rtos/rtos_standard_stackings.c b/src/rtos/rtos_standard_stackings.c diff --git a/src/rtos/rtos_standard_stackings.c b/src/rtos/rtos_standard_stackings.c
index 278d3ef..7ef4659 100644 index 30d9cd9..6ea6565 100644
--- a/src/rtos/rtos_standard_stackings.c --- a/src/rtos/rtos_standard_stackings.c
+++ b/src/rtos/rtos_standard_stackings.c +++ b/src/rtos/rtos_standard_stackings.c
@@ -41,6 +41,7 @@ static const struct stack_register_offset rtos_standard_Cortex_M3_stack_offsets[ @@ -41,6 +41,7 @@ static const struct stack_register_offset rtos_standard_Cortex_M3_stack_offsets[
{ -2, 32 }, /* sp */ { -2, 32 }, /* sp */
{ 0x34, 32 }, /* lr */ { 0x34, 32 }, /* lr */
{ 0x38, 32 }, /* pc */ { 0x38, 32 }, /* pc */
+#ifdef USE_DUMMY_FP_REGS +#ifdef USE_DUMMY_FP_REGS
{ -1, 96 }, /* FPA1 */ { -1, 96 }, /* FPA1 */
{ -1, 96 }, /* FPA2 */ { -1, 96 }, /* FPA2 */
{ -1, 96 }, /* FPA3 */ { -1, 96 }, /* FPA3 */
@@ -50,6 +51,7 @@ static const struct stack_register_offset rtos_standard_Cortex_M3_stack_offsets[ @@ -50,13 +51,19 @@ static const struct stack_register_offset rtos_standard_Cortex_M3_stack_offsets[
{ -1, 96 }, /* FPA7 */ { -1, 96 }, /* FPA7 */
{ -1, 96 }, /* FPA8 */ { -1, 96 }, /* FPA8 */
{ -1, 32 }, /* FPS */ { -1, 32 }, /* FPS */
+#endif +#endif
{ 0x3c, 32 }, /* xPSR */ { 0x3c, 32 }, /* xPSR */
}; };
@@ -58,7 +60,11 @@ const struct rtos_register_stacking rtos_standard_Cortex_M3_stacking = +
{ const struct rtos_register_stacking rtos_standard_Cortex_M3_stacking = {
0x40, /* stack_registers_size */ 0x40, /* stack_registers_size */
-1, /* stack_growth_direction */ -1, /* stack_growth_direction */
+#ifdef USE_DUMMY_FP_REGS +#ifdef USE_DUMMY_FP_REGS
26, /* num_output_registers */ 26, /* num_output_registers */
+#else +#else
+ 17, + 17,
+#endif +#endif
8, /* stack_alignment */ 8, /* stack_alignment */
rtos_standard_Cortex_M3_stack_offsets /* register_offsets */ rtos_standard_Cortex_M3_stack_offsets /* register_offsets */
}; };
diff --git a/src/target/armv7m.c b/src/target/armv7m.c diff --git a/src/target/armv7m.c b/src/target/armv7m.c
index 6c1732e..7bb53c7 100644 index 258653e..50b26d4 100644
--- a/src/target/armv7m.c --- a/src/target/armv7m.c
+++ b/src/target/armv7m.c +++ b/src/target/armv7m.c
@@ -272,6 +272,7 @@ int armv7m_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int @@ -267,6 +267,7 @@ int armv7m_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int
struct armv7m_common *armv7m = target_to_armv7m(target); struct armv7m_common *armv7m = target_to_armv7m(target);
int i; int i;
+#ifdef USE_DUMMY_FP_REGS +#ifdef USE_DUMMY_FP_REGS
*reg_list_size = 26; *reg_list_size = 26;
*reg_list = malloc(sizeof(struct reg*) * (*reg_list_size)); *reg_list = malloc(sizeof(struct reg *) * (*reg_list_size));
@@ -302,6 +303,21 @@ int armv7m_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int @@ -295,6 +296,21 @@ int armv7m_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int
(*reg_list)[25] = &armv7m->core_cache->reg_list[ARMV7M_xPSR]; (*reg_list)[25] = &armv7m->core_cache->reg_list[ARMV7M_xPSR];
#endif #endif

View File

@ -1,34 +1,35 @@
From fceb681b4421dd00eb47085990b77c0f0716517d Mon Sep 17 00:00:00 2001 From e29b134e142cd759c85de4ea7c26084e87380ce1 Mon Sep 17 00:00:00 2001
From: Stacey Sheldon <stac@solidgoldbomb.org> From: Stacey Sheldon <stac@solidgoldbomb.org>
Date: Thu, 2 Feb 2012 22:42:26 -0500 Date: Thu, 2 Feb 2012 22:42:26 -0500
Subject: [PATCH 2/2] rtos: add stm32_stlink to FreeRTOS targets Subject: [PATCH 2/2] rtos: add stm32_stlink to FreeRTOS targets
--- ---
src/rtos/FreeRTOS.c | 11 +++++++++++ src/rtos/FreeRTOS.c | 12 ++++++++++++
1 files changed, 11 insertions(+), 0 deletions(-) 1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/src/rtos/FreeRTOS.c b/src/rtos/FreeRTOS.c diff --git a/src/rtos/FreeRTOS.c b/src/rtos/FreeRTOS.c
index eeab134..e57806e 100644 index c7b4643..e99d471 100644
--- a/src/rtos/FreeRTOS.c --- a/src/rtos/FreeRTOS.c
+++ b/src/rtos/FreeRTOS.c +++ b/src/rtos/FreeRTOS.c
@@ -63,6 +63,17 @@ const struct FreeRTOS_params FreeRTOS_params_list[] = @@ -57,6 +57,18 @@ const struct FreeRTOS_params FreeRTOS_params_list[] = {
0, // thread_stack_offset; 0, /* thread_stack_offset; */
52, // thread_name_offset; 52, /* thread_name_offset; */
&rtos_standard_Cortex_M3_stacking, // stacking_info &rtos_standard_Cortex_M3_stacking, /* stacking_info */
+ }, + },
+ { "stm32_stlink", // target_name + {
+ 4, // thread_count_width; + "stm32_stlink", /* target_name */
+ 4, // pointer_width; + 4, /* thread_count_width; */
+ 16, // list_next_offset; + 4, /* pointer_width; */
+ 20, // list_width; + 16, /* list_next_offset; */
+ 8, // list_elem_next_offset; + 20, /* list_width; */
+ 12, // list_elem_content_offset + 8, /* list_elem_next_offset; */
+ 0, // thread_stack_offset; + 12, /* list_elem_content_offset */
+ 52, // thread_name_offset; + 0, /* thread_stack_offset; */
+ &rtos_standard_Cortex_M3_stacking, // stacking_info + 52, /* thread_name_offset; */
} + &rtos_standard_Cortex_M3_stacking, /* stacking_info */
}
}; };
-- --
1.7.1 1.7.1

View File

@ -30,5 +30,5 @@ target create $_TARGETNAME stm32_stlink -chain-position $_TARGETNAME -rtos auto
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
#set _FLASHNAME $_CHIPNAME.flash set _FLASHNAME $_CHIPNAME.flash
#flash bank $_FLASHNAME stm32f2x 0x08000000 0 0 0 $_TARGETNAME flash bank $_FLASHNAME stm32f2x 0x08000000 0 0 0 $_TARGETNAME

View File

@ -8,49 +8,8 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
65003B31121249CA00C183DD /* pios_wdg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_wdg.c; sourceTree = "<group>"; }; 65003B31121249CA00C183DD /* pios_wdg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_wdg.c; sourceTree = "<group>"; };
65078B09136FCEE600536549 /* flightstatus.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flightstatus.xml; sourceTree = "<group>"; };
650D8E2112DFE16400D05CC9 /* actuator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = actuator.c; sourceTree = "<group>"; };
650D8E2312DFE16400D05CC9 /* actuator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = actuator.h; sourceTree = "<group>"; };
650D8E2512DFE16400D05CC9 /* ahrs_comms.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_comms.c; sourceTree = "<group>"; };
650D8E2712DFE16400D05CC9 /* ahrs_comms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ahrs_comms.h; sourceTree = "<group>"; };
650D8E2912DFE16400D05CC9 /* altitude.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = altitude.c; sourceTree = "<group>"; };
650D8E2B12DFE16400D05CC9 /* altitude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = altitude.h; sourceTree = "<group>"; };
650D8E2F12DFE16400D05CC9 /* battery.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = battery.c; sourceTree = "<group>"; };
650D8E3112DFE16400D05CC9 /* battery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = battery.h; sourceTree = "<group>"; };
650D8E3312DFE16400D05CC9 /* example.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = example.c; sourceTree = "<group>"; };
650D8E3412DFE16400D05CC9 /* examplemodevent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = examplemodevent.c; sourceTree = "<group>"; };
650D8E3512DFE16400D05CC9 /* examplemodperiodic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = examplemodperiodic.c; sourceTree = "<group>"; };
650D8E3612DFE16400D05CC9 /* examplemodthread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = examplemodthread.c; sourceTree = "<group>"; };
650D8E3812DFE16400D05CC9 /* examplemodevent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = examplemodevent.h; sourceTree = "<group>"; };
650D8E3912DFE16400D05CC9 /* examplemodperiodic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = examplemodperiodic.h; sourceTree = "<group>"; };
650D8E3A12DFE16400D05CC9 /* examplemodthread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = examplemodthread.h; sourceTree = "<group>"; };
650D8E3C12DFE16400D05CC9 /* firmwareiap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = firmwareiap.c; sourceTree = "<group>"; };
650D8E3E12DFE16400D05CC9 /* firmwareiap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = firmwareiap.h; sourceTree = "<group>"; };
650D8E4012DFE16400D05CC9 /* flightplan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = flightplan.c; sourceTree = "<group>"; };
650D8E4212DFE16400D05CC9 /* test.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = test.py; sourceTree = "<group>"; };
650D8E4412DFE16400D05CC9 /* flightplan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flightplan.h; sourceTree = "<group>"; };
650D8E4612DFE16400D05CC9 /* uavobjects.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = uavobjects.py; sourceTree = "<group>"; };
650D8E4812DFE16400D05CC9 /* GPS.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = GPS.c; sourceTree = "<group>"; };
650D8E4A12DFE16400D05CC9 /* GPS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPS.h; sourceTree = "<group>"; };
650D8E4B12DFE16400D05CC9 /* NMEA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NMEA.h; sourceTree = "<group>"; };
650D8E4C12DFE16400D05CC9 /* NMEA.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = NMEA.c; sourceTree = "<group>"; };
650D8E4E12DFE16400D05CC9 /* guidance.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = guidance.c; sourceTree = "<group>"; };
650D8E5012DFE16400D05CC9 /* guidance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guidance.h; sourceTree = "<group>"; };
650D8E5312DFE16400D05CC9 /* manualcontrol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = manualcontrol.h; sourceTree = "<group>"; };
650D8E5412DFE16400D05CC9 /* manualcontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = manualcontrol.c; sourceTree = "<group>"; };
650D8E5812DFE16400D05CC9 /* MkSerial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MkSerial.h; sourceTree = "<group>"; };
650D8E5912DFE16400D05CC9 /* MKSerial.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = MKSerial.c; sourceTree = "<group>"; };
650D8E5C12DFE16400D05CC9 /* OsdEtStd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = OsdEtStd.c; sourceTree = "<group>"; };
650D8E5F12DFE16400D05CC9 /* stabilization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stabilization.h; sourceTree = "<group>"; };
650D8E6012DFE16400D05CC9 /* stabilization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stabilization.c; sourceTree = "<group>"; };
650D8E6312DFE16400D05CC9 /* systemmod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = systemmod.h; sourceTree = "<group>"; };
650D8E6412DFE16400D05CC9 /* systemmod.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = systemmod.c; sourceTree = "<group>"; };
650D8E6712DFE16400D05CC9 /* telemetry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = telemetry.h; sourceTree = "<group>"; };
650D8E6812DFE16400D05CC9 /* telemetry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = telemetry.c; sourceTree = "<group>"; };
650D8ED112DFE17500D05CC9 /* uavtalk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uavtalk.h; sourceTree = "<group>"; }; 650D8ED112DFE17500D05CC9 /* uavtalk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uavtalk.h; sourceTree = "<group>"; };
650D8ED212DFE17500D05CC9 /* uavtalk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uavtalk.c; sourceTree = "<group>"; }; 650D8ED212DFE17500D05CC9 /* uavtalk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uavtalk.c; sourceTree = "<group>"; };
65140DFA1496927D00E01D11 /* sensors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sensors.h; sourceTree = "<group>"; };
65140DFB1496927D00E01D11 /* sensors.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sensors.c; sourceTree = "<group>"; };
65173C9F12EBFD1700D6A7CB /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = ../../../Makefile; sourceTree = SOURCE_ROOT; }; 65173C9F12EBFD1700D6A7CB /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = ../../../Makefile; sourceTree = SOURCE_ROOT; };
651913371256C5240039C0A3 /* ahrs_comm_objects.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_comm_objects.c; sourceTree = "<group>"; }; 651913371256C5240039C0A3 /* ahrs_comm_objects.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_comm_objects.c; sourceTree = "<group>"; };
651913381256C5240039C0A3 /* ahrs_spi_comm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_spi_comm.c; sourceTree = "<group>"; }; 651913381256C5240039C0A3 /* ahrs_spi_comm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_spi_comm.c; sourceTree = "<group>"; };
@ -68,13 +27,11 @@
6528CCB412E406B800CF5144 /* pios_adxl345.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_adxl345.c; sourceTree = "<group>"; }; 6528CCB412E406B800CF5144 /* pios_adxl345.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_adxl345.c; sourceTree = "<group>"; };
6528CCE212E40F6700CF5144 /* pios_adxl345.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_adxl345.h; sourceTree = "<group>"; }; 6528CCE212E40F6700CF5144 /* pios_adxl345.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_adxl345.h; sourceTree = "<group>"; };
652A445514D116AE00835B68 /* board_hw_defs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = board_hw_defs.c; path = ../../board_hw_defs/revolution/board_hw_defs.c; sourceTree = "<group>"; }; 652A445514D116AE00835B68 /* board_hw_defs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = board_hw_defs.c; path = ../../board_hw_defs/revolution/board_hw_defs.c; sourceTree = "<group>"; };
652C8568132B632A00BFCC70 /* firmwareiapobj.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = firmwareiapobj.xml; sourceTree = "<group>"; }; 652EF83814DF229C00C461BB /* Modules */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Modules; path = ../../Modules; sourceTree = "<group>"; };
652C856A132B6EA600BFCC70 /* sonaraltitude.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = sonaraltitude.xml; sourceTree = "<group>"; };
65322D3B122841F60046CD7C /* gpstime.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gpstime.xml; sourceTree = "<group>"; }; 65322D3B122841F60046CD7C /* gpstime.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gpstime.xml; sourceTree = "<group>"; };
65345C871288668B00A5E4E8 /* guidancesettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = guidancesettings.xml; sourceTree = "<group>"; }; 65345C871288668B00A5E4E8 /* guidancesettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = guidancesettings.xml; sourceTree = "<group>"; };
6534B5571474F78B003DF47C /* pios_mpu6000.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_mpu6000.h; sourceTree = "<group>"; }; 6534B5571474F78B003DF47C /* pios_mpu6000.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_mpu6000.h; sourceTree = "<group>"; };
6534B55B1476D3A8003DF47C /* pios_ms5611.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_ms5611.h; sourceTree = "<group>"; }; 6534B55B1476D3A8003DF47C /* pios_ms5611.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_ms5611.h; sourceTree = "<group>"; };
6536D47B1307962C0042A298 /* stabilizationdesired.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = stabilizationdesired.xml; sourceTree = "<group>"; };
65408AA812BB1648004DACC5 /* i2cstats.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = i2cstats.xml; sourceTree = "<group>"; }; 65408AA812BB1648004DACC5 /* i2cstats.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = i2cstats.xml; sourceTree = "<group>"; };
6543A04514CF1823004EEC4C /* board_hw_defs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = board_hw_defs.c; sourceTree = "<group>"; }; 6543A04514CF1823004EEC4C /* board_hw_defs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = board_hw_defs.c; sourceTree = "<group>"; };
6543A04B14CF1823004EEC4C /* board_hw_defs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = board_hw_defs.c; sourceTree = "<group>"; }; 6543A04B14CF1823004EEC4C /* board_hw_defs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = board_hw_defs.c; sourceTree = "<group>"; };
@ -2797,45 +2754,6 @@
65B367FE121C2620003EAD18 /* telemetrysettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = telemetrysettings.xml; sourceTree = "<group>"; }; 65B367FE121C2620003EAD18 /* telemetrysettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = telemetrysettings.xml; sourceTree = "<group>"; };
65B367FF121C2620003EAD18 /* src.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = src.pro; sourceTree = "<group>"; }; 65B367FF121C2620003EAD18 /* src.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = src.pro; sourceTree = "<group>"; };
65BBB6A214CE77EB0003A16F /* pios_iap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_iap.c; sourceTree = "<group>"; }; 65BBB6A214CE77EB0003A16F /* pios_iap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_iap.c; sourceTree = "<group>"; };
65C35E5012EFB2F3004811C2 /* actuatorcommand.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = actuatorcommand.xml; sourceTree = "<group>"; };
65C35E5112EFB2F3004811C2 /* actuatordesired.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = actuatordesired.xml; sourceTree = "<group>"; };
65C35E5212EFB2F3004811C2 /* actuatorsettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = actuatorsettings.xml; sourceTree = "<group>"; };
65C35E5312EFB2F3004811C2 /* ahrscalibration.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = ahrscalibration.xml; sourceTree = "<group>"; };
65C35E5412EFB2F3004811C2 /* ahrssettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = ahrssettings.xml; sourceTree = "<group>"; };
65C35E5512EFB2F3004811C2 /* ahrsstatus.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = ahrsstatus.xml; sourceTree = "<group>"; };
65C35E5612EFB2F3004811C2 /* attitudeactual.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = attitudeactual.xml; sourceTree = "<group>"; };
65C35E5812EFB2F3004811C2 /* attituderaw.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = attituderaw.xml; sourceTree = "<group>"; };
65C35E5912EFB2F3004811C2 /* baroaltitude.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = baroaltitude.xml; sourceTree = "<group>"; };
65C35E5C12EFB2F3004811C2 /* flightbatterystate.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flightbatterystate.xml; sourceTree = "<group>"; };
65C35E5D12EFB2F3004811C2 /* flightplancontrol.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flightplancontrol.xml; sourceTree = "<group>"; };
65C35E5E12EFB2F3004811C2 /* flightplansettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flightplansettings.xml; sourceTree = "<group>"; };
65C35E5F12EFB2F3004811C2 /* flightplanstatus.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flightplanstatus.xml; sourceTree = "<group>"; };
65C35E6012EFB2F3004811C2 /* flighttelemetrystats.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = flighttelemetrystats.xml; sourceTree = "<group>"; };
65C35E6112EFB2F3004811C2 /* gcstelemetrystats.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gcstelemetrystats.xml; sourceTree = "<group>"; };
65C35E6212EFB2F3004811C2 /* gpsposition.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gpsposition.xml; sourceTree = "<group>"; };
65C35E6312EFB2F3004811C2 /* gpssatellites.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gpssatellites.xml; sourceTree = "<group>"; };
65C35E6412EFB2F3004811C2 /* gpstime.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gpstime.xml; sourceTree = "<group>"; };
65C35E6512EFB2F3004811C2 /* guidancesettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = guidancesettings.xml; sourceTree = "<group>"; };
65C35E6612EFB2F3004811C2 /* homelocation.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = homelocation.xml; sourceTree = "<group>"; };
65C35E6712EFB2F3004811C2 /* i2cstats.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = i2cstats.xml; sourceTree = "<group>"; };
65C35E6812EFB2F3004811C2 /* manualcontrolcommand.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = manualcontrolcommand.xml; sourceTree = "<group>"; };
65C35E6912EFB2F3004811C2 /* manualcontrolsettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = manualcontrolsettings.xml; sourceTree = "<group>"; };
65C35E6A12EFB2F3004811C2 /* mixersettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixersettings.xml; sourceTree = "<group>"; };
65C35E6B12EFB2F3004811C2 /* mixerstatus.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixerstatus.xml; sourceTree = "<group>"; };
65C35E6C12EFB2F3004811C2 /* nedaccel.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = nedaccel.xml; sourceTree = "<group>"; };
65C35E6D12EFB2F3004811C2 /* objectpersistence.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = objectpersistence.xml; sourceTree = "<group>"; };
65C35E6E12EFB2F3004811C2 /* positionactual.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = positionactual.xml; sourceTree = "<group>"; };
65C35E6F12EFB2F3004811C2 /* positiondesired.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = positiondesired.xml; sourceTree = "<group>"; };
65C35E7012EFB2F3004811C2 /* ratedesired.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = ratedesired.xml; sourceTree = "<group>"; };
65C35E7112EFB2F3004811C2 /* stabilizationsettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = stabilizationsettings.xml; sourceTree = "<group>"; };
65C35E7212EFB2F3004811C2 /* systemalarms.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = systemalarms.xml; sourceTree = "<group>"; };
65C35E7312EFB2F3004811C2 /* systemsettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = systemsettings.xml; sourceTree = "<group>"; };
65C35E7412EFB2F3004811C2 /* systemstats.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = systemstats.xml; sourceTree = "<group>"; };
65C35E7512EFB2F3004811C2 /* taskinfo.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = taskinfo.xml; sourceTree = "<group>"; };
65C35E7612EFB2F3004811C2 /* telemetrysettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = telemetrysettings.xml; sourceTree = "<group>"; };
65C35E7712EFB2F3004811C2 /* velocityactual.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = velocityactual.xml; sourceTree = "<group>"; };
65C35E7812EFB2F3004811C2 /* velocitydesired.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = velocitydesired.xml; sourceTree = "<group>"; };
65C35E7912EFB2F3004811C2 /* watchdogstatus.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = watchdogstatus.xml; sourceTree = "<group>"; };
65C35E9E12F0A834004811C2 /* uavobjecttemplate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uavobjecttemplate.c; sourceTree = "<group>"; }; 65C35E9E12F0A834004811C2 /* uavobjecttemplate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uavobjecttemplate.c; sourceTree = "<group>"; };
65C35E9F12F0A834004811C2 /* uavobjectsinittemplate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uavobjectsinittemplate.c; sourceTree = "<group>"; }; 65C35E9F12F0A834004811C2 /* uavobjectsinittemplate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uavobjectsinittemplate.c; sourceTree = "<group>"; };
65C35EA012F0A834004811C2 /* uavobjectsinit_cc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uavobjectsinit_cc.c; sourceTree = "<group>"; }; 65C35EA012F0A834004811C2 /* uavobjectsinit_cc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uavobjectsinit_cc.c; sourceTree = "<group>"; };
@ -2846,15 +2764,13 @@
65C35EA612F0A834004811C2 /* uavobjecttemplate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uavobjecttemplate.h; sourceTree = "<group>"; }; 65C35EA612F0A834004811C2 /* uavobjecttemplate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uavobjecttemplate.h; sourceTree = "<group>"; };
65C35EA712F0A834004811C2 /* utlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utlist.h; sourceTree = "<group>"; }; 65C35EA712F0A834004811C2 /* utlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utlist.h; sourceTree = "<group>"; };
65C35EA812F0A834004811C2 /* eventdispatcher.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = eventdispatcher.c; sourceTree = "<group>"; }; 65C35EA812F0A834004811C2 /* eventdispatcher.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = eventdispatcher.c; sourceTree = "<group>"; };
65C35F6612F0DC2D004811C2 /* attitude.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = attitude.c; sourceTree = "<group>"; };
65C35F6812F0DC2D004811C2 /* attitude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = attitude.h; sourceTree = "<group>"; };
65D1FBD413F504C9006374A6 /* pios_hmc5883.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_hmc5883.h; sourceTree = "<group>"; }; 65D1FBD413F504C9006374A6 /* pios_hmc5883.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_hmc5883.h; sourceTree = "<group>"; };
65D1FBE713F53477006374A6 /* pios_bl_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_bl_helper.h; sourceTree = "<group>"; }; 65D1FBE713F53477006374A6 /* pios_bl_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_bl_helper.h; sourceTree = "<group>"; };
65D2CA841248F9A400B1E7D6 /* mixersettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixersettings.xml; sourceTree = "<group>"; }; 65D2CA841248F9A400B1E7D6 /* mixersettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixersettings.xml; sourceTree = "<group>"; };
65D2CA851248F9A400B1E7D6 /* mixerstatus.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixerstatus.xml; sourceTree = "<group>"; }; 65D2CA851248F9A400B1E7D6 /* mixerstatus.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixerstatus.xml; sourceTree = "<group>"; };
65DEA78513F0FE6000095B06 /* stm32f2xx_conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stm32f2xx_conf.h; sourceTree = "<group>"; }; 65DEA78513F0FE6000095B06 /* stm32f2xx_conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stm32f2xx_conf.h; sourceTree = "<group>"; };
65DEA78613F1118400095B06 /* pios_bma180.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_bma180.h; sourceTree = "<group>"; }; 65DEA78613F1118400095B06 /* pios_bma180.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_bma180.h; sourceTree = "<group>"; };
65E410AE12F65AEA00725888 /* attitudesettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = attitudesettings.xml; sourceTree = "<group>"; }; 65E466BC14E244020075459C /* uavobjectdefinition */ = {isa = PBXFileReference; lastKnownFileType = folder; path = uavobjectdefinition; sourceTree = "<group>"; };
65E6DF7112E02E8E00058553 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; }; 65E6DF7112E02E8E00058553 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
65E6DF7312E02E8E00058553 /* alarms.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alarms.c; sourceTree = "<group>"; }; 65E6DF7312E02E8E00058553 /* alarms.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alarms.c; sourceTree = "<group>"; };
65E6DF7412E02E8E00058553 /* coptercontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = coptercontrol.c; sourceTree = "<group>"; }; 65E6DF7412E02E8E00058553 /* coptercontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = coptercontrol.c; sourceTree = "<group>"; };
@ -2901,7 +2817,6 @@
65E6E09912E037C800058553 /* pios_adc_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_adc_priv.h; sourceTree = "<group>"; }; 65E6E09912E037C800058553 /* pios_adc_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_adc_priv.h; sourceTree = "<group>"; };
65E8C743139A6D0900E1F979 /* pios_crc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_crc.c; sourceTree = "<group>"; }; 65E8C743139A6D0900E1F979 /* pios_crc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_crc.c; sourceTree = "<group>"; };
65E8C745139A6D1A00E1F979 /* pios_crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_crc.h; sourceTree = "<group>"; }; 65E8C745139A6D1A00E1F979 /* pios_crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_crc.h; sourceTree = "<group>"; };
65E8C788139AA2A800E1F979 /* accessorydesired.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = accessorydesired.xml; sourceTree = "<group>"; };
65E8F03211EFF25C00BBF654 /* pios_com.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pios_com.c; path = ../../PiOS/Common/pios_com.c; sourceTree = SOURCE_ROOT; }; 65E8F03211EFF25C00BBF654 /* pios_com.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pios_com.c; path = ../../PiOS/Common/pios_com.c; sourceTree = SOURCE_ROOT; };
65E8F03311EFF25C00BBF654 /* pios_hmc5843.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pios_hmc5843.c; path = ../../PiOS/Common/pios_hmc5843.c; sourceTree = SOURCE_ROOT; }; 65E8F03311EFF25C00BBF654 /* pios_hmc5843.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pios_hmc5843.c; path = ../../PiOS/Common/pios_hmc5843.c; sourceTree = SOURCE_ROOT; };
65E8F03411EFF25C00BBF654 /* pios_opahrs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pios_opahrs.c; path = ../../PiOS/Common/pios_opahrs.c; sourceTree = SOURCE_ROOT; }; 65E8F03411EFF25C00BBF654 /* pios_opahrs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pios_opahrs.c; path = ../../PiOS/Common/pios_opahrs.c; sourceTree = SOURCE_ROOT; };
@ -3290,8 +3205,6 @@
65FA9B6F147078450019A260 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; }; 65FA9B6F147078450019A260 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
65FA9B70147078450019A260 /* pios_board.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_board.c; sourceTree = "<group>"; }; 65FA9B70147078450019A260 /* pios_board.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_board.c; sourceTree = "<group>"; };
65FA9B71147087020019A260 /* STM32F4xx_Revolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STM32F4xx_Revolution.h; sourceTree = "<group>"; }; 65FA9B71147087020019A260 /* STM32F4xx_Revolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STM32F4xx_Revolution.h; sourceTree = "<group>"; };
65FA9B77147095D40019A260 /* attitude.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = attitude.c; sourceTree = "<group>"; };
65FA9B79147095D40019A260 /* attitude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = attitude.h; sourceTree = "<group>"; };
65FA9B7B14709E9E0019A260 /* pios_board_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_board_info.h; sourceTree = "<group>"; }; 65FA9B7B14709E9E0019A260 /* pios_board_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_board_info.h; sourceTree = "<group>"; };
65FA9B7C14709E9E0019A260 /* pios_gcsrcvr_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_gcsrcvr_priv.h; sourceTree = "<group>"; }; 65FA9B7C14709E9E0019A260 /* pios_gcsrcvr_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_gcsrcvr_priv.h; sourceTree = "<group>"; };
65FA9B7D14709E9E0019A260 /* pios_hcsr04.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_hcsr04.h; sourceTree = "<group>"; }; 65FA9B7D14709E9E0019A260 /* pios_hcsr04.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_hcsr04.h; sourceTree = "<group>"; };
@ -3302,13 +3215,9 @@
65FA9B8314709E9E0019A260 /* pios_tim_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_tim_priv.h; sourceTree = "<group>"; }; 65FA9B8314709E9E0019A260 /* pios_tim_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_tim_priv.h; sourceTree = "<group>"; };
65FA9B8414709E9F0019A260 /* pios_tim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_tim.h; sourceTree = "<group>"; }; 65FA9B8414709E9F0019A260 /* pios_tim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_tim.h; sourceTree = "<group>"; };
65FA9B8514709E9F0019A260 /* pios_usb_hid_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_usb_hid_priv.h; sourceTree = "<group>"; }; 65FA9B8514709E9F0019A260 /* pios_usb_hid_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_usb_hid_priv.h; sourceTree = "<group>"; };
65FAA03F133B669400F6F5CD /* GTOP_BIN.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = GTOP_BIN.c; sourceTree = "<group>"; };
65FAB8CF147FFD76000FF8B2 /* receiveractivity.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = receiveractivity.xml; sourceTree = "<group>"; };
65FAB8FC1480DA19000FF8B2 /* pios_dsm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_dsm.c; sourceTree = "<group>"; }; 65FAB8FC1480DA19000FF8B2 /* pios_dsm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_dsm.c; sourceTree = "<group>"; };
65FAB8FD1480DA19000FF8B2 /* pios_pwm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_pwm.c; sourceTree = "<group>"; }; 65FAB8FD1480DA19000FF8B2 /* pios_pwm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_pwm.c; sourceTree = "<group>"; };
65FAB8FE1481A5C5000FF8B2 /* pios_rtc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_rtc.c; sourceTree = "<group>"; }; 65FAB8FE1481A5C5000FF8B2 /* pios_rtc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_rtc.c; sourceTree = "<group>"; };
65FAB9091482072E000FF8B2 /* altitude.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = altitude.c; sourceTree = "<group>"; };
65FAB90B1482072E000FF8B2 /* altitude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = altitude.h; sourceTree = "<group>"; };
65FB1E6614CDBE26009C52B9 /* pios_bma180.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_bma180.c; sourceTree = "<group>"; }; 65FB1E6614CDBE26009C52B9 /* pios_bma180.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_bma180.c; sourceTree = "<group>"; };
65FB1E6714CDBE26009C52B9 /* pios_bmp085.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_bmp085.c; sourceTree = "<group>"; }; 65FB1E6714CDBE26009C52B9 /* pios_bmp085.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_bmp085.c; sourceTree = "<group>"; };
65FB1E6814CDBE26009C52B9 /* pios_hmc5883.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_hmc5883.c; sourceTree = "<group>"; }; 65FB1E6814CDBE26009C52B9 /* pios_hmc5883.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_hmc5883.c; sourceTree = "<group>"; };
@ -3385,320 +3294,6 @@
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
650D8E1F12DFE16400D05CC9 /* Modules */ = {
isa = PBXGroup;
children = (
650D8E2012DFE16400D05CC9 /* Actuator */,
650D8E2412DFE16400D05CC9 /* AHRSComms */,
650D8E2812DFE16400D05CC9 /* Altitude */,
65C35F6512F0DC2D004811C2 /* Attitude */,
650D8E2E12DFE16400D05CC9 /* Battery */,
650D8E3212DFE16400D05CC9 /* Example */,
650D8E3B12DFE16400D05CC9 /* FirmwareIAP */,
650D8E3F12DFE16400D05CC9 /* FlightPlan */,
650D8E4712DFE16400D05CC9 /* GPS */,
650D8E4D12DFE16400D05CC9 /* Guidance */,
650D8E5112DFE16400D05CC9 /* ManualControl */,
650D8E5512DFE16400D05CC9 /* MK */,
650D8E5A12DFE16400D05CC9 /* Osd */,
65140DF81496927D00E01D11 /* Sensors */,
650D8E5D12DFE16400D05CC9 /* Stabilization */,
650D8E6112DFE16400D05CC9 /* System */,
650D8E6512DFE16400D05CC9 /* Telemetry */,
);
name = Modules;
path = ../../Modules;
sourceTree = SOURCE_ROOT;
};
650D8E2012DFE16400D05CC9 /* Actuator */ = {
isa = PBXGroup;
children = (
650D8E2112DFE16400D05CC9 /* actuator.c */,
650D8E2212DFE16400D05CC9 /* inc */,
);
path = Actuator;
sourceTree = "<group>";
};
650D8E2212DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E2312DFE16400D05CC9 /* actuator.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E2412DFE16400D05CC9 /* AHRSComms */ = {
isa = PBXGroup;
children = (
650D8E2512DFE16400D05CC9 /* ahrs_comms.c */,
650D8E2612DFE16400D05CC9 /* inc */,
);
path = AHRSComms;
sourceTree = "<group>";
};
650D8E2612DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E2712DFE16400D05CC9 /* ahrs_comms.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E2812DFE16400D05CC9 /* Altitude */ = {
isa = PBXGroup;
children = (
65FAB9081482072E000FF8B2 /* revolution */,
650D8E2912DFE16400D05CC9 /* altitude.c */,
650D8E2A12DFE16400D05CC9 /* inc */,
);
path = Altitude;
sourceTree = "<group>";
};
650D8E2A12DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E2B12DFE16400D05CC9 /* altitude.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E2E12DFE16400D05CC9 /* Battery */ = {
isa = PBXGroup;
children = (
650D8E2F12DFE16400D05CC9 /* battery.c */,
650D8E3012DFE16400D05CC9 /* inc */,
);
path = Battery;
sourceTree = "<group>";
};
650D8E3012DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E3112DFE16400D05CC9 /* battery.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E3212DFE16400D05CC9 /* Example */ = {
isa = PBXGroup;
children = (
650D8E3312DFE16400D05CC9 /* example.c */,
650D8E3412DFE16400D05CC9 /* examplemodevent.c */,
650D8E3512DFE16400D05CC9 /* examplemodperiodic.c */,
650D8E3612DFE16400D05CC9 /* examplemodthread.c */,
650D8E3712DFE16400D05CC9 /* inc */,
);
path = Example;
sourceTree = "<group>";
};
650D8E3712DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E3812DFE16400D05CC9 /* examplemodevent.h */,
650D8E3912DFE16400D05CC9 /* examplemodperiodic.h */,
650D8E3A12DFE16400D05CC9 /* examplemodthread.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E3B12DFE16400D05CC9 /* FirmwareIAP */ = {
isa = PBXGroup;
children = (
650D8E3C12DFE16400D05CC9 /* firmwareiap.c */,
650D8E3D12DFE16400D05CC9 /* inc */,
);
path = FirmwareIAP;
sourceTree = "<group>";
};
650D8E3D12DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E3E12DFE16400D05CC9 /* firmwareiap.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E3F12DFE16400D05CC9 /* FlightPlan */ = {
isa = PBXGroup;
children = (
650D8E4012DFE16400D05CC9 /* flightplan.c */,
650D8E4112DFE16400D05CC9 /* flightplans */,
650D8E4312DFE16400D05CC9 /* inc */,
650D8E4512DFE16400D05CC9 /* lib */,
);
path = FlightPlan;
sourceTree = "<group>";
};
650D8E4112DFE16400D05CC9 /* flightplans */ = {
isa = PBXGroup;
children = (
650D8E4212DFE16400D05CC9 /* test.py */,
);
path = flightplans;
sourceTree = "<group>";
};
650D8E4312DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E4412DFE16400D05CC9 /* flightplan.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E4512DFE16400D05CC9 /* lib */ = {
isa = PBXGroup;
children = (
650D8E4612DFE16400D05CC9 /* uavobjects.py */,
);
path = lib;
sourceTree = "<group>";
};
650D8E4712DFE16400D05CC9 /* GPS */ = {
isa = PBXGroup;
children = (
65FAA03F133B669400F6F5CD /* GTOP_BIN.c */,
650D8E4812DFE16400D05CC9 /* GPS.c */,
650D8E4912DFE16400D05CC9 /* inc */,
650D8E4C12DFE16400D05CC9 /* NMEA.c */,
);
path = GPS;
sourceTree = "<group>";
};
650D8E4912DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E4A12DFE16400D05CC9 /* GPS.h */,
650D8E4B12DFE16400D05CC9 /* NMEA.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E4D12DFE16400D05CC9 /* Guidance */ = {
isa = PBXGroup;
children = (
650D8E4E12DFE16400D05CC9 /* guidance.c */,
650D8E4F12DFE16400D05CC9 /* inc */,
);
path = Guidance;
sourceTree = "<group>";
};
650D8E4F12DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E5012DFE16400D05CC9 /* guidance.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E5112DFE16400D05CC9 /* ManualControl */ = {
isa = PBXGroup;
children = (
650D8E5212DFE16400D05CC9 /* inc */,
650D8E5412DFE16400D05CC9 /* manualcontrol.c */,
);
path = ManualControl;
sourceTree = "<group>";
};
650D8E5212DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E5312DFE16400D05CC9 /* manualcontrol.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E5512DFE16400D05CC9 /* MK */ = {
isa = PBXGroup;
children = (
650D8E5612DFE16400D05CC9 /* MKSerial */,
);
path = MK;
sourceTree = "<group>";
};
650D8E5612DFE16400D05CC9 /* MKSerial */ = {
isa = PBXGroup;
children = (
650D8E5712DFE16400D05CC9 /* inc */,
650D8E5912DFE16400D05CC9 /* MKSerial.c */,
);
path = MKSerial;
sourceTree = "<group>";
};
650D8E5712DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E5812DFE16400D05CC9 /* MkSerial.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E5A12DFE16400D05CC9 /* Osd */ = {
isa = PBXGroup;
children = (
650D8E5B12DFE16400D05CC9 /* OsdEtStd */,
);
path = Osd;
sourceTree = "<group>";
};
650D8E5B12DFE16400D05CC9 /* OsdEtStd */ = {
isa = PBXGroup;
children = (
650D8E5C12DFE16400D05CC9 /* OsdEtStd.c */,
);
path = OsdEtStd;
sourceTree = "<group>";
};
650D8E5D12DFE16400D05CC9 /* Stabilization */ = {
isa = PBXGroup;
children = (
650D8E5E12DFE16400D05CC9 /* inc */,
650D8E6012DFE16400D05CC9 /* stabilization.c */,
);
path = Stabilization;
sourceTree = "<group>";
};
650D8E5E12DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E5F12DFE16400D05CC9 /* stabilization.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E6112DFE16400D05CC9 /* System */ = {
isa = PBXGroup;
children = (
650D8E6212DFE16400D05CC9 /* inc */,
650D8E6412DFE16400D05CC9 /* systemmod.c */,
);
path = System;
sourceTree = "<group>";
};
650D8E6212DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E6312DFE16400D05CC9 /* systemmod.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E6512DFE16400D05CC9 /* Telemetry */ = {
isa = PBXGroup;
children = (
650D8E6612DFE16400D05CC9 /* inc */,
650D8E6812DFE16400D05CC9 /* telemetry.c */,
);
path = Telemetry;
sourceTree = "<group>";
};
650D8E6612DFE16400D05CC9 /* inc */ = {
isa = PBXGroup;
children = (
650D8E6712DFE16400D05CC9 /* telemetry.h */,
);
path = inc;
sourceTree = "<group>";
};
650D8E6A12DFE17500D05CC9 /* UAVObjects */ = { 650D8E6A12DFE17500D05CC9 /* UAVObjects */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -3731,23 +3326,6 @@
path = inc; path = inc;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
65140DF81496927D00E01D11 /* Sensors */ = {
isa = PBXGroup;
children = (
65140DF91496927D00E01D11 /* inc */,
65140DFB1496927D00E01D11 /* sensors.c */,
);
path = Sensors;
sourceTree = "<group>";
};
65140DF91496927D00E01D11 /* inc */ = {
isa = PBXGroup;
children = (
65140DFA1496927D00E01D11 /* sensors.h */,
);
path = inc;
sourceTree = "<group>";
};
652A445414D1169E00835B68 /* revolution */ = { 652A445414D1169E00835B68 /* revolution */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -3805,8 +3383,8 @@
65FF4BB313791C3300146BE4 /* Bootloaders */, 65FF4BB313791C3300146BE4 /* Bootloaders */,
65F93B9012EE09280047DB36 /* PipXtreme */, 65F93B9012EE09280047DB36 /* PipXtreme */,
65E6DF7012E02E8E00058553 /* CopterControl */, 65E6DF7012E02E8E00058553 /* CopterControl */,
650D8E1F12DFE16400D05CC9 /* Modules */,
657CEEB6121DBC63007A1FBE /* Libraries */, 657CEEB6121DBC63007A1FBE /* Libraries */,
652EF83814DF229C00C461BB /* Modules */,
65E8F02F11EFF25C00BBF654 /* PiOS */, 65E8F02F11EFF25C00BBF654 /* PiOS */,
65E6DF9012E0313E00058553 /* PipXtreme */, 65E6DF9012E0313E00058553 /* PipXtreme */,
650D8E6A12DFE17500D05CC9 /* UAVObjects */, 650D8E6A12DFE17500D05CC9 /* UAVObjects */,
@ -8243,65 +7821,12 @@
65C35E4E12EFB2F3004811C2 /* shared */ = { 65C35E4E12EFB2F3004811C2 /* shared */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
65C35E4F12EFB2F3004811C2 /* uavobjectdefinition */, 65E466BC14E244020075459C /* uavobjectdefinition */,
); );
name = shared; name = shared;
path = ../../../shared; path = ../../../shared;
sourceTree = SOURCE_ROOT; sourceTree = SOURCE_ROOT;
}; };
65C35E4F12EFB2F3004811C2 /* uavobjectdefinition */ = {
isa = PBXGroup;
children = (
65E8C788139AA2A800E1F979 /* accessorydesired.xml */,
65C35E5012EFB2F3004811C2 /* actuatorcommand.xml */,
65C35E5112EFB2F3004811C2 /* actuatordesired.xml */,
65C35E5212EFB2F3004811C2 /* actuatorsettings.xml */,
65C35E5312EFB2F3004811C2 /* ahrscalibration.xml */,
65C35E5412EFB2F3004811C2 /* ahrssettings.xml */,
65C35E5512EFB2F3004811C2 /* ahrsstatus.xml */,
65C35E5612EFB2F3004811C2 /* attitudeactual.xml */,
65C35E5812EFB2F3004811C2 /* attituderaw.xml */,
65E410AE12F65AEA00725888 /* attitudesettings.xml */,
65C35E5912EFB2F3004811C2 /* baroaltitude.xml */,
652C8568132B632A00BFCC70 /* firmwareiapobj.xml */,
65C35E5C12EFB2F3004811C2 /* flightbatterystate.xml */,
65C35E5D12EFB2F3004811C2 /* flightplancontrol.xml */,
65C35E5E12EFB2F3004811C2 /* flightplansettings.xml */,
65C35E5F12EFB2F3004811C2 /* flightplanstatus.xml */,
65C35E6012EFB2F3004811C2 /* flighttelemetrystats.xml */,
65078B09136FCEE600536549 /* flightstatus.xml */,
65C35E6112EFB2F3004811C2 /* gcstelemetrystats.xml */,
65C35E6212EFB2F3004811C2 /* gpsposition.xml */,
65C35E6312EFB2F3004811C2 /* gpssatellites.xml */,
65C35E6412EFB2F3004811C2 /* gpstime.xml */,
65C35E6512EFB2F3004811C2 /* guidancesettings.xml */,
65C35E6612EFB2F3004811C2 /* homelocation.xml */,
65C35E6712EFB2F3004811C2 /* i2cstats.xml */,
65C35E6812EFB2F3004811C2 /* manualcontrolcommand.xml */,
65C35E6912EFB2F3004811C2 /* manualcontrolsettings.xml */,
65C35E6A12EFB2F3004811C2 /* mixersettings.xml */,
65C35E6B12EFB2F3004811C2 /* mixerstatus.xml */,
65C35E6C12EFB2F3004811C2 /* nedaccel.xml */,
65C35E6D12EFB2F3004811C2 /* objectpersistence.xml */,
65C35E6E12EFB2F3004811C2 /* positionactual.xml */,
65C35E6F12EFB2F3004811C2 /* positiondesired.xml */,
65C35E7012EFB2F3004811C2 /* ratedesired.xml */,
65FAB8CF147FFD76000FF8B2 /* receiveractivity.xml */,
652C856A132B6EA600BFCC70 /* sonaraltitude.xml */,
6536D47B1307962C0042A298 /* stabilizationdesired.xml */,
65C35E7112EFB2F3004811C2 /* stabilizationsettings.xml */,
65C35E7212EFB2F3004811C2 /* systemalarms.xml */,
65C35E7312EFB2F3004811C2 /* systemsettings.xml */,
65C35E7412EFB2F3004811C2 /* systemstats.xml */,
65C35E7512EFB2F3004811C2 /* taskinfo.xml */,
65C35E7612EFB2F3004811C2 /* telemetrysettings.xml */,
65C35E7712EFB2F3004811C2 /* velocityactual.xml */,
65C35E7812EFB2F3004811C2 /* velocitydesired.xml */,
65C35E7912EFB2F3004811C2 /* watchdogstatus.xml */,
);
path = uavobjectdefinition;
sourceTree = "<group>";
};
65C35EA212F0A834004811C2 /* inc */ = { 65C35EA212F0A834004811C2 /* inc */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -8314,24 +7839,6 @@
path = inc; path = inc;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
65C35F6512F0DC2D004811C2 /* Attitude */ = {
isa = PBXGroup;
children = (
65FA9B76147095D40019A260 /* revolution */,
65C35F6612F0DC2D004811C2 /* attitude.c */,
65C35F6712F0DC2D004811C2 /* inc */,
);
path = Attitude;
sourceTree = "<group>";
};
65C35F6712F0DC2D004811C2 /* inc */ = {
isa = PBXGroup;
children = (
65C35F6812F0DC2D004811C2 /* attitude.h */,
);
path = inc;
sourceTree = "<group>";
};
65E6DF7012E02E8E00058553 /* CopterControl */ = { 65E6DF7012E02E8E00058553 /* CopterControl */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -9140,41 +8647,6 @@
path = inc; path = inc;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
65FA9B76147095D40019A260 /* revolution */ = {
isa = PBXGroup;
children = (
65FA9B77147095D40019A260 /* attitude.c */,
65FA9B78147095D40019A260 /* inc */,
);
path = revolution;
sourceTree = "<group>";
};
65FA9B78147095D40019A260 /* inc */ = {
isa = PBXGroup;
children = (
65FA9B79147095D40019A260 /* attitude.h */,
);
path = inc;
sourceTree = "<group>";
};
65FAB9081482072E000FF8B2 /* revolution */ = {
isa = PBXGroup;
children = (
65FAB9091482072E000FF8B2 /* altitude.c */,
65FAB90A1482072E000FF8B2 /* inc */,
);
name = revolution;
path = Revolution;
sourceTree = "<group>";
};
65FAB90A1482072E000FF8B2 /* inc */ = {
isa = PBXGroup;
children = (
65FAB90B1482072E000FF8B2 /* altitude.h */,
);
path = inc;
sourceTree = "<group>";
};
65FF4BB313791C3300146BE4 /* Bootloaders */ = { 65FF4BB313791C3300146BE4 /* Bootloaders */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (

View File

@ -49,7 +49,10 @@ endif
FLASH_TOOL = OPENOCD FLASH_TOOL = OPENOCD
# List of modules to include # List of modules to include
MODULES = Sensors Attitude/revolution ManualControl Stabilization Altitude/revolution Actuator GPS Telemetry FirmwareIAP MODULES = Sensors Attitude/revolution ManualControl Stabilization Altitude/revolution Actuator GPS FirmwareIAP AltitudeHold
MODULES += CameraStab
MODULES += Telemetry
MODULES += OveroSync
PYMODULES = PYMODULES =
#FlightPlan #FlightPlan
@ -251,8 +254,8 @@ endif
# common architecture-specific flags from the device-specific library makefile # common architecture-specific flags from the device-specific library makefile
CFLAGS += $(ARCHFLAGS) CFLAGS += $(ARCHFLAGS)
CFLAGS += -DDIAGNOSTICS CFLAGS += -DDIAGNOSTICS
CFLAGS += -DDIAG_TASKS
# This is not the best place for these. Really should abstract out # This is not the best place for these. Really should abstract out
# to the board file or something # to the board file or something
@ -271,7 +274,7 @@ DEBUGF = dwarf-2
# Place project-specific -D (define) and/or # Place project-specific -D (define) and/or
# -U options for C here. # -U options for C here.
CDEFS += -DSTM32F10X_$(MODEL) CDEFS += -DHSE_VALUE=$(OSCILLATOR_FREQ)
CDEFS += -DSYSCLK_FREQ=$(SYSCLK_FREQ) CDEFS += -DSYSCLK_FREQ=$(SYSCLK_FREQ)
CDEFS += -DUSE_STDPERIPH_DRIVER CDEFS += -DUSE_STDPERIPH_DRIVER
CDEFS += -DUSE_$(BOARD) CDEFS += -DUSE_$(BOARD)
@ -417,7 +420,7 @@ $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION))) $(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
# Add jtag targets (program and wipe) # Add jtag targets (program and wipe)
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE),$(OPENOCD_CONFIG))) $(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE),$(OPENOCD_JTAG_CONFIG),$(OPENOCD_CONFIG)))
.PHONY: elf lss sym hex bin bino opfw .PHONY: elf lss sym hex bin bino opfw
elf: $(OUTDIR)/$(TARGET).elf elf: $(OUTDIR)/$(TARGET).elf

View File

@ -71,7 +71,7 @@
#define PIOS_INCLUDE_COM_TELEM #define PIOS_INCLUDE_COM_TELEM
//#define PIOS_INCLUDE_COM_AUX //#define PIOS_INCLUDE_COM_AUX
#define PIOS_INCLUDE_GPS #define PIOS_INCLUDE_GPS
#define PIOS_OVERO_SPI
/* Supported receiver interfaces */ /* Supported receiver interfaces */
#define PIOS_INCLUDE_RCVR #define PIOS_INCLUDE_RCVR
#define PIOS_INCLUDE_DSM #define PIOS_INCLUDE_DSM
@ -105,6 +105,8 @@
// This actually needs calibrating // This actually needs calibrating
#define IDLE_COUNTS_PER_SEC_AT_NO_LOAD (8379692) #define IDLE_COUNTS_PER_SEC_AT_NO_LOAD (8379692)
#define REVOLUTION
#endif /* PIOS_CONFIG_H */ #endif /* PIOS_CONFIG_H */
/** /**
* @} * @}

View File

@ -299,6 +299,13 @@ void PIOS_Board_Init(void) {
#endif #endif
PIOS_FLASHFS_Init(&flashfs_m25p_cfg); PIOS_FLASHFS_Init(&flashfs_m25p_cfg);
#if defined(PIOS_OVERO_SPI)
/* Set up the SPI interface to the gyro */
if (PIOS_SPI_Init(&pios_spi_overo_id, &pios_spi_overo_cfg)) {
PIOS_DEBUG_Assert(0);
}
#endif
/* Initialize UAVObject libraries */ /* Initialize UAVObject libraries */
EventDispatcherInitialize(); EventDispatcherInitialize();
UAVObjInitialize(); UAVObjInitialize();
@ -326,6 +333,18 @@ void PIOS_Board_Init(void) {
PIOS_TIM_InitClock(&tim_11_cfg); PIOS_TIM_InitClock(&tim_11_cfg);
/* IAP System Setup */ /* IAP System Setup */
PIOS_IAP_Init();
uint16_t boot_count = PIOS_IAP_ReadBootCount();
if (boot_count < 3) {
PIOS_IAP_WriteBootCount(++boot_count);
AlarmsClear(SYSTEMALARMS_ALARM_BOOTFAULT);
} else {
/* Too many failed boot attempts, force hwsettings to defaults */
HwSettingsSetDefaults(HwSettingsHandle(), 0);
AlarmsSet(SYSTEMALARMS_ALARM_BOOTFAULT, SYSTEMALARMS_ALARM_CRITICAL);
}
//PIOS_IAP_Init(); //PIOS_IAP_Init();
#if defined(PIOS_INCLUDE_USB) #if defined(PIOS_INCLUDE_USB)
@ -462,7 +481,7 @@ void PIOS_Board_Init(void) {
#if defined(PIOS_INCLUDE_GPS) #if defined(PIOS_INCLUDE_GPS)
uint32_t pios_usart_gps_id; uint32_t pios_usart_gps_id;
if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_telem_main_cfg)) { if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_cfg)) {
PIOS_Assert(0); PIOS_Assert(0);
} }
@ -473,7 +492,6 @@ void PIOS_Board_Init(void) {
NULL, 0)) { NULL, 0)) {
PIOS_Assert(0); PIOS_Assert(0);
} }
#endif /* PIOS_INCLUDE_GPS */ #endif /* PIOS_INCLUDE_GPS */
#if defined(PIOS_INCLUDE_COM_AUX) #if defined(PIOS_INCLUDE_COM_AUX)
@ -503,7 +521,7 @@ void PIOS_Board_Init(void) {
#if defined(PIOS_INCLUDE_COM_TELEM) #if defined(PIOS_INCLUDE_COM_TELEM)
{ /* Eventually add switch for this port function */ { /* Eventually add switch for this port function */
uint32_t pios_usart_telem_rf_id; uint32_t pios_usart_telem_rf_id;
if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_gps_cfg)) { if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_main_cfg)) {
PIOS_Assert(0); PIOS_Assert(0);
} }

View File

@ -28,6 +28,7 @@ UAVOBJSRCFILENAMES += accessorydesired
UAVOBJSRCFILENAMES += actuatorcommand UAVOBJSRCFILENAMES += actuatorcommand
UAVOBJSRCFILENAMES += actuatordesired UAVOBJSRCFILENAMES += actuatordesired
UAVOBJSRCFILENAMES += actuatorsettings UAVOBJSRCFILENAMES += actuatorsettings
UAVOBJSRCFILENAMES += altholdsmoothed
UAVOBJSRCFILENAMES += attitudesettings UAVOBJSRCFILENAMES += attitudesettings
UAVOBJSRCFILENAMES += attitudeactual UAVOBJSRCFILENAMES += attitudeactual
UAVOBJSRCFILENAMES += gyros UAVOBJSRCFILENAMES += gyros
@ -55,6 +56,7 @@ UAVOBJSRCFILENAMES += mixersettings
UAVOBJSRCFILENAMES += mixerstatus UAVOBJSRCFILENAMES += mixerstatus
UAVOBJSRCFILENAMES += nedaccel UAVOBJSRCFILENAMES += nedaccel
UAVOBJSRCFILENAMES += objectpersistence UAVOBJSRCFILENAMES += objectpersistence
UAVOBJSRCFILENAMES += overosyncstats
UAVOBJSRCFILENAMES += positionactual UAVOBJSRCFILENAMES += positionactual
UAVOBJSRCFILENAMES += positiondesired UAVOBJSRCFILENAMES += positiondesired
UAVOBJSRCFILENAMES += ratedesired UAVOBJSRCFILENAMES += ratedesired
@ -74,6 +76,8 @@ UAVOBJSRCFILENAMES += hwsettings
UAVOBJSRCFILENAMES += receiveractivity UAVOBJSRCFILENAMES += receiveractivity
UAVOBJSRCFILENAMES += cameradesired UAVOBJSRCFILENAMES += cameradesired
UAVOBJSRCFILENAMES += camerastabsettings UAVOBJSRCFILENAMES += camerastabsettings
UAVOBJSRCFILENAMES += altitudeholdsettings
UAVOBJSRCFILENAMES += altitudeholddesired
UAVOBJSRC = $(foreach UAVOBJSRCFILE,$(UAVOBJSRCFILENAMES),$(UAVOBJSYNTHDIR)/$(UAVOBJSRCFILE).c ) UAVOBJSRC = $(foreach UAVOBJSRCFILE,$(UAVOBJSRCFILENAMES),$(UAVOBJSYNTHDIR)/$(UAVOBJSRCFILE).c )
UAVOBJDEFINE = $(foreach UAVOBJSRCFILE,$(UAVOBJSRCFILENAMES),-DUAVOBJ_INIT_$(UAVOBJSRCFILE) ) UAVOBJDEFINE = $(foreach UAVOBJSRCFILE,$(UAVOBJSRCFILENAMES),-DUAVOBJ_INIT_$(UAVOBJSRCFILE) )

View File

@ -324,7 +324,7 @@ void PIOS_SPI_gyro_irq_handler(void)
*/ */
void PIOS_SPI_flash_irq_handler(void); void PIOS_SPI_flash_irq_handler(void);
void DMA1_Stream0_IRQHandler(void) __attribute__((alias("PIOS_SPI_flash_irq_handler"))); void DMA1_Stream0_IRQHandler(void) __attribute__((alias("PIOS_SPI_flash_irq_handler")));
void DMA1_Stream2_IRQHandler(void) __attribute__((alias("PIOS_SPI_flash_irq_handler"))); void DMA1_Stream5_IRQHandler(void) __attribute__((alias("PIOS_SPI_flash_irq_handler")));
static const struct pios_spi_cfg pios_spi_flash_cfg = { static const struct pios_spi_cfg pios_spi_flash_cfg = {
.regs = SPI3, .regs = SPI3,
.remap = GPIO_AF_SPI3, .remap = GPIO_AF_SPI3,
@ -343,7 +343,7 @@ static const struct pios_spi_cfg pios_spi_flash_cfg = {
.dma = { .dma = {
.irq = { .irq = {
// Note this is the stream ID that triggers interrupts (in this case RX) // Note this is the stream ID that triggers interrupts (in this case RX)
.flags = (DMA_IT_TCIF3 | DMA_IT_TEIF3 | DMA_IT_HTIF3), .flags = (DMA_IT_TCIF0 | DMA_IT_TEIF0 | DMA_IT_HTIF0),
.init = { .init = {
.NVIC_IRQChannel = DMA1_Stream0_IRQn, .NVIC_IRQChannel = DMA1_Stream0_IRQn,
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH, .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
@ -372,7 +372,7 @@ static const struct pios_spi_cfg pios_spi_flash_cfg = {
}, },
}, },
.tx = { .tx = {
.channel = DMA1_Stream2, .channel = DMA1_Stream5,
.init = { .init = {
.DMA_Channel = DMA_Channel_0, .DMA_Channel = DMA_Channel_0,
.DMA_PeripheralBaseAddr = (uint32_t) & (SPI3->DR), .DMA_PeripheralBaseAddr = (uint32_t) & (SPI3->DR),
@ -440,6 +440,132 @@ void PIOS_SPI_flash_irq_handler(void)
PIOS_SPI_IRQ_Handler(pios_spi_flash_id); PIOS_SPI_IRQ_Handler(pios_spi_flash_id);
} }
#endif /* PIOS_FLASH_ON_ACCEL */ #endif /* PIOS_FLASH_ON_ACCEL */
#if defined(PIOS_OVERO_SPI)
/* SPI3 Interface
* - Used for flash communications
*/
void PIOS_SPI_overo_irq_handler(void);
void DMA1_Stream0_IRQHandler(void) __attribute__((alias("PIOS_SPI_overo_irq_handler")));
void DMA1_Stream7_IRQHandler(void) __attribute__((alias("PIOS_SPI_overo_irq_handler")));
static const struct pios_spi_cfg pios_spi_overo_cfg = {
.regs = SPI3,
.remap = GPIO_AF_SPI3,
.init = {
.SPI_Mode = SPI_Mode_Slave,
.SPI_Direction = SPI_Direction_2Lines_FullDuplex,
.SPI_DataSize = SPI_DataSize_8b,
.SPI_NSS = SPI_NSS_Hard,
.SPI_FirstBit = SPI_FirstBit_MSB,
.SPI_CRCPolynomial = 7,
.SPI_CPOL = SPI_CPOL_High,
.SPI_CPHA = SPI_CPHA_2Edge,
.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2,
},
.use_crc = false,
.dma = {
.irq = {
// Note this is the stream ID that triggers interrupts (in this case RX)
.flags = (DMA_IT_TCIF0 | DMA_IT_TEIF0 | DMA_IT_HTIF0),
.init = {
.NVIC_IRQChannel = DMA1_Stream0_IRQn,
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
.NVIC_IRQChannelSubPriority = 0,
.NVIC_IRQChannelCmd = ENABLE,
},
},
.rx = {
.channel = DMA1_Stream0,
.init = {
.DMA_Channel = DMA_Channel_0,
.DMA_PeripheralBaseAddr = (uint32_t) & (SPI3->DR),
.DMA_DIR = DMA_DIR_PeripheralToMemory,
.DMA_PeripheralInc = DMA_PeripheralInc_Disable,
.DMA_MemoryInc = DMA_MemoryInc_Enable,
.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte,
.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte,
.DMA_Mode = DMA_Mode_Normal,
.DMA_Priority = DMA_Priority_Medium,
//TODO: Enable FIFO
.DMA_FIFOMode = DMA_FIFOMode_Disable,
.DMA_FIFOThreshold = DMA_FIFOThreshold_Full,
.DMA_MemoryBurst = DMA_MemoryBurst_Single,
.DMA_PeripheralBurst = DMA_PeripheralBurst_Single,
},
},
.tx = {
.channel = DMA1_Stream7,
.init = {
.DMA_Channel = DMA_Channel_0,
.DMA_PeripheralBaseAddr = (uint32_t) & (SPI3->DR),
.DMA_DIR = DMA_DIR_MemoryToPeripheral,
.DMA_PeripheralInc = DMA_PeripheralInc_Disable,
.DMA_MemoryInc = DMA_MemoryInc_Enable,
.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte,
.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte,
.DMA_Mode = DMA_Mode_Normal,
.DMA_Priority = DMA_Priority_Medium,
.DMA_FIFOMode = DMA_FIFOMode_Disable,
.DMA_FIFOThreshold = DMA_FIFOThreshold_Full,
.DMA_MemoryBurst = DMA_MemoryBurst_Single,
.DMA_PeripheralBurst = DMA_PeripheralBurst_Single,
},
},
},
.sclk = {
.gpio = GPIOC,
.init = {
.GPIO_Pin = GPIO_Pin_10,
.GPIO_Speed = GPIO_Speed_100MHz,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_OType = GPIO_OType_PP,
.GPIO_PuPd = GPIO_PuPd_NOPULL
},
},
.miso = {
.gpio = GPIOC,
.init = {
.GPIO_Pin = GPIO_Pin_11,
.GPIO_Speed = GPIO_Speed_50MHz,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_OType = GPIO_OType_PP,
.GPIO_PuPd = GPIO_PuPd_NOPULL
},
},
.mosi = {
.gpio = GPIOC,
.init = {
.GPIO_Pin = GPIO_Pin_12,
.GPIO_Speed = GPIO_Speed_50MHz,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_OType = GPIO_OType_PP,
.GPIO_PuPd = GPIO_PuPd_NOPULL
},
},
.slave_count = 1,
.ssel = { {
.gpio = GPIOA,
.init = {
.GPIO_Pin = GPIO_Pin_15,
.GPIO_Speed = GPIO_Speed_50MHz,
.GPIO_Mode = GPIO_Mode_OUT,
.GPIO_OType = GPIO_OType_PP,
.GPIO_PuPd = GPIO_PuPd_UP
},
} },
};
uint32_t pios_spi_overo_id;
void PIOS_SPI_overo_irq_handler(void)
{
/* Call into the generic code to handle the IRQ for this specific device */
PIOS_SPI_IRQ_Handler(pios_spi_overo_id);
}
#else
uint32_t pios_spi_overo_id = 0;
#endif /* PIOS_OVERO_SPI */
#endif /* PIOS_INCLUDE_SPI */ #endif /* PIOS_INCLUDE_SPI */
@ -1129,22 +1255,6 @@ static const struct pios_tim_channel pios_tim_servoport_all_pins[] = {
}, },
.remap = GPIO_AF_TIM9, .remap = GPIO_AF_TIM9,
}, },
{
.timer = TIM10,
.timer_chan = TIM_Channel_1,
.pin = {
.gpio = GPIOB,
.init = {
.GPIO_Pin = GPIO_Pin_8,
.GPIO_Speed = GPIO_Speed_2MHz,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_OType = GPIO_OType_PP,
.GPIO_PuPd = GPIO_PuPd_UP
},
.pin_source = GPIO_PinSource8,
},
.remap = GPIO_AF_TIM10,
},
{ {
.timer = TIM11, .timer = TIM11,
.timer_chan = TIM_Channel_1, .timer_chan = TIM_Channel_1,
@ -1161,6 +1271,22 @@ static const struct pios_tim_channel pios_tim_servoport_all_pins[] = {
}, },
.remap = GPIO_AF_TIM11, .remap = GPIO_AF_TIM11,
}, },
{
.timer = TIM10,
.timer_chan = TIM_Channel_1,
.pin = {
.gpio = GPIOB,
.init = {
.GPIO_Pin = GPIO_Pin_8,
.GPIO_Speed = GPIO_Speed_2MHz,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_OType = GPIO_OType_PP,
.GPIO_PuPd = GPIO_PuPd_UP
},
.pin_source = GPIO_PinSource8,
},
.remap = GPIO_AF_TIM10,
},
{ {
.timer = TIM5, .timer = TIM5,
.timer_chan = TIM_Channel_3, .timer_chan = TIM_Channel_3,

View File

@ -19,7 +19,10 @@ equals(copydata, 1) {
QtSql4.dll \ QtSql4.dll \
QtSvg4.dll \ QtSvg4.dll \
QtTest4.dll \ QtTest4.dll \
QtXml4.dll QtXml4.dll \
QtDeclarative4.dll \
QtXmlPatterns4.dll \
QtScript4.dll
for(dll, QT_DLLS) { for(dll, QT_DLLS) {
data_copy.commands += $(COPY_FILE) $$targetPath(\"$$[QT_INSTALL_BINS]/$$dll\") $$targetPath(\"$$GCS_APP_PATH/$$dll\") $$addNewline() data_copy.commands += $(COPY_FILE) $$targetPath(\"$$[QT_INSTALL_BINS]/$$dll\") $$targetPath(\"$$GCS_APP_PATH/$$dll\") $$addNewline()
} }

View File

@ -14,8 +14,8 @@
height="80.827866" height="80.827866"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.48.0 r9654" inkscape:version="0.48.2 r9819"
sodipodi:docname="arm-status.svg" sodipodi:docname="arm-status-new.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
inkscape:export-ydpi="103.61" inkscape:export-ydpi="103.61"
@ -1224,6 +1224,82 @@
id="linearGradient3339" id="linearGradient3339"
xlink:href="#linearGradient5128-0-5" xlink:href="#linearGradient5128-0-5"
inkscape:collect="always" /> inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3"
id="linearGradient4033"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
id="linearGradient3285-6-3"
inkscape:collect="always">
<stop
id="stop3287-9-8"
offset="0"
style="stop-color:#333333;stop-opacity:1" />
<stop
id="stop3289-8-2"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2"
id="linearGradient4035"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
id="linearGradient3259-9-2">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3261-8-7" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3263-3-5" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8"
id="linearGradient4037"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="298.43829"
y1="368.20679"
x2="300.36011"
y2="506.89417" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3966"
xlink:href="#linearGradient3790-4-8"
inkscape:collect="always" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -1233,15 +1309,15 @@
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1.979899" inkscape:zoom="1.979899"
inkscape:cx="69.908261" inkscape:cx="75.4641"
inkscape:cy="99.737699" inkscape:cy="94.18186"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="background" inkscape:current-layer="background"
showgrid="false" showgrid="false"
inkscape:window-width="1366" inkscape:window-width="1600"
inkscape:window-height="691" inkscape:window-height="823"
inkscape:window-x="0" inkscape:window-x="-9"
inkscape:window-y="24" inkscape:window-y="-9"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -1257,7 +1333,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title /> <dc:title></dc:title>
<dc:creator> <dc:creator>
<cc:Agent> <cc:Agent>
<dc:title>Edouard Lafargue</dc:title> <dc:title>Edouard Lafargue</dc:title>
@ -1275,17 +1351,34 @@
<g <g
id="background" id="background"
inkscape:label="#g8543"> inkscape:label="#g8543">
<rect <g
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:3.36186838;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" transform="matrix(0.79280486,0,0,0.72374721,322.67019,100.52996)"
id="rect2936" id="g4023"
width="225.91589" style="display:inline">
height="77.465996" <rect
x="207.54964" style="fill:url(#linearGradient4033);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
y="333.1326" id="rect4025"
ry="5.7166986" width="289.19211"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" height="111.67988"
inkscape:export-xdpi="88.809998" x="-147.32065"
inkscape:export-ydpi="88.809998" /> y="319.06393"
ry="17.712246" />
<path
style="fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m -130.38957,321.09916 c -10.40328,0.13552 -16.79656,11.11379 -14.9375,20.75 0.24853,24.79185 -0.48485,49.65785 0.34375,74.40625 1.69659,9.71009 12.36903,14.16124 21.4375,12.5 83.37176,-0.12573 166.769249,0.25097 250.125,-0.1875 9.57786,-1.24954 15.0045,-11.39003 13.28125,-20.53125 -0.32065,-25.06939 0.63636,-50.246 -0.46875,-75.25 -1.99885,-8.70345 -11.6919,-13.22175 -20.28125,-11.71875 -83.166451,0.0209 -166.33459,-0.0417 -249.5,0.0312 z"
id="path4027"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient4035);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m -130.38957,321.09916 c -10.40328,0.13552 -16.79656,11.11379 -14.9375,20.75 0.24853,24.79185 -0.48485,49.65785 0.34375,74.40625 1.69659,9.71009 12.36903,14.16124 21.4375,12.5 83.37176,-0.12573 166.769248,0.25097 250.125,-0.1875 9.57786,-1.24954 15.0045,-11.39003 13.28125,-20.53125 -0.32065,-25.06939 0.63636,-50.246 -0.46875,-75.25 -1.99885,-8.70345 -11.6919,-13.22175 -20.28125,-11.71875 -83.166452,0.0209 -166.33459,-0.0417 -249.5,0.0312 z"
id="path4029"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient3966);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m -129.60832,319.06791 c -9.81258,0 -17.71875,7.90617 -17.71875,17.71875 l 0,7.46875 c 21.91332,13.37842 82.3034,23 153.4062474,23 56.8274986,0 106.8063826,-6.14199 135.7812526,-15.4375 l 0,-15.03125 c 0,-9.81258 -7.87492,-17.71875 -17.6875,-17.71875 l -253.78125,0 z"
id="path4031"
inkscape:connector-curvature="0" />
</g>
<rect <rect
inkscape:label="#rect4388" inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -1297,7 +1390,7 @@
height="64.785042" height="64.785042"
width="205.45833" width="205.45833"
id="bargraph" id="bargraph"
style="fill:#332d2d;fill-opacity:1;stroke:none" /> style="fill:none;fill-opacity:1;stroke:none" />
<g <g
transform="translate(215.8687,364.87409)" transform="translate(215.8687,364.87409)"
style="font-size:40px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:40px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
@ -1305,15 +1398,18 @@
<path <path
d="m 42.801897,15.332331 -10.582031,0 -1.669922,4.78125 -6.802734,0 9.720703,-26.2441409 8.068359,0 9.720703,26.2441409 -6.802734,0 -1.652344,-4.78125 m -8.894531,-4.869141 7.189453,0 L 37.510881,0.02178383 33.907366,10.46319" d="m 42.801897,15.332331 -10.582031,0 -1.669922,4.78125 -6.802734,0 9.720703,-26.2441409 8.068359,0 9.720703,26.2441409 -6.802734,0 -1.652344,-4.78125 m -8.894531,-4.869141 7.189453,0 L 37.510881,0.02178383 33.907366,10.46319"
style="font-size:36px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Andale Mono Bold" style="font-size:36px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Andale Mono Bold"
id="path3380" /> id="path3380"
inkscape:connector-curvature="0" />
<path <path
d="m 64.3351,5.5061588 c 1.417955,1.46e-5 2.431625,-0.263657 3.041016,-0.7910156 C 67.997193,4.1878154 68.30774,3.3206287 68.307756,2.1135807 68.30774,0.9182874 67.997193,0.0628195 67.376116,-0.45282555 66.766725,-0.96842946 65.753055,-1.2262417 64.3351,-1.226263 l -2.847656,0 0,6.7324218 2.847656,0 m -2.847656,4.6757812 0,9.931641 -6.767578,0 0,-26.2441409 10.335937,0 c 3.457014,2.62e-5 5.988262,0.5801038 7.59375,1.7402344 1.617165,1.1601795 2.425758,2.9941621 2.425782,5.5019531 -2.4e-5,1.7343922 -0.421899,3.1582189 -1.265625,4.2714844 -0.832053,1.1132948 -2.091818,1.9336065 -3.779297,2.4609375 0.925761,0.2109495 1.751932,0.6914178 2.478515,1.4414062 0.73826,0.7382913 1.4824,1.8632903 2.232422,3.3750003 l 3.673828,7.453125 -7.207031,0 -3.199219,-6.521485 C 67.364381,12.279604 66.708132,11.383121 66.040178,10.902643 65.383914,10.422184 64.505009,10.18195 63.40346,10.18194 l -1.916016,0" d="m 64.3351,5.5061588 c 1.417955,1.46e-5 2.431625,-0.263657 3.041016,-0.7910156 C 67.997193,4.1878154 68.30774,3.3206287 68.307756,2.1135807 68.30774,0.9182874 67.997193,0.0628195 67.376116,-0.45282555 66.766725,-0.96842946 65.753055,-1.2262417 64.3351,-1.226263 l -2.847656,0 0,6.7324218 2.847656,0 m -2.847656,4.6757812 0,9.931641 -6.767578,0 0,-26.2441409 10.335937,0 c 3.457014,2.62e-5 5.988262,0.5801038 7.59375,1.7402344 1.617165,1.1601795 2.425758,2.9941621 2.425782,5.5019531 -2.4e-5,1.7343922 -0.421899,3.1582189 -1.265625,4.2714844 -0.832053,1.1132948 -2.091818,1.9336065 -3.779297,2.4609375 0.925761,0.2109495 1.751932,0.6914178 2.478515,1.4414062 0.73826,0.7382913 1.4824,1.8632903 2.232422,3.3750003 l 3.673828,7.453125 -7.207031,0 -3.199219,-6.521485 C 67.364381,12.279604 66.708132,11.383121 66.040178,10.902643 65.383914,10.422184 64.505009,10.18195 63.40346,10.18194 l -1.916016,0"
style="font-size:36px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Andale Mono Bold" style="font-size:36px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Andale Mono Bold"
id="path3382" /> id="path3382"
inkscape:connector-curvature="0" />
<path <path
d="m 82.422991,-6.1305599 8.613281,0 5.976563,14.0449219 6.011715,-14.0449219 8.59571,0 0,26.2441409 -6.39844,0 0,-19.1953128 -6.046876,14.1503908 -4.289063,0 -6.046875,-14.1503908 0,19.1953128 -6.416015,0 0,-26.2441409" d="m 82.422991,-6.1305599 8.613281,0 5.976563,14.0449219 6.011715,-14.0449219 8.59571,0 0,26.2441409 -6.39844,0 0,-19.1953128 -6.046876,14.1503908 -4.289063,0 -6.046875,-14.1503908 0,19.1953128 -6.416015,0 0,-26.2441409"
style="font-size:36px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Andale Mono Bold" style="font-size:36px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Andale Mono Bold"
id="path3384" /> id="path3384"
inkscape:connector-curvature="0" />
</g> </g>
</g> </g>
</g> </g>

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -14,8 +14,8 @@
height="80.827866" height="80.827866"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.48.1 r9760" inkscape:version="0.48.2 r9819"
sodipodi:docname="flightmode-status.svg" sodipodi:docname="flightmode-status-new.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
inkscape:export-ydpi="103.61" inkscape:export-ydpi="103.61"
@ -1037,6 +1037,82 @@
fx="29.77438" fx="29.77438"
fy="7.0922189" fy="7.0922189"
r="25.380436" /> r="25.380436" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3"
id="linearGradient4033"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
id="linearGradient3285-6-3"
inkscape:collect="always">
<stop
id="stop3287-9-8"
offset="0"
style="stop-color:#333333;stop-opacity:1" />
<stop
id="stop3289-8-2"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2"
id="linearGradient4035"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
id="linearGradient3259-9-2">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3261-8-7" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3263-3-5" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3966"
xlink:href="#linearGradient3790-4-8"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3302"
xlink:href="#linearGradient3790-4-8"
inkscape:collect="always" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -1049,12 +1125,12 @@
inkscape:cx="-7.1957738" inkscape:cx="-7.1957738"
inkscape:cy="90.710362" inkscape:cy="90.710362"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="background"
showgrid="false" showgrid="false"
inkscape:window-width="1366" inkscape:window-width="1600"
inkscape:window-height="691" inkscape:window-height="823"
inkscape:window-x="0" inkscape:window-x="-9"
inkscape:window-y="24" inkscape:window-y="-9"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -1070,7 +1146,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title /> <dc:title></dc:title>
<dc:creator> <dc:creator>
<cc:Agent> <cc:Agent>
<dc:title>Edouard Lafargue</dc:title> <dc:title>Edouard Lafargue</dc:title>
@ -1088,17 +1164,34 @@
<g <g
id="background" id="background"
inkscape:label="#g8543"> inkscape:label="#g8543">
<rect <g
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:3.36186838;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" transform="matrix(0.79280486,0,0,0.72374721,322.67019,100.52996)"
id="rect2936" id="g4023"
width="225.91589" style="display:inline">
height="77.465996" <rect
x="207.54964" style="fill:url(#linearGradient4033);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
y="333.1326" id="rect4025"
ry="5.7166986" width="289.19211"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" height="111.67988"
inkscape:export-xdpi="88.809998" x="-147.32065"
inkscape:export-ydpi="88.809998" /> y="319.06393"
ry="17.712246" />
<path
style="fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m -130.38957,321.09916 c -10.40328,0.13552 -16.79656,11.11379 -14.9375,20.75 0.24853,24.79185 -0.48485,49.65785 0.34375,74.40625 1.69659,9.71009 12.36903,14.16124 21.4375,12.5 83.37176,-0.12573 166.769249,0.25097 250.125,-0.1875 9.57786,-1.24954 15.0045,-11.39003 13.28125,-20.53125 -0.32065,-25.06939 0.63636,-50.246 -0.46875,-75.25 -1.99885,-8.70345 -11.6919,-13.22175 -20.28125,-11.71875 -83.166451,0.0209 -166.33459,-0.0417 -249.5,0.0312 z"
id="path4027"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient4035);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m -130.38957,321.09916 c -10.40328,0.13552 -16.79656,11.11379 -14.9375,20.75 0.24853,24.79185 -0.48485,49.65785 0.34375,74.40625 1.69659,9.71009 12.36903,14.16124 21.4375,12.5 83.37176,-0.12573 166.769248,0.25097 250.125,-0.1875 9.57786,-1.24954 15.0045,-11.39003 13.28125,-20.53125 -0.32065,-25.06939 0.63636,-50.246 -0.46875,-75.25 -1.99885,-8.70345 -11.6919,-13.22175 -20.28125,-11.71875 -83.166452,0.0209 -166.33459,-0.0417 -249.5,0.0312 z"
id="path4029"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient3302);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m -129.60832,319.06791 c -9.81258,0 -17.71875,7.90617 -17.71875,17.71875 l 0,7.46875 c 21.91332,13.37842 82.3034,23 153.4062474,23 56.8274986,0 106.8063826,-6.14199 135.7812526,-15.4375 l 0,-15.03125 c 0,-9.81258 -7.87492,-17.71875 -17.6875,-17.71875 l -253.78125,0 z"
id="path4031"
inkscape:connector-curvature="0" />
</g>
<rect <rect
inkscape:label="#rect4388" inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -1110,7 +1203,7 @@
height="64.785042" height="64.785042"
width="205.45833" width="205.45833"
id="bargraph" id="bargraph"
style="fill:#332d2d;fill-opacity:1;stroke:none" /> style="fill:none;fill-opacity:1;stroke:none" />
<text <text
xml:space="preserve" xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
@ -1128,7 +1221,8 @@
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1" id="layer1"
inkscape:label="Status-Symbol" inkscape:label="Status-Symbol"
style="display:inline"> style="display:none"
sodipodi:insensitive="true">
<g <g
transform="matrix(2.0683135,0,0,2.0683135,-162.1788,206.61155)" transform="matrix(2.0683135,0,0,2.0683135,-162.1788,206.61155)"
inkscape:label="#g4504" inkscape:label="#g4504"
@ -1142,7 +1236,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path4798" id="path4798"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)" transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)"
style="opacity:0.80120479;color:#000000;fill:url(#radialGradient4816);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate" style="opacity:0.80120479;color:#000000;fill:url(#radialGradient4816);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate"
@ -1152,7 +1246,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path4800" id="path4800"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)" transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)"
style="fill:url(#radialGradient4818);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#radialGradient4818);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
@ -1162,7 +1256,7 @@
sodipodi:cy="29.207693" sodipodi:cy="29.207693"
sodipodi:cx="29.392656" sodipodi:cx="29.392656"
id="path4802" id="path4802"
d="m 58.403591,29.207693 c 0,16.022297 -12.988638,29.010935 -29.010935,29.010935 -16.022297,0 -29.0109345,-12.988638 -29.0109345,-29.010935 0,-16.022297 12.9886375,-29.01093473 29.0109345,-29.01093473 16.022297,0 29.010935,12.98863773 29.010935,29.01093473 z" /> d="m 58.403591,29.207693 a 29.010935,29.010935 0 1 1 -58.0218695,0 29.010935,29.010935 0 1 1 58.0218695,0 z" />
<path <path
transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)" transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)"
style="fill:none;stroke:url(#radialGradient4820);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" style="fill:none;stroke:url(#radialGradient4820);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
@ -1172,7 +1266,7 @@
sodipodi:cy="30.352861" sodipodi:cy="30.352861"
sodipodi:cx="29.77438" sodipodi:cx="29.77438"
id="path4804" id="path4804"
d="m 53.950159,30.352861 c 0,13.351915 -10.823865,24.17578 -24.175779,24.17578 -13.351915,0 -24.1757796,-10.823865 -24.1757796,-24.17578 0,-13.351914 10.8238646,-24.1757789 24.1757796,-24.1757789 13.351914,0 24.175779,10.8238649 24.175779,24.1757789 z" /> d="m 53.950159,30.352861 a 24.175779,24.175779 0 1 1 -48.3515586,0 24.175779,24.175779 0 1 1 48.3515586,0 z" />
</g> </g>
<rect <rect
style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;stroke:#e31717;stroke-width:3.18836617;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" style="opacity:0.98000004;fill:#ffffff;fill-opacity:1;stroke:#e31717;stroke-width:3.18836617;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
@ -1201,7 +1295,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path3806" id="path3806"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)" transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)"
style="opacity:0.80120479;color:#000000;fill:url(#radialGradient3816);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate" style="opacity:0.80120479;color:#000000;fill:url(#radialGradient3816);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate"
@ -1211,7 +1305,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path3808" id="path3808"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)" transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)"
style="fill:url(#radialGradient3818);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#radialGradient3818);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
@ -1221,7 +1315,7 @@
sodipodi:cy="29.207693" sodipodi:cy="29.207693"
sodipodi:cx="29.392656" sodipodi:cx="29.392656"
id="path3810" id="path3810"
d="m 58.403591,29.207693 c 0,16.022297 -12.988638,29.010935 -29.010935,29.010935 -16.022297,0 -29.0109345,-12.988638 -29.0109345,-29.010935 0,-16.022297 12.9886375,-29.01093473 29.0109345,-29.01093473 16.022297,0 29.010935,12.98863773 29.010935,29.01093473 z" /> d="m 58.403591,29.207693 a 29.010935,29.010935 0 1 1 -58.0218695,0 29.010935,29.010935 0 1 1 58.0218695,0 z" />
<path <path
transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)" transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)"
style="fill:none;stroke:url(#radialGradient3820);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" style="fill:none;stroke:url(#radialGradient3820);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
@ -1231,7 +1325,7 @@
sodipodi:cy="30.352861" sodipodi:cy="30.352861"
sodipodi:cx="29.77438" sodipodi:cx="29.77438"
id="path3812" id="path3812"
d="m 53.950159,30.352861 c 0,13.351915 -10.823865,24.17578 -24.175779,24.17578 -13.351915,0 -24.1757796,-10.823865 -24.1757796,-24.17578 0,-13.351914 10.8238646,-24.1757789 24.1757796,-24.1757789 13.351914,0 24.175779,10.8238649 24.175779,24.1757789 z" /> d="m 53.950159,30.352861 a 24.175779,24.175779 0 1 1 -48.3515586,0 24.175779,24.175779 0 1 1 48.3515586,0 z" />
</g> </g>
<g <g
transform="matrix(0.33832187,0,0,0.33832187,410.06766,-39.187259)" transform="matrix(0.33832187,0,0,0.33832187,410.06766,-39.187259)"
@ -1241,7 +1335,7 @@
sodipodi:end="6.2831853" sodipodi:end="6.2831853"
sodipodi:start="3.1415927" sodipodi:start="3.1415927"
transform="matrix(0.9559435,0,0,0.9559435,-2.74581,-3.77127)" transform="matrix(0.9559435,0,0,0.9559435,-2.74581,-3.77127)"
d="m -124.28571,-85.600701 c 0,-3.155913 9.5939,-5.714285 21.42857,-5.714285 11.834674,0 21.428572,2.558373 21.428572,5.714286" d="m -124.28571,-85.600701 a 21.428572,5.7142859 0 0 1 42.857142,10e-7"
sodipodi:ry="5.7142859" sodipodi:ry="5.7142859"
sodipodi:rx="21.428572" sodipodi:rx="21.428572"
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
@ -1258,12 +1352,13 @@
sodipodi:cy="-85.243561" sodipodi:cy="-85.243561"
sodipodi:rx="49.642857" sodipodi:rx="49.642857"
sodipodi:ry="11.785714" sodipodi:ry="11.785714"
d="m -51.42857,-85.243561 c 0,6.50907 -22.225864,11.785714 -49.64286,11.785714 -27.41699,0 -49.64285,-5.276644 -49.64285,-11.785714 0,-6.50907 22.22586,-11.785714 49.64285,-11.785714 27.416996,0 49.64286,5.276644 49.64286,11.785714 z" d="m -51.42857,-85.243561 a 49.642857,11.785714 0 1 1 -99.28571,0 49.642857,11.785714 0 1 1 99.28571,0 z"
transform="translate(0,-0.35714)" /> transform="translate(0,-0.35714)" />
<path <path
style="fill:none;stroke:#ff4e34;stroke-width:5.32037735;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ff4e34;stroke-width:5.32037735;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m -101.07143,-37.895278 0,-96.382562" d="m -101.07143,-37.895278 0,-96.382562"
id="path2991" /> id="path2991"
inkscape:connector-curvature="0" />
<path <path
sodipodi:end="3.1415927" sodipodi:end="3.1415927"
sodipodi:start="0" sodipodi:start="0"
@ -1274,7 +1369,7 @@
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
sodipodi:rx="21.428572" sodipodi:rx="21.428572"
sodipodi:ry="5.7142859" sodipodi:ry="5.7142859"
d="m -81.428568,-85.6007 c 0,3.155913 -9.593898,5.714285 -21.428572,5.714285 -11.83467,0 -21.42857,-2.558372 -21.42857,-5.714285 0,0 0,-10e-7 0,-10e-7" d="m -81.428568,-85.6007 a 21.428572,5.7142859 0 1 1 -42.857142,-10e-7"
transform="matrix(0.9559435,0,0,0.9559435,-2.7458124,-3.7712673)" transform="matrix(0.9559435,0,0,0.9559435,-2.7458124,-3.7712673)"
sodipodi:open="true" /> sodipodi:open="true" />
<path <path
@ -1285,11 +1380,11 @@
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
sodipodi:rx="20.357143" sodipodi:rx="20.357143"
sodipodi:ry="39.285713" sodipodi:ry="39.285713"
d="m -81.42857,-85.6007 c 0,21.6969 -9.114203,39.285713 -20.35714,39.285713 -11.24294,0 -20.35715,-17.588813 -20.35715,-39.285713 0,-21.6969 9.11421,-39.28571 20.35715,-39.28571 11.242937,0 20.35714,17.58881 20.35714,39.28571 z" d="m -81.42857,-85.6007 a 20.357143,39.285713 0 1 1 -40.71429,0 20.357143,39.285713 0 1 1 40.71429,0 z"
transform="matrix(1.0062564,0,0,1,1.3510971,0)" /> transform="matrix(1.0062564,0,0,1,1.3510971,0)" />
<path <path
transform="translate(0,-0.35713959)" transform="translate(0,-0.35713959)"
d="m -51.42857,-85.243561 c 0,6.50907 -22.225864,11.785714 -49.64286,11.785714 -27.41699,0 -49.64285,-5.276644 -49.64285,-11.785714 0,0 0,0 0,0" d="m -51.42857,-85.243561 a 49.642857,11.785714 0 1 1 -99.28571,0"
sodipodi:ry="11.785714" sodipodi:ry="11.785714"
sodipodi:rx="49.642857" sodipodi:rx="49.642857"
sodipodi:cy="-85.243561" sodipodi:cy="-85.243561"
@ -1319,7 +1414,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path3848" id="path3848"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)" transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)"
style="opacity:0.80120479;color:#000000;fill:url(#radialGradient3858);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate" style="opacity:0.80120479;color:#000000;fill:url(#radialGradient3858);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate"
@ -1329,7 +1424,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path3850" id="path3850"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)" transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)"
style="fill:url(#radialGradient3860);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#radialGradient3860);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
@ -1339,7 +1434,7 @@
sodipodi:cy="29.207693" sodipodi:cy="29.207693"
sodipodi:cx="29.392656" sodipodi:cx="29.392656"
id="path3852" id="path3852"
d="m 58.403591,29.207693 c 0,16.022297 -12.988638,29.010935 -29.010935,29.010935 -16.022297,0 -29.0109345,-12.988638 -29.0109345,-29.010935 0,-16.022297 12.9886375,-29.01093473 29.0109345,-29.01093473 16.022297,0 29.010935,12.98863773 29.010935,29.01093473 z" /> d="m 58.403591,29.207693 a 29.010935,29.010935 0 1 1 -58.0218695,0 29.010935,29.010935 0 1 1 58.0218695,0 z" />
<path <path
transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)" transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)"
style="fill:none;stroke:url(#radialGradient3862);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" style="fill:none;stroke:url(#radialGradient3862);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
@ -1349,7 +1444,7 @@
sodipodi:cy="30.352861" sodipodi:cy="30.352861"
sodipodi:cx="29.77438" sodipodi:cx="29.77438"
id="path3854" id="path3854"
d="m 53.950159,30.352861 c 0,13.351915 -10.823865,24.17578 -24.175779,24.17578 -13.351915,0 -24.1757796,-10.823865 -24.1757796,-24.17578 0,-13.351914 10.8238646,-24.1757789 24.1757796,-24.1757789 13.351914,0 24.175779,10.8238649 24.175779,24.1757789 z" /> d="m 53.950159,30.352861 a 24.175779,24.175779 0 1 1 -48.3515586,0 24.175779,24.175779 0 1 1 48.3515586,0 z" />
</g> </g>
<g <g
transform="matrix(0.72825401,0,0,0.72825401,0.26819761,-37.594811)" transform="matrix(0.72825401,0,0,0.72825401,0.26819761,-37.594811)"
@ -1358,30 +1453,36 @@
<path <path
id="path3864" id="path3864"
d="m 263.57143,-113.1007 c 0,3.35316 -2.55837,6.07143 -5.71428,6.07143 -3.15592,0 -5.71429,-2.71827 -5.71429,-6.07143 0,-3.35316 2.55837,-6.07143 5.71429,-6.07143 3.15591,0 5.71428,2.71827 5.71428,6.07143 z" d="m 263.57143,-113.1007 c 0,3.35316 -2.55837,6.07143 -5.71428,6.07143 -3.15592,0 -5.71429,-2.71827 -5.71429,-6.07143 0,-3.35316 2.55837,-6.07143 5.71429,-6.07143 3.15591,0 5.71428,2.71827 5.71428,6.07143 z"
style="opacity:0.98000004;fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> style="opacity:0.98000004;fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:connector-curvature="0" />
<path <path
style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 257.85715,-106.32128 0,16.203659" d="m 257.85715,-106.32128 0,16.203659"
id="path3872" id="path3872"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc"
inkscape:connector-curvature="0" />
<path <path
style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 249.76021,-82.544001 7.95495,-7.954951" d="m 249.76021,-82.544001 7.95495,-7.954951"
id="path3874" /> id="path3874"
inkscape:connector-curvature="0" />
<path <path
id="path3876" id="path3876"
d="m 265.71516,-82.544001 -7.95495,-7.954951" d="m 265.71516,-82.544001 -7.95495,-7.954951"
style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
inkscape:connector-curvature="0" />
<path <path
style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 257.85715,-98.624972 8.92824,-2.711038" d="m 257.85715,-98.624972 8.92824,-2.711038"
id="path3878" id="path3878"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc"
inkscape:connector-curvature="0" />
<path <path
id="path3880" id="path3880"
d="m 257.89812,-98.637413 -8.62061,-2.698597" d="m 257.89812,-98.637413 -8.62061,-2.698597"
style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ff4e34;stroke-width:2.7462945;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc"
inkscape:connector-curvature="0" />
</g> </g>
</g> </g>
<g <g
@ -1401,7 +1502,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path3907" id="path3907"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)" transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)"
style="opacity:0.80120479;color:#000000;fill:url(#radialGradient4239);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate" style="opacity:0.80120479;color:#000000;fill:url(#radialGradient4239);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate"
@ -1411,7 +1512,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path3909" id="path3909"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)" transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)"
style="fill:url(#radialGradient4241);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#radialGradient4241);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
@ -1421,7 +1522,7 @@
sodipodi:cy="29.207693" sodipodi:cy="29.207693"
sodipodi:cx="29.392656" sodipodi:cx="29.392656"
id="path3911" id="path3911"
d="m 58.403591,29.207693 c 0,16.022297 -12.988638,29.010935 -29.010935,29.010935 -16.022297,0 -29.0109345,-12.988638 -29.0109345,-29.010935 0,-16.022297 12.9886375,-29.01093473 29.0109345,-29.01093473 16.022297,0 29.010935,12.98863773 29.010935,29.01093473 z" /> d="m 58.403591,29.207693 a 29.010935,29.010935 0 1 1 -58.0218695,0 29.010935,29.010935 0 1 1 58.0218695,0 z" />
<path <path
transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)" transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)"
style="fill:none;stroke:url(#radialGradient4243);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" style="fill:none;stroke:url(#radialGradient4243);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
@ -1431,7 +1532,7 @@
sodipodi:cy="30.352861" sodipodi:cy="30.352861"
sodipodi:cx="29.77438" sodipodi:cx="29.77438"
id="path3913" id="path3913"
d="m 53.950159,30.352861 c 0,13.351915 -10.823865,24.17578 -24.175779,24.17578 -13.351915,0 -24.1757796,-10.823865 -24.1757796,-24.17578 0,-13.351914 10.8238646,-24.1757789 24.1757796,-24.1757789 13.351914,0 24.175779,10.8238649 24.175779,24.1757789 z" /> d="m 53.950159,30.352861 a 24.175779,24.175779 0 1 1 -48.3515586,0 24.175779,24.175779 0 1 1 48.3515586,0 z" />
</g> </g>
<path <path
id="path34138-1-7" id="path34138-1-7"
@ -1440,7 +1541,8 @@
sodipodi:nodetypes="cccccccccccccccccccc" sodipodi:nodetypes="cccccccccccccccccccc"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
inkscape:export-ydpi="103.61" /> inkscape:export-ydpi="103.61"
inkscape:connector-curvature="0" />
</g> </g>
<g <g
transform="matrix(1.2181818,0,0,1.2181818,-488.7342,39.213763)" transform="matrix(1.2181818,0,0,1.2181818,-488.7342,39.213763)"
@ -1452,7 +1554,7 @@
inkscape:label="#g4504" inkscape:label="#g4504"
transform="matrix(1.6946172,0,0,1.6946172,90.69312,69.91641)"> transform="matrix(1.6946172,0,0,1.6946172,90.69312,69.91641)">
<path <path
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z"
id="path3175" id="path3175"
sodipodi:cx="14.5" sodipodi:cx="14.5"
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
@ -1462,7 +1564,7 @@
style="opacity:0.53012049;color:#000000;fill:url(#radialGradient3197);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate" style="opacity:0.53012049;color:#000000;fill:url(#radialGradient3197);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate"
transform="matrix(1.3565115,0,0,1.3564842,148.6163,-105.84566)" /> transform="matrix(1.3565115,0,0,1.3564842,148.6163,-105.84566)" />
<path <path
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z"
id="path3177" id="path3177"
sodipodi:cx="14.5" sodipodi:cx="14.5"
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
@ -1472,7 +1574,7 @@
style="opacity:0.80120479;color:#000000;fill:url(#radialGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate" style="opacity:0.80120479;color:#000000;fill:url(#radialGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate"
transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)" /> transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)" />
<path <path
d="m 58.403591,29.207693 c 0,16.022297 -12.988638,29.010935 -29.010935,29.010935 -16.022297,0 -29.0109345,-12.988638 -29.0109345,-29.010935 0,-16.022297 12.9886375,-29.01093473 29.0109345,-29.01093473 16.022297,0 29.010935,12.98863773 29.010935,29.01093473 z" d="m 58.403591,29.207693 a 29.010935,29.010935 0 1 1 -58.0218695,0 29.010935,29.010935 0 1 1 58.0218695,0 z"
id="path3179" id="path3179"
sodipodi:cx="29.392656" sodipodi:cx="29.392656"
sodipodi:cy="29.207693" sodipodi:cy="29.207693"
@ -1482,7 +1584,7 @@
style="fill:url(#radialGradient3201);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#radialGradient3201);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)" /> transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)" />
<path <path
d="m 53.950159,30.352861 c 0,13.351915 -10.823865,24.17578 -24.175779,24.17578 -13.351915,0 -24.1757796,-10.823865 -24.1757796,-24.17578 0,-13.351914 10.8238646,-24.1757789 24.1757796,-24.1757789 13.351914,0 24.175779,10.8238649 24.175779,24.1757789 z" d="m 53.950159,30.352861 a 24.175779,24.175779 0 1 1 -48.3515586,0 24.175779,24.175779 0 1 1 48.3515586,0 z"
id="path3181" id="path3181"
sodipodi:cx="29.77438" sodipodi:cx="29.77438"
sodipodi:cy="30.352861" sodipodi:cy="30.352861"
@ -1505,13 +1607,13 @@
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
sodipodi:rx="21.428572" sodipodi:rx="21.428572"
sodipodi:ry="5.7142859" sodipodi:ry="5.7142859"
d="m -124.28571,-85.600701 c 0,-3.155913 9.5939,-5.714285 21.42857,-5.714285 11.834674,0 21.428572,2.558373 21.428572,5.714286" d="m -124.28571,-85.600701 a 21.428572,5.7142859 0 0 1 42.857142,10e-7"
transform="matrix(0.9559435,0,0,0.9559435,-2.74581,-3.77127)" transform="matrix(0.9559435,0,0,0.9559435,-2.74581,-3.77127)"
sodipodi:start="3.1415927" sodipodi:start="3.1415927"
sodipodi:end="6.2831853" /> sodipodi:end="6.2831853" />
<path <path
transform="translate(0,-0.35714)" transform="translate(0,-0.35714)"
d="m -51.42857,-85.243561 c 0,6.50907 -22.225864,11.785714 -49.64286,11.785714 -27.41699,0 -49.64285,-5.276644 -49.64285,-11.785714 0,-6.50907 22.22586,-11.785714 49.64285,-11.785714 27.416996,0 49.64286,5.276644 49.64286,11.785714 z" d="m -51.42857,-85.243561 a 49.642857,11.785714 0 1 1 -99.28571,0 49.642857,11.785714 0 1 1 99.28571,0 z"
sodipodi:ry="11.785714" sodipodi:ry="11.785714"
sodipodi:rx="49.642857" sodipodi:rx="49.642857"
sodipodi:cy="-85.243561" sodipodi:cy="-85.243561"
@ -1527,7 +1629,7 @@
<path <path
sodipodi:open="true" sodipodi:open="true"
transform="matrix(0.9559435,0,0,0.9559435,-2.7458124,-3.7712673)" transform="matrix(0.9559435,0,0,0.9559435,-2.7458124,-3.7712673)"
d="m -81.428568,-85.6007 c 0,3.155913 -9.593898,5.714285 -21.428572,5.714285 -11.83467,0 -21.42857,-2.558372 -21.42857,-5.714285 0,0 0,-10e-7 0,-10e-7" d="m -81.428568,-85.6007 a 21.428572,5.7142859 0 1 1 -42.857142,-10e-7"
sodipodi:ry="5.7142859" sodipodi:ry="5.7142859"
sodipodi:rx="21.428572" sodipodi:rx="21.428572"
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
@ -1539,7 +1641,7 @@
sodipodi:end="3.1415927" /> sodipodi:end="3.1415927" />
<path <path
transform="matrix(1.0062564,0,0,1,1.3510971,0)" transform="matrix(1.0062564,0,0,1,1.3510971,0)"
d="m -81.42857,-85.6007 c 0,21.6969 -9.114203,39.285713 -20.35714,39.285713 -11.24294,0 -20.35715,-17.588813 -20.35715,-39.285713 0,-21.6969 9.11421,-39.28571 20.35715,-39.28571 11.242937,0 20.35714,17.58881 20.35714,39.28571 z" d="m -81.42857,-85.6007 a 20.357143,39.285713 0 1 1 -40.71429,0 20.357143,39.285713 0 1 1 40.71429,0 z"
sodipodi:ry="39.285713" sodipodi:ry="39.285713"
sodipodi:rx="20.357143" sodipodi:rx="20.357143"
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
@ -1558,7 +1660,7 @@
sodipodi:cy="-85.243561" sodipodi:cy="-85.243561"
sodipodi:rx="49.642857" sodipodi:rx="49.642857"
sodipodi:ry="11.785714" sodipodi:ry="11.785714"
d="m -51.42857,-85.243561 c 0,6.50907 -22.225864,11.785714 -49.64286,11.785714 -27.41699,0 -49.64285,-5.276644 -49.64285,-11.785714 0,0 0,0 0,0" d="m -51.42857,-85.243561 a 49.642857,11.785714 0 1 1 -99.28571,0"
transform="translate(0,-0.35713959)" /> transform="translate(0,-0.35713959)" />
</g> </g>
</g> </g>
@ -1580,7 +1682,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path3209" id="path3209"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)" transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)"
style="opacity:0.80120479;color:#000000;fill:url(#radialGradient3233);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate" style="opacity:0.80120479;color:#000000;fill:url(#radialGradient3233);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5296-2);enable-background:accumulate"
@ -1590,7 +1692,7 @@
sodipodi:cy="26.6875" sodipodi:cy="26.6875"
sodipodi:cx="14.5" sodipodi:cx="14.5"
id="path3211" id="path3211"
d="m 24.5,26.6875 c 0,1.622336 -4.477153,2.9375 -10,2.9375 -5.5228475,0 -10,-1.315164 -10,-2.9375 0,-1.622336 4.4771525,-2.9375 10,-2.9375 5.522847,0 10,1.315164 10,2.9375 z" /> d="m 24.5,26.6875 a 10,2.9375 0 1 1 -20,0 10,2.9375 0 1 1 20,0 z" />
<path <path
transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)" transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)"
style="fill:url(#radialGradient3235);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#radialGradient3235);fill-opacity:1;fill-rule:evenodd;stroke:#d4d0d0;stroke-width:2.19046068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
@ -1600,7 +1702,7 @@
sodipodi:cy="29.207693" sodipodi:cy="29.207693"
sodipodi:cx="29.392656" sodipodi:cx="29.392656"
id="path3213" id="path3213"
d="m 58.403591,29.207693 c 0,16.022297 -12.988638,29.010935 -29.010935,29.010935 -16.022297,0 -29.0109345,-12.988638 -29.0109345,-29.010935 0,-16.022297 12.9886375,-29.01093473 29.0109345,-29.01093473 16.022297,0 29.010935,12.98863773 29.010935,29.01093473 z" /> d="m 58.403591,29.207693 a 29.010935,29.010935 0 1 1 -58.0218695,0 29.010935,29.010935 0 1 1 58.0218695,0 z" />
<path <path
transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)" transform="matrix(0.5041973,0,0,0.5044661,153.2742,-96.019639)"
style="fill:none;stroke:url(#radialGradient3237);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" style="fill:none;stroke:url(#radialGradient3237);stroke-width:1.98282218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
@ -1610,7 +1712,7 @@
sodipodi:cy="30.352861" sodipodi:cy="30.352861"
sodipodi:cx="29.77438" sodipodi:cx="29.77438"
id="path3215" id="path3215"
d="m 53.950159,30.352861 c 0,13.351915 -10.823865,24.17578 -24.175779,24.17578 -13.351915,0 -24.1757796,-10.823865 -24.1757796,-24.17578 0,-13.351914 10.8238646,-24.1757789 24.1757796,-24.1757789 13.351914,0 24.175779,10.8238649 24.175779,24.1757789 z" /> d="m 53.950159,30.352861 a 24.175779,24.175779 0 1 1 -48.3515586,0 24.175779,24.175779 0 1 1 48.3515586,0 z" />
</g> </g>
<g <g
transform="matrix(0.33832187,0,0,0.33832187,410.06766,-39.187259)" transform="matrix(0.33832187,0,0,0.33832187,410.06766,-39.187259)"
@ -1620,7 +1722,7 @@
sodipodi:end="6.2831853" sodipodi:end="6.2831853"
sodipodi:start="3.1415927" sodipodi:start="3.1415927"
transform="matrix(0.9559435,0,0,0.9559435,-2.74581,-3.77127)" transform="matrix(0.9559435,0,0,0.9559435,-2.74581,-3.77127)"
d="m -124.28571,-85.600701 c 0,-3.155913 9.5939,-5.714285 21.42857,-5.714285 11.834674,0 21.428572,2.558373 21.428572,5.714286" d="m -124.28571,-85.600701 a 21.428572,5.7142859 0 0 1 42.857142,10e-7"
sodipodi:ry="5.7142859" sodipodi:ry="5.7142859"
sodipodi:rx="21.428572" sodipodi:rx="21.428572"
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
@ -1637,7 +1739,7 @@
sodipodi:cy="-85.243561" sodipodi:cy="-85.243561"
sodipodi:rx="49.642857" sodipodi:rx="49.642857"
sodipodi:ry="11.785714" sodipodi:ry="11.785714"
d="m -51.42857,-85.243561 c 0,6.50907 -22.225864,11.785714 -49.64286,11.785714 -27.41699,0 -49.64285,-5.276644 -49.64285,-11.785714 0,-6.50907 22.22586,-11.785714 49.64285,-11.785714 27.416996,0 49.64286,5.276644 49.64286,11.785714 z" d="m -51.42857,-85.243561 a 49.642857,11.785714 0 1 1 -99.28571,0 49.642857,11.785714 0 1 1 99.28571,0 z"
transform="translate(0,-0.35714)" /> transform="translate(0,-0.35714)" />
<path <path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
@ -1654,7 +1756,7 @@
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
sodipodi:rx="21.428572" sodipodi:rx="21.428572"
sodipodi:ry="5.7142859" sodipodi:ry="5.7142859"
d="m -81.428568,-85.6007 c 0,3.155913 -9.593898,5.714285 -21.428572,5.714285 -11.83467,0 -21.42857,-2.558372 -21.42857,-5.714285 0,0 0,-10e-7 0,-10e-7" d="m -81.428568,-85.6007 a 21.428572,5.7142859 0 1 1 -42.857142,-10e-7"
transform="matrix(0.9559435,0,0,0.9559435,-2.7458124,-3.7712673)" transform="matrix(0.9559435,0,0,0.9559435,-2.7458124,-3.7712673)"
sodipodi:open="true" /> sodipodi:open="true" />
<path <path
@ -1665,11 +1767,11 @@
sodipodi:cy="-85.6007" sodipodi:cy="-85.6007"
sodipodi:rx="20.357143" sodipodi:rx="20.357143"
sodipodi:ry="39.285713" sodipodi:ry="39.285713"
d="m -81.42857,-85.6007 c 0,21.6969 -9.114203,39.285713 -20.35714,39.285713 -11.24294,0 -20.35715,-17.588813 -20.35715,-39.285713 0,-21.6969 9.11421,-39.28571 20.35715,-39.28571 11.242937,0 20.35714,17.58881 20.35714,39.28571 z" d="m -81.42857,-85.6007 a 20.357143,39.285713 0 1 1 -40.71429,0 20.357143,39.285713 0 1 1 40.71429,0 z"
transform="matrix(1.0062564,0,0,1,1.3510971,0)" /> transform="matrix(1.0062564,0,0,1,1.3510971,0)" />
<path <path
transform="translate(0,-0.35713959)" transform="translate(0,-0.35713959)"
d="m -51.42857,-85.243561 c 0,6.50907 -22.225864,11.785714 -49.64286,11.785714 -27.41699,0 -49.64285,-5.276644 -49.64285,-11.785714 0,0 0,0 0,0" d="m -51.42857,-85.243561 a 49.642857,11.785714 0 1 1 -99.28571,0"
sodipodi:ry="11.785714" sodipodi:ry="11.785714"
sodipodi:rx="49.642857" sodipodi:rx="49.642857"
sodipodi:cy="-85.243561" sodipodi:cy="-85.243561"

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

@ -14,7 +14,7 @@
height="80.827866" height="80.827866"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.47 r22583" inkscape:version="0.48.2 r9819"
sodipodi:docname="gps-signal.svg" sodipodi:docname="gps-signal.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
@ -408,6 +408,233 @@
inkscape:vp_y="0 : 1000 : 0" inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1" inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" /> sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3"
id="linearGradient4033"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
id="linearGradient3285-6-3"
inkscape:collect="always">
<stop
id="stop3287-9-8"
offset="0"
style="stop-color:#333333;stop-opacity:1" />
<stop
id="stop3289-8-2"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3966"
xlink:href="#linearGradient3790-4-8"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2-7"
id="linearGradient4035-1"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
id="linearGradient3259-9-2-7">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3261-8-7-4" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3263-3-5-0" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8-4">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2-8" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7-8" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2-7"
id="linearGradient3182"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-196.03949,-322.02732)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8-4"
id="linearGradient3184"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-196.03949,-322.02732)"
x1="298.43829"
y1="368.20679"
x2="300.36011"
y2="506.89417" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3129"
id="radialGradient3137"
cx="563.32452"
cy="178.53954"
fx="563.32452"
fy="178.53954"
r="21.714285"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1820828,1.3391528,-1.0147851,0.89575978,80.984385,-727.81911)" />
<linearGradient
inkscape:collect="always"
id="linearGradient3129">
<stop
style="stop-color:#fff954;stop-opacity:1;"
offset="0"
id="stop3131" />
<stop
style="stop-color:#d45500;stop-opacity:1"
offset="1"
id="stop3133" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3153"
id="radialGradient3159"
cx="591.73206"
cy="193.86913"
fx="591.73206"
fy="193.86913"
r="3.2728431"
gradientTransform="matrix(1.1531357,9.5132819,-7.1974158,0.87242204,1304.7414,-5619.5105)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient3153">
<stop
style="stop-color:#fff954;stop-opacity:1;"
offset="0"
id="stop3155" />
<stop
style="stop-color:#d45500;stop-opacity:1"
offset="1"
id="stop3157" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3139"
id="radialGradient3145"
cx="544.55707"
cy="194.06433"
fx="544.55707"
fy="194.06433"
r="3.2728431"
gradientTransform="matrix(1.7296842,10.666404,-7.1566113,1.1605296,991.48828,-5853.3289)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient3139">
<stop
style="stop-color:#fff954;stop-opacity:1;"
offset="0"
id="stop3141" />
<stop
style="stop-color:#d45500;stop-opacity:1"
offset="1"
id="stop3143" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3947"
id="linearGradient3953"
x1="564.28888"
y1="178.45786"
x2="579.39917"
y2="222.31613"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient3947">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3949" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3951" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3959"
id="linearGradient3965"
x1="544.08533"
y1="170.9193"
x2="543.14185"
y2="191.20453"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient3959">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3961" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3963" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3959"
id="linearGradient3967"
x1="544.08533"
y1="170.9193"
x2="543.14185"
y2="191.20453"
gradientUnits="userSpaceOnUse" />
<linearGradient
y2="191.20453"
x2="543.14185"
y1="170.9193"
x1="544.08533"
gradientUnits="userSpaceOnUse"
id="linearGradient3279"
xlink:href="#linearGradient3959"
inkscape:collect="always" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -416,16 +643,16 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="3.959798" inkscape:zoom="1.979899"
inkscape:cx="62.249814" inkscape:cx="83.531555"
inkscape:cy="43.870219" inkscape:cy="43.870219"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="svg10068" inkscape:current-layer="layer6"
showgrid="false" showgrid="false"
inkscape:window-width="1280" inkscape:window-width="1600"
inkscape:window-height="725" inkscape:window-height="823"
inkscape:window-x="0" inkscape:window-x="-9"
inkscape:window-y="24" inkscape:window-y="-9"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -454,7 +681,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title /> <dc:title></dc:title>
<dc:creator> <dc:creator>
<cc:Agent> <cc:Agent>
<dc:title>Edouard Lafargue</dc:title> <dc:title>Edouard Lafargue</dc:title>
@ -468,21 +695,29 @@
inkscape:label="Dark background" inkscape:label="Dark background"
id="g2932" id="g2932"
inkscape:groupmode="layer" inkscape:groupmode="layer"
transform="translate(-205.8687,-331.45166)"> transform="translate(-205.8687,-331.45166)"
sodipodi:insensitive="true">
<g <g
id="background" id="background"
inkscape:label="#g8543"> inkscape:label="#g8543">
<rect <g
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:3.36186838;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" transform="matrix(0.79280486,0,0,0.72374721,322.67019,100.52996)"
id="rect2936" id="g4023"
width="225.91589" style="display:inline">
height="77.465996" <rect
x="207.54964" style="fill:url(#linearGradient4033);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
y="333.1326" id="rect4025"
ry="5.7166986" width="289.19211"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" height="111.67988"
inkscape:export-xdpi="88.809998" x="-147.32065"
inkscape:export-ydpi="88.809998" /> y="319.06393"
ry="17.712246" />
<path
style="fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m -130.38957,321.09916 c -10.40328,0.13552 -16.79656,11.11379 -14.9375,20.75 0.24853,24.79185 -0.48485,49.65785 0.34375,74.40625 1.69659,9.71009 12.36903,14.16124 21.4375,12.5 83.37176,-0.12573 166.769249,0.25097 250.125,-0.1875 9.57786,-1.24954 15.0045,-11.39003 13.28125,-20.53125 -0.32065,-25.06939 0.63636,-50.246 -0.46875,-75.25 -1.99885,-8.70345 -11.6919,-13.22175 -20.28125,-11.71875 -83.166451,0.0209 -166.33459,-0.0417 -249.5,0.0312 z"
id="path4027"
inkscape:connector-curvature="0" />
</g>
<rect <rect
inkscape:label="#rect4388" inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -494,7 +729,7 @@
height="64.785042" height="64.785042"
width="151.41518" width="151.41518"
id="bargraph" id="bargraph"
style="fill:#332d2d;fill-opacity:1;stroke:none;stroke-width:1.98707128000000010;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> style="fill:none;stroke:none" />
<g <g
transform="translate(229.23003,365.4229)" transform="translate(229.23003,365.4229)"
style="display:inline" style="display:inline"
@ -549,7 +784,7 @@
ry="2" /> ry="2" />
</g> </g>
<rect <rect
style="fill:#332d2d;fill-opacity:1;stroke:none" style="fill:none;stroke:none"
id="rect3718" id="rect3718"
width="52.798534" width="52.798534"
height="37.510921" height="37.510921"
@ -660,47 +895,87 @@
height="61.754585" height="61.754585"
width="148.38472" width="148.38472"
id="needle" id="needle"
style="fill:#332d2d;fill-opacity:1;stroke:none;display:inline" /> style="fill:#1a1a1a;fill-opacity:1;stroke:none;display:inline" />
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="foreground" id="foreground"
inkscape:label="Foreground" inkscape:label="Foreground"
style="display:inline"> style="display:inline"
<path sodipodi:insensitive="true">
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" <g
d="m 7.40625,1.6875 c -3.1670511,0 -5.71875,2.5516989 -5.71875,5.71875 l 0,66.03125 c 0,3.167051 2.5516989,5.71875 5.71875,5.71875 l 214.46875,0 c 3.16705,0 5.71875,-2.551699 5.71875,-5.71875 l 0,-66.03125 c 0,-3.1670511 -2.5517,-5.71875 -5.71875,-5.71875 l -214.46875,0 z m 57.46875,6.03125 141.875,0 c 2.64861,0 4.78125,2.1326364 4.78125,4.78125 l 0,55.21875 c 0,2.648614 -2.13264,4.78125 -4.78125,4.78125 L 14.107143,72.61358 C 10.940092,72.61358 8.59375,68.167051 8.59375,65 l 0,-23.40625 c 0,-3.167051 2.551699,-5.71875 5.71875,-5.71875 l 41.59375,0 c 1.662575,0 4.836719,-0.637161 4.450893,-3.439991 l 0,-19.935009 c 0,-2.6486136 1.869243,-4.78125 4.517857,-4.78125 z" id="g3178"
id="rect2924" transform="translate(64.636327,-10.20833)">
sodipodi:nodetypes="cccccccccccccccccccccc" /> <path
inkscape:connector-curvature="0"
id="path4029"
d="m -51.203947,12.27604 c -8.247771,0.09808 -13.316394,8.043575 -11.842523,15.017755 0.197036,17.943032 -0.384391,35.939731 0.272527,53.851316 1.345065,7.027651 9.806227,10.249158 16.995755,9.04684 66.097536,-0.091 132.215469,0.181639 198.300318,-0.135703 7.59337,-0.904351 11.89564,-8.243502 10.52944,-14.859434 -0.25422,-18.143901 0.50451,-36.365403 -0.37163,-54.461978 -1.5847,-6.299098 -9.2694,-9.569205 -16.07908,-8.481413 -65.934759,0.01513 -131.870865,-0.03018 -197.804807,0.02258 z"
style="fill:url(#linearGradient3182);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<path
inkscape:connector-curvature="0"
id="path4031"
d="m -50.584568,10.805929 c -7.779461,0 -14.047511,5.722068 -14.047511,12.823896 l 0,5.405487 c 17.372987,9.682594 65.25053561,16.646186 121.62122,16.646186 45.053119,0 84.676619,-4.445248 107.648039,-11.172848 l 0,-10.878825 c 0,-7.101828 -6.24328,-12.823896 -14.02274,-12.823896 l -201.199008,0 z"
style="fill:url(#linearGradient3184);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
</g>
<g <g
id="g2928" id="g2928"
transform="matrix(0.53532208,0,0,0.53532208,-271.81544,-86.17791)"> transform="matrix(0.53532208,0,0,0.53532208,-271.81544,-86.17791)">
<path <g
transform="translate(0.08444214,0)" style="display:inline"
d="m 589.99999,195.93361 c 0,11.44018 -9.2741,20.71428 -20.71428,20.71428 -11.44019,0 -20.71429,-9.2741 -20.71429,-20.71428 0,-11.44018 9.2741,-20.71429 20.71429,-20.71429 11.44018,0 20.71428,9.27411 20.71428,20.71429 z" id="g2928-2">
sodipodi:ry="20.714285" <path
sodipodi:rx="20.714285" transform="translate(0.08444214,0)"
sodipodi:cy="195.93361" d="m 589.99999,195.93361 a 20.714285,20.714285 0 1 1 -41.42857,0 20.714285,20.714285 0 1 1 41.42857,0 z"
sodipodi:cx="569.28571" sodipodi:ry="20.714285"
id="path2930" sodipodi:rx="20.714285"
style="fill:#fff954;fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" sodipodi:cy="195.93361"
sodipodi:type="arc" /> sodipodi:cx="569.28571"
<rect id="path2930-4"
ry="2.2728431" style="fill:url(#radialGradient3137);fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
y="173.52946" sodipodi:type="arc" />
x="590.45447" <rect
height="45.456863" ry="2.2728431"
width="4.5456862" y="173.52946"
id="rect2932" x="590.45447"
style="fill:#fff954;fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> height="45.456863"
<rect width="4.5456862"
style="fill:#fff954;fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" id="rect2932-5"
id="rect2934" style="fill:url(#radialGradient3159);fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
width="4.5456862" <rect
height="45.456863" style="fill:url(#radialGradient3145);fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
x="543.74017" id="rect2934-5"
y="173.52946" width="4.5456862"
ry="2.2728431" /> height="45.456863"
x="543.74017"
y="173.52946"
ry="2.2728431" />
<path
sodipodi:type="arc"
style="fill:url(#linearGradient3953);fill-opacity:1;stroke:none"
id="path3161"
sodipodi:cx="569.28571"
sodipodi:cy="195.93361"
sodipodi:rx="20.714285"
sodipodi:ry="20.714285"
d="m 589.99999,195.93361 a 20.714285,20.714285 0 1 1 -41.42857,0 20.714285,20.714285 0 1 1 41.42857,0 z"
transform="matrix(0.81173208,0,0,0.52705545,107.26266,82.52311)" />
<rect
style="fill:url(#linearGradient3965);fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect3955"
width="4.5456862"
height="45.456863"
x="590.45447"
y="173.52946"
ry="2.2728431" />
<rect
ry="2.2728431"
y="173.52946"
x="543.74017"
height="45.456863"
width="4.5456862"
id="rect3957"
style="fill:url(#linearGradient3279);fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
</g>
</g> </g>
</g> </g>
<rect <rect

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -14,7 +14,7 @@
height="47.114098" height="47.114098"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.47 r22583" inkscape:version="0.48.2 r9819"
sodipodi:docname="lineardial-horizontal.svg" sodipodi:docname="lineardial-horizontal.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
@ -22,6 +22,54 @@
style="display:inline"> style="display:inline">
<defs <defs
id="defs10070"> id="defs10070">
<linearGradient
inkscape:collect="always"
id="linearGradient4376">
<stop
style="stop-color:#ffaaaa;stop-opacity:1"
offset="0"
id="stop4378" />
<stop
style="stop-color:#ffffff;stop-opacity:0"
offset="1"
id="stop4380" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4326">
<stop
style="stop-color:#ffff98;stop-opacity:1"
offset="0"
id="stop4328" />
<stop
style="stop-color:#ffffff;stop-opacity:0"
offset="1"
id="stop4330" />
</linearGradient>
<linearGradient
id="linearGradient4215"
inkscape:collect="always">
<stop
id="stop4217"
offset="0"
style="stop-color:#00ff00;stop-opacity:1" />
<stop
id="stop4219"
offset="1"
style="stop-color:#ffffff;stop-opacity:0" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3919">
<stop
style="stop-color:#333333;stop-opacity:1;"
offset="0"
id="stop3921" />
<stop
style="stop-color:#333333;stop-opacity:0;"
offset="1"
id="stop3923" />
</linearGradient>
<marker <marker
inkscape:stockid="Arrow2Sstart" inkscape:stockid="Arrow2Sstart"
orient="auto" orient="auto"
@ -224,6 +272,602 @@
inkscape:vp_y="0 : 1000 : 0" inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1" inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" /> sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3"
id="linearGradient4033"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
id="linearGradient3285-6-3"
inkscape:collect="always">
<stop
id="stop3287-9-8"
offset="0"
style="stop-color:#333333;stop-opacity:1" />
<stop
id="stop3289-8-2"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2"
id="linearGradient4035"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
id="linearGradient3259-9-2">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3261-8-7" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3263-3-5" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3966"
xlink:href="#linearGradient3790-4-8"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3278"
xlink:href="#linearGradient3790-4-8"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8"
id="linearGradient3072"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-138.47498,-417.55885)"
x1="298.43829"
y1="374.12836"
x2="300.36011"
y2="497.0249" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2"
id="linearGradient3075"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-138.47498,-417.55885)"
x1="311.52808"
y1="535.62231"
x2="311.84125"
y2="495.69638" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3"
id="linearGradient3079"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-192.47498,-457.55885)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2"
id="linearGradient3086"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-138.47498,-417.55885)"
x1="311.52808"
y1="535.62231"
x2="311.84125"
y2="495.69638" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8"
id="linearGradient3088"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-138.47498,-417.55885)"
x1="298.43829"
y1="374.12836"
x2="300.36011"
y2="497.0249" />
<linearGradient
inkscape:collect="always"
id="linearGradient3259-9-2-7">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3261-8-7-4" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3263-3-5-0" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8-4"
id="linearGradient3088-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-138.47498,-417.55885)"
x1="298.43829"
y1="374.12836"
x2="300.36011"
y2="497.0249" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8-4">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2-8" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7-8" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3919"
id="linearGradient3925"
x1="366.37189"
y1="401.41922"
x2="366.37189"
y2="395.34781"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3948-4"
id="linearGradient3954-0"
x1="151.42857"
y1="39.256954"
x2="151.42857"
y2="34.256954"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient3948-4">
<stop
style="stop-color:#550000;stop-opacity:1"
offset="0"
id="stop3950-9" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3952-4" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3956-1-8"
id="linearGradient4019-5"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(74.014741,-11.230241)"
x1="146.07143"
y1="7.1140976"
x2="146.07143"
y2="13.542669" />
<linearGradient
inkscape:collect="always"
id="linearGradient3956-1-8">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop3958-2-8" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3960-6-1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3956-1-9"
id="linearGradient4019-2"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(74.014741,-11.230241)"
x1="146.07143"
y1="7.1140976"
x2="146.07143"
y2="13.542669" />
<linearGradient
inkscape:collect="always"
id="linearGradient3956-1-9">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop3958-2-9" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3960-6-8" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6"
id="linearGradient4017-9-8"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(74.014741,-36.887006)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<linearGradient
id="linearGradient4027-8-6"
inkscape:collect="always">
<stop
id="stop4029-24-6"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop4031-5-2"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
y2="13.542669"
x2="146.07143"
y1="7.1140976"
x1="146.07143"
gradientTransform="translate(74.014741,-11.230241)"
gradientUnits="userSpaceOnUse"
id="linearGradient4100-3-3"
xlink:href="#linearGradient3956-1-9-8"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3956-1-9-8">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop3958-2-9-2" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3960-6-8-6" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient4181"
xlink:href="#linearGradient4215"
inkscape:collect="always" />
<linearGradient
id="linearGradient4027-8-6-9"
inkscape:collect="always">
<stop
id="stop4029-24-6-2"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop4031-5-2-8"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient4181-2"
xlink:href="#linearGradient4215-0"
inkscape:collect="always" />
<linearGradient
id="linearGradient4215-0"
inkscape:collect="always">
<stop
id="stop4217-5"
offset="0"
style="stop-color:#00ff00;stop-opacity:1" />
<stop
id="stop4219-5"
offset="1"
style="stop-color:#ffffff;stop-opacity:0" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4326"
id="linearGradient4333"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-3e-6,20)"
x1="146.07143"
y1="5.3283834"
x2="146.07143"
y2="14.971241" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6-9"
id="linearGradient4336"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-3e-6,1e-6)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<linearGradient
id="linearGradient4027-8-6-8"
inkscape:collect="always">
<stop
id="stop4029-24-6-7"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop4031-5-2-81"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient4181-6"
xlink:href="#linearGradient4215-09"
inkscape:collect="always" />
<linearGradient
id="linearGradient4215-09"
inkscape:collect="always">
<stop
id="stop4217-58"
offset="0"
style="stop-color:#00ff00;stop-opacity:1" />
<stop
id="stop4219-9"
offset="1"
style="stop-color:#ffffff;stop-opacity:0" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4376"
id="linearGradient4371"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-3e-6,20)"
x1="146.07143"
y1="5.3283834"
x2="146.07143"
y2="14.971241" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6-8"
id="linearGradient4374"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-3e-6,10e-7)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8-4"
id="linearGradient4765"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-138.47498,-417.55885)"
x1="298.43829"
y1="374.12836"
x2="300.36011"
y2="497.0249" />
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3966-8"
xlink:href="#linearGradient3790-4-8-3"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8-3">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2-5" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7-5" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3966-9"
xlink:href="#linearGradient3790-4-8-9"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8-9">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2-0" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7-3" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2-7"
id="linearGradient4878"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79280486,0,0,0.72374721,-138.47498,-417.55885)"
x1="311.52808"
y1="535.62231"
x2="311.84125"
y2="495.69638" />
<linearGradient
id="linearGradient3285-6-3-7"
inkscape:collect="always">
<stop
id="stop3287-9-8-83"
offset="0"
style="stop-color:#333333;stop-opacity:1" />
<stop
id="stop3289-8-2-64"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3259-9-2-9">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3261-8-7-5" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3263-3-5-5" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3966-7"
xlink:href="#linearGradient3790-4-8-47"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8-47">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2-3" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7-4" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8-47"
id="linearGradient4963"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.80060526,0,0,0.7931613,-139.76801,-548.41027)"
x1="298.43829"
y1="368.20679"
x2="300.36011"
y2="506.89417" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2-9"
id="linearGradient4966"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.80060526,0,0,0.7931613,-139.76801,-548.41027)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3-7"
id="linearGradient4970"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.80060526,0,0,0.7931613,-139.76801,-548.41027)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3-7"
id="linearGradient4978"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.80060526,0,0,0.7931613,-139.76801,-548.41027)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2-9"
id="linearGradient4980"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.80060526,0,0,0.7931613,-139.76801,-548.41027)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8-47"
id="linearGradient4982"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.80060526,0,0,0.7931613,-139.76801,-548.41027)"
x1="298.43829"
y1="368.20679"
x2="300.36011"
y2="506.89417" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8-47"
id="linearGradient4985"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8472763,0,0,0.79627771,-147.50374,-450.7988)"
x1="298.43829"
y1="368.20679"
x2="299.93445"
y2="500.99579" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2-9"
id="linearGradient4988"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8472763,0,0,0.79627771,-147.50374,-450.7988)"
x1="311.95374"
y1="524.9516"
x2="311.79166"
y2="490.90079" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3-7"
id="linearGradient4992"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8472763,0,0,0.79627771,-147.50374,-450.7988)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -233,15 +877,15 @@
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="2.8" inkscape:zoom="2.8"
inkscape:cx="152.93622" inkscape:cx="92.416951"
inkscape:cy="20.867055" inkscape:cy="61.481315"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="green"
showgrid="false" showgrid="false"
inkscape:window-width="1280" inkscape:window-width="1600"
inkscape:window-height="725" inkscape:window-height="823"
inkscape:window-x="0" inkscape:window-x="-9"
inkscape:window-y="24" inkscape:window-y="-9"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -271,21 +915,40 @@
inkscape:label="Dark background" inkscape:label="Dark background"
id="g2932" id="g2932"
inkscape:groupmode="layer" inkscape:groupmode="layer"
transform="translate(-227.44331,-365.7337)"> transform="translate(-227.44331,-365.7337)"
sodipodi:insensitive="true">
<g <g
id="background" id="background"
inkscape:label="#g8543"> inkscape:label="#g8543">
<rect <g
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" style="display:inline"
id="rect2936" id="g3081"
width="302.25623" transform="matrix(0.99025687,0,0,0.91248427,234.44213,443.04453)">
height="43.114098" <path
x="229.44331" style="fill:url(#linearGradient4992);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
y="367.7337" d="m 7.8053863,-84.613768 279.4127837,0 c 8.23666,0 14.86763,6.290328 14.86763,14.103868 l 0,23.313142 c 0,7.81354 -6.63097,14.103878 -14.86763,14.103878 l -279.4127837,0 c -8.23666738,0 -14.8676309,-6.290338 -14.8676309,-14.103878 l 0,-23.313142 c 0,-7.81354 6.63096352,-14.103868 14.8676309,-14.103868 z"
ry="3.1816578" id="rect4025"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:connector-curvature="0"
inkscape:export-xdpi="88.809998" sodipodi:nodetypes="sssssssss" />
inkscape:export-ydpi="88.809998" /> <path
inkscape:connector-curvature="0"
id="path4027-8"
d="m 7.2830608,-82.993156 c -8.8144519,0.107913 -14.231327,8.849666 -12.6561898,16.522756 0.2105742,19.741202 -0.4108014,2.134122 0.2912512,21.840718 1.4374806,7.731941 10.4799866,11.276293 18.1634868,9.953486 70.638916,-0.100092 205.422071,0.199842 276.047421,-0.149305 8.11508,-0.994984 12.71295,-9.069636 11.25288,-16.348583 -0.27168,-19.962197 0.53918,-2.602446 -0.39716,-22.512578 -1.69358,-6.930364 -9.90627,-10.528185 -17.18383,-9.331381 -70.46495,0.01667 -205.053779,-0.03323 -275.5178592,0.0249 z"
style="fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
sodipodi:nodetypes="ccccccccc" />
<path
inkscape:connector-curvature="0"
id="path4029-1"
d="m 7.2830609,-82.993156 c -8.814452,0.107913 -14.231327,8.849666 -12.65619,16.522756 0.210574,19.741202 -0.410802,2.134122 0.291251,21.840718 1.437481,7.731941 10.479987,11.276293 18.1634871,9.953486 70.638911,-0.100092 205.422071,0.199842 276.047421,-0.149305 8.11508,-0.994984 12.71295,-9.069636 11.25288,-16.348583 -0.27168,-19.962197 0.53918,-2.602446 -0.39716,-22.512578 -1.69358,-6.930364 -9.90627,-10.528185 -17.18383,-9.331381 -70.46495,0.01667 -205.05378,-0.03323 -275.5178591,0.0249 z"
style="fill:url(#linearGradient4988);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
sodipodi:nodetypes="ccccccccc" />
<path
inkscape:connector-curvature="0"
id="path4031-5"
d="m 7.9449955,-84.610596 c -8.3139663,0 -15.0126765,6.295509 -15.0126765,14.109049 l 0,1.563559 c 18.566637,10.652932 97.52011,13.93075 157.763851,13.93075 48.1486,0 126.83057,-2.698913 151.38029,-10.100721 l 0,-5.393588 c 0,-7.81354 -6.67223,-14.109049 -14.9862,-14.109049 z"
style="fill:url(#linearGradient4985);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
sodipodi:nodetypes="sscscsss" />
</g>
<rect <rect
inkscape:label="#rect4388" inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -297,7 +960,7 @@
height="9.2538376" height="9.2538376"
width="260.53882" width="260.53882"
id="bargraph-outer" id="bargraph-outer"
style="fill:#332d2d;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> style="fill:url(#linearGradient3925);fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
<rect <rect
style="fill:#332d2d;fill-opacity:1;stroke:none" style="fill:#332d2d;fill-opacity:1;stroke:none"
id="bargraph" id="bargraph"
@ -316,25 +979,62 @@
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer5" id="layer5"
inkscape:label="Green Zone" inkscape:label="Green Zone"
style="display:inline"> style="display:none"
<rect sodipodi:insensitive="true">
inkscape:label="#rect5741" <g
style="fill:#04b629;fill-opacity:1;stroke:none;display:inline"
id="green" id="green"
width="260.53882" inkscape:label="#g4183">
height="9.2538376" <rect
x="22.858707" inkscape:export-ydpi="88.809998"
y="29.431705" inkscape:export-xdpi="88.809998"
ry="0.68289828" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" ry="0.68289828"
inkscape:export-xdpi="88.809998" y="29.431705"
inkscape:export-ydpi="88.809998" /> x="22.858707"
height="9.2538376"
width="260.53882"
id="sdds"
style="fill:#04b629;fill-opacity:1;stroke:none;display:inline"
inkscape:label="#rect5741" />
<g
style="display:inline"
id="g4013-8"
transform="matrix(1,0,0,-1,-74.014744,36.887009)">
<rect
inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828"
y="-7.4553013"
x="96.873451"
height="9.2538376"
width="260.53882"
id="bargraph-7-6"
style="fill:url(#linearGradient4017-9-8);fill-opacity:1;stroke:none;display:inline"
transform="scale(1,-1)" />
<rect
style="fill:url(#linearGradient4181);fill-opacity:1;stroke:none;display:inline"
id="rect3946-9"
width="260.53882"
height="9.2538376"
x="96.873451"
y="-7.4553032"
ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388"
transform="scale(1,-1)" />
</g>
</g>
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer4" id="layer4"
inkscape:label="Yellow Zone" inkscape:label="Yellow Zone"
style="display:inline"> style="display:none"
sodipodi:insensitive="true">
<g <g
id="g3793"> id="g3793">
<rect <rect
@ -358,54 +1058,113 @@
id="rect3786" id="rect3786"
style="fill:none;stroke:none" /> style="fill:none;stroke:none" />
</g> </g>
<rect <g
inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828"
y="29.431705"
x="22.858707"
height="9.2538376"
width="260.53882"
id="yellow" id="yellow"
style="fill:#f1b907;fill-opacity:1;stroke:none;display:inline" inkscape:label="#g4292">
inkscape:label="#rect5741" /> <rect
inkscape:label="#rect5741"
style="fill:#f1b907;fill-opacity:1;stroke:none;display:inline"
id="sdsfd"
width="260.53882"
height="9.2538376"
x="22.858707"
y="29.431705"
ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" />
<rect
style="fill:url(#linearGradient4336);fill-opacity:1;stroke:none;display:inline"
id="bargraph-7-6-7"
width="260.53882"
height="9.2538376"
x="22.858707"
y="29.431705"
ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" />
<rect
inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828"
y="29.431704"
x="22.858707"
height="9.2538376"
width="260.53882"
id="rect3946-9-6"
style="fill:url(#linearGradient4333);fill-opacity:1;stroke:none;display:inline" />
</g>
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer3" id="layer3"
inkscape:label="Red zone" inkscape:label="Red zone"
style="display:inline"> style="display:none"
<rect sodipodi:insensitive="true">
inkscape:label="#rect5741" <g
style="fill:#cf0e0e;fill-opacity:1;stroke:none;display:inline"
id="red" id="red"
width="260.53882" inkscape:label="#g4338">
height="9.2538376" <rect
x="22.858707" inkscape:export-ydpi="88.809998"
y="29.431705" inkscape:export-xdpi="88.809998"
ry="0.68289828" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" ry="0.68289828"
inkscape:export-xdpi="88.809998" y="29.431705"
inkscape:export-ydpi="88.809998" /> x="22.858707"
height="9.2538376"
width="260.53882"
id="hghg"
style="fill:#cf0e0e;fill-opacity:1;stroke:none;display:inline"
inkscape:label="#rect5741" />
<rect
style="fill:url(#linearGradient4374);fill-opacity:1;stroke:none;display:inline"
id="bargraph-7-6-0"
width="260.53882"
height="9.2538376"
x="22.858707"
y="29.431705"
ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" />
<rect
inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828"
y="29.431704"
x="22.858707"
height="9.2538376"
width="260.53882"
id="rect3946-9-7"
style="fill:url(#linearGradient4371);fill-opacity:1;stroke:none;display:inline" />
</g>
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer6" id="layer6"
inkscape:label="Indicator" inkscape:label="Indicator"
style="display:inline"> style="display:none"
sodipodi:insensitive="true">
<path <path
style="fill:#ffffff;fill-opacity:1;stroke:#c2bfbf;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 29.39406,23.75432 -14.268403,0 7.134202,12 7.134201,-12 z" d="m 29.39406,23.75432 -14.268403,0 7.134202,12 7.134201,-12 z"
id="needle" id="needle"
sodipodi:nodetypes="cccc" sodipodi:nodetypes="cccc"
inkscape:label="#path5747" /> inkscape:label="#path5747"
inkscape:connector-curvature="0" />
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1" id="layer1"
inkscape:label="Text" inkscape:label="Text"
style="display:inline"> style="display:none">
<rect <rect
style="fill:#ffffff;fill-opacity:1;stroke:none" style="fill:#ffffff;fill-opacity:1;stroke:none"
id="field" id="field"

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -14,14 +14,98 @@
height="322.58304" height="322.58304"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.47 r22583" inkscape:version="0.48.2 r9819"
sodipodi:docname="dials-master-linear-vertical.svg" sodipodi:docname="lineardial-vertical.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
inkscape:export-ydpi="103.61" inkscape:export-ydpi="103.61"
style="display:inline"> style="display:inline">
<defs <defs
id="defs10070"> id="defs10070">
<linearGradient
id="linearGradient3113"
inkscape:collect="always">
<stop
id="stop3115"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop3117"
offset="1"
style="stop-color:#161616;stop-opacity:0" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4262">
<stop
style="stop-color:#ff0000;stop-opacity:1"
offset="0"
id="stop4264" />
<stop
style="stop-color:#ffffff;stop-opacity:0"
offset="1"
id="stop4266" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4218">
<stop
style="stop-color:#ffff94;stop-opacity:1"
offset="0"
id="stop4220" />
<stop
style="stop-color:#ffffff;stop-opacity:0"
offset="1"
id="stop4222" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4074">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop4076" />
<stop
style="stop-color:#161616;stop-opacity:1"
offset="1"
id="stop4078" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4066">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4068" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop4070" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient3184">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3186" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3188" />
</linearGradient>
<linearGradient
id="linearGradient3126"
inkscape:collect="always">
<stop
id="stop3128"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop3130"
offset="1"
style="stop-color:#1a1a1a;stop-opacity:1" />
</linearGradient>
<marker <marker
inkscape:stockid="Arrow2Sstart" inkscape:stockid="Arrow2Sstart"
orient="auto" orient="auto"
@ -231,6 +315,364 @@
inkscape:vp_y="0 : 1000 : 0" inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1" inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" /> sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3285-6-3-7"
inkscape:collect="always">
<stop
id="stop3287-9-8-83"
offset="0"
style="stop-color:#333333;stop-opacity:1" />
<stop
id="stop3289-8-2-64"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3790-4-8-47"
id="linearGradient4985"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8472763,0,0,0.79627771,-147.50374,-450.7988)"
x1="298.43829"
y1="368.20679"
x2="299.93445"
y2="500.99579" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8-47">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2-3" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7-4" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3126"
id="linearGradient3124"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(2.000004,-5e-6)"
x1="364.15167"
y1="396.75885"
x2="364.15167"
y2="401.14038" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3-7"
id="linearGradient3162"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.81981237,0,0,0.72659088,81.044354,31.646826)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3184"
id="linearGradient3190"
x1="9.2915163"
y1="-21.783976"
x2="19.744478"
y2="22.931471"
gradientUnits="userSpaceOnUse" />
<filter
id="filter4038"
x="-0.25"
width="1.5"
y="-0.25"
height="1.5"
inkscape:menu="Non realistic 3D shaders"
inkscape:menu-tooltip="Combination of smooth shading and embossing"
inkscape:label="Emboss shader"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur4040"
result="result8"
stdDeviation="5" />
<feComposite
id="feComposite4042"
in2="result8"
in="result8"
operator="xor"
result="result6" />
<feDisplacementMap
id="feDisplacementMap4044"
in2="result6"
result="result4"
scale="100"
yChannelSelector="A"
xChannelSelector="A"
in="result8" />
<feComposite
id="feComposite4046"
in2="result4"
k1="1"
in="result4"
operator="arithmetic"
result="result2" />
<feComposite
id="feComposite4048"
in2="result8"
operator="in"
in="result2"
result="fbSourceGraphic" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4066"
id="linearGradient4100"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-1.3888524,1.249288)"
x1="484.00406"
y1="296.67889"
x2="482.2619"
y2="379.72189" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4074"
id="linearGradient4102"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.81981237,0,0,0.72659088,81.044354,31.646826)"
x1="312.66208"
y1="526.55005"
x2="312.5"
y2="491.70007" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6"
id="linearGradient4017-9-8"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(74.014741,-36.887006)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<linearGradient
id="linearGradient4027-8-6"
inkscape:collect="always">
<stop
id="stop4029-24-6"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop4031-5-2"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient4181"
xlink:href="#linearGradient4215"
inkscape:collect="always" />
<linearGradient
id="linearGradient4215"
inkscape:collect="always">
<stop
id="stop4217"
offset="0"
style="stop-color:#00ff00;stop-opacity:1" />
<stop
id="stop4219"
offset="1"
style="stop-color:#ffffff;stop-opacity:0" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient3206"
xlink:href="#linearGradient4215"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6-2"
id="linearGradient4017-9-8-1"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(74.014741,-36.887006)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<linearGradient
id="linearGradient4027-8-6-2"
inkscape:collect="always">
<stop
id="stop4029-24-6-6"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop4031-5-2-0"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient3206-4"
xlink:href="#linearGradient4215-9"
inkscape:collect="always" />
<linearGradient
id="linearGradient4215-9"
inkscape:collect="always">
<stop
id="stop4217-4"
offset="0"
style="stop-color:#00ff00;stop-opacity:1" />
<stop
id="stop4219-6"
offset="1"
style="stop-color:#ffffff;stop-opacity:0" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient4157"
xlink:href="#linearGradient4215-9"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6-2"
id="linearGradient4207"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(74.014741,-36.887006)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4215-9"
id="linearGradient4209"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(74.014741,-16.887007)"
x1="146.07143"
y1="5.3283834"
x2="146.07143"
y2="14.971241" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4218"
id="linearGradient4212"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-176.83268,149.54981)"
x1="146.07143"
y1="5.3283834"
x2="146.07143"
y2="14.971241" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6-2"
id="linearGradient4216"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-176.83268,129.54981)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6-4"
id="linearGradient4017-9-8-2"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(74.014741,-36.887006)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<linearGradient
id="linearGradient4027-8-6-4"
inkscape:collect="always">
<stop
id="stop4029-24-6-5"
offset="0"
style="stop-color:#000000;stop-opacity:1" />
<stop
id="stop4031-5-2-8"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient3206-8"
xlink:href="#linearGradient4215-1"
inkscape:collect="always" />
<linearGradient
id="linearGradient4215-1"
inkscape:collect="always">
<stop
id="stop4217-2"
offset="0"
style="stop-color:#00ff00;stop-opacity:1" />
<stop
id="stop4219-1"
offset="1"
style="stop-color:#ffffff;stop-opacity:0" />
</linearGradient>
<linearGradient
y2="14.971241"
x2="146.07143"
y1="5.3283834"
x1="146.07143"
gradientTransform="translate(74.014741,-16.887007)"
gradientUnits="userSpaceOnUse"
id="linearGradient4157-4"
xlink:href="#linearGradient4215-1"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4262"
id="linearGradient4257"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-176.93421,149.53123)"
x1="146.07143"
y1="5.3283834"
x2="146.07143"
y2="14.971241" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4027-8-6-4"
id="linearGradient4260"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-176.93421,129.53123)"
x1="151.42857"
y1="41.399815"
x2="151.42857"
y2="34.256954" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3113"
id="radialGradient3115"
cx="188.26538"
cy="428.83499"
fx="188.26538"
fy="428.83499"
r="159.90863"
gradientTransform="matrix(-0.02804165,0.21033206,-1.0804577,-0.14404754,704.07325,419.31786)"
gradientUnits="userSpaceOnUse" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -239,16 +681,16 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1.4" inkscape:zoom="1.722"
inkscape:cx="-2.9467106" inkscape:cx="-187.33422"
inkscape:cy="214.52047" inkscape:cy="155.10613"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="background"
showgrid="false" showgrid="false"
inkscape:window-width="1280" inkscape:window-width="1600"
inkscape:window-height="949" inkscape:window-height="823"
inkscape:window-x="0" inkscape:window-x="-9"
inkscape:window-y="24" inkscape:window-y="-9"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -283,17 +725,37 @@
id="background" id="background"
inkscape:label="#g8543" inkscape:label="#g8543"
transform="matrix(0,-1,1,0,-8.719326,769.86218)"> transform="matrix(0,-1,1,0,-8.719326,769.86218)">
<rect <path
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" sodipodi:nodetypes="sssssssss"
id="rect2936" inkscape:connector-curvature="0"
width="318.58304" id="rect4025"
height="43.012333" d="m 225.4566,365.78491 293.80633,0 c 7.96968,0 14.3857,5.73982 14.3857,12.86956 l 0,21.27287 c 0,7.12973 -6.41602,12.86957 -14.3857,12.86957 l -293.80633,0 c -7.96968,0 -14.38571,-5.73984 -14.38571,-12.86957 l 0,-21.27287 c 0,-7.12974 6.41603,-12.86956 14.38571,-12.86956 z"
x="213.06563" style="fill:url(#linearGradient3162);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
y="367.78458" <path
ry="3.1741481" sodipodi:nodetypes="cccccccccc"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" style="fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
inkscape:export-xdpi="88.809998" d="m 224.9512,367.26369 c -8.52873,0.0985 -13.77003,8.07518 -12.24595,15.07676 0.20375,18.01353 -0.39748,1.94735 0.28182,19.92931 1.39088,7.05527 10.14028,10.28944 17.57472,9.0824 68.34921,-0.0913 222.21398,0.18235 290.55006,-0.13624 7.85203,-0.90791 12.30086,-8.2759 10.88812,-14.91783 -0.26287,-18.21519 0.52171,-2.37469 -0.38428,-20.54237 -1.63869,-6.32385 -9.58517,-9.6068 -16.62683,-8.51474 -68.18088,0.0152 -221.85763,-0.0303 -290.03766,0.0227 z"
inkscape:export-ydpi="88.809998" /> id="path4027-8"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="cccccccccc"
style="fill:url(#linearGradient4102);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
d="m 224.9512,367.26369 c -8.52873,0.0985 -13.77003,8.07518 -12.24595,15.07676 0.20375,18.01353 -0.39748,1.94735 0.28182,19.92931 1.39088,7.05527 10.14028,10.28944 17.57472,9.0824 68.3492,-0.0913 222.21398,0.18235 290.55006,-0.13624 7.85203,-0.90791 12.30086,-8.2759 10.88812,-14.91783 -0.26287,-18.21519 0.52171,-2.37469 -0.38428,-20.54237 -1.63869,-6.32385 -9.58517,-9.6068 -16.62683,-8.51474 -68.18088,0.0152 -221.85763,-0.0303 -290.03766,0.0227 z"
id="path4029-1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path3111"
d="m 224.9512,367.26369 c -8.52873,0.0985 -13.77003,8.07518 -12.24595,15.07676 0.20375,18.01353 -0.39748,1.94735 0.28182,19.92931 1.39088,7.05527 10.14028,10.28944 17.57472,9.0824 68.3492,-0.0913 222.21398,0.18235 290.55006,-0.13624 7.85203,-0.90791 12.30086,-8.2759 10.88812,-14.91783 -0.26287,-18.21519 0.52171,-2.37469 -0.38428,-20.54237 -1.63869,-6.32385 -9.58517,-9.6068 -16.62683,-8.51474 -68.18088,0.0152 -221.85763,-0.0303 -290.03766,0.0227 z"
style="fill:url(#radialGradient3115);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
sodipodi:nodetypes="cccccccccc" />
<path
style="fill:url(#linearGradient3190);fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 33.03125,1.375 C 32.192355,1.3732199 31.330241,1.4796575 30.5,1.65625 12.28481,1.91912 28.13643,1.12526 9.96875,2.03125 c -6.32385,1.63869 -9.59206,9.58334 -8.5,16.625 5.24e-5,0.235056 -5.1e-5,0.762919 0,1 4.4360171,2.086194 9.456744,7.28125 14.78125,7.28125 11.882421,0 22.263405,-9.875346 27.9375,-18.625 C 42.034371,3.9656676 37.579663,1.3846513 33.03125,1.375 z"
id="path3179"
transform="matrix(0,1,-1,0,533.64867,365.78458)"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sccccscs" />
<rect <rect
inkscape:label="#rect4388" inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -301,117 +763,225 @@
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828" ry="0.68289828"
y="395.16541" y="395.16541"
x="250.30202" x="252.30202"
height="9.2538376" height="9.2538376"
width="260.53882" width="260.53882"
id="bargraph-outer" id="bargraph-outer"
style="fill:#332d2d;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> style="fill:url(#linearGradient3124);fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
<rect <rect
style="fill:#332d2d;fill-opacity:1;stroke:none" style="fill:#332d2d;fill-opacity:1;stroke:none;display:inline"
id="bargraph" id="bargraph"
width="260.53882" width="260.53882"
height="9.2538376" height="9.2538376"
x="250.30202" x="252.302"
y="395.16541" y="395.16541"
ry="0.68289828" ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" /> inkscape:label="#rect4388" />
<path
style="fill:url(#linearGradient4100);fill-opacity:1;stroke:none"
d="m 532.25979,398.80414 c 0.002,-0.8389 -0.10466,-1.70101 -0.28125,-2.53125 -0.26287,-18.21519 0.53099,-2.36357 -0.375,-20.53125 -1.63869,-6.32385 -9.58334,-9.59206 -16.625,-8.5 -64.36775,0.0144 -220.9222,-0.0401 -293.8125,0 -6.65092,7.57393 -13.9371,20.66189 -6.09375,22.96875 9.87224,2.9036 257.55488,4.52087 269.75,6.84375 12.19512,2.32288 28.47924,8.71621 33.125,12.78125 0.37953,0.33209 0.81504,0.81325 1.28125,1.375 0.55724,-0.002 1.32861,0.003 1.875,0 6.87053,-0.79442 11.14379,-6.53398 11.15625,-12.40625 z"
id="path4050"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccsssccc" />
</g> </g>
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer5" id="layer5"
inkscape:label="Green Zone" inkscape:label="Green Zone"
style="display:inline" style="display:none"
transform="translate(-129.62194,129.52019)"> transform="translate(-129.62194,129.52019)"
<rect sodipodi:insensitive="true">
inkscape:label="#rect5741" <g
style="fill:#04b629;fill-opacity:1;stroke:none;display:inline"
id="green" id="green"
width="260.53882" inkscape:label="#g4104"
height="9.2538376" transform="translate(0,-2)">
x="-153.97397" <rect
y="158.98152" transform="matrix(0,-1,1,0,0,0)"
ry="0.68289828" inkscape:export-ydpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-xdpi="88.809998"
inkscape:export-xdpi="88.809998" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-ydpi="88.809998" ry="0.68289828"
transform="matrix(0,-1,1,0,0,0)" /> y="158.98152"
x="-153.97397"
height="9.2538376"
width="260.53882"
id="greencc"
style="fill:#04b629;fill-opacity:1;stroke:none;display:inline"
inkscape:label="#rect5741" />
<g
style="display:inline"
id="g4013-8"
transform="matrix(0,-1,-1,0,166.43682,250.84742)">
<rect
inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828"
y="-7.4553013"
x="96.873451"
height="9.2538376"
width="260.53882"
id="bargraph-7-6"
style="fill:url(#linearGradient4017-9-8);fill-opacity:1;stroke:none;display:inline"
transform="scale(1,-1)" />
<rect
style="fill:url(#linearGradient3206);fill-opacity:1;stroke:none;display:inline"
id="rect3946-9"
width="260.53882"
height="9.2538376"
x="96.873451"
y="-7.4553032"
ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388"
transform="scale(1,-1)" />
</g>
</g>
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer4" id="layer4"
inkscape:label="Yellow Zone" inkscape:label="Yellow Zone"
style="display:inline" style="display:none"
transform="translate(-129.62194,129.52019)"> transform="translate(-129.62194,129.52019)"
<rect sodipodi:insensitive="true">
inkscape:export-ydpi="88.809998" <g
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828"
y="158.98152"
x="-153.97397"
height="9.2538376"
width="260.53882"
id="yellow" id="yellow"
style="fill:#f1b907;fill-opacity:1;stroke:none;display:inline" inkscape:label="#g4159"
inkscape:label="#rect5741" transform="translate(0,-2)">
transform="matrix(0,-1,1,0,0,0)" /> <rect
transform="matrix(0,-1,1,0,0,0)"
inkscape:label="#rect5741"
style="fill:#f1b907;fill-opacity:1;stroke:none;display:inline"
id="yellowkkk"
width="260.53882"
height="9.2538376"
x="-153.97397"
y="158.98152"
ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" />
<rect
transform="matrix(0,-1,1,0,0,0)"
style="fill:url(#linearGradient4216);fill-opacity:1;stroke:none;display:inline"
id="bargraph-7-6-3"
width="260.53882"
height="9.2538376"
x="-153.97397"
y="158.98152"
ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" />
<rect
transform="matrix(0,-1,1,0,0,0)"
inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828"
y="158.98152"
x="-153.97397"
height="9.2538376"
width="260.53882"
id="rect3946-9-6"
style="fill:url(#linearGradient4212);fill-opacity:1;stroke:none;display:inline" />
</g>
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer3" id="layer3"
inkscape:label="Red zone" inkscape:label="Red zone"
style="display:inline" style="display:none"
transform="translate(-129.62194,129.52019)"> transform="translate(-129.62194,129.52019)"
<rect sodipodi:insensitive="true">
inkscape:label="#rect5741" <g
style="fill:#cf0e0e;fill-opacity:1;stroke:none;display:inline"
id="red" id="red"
width="260.53882" inkscape:label="#g4224"
height="9.2538376" transform="translate(0,-2)">
x="-154.0755" <rect
y="158.96294" transform="matrix(0,-1,1,0,0,0)"
ry="0.68289828" inkscape:export-ydpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-xdpi="88.809998"
inkscape:export-xdpi="88.809998" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-ydpi="88.809998" ry="0.68289828"
transform="matrix(0,-1,1,0,0,0)" /> y="158.96294"
x="-154.0755"
height="9.2538376"
width="260.53882"
id="reddd"
style="fill:#cf0e0e;fill-opacity:1;stroke:none;display:inline"
inkscape:label="#rect5741" />
<rect
transform="matrix(0,-1,1,0,0,0)"
style="fill:url(#linearGradient4260);fill-opacity:1;stroke:none;display:inline"
id="bargraph-7-6-8"
width="260.53882"
height="9.2538376"
x="-154.0755"
y="158.96294"
ry="0.68289828"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" />
<rect
transform="matrix(0,-1,1,0,0,0)"
inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="0.68289828"
y="158.96294"
x="-154.0755"
height="9.2538376"
width="260.53882"
id="rect3946-9-2"
style="fill:url(#linearGradient4257);fill-opacity:1;stroke:none;display:inline" />
</g>
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer6" id="layer6"
inkscape:label="Indicator" inkscape:label="Indicator"
style="display:inline" style="display:none"
transform="translate(-129.62194,129.52019)"> transform="translate(-129.62194,129.52019)"
sodipodi:insensitive="true">
<path <path
style="fill:#ffffff;fill-opacity:1;stroke:#c2bfbf;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 149.75986,-113.1656 0,14.26841 12,-7.13421 -12,-7.1342 z" d="m 149.75986,-115.1656 0,14.26841 12,-7.13421 -12,-7.1342 z"
id="needle" id="needle"
sodipodi:nodetypes="cccc" sodipodi:nodetypes="cccc"
inkscape:label="#path5747" /> inkscape:label="#path5747"
inkscape:connector-curvature="0" />
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1" id="layer1"
inkscape:label="Text" inkscape:label="Text"
style="display:inline" style="display:none"
transform="translate(-129.62194,129.52019)"> transform="translate(-129.62194,129.52019)">
<rect <rect
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:#ffffff;fill-opacity:1;stroke:none"
id="field" id="field"
width="36.996838" width="36.996838"
height="12.626906" height="12.626906"
x="4.9244938" x="132.54643"
y="285.58621" y="154.06602"
transform="translate(129.62194,-129.52019)"
inkscape:label="#rect2878" /> inkscape:label="#rect2878" />
<rect <rect
inkscape:label="#rect2878" inkscape:label="#rect2878"
y="170.06602" y="170.06602"
x="134.54643" x="132.54643"
height="12.626906" height="12.626906"
width="36.996838" width="36.996838"
id="value" id="value"

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -14,7 +14,7 @@
height="80.827866" height="80.827866"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.47 r22583" inkscape:version="0.48.2 r9819"
sodipodi:docname="textonly.svg" sodipodi:docname="textonly.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
@ -480,19 +480,6 @@
offset="1" offset="1"
id="stop5228-8" /> id="stop5228-8" />
</linearGradient> </linearGradient>
<filter
color-interpolation-filters="sRGB"
y="-0.33411592"
x="-0.09814655"
width="1.1962931"
inkscape:collect="always"
id="filter5296-2"
height="1.6682318">
<feGaussianBlur
stdDeviation="0.81788793"
inkscape:collect="always"
id="feGaussianBlur5298-4" />
</filter>
<linearGradient <linearGradient
id="linearGradient5226-1"> id="linearGradient5226-1">
<stop <stop
@ -949,6 +936,158 @@
fx="29.77438" fx="29.77438"
fy="7.0922189" fy="7.0922189"
r="25.380436" /> r="25.380436" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3"
id="linearGradient4128-2"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
id="linearGradient3285-6-3"
inkscape:collect="always">
<stop
id="stop3287-9-8"
offset="0"
style="stop-color:#333333;stop-opacity:1" />
<stop
id="stop3289-8-2"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2"
id="linearGradient4130-6"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
id="linearGradient3259-9-2">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3261-8-7" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3263-3-5" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="431.06937"
x1="300.36011"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient4185"
xlink:href="#linearGradient3790-4-8"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="431.06937"
x1="300.36011"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3561"
xlink:href="#linearGradient3790-4-8"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3285-6-3-7"
id="linearGradient4128-2-1"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="295.07001"
y1="573.90204"
x2="295.65781"
y2="418.138" />
<linearGradient
id="linearGradient3285-6-3-7"
inkscape:collect="always">
<stop
id="stop3287-9-8-4"
offset="0"
style="stop-color:#333333;stop-opacity:1" />
<stop
id="stop3289-8-2-0"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3259-9-2-4"
id="linearGradient4130-6-9"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-313.07707,-140.80709)"
x1="311.52808"
y1="572.13867"
x2="310.94031"
y2="526.29114" />
<linearGradient
inkscape:collect="always"
id="linearGradient3259-9-2-4">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3261-8-7-8" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3263-3-5-8" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient4185-2"
xlink:href="#linearGradient3790-4-8-4"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
id="linearGradient3790-4-8-4">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3792-5-2-5" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3794-2-7-5" />
</linearGradient>
<linearGradient
y2="506.89417"
x2="300.36011"
y1="368.20679"
x1="298.43829"
gradientTransform="translate(-313.07707,-140.80709)"
gradientUnits="userSpaceOnUse"
id="linearGradient3489"
xlink:href="#linearGradient3790-4-8-4"
inkscape:collect="always" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -961,12 +1100,12 @@
inkscape:cx="56.191298" inkscape:cx="56.191298"
inkscape:cy="90.710362" inkscape:cy="90.710362"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="g4122"
showgrid="false" showgrid="false"
inkscape:window-width="1366" inkscape:window-width="1600"
inkscape:window-height="693" inkscape:window-height="823"
inkscape:window-x="0" inkscape:window-x="-9"
inkscape:window-y="24" inkscape:window-y="-9"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -982,7 +1121,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title> <dc:title />
<dc:creator> <dc:creator>
<cc:Agent> <cc:Agent>
<dc:title>Edouard Lafargue</dc:title> <dc:title>Edouard Lafargue</dc:title>
@ -1000,29 +1139,6 @@
<g <g
id="background" id="background"
inkscape:label="#g8543"> inkscape:label="#g8543">
<rect
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:3.36186838;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect2936"
width="225.91589"
height="77.465996"
x="207.54964"
y="333.1326"
ry="5.7166986"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" />
<rect
inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="4.7808909"
y="339.47308"
x="217.77841"
height="64.785042"
width="205.45833"
id="bargraph"
style="fill:#332d2d;fill-opacity:1;stroke:none" />
<text <text
xml:space="preserve" xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans" style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
@ -1034,6 +1150,39 @@
id="tspan2987" id="tspan2987"
x="30" x="30"
y="37.256439" /></text> y="37.256439" /></text>
<g
style="display:inline"
id="g4122"
transform="matrix(0.78843192,0,0,0.71508023,322.16663,104.29215)">
<g
style="display:inline"
id="g4122-1"
transform="matrix(1.0055464,0,0,1.0121203,0.63869144,-5.2612169)">
<rect
ry="17.712246"
y="319.06393"
x="-147.32065"
height="111.67988"
width="289.19211"
id="rect2985"
style="fill:url(#linearGradient4128-2-1);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<path
inkscape:connector-curvature="0"
id="rect3814"
d="m -130.38957,321.09916 c -10.40328,0.13552 -16.79656,11.11379 -14.9375,20.75 0.24853,24.79185 -0.48485,49.65785 0.34375,74.40625 1.69659,9.71009 12.36903,14.16124 21.4375,12.5 83.37176,-0.12573 166.769249,0.25097 250.125,-0.1875 9.57786,-1.24954 15.0045,-11.39003 13.28125,-20.53125 -0.32065,-25.06939 0.63636,-50.246 -0.46875,-75.25 -1.99885,-8.70345 -11.6919,-13.22175 -20.28125,-11.71875 -83.166451,0.0209 -166.33459,-0.0417 -249.5,0.0312 z"
style="fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<path
inkscape:connector-curvature="0"
id="rect3755"
d="m -130.38957,321.09916 c -10.40328,0.13552 -16.79656,11.11379 -14.9375,20.75 0.24853,24.79185 -0.48485,49.65785 0.34375,74.40625 1.69659,9.71009 12.36903,14.16124 21.4375,12.5 83.37176,-0.12573 166.769248,0.25097 250.125,-0.1875 9.57786,-1.24954 15.0045,-11.39003 13.28125,-20.53125 -0.32065,-25.06939 0.63636,-50.246 -0.46875,-75.25 -1.99885,-8.70345 -11.6919,-13.22175 -20.28125,-11.71875 -83.166452,0.0209 -166.33459,-0.0417 -249.5,0.0312 z"
style="fill:url(#linearGradient4130-6-9);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
<path
inkscape:connector-curvature="0"
id="rect3781"
d="m -129.60832,319.06791 c -9.81258,0 -17.71875,7.90617 -17.71875,17.71875 l 0,7.46875 c 21.91332,13.37842 82.3034,23 153.4062474,23 56.8274986,0 106.8063826,-6.14199 135.7812526,-15.4375 l 0,-15.03125 c 0,-9.81258 -7.87492,-17.71875 -17.6875,-17.71875 l -253.78125,0 z"
style="fill:url(#linearGradient3489);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
</g>
</g>
</g> </g>
</g> </g>
<g <g

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -14,8 +14,8 @@
height="70.597504" height="70.597504"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.48.1 " inkscape:version="0.48.2 r9819"
sodipodi:docname="lineardial-horizontal.svg" sodipodi:docname="lineardial-horizontal-old2.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
inkscape:export-ydpi="103.61" inkscape:export-ydpi="103.61"
@ -25,15 +25,19 @@
<linearGradient <linearGradient
id="linearGradient4439"> id="linearGradient4439">
<stop <stop
style="stop-color:#1a1a1a;stop-opacity:1" style="stop-color:#666666;stop-opacity:0;"
offset="0" offset="0"
id="stop4441" /> id="stop4441" />
<stop <stop
id="stop4443" id="stop4443"
offset="0.19742694" offset="0.31684026"
style="stop-color:#808080;stop-opacity:1" /> style="stop-color:#a3a3a3;stop-opacity:1;" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#757575;stop-opacity:0.90517241;"
offset="0.62995511"
id="stop3987" />
<stop
style="stop-color:#666666;stop-opacity:0;"
offset="1" offset="1"
id="stop4445" /> id="stop4445" />
</linearGradient> </linearGradient>
@ -57,15 +61,11 @@
<stop <stop
id="stop4389" id="stop4389"
offset="0" offset="0"
style="stop-color:#4d4d4d;stop-opacity:1" /> style="stop-color:#8a8a8a;stop-opacity:1;" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#181818;stop-opacity:1;"
offset="0.60976541"
id="stop4391" />
<stop
id="stop4393"
offset="1" offset="1"
style="stop-color:#4d4d4d;stop-opacity:1" /> id="stop4391" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient4361"> id="linearGradient4361">
@ -237,15 +237,15 @@
<stop <stop
id="stop3905" id="stop3905"
offset="0" offset="0"
style="stop-color:#000000;stop-opacity:1" /> style="stop-color:#676767;stop-opacity:1;" />
<stop <stop
style="stop-color:#ffffff;stop-opacity:1" style="stop-color:#ffffff;stop-opacity:1"
offset="0.3220683" offset="0.43894145"
id="stop3907" /> id="stop3907" />
<stop <stop
id="stop3909" id="stop3909"
offset="1" offset="1"
style="stop-color:#000000;stop-opacity:1" /> style="stop-color:#7d7d7d;stop-opacity:1;" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5375"> id="linearGradient5375">
@ -425,46 +425,34 @@
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5116"> id="linearGradient5116">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop5118" />
<stop <stop
id="stop5124" id="stop5124"
offset="0.35911319" offset="0"
style="stop-color:#dcaf28;stop-opacity:1" /> style="stop-color:#ffc001;stop-opacity:1;" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#844700;stop-opacity:1;"
offset="1" offset="1"
id="stop5120" /> id="stop5120" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5106"> id="linearGradient5106">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop5108" />
<stop <stop
id="stop5114" id="stop5114"
offset="0.36023793" offset="0"
style="stop-color:#00a000;stop-opacity:1" /> style="stop-color:#00a000;stop-opacity:1" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#003d00;stop-opacity:1;"
offset="1" offset="1"
id="stop5110" /> id="stop5110" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5096"> id="linearGradient5096">
<stop
style="stop-color:#100000;stop-opacity:1"
offset="0"
id="stop5098" />
<stop <stop
id="stop5104" id="stop5104"
offset="0.36453304" offset="0"
style="stop-color:#aa0000;stop-opacity:1" /> style="stop-color:#e60000;stop-opacity:1;" />
<stop <stop
style="stop-color:#0c0000;stop-opacity:1" style="stop-color:#710000;stop-opacity:1;"
offset="1" offset="1"
id="stop5100" /> id="stop5100" />
</linearGradient> </linearGradient>
@ -687,7 +675,7 @@
x2="87.074203" x2="87.074203"
y2="168.83261" y2="168.83261"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,0.99999995,-0.99999975,0,-11.23354,-270.8763)" /> gradientTransform="matrix(0,1.0110991,-1.0062411,0,-10.360287,-272.19756)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5106" xlink:href="#linearGradient5106"
@ -697,7 +685,7 @@
x2="86.644958" x2="86.644958"
y2="173.46591" y2="173.46591"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,0.99999997,-1,0,-11.23354,-270.8763)" /> gradientTransform="matrix(0,1.0224134,-1.0048488,0,-10.554719,-273.54528)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5116" xlink:href="#linearGradient5116"
@ -707,7 +695,7 @@
x2="86.547356" x2="86.547356"
y2="168.82289" y2="168.82289"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,1,-1,0,-11.23354,-270.8763)" /> gradientTransform="matrix(0,1,-1.0055415,0,-10.459485,-270.8763)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5129" xlink:href="#linearGradient5129"
@ -932,7 +920,7 @@
xlink:href="#linearGradient3903" xlink:href="#linearGradient3903"
id="linearGradient3899" id="linearGradient3899"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,-0.99999988,1.7142859,0,35.373449,-317.43383)" gradientTransform="matrix(0,-0.99937716,1.7523173,0,32.05963,-317.33185)"
x1="-150.75359" x1="-150.75359"
y1="68.860146" y1="68.860146"
x2="-150.75359" x2="-150.75359"
@ -1120,16 +1108,16 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="3.1841238" inkscape:zoom="5.5410688"
inkscape:cx="140.38399" inkscape:cx="55.238424"
inkscape:cy="35.455778" inkscape:cy="35.455778"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer5" inkscape:current-layer="background"
showgrid="false" showgrid="false"
inkscape:window-width="1366" inkscape:window-width="1680"
inkscape:window-height="706" inkscape:window-height="957"
inkscape:window-x="-8" inkscape:window-x="-5"
inkscape:window-y="-8" inkscape:window-y="2"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -1163,8 +1151,7 @@
inkscape:label="Dark background" inkscape:label="Dark background"
id="g2932" id="g2932"
inkscape:groupmode="layer" inkscape:groupmode="layer"
transform="translate(-368.2988,-507.08981)" transform="translate(-368.2988,-507.08981)">
sodipodi:insensitive="true">
<g <g
id="background" id="background"
inkscape:label="#g4447"> inkscape:label="#g4447">
@ -1225,17 +1212,16 @@
id="layer5" id="layer5"
inkscape:label="Green Zone" inkscape:label="Green Zone"
style="display:inline" style="display:inline"
transform="translate(-140.85549,-141.35611)" transform="translate(-140.85549,-141.35611)">
sodipodi:insensitive="true">
<rect <rect
inkscape:label="#rect5741" inkscape:label="#rect5741"
style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline"
id="green" id="green"
width="260.53882" width="261.80212"
height="32.20755" height="32.929432"
x="-411.77084" x="-413.03415"
y="-184.00433" y="-184.72621"
ry="2.3767958" ry="2.430068"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -1246,17 +1232,16 @@
id="layer4" id="layer4"
inkscape:label="Yellow Zone" inkscape:label="Yellow Zone"
style="display:none" style="display:none"
transform="translate(-140.85549,-141.35611)" transform="translate(-140.85549,-141.35611)">
sodipodi:insensitive="true">
<rect <rect
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="2.4231479" ry="2.4231479"
y="-184.63248" y="-184.63248"
x="-411.45679" x="-412.90054"
height="32.835663" height="32.835663"
width="260.53882" width="261.98257"
id="yellow" id="yellow"
style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline"
inkscape:label="#rect5741" inkscape:label="#rect5741"
@ -1267,17 +1252,16 @@
id="layer3" id="layer3"
inkscape:label="Red zone" inkscape:label="Red zone"
style="display:none" style="display:none"
transform="translate(-140.85549,-141.35611)" transform="translate(-140.85549,-141.35611)">
sodipodi:insensitive="true">
<rect <rect
inkscape:label="#rect5741" inkscape:label="#rect5741"
style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline"
id="red" id="red"
width="260.23901" width="261.86325"
height="32.519711" height="32.880653"
x="-411.38739" x="-413.01163"
y="-184.35484" y="-184.71579"
ry="2.399832" ry="2.4264681"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -1288,17 +1272,18 @@
id="layer6" id="layer6"
inkscape:label="Indicator" inkscape:label="Indicator"
style="display:inline" style="display:inline"
transform="translate(-140.85549,-141.35611)" transform="translate(-140.85549,-141.35611)">
sodipodi:insensitive="true">
<rect <rect
style="fill:url(#linearGradient3899);fill-opacity:1;stroke:#000000;stroke-width:0.2964696;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#linearGradient3899);fill-opacity:1;stroke:#000000;stroke-width:0.4;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="needle" id="needle"
width="32.035065" width="33.114704"
height="6.0045304" height="5.0989962"
x="152.63882" x="151.5576"
y="-157.12926" y="-156.22531"
inkscape:label="#rect5246" inkscape:label="#rect5246"
transform="matrix(0,1,-1,0,0,0)" /> transform="matrix(0,1,-1,0,0,0)"
ry="2.5494981"
rx="1.9392394" />
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -14,20 +14,31 @@
height="322.58304" height="322.58304"
id="svg10068" id="svg10068"
version="1.1" version="1.1"
inkscape:version="0.48.1 " inkscape:version="0.48.2 r9819"
sodipodi:docname="lineardial-vertical.svg" sodipodi:docname="lineardial-vertical-old2.svg"
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png" inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
inkscape:export-xdpi="103.61" inkscape:export-xdpi="103.61"
inkscape:export-ydpi="103.61" inkscape:export-ydpi="103.61"
style="display:inline"> style="display:inline">
<defs <defs
id="defs10070"> id="defs10070">
<linearGradient
id="linearGradient3894">
<stop
style="stop-color:#171717;stop-opacity:1;"
offset="0"
id="stop3896" />
<stop
style="stop-color:#b0b0b0;stop-opacity:1;"
offset="1"
id="stop3898" />
</linearGradient>
<linearGradient <linearGradient
id="linearGradient3903"> id="linearGradient3903">
<stop <stop
id="stop3905" id="stop3905"
offset="0" offset="0"
style="stop-color:#000000;stop-opacity:1" /> style="stop-color:#656565;stop-opacity:1;" />
<stop <stop
style="stop-color:#ffffff;stop-opacity:1" style="stop-color:#ffffff;stop-opacity:1"
offset="0.39386007" offset="0.39386007"
@ -35,7 +46,7 @@
<stop <stop
id="stop3909" id="stop3909"
offset="1" offset="1"
style="stop-color:#000000;stop-opacity:1" /> style="stop-color:#757575;stop-opacity:1;" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5375"> id="linearGradient5375">
@ -83,15 +94,19 @@
<stop <stop
id="stop5348" id="stop5348"
offset="0" offset="0"
style="stop-color:#1a1a1a;stop-opacity:1" /> style="stop-color:#9c9c9c;stop-opacity:0;" />
<stop <stop
style="stop-color:#666666;stop-opacity:1" id="stop3921"
offset="0.35277387" offset="0.359375"
id="stop5350" /> style="stop-color:#6c6c6c;stop-opacity:0.88793105;" />
<stop
style="stop-color:#5f5f5f;stop-opacity:0.62931037;"
offset="0.62630206"
id="stop3923" />
<stop <stop
id="stop5352" id="stop5352"
offset="1" offset="1"
style="stop-color:#1a1a1a;stop-opacity:1" /> style="stop-color:#9c9c9c;stop-opacity:0;" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5326"> id="linearGradient5326">
@ -215,46 +230,34 @@
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5116"> id="linearGradient5116">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop5118" />
<stop <stop
id="stop5124" id="stop5124"
offset="0.37640449" offset="0"
style="stop-color:#dcaf28;stop-opacity:1" /> style="stop-color:#ffc001;stop-opacity:1;" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#844700;stop-opacity:1;"
offset="1" offset="1"
id="stop5120" /> id="stop5120" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5106"> id="linearGradient5106">
<stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop5108" />
<stop <stop
id="stop5114" id="stop5114"
offset="0.38184431" offset="0"
style="stop-color:#00a000;stop-opacity:1" /> style="stop-color:#00a000;stop-opacity:1" />
<stop <stop
style="stop-color:#000000;stop-opacity:1" style="stop-color:#003d00;stop-opacity:1;"
offset="1" offset="1"
id="stop5110" /> id="stop5110" />
</linearGradient> </linearGradient>
<linearGradient <linearGradient
id="linearGradient5096"> id="linearGradient5096">
<stop
style="stop-color:#100000;stop-opacity:1"
offset="0"
id="stop5098" />
<stop <stop
id="stop5104" id="stop5104"
offset="0.39717463" offset="0"
style="stop-color:#aa0000;stop-opacity:1" /> style="stop-color:#e60000;stop-opacity:1;" />
<stop <stop
style="stop-color:#0c0000;stop-opacity:1" style="stop-color:#710000;stop-opacity:1;"
offset="1" offset="1"
id="stop5100" /> id="stop5100" />
</linearGradient> </linearGradient>
@ -475,7 +478,8 @@
y1="132.84332" y1="132.84332"
x2="-58.661255" x2="-58.661255"
y2="169.46072" y2="169.46072"
gradientUnits="userSpaceOnUse" /> gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0045664,0,0,0.98072534,3.8285685,3.8328979)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5106" xlink:href="#linearGradient5106"
@ -484,7 +488,8 @@
y1="133.15433" y1="133.15433"
x2="-38.946774" x2="-38.946774"
y2="168.58655" y2="168.58655"
gradientUnits="userSpaceOnUse" /> gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0048708,0,0,1.0000284,3.816285,2.2385824)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5116" xlink:href="#linearGradient5116"
@ -493,7 +498,8 @@
y1="133.16322" y1="133.16322"
x2="-17.108463" x2="-17.108463"
y2="168.82289" y2="168.82289"
gradientUnits="userSpaceOnUse" /> gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0057658,0,0,0.99502095,3.8176724,2.8357789)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5129" xlink:href="#linearGradient5129"
@ -711,7 +717,8 @@
x1="-246.82069" x1="-246.82069"
y1="353.9455" y1="353.9455"
x2="-247.44464" x2="-247.44464"
y2="412.00528" /> y2="412.00528"
gradientTransform="matrix(1,0,0,0.98663274,0,3.8538758)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient5375" xlink:href="#linearGradient5375"
@ -727,11 +734,21 @@
xlink:href="#linearGradient3903" xlink:href="#linearGradient3903"
id="linearGradient3899" id="linearGradient3899"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.99999998,0,0,1.7142857,306.20028,-235.50286)" gradientTransform="matrix(1.0304804,0,0,1.7130087,311.94981,-242.17845)"
x1="-172.33069" x1="-172.33069"
y1="74.562233" y1="74.562233"
x2="-135.50557" x2="-136.75557"
y2="74.562233" /> y2="74.015358" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3894"
id="linearGradient3900"
x1="-353.51318"
y1="324.74451"
x2="-355.30441"
y2="355.70587"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0187536,0,0,1.2873355,10.177224,-58.104213)" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -740,16 +757,16 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1.9843492" inkscape:zoom="7.87"
inkscape:cx="13.888309" inkscape:cx="0.68217946"
inkscape:cy="302.67927" inkscape:cy="151.28502"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer6" inkscape:current-layer="layer4"
showgrid="false" showgrid="false"
inkscape:window-width="1366" inkscape:window-width="1680"
inkscape:window-height="706" inkscape:window-height="957"
inkscape:window-x="-8" inkscape:window-x="0"
inkscape:window-y="-8" inkscape:window-y="0"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:object-paths="true" inkscape:object-paths="true"
showguides="true" showguides="true"
@ -765,7 +782,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title /> <dc:title></dc:title>
<dc:creator> <dc:creator>
<cc:Agent> <cc:Agent>
<dc:title>Edouard Lafargue</dc:title> <dc:title>Edouard Lafargue</dc:title>
@ -779,8 +796,7 @@
inkscape:label="Dark background" inkscape:label="Dark background"
id="g2932" id="g2932"
inkscape:groupmode="layer" inkscape:groupmode="layer"
transform="translate(-357.06525,-236.21351)" transform="translate(-357.06525,-236.21351)">
sodipodi:insensitive="true">
<g <g
id="background" id="background"
inkscape:label="#g5354"> inkscape:label="#g5354">
@ -789,39 +805,39 @@
style="fill:url(#linearGradient5344);fill-opacity:1;stroke:none" style="fill:url(#linearGradient5344);fill-opacity:1;stroke:none"
id="rect2936" id="rect2936"
width="318.58304" width="318.58304"
height="46.756046" height="46.131046"
x="-556.79657" x="-556.79657"
y="358.44128" y="357.50378"
ry="3.4504199" ry="3.4042974"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" /> inkscape:export-ydpi="88.809998" />
<rect
transform="matrix(0,-1,1,0,0,0)"
style="fill:#332d2d;fill-opacity:1;stroke:none"
id="bargraph"
width="260.53882"
height="34.835861"
x="-519.56018"
y="362.7359"
ry="2.5707548"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" />
<rect <rect
transform="matrix(0,-1,1,0,0,0)" transform="matrix(0,-1,1,0,0,0)"
inkscape:label="#rect4388" inkscape:label="#rect4388"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="2.2944832" ry="2.9537699"
y="365.23175" y="360.57819"
x="-519.56018" x="-519.12665"
height="31.09215" height="40.026031"
width="260.53882" width="265.4249"
id="bargraph-outer" id="bargraph-outer"
style="fill:#332d2d;fill-opacity:1;stroke:none" /> style="fill:url(#linearGradient3900);fill-opacity:1;stroke:none" />
<rect
transform="matrix(0,-1,1,0,0,0)"
style="fill:#332d2d;fill-opacity:1;stroke:none"
id="bargraph"
width="262.19809"
height="33.195633"
x="-516.71185"
y="363.7984"
ry="16.597816"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998"
inkscape:label="#rect4388" />
</g> </g>
</g> </g>
<g <g
@ -829,17 +845,16 @@
id="layer5" id="layer5"
inkscape:label="Green Zone" inkscape:label="Green Zone"
style="display:inline" style="display:inline"
transform="translate(-129.62194,129.52019)" transform="translate(-129.62194,129.52019)">
sodipodi:insensitive="true">
<rect <rect
inkscape:label="#rect5741" inkscape:label="#rect5741"
style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline"
id="green" id="green"
width="260.53882" width="261.80789"
height="34.0919" height="34.092869"
x="-153.97397" x="-150.90765"
y="134.02345" y="136.26584"
ry="2.5158536" ry="2.5159254"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -849,18 +864,17 @@
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer4" id="layer4"
inkscape:label="Yellow Zone" inkscape:label="Yellow Zone"
style="display:none" style="display:inline"
transform="translate(-129.62194,129.52019)" transform="translate(-129.62194,129.52019)">
sodipodi:insensitive="true">
<rect <rect
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
ry="2.5158532" ry="2.5033269"
y="134.02345" y="136.19191"
x="-153.97397" x="-151.04408"
height="34.091896" height="33.92215"
width="260.53882" width="262.04108"
id="yellow" id="yellow"
style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline"
inkscape:label="#rect5741" inkscape:label="#rect5741"
@ -871,17 +885,16 @@
id="layer3" id="layer3"
inkscape:label="Red zone" inkscape:label="Red zone"
style="display:none" style="display:none"
transform="translate(-129.62194,129.52019)" transform="translate(-129.62194,129.52019)">
sodipodi:insensitive="true">
<rect <rect
inkscape:label="#rect5741" inkscape:label="#rect5741"
style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline" style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline"
id="red" id="red"
width="260.53882" width="261.72849"
height="34.589863" height="33.923153"
x="-154.0755" x="-150.95049"
y="134.00487" y="135.25487"
ry="2.5526016" ry="2.503401"
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png" inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
inkscape:export-xdpi="88.809998" inkscape:export-xdpi="88.809998"
inkscape:export-ydpi="88.809998" inkscape:export-ydpi="88.809998"
@ -894,35 +907,35 @@
style="display:inline" style="display:inline"
transform="translate(-129.62194,129.52019)"> transform="translate(-129.62194,129.52019)">
<rect <rect
style="fill:url(#linearGradient3899);fill-opacity:1;stroke:#000000;stroke-width:0.30000000999999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:url(#linearGradient3899);fill-opacity:1;stroke:#000000;stroke-width:0.30442432;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="needle" id="needle"
width="33.162418" width="34.173222"
height="5.9393759" height="5.9349518"
x="135.64999" x="136.20108"
y="-107.91632" y="-114.68695"
inkscape:label="#rect5246" /> inkscape:label="#rect5246"
ry="2.4981377" />
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1" id="layer1"
inkscape:label="Text" inkscape:label="Text"
style="display:inline" style="display:inline"
transform="translate(-129.62194,129.52019)" transform="translate(-129.62194,129.52019)">
sodipodi:insensitive="true">
<rect <rect
style="fill:#ffffff;fill-opacity:1;stroke:none" style="fill:#ffffff;fill-opacity:1;stroke:none"
id="field" id="field"
width="33.853165" width="46.305515"
height="12.626906" height="12.626906"
x="128.30692" x="129.09726"
y="157.31393" y="157.31393"
inkscape:label="#rect2878" /> inkscape:label="#rect2878" />
<rect <rect
inkscape:label="#rect2878" inkscape:label="#rect2878"
y="170.91206" y="170.91206"
x="128.88902" x="129.9335"
height="12.626906" height="12.626906"
width="32.851257" width="45.176544"
id="value" id="value"
style="fill:#ffffff;fill-opacity:1;stroke:none" /> style="fill:#ffffff;fill-opacity:1;stroke:none" />
</g> </g>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -172,7 +172,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleGetInfoString</key> <key>CFBundleGetInfoString</key>
<string>Qt Creator; Copyright Nokia Corporation</string> <string>OpenPilot GCS; Copyright OpenPilot</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>@ICON@</string> <string>@ICON@</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
@ -182,7 +182,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>@EXECUTABLE@</string> <string>@EXECUTABLE@</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>com.nokia.qtcreator</string> <string>org.openpilot.openpilotgcs</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1.3.1</string> <string>1.3.1</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>

View File

@ -239,6 +239,8 @@ int main(int argc, char **argv)
setrlimit(RLIMIT_NOFILE, &rl); setrlimit(RLIMIT_NOFILE, &rl);
#endif #endif
QApplication::setGraphicsSystem("raster");
SharedTools::QtSingleApplication app((QLatin1String(appNameC)), argc, argv); SharedTools::QtSingleApplication app((QLatin1String(appNameC)), argc, argv);
QString locale = QLocale::system().name(); QString locale = QLocale::system().name();

View File

@ -10,5 +10,6 @@
<dependency name="UAVTalk" version="1.0.0"/> <dependency name="UAVTalk" version="1.0.0"/>
<dependency name="UAVObjectUtil" version="1.0.0"/> <dependency name="UAVObjectUtil" version="1.0.0"/>
<dependency name="UAVSettingsImportExport" version="1.0.0"/> <dependency name="UAVSettingsImportExport" version="1.0.0"/>
<dependency name="UAVObjectWidgetUtils" version="1.0.0"/>
</dependencyList> </dependencyList>
</plugin> </plugin>

View File

@ -30,9 +30,6 @@
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="pixmap">
<pixmap resource="configgadget.qrc">:/configgadget/images/coptercontrol.svg</pixmap>
</property>
<property name="scaledContents"> <property name="scaledContents">
<bool>true</bool> <bool>true</bool>
</property> </property>

View File

@ -0,0 +1,7 @@
#include(config_dependencies.pri)
include(../../plugins/uavsettingsimportexport/uavsettingsimportexport.pri)
include(../../plugins/uavtalk/uavtalk.pri)
# Add the include path to the built-in uavobject include files.
INCLUDEPATH += $$PWD
LIBS *= -l$$qtLibraryName(Config)

View File

@ -1,13 +1,8 @@
TEMPLATE = lib TEMPLATE = lib
TARGET = Config TARGET = Config
DEFINES += CONFIG_LIBRARY
QT += svg QT += svg
include(../../openpilotgcsplugin.pri) include(config_dependencies.pri)
include(../../libs/utils/utils.pri)
include(../../plugins/uavtalk/uavtalk.pri)
include(../../plugins/coreplugin/coreplugin.pri)
include(../../plugins/uavobjects/uavobjects.pri)
include(../../plugins/uavobjectutil/uavobjectutil.pri)
include(../../plugins/uavsettingsimportexport/uavsettingsimportexport.pri)
INCLUDEPATH += ../../libs/eigen INCLUDEPATH += ../../libs/eigen
OTHER_FILES += Config.pluginspec OTHER_FILES += Config.pluginspec
HEADERS += configplugin.h \ HEADERS += configplugin.h \
@ -19,25 +14,21 @@ HEADERS += configplugin.h \
fancytabwidget.h \ fancytabwidget.h \
configinputwidget.h \ configinputwidget.h \
configoutputwidget.h \ configoutputwidget.h \
configtaskwidget.h \
configairframewidget.h \ configairframewidget.h \
config_pro_hw_widget.h \ config_pro_hw_widget.h \
config_cc_hw_widget.h \ config_cc_hw_widget.h \
configccattitudewidget.h \ configccattitudewidget.h \
mixercurvewidget.h \
mixercurvepoint.h \
mixercurveline.h \
configccpmwidget.h \ configccpmwidget.h \
configstabilizationwidget.h \ configstabilizationwidget.h \
assertions.h \ assertions.h \
calibration.h \ calibration.h \
defaultattitudewidget.h \ defaultattitudewidget.h \
smartsavebutton.h \
defaulthwsettingswidget.h \ defaulthwsettingswidget.h \
inputchannelform.h \ inputchannelform.h \
configcamerastabilizationwidget.h \ configcamerastabilizationwidget.h \
outputchannelform.h \ outputchannelform.h \
configrevowidget.h configrevowidget.h \
config_global.h
SOURCES += configplugin.cpp \ SOURCES += configplugin.cpp \
configgadgetconfiguration.cpp \ configgadgetconfiguration.cpp \
configgadgetwidget.cpp \ configgadgetwidget.cpp \
@ -45,16 +36,12 @@ SOURCES += configplugin.cpp \
configgadgetoptionspage.cpp \ configgadgetoptionspage.cpp \
configgadget.cpp \ configgadget.cpp \
fancytabwidget.cpp \ fancytabwidget.cpp \
configtaskwidget.cpp \
configinputwidget.cpp \ configinputwidget.cpp \
configoutputwidget.cpp \ configoutputwidget.cpp \
configairframewidget.cpp \ configairframewidget.cpp \
config_pro_hw_widget.cpp \ config_pro_hw_widget.cpp \
config_cc_hw_widget.cpp \ config_cc_hw_widget.cpp \
configccattitudewidget.cpp \ configccattitudewidget.cpp \
mixercurvewidget.cpp \
mixercurvepoint.cpp \
mixercurveline.cpp \
configccpmwidget.cpp \ configccpmwidget.cpp \
configstabilizationwidget.cpp \ configstabilizationwidget.cpp \
twostep.cpp \ twostep.cpp \
@ -62,7 +49,6 @@ SOURCES += configplugin.cpp \
gyro-calibration.cpp \ gyro-calibration.cpp \
alignment-calibration.cpp \ alignment-calibration.cpp \
defaultattitudewidget.cpp \ defaultattitudewidget.cpp \
smartsavebutton.cpp \
defaulthwsettingswidget.cpp \ defaulthwsettingswidget.cpp \
inputchannelform.cpp \ inputchannelform.cpp \
configcamerastabilizationwidget.cpp \ configcamerastabilizationwidget.cpp \

View File

@ -40,7 +40,10 @@ ConfigCCHWWidget::ConfigCCHWWidget(QWidget *parent) : ConfigTaskWidget(parent)
{ {
m_telemetry = new Ui_CC_HW_Widget(); m_telemetry = new Ui_CC_HW_Widget();
m_telemetry->setupUi(this); m_telemetry->setupUi(this);
setupButtons(m_telemetry->saveTelemetryToRAM,m_telemetry->saveTelemetryToSD);
m_telemetry->label_2->setPixmap(QPixmap(":/configgadget/images/coptercontrol.svg"));
addApplySaveButtons(m_telemetry->saveTelemetryToRAM,m_telemetry->saveTelemetryToSD);
addUAVObjectToWidgetRelation("HwSettings","CC_FlexiPort",m_telemetry->cbFlexi); addUAVObjectToWidgetRelation("HwSettings","CC_FlexiPort",m_telemetry->cbFlexi);
addUAVObjectToWidgetRelation("HwSettings","CC_MainPort",m_telemetry->cbTele); addUAVObjectToWidgetRelation("HwSettings","CC_MainPort",m_telemetry->cbTele);
addUAVObjectToWidgetRelation("HwSettings","CC_RcvrPort",m_telemetry->cbRcvr); addUAVObjectToWidgetRelation("HwSettings","CC_RcvrPort",m_telemetry->cbRcvr);

View File

@ -28,7 +28,7 @@
#define CONFIGCCHWWIDGET_H #define CONFIGCCHWWIDGET_H
#include "ui_cc_hw_settings.h" #include "ui_cc_hw_settings.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"
@ -50,6 +50,7 @@ private slots:
private: private:
Ui_CC_HW_Widget *m_telemetry; Ui_CC_HW_Widget *m_telemetry;
QSvgRenderer *m_renderer;
}; };
#endif // CONFIGCCHWWIDGET_H #endif // CONFIGCCHWWIDGET_H

View File

@ -0,0 +1,8 @@
include(../../openpilotgcsplugin.pri)
include(../../libs/utils/utils.pri)
include(../../plugins/uavtalk/uavtalk.pri)
include(../../plugins/coreplugin/coreplugin.pri)
include(../../plugins/uavobjects/uavobjects.pri)
include(../../plugins/uavobjectutil/uavobjectutil.pri)
include(../../plugins/uavsettingsimportexport/uavsettingsimportexport.pri)
include(../../plugins/uavobjectwidgetutils/uavobjectwidgetutils.pri)

View File

@ -1,11 +1,14 @@
/** /**
****************************************************************************** ******************************************************************************
* *
* @file ahrs_bl.h * @file config_global.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief Main AHRS_BL header.
* @see The GNU Public License (GPL) Version 3 * @see The GNU Public License (GPL) Version 3
* * @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup Congig Plugin
* @{
* @brief The Congig GCS plugin
*****************************************************************************/ *****************************************************************************/
/* /*
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -23,30 +26,16 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef AHRS_BL_H #ifndef CONFIG_GLOBAL_H
#define AHRS_BL_H #define CONFIG_GLOBAL_H
/* PIOS Includes */ #include <QtCore/qglobal.h>
#include <pios.h>
/** Start programming #if defined(CONFIG_LIBRARY)
returns: true if FLASH erased and ready to program # define CONFIG_EXPORT Q_DECL_EXPORT
*/ #else
bool # define CONFIG_EXPORT Q_DECL_IMPORT
StartProgramming(void); #endif
/** Write a block to FLASH
buffer contains the data to be written
returns: true if FLASH programmed correctly
*/
bool
WriteData(uint32_t offset, uint8_t *buffer, uint32_t size);
/** Read a block from FLASH #endif // CONFIG_GLOBAL_H
returns: true if FLASH read correctly.
Buffer is set to the read data
*/
bool
ReadData(uint32_t offset, uint8_t *buffer, uint32_t size);
#endif /* AHRS_BL_H */

View File

@ -39,7 +39,7 @@ ConfigProHWWidget::ConfigProHWWidget(QWidget *parent) : ConfigTaskWidget(parent)
m_telemetry = new Ui_PRO_HW_Widget(); m_telemetry = new Ui_PRO_HW_Widget();
m_telemetry->setupUi(this); m_telemetry->setupUi(this);
setupButtons(m_telemetry->saveTelemetryToRAM,m_telemetry->saveTelemetryToSD); addApplySaveButtons(m_telemetry->saveTelemetryToRAM,m_telemetry->saveTelemetryToSD);
addUAVObjectToWidgetRelation("HwSettings","TelemetrySpeed",m_telemetry->telemetrySpeed); addUAVObjectToWidgetRelation("HwSettings","TelemetrySpeed",m_telemetry->telemetrySpeed);
enableControls(false); enableControls(false);
populateWidgets(); populateWidgets();

View File

@ -28,7 +28,7 @@
#define CONFIGPROHWWIDGET_H #define CONFIGPROHWWIDGET_H
#include "ui_pro_hw_settings.h" #include "ui_pro_hw_settings.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"

View File

@ -95,7 +95,7 @@ ConfigAirframeWidget::ConfigAirframeWidget(QWidget *parent) : ConfigTaskWidget(p
m_aircraft = new Ui_AircraftWidget(); m_aircraft = new Ui_AircraftWidget();
m_aircraft->setupUi(this); m_aircraft->setupUi(this);
setupButtons(m_aircraft->saveAircraftToRAM,m_aircraft->saveAircraftToSD); addApplySaveButtons(m_aircraft->saveAircraftToRAM,m_aircraft->saveAircraftToSD);
addUAVObject("SystemSettings"); addUAVObject("SystemSettings");
addUAVObject("MixerSettings"); addUAVObject("MixerSettings");
@ -2179,7 +2179,6 @@ void ConfigAirframeWidget::addToDirtyMonitor()
addWidget(m_aircraft->elevonSlider1); addWidget(m_aircraft->elevonSlider1);
addWidget(m_aircraft->elevonSlider2); addWidget(m_aircraft->elevonSlider2);
addWidget(m_aircraft->widget_3->m_ccpm->ccpmType); addWidget(m_aircraft->widget_3->m_ccpm->ccpmType);
addWidget(m_aircraft->widget_3->m_ccpm->TabObject);
addWidget(m_aircraft->widget_3->m_ccpm->ccpmTailChannel); addWidget(m_aircraft->widget_3->m_ccpm->ccpmTailChannel);
addWidget(m_aircraft->widget_3->m_ccpm->ccpmEngineChannel); addWidget(m_aircraft->widget_3->m_ccpm->ccpmEngineChannel);
addWidget(m_aircraft->widget_3->m_ccpm->ccpmServoWChannel); addWidget(m_aircraft->widget_3->m_ccpm->ccpmServoWChannel);

View File

@ -28,7 +28,7 @@
#define CONFIGAIRFRAMEWIDGET_H #define CONFIGAIRFRAMEWIDGET_H
#include "ui_airframe.h" #include "ui_airframe.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"

View File

@ -28,7 +28,7 @@
#define CONFIGCAMERASTABILIZATIONWIDGET_H #define CONFIGCAMERASTABILIZATIONWIDGET_H
#include "ui_camerastabilization.h" #include "ui_camerastabilization.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"

View File

@ -44,7 +44,7 @@ ConfigCCAttitudeWidget::ConfigCCAttitudeWidget(QWidget *parent) :
connect(ui->zeroBias,SIGNAL(clicked()),this,SLOT(startAccelCalibration())); connect(ui->zeroBias,SIGNAL(clicked()),this,SLOT(startAccelCalibration()));
setupButtons(ui->applyButton,ui->saveButton); addApplySaveButtons(ui->applyButton,ui->saveButton);
addUAVObject("AttitudeSettings"); addUAVObject("AttitudeSettings");
// Connect the help button // Connect the help button

View File

@ -28,7 +28,7 @@
#define CCATTITUDEWIDGET_H #define CCATTITUDEWIDGET_H
#include "ui_ccattitude.h" #include "ui_ccattitude.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"

View File

@ -28,7 +28,7 @@
#define CONFIGccpmWIDGET_H #define CONFIGccpmWIDGET_H
#include "ui_ccpm.h" #include "ui_ccpm.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"

View File

@ -28,7 +28,7 @@
#define CONFIGGADGET_H #define CONFIGGADGET_H
#include <coreplugin/iuavgadget.h> #include <coreplugin/iuavgadget.h>
#include "configgadgetwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
class IUAVGadget; class IUAVGadget;
//class QList<int>; //class QList<int>;
@ -46,7 +46,7 @@ public:
ConfigGadget(QString classId, ConfigGadgetWidget *widget, QWidget *parent = 0); ConfigGadget(QString classId, ConfigGadgetWidget *widget, QWidget *parent = 0);
~ConfigGadget(); ~ConfigGadget();
QWidget *widget() { return m_widget; } QWidget *widget() { return (QWidget*)m_widget; }
void loadConfiguration(IUAVGadgetConfiguration* config); void loadConfiguration(IUAVGadgetConfiguration* config);
private: private:

View File

@ -17,5 +17,6 @@
<file>images/gyroscope.png</file> <file>images/gyroscope.png</file>
<file>images/TX.svg</file> <file>images/TX.svg</file>
<file>images/camera.png</file> <file>images/camera.png</file>
<file>images/TX2.svg</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -40,7 +40,7 @@
#include <QMessageBox> #include <QMessageBox>
//#include "fancytabwidget.h" //#include "fancytabwidget.h"
#include "utils/mytabbedstackwidget.h" #include "utils/mytabbedstackwidget.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
class ConfigGadgetWidget: public QWidget class ConfigGadgetWidget: public QWidget
{ {

View File

@ -41,8 +41,8 @@
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
#include <QMessageBox> #include <QMessageBox>
#define ACCESS_MIN_MOVE -6 #define ACCESS_MIN_MOVE -3
#define ACCESS_MAX_MOVE 6 #define ACCESS_MAX_MOVE 3
#define STICK_MIN_MOVE -8 #define STICK_MIN_MOVE -8
#define STICK_MAX_MOVE 8 #define STICK_MAX_MOVE 8
@ -54,15 +54,15 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent)
m_config = new Ui_InputWidget(); m_config = new Ui_InputWidget();
m_config->setupUi(this); m_config->setupUi(this);
setupButtons(m_config->saveRCInputToRAM,m_config->saveRCInputToSD); addApplySaveButtons(m_config->saveRCInputToRAM,m_config->saveRCInputToSD);
unsigned int index=0; unsigned int index=0;
foreach(QString name,manualSettingsObj->getFields().at(0)->getElementNames()) foreach(QString name,manualSettingsObj->getField("ChannelNumber")->getElementNames())
{ {
Q_ASSERT(index < ManualControlSettings::CHANNELGROUPS_NUMELEM); Q_ASSERT(index < ManualControlSettings::CHANNELGROUPS_NUMELEM);
inputChannelForm * inp=new inputChannelForm(this,index==0); inputChannelForm * inp=new inputChannelForm(this,index==0);
m_config->channelSettings->layout()->addWidget(inp); m_config->channelSettings->layout()->addWidget(inp);
inp->ui->channelName->setText(name); inp->setName(name);
addUAVObjectToWidgetRelation("ManualControlSettings","ChannelGroups",inp->ui->channelGroup,index); addUAVObjectToWidgetRelation("ManualControlSettings","ChannelGroups",inp->ui->channelGroup,index);
addUAVObjectToWidgetRelation("ManualControlSettings","ChannelNumber",inp->ui->channelNumber,index); addUAVObjectToWidgetRelation("ManualControlSettings","ChannelNumber",inp->ui->channelNumber,index);
addUAVObjectToWidgetRelation("ManualControlSettings","ChannelMin",inp->ui->channelMin,index); addUAVObjectToWidgetRelation("ManualControlSettings","ChannelMin",inp->ui->channelMin,index);
@ -108,7 +108,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent)
m_renderer = new QSvgRenderer(); m_renderer = new QSvgRenderer();
QGraphicsScene *l_scene = m_config->graphicsView->scene(); QGraphicsScene *l_scene = m_config->graphicsView->scene();
m_config->graphicsView->setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor())); m_config->graphicsView->setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor()));
if (QFile::exists(":/configgadget/images/TX.svg") && m_renderer->load(QString(":/configgadget/images/TX.svg")) && m_renderer->isValid()) if (QFile::exists(":/configgadget/images/TX2.svg") && m_renderer->load(QString(":/configgadget/images/TX2.svg")) && m_renderer->isValid())
{ {
l_scene->clear(); // Deletes all items contained in the scene as well. l_scene->clear(); // Deletes all items contained in the scene as well.
@ -401,6 +401,7 @@ void ConfigInputWidget::wizardSetUpStep(enum wizardSteps step)
case wizardChooseMode: case wizardChooseMode:
{ {
m_config->graphicsView->setVisible(true); m_config->graphicsView->setVisible(true);
m_config->graphicsView->fitInView(m_txBackground, Qt::KeepAspectRatio );
setTxMovement(nothing); setTxMovement(nothing);
m_config->wzText->setText(tr("Please choose your transmiter type.\n" m_config->wzText->setText(tr("Please choose your transmiter type.\n"
"Mode 1 means your throttle stick is on the right\n" "Mode 1 means your throttle stick is on the right\n"
@ -718,7 +719,7 @@ void ConfigInputWidget::identifyControls()
m_config->wzText->clear(); m_config->wzText->clear();
setTxMovement(nothing); setTxMovement(nothing);
QTimer::singleShot(500, this, SLOT(wzNext())); QTimer::singleShot(2500, this, SLOT(wzNext()));
} }
void ConfigInputWidget::identifyLimits() void ConfigInputWidget::identifyLimits()
@ -1096,7 +1097,7 @@ void ConfigInputWidget::invertControls()
QCheckBox * cb=qobject_cast<QCheckBox *>(wd); QCheckBox * cb=qobject_cast<QCheckBox *>(wd);
if(cb) if(cb)
{ {
int index=manualSettingsObj->getFields().at(0)->getElementNames().indexOf(cb->text()); int index=manualSettingsObj->getField("ChannelNumber")->getElementNames().indexOf(cb->text());
if((cb->isChecked() && (manualSettingsData.ChannelMax[index]>manualSettingsData.ChannelMin[index])) || if((cb->isChecked() && (manualSettingsData.ChannelMax[index]>manualSettingsData.ChannelMin[index])) ||
(!cb->isChecked() && (manualSettingsData.ChannelMax[index]<manualSettingsData.ChannelMin[index]))) (!cb->isChecked() && (manualSettingsData.ChannelMax[index]<manualSettingsData.ChannelMin[index])))
{ {

View File

@ -28,7 +28,7 @@
#define CONFIGINPUTWIDGET_H #define CONFIGINPUTWIDGET_H
#include "ui_input.h" #include "ui_input.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"

View File

@ -50,13 +50,13 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren
m_config->setupUi(this); m_config->setupUi(this);
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
setupButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD); addApplySaveButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD);
addUAVObject("ActuatorSettings"); addUAVObject("ActuatorSettings");
UAVSettingsImportExportFactory * importexportplugin = pm->getObject<UAVSettingsImportExportFactory>(); UAVSettingsImportExportFactory * importexportplugin = pm->getObject<UAVSettingsImportExportFactory>();
connect(importexportplugin,SIGNAL(importAboutToBegin()),this,SLOT(stopTests())); connect(importexportplugin,SIGNAL(importAboutToBegin()),this,SLOT(stopTests()));
setupButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD); addApplySaveButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD);
addUAVObject("ActuatorSettings"); addUAVObject("ActuatorSettings");
// NOTE: we have channel indices from 0 to 9, but the convention for OP is Channel 1 to Channel 10. // NOTE: we have channel indices from 0 to 9, but the convention for OP is Channel 1 to Channel 10.

View File

@ -28,7 +28,7 @@
#define CONFIGOUTPUTWIDGET_H #define CONFIGOUTPUTWIDGET_H
#include "ui_output.h" #include "ui_output.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"

View File

@ -29,6 +29,8 @@
#include "ui_revosensors.h" #include "ui_revosensors.h"
#include "configtaskwidget.h" #include "configtaskwidget.h"
#include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"

View File

@ -34,286 +34,110 @@
#include <QtGui/QPushButton> #include <QtGui/QPushButton>
#include <QDesktopServices> #include <QDesktopServices>
#include <QUrl> #include <QUrl>
#include <QList>
ConfigStabilizationWidget::ConfigStabilizationWidget(QWidget *parent) : ConfigTaskWidget(parent) ConfigStabilizationWidget::ConfigStabilizationWidget(QWidget *parent) : ConfigTaskWidget(parent)
{ {
stabSettings = StabilizationSettings::GetInstance(getObjectManager());
m_stabilization = new Ui_StabilizationWidget(); m_stabilization = new Ui_StabilizationWidget();
m_stabilization->setupUi(this); m_stabilization->setupUi(this);
autoLoadWidgets();
realtimeUpdates=new QTimer(this);
connect(m_stabilization->realTimeUpdates_6,SIGNAL(stateChanged(int)),this,SLOT(realtimeUpdatesSlot(int)));
connect(m_stabilization->realTimeUpdates_7,SIGNAL(stateChanged(int)),this,SLOT(realtimeUpdatesSlot(int)));
connect(realtimeUpdates,SIGNAL(timeout()),this,SLOT(apply()));
connect(m_stabilization->checkBox_7,SIGNAL(stateChanged(int)),this,SLOT(linkCheckBoxes(int)));
connect(m_stabilization->checkBox_2,SIGNAL(stateChanged(int)),this,SLOT(linkCheckBoxes(int)));
connect(m_stabilization->checkBox_8,SIGNAL(stateChanged(int)),this,SLOT(linkCheckBoxes(int)));
connect(m_stabilization->checkBox_3,SIGNAL(stateChanged(int)),this,SLOT(linkCheckBoxes(int)));
setupButtons(m_stabilization->saveStabilizationToRAM,m_stabilization->saveStabilizationToSD); connect(this,SIGNAL(widgetContentsChanged(QWidget*)),this,SLOT(processLinkedWidgets(QWidget*)));
addUAVObject("StabilizationSettings");
refreshWidgetsValues();
// Create a timer to regularly send the object update in case
// we want realtime updates.
connect(&updateTimer, SIGNAL(timeout()), this, SLOT(updateObjectsFromWidgets()));
connect(m_stabilization->realTimeUpdates, SIGNAL(toggled(bool)), this, SLOT(realtimeUpdateToggle(bool)));
// Connect the updates of the stab values
connect(m_stabilization->rateRollKp, SIGNAL(valueChanged(double)), this, SLOT(updateRateRollKP(double)));
connect(m_stabilization->rateRollKi, SIGNAL(valueChanged(double)), this, SLOT(updateRateRollKI(double)));
connect(m_stabilization->rateRollILimit, SIGNAL(valueChanged(double)), this, SLOT(updateRateRollILimit(double)));
connect(m_stabilization->ratePitchKp, SIGNAL(valueChanged(double)), this, SLOT(updateRatePitchKP(double)));
connect(m_stabilization->ratePitchKi, SIGNAL(valueChanged(double)), this, SLOT(updateRatePitchKI(double)));
connect(m_stabilization->ratePitchILimit, SIGNAL(valueChanged(double)), this, SLOT(updateRatePitchILimit(double)));
connect(m_stabilization->rollKp, SIGNAL(valueChanged(double)), this, SLOT(updateRollKP(double)));
connect(m_stabilization->rollKi, SIGNAL(valueChanged(double)), this, SLOT(updateRollKI(double)));
connect(m_stabilization->rollILimit, SIGNAL(valueChanged(double)), this, SLOT(updateRollILimit(double)));
connect(m_stabilization->pitchKp, SIGNAL(valueChanged(double)), this, SLOT(updatePitchKP(double)));
connect(m_stabilization->pitchKi, SIGNAL(valueChanged(double)), this, SLOT(updatePitchKI(double)));
connect(m_stabilization->pitchILimit, SIGNAL(valueChanged(double)), this, SLOT(updatePitchILimit(double)));
// Connect the help button
connect(m_stabilization->stabilizationHelp, SIGNAL(clicked()), this, SLOT(openHelp()));
addWidget(m_stabilization->rateRollKp);
addWidget(m_stabilization->rateRollKi);
addWidget(m_stabilization->rateRollILimit);
addWidget(m_stabilization->ratePitchKp);
addWidget(m_stabilization->ratePitchKi);
addWidget(m_stabilization->ratePitchILimit);
addWidget(m_stabilization->rateYawKp);
addWidget(m_stabilization->rateYawKi);
addWidget(m_stabilization->rateYawILimit);
addWidget(m_stabilization->rollKp);
addWidget(m_stabilization->rollKi);
addWidget(m_stabilization->rollILimit);
addWidget(m_stabilization->yawILimit);
addWidget(m_stabilization->yawKi);
addWidget(m_stabilization->yawKp);
addWidget(m_stabilization->pitchKp);
addWidget(m_stabilization->pitchKi);
addWidget(m_stabilization->pitchILimit);
addWidget(m_stabilization->rollMax);
addWidget(m_stabilization->pitchMax);
addWidget(m_stabilization->yawMax);
addWidget(m_stabilization->manualRoll);
addWidget(m_stabilization->manualPitch);
addWidget(m_stabilization->manualYaw);
addWidget(m_stabilization->maximumRoll);
addWidget(m_stabilization->maximumPitch);
addWidget(m_stabilization->maximumYaw);
addWidget(m_stabilization->lowThrottleZeroIntegral);
} }
ConfigStabilizationWidget::~ConfigStabilizationWidget() ConfigStabilizationWidget::~ConfigStabilizationWidget()
{ {
// Do nothing // Do nothing
} }
void ConfigStabilizationWidget::updateRateRollKP(double val) void ConfigStabilizationWidget::realtimeUpdatesSlot(int value)
{ {
if (m_stabilization->linkRateRP->isChecked()) { m_stabilization->realTimeUpdates_6->setCheckState((Qt::CheckState)value);
m_stabilization->ratePitchKp->setValue(val); m_stabilization->realTimeUpdates_7->setCheckState((Qt::CheckState)value);
if(value==Qt::Checked && !realtimeUpdates->isActive())
realtimeUpdates->start(300);
else if(value==Qt::Unchecked)
realtimeUpdates->stop();
}
void ConfigStabilizationWidget::linkCheckBoxes(int value)
{
if(sender()== m_stabilization->checkBox_7)
m_stabilization->checkBox_3->setCheckState((Qt::CheckState)value);
else if(sender()== m_stabilization->checkBox_3)
m_stabilization->checkBox_7->setCheckState((Qt::CheckState)value);
else if(sender()== m_stabilization->checkBox_8)
m_stabilization->checkBox_2->setCheckState((Qt::CheckState)value);
else if(sender()== m_stabilization->checkBox_2)
m_stabilization->checkBox_8->setCheckState((Qt::CheckState)value);
}
void ConfigStabilizationWidget::processLinkedWidgets(QWidget * widget)
{
if(m_stabilization->checkBox_7->checkState()==Qt::Checked)
{
if(widget== m_stabilization->RateRollKp_2)
{
m_stabilization->RatePitchKp->setValue(m_stabilization->RateRollKp_2->value());
}
else if(widget== m_stabilization->RateRollKi_2)
{
m_stabilization->RatePitchKi->setValue(m_stabilization->RateRollKi_2->value());
}
else if(widget== m_stabilization->RateRollILimit_2)
{
m_stabilization->RatePitchILimit->setValue(m_stabilization->RateRollILimit_2->value());
}
else if(widget== m_stabilization->RatePitchKp)
{
m_stabilization->RateRollKp_2->setValue(m_stabilization->RatePitchKp->value());
}
else if(widget== m_stabilization->RatePitchKi)
{
m_stabilization->RateRollKi_2->setValue(m_stabilization->RatePitchKi->value());
}
else if(widget== m_stabilization->RatePitchILimit)
{
m_stabilization->RateRollILimit_2->setValue(m_stabilization->RatePitchILimit->value());
}
} }
} if(m_stabilization->checkBox_8->checkState()==Qt::Checked)
{
void ConfigStabilizationWidget::updateRateRollKI(double val) if(widget== m_stabilization->AttitudeRollKp)
{ {
if (m_stabilization->linkRateRP->isChecked()) { m_stabilization->AttitudePitchKp_2->setValue(m_stabilization->AttitudeRollKp->value());
m_stabilization->ratePitchKi->setValue(val); }
} else if(widget== m_stabilization->AttitudeRollKi)
} {
m_stabilization->AttitudePitchKi_2->setValue(m_stabilization->AttitudeRollKi->value());
void ConfigStabilizationWidget::updateRateRollILimit(double val) }
{ else if(widget== m_stabilization->AttitudeRollILimit)
if (m_stabilization->linkRateRP->isChecked()) { {
m_stabilization->ratePitchILimit->setValue(val); m_stabilization->AttitudePitchILimit_2->setValue(m_stabilization->AttitudeRollILimit->value());
} }
} else if(widget== m_stabilization->AttitudePitchKp_2)
{
void ConfigStabilizationWidget::updateRatePitchKP(double val) m_stabilization->AttitudeRollKp->setValue(m_stabilization->AttitudePitchKp_2->value());
{ }
if (m_stabilization->linkRateRP->isChecked()) { else if(widget== m_stabilization->AttitudePitchKi_2)
m_stabilization->rateRollKp->setValue(val); {
} m_stabilization->AttitudeRollKi->setValue(m_stabilization->AttitudePitchKi_2->value());
} }
else if(widget== m_stabilization->AttitudePitchILimit_2)
void ConfigStabilizationWidget::updateRatePitchKI(double val) {
{ m_stabilization->AttitudeRollILimit->setValue(m_stabilization->AttitudePitchILimit_2->value());
if (m_stabilization->linkRateRP->isChecked()) { }
m_stabilization->rateRollKi->setValue(val);
}
}
void ConfigStabilizationWidget::updateRatePitchILimit(double val)
{
if (m_stabilization->linkRateRP->isChecked()) {
m_stabilization->rateRollILimit->setValue(val);
}
}
void ConfigStabilizationWidget::updateRollKP(double val)
{
if (m_stabilization->linkAttitudeRP->isChecked()) {
m_stabilization->pitchKp->setValue(val);
}
}
void ConfigStabilizationWidget::updateRollKI(double val)
{
if (m_stabilization->linkAttitudeRP->isChecked()) {
m_stabilization->pitchKi->setValue(val);
}
}
void ConfigStabilizationWidget::updateRollILimit(double val)
{
if (m_stabilization->linkAttitudeRP->isChecked()) {
m_stabilization->pitchILimit->setValue(val);
}
}
void ConfigStabilizationWidget::updatePitchKP(double val)
{
if (m_stabilization->linkAttitudeRP->isChecked()) {
m_stabilization->rollKp->setValue(val);
}
}
void ConfigStabilizationWidget::updatePitchKI(double val)
{
if (m_stabilization->linkAttitudeRP->isChecked()) {
m_stabilization->rollKi->setValue(val);
}
}
void ConfigStabilizationWidget::updatePitchILimit(double val)
{
if (m_stabilization->linkAttitudeRP->isChecked()) {
m_stabilization->rollILimit->setValue(val);
} }
} }
/*******************************
* Stabilization Settings
*****************************/
/**
Request stabilization settings from the board
*/
void ConfigStabilizationWidget::refreshWidgetsValues()
{
bool dirty=isDirty();
// Not needed anymore as this slot is only called whenever we get
// a signal that the object was just updated
// stabSettings->requestUpdate();
StabilizationSettings::DataFields stabData = stabSettings->getData();
// Now fill in all the fields, this is fairly tedious:
m_stabilization->rateRollKp->setValue(stabData.RollRatePID[StabilizationSettings::ROLLRATEPID_KP]);
m_stabilization->rateRollKi->setValue(stabData.RollRatePID[StabilizationSettings::ROLLRATEPID_KI]);
m_stabilization->rateRollILimit->setValue(stabData.RollRatePID[StabilizationSettings::ROLLRATEPID_ILIMIT]);
m_stabilization->ratePitchKp->setValue(stabData.PitchRatePID[StabilizationSettings::PITCHRATEPID_KP]);
m_stabilization->ratePitchKi->setValue(stabData.PitchRatePID[StabilizationSettings::PITCHRATEPID_KI]);
m_stabilization->ratePitchILimit->setValue(stabData.PitchRatePID[StabilizationSettings::PITCHRATEPID_ILIMIT]);
m_stabilization->rateYawKp->setValue(stabData.YawRatePID[StabilizationSettings::YAWRATEPID_KP]);
m_stabilization->rateYawKi->setValue(stabData.YawRatePID[StabilizationSettings::YAWRATEPID_KI]);
m_stabilization->rateYawILimit->setValue(stabData.YawRatePID[StabilizationSettings::YAWRATEPID_ILIMIT]);
m_stabilization->rollKp->setValue(stabData.RollPI[StabilizationSettings::ROLLPI_KP]);
m_stabilization->rollKi->setValue(stabData.RollPI[StabilizationSettings::ROLLPI_KI]);
m_stabilization->rollILimit->setValue(stabData.RollPI[StabilizationSettings::ROLLPI_ILIMIT]);
m_stabilization->pitchKp->setValue(stabData.PitchPI[StabilizationSettings::PITCHPI_KP]);
m_stabilization->pitchKi->setValue(stabData.PitchPI[StabilizationSettings::PITCHPI_KI]);
m_stabilization->pitchILimit->setValue(stabData.PitchPI[StabilizationSettings::PITCHPI_ILIMIT]);
m_stabilization->yawKp->setValue(stabData.YawPI[StabilizationSettings::YAWPI_KP]);
m_stabilization->yawKi->setValue(stabData.YawPI[StabilizationSettings::YAWPI_KI]);
m_stabilization->yawILimit->setValue(stabData.YawPI[StabilizationSettings::YAWPI_ILIMIT]);
m_stabilization->rollMax->setValue(stabData.RollMax);
m_stabilization->pitchMax->setValue(stabData.PitchMax);
m_stabilization->yawMax->setValue(stabData.YawMax);
m_stabilization->manualRoll->setValue(stabData.ManualRate[StabilizationSettings::MANUALRATE_ROLL]);
m_stabilization->manualPitch->setValue(stabData.ManualRate[StabilizationSettings::MANUALRATE_PITCH]);
m_stabilization->manualYaw->setValue(stabData.ManualRate[StabilizationSettings::MANUALRATE_YAW]);
m_stabilization->maximumRoll->setValue(stabData.MaximumRate[StabilizationSettings::MAXIMUMRATE_ROLL]);
m_stabilization->maximumPitch->setValue(stabData.MaximumRate[StabilizationSettings::MAXIMUMRATE_PITCH]);
m_stabilization->maximumYaw->setValue(stabData.MaximumRate[StabilizationSettings::MAXIMUMRATE_YAW]);
m_stabilization->lowThrottleZeroIntegral->setChecked(stabData.LowThrottleZeroIntegral==StabilizationSettings::LOWTHROTTLEZEROINTEGRAL_TRUE ? true : false);
setDirty(dirty);
}
/**
Send telemetry settings to the board
*/
void ConfigStabilizationWidget::updateObjectsFromWidgets()
{
StabilizationSettings::DataFields stabData = stabSettings->getData();
stabData.RollRatePID[StabilizationSettings::ROLLRATEPID_KP] = m_stabilization->rateRollKp->value();
stabData.RollRatePID[StabilizationSettings::ROLLRATEPID_KI] = m_stabilization->rateRollKi->value();
stabData.RollRatePID[StabilizationSettings::ROLLRATEPID_ILIMIT] = m_stabilization->rateRollILimit->value();
stabData.PitchRatePID[StabilizationSettings::PITCHRATEPID_KP] = m_stabilization->ratePitchKp->value();
stabData.PitchRatePID[StabilizationSettings::PITCHRATEPID_KI] = m_stabilization->ratePitchKi->value();
stabData.PitchRatePID[StabilizationSettings::PITCHRATEPID_ILIMIT] = m_stabilization->ratePitchILimit->value();
stabData.YawRatePID[StabilizationSettings::YAWRATEPID_KP] = m_stabilization->rateYawKp->value();
stabData.YawRatePID[StabilizationSettings::YAWRATEPID_KI] = m_stabilization->rateYawKi->value();
stabData.YawRatePID[StabilizationSettings::YAWRATEPID_ILIMIT] = m_stabilization->rateYawILimit->value();
stabData.RollPI[StabilizationSettings::ROLLPI_KP] = m_stabilization->rollKp->value();
stabData.RollPI[StabilizationSettings::ROLLPI_KI] = m_stabilization->rollKi->value();
stabData.RollPI[StabilizationSettings::ROLLPI_ILIMIT] = m_stabilization->rollILimit->value();
stabData.PitchPI[StabilizationSettings::PITCHPI_KP] = m_stabilization->pitchKp->value();
stabData.PitchPI[StabilizationSettings::PITCHPI_KI] = m_stabilization->pitchKi->value();
stabData.PitchPI[StabilizationSettings::PITCHPI_ILIMIT] = m_stabilization->pitchILimit->value();
stabData.YawPI[StabilizationSettings::YAWPI_KP] = m_stabilization->yawKp->value();
stabData.YawPI[StabilizationSettings::YAWPI_KI] = m_stabilization->yawKi->value();
stabData.YawPI[StabilizationSettings::YAWPI_ILIMIT] = m_stabilization->yawILimit->value();
stabData.RollMax = m_stabilization->rollMax->value();
stabData.PitchMax = m_stabilization->pitchMax->value();
stabData.YawMax = m_stabilization->yawMax->value();
stabData.ManualRate[StabilizationSettings::MANUALRATE_ROLL] = m_stabilization->manualRoll->value();
stabData.ManualRate[StabilizationSettings::MANUALRATE_PITCH] = m_stabilization->manualPitch->value();
stabData.ManualRate[StabilizationSettings::MANUALRATE_YAW] = m_stabilization->manualYaw->value();
stabData.MaximumRate[StabilizationSettings::MAXIMUMRATE_ROLL] = m_stabilization->maximumRoll->value();
stabData.MaximumRate[StabilizationSettings::MAXIMUMRATE_PITCH] = m_stabilization->maximumPitch->value();
stabData.MaximumRate[StabilizationSettings::MAXIMUMRATE_YAW] = m_stabilization->maximumYaw->value();
stabData.LowThrottleZeroIntegral = (m_stabilization->lowThrottleZeroIntegral->isChecked() ? StabilizationSettings::LOWTHROTTLEZEROINTEGRAL_TRUE :StabilizationSettings::LOWTHROTTLEZEROINTEGRAL_FALSE);
stabSettings->setData(stabData); // this is atomic
}
void ConfigStabilizationWidget::realtimeUpdateToggle(bool state)
{
if (state) {
updateTimer.start(300);
} else {
updateTimer.stop();
}
}
void ConfigStabilizationWidget::openHelp()
{
QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Stabilization+panel", QUrl::StrictMode) );
}

View File

@ -28,7 +28,7 @@
#define CONFIGSTABILIZATIONWIDGET_H #define CONFIGSTABILIZATIONWIDGET_H
#include "ui_stabilization.h" #include "ui_stabilization.h"
#include "configtaskwidget.h" #include "../uavobjectwidgetutils/configtaskwidget.h"
#include "extensionsystem/pluginmanager.h" #include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "uavobject.h" #include "uavobject.h"
@ -47,30 +47,11 @@ public:
private: private:
Ui_StabilizationWidget *m_stabilization; Ui_StabilizationWidget *m_stabilization;
StabilizationSettings* stabSettings; QTimer * realtimeUpdates;
QTimer updateTimer;
private slots: private slots:
virtual void refreshWidgetsValues(); void realtimeUpdatesSlot(int);
void updateObjectsFromWidgets(); void linkCheckBoxes(int value);
void realtimeUpdateToggle(bool); void processLinkedWidgets(QWidget*);
void openHelp();
void updateRateRollKP(double);
void updateRateRollKI(double);
void updateRateRollILimit(double);
void updateRatePitchKP(double);
void updateRatePitchKI(double);
void updateRatePitchILimit(double);
void updateRollKP(double);
void updateRollKI(double);
void updateRollILimit(double);
void updatePitchKP(double);
void updatePitchKI(double);
void updatePitchILimit(double);
}; };
#endif // ConfigStabilizationWidget_H #endif // ConfigStabilizationWidget_H

View File

@ -1,365 +0,0 @@
/**
******************************************************************************
*
* @file configtaskwidget.cpp
* @author E. Lafargue & The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup ConfigPlugin Config Plugin
* @{
* @brief The Configuration Gadget used to update settings in the firmware
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "configtaskwidget.h"
#include <QtGui/QWidget>
#include "uavsettingsimportexport/uavsettingsimportexportfactory.h"
#include "configgadgetwidget.h"
ConfigTaskWidget::ConfigTaskWidget(QWidget *parent) : QWidget(parent),isConnected(false),smartsave(NULL),dirty(false)
{
pm = ExtensionSystem::PluginManager::instance();
objManager = pm->getObject<UAVObjectManager>();
connect((ConfigGadgetWidget*)parent, SIGNAL(autopilotConnected()),this, SLOT(onAutopilotConnect()));
connect((ConfigGadgetWidget*)parent, SIGNAL(autopilotDisconnected()),this, SLOT(onAutopilotDisconnect()));
UAVSettingsImportExportFactory * importexportplugin = pm->getObject<UAVSettingsImportExportFactory>();
connect(importexportplugin,SIGNAL(importAboutToBegin()),this,SLOT(invalidateObjects()));
}
void ConfigTaskWidget::addWidget(QWidget * widget)
{
addUAVObjectToWidgetRelation("","",widget);
}
void ConfigTaskWidget::addUAVObject(QString objectName)
{
addUAVObjectToWidgetRelation(objectName,"",NULL);
}
void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString field, QWidget * widget, QString index)
{
UAVObject *obj=NULL;
UAVObjectField *_field=NULL;
obj = objManager->getObject(QString(object));
Q_ASSERT(obj);
_field = obj->getField(QString(field));
Q_ASSERT(_field);
addUAVObjectToWidgetRelation(object,field,widget,_field->getElementNames().indexOf(index));
}
void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString field, QWidget * widget, int index,int scale)
{
UAVObject *obj=NULL;
UAVObjectField *_field=NULL;
if(!object.isEmpty())
{
obj = objManager->getObject(QString(object));
Q_ASSERT(obj);
objectUpdates.insert(obj,true);
connect(obj, SIGNAL(objectUpdated(UAVObject*)),this, SLOT(objectUpdated(UAVObject*)));
connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(refreshWidgetsValues()));
}
//smartsave->addObject(obj);
if(!field.isEmpty() && obj)
_field = obj->getField(QString(field));
objectToWidget * ow=new objectToWidget();
ow->field=_field;
ow->object=obj;
ow->widget=widget;
ow->index=index;
ow->scale=scale;
objOfInterest.append(ow);
if(obj)
smartsave->addObject((UAVDataObject*)obj);
if(widget==NULL)
{
// do nothing
}
else if(QComboBox * cb=qobject_cast<QComboBox *>(widget))
{
connect(cb,SIGNAL(currentIndexChanged(int)),this,SLOT(widgetsContentsChanged()));
}
else if(QSlider * cb=qobject_cast<QSlider *>(widget))
{
connect(cb,SIGNAL(sliderMoved(int)),this,SLOT(widgetsContentsChanged()));
}
else if(MixerCurveWidget * cb=qobject_cast<MixerCurveWidget *>(widget))
{
connect(cb,SIGNAL(curveUpdated(QList<double>,double)),this,SLOT(widgetsContentsChanged()));
}
else if(QTableWidget * cb=qobject_cast<QTableWidget *>(widget))
{
connect(cb,SIGNAL(cellChanged(int,int)),this,SLOT(widgetsContentsChanged()));
}
else if(QSpinBox * cb=qobject_cast<QSpinBox *>(widget))
{
connect(cb,SIGNAL(valueChanged(int)),this,SLOT(widgetsContentsChanged()));
}
else if(QDoubleSpinBox * cb=qobject_cast<QDoubleSpinBox *>(widget))
{
connect(cb,SIGNAL(valueChanged(double)),this,SLOT(widgetsContentsChanged()));
}
else if(QCheckBox * cb=qobject_cast<QCheckBox *>(widget))
{
connect(cb,SIGNAL(clicked()),this,SLOT(widgetsContentsChanged()));
}
else if(QPushButton * cb=qobject_cast<QPushButton *>(widget))
{
connect(cb,SIGNAL(clicked()),this,SLOT(widgetsContentsChanged()));
}
}
ConfigTaskWidget::~ConfigTaskWidget()
{
delete smartsave;
}
void ConfigTaskWidget::saveObjectToSD(UAVObject *obj)
{
qDebug()<<"ConfigTaskWidget::saveObjectToSD";
// saveObjectToSD is now handled by the UAVUtils plugin in one
// central place (and one central queue)
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectUtilManager* utilMngr = pm->getObject<UAVObjectUtilManager>();
utilMngr->saveObjectToSD(obj);
}
UAVObjectManager* ConfigTaskWidget::getObjectManager() {
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager * objMngr = pm->getObject<UAVObjectManager>();
Q_ASSERT(objMngr);
return objMngr;
}
double ConfigTaskWidget::listMean(QList<double> list)
{
double accum = 0;
for(int i = 0; i < list.size(); i++)
accum += list[i];
return accum / list.size();
}
// ************************************
// telemetry start/stop connect/disconnect signals
void ConfigTaskWidget::onAutopilotDisconnect()
{
isConnected=false;
enableControls(false);
invalidateObjects();
}
void ConfigTaskWidget::onAutopilotConnect()
{
invalidateObjects();
dirty=false;
isConnected=true;
enableControls(true);
refreshWidgetsValues();
}
void ConfigTaskWidget::populateWidgets()
{
bool dirtyBack=dirty;
foreach(objectToWidget * ow,objOfInterest)
{
if(ow->object==NULL || ow->field==NULL)
{
// do nothing
}
else if(QComboBox * cb=qobject_cast<QComboBox *>(ow->widget))
{
cb->addItems(ow->field->getOptions());
cb->setCurrentIndex(cb->findText(ow->field->getValue(ow->index).toString()));
}
else if(QLabel * cb=qobject_cast<QLabel *>(ow->widget))
{
cb->setText(ow->field->getValue(ow->index).toString());
}
else if(QSpinBox * cb=qobject_cast<QSpinBox *>(ow->widget))
{
cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale);
}
else if(QSlider * cb=qobject_cast<QSlider *>(ow->widget))
{
cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale);
}
else if(QCheckBox * cb=qobject_cast<QCheckBox *>(ow->widget))
{
cb->setChecked(ow->field->getValue(ow->index).toBool());
}
}
setDirty(dirtyBack);
}
void ConfigTaskWidget::refreshWidgetsValues()
{
bool dirtyBack=dirty;
foreach(objectToWidget * ow,objOfInterest)
{
if(ow->object==NULL || ow->field==NULL)
{
//do nothing
}
else if(QComboBox * cb=qobject_cast<QComboBox *>(ow->widget))
{
cb->setCurrentIndex(cb->findText(ow->field->getValue(ow->index).toString()));
}
else if(QLabel * cb=qobject_cast<QLabel *>(ow->widget))
{
cb->setText(ow->field->getValue(ow->index).toString());
}
else if(QSpinBox * cb=qobject_cast<QSpinBox *>(ow->widget))
{
cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale);
}
else if(QSlider * cb=qobject_cast<QSlider *>(ow->widget))
{
cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale);
}
else if(QCheckBox * cb=qobject_cast<QCheckBox *>(ow->widget))
{
cb->setChecked(ow->field->getValue(ow->index).toBool());
}
}
setDirty(dirtyBack);
}
void ConfigTaskWidget::updateObjectsFromWidgets()
{
foreach(objectToWidget * ow,objOfInterest)
{
if(ow->object==NULL || ow->field==NULL)
{
//do nothing
}
else if(QComboBox * cb=qobject_cast<QComboBox *>(ow->widget))
{
ow->field->setValue(cb->currentText(),ow->index);
}
else if(QLabel * cb=qobject_cast<QLabel *>(ow->widget))
{
ow->field->setValue(cb->text(),ow->index);
}
else if(QSpinBox * cb=qobject_cast<QSpinBox *>(ow->widget))
{
ow->field->setValue(cb->value()* ow->scale,ow->index);
}
else if(QSlider * cb=qobject_cast<QSlider *>(ow->widget))
{
ow->field->setValue(cb->value()* ow->scale,ow->index);
}
else if(QCheckBox * cb=qobject_cast<QCheckBox *>(ow->widget))
{
ow->field->setValue((cb->isChecked()?"TRUE":"FALSE"),ow->index);
}
}
}
void ConfigTaskWidget::setupButtons(QPushButton *update, QPushButton *save)
{
smartsave=new smartSaveButton(update,save);
connect(smartsave,SIGNAL(preProcessOperations()), this, SLOT(updateObjectsFromWidgets()));
connect(smartsave,SIGNAL(saveSuccessfull()),this,SLOT(clearDirty()));
connect(smartsave,SIGNAL(beginOp()),this,SLOT(disableObjUpdates()));
connect(smartsave,SIGNAL(endOp()),this,SLOT(enableObjUpdates()));
enableControls(false);
}
void ConfigTaskWidget::enableControls(bool enable)
{
if(smartsave)
smartsave->enableControls(enable);
}
void ConfigTaskWidget::widgetsContentsChanged()
{
setDirty(true);
}
void ConfigTaskWidget::clearDirty()
{
setDirty(false);
}
void ConfigTaskWidget::setDirty(bool value)
{
dirty=value;
}
bool ConfigTaskWidget::isDirty()
{
if(isConnected)
return dirty;
else
return false;
}
void ConfigTaskWidget::refreshValues()
{
}
void ConfigTaskWidget::disableObjUpdates()
{
foreach(objectToWidget * obj,objOfInterest)
{
if(obj->object)
disconnect(obj->object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(refreshWidgetsValues()));
}
}
void ConfigTaskWidget::enableObjUpdates()
{
foreach(objectToWidget * obj,objOfInterest)
{
if(obj->object)
connect(obj->object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(refreshWidgetsValues()));
}
}
void ConfigTaskWidget::objectUpdated(UAVObject *obj)
{
objectUpdates[obj]=true;
}
bool ConfigTaskWidget::allObjectsUpdated()
{
bool ret=true;
foreach(UAVObject *obj, objectUpdates.keys())
{
ret=ret & objectUpdates[obj];
}
qDebug()<<"ALL OBJECTS UPDATE:"<<ret;
return ret;
}
void ConfigTaskWidget::invalidateObjects()
{
foreach(UAVObject *obj, objectUpdates.keys())
{
objectUpdates[obj]=false;
}
}
/**
@}
@}
*/

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