Merge remote-tracking branch 'remotes/origin/james/revolution' into osd_test
Conflicts: ground/openpilotgcs/src/plugins/scope/scopegadgetwidget.cpp
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "overo"]
|
||||
path = overo
|
||||
url = git@github.com:peabody124/op_overo.git
|
@ -1,5 +1,9 @@
|
||||
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
|
||||
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
|
||||
|
125
Makefile
@ -201,6 +201,8 @@ arm_sdk_clean:
|
||||
|
||||
# Set up openocd tools
|
||||
OPENOCD_DIR := $(TOOLS_DIR)/openocd
|
||||
OPENOCD_WIN_DIR := $(TOOLS_DIR)/openocd_win
|
||||
OPENOCD_BUILD_DIR := $(DL_DIR)/openocd-build
|
||||
|
||||
.PHONY: openocd_install
|
||||
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)"
|
||||
|
||||
# extract the source
|
||||
$(V1) [ ! -d "$(DL_DIR)/openocd-build" ] || $(RM) -r "$(DL_DIR)/openocd-build"
|
||||
$(V1) mkdir -p "$(DL_DIR)/openocd-build"
|
||||
$(V1) tar -C $(DL_DIR)/openocd-build -xjf "$(DL_DIR)/$(OPENOCD_FILE)"
|
||||
$(V1) [ ! -d "$(OPENOCD_BUILD_DIR)" ] || $(RM) -r "$(OPENOCD_BUILD_DIR)"
|
||||
$(V1) mkdir -p "$(OPENOCD_BUILD_DIR)"
|
||||
$(V1) tar -C $(OPENOCD_BUILD_DIR) -xjf "$(DL_DIR)/$(OPENOCD_FILE)"
|
||||
|
||||
# build and install
|
||||
$(V1) mkdir -p "$(OPENOCD_DIR)"
|
||||
$(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; \
|
||||
$(MAKE) --silent ; \
|
||||
$(MAKE) --silent install ; \
|
||||
)
|
||||
|
||||
# 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
|
||||
|
||||
openocd_git_install: | $(DL_DIR) $(TOOLS_DIR)
|
||||
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
|
||||
# download the source
|
||||
$(V0) @echo " DOWNLOAD $(OPENOCD_URL) @ $(OPENOCD_REV)"
|
||||
$(V1) [ ! -d "$(DL_DIR)/openocd-build" ] || $(RM) -rf "$(DL_DIR)/openocd-build"
|
||||
$(V1) mkdir -p "$(DL_DIR)/openocd-build"
|
||||
$(V1) git clone --depth 1 --no-checkout $(OPENOCD_URL) "$(DL_DIR)/openocd-build"
|
||||
$(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) "$(OPENOCD_BUILD_DIR)"
|
||||
$(V1) ( \
|
||||
cd $(DL_DIR)/openocd-build ; \
|
||||
cd $(OPENOCD_BUILD_DIR) ; \
|
||||
git checkout -q $(OPENOCD_REV) ; \
|
||||
)
|
||||
|
||||
# apply patches
|
||||
$(V0) @echo " PATCH $(OPENOCD_DIR)"
|
||||
$(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/0002-rtos-add-stm32_stlink-to-FreeRTOS-targets.patch ; \
|
||||
)
|
||||
@ -255,7 +354,7 @@ openocd_git_install: openocd_clean
|
||||
$(V0) @echo " BUILD $(OPENOCD_DIR)"
|
||||
$(V1) mkdir -p "$(OPENOCD_DIR)"
|
||||
$(V1) ( \
|
||||
cd $(DL_DIR)/openocd-build ; \
|
||||
cd $(OPENOCD_BUILD_DIR) ; \
|
||||
./bootstrap ; \
|
||||
./configure --enable-maintainer-mode --prefix="$(OPENOCD_DIR)" --enable-ft2232_libftdi --enable-buspirate --enable-stlink ; \
|
||||
$(MAKE) ; \
|
||||
@ -263,7 +362,7 @@ openocd_git_install: openocd_clean
|
||||
)
|
||||
|
||||
# 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
|
||||
openocd_clean:
|
||||
|
135
artwork/Dials/deluxe/lineardial-horizontal.svg
Normal file → Executable file
@ -14,8 +14,8 @@
|
||||
height="70.597504"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.1 "
|
||||
sodipodi:docname="lineardial-horizontal.svg"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="lineardial-horizontal-old2.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
inkscape:export-ydpi="103.61"
|
||||
@ -25,15 +25,19 @@
|
||||
<linearGradient
|
||||
id="linearGradient4439">
|
||||
<stop
|
||||
style="stop-color:#1a1a1a;stop-opacity:1"
|
||||
style="stop-color:#666666;stop-opacity:0;"
|
||||
offset="0"
|
||||
id="stop4441" />
|
||||
<stop
|
||||
id="stop4443"
|
||||
offset="0.19742694"
|
||||
style="stop-color:#808080;stop-opacity:1" />
|
||||
offset="0.31684026"
|
||||
style="stop-color:#a3a3a3;stop-opacity:1;" />
|
||||
<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"
|
||||
id="stop4445" />
|
||||
</linearGradient>
|
||||
@ -57,15 +61,11 @@
|
||||
<stop
|
||||
id="stop4389"
|
||||
offset="0"
|
||||
style="stop-color:#4d4d4d;stop-opacity:1" />
|
||||
style="stop-color:#8a8a8a;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0.60976541"
|
||||
id="stop4391" />
|
||||
<stop
|
||||
id="stop4393"
|
||||
style="stop-color:#181818;stop-opacity:1;"
|
||||
offset="1"
|
||||
style="stop-color:#4d4d4d;stop-opacity:1" />
|
||||
id="stop4391" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4361">
|
||||
@ -237,15 +237,15 @@
|
||||
<stop
|
||||
id="stop3905"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1" />
|
||||
style="stop-color:#676767;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0.3220683"
|
||||
offset="0.43894145"
|
||||
id="stop3907" />
|
||||
<stop
|
||||
id="stop3909"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:1" />
|
||||
style="stop-color:#7d7d7d;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5375">
|
||||
@ -425,46 +425,34 @@
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5116">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5118" />
|
||||
<stop
|
||||
id="stop5124"
|
||||
offset="0.35911319"
|
||||
style="stop-color:#dcaf28;stop-opacity:1" />
|
||||
offset="0"
|
||||
style="stop-color:#ffc001;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
style="stop-color:#844700;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5120" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5106">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5108" />
|
||||
<stop
|
||||
id="stop5114"
|
||||
offset="0.36023793"
|
||||
offset="0"
|
||||
style="stop-color:#00a000;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
style="stop-color:#003d00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5110" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5096">
|
||||
<stop
|
||||
style="stop-color:#100000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5098" />
|
||||
<stop
|
||||
id="stop5104"
|
||||
offset="0.36453304"
|
||||
style="stop-color:#aa0000;stop-opacity:1" />
|
||||
offset="0"
|
||||
style="stop-color:#e60000;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#0c0000;stop-opacity:1"
|
||||
style="stop-color:#710000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5100" />
|
||||
</linearGradient>
|
||||
@ -687,7 +675,7 @@
|
||||
x2="87.074203"
|
||||
y2="168.83261"
|
||||
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
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5106"
|
||||
@ -697,7 +685,7 @@
|
||||
x2="86.644958"
|
||||
y2="173.46591"
|
||||
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
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5116"
|
||||
@ -707,7 +695,7 @@
|
||||
x2="86.547356"
|
||||
y2="168.82289"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0,1,-1,0,-11.23354,-270.8763)" />
|
||||
gradientTransform="matrix(0,1,-1.0055415,0,-10.459485,-270.8763)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5129"
|
||||
@ -932,7 +920,7 @@
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3899"
|
||||
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"
|
||||
y1="68.860146"
|
||||
x2="-150.75359"
|
||||
@ -1120,16 +1108,16 @@
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.1841238"
|
||||
inkscape:cx="140.38399"
|
||||
inkscape:zoom="5.5410688"
|
||||
inkscape:cx="55.238424"
|
||||
inkscape:cy="35.455778"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer5"
|
||||
inkscape:current-layer="background"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="706"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="957"
|
||||
inkscape:window-x="-5"
|
||||
inkscape:window-y="2"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -1163,8 +1151,7 @@
|
||||
inkscape:label="Dark background"
|
||||
id="g2932"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-368.2988,-507.08981)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-368.2988,-507.08981)">
|
||||
<g
|
||||
id="background"
|
||||
inkscape:label="#g4447">
|
||||
@ -1225,17 +1212,16 @@
|
||||
id="layer5"
|
||||
inkscape:label="Green Zone"
|
||||
style="display:inline"
|
||||
transform="translate(-140.85549,-141.35611)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-140.85549,-141.35611)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline"
|
||||
id="green"
|
||||
width="260.53882"
|
||||
height="32.20755"
|
||||
x="-411.77084"
|
||||
y="-184.00433"
|
||||
ry="2.3767958"
|
||||
width="261.80212"
|
||||
height="32.929432"
|
||||
x="-413.03415"
|
||||
y="-184.72621"
|
||||
ry="2.430068"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -1246,17 +1232,16 @@
|
||||
id="layer4"
|
||||
inkscape:label="Yellow Zone"
|
||||
style="display:none"
|
||||
transform="translate(-140.85549,-141.35611)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-140.85549,-141.35611)">
|
||||
<rect
|
||||
inkscape:export-ydpi="88.809998"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
ry="2.4231479"
|
||||
y="-184.63248"
|
||||
x="-411.45679"
|
||||
x="-412.90054"
|
||||
height="32.835663"
|
||||
width="260.53882"
|
||||
width="261.98257"
|
||||
id="yellow"
|
||||
style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline"
|
||||
inkscape:label="#rect5741"
|
||||
@ -1267,17 +1252,16 @@
|
||||
id="layer3"
|
||||
inkscape:label="Red zone"
|
||||
style="display:none"
|
||||
transform="translate(-140.85549,-141.35611)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-140.85549,-141.35611)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline"
|
||||
id="red"
|
||||
width="260.23901"
|
||||
height="32.519711"
|
||||
x="-411.38739"
|
||||
y="-184.35484"
|
||||
ry="2.399832"
|
||||
width="261.86325"
|
||||
height="32.880653"
|
||||
x="-413.01163"
|
||||
y="-184.71579"
|
||||
ry="2.4264681"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -1288,17 +1272,18 @@
|
||||
id="layer6"
|
||||
inkscape:label="Indicator"
|
||||
style="display:inline"
|
||||
transform="translate(-140.85549,-141.35611)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-140.85549,-141.35611)">
|
||||
<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"
|
||||
width="32.035065"
|
||||
height="6.0045304"
|
||||
x="152.63882"
|
||||
y="-157.12926"
|
||||
width="33.114704"
|
||||
height="5.0989962"
|
||||
x="151.5576"
|
||||
y="-156.22531"
|
||||
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
|
||||
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
@ -14,20 +14,31 @@
|
||||
height="322.58304"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.1 "
|
||||
sodipodi:docname="lineardial-vertical.svg"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="lineardial-vertical-old2.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
inkscape:export-ydpi="103.61"
|
||||
style="display:inline">
|
||||
<defs
|
||||
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
|
||||
id="linearGradient3903">
|
||||
<stop
|
||||
id="stop3905"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1" />
|
||||
style="stop-color:#656565;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0.39386007"
|
||||
@ -35,7 +46,7 @@
|
||||
<stop
|
||||
id="stop3909"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:1" />
|
||||
style="stop-color:#757575;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5375">
|
||||
@ -83,15 +94,19 @@
|
||||
<stop
|
||||
id="stop5348"
|
||||
offset="0"
|
||||
style="stop-color:#1a1a1a;stop-opacity:1" />
|
||||
style="stop-color:#9c9c9c;stop-opacity:0;" />
|
||||
<stop
|
||||
style="stop-color:#666666;stop-opacity:1"
|
||||
offset="0.35277387"
|
||||
id="stop5350" />
|
||||
id="stop3921"
|
||||
offset="0.359375"
|
||||
style="stop-color:#6c6c6c;stop-opacity:0.88793105;" />
|
||||
<stop
|
||||
style="stop-color:#5f5f5f;stop-opacity:0.62931037;"
|
||||
offset="0.62630206"
|
||||
id="stop3923" />
|
||||
<stop
|
||||
id="stop5352"
|
||||
offset="1"
|
||||
style="stop-color:#1a1a1a;stop-opacity:1" />
|
||||
style="stop-color:#9c9c9c;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5326">
|
||||
@ -215,46 +230,34 @@
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5116">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5118" />
|
||||
<stop
|
||||
id="stop5124"
|
||||
offset="0.37640449"
|
||||
style="stop-color:#dcaf28;stop-opacity:1" />
|
||||
offset="0"
|
||||
style="stop-color:#ffc001;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
style="stop-color:#844700;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5120" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5106">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5108" />
|
||||
<stop
|
||||
id="stop5114"
|
||||
offset="0.38184431"
|
||||
offset="0"
|
||||
style="stop-color:#00a000;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
style="stop-color:#003d00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5110" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5096">
|
||||
<stop
|
||||
style="stop-color:#100000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5098" />
|
||||
<stop
|
||||
id="stop5104"
|
||||
offset="0.39717463"
|
||||
style="stop-color:#aa0000;stop-opacity:1" />
|
||||
offset="0"
|
||||
style="stop-color:#e60000;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#0c0000;stop-opacity:1"
|
||||
style="stop-color:#710000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5100" />
|
||||
</linearGradient>
|
||||
@ -475,7 +478,8 @@
|
||||
y1="132.84332"
|
||||
x2="-58.661255"
|
||||
y2="169.46072"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0045664,0,0,0.98072534,3.8285685,3.8328979)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5106"
|
||||
@ -484,7 +488,8 @@
|
||||
y1="133.15433"
|
||||
x2="-38.946774"
|
||||
y2="168.58655"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0048708,0,0,1.0000284,3.816285,2.2385824)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5116"
|
||||
@ -493,7 +498,8 @@
|
||||
y1="133.16322"
|
||||
x2="-17.108463"
|
||||
y2="168.82289"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0057658,0,0,0.99502095,3.8176724,2.8357789)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5129"
|
||||
@ -711,7 +717,8 @@
|
||||
x1="-246.82069"
|
||||
y1="353.9455"
|
||||
x2="-247.44464"
|
||||
y2="412.00528" />
|
||||
y2="412.00528"
|
||||
gradientTransform="matrix(1,0,0,0.98663274,0,3.8538758)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5375"
|
||||
@ -727,11 +734,21 @@
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3899"
|
||||
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"
|
||||
y1="74.562233"
|
||||
x2="-135.50557"
|
||||
y2="74.562233" />
|
||||
x2="-136.75557"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@ -740,16 +757,16 @@
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.9843492"
|
||||
inkscape:cx="13.888309"
|
||||
inkscape:cy="302.67927"
|
||||
inkscape:zoom="7.87"
|
||||
inkscape:cx="0.68217946"
|
||||
inkscape:cy="151.28502"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer6"
|
||||
inkscape:current-layer="layer4"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="706"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="957"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -765,7 +782,7 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Edouard Lafargue</dc:title>
|
||||
@ -779,8 +796,7 @@
|
||||
inkscape:label="Dark background"
|
||||
id="g2932"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-357.06525,-236.21351)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-357.06525,-236.21351)">
|
||||
<g
|
||||
id="background"
|
||||
inkscape:label="#g5354">
|
||||
@ -789,39 +805,39 @@
|
||||
style="fill:url(#linearGradient5344);fill-opacity:1;stroke:none"
|
||||
id="rect2936"
|
||||
width="318.58304"
|
||||
height="46.756046"
|
||||
height="46.131046"
|
||||
x="-556.79657"
|
||||
y="358.44128"
|
||||
ry="3.4504199"
|
||||
y="357.50378"
|
||||
ry="3.4042974"
|
||||
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:#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
|
||||
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="2.2944832"
|
||||
y="365.23175"
|
||||
x="-519.56018"
|
||||
height="31.09215"
|
||||
width="260.53882"
|
||||
ry="2.9537699"
|
||||
y="360.57819"
|
||||
x="-519.12665"
|
||||
height="40.026031"
|
||||
width="265.4249"
|
||||
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
|
||||
@ -829,17 +845,16 @@
|
||||
id="layer5"
|
||||
inkscape:label="Green Zone"
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline"
|
||||
id="green"
|
||||
width="260.53882"
|
||||
height="34.0919"
|
||||
x="-153.97397"
|
||||
y="134.02345"
|
||||
ry="2.5158536"
|
||||
width="261.80789"
|
||||
height="34.092869"
|
||||
x="-150.90765"
|
||||
y="136.26584"
|
||||
ry="2.5159254"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -849,18 +864,17 @@
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Yellow Zone"
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
inkscape:export-ydpi="88.809998"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
ry="2.5158532"
|
||||
y="134.02345"
|
||||
x="-153.97397"
|
||||
height="34.091896"
|
||||
width="260.53882"
|
||||
ry="2.5033269"
|
||||
y="136.19191"
|
||||
x="-151.04408"
|
||||
height="33.92215"
|
||||
width="262.04108"
|
||||
id="yellow"
|
||||
style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline"
|
||||
inkscape:label="#rect5741"
|
||||
@ -871,17 +885,16 @@
|
||||
id="layer3"
|
||||
inkscape:label="Red zone"
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline"
|
||||
id="red"
|
||||
width="260.53882"
|
||||
height="34.589863"
|
||||
x="-154.0755"
|
||||
y="134.00487"
|
||||
ry="2.5526016"
|
||||
width="261.72849"
|
||||
height="33.923153"
|
||||
x="-150.95049"
|
||||
y="135.25487"
|
||||
ry="2.503401"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -894,35 +907,35 @@
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<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"
|
||||
width="33.162418"
|
||||
height="5.9393759"
|
||||
x="135.64999"
|
||||
y="-107.91632"
|
||||
inkscape:label="#rect5246" />
|
||||
width="34.173222"
|
||||
height="5.9349518"
|
||||
x="136.20108"
|
||||
y="-114.68695"
|
||||
inkscape:label="#rect5246"
|
||||
ry="2.4981377" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="Text"
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
id="field"
|
||||
width="33.853165"
|
||||
width="46.305515"
|
||||
height="12.626906"
|
||||
x="128.30692"
|
||||
x="129.09726"
|
||||
y="157.31393"
|
||||
inkscape:label="#rect2878" />
|
||||
<rect
|
||||
inkscape:label="#rect2878"
|
||||
y="170.91206"
|
||||
x="128.88902"
|
||||
x="129.9335"
|
||||
height="12.626906"
|
||||
width="32.851257"
|
||||
width="45.176544"
|
||||
id="value"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none" />
|
||||
</g>
|
||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
@ -414,7 +414,7 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
|
||||
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
|
||||
|
||||
# Add jtag targets (program and wipe)
|
||||
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE),$(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
|
||||
elf: $(OUTDIR)/$(TARGET).elf
|
||||
|
@ -418,7 +418,7 @@ $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
|
||||
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
|
||||
|
||||
# Add jtag targets (program and wipe)
|
||||
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BL_BANK_BASE),$(BL_BANK_SIZE),$(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
|
||||
elf: $(OUTDIR)/$(TARGET).elf
|
||||
|
@ -46,10 +46,8 @@ else
|
||||
REMOVE_CMD = rm
|
||||
endif
|
||||
|
||||
FLASH_TOOL = OPENOCD
|
||||
|
||||
# Paths
|
||||
REVO_BL = ./
|
||||
REVO_BL = $(WHEREAMI)
|
||||
REVO_BLINC = $(REVO_BL)/inc
|
||||
PIOS = ../../PiOS
|
||||
PIOSINC = $(PIOS)/inc
|
||||
@ -64,16 +62,8 @@ STMLIBDIR = $(APPLIBDIR)
|
||||
STMSPDDIR = $(STMLIBDIR)/STM32F4xx_StdPeriph_Driver
|
||||
STMSPDSRCDIR = $(STMSPDDIR)/src
|
||||
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)
|
||||
|
||||
OPUAVSYNTHDIR = $(OUTDIR)/../uavobject-synthetics/flight
|
||||
|
||||
# List C source files here. (C dependencies are automatically generated.)
|
||||
# use file-extension c for "c-only"-files
|
||||
|
||||
@ -81,16 +71,12 @@ OPUAVSYNTHDIR = $(OUTDIR)/../uavobject-synthetics/flight
|
||||
SRC += main.c
|
||||
SRC += pios_board.c
|
||||
SRC += pios_usb_board_data.c
|
||||
SRC += bl_fsm.c
|
||||
SRC += op_dfu.c
|
||||
|
||||
## PIOS Hardware (STM32F4xx)
|
||||
include $(PIOS)/STM32F4xx/library.mk
|
||||
|
||||
## Library files
|
||||
SRC += $(FLIGHTLIB)/fifo_buffer.c
|
||||
|
||||
# PIOS Hardware (Common)
|
||||
#SRC += $(PIOSCOMMON)/pios_com.c
|
||||
SRC += $(PIOSCOMMON)/pios_board_info.c
|
||||
SRC += $(PIOSCOMMON)/pios_com_msg.c
|
||||
SRC += $(PIOSCOMMON)/printf-stdarg.c
|
||||
@ -121,7 +107,6 @@ EXTRAINCDIRS += $(PIOSBOARDS)
|
||||
EXTRAINCDIRS += $(STMSPDINCDIR)
|
||||
EXTRAINCDIRS += $(CMSISDIR)
|
||||
EXTRAINCDIRS += $(REVO_BLINC)
|
||||
EXTRAINCDIRS += $(BOOTINC)
|
||||
EXTRAINCDIRS += $(HWDEFSINC)
|
||||
|
||||
# List any extra directories to look for library files here.
|
||||
@ -163,7 +148,9 @@ DEBUGF = dwarf-2
|
||||
|
||||
# Place project-specific -D (define) and/or
|
||||
# -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_$(BOARD)
|
||||
|
||||
@ -328,7 +315,7 @@ $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
|
||||
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
|
||||
|
||||
# Add jtag targets (program and wipe)
|
||||
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(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
|
||||
elf: $(OUTDIR)/$(TARGET).elf
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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
|
@ -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
|
@ -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 */
|
115
flight/Bootloaders/Revolution/inc/common.h
Normal 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_ */
|
60
flight/Bootloaders/Revolution/inc/op_dfu.h
Normal 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****/
|
@ -37,7 +37,7 @@
|
||||
#define PIOS_INCLUDE_USB
|
||||
#define PIOS_INCLUDE_USB_HID
|
||||
#define PIOS_INCLUDE_COM_MSG
|
||||
//#define PIOS_INCLUDE_BL_HELPER
|
||||
//#define PIOS_INCLUDE_BL_HELPER_WRITE_SUPPORT
|
||||
#define PIOS_INCLUDE_BL_HELPER
|
||||
#define PIOS_INCLUDE_BL_HELPER_WRITE_SUPPORT
|
||||
|
||||
#endif /* PIOS_CONFIG_H */
|
||||
|
@ -1,17 +1,12 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @addtogroup AHRS BOOTLOADER
|
||||
* @brief The AHRS Modules perform
|
||||
* @addtogroup RevolutionBL Revolution BootLoader
|
||||
* @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
|
||||
* @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
|
||||
*
|
||||
*****************************************************************************/
|
||||
@ -30,41 +25,145 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* OpenPilot Includes */
|
||||
#include "ahrs_bl.h"
|
||||
/* Bootloader Includes */
|
||||
#include <pios.h>
|
||||
#include <pios_board_info.h>
|
||||
#include "pios_opahrs_proto.h"
|
||||
#include "bl_fsm.h" /* lfsm_state */
|
||||
//#include "stm32f2xx_flash.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "op_dfu.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 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 -----------------------------------------------------------*/
|
||||
typedef void
|
||||
(*pFunction)(void);
|
||||
typedef void (*pFunction)(void);
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
pFunction Jump_To_Application;
|
||||
uint32_t JumpAddress;
|
||||
/* Function Prototypes */
|
||||
//void
|
||||
//process_spi_request(void);
|
||||
void
|
||||
jump_to_app();
|
||||
uint32_t Fw_crc;
|
||||
/**
|
||||
* @brief Bootloader Main function
|
||||
*/
|
||||
|
||||
/// LEDs PWM
|
||||
uint32_t period1 = 5000; // 5 mS
|
||||
uint32_t sweep_steps1 = 100; // * 5 mS -> 500 mS
|
||||
uint32_t period2 = 5000; // 5 mS
|
||||
uint32_t sweep_steps2 = 100; // * 5 mS -> 500 mS
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
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() {
|
||||
/* Brings up System using CMSIS functions, enables the LEDs. */
|
||||
PIOS_SYS_Init();
|
||||
PIOS_Board_Init();
|
||||
PIOS_IAP_Init();
|
||||
|
||||
USB_connected = PIOS_USB_CheckAvailable(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();
|
||||
return 0;
|
||||
}
|
||||
|
||||
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() {
|
||||
const struct pios_board_info * bdinfo = &pios_board_info_blob;
|
||||
@ -76,8 +175,8 @@ void jump_to_app() {
|
||||
RCC_APB1PeriphResetCmd(0xffffffff, ENABLE);
|
||||
RCC_APB2PeriphResetCmd(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);
|
||||
Jump_To_Application = (pFunction) JumpAddress;
|
||||
@ -85,7 +184,25 @@ void jump_to_app() {
|
||||
__set_MSP(*(__IO uint32_t*) bdinfo->fw_base);
|
||||
Jump_To_Application();
|
||||
} else {
|
||||
boot_status = jump_failed;
|
||||
DeviceState = failed_jump;
|
||||
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;
|
||||
}
|
||||
|
||||
|
468
flight/Bootloaders/Revolution/op_dfu.c
Normal 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;
|
||||
}
|
||||
}
|
@ -23,6 +23,13 @@
|
||||
* 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 <pios_board_info.h>
|
||||
@ -39,10 +46,11 @@ void PIOS_Board_Init() {
|
||||
/* Delay system */
|
||||
PIOS_DELAY_Init();
|
||||
|
||||
#if defined(PIOS_INCLUDE_LED)
|
||||
PIOS_LED_Init(&pios_led_cfg);
|
||||
#endif /* PIOS_INCLUDE_LED */
|
||||
|
||||
|
||||
#if 0 && defined(PIOS_INCLUDE_USB)
|
||||
#if defined(PIOS_INCLUDE_USB)
|
||||
/* Initialize board specific USB data */
|
||||
PIOS_USB_BOARD_DATA_Init();
|
||||
|
||||
|
@ -583,7 +583,7 @@ $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
|
||||
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
|
||||
|
||||
# Add jtag targets (program and wipe)
|
||||
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE),$(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
|
||||
elf: $(OUTDIR)/$(TARGET).elf
|
||||
|
@ -678,9 +678,10 @@ void PIOS_Board_Init(void) {
|
||||
|
||||
#if defined(PIOS_INCLUDE_GCSRCVR)
|
||||
GCSReceiverInitialize();
|
||||
PIOS_GCSRCVR_Init();
|
||||
uint32_t pios_gcsrcvr_id;
|
||||
PIOS_GCSRCVR_Init(&pios_gcsrcvr_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_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_GCS] = pios_gcsrcvr_rcvr_id;
|
||||
|
@ -46,20 +46,12 @@
|
||||
// Private constants
|
||||
#define STACK_SIZE_BYTES 500
|
||||
#define TASK_PRIORITY (tskIDLE_PRIORITY+1)
|
||||
//#define UPDATE_PERIOD 100
|
||||
#define UPDATE_PERIOD 25
|
||||
|
||||
// Private types
|
||||
|
||||
// Private variables
|
||||
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
|
||||
static void altitudeTask(void *parameters);
|
||||
|
||||
@ -88,11 +80,6 @@ int32_t AltitudeInitialize()
|
||||
{
|
||||
BaroAltitudeInitialize();
|
||||
|
||||
// init down-sampling data
|
||||
alt_ds_temp = 0;
|
||||
alt_ds_pres = 0;
|
||||
alt_ds_count = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
MODULE_INITCALL(AltitudeInitialize, AltitudeStart)
|
||||
@ -144,12 +131,12 @@ static void altitudeTask(void *parameters)
|
||||
|
||||
// Update the temperature data
|
||||
PIOS_MS5611_StartADC(TemperatureConv);
|
||||
vTaskDelay(5);
|
||||
vTaskDelay(PIOS_MS5611_GetDelay());
|
||||
PIOS_MS5611_ReadADC();
|
||||
|
||||
// Update the pressure data
|
||||
PIOS_MS5611_StartADC(PressureConv);
|
||||
vTaskDelay(5);
|
||||
vTaskDelay(PIOS_MS5611_GetDelay());
|
||||
PIOS_MS5611_ReadADC();
|
||||
|
||||
|
||||
|
372
flight/Modules/AltitudeHold/altitudehold.c
Normal 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);
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file ahrs_spi_program_slave.h
|
||||
* @file examplemodperiodic.c
|
||||
* @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
|
||||
*
|
||||
@ -23,13 +23,9 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef EXAMPLEMODPERIODIC_H
|
||||
#define EXAMPLEMODPERIODIC_H
|
||||
|
||||
#ifndef AHRS_SPI_PROGRAM_SLAVE_H
|
||||
#define AHRS_SPI_PROGRAM_SLAVE_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
|
||||
int32_t ExampleModPeriodicInitialize();
|
||||
int32_t GuidanceInitialize(void);
|
||||
#endif // EXAMPLEMODPERIODIC_H
|
@ -234,6 +234,12 @@ static int32_t updateAttitudeComplimentary(bool first_run)
|
||||
AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE,SYSTEMALARMS_ALARM_WARNING);
|
||||
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
|
||||
FlightStatusData flightStatus;
|
||||
@ -290,7 +296,8 @@ static int32_t updateAttitudeComplimentary(bool first_run)
|
||||
accel_err[1] /= accel_mag;
|
||||
accel_err[2] /= accel_mag;
|
||||
|
||||
if (1) {
|
||||
if ( xQueueReceive(magQueue, &ev, 0) != pdTRUE )
|
||||
{
|
||||
// Rotate gravity to body frame and cross with accels
|
||||
float brot[3];
|
||||
float Rbe[3][3];
|
||||
@ -378,6 +385,14 @@ static int32_t updateAttitudeComplimentary(bool first_run)
|
||||
|
||||
AttitudeActualSet(&attitudeActual);
|
||||
|
||||
// Flush these queues for avoid errors
|
||||
if ( xQueueReceive(baroQueue, &ev, 0) != pdTRUE )
|
||||
{
|
||||
}
|
||||
if ( xQueueReceive(gpsQueue, &ev, 0) != pdTRUE )
|
||||
{
|
||||
}
|
||||
|
||||
AlarmsClear(SYSTEMALARMS_ALARM_ATTITUDE);
|
||||
|
||||
return 0;
|
||||
|
@ -39,6 +39,7 @@ typedef enum {FLIGHTMODE_UNDEFINED = 0, FLIGHTMODE_MANUAL = 1, FLIGHTMODE_STABIL
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED1) ? FLIGHTMODE_STABILIZED : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED2) ? FLIGHTMODE_STABILIZED : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED3) ? FLIGHTMODE_STABILIZED : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD) ? FLIGHTMODE_GUIDANCE : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_VELOCITYCONTROL) ? FLIGHTMODE_GUIDANCE : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_POSITIONHOLD) ? FLIGHTMODE_GUIDANCE : FLIGHTMODE_UNDEFINED \
|
||||
)
|
||||
|
@ -44,6 +44,9 @@
|
||||
#include "flightstatus.h"
|
||||
#include "accessorydesired.h"
|
||||
#include "receiveractivity.h"
|
||||
#include "altitudeholddesired.h"
|
||||
#include "positionactual.h"
|
||||
#include "baroaltitude.h"
|
||||
|
||||
// Private constants
|
||||
#if defined(PIOS_MANUAL_STACK_SIZE)
|
||||
@ -79,6 +82,7 @@ static portTickType lastSysTime;
|
||||
// Private functions
|
||||
static void updateActuatorDesired(ManualControlCommandData * cmd);
|
||||
static void updateStabilizationDesired(ManualControlCommandData * cmd, ManualControlSettingsData * settings);
|
||||
static void altitudeHoldDesired(ManualControlCommandData * cmd);
|
||||
static void processFlightMode(ManualControlSettingsData * settings, float flightMode);
|
||||
static void processArm(ManualControlCommandData * cmd, ManualControlSettingsData * settings);
|
||||
static void setArmedIfChanged(uint8_t val);
|
||||
@ -375,7 +379,13 @@ static void manualControlTask(void *parameters)
|
||||
updateStabilizationDesired(&cmd, &settings);
|
||||
break;
|
||||
case FLIGHTMODE_GUIDANCE:
|
||||
// TODO: Implement
|
||||
switch(flightStatus.FlightMode) {
|
||||
case FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD:
|
||||
altitudeHoldDesired(&cmd);
|
||||
break;
|
||||
default:
|
||||
AlarmsSet(SYSTEMALARMS_ALARM_MANUALCONTROL, SYSTEMALARMS_ALARM_CRITICAL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -588,6 +598,52 @@ static void updateStabilizationDesired(ManualControlCommandData * cmd, ManualCon
|
||||
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(¤tDown);
|
||||
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.
|
||||
*/
|
||||
|
@ -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.
|
||||
* @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
|
||||
*
|
||||
*****************************************************************************/
|
||||
@ -23,31 +33,14 @@
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef TELEMETRY_H
|
||||
#define TELEMETRY_H
|
||||
|
||||
#ifndef INS_BL_H
|
||||
#define INS_BL_H
|
||||
int32_t TelemetryInitialize(void);
|
||||
|
||||
#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 */
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
371
flight/Modules/OveroSync/overosync.c
Normal 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(®isterObject);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
@ -147,7 +147,6 @@ int32_t mag_test;
|
||||
uint32_t sensor_dt_us;
|
||||
static void SensorsTask(void *parameters)
|
||||
{
|
||||
uint8_t init = 0;
|
||||
portTickType lastSysTime;
|
||||
uint32_t accel_samples;
|
||||
uint32_t gyro_samples;
|
||||
@ -192,6 +191,7 @@ static void SensorsTask(void *parameters)
|
||||
// Main task loop
|
||||
lastSysTime = xTaskGetTickCount();
|
||||
bool error = false;
|
||||
uint32_t mag_update_time = PIOS_DELAY_GetRaw();
|
||||
while (1) {
|
||||
// TODO: add timeouts to the sensor reads and set an error if the fail
|
||||
sensor_dt_us = PIOS_DELAY_DiffuS(timeval);
|
||||
@ -347,7 +347,8 @@ static void SensorsTask(void *parameters)
|
||||
// and make it average zero (weakly)
|
||||
MagnetometerData mag;
|
||||
bool mag_updated = false;
|
||||
if (PIOS_HMC5883_NewDataAvailable()) {
|
||||
|
||||
if (PIOS_HMC5883_NewDataAvailable() || PIOS_DELAY_DiffuS(mag_update_time) > 150000) {
|
||||
mag_updated = true;
|
||||
int16_t values[3];
|
||||
PIOS_HMC5883_ReadMag(values);
|
||||
@ -355,6 +356,7 @@ static void SensorsTask(void *parameters)
|
||||
mag.y = values[0] * mag_scale[1] - mag_bias[1];
|
||||
mag.z = -values[2] * mag_scale[2] - mag_bias[2];
|
||||
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
|
||||
|
@ -461,7 +461,7 @@ static void SettingsUpdatedCb(UAVObjEvent * ev)
|
||||
if(settings.GyroTau < 0.0001)
|
||||
gyro_alpha = 0; // not trusting this to resolve to 0
|
||||
else
|
||||
gyro_alpha = exp(-fakeDt / settings.GyroTau);
|
||||
gyro_alpha = expf(-fakeDt / settings.GyroTau);
|
||||
}
|
||||
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
#ifndef STM3210E_INS_H_
|
||||
#define STM3210E_INS_H_
|
||||
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
//------------------------
|
||||
// Timers and Channels Used
|
||||
@ -68,8 +68,8 @@ TIM8 | | | |
|
||||
//------------------------
|
||||
// BOOTLOADER_SETTINGS
|
||||
//------------------------
|
||||
#define BOARD_READABLE TRUE
|
||||
#define BOARD_WRITABLE TRUE
|
||||
#define BOARD_READABLE true
|
||||
#define BOARD_WRITABLE true
|
||||
#define MAX_DEL_RETRYS 3
|
||||
|
||||
|
||||
|
@ -39,22 +39,97 @@ static GCSReceiverData gcsreceiverdata;
|
||||
|
||||
/* Provide a RCVR driver */
|
||||
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 = {
|
||||
.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)
|
||||
{
|
||||
struct pios_gcsrcvr_dev *gcsrcvr_dev = global_gcsrcvr_dev;
|
||||
if (ev->obj == GCSReceiverHandle()) {
|
||||
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 */
|
||||
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)
|
||||
@ -67,6 +142,31 @@ static int32_t PIOS_GCSRCVR_Get(uint32_t rcvr_id, uint8_t 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 */
|
||||
|
||||
/**
|
||||
|
@ -43,12 +43,10 @@ ConversionTypeTypeDef CurrentRead;
|
||||
MS5611CalibDataTypeDef CalibData;
|
||||
|
||||
/* Straight from the datasheet */
|
||||
static int32_t X1, X2, X3, B3, B5, B6, P;
|
||||
static uint32_t B4, B7;
|
||||
static volatile int32_t RawTemperature;
|
||||
static volatile int32_t RawPressure;
|
||||
static volatile float Pressure;
|
||||
static volatile float Temperature;
|
||||
static uint32_t RawTemperature;
|
||||
static uint32_t RawPressure;
|
||||
static int64_t Pressure;
|
||||
static int64_t Temperature;
|
||||
|
||||
static int32_t PIOS_MS5611_Read(uint8_t address, uint8_t * buffer, uint8_t len);
|
||||
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 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;
|
||||
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 */
|
||||
if (Type == TemperatureConv) {
|
||||
while (PIOS_MS5611_WriteCommand(MS5611_TEMP_ADDR) != 0)
|
||||
while (PIOS_MS5611_WriteCommand(MS5611_TEMP_ADDR + osr) != 0)
|
||||
continue;
|
||||
} else if (Type == PressureConv) {
|
||||
while (PIOS_MS5611_WriteCommand(MS5611_PRES_ADDR) != 0)
|
||||
while (PIOS_MS5611_WriteCommand(MS5611_PRES_ADDR + osr) != 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -102,6 +102,26 @@ int32_t PIOS_MS5611_StartADC(ConversionTypeTypeDef Type)
|
||||
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)
|
||||
* \param[in] PresOrTemp BMP085_PRES_ADDR or BMP085_TEMP_ADDR
|
||||
@ -114,7 +134,8 @@ int32_t PIOS_MS5611_ReadADC(void)
|
||||
Data[1] = 0;
|
||||
Data[2] = 0;
|
||||
|
||||
static float dT;
|
||||
static int64_t deltaTemp;
|
||||
|
||||
/* Read and store the 16bit result */
|
||||
if (CurrentRead == TemperatureConv) {
|
||||
/* Read the temperature conversion */
|
||||
@ -123,24 +144,23 @@ int32_t PIOS_MS5611_ReadADC(void)
|
||||
|
||||
RawTemperature = (Data[0] << 16) | (Data[1] << 8) | Data[2];
|
||||
|
||||
dT = RawTemperature - CalibData.C[4] * (1 << 8);
|
||||
Temperature = 2000 + dT * CalibData.C[5] / (1<<23);
|
||||
Temperature /= 100.0f;
|
||||
deltaTemp = RawTemperature - (CalibData.C[4] << 8);
|
||||
Temperature = 2000l + ((deltaTemp * CalibData.C[5]) >> 23);
|
||||
|
||||
} else {
|
||||
float Offset;
|
||||
float Sens;
|
||||
int64_t Offset;
|
||||
int64_t Sens;
|
||||
|
||||
/* Read the pressure conversion */
|
||||
if (PIOS_MS5611_Read(MS5611_ADC_READ, Data, 3) != 0)
|
||||
return -1;
|
||||
RawPressure = ((Data[0] << 16) | (Data[1] << 8) | Data[2]);
|
||||
|
||||
Offset = (float) CalibData.C[1] * (1<<16) +(float) CalibData.C[3] * (float) dT / (1<<7);
|
||||
Sens = (float) CalibData.C[0] * (1<<15) + ((float) CalibData.C[2] * (float) dT) / (1<<8);
|
||||
Offset = (((int64_t) CalibData.C[1]) << 16) + ((((int64_t) CalibData.C[3]) * deltaTemp) >> 7);
|
||||
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 /= 1000.0f;
|
||||
Pressure = (((((int64_t) RawPressure) * Sens) >> 21) - Offset) >> 15;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -150,7 +170,7 @@ int32_t PIOS_MS5611_ReadADC(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)
|
||||
{
|
||||
return Pressure;
|
||||
return ((float) Pressure) / 1000.0f;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -250,7 +250,7 @@ int32_t PIOS_USB_DESC_HID_CDC_Init(void)
|
||||
|
||||
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));
|
||||
|
||||
return 0;
|
||||
|
@ -158,7 +158,7 @@ int32_t PIOS_USB_DESC_HID_ONLY_Init(void)
|
||||
|
||||
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));
|
||||
|
||||
return 0;
|
||||
|
@ -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_Interface_Descriptor.Descriptor_Size = desc_size;
|
||||
Hid_Descriptor.Descriptor = desc;
|
||||
Hid_Descriptor.Descriptor_Size = desc_size;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
return Standard_GetDescriptorData(Length, &Hid_Interface_Descriptor);
|
||||
return Standard_GetDescriptorData(Length, &Hid_Descriptor);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -670,8 +670,6 @@ static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum)
|
||||
len32b = (len + 3) / 4;
|
||||
txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS);
|
||||
|
||||
|
||||
|
||||
while (txstatus.b.txfspcavail > len32b &&
|
||||
ep->xfer_count < ep->xfer_len &&
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
#if defined(PIOS_INCLUDE_BL_HELPER)
|
||||
#include <pios_board_info.h>
|
||||
#include "stm32f4xx_flash.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
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()
|
||||
{
|
||||
FLASH_Unlock();
|
||||
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
|
||||
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()
|
||||
{
|
||||
const struct pios_board_info * bdinfo = &pios_board_info_blob;
|
||||
uint32_t pageAdress = bdinfo->fw_base;
|
||||
uint8_t fail = FALSE;
|
||||
while ((pageAdress < (bdinfo->fw_base + bdinfo->fw_size + bdinfo->desc_size))
|
||||
|| (fail == TRUE)) {
|
||||
uint32_t pageAddress = bdinfo->fw_base;
|
||||
bool fail = false;
|
||||
while ((pageAddress < (bdinfo->fw_base + bdinfo->fw_size + bdinfo->desc_size))
|
||||
&& (fail == false)) {
|
||||
uint8_t sector_number;
|
||||
uint32_t sector_start;
|
||||
uint32_t sector_size;
|
||||
if (!PIOS_BL_HELPER_FLASH_GetSectorInfo(pageAddress,
|
||||
§or_number,
|
||||
§or_start,
|
||||
§or_size)) {
|
||||
/* We're asking for an invalid flash address */
|
||||
PIOS_Assert(0);
|
||||
}
|
||||
for (int retry = 0; retry < MAX_DEL_RETRYS; ++retry) {
|
||||
if (FLASH_ErasePage(pageAdress) == FLASH_COMPLETE) {
|
||||
fail = FALSE;
|
||||
if (FLASH_EraseSector(sector_number, VoltageRange_2) == FLASH_COMPLETE) {
|
||||
fail = false;
|
||||
break;
|
||||
} else {
|
||||
fail = TRUE;
|
||||
fail = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#ifdef STM32F10X_HD
|
||||
pageAdress += 2048;
|
||||
#elif defined (STM32F10X_MD)
|
||||
pageAdress += 1024;
|
||||
#endif
|
||||
/* Move to the next sector */
|
||||
pageAddress += sector_size;
|
||||
}
|
||||
|
||||
return (fail == TRUE) ? 0 : 1;
|
||||
return (fail == true) ? 0 : 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -68,19 +68,17 @@
|
||||
*/
|
||||
void PIOS_IAP_Init( void )
|
||||
{
|
||||
#if 0
|
||||
/* Enable CRC clock */
|
||||
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
|
||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
|
||||
|
||||
/* 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 */
|
||||
PWR_BackupAccessCmd(ENABLE);
|
||||
|
||||
/* Clear Tamper pin Event(TE) pending flag */
|
||||
RTC_ClearFlag();
|
||||
#endif
|
||||
RTC_ClearFlag(RTC_FLAG_TAMP1F);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -93,8 +91,7 @@ void PIOS_IAP_Init( void )
|
||||
*/
|
||||
uint32_t PIOS_IAP_CheckRequest( void )
|
||||
{
|
||||
#if 0
|
||||
uint32_t retval = FALSE;
|
||||
uint32_t retval = false;
|
||||
uint16_t reg1;
|
||||
uint16_t reg2;
|
||||
|
||||
@ -103,13 +100,11 @@ uint32_t PIOS_IAP_CheckRequest( void )
|
||||
|
||||
if( reg1 == IAP_MAGIC_WORD_1 && reg2 == IAP_MAGIC_WORD_2 ) {
|
||||
// We have a match.
|
||||
retval = TRUE;
|
||||
retval = true;
|
||||
} else {
|
||||
retval = FALSE;
|
||||
retval = false;
|
||||
}
|
||||
return retval;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -122,24 +117,18 @@ uint32_t PIOS_IAP_CheckRequest( void )
|
||||
*/
|
||||
void PIOS_IAP_SetRequest1(void)
|
||||
{
|
||||
#if 0
|
||||
RTC_WriteBackupRegister( MAGIC_REG_1, IAP_MAGIC_WORD_1);
|
||||
#endif
|
||||
}
|
||||
|
||||
void PIOS_IAP_SetRequest2(void)
|
||||
{
|
||||
#if 0
|
||||
RTC_WriteBackupRegister( MAGIC_REG_2, IAP_MAGIC_WORD_2);
|
||||
#endif
|
||||
}
|
||||
|
||||
void PIOS_IAP_ClearRequest(void)
|
||||
{
|
||||
#if 0
|
||||
RTC_WriteBackupRegister( MAGIC_REG_1, 0);
|
||||
RTC_WriteBackupRegister( MAGIC_REG_2, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint16_t PIOS_IAP_ReadBootCount(void)
|
||||
|
@ -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 */
|
||||
PIOS_Assert(spi_dev->cfg->slave_count == 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()? */
|
||||
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->mosi.gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->mosi.init));
|
||||
GPIO_Init(spi_dev->cfg->miso.gpio, (GPIO_InitTypeDef*)&(spi_dev->cfg->miso.init));
|
||||
|
||||
if(spi_dev->cfg->init.SPI_NSS != SPI_NSS_Hard) {
|
||||
for (uint32_t i = 0; i < init_ssel; i++) {
|
||||
/* Since we're driving the SSEL pin in software, ensure that the slave is deselected */
|
||||
/* 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 */
|
||||
DMA_DeInit(spi_dev->cfg->dma.rx.channel);
|
||||
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));
|
||||
|
||||
/* Configure DMA for SPI Tx */
|
||||
DMA_DeInit(spi_dev->cfg->dma.tx.channel);
|
||||
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));
|
||||
|
||||
/* Initialize the SPI block */
|
||||
SPI_DeInit(spi_dev->cfg->regs);
|
||||
SPI_Init(spi_dev->cfg->regs, (SPI_InitTypeDef*)&(spi_dev->cfg->init));
|
||||
|
||||
/* 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 */
|
||||
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);
|
||||
|
||||
@ -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);
|
||||
|
||||
/* 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);
|
||||
/* 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 */
|
||||
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 */
|
||||
dma_init = spi_dev->cfg->dma.rx.init;
|
||||
|
||||
DMA_DeInit(spi_dev->cfg->dma.rx.channel);
|
||||
if (receive_buffer != NULL) {
|
||||
/* Enable memory addr. increment - bytes written into 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 */
|
||||
dma_init = spi_dev->cfg->dma.tx.init;
|
||||
|
||||
DMA_DeInit(spi_dev->cfg->dma.tx.channel);
|
||||
if (send_buffer != NULL) {
|
||||
/* Enable memory addr. increment - bytes written into receive 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;
|
||||
}
|
||||
|
||||
|
||||
void PIOS_SPI_IRQ_Handler(uint32_t 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?
|
||||
DMA_ClearFlag(spi_dev->cfg->dma.rx.channel, spi_dev->cfg->dma.irq.flags);
|
||||
|
||||
if(spi_dev->cfg->init.SPI_Mode == SPI_Mode_Master) {
|
||||
/* 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). */
|
||||
while (SPI_I2S_GetFlagStatus(spi_dev->cfg->regs, SPI_I2S_FLAG_BSY)) ;
|
||||
}
|
||||
|
||||
if (spi_dev->callback != NULL) {
|
||||
bool crc_ok = true;
|
||||
|
@ -193,27 +193,6 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
|
||||
|
||||
/* Configure USB D-/D+ (DM/DP) pins */
|
||||
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_Speed = GPIO_Speed_100MHz;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include "pios_usbhook.h" /* PIOS_USBHOOK_* */
|
||||
|
||||
#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_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;
|
||||
uint32_t tx_out_context;
|
||||
|
||||
bool usb_if_enabled;
|
||||
|
||||
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];
|
||||
bool tx_active;
|
||||
|
||||
uint32_t rx_dropped;
|
||||
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->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 */
|
||||
usb_hid_dev->usb_if_enabled = false;
|
||||
PIOS_USBHOOK_RegisterIfOps(cfg->data_if, &usb_hid_ifops, (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_if_desc.length = length;
|
||||
hid_desc.descriptor = desc;
|
||||
hid_desc.length = length;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
usb_hid_dev->tx_packet_buffer[0] = 1;
|
||||
|
||||
#ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE
|
||||
PIOS_USBHOOK_EndpointTx(usb_hid_dev->cfg->data_tx_ep,
|
||||
usb_hid_dev->tx_packet_buffer,
|
||||
bytes_to_tx + 1);
|
||||
sizeof(usb_hid_dev->tx_packet_buffer));
|
||||
#else
|
||||
usb_hid_dev->tx_packet_buffer[1] = bytes_to_tx;
|
||||
PIOS_USBHOOK_EndpointTx(usb_hid_dev->cfg->data_tx_ep,
|
||||
usb_hid_dev->tx_packet_buffer,
|
||||
bytes_to_tx + 2);
|
||||
sizeof(usb_hid_dev->tx_packet_buffer));
|
||||
#endif
|
||||
|
||||
#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);
|
||||
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)) {
|
||||
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;
|
||||
#endif
|
||||
|
||||
PIOS_IRQ_Disable();
|
||||
if (rx_bytes_avail >= max_payload_length) {
|
||||
/*
|
||||
* FIXME should make sure we do not already have a buffer queued
|
||||
*/
|
||||
if (!usb_hid_dev->rx_active && (rx_bytes_avail >= max_payload_length)) {
|
||||
PIOS_USBHOOK_EndpointRx(usb_hid_dev->cfg->data_rx_ep,
|
||||
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)
|
||||
@ -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);
|
||||
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)) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (GetEPTxStatus(usb_hid_dev->cfg->data_tx_ep) == EP_TX_VALID) {
|
||||
/* Endpoint is already transmitting */
|
||||
return;
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* FIXME start transmitter
|
||||
*/
|
||||
#endif
|
||||
|
||||
if (!usb_hid_dev->tx_active) {
|
||||
/* Transmitter is not currently active, send a report */
|
||||
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)
|
||||
@ -309,13 +324,15 @@ static void PIOS_USB_HID_IF_Init(uint32_t usb_hid_id)
|
||||
|
||||
/* Register endpoint specific callbacks with the USBHOOK layer */
|
||||
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,
|
||||
(uint32_t) usb_hid_dev);
|
||||
PIOS_USBHOOK_RegisterEpOutCallback(usb_hid_dev->cfg->data_rx_ep,
|
||||
sizeof(usb_hid_dev->rx_packet_buffer),
|
||||
PIOS_USB_HID_EP_OUT_Callback,
|
||||
(uint32_t) usb_hid_dev);
|
||||
usb_hid_dev->usb_if_enabled = true;
|
||||
|
||||
}
|
||||
|
||||
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 */
|
||||
usb_hid_dev->usb_if_enabled = false;
|
||||
PIOS_USBHOOK_DeRegisterEpInCallback(usb_hid_dev->cfg->data_tx_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));
|
||||
break;
|
||||
case USB_DESC_TYPE_HID:
|
||||
PIOS_USBHOOK_CtrlTx(hid_if_desc.descriptor,
|
||||
MIN(hid_if_desc.length, req->wLength));
|
||||
PIOS_USBHOOK_CtrlTx(hid_desc.descriptor,
|
||||
MIN(hid_desc.length, req->wLength));
|
||||
break;
|
||||
default:
|
||||
/* 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;
|
||||
}
|
||||
|
||||
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 (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) {
|
||||
/* No Rx call back registered, disable the receiver */
|
||||
usb_hid_dev->rx_active = 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;
|
||||
} else {
|
||||
/* Not enough room left for a message, apply backpressure */
|
||||
usb_hid_dev->rx_active = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -86,6 +86,13 @@ void PIOS_USBHOOK_Activate(void)
|
||||
&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)
|
||||
{
|
||||
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,
|
||||
(struct usb_setup_request *)req);
|
||||
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.bRequest = req->bRequest;
|
||||
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 */
|
||||
|
||||
/* 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) {
|
||||
struct usb_ep_entry *ep = &(usb_epin_table[epnum]);
|
||||
ep->cb(ep->context, epnum, ep->max_len);
|
||||
if ((epnum_idx < NELEMENTS(usb_epin_table)) && usb_epin_table[epnum_idx].cb) {
|
||||
struct usb_ep_entry *ep = &(usb_epin_table[epnum_idx]);
|
||||
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;
|
||||
@ -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)
|
||||
{
|
||||
/* 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) {
|
||||
struct usb_ep_entry *ep = &(usb_epout_table[epnum]);
|
||||
ep->cb(ep->context, epnum, ep->max_len);
|
||||
if ((epnum_idx < NELEMENTS(usb_epout_table)) && usb_epout_table[epnum_idx].cb) {
|
||||
struct usb_ep_entry *ep = &(usb_epout_table[epnum_idx]);
|
||||
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;
|
||||
@ -457,441 +470,3 @@ static USBD_Class_cb_TypeDef class_callbacks = {
|
||||
#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
|
||||
|
@ -37,7 +37,7 @@
|
||||
|
||||
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 */
|
||||
|
||||
|
@ -58,6 +58,14 @@ struct pios_ms5611_cfg {
|
||||
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 */
|
||||
extern void PIOS_MS5611_Init(const struct pios_ms5611_cfg * cfg, int32_t i2c_device);
|
||||
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_GetPressure(void);
|
||||
extern int32_t PIOS_MS5611_Test();
|
||||
extern int32_t PIOS_MS5611_GetDelay();
|
||||
|
||||
#endif /* PIOS_MS5611_H */
|
||||
|
||||
|
@ -35,7 +35,7 @@ extern int32_t PIOS_USB_HID_Reenumerate(void);
|
||||
extern int32_t PIOS_USB_HID_ChangeConnectionState(uint32_t Connected);
|
||||
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);
|
||||
|
||||
#endif /* PIOS_USB_HID_H */
|
||||
|
@ -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_EndpointRx(uint8_t epnum, uint8_t *buf, uint16_t len);
|
||||
extern void PIOS_USBHOOK_Activate(void);
|
||||
extern void PIOS_USBHOOK_Deactivate(void);
|
||||
|
||||
#endif /* PIOS_USBHOOK_H */
|
||||
|
||||
|
@ -50,6 +50,7 @@
|
||||
/* STM32 Std Perf Lib */
|
||||
#if defined(STM32F4XX)
|
||||
# include <stm32f4xx.h>
|
||||
# include <stm32f4xx_rcc.h>
|
||||
#elif defined(STM32F2XX)
|
||||
#include <stm32f2xx.h>
|
||||
#include <stm32f2xx_syscfg.h>
|
||||
|
@ -392,7 +392,7 @@ $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
|
||||
$(eval $(call OPFW_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(BOARD_TYPE),$(BOARD_REVISION)))
|
||||
|
||||
# Add jtag targets (program and wipe)
|
||||
$(eval $(call JTAG_TEMPLATE,$(OUTDIR)/$(TARGET).bin,$(FW_BANK_BASE),$(FW_BANK_SIZE),$(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
|
||||
elf: $(OUTDIR)/$(TARGET).elf
|
||||
|
@ -1,15 +1,15 @@
|
||||
From 7a8a1dbf856a2183c91f441cfdd2eee5b3d9151b Mon Sep 17 00:00:00 2001
|
||||
From 8fd5040df32511f57b898bdbff412f61fbe28516 Mon Sep 17 00:00:00 2001
|
||||
From: Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
Date: Thu, 2 Feb 2012 22:42:03 -0500
|
||||
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 ++++++++++++++++
|
||||
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
|
||||
index 278d3ef..7ef4659 100644
|
||||
index 30d9cd9..6ea6565 100644
|
||||
--- a/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[
|
||||
@ -20,7 +20,7 @@ index 278d3ef..7ef4659 100644
|
||||
{ -1, 96 }, /* FPA1 */
|
||||
{ -1, 96 }, /* FPA2 */
|
||||
{ -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 }, /* FPA8 */
|
||||
{ -1, 32 }, /* FPS */
|
||||
@ -28,8 +28,8 @@ index 278d3ef..7ef4659 100644
|
||||
{ 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 */
|
||||
-1, /* stack_growth_direction */
|
||||
+#ifdef USE_DUMMY_FP_REGS
|
||||
@ -41,18 +41,18 @@ index 278d3ef..7ef4659 100644
|
||||
rtos_standard_Cortex_M3_stack_offsets /* register_offsets */
|
||||
};
|
||||
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
|
||||
+++ 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);
|
||||
int i;
|
||||
|
||||
+#ifdef USE_DUMMY_FP_REGS
|
||||
*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];
|
||||
#endif
|
||||
|
||||
|
@ -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>
|
||||
Date: Thu, 2 Feb 2012 22:42:26 -0500
|
||||
Subject: [PATCH 2/2] rtos: add stm32_stlink to FreeRTOS targets
|
||||
|
||||
---
|
||||
src/rtos/FreeRTOS.c | 11 +++++++++++
|
||||
1 files changed, 11 insertions(+), 0 deletions(-)
|
||||
src/rtos/FreeRTOS.c | 12 ++++++++++++
|
||||
1 files changed, 12 insertions(+), 0 deletions(-)
|
||||
|
||||
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
|
||||
+++ b/src/rtos/FreeRTOS.c
|
||||
@@ -63,6 +63,17 @@ const struct FreeRTOS_params FreeRTOS_params_list[] =
|
||||
0, // thread_stack_offset;
|
||||
52, // thread_name_offset;
|
||||
&rtos_standard_Cortex_M3_stacking, // stacking_info
|
||||
@@ -57,6 +57,18 @@ const struct FreeRTOS_params FreeRTOS_params_list[] = {
|
||||
0, /* thread_stack_offset; */
|
||||
52, /* thread_name_offset; */
|
||||
&rtos_standard_Cortex_M3_stacking, /* stacking_info */
|
||||
+ },
|
||||
+ { "stm32_stlink", // target_name
|
||||
+ 4, // thread_count_width;
|
||||
+ 4, // pointer_width;
|
||||
+ 16, // list_next_offset;
|
||||
+ 20, // list_width;
|
||||
+ 8, // list_elem_next_offset;
|
||||
+ 12, // list_elem_content_offset
|
||||
+ 0, // thread_stack_offset;
|
||||
+ 52, // thread_name_offset;
|
||||
+ &rtos_standard_Cortex_M3_stacking, // stacking_info
|
||||
+ {
|
||||
+ "stm32_stlink", /* target_name */
|
||||
+ 4, /* thread_count_width; */
|
||||
+ 4, /* pointer_width; */
|
||||
+ 16, /* list_next_offset; */
|
||||
+ 20, /* list_width; */
|
||||
+ 8, /* list_elem_next_offset; */
|
||||
+ 12, /* list_elem_content_offset */
|
||||
+ 0, /* thread_stack_offset; */
|
||||
+ 52, /* thread_name_offset; */
|
||||
+ &rtos_standard_Cortex_M3_stacking, /* stacking_info */
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
--
|
||||
1.7.1
|
||||
|
||||
|
@ -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
|
||||
|
||||
#set _FLASHNAME $_CHIPNAME.flash
|
||||
#flash bank $_FLASHNAME stm32f2x 0x08000000 0 0 0 $_TARGETNAME
|
||||
set _FLASHNAME $_CHIPNAME.flash
|
||||
flash bank $_FLASHNAME stm32f2x 0x08000000 0 0 0 $_TARGETNAME
|
||||
|
@ -8,49 +8,8 @@
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
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>"; };
|
||||
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; };
|
||||
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>"; };
|
||||
@ -68,13 +27,11 @@
|
||||
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>"; };
|
||||
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>"; };
|
||||
652C856A132B6EA600BFCC70 /* sonaraltitude.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = sonaraltitude.xml; sourceTree = "<group>"; };
|
||||
652EF83814DF229C00C461BB /* Modules */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Modules; path = ../../Modules; 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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@ -2797,45 +2754,6 @@
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@ -2846,15 +2764,13 @@
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@ -2901,7 +2817,6 @@
|
||||
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>"; };
|
||||
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; };
|
||||
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; };
|
||||
@ -3290,8 +3205,6 @@
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@ -3302,13 +3215,9 @@
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@ -3385,320 +3294,6 @@
|
||||
name = Products;
|
||||
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 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -3731,23 +3326,6 @@
|
||||
path = inc;
|
||||
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 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -3805,8 +3383,8 @@
|
||||
65FF4BB313791C3300146BE4 /* Bootloaders */,
|
||||
65F93B9012EE09280047DB36 /* PipXtreme */,
|
||||
65E6DF7012E02E8E00058553 /* CopterControl */,
|
||||
650D8E1F12DFE16400D05CC9 /* Modules */,
|
||||
657CEEB6121DBC63007A1FBE /* Libraries */,
|
||||
652EF83814DF229C00C461BB /* Modules */,
|
||||
65E8F02F11EFF25C00BBF654 /* PiOS */,
|
||||
65E6DF9012E0313E00058553 /* PipXtreme */,
|
||||
650D8E6A12DFE17500D05CC9 /* UAVObjects */,
|
||||
@ -8243,65 +7821,12 @@
|
||||
65C35E4E12EFB2F3004811C2 /* shared */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
65C35E4F12EFB2F3004811C2 /* uavobjectdefinition */,
|
||||
65E466BC14E244020075459C /* uavobjectdefinition */,
|
||||
);
|
||||
name = shared;
|
||||
path = ../../../shared;
|
||||
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 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -8314,24 +7839,6 @@
|
||||
path = inc;
|
||||
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 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -9140,41 +8647,6 @@
|
||||
path = inc;
|
||||
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 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -49,7 +49,10 @@ endif
|
||||
FLASH_TOOL = OPENOCD
|
||||
|
||||
# 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 =
|
||||
#FlightPlan
|
||||
|
||||
@ -251,8 +254,8 @@ endif
|
||||
# common architecture-specific flags from the device-specific library makefile
|
||||
CFLAGS += $(ARCHFLAGS)
|
||||
|
||||
|
||||
CFLAGS += -DDIAGNOSTICS
|
||||
CFLAGS += -DDIAG_TASKS
|
||||
|
||||
# This is not the best place for these. Really should abstract out
|
||||
# to the board file or something
|
||||
@ -271,7 +274,7 @@ DEBUGF = dwarf-2
|
||||
|
||||
# Place project-specific -D (define) and/or
|
||||
# -U options for C here.
|
||||
CDEFS += -DSTM32F10X_$(MODEL)
|
||||
CDEFS += -DHSE_VALUE=$(OSCILLATOR_FREQ)
|
||||
CDEFS += -DSYSCLK_FREQ=$(SYSCLK_FREQ)
|
||||
CDEFS += -DUSE_STDPERIPH_DRIVER
|
||||
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)))
|
||||
|
||||
# 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
|
||||
elf: $(OUTDIR)/$(TARGET).elf
|
||||
|
@ -71,7 +71,7 @@
|
||||
#define PIOS_INCLUDE_COM_TELEM
|
||||
//#define PIOS_INCLUDE_COM_AUX
|
||||
#define PIOS_INCLUDE_GPS
|
||||
|
||||
#define PIOS_OVERO_SPI
|
||||
/* Supported receiver interfaces */
|
||||
#define PIOS_INCLUDE_RCVR
|
||||
#define PIOS_INCLUDE_DSM
|
||||
@ -105,6 +105,8 @@
|
||||
// This actually needs calibrating
|
||||
#define IDLE_COUNTS_PER_SEC_AT_NO_LOAD (8379692)
|
||||
|
||||
#define REVOLUTION
|
||||
|
||||
#endif /* PIOS_CONFIG_H */
|
||||
/**
|
||||
* @}
|
||||
|
@ -299,6 +299,13 @@ void PIOS_Board_Init(void) {
|
||||
#endif
|
||||
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 */
|
||||
EventDispatcherInitialize();
|
||||
UAVObjInitialize();
|
||||
@ -326,6 +333,18 @@ void PIOS_Board_Init(void) {
|
||||
PIOS_TIM_InitClock(&tim_11_cfg);
|
||||
|
||||
/* 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();
|
||||
|
||||
#if defined(PIOS_INCLUDE_USB)
|
||||
@ -462,7 +481,7 @@ void PIOS_Board_Init(void) {
|
||||
#if defined(PIOS_INCLUDE_GPS)
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -473,7 +492,6 @@ void PIOS_Board_Init(void) {
|
||||
NULL, 0)) {
|
||||
PIOS_Assert(0);
|
||||
}
|
||||
|
||||
#endif /* PIOS_INCLUDE_GPS */
|
||||
|
||||
#if defined(PIOS_INCLUDE_COM_AUX)
|
||||
@ -503,7 +521,7 @@ void PIOS_Board_Init(void) {
|
||||
#if defined(PIOS_INCLUDE_COM_TELEM)
|
||||
{ /* Eventually add switch for this port function */
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,7 @@ UAVOBJSRCFILENAMES += accessorydesired
|
||||
UAVOBJSRCFILENAMES += actuatorcommand
|
||||
UAVOBJSRCFILENAMES += actuatordesired
|
||||
UAVOBJSRCFILENAMES += actuatorsettings
|
||||
UAVOBJSRCFILENAMES += altholdsmoothed
|
||||
UAVOBJSRCFILENAMES += attitudesettings
|
||||
UAVOBJSRCFILENAMES += attitudeactual
|
||||
UAVOBJSRCFILENAMES += gyros
|
||||
@ -55,6 +56,7 @@ UAVOBJSRCFILENAMES += mixersettings
|
||||
UAVOBJSRCFILENAMES += mixerstatus
|
||||
UAVOBJSRCFILENAMES += nedaccel
|
||||
UAVOBJSRCFILENAMES += objectpersistence
|
||||
UAVOBJSRCFILENAMES += overosyncstats
|
||||
UAVOBJSRCFILENAMES += positionactual
|
||||
UAVOBJSRCFILENAMES += positiondesired
|
||||
UAVOBJSRCFILENAMES += ratedesired
|
||||
@ -74,6 +76,8 @@ UAVOBJSRCFILENAMES += hwsettings
|
||||
UAVOBJSRCFILENAMES += receiveractivity
|
||||
UAVOBJSRCFILENAMES += cameradesired
|
||||
UAVOBJSRCFILENAMES += camerastabsettings
|
||||
UAVOBJSRCFILENAMES += altitudeholdsettings
|
||||
UAVOBJSRCFILENAMES += altitudeholddesired
|
||||
|
||||
UAVOBJSRC = $(foreach UAVOBJSRCFILE,$(UAVOBJSRCFILENAMES),$(UAVOBJSYNTHDIR)/$(UAVOBJSRCFILE).c )
|
||||
UAVOBJDEFINE = $(foreach UAVOBJSRCFILE,$(UAVOBJSRCFILENAMES),-DUAVOBJ_INIT_$(UAVOBJSRCFILE) )
|
||||
|
@ -324,7 +324,7 @@ void PIOS_SPI_gyro_irq_handler(void)
|
||||
*/
|
||||
void PIOS_SPI_flash_irq_handler(void);
|
||||
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 = {
|
||||
.regs = SPI3,
|
||||
.remap = GPIO_AF_SPI3,
|
||||
@ -343,7 +343,7 @@ static const struct pios_spi_cfg pios_spi_flash_cfg = {
|
||||
.dma = {
|
||||
.irq = {
|
||||
// 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 = {
|
||||
.NVIC_IRQChannel = DMA1_Stream0_IRQn,
|
||||
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
|
||||
@ -372,7 +372,7 @@ static const struct pios_spi_cfg pios_spi_flash_cfg = {
|
||||
},
|
||||
},
|
||||
.tx = {
|
||||
.channel = DMA1_Stream2,
|
||||
.channel = DMA1_Stream5,
|
||||
.init = {
|
||||
.DMA_Channel = DMA_Channel_0,
|
||||
.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);
|
||||
}
|
||||
#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 */
|
||||
|
||||
|
||||
@ -1129,22 +1255,6 @@ static const struct pios_tim_channel pios_tim_servoport_all_pins[] = {
|
||||
},
|
||||
.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_chan = TIM_Channel_1,
|
||||
@ -1161,6 +1271,22 @@ static const struct pios_tim_channel pios_tim_servoport_all_pins[] = {
|
||||
},
|
||||
.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_chan = TIM_Channel_3,
|
||||
|
@ -19,7 +19,10 @@ equals(copydata, 1) {
|
||||
QtSql4.dll \
|
||||
QtSvg4.dll \
|
||||
QtTest4.dll \
|
||||
QtXml4.dll
|
||||
QtXml4.dll \
|
||||
QtDeclarative4.dll \
|
||||
QtXmlPatterns4.dll \
|
||||
QtScript4.dll
|
||||
for(dll, QT_DLLS) {
|
||||
data_copy.commands += $(COPY_FILE) $$targetPath(\"$$[QT_INSTALL_BINS]/$$dll\") $$targetPath(\"$$GCS_APP_PATH/$$dll\") $$addNewline()
|
||||
}
|
||||
|
142
ground/openpilotgcs/share/openpilotgcs/dials/default/arm-status.svg
Normal file → Executable file
@ -14,8 +14,8 @@
|
||||
height="80.827866"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.0 r9654"
|
||||
sodipodi:docname="arm-status.svg"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="arm-status-new.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
inkscape:export-ydpi="103.61"
|
||||
@ -1224,6 +1224,82 @@
|
||||
id="linearGradient3339"
|
||||
xlink:href="#linearGradient5128-0-5"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@ -1233,15 +1309,15 @@
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.979899"
|
||||
inkscape:cx="69.908261"
|
||||
inkscape:cy="99.737699"
|
||||
inkscape:cx="75.4641"
|
||||
inkscape:cy="94.18186"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="background"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="691"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="823"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -1257,7 +1333,7 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Edouard Lafargue</dc:title>
|
||||
@ -1275,17 +1351,34 @@
|
||||
<g
|
||||
id="background"
|
||||
inkscape:label="#g8543">
|
||||
<g
|
||||
transform="matrix(0.79280486,0,0,0.72374721,322.67019,100.52996)"
|
||||
id="g4023"
|
||||
style="display:inline">
|
||||
<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" />
|
||||
style="fill:url(#linearGradient4033);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
|
||||
id="rect4025"
|
||||
width="289.19211"
|
||||
height="111.67988"
|
||||
x="-147.32065"
|
||||
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
|
||||
inkscape:label="#rect4388"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -1297,7 +1390,7 @@
|
||||
height="64.785042"
|
||||
width="205.45833"
|
||||
id="bargraph"
|
||||
style="fill:#332d2d;fill-opacity:1;stroke:none" />
|
||||
style="fill:none;fill-opacity:1;stroke:none" />
|
||||
<g
|
||||
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"
|
||||
@ -1305,15 +1398,18 @@
|
||||
<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"
|
||||
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
|
||||
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"
|
||||
id="path3382" />
|
||||
id="path3382"
|
||||
inkscape:connector-curvature="0" />
|
||||
<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"
|
||||
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>
|
||||
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 56 KiB |
236
ground/openpilotgcs/share/openpilotgcs/dials/default/flightmode-status.svg
Normal file → Executable file
@ -14,8 +14,8 @@
|
||||
height="80.827866"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.1 r9760"
|
||||
sodipodi:docname="flightmode-status.svg"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="flightmode-status-new.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
inkscape:export-ydpi="103.61"
|
||||
@ -1037,6 +1037,82 @@
|
||||
fx="29.77438"
|
||||
fy="7.0922189"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@ -1049,12 +1125,12 @@
|
||||
inkscape:cx="-7.1957738"
|
||||
inkscape:cy="90.710362"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:current-layer="background"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="691"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="823"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -1070,7 +1146,7 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Edouard Lafargue</dc:title>
|
||||
@ -1088,17 +1164,34 @@
|
||||
<g
|
||||
id="background"
|
||||
inkscape:label="#g8543">
|
||||
<g
|
||||
transform="matrix(0.79280486,0,0,0.72374721,322.67019,100.52996)"
|
||||
id="g4023"
|
||||
style="display:inline">
|
||||
<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" />
|
||||
style="fill:url(#linearGradient4033);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
|
||||
id="rect4025"
|
||||
width="289.19211"
|
||||
height="111.67988"
|
||||
x="-147.32065"
|
||||
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
|
||||
inkscape:label="#rect4388"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -1110,7 +1203,7 @@
|
||||
height="64.785042"
|
||||
width="205.45833"
|
||||
id="bargraph"
|
||||
style="fill:#332d2d;fill-opacity:1;stroke:none" />
|
||||
style="fill:none;fill-opacity:1;stroke:none" />
|
||||
<text
|
||||
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"
|
||||
@ -1128,7 +1221,8 @@
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="Status-Symbol"
|
||||
style="display:inline">
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
transform="matrix(2.0683135,0,0,2.0683135,-162.1788,206.61155)"
|
||||
inkscape:label="#g4504"
|
||||
@ -1142,7 +1236,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1152,7 +1246,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1162,7 +1256,7 @@
|
||||
sodipodi:cy="29.207693"
|
||||
sodipodi:cx="29.392656"
|
||||
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
|
||||
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"
|
||||
@ -1172,7 +1266,7 @@
|
||||
sodipodi:cy="30.352861"
|
||||
sodipodi:cx="29.77438"
|
||||
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>
|
||||
<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"
|
||||
@ -1201,7 +1295,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1211,7 +1305,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1221,7 +1315,7 @@
|
||||
sodipodi:cy="29.207693"
|
||||
sodipodi:cx="29.392656"
|
||||
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
|
||||
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"
|
||||
@ -1231,7 +1325,7 @@
|
||||
sodipodi:cy="30.352861"
|
||||
sodipodi:cx="29.77438"
|
||||
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
|
||||
transform="matrix(0.33832187,0,0,0.33832187,410.06766,-39.187259)"
|
||||
@ -1241,7 +1335,7 @@
|
||||
sodipodi:end="6.2831853"
|
||||
sodipodi:start="3.1415927"
|
||||
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:rx="21.428572"
|
||||
sodipodi:cy="-85.6007"
|
||||
@ -1258,12 +1352,13 @@
|
||||
sodipodi:cy="-85.243561"
|
||||
sodipodi:rx="49.642857"
|
||||
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)" />
|
||||
<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"
|
||||
d="m -101.07143,-37.895278 0,-96.382562"
|
||||
id="path2991" />
|
||||
id="path2991"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:end="3.1415927"
|
||||
sodipodi:start="0"
|
||||
@ -1274,7 +1369,7 @@
|
||||
sodipodi:cy="-85.6007"
|
||||
sodipodi:rx="21.428572"
|
||||
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)"
|
||||
sodipodi:open="true" />
|
||||
<path
|
||||
@ -1285,11 +1380,11 @@
|
||||
sodipodi:cy="-85.6007"
|
||||
sodipodi:rx="20.357143"
|
||||
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)" />
|
||||
<path
|
||||
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:rx="49.642857"
|
||||
sodipodi:cy="-85.243561"
|
||||
@ -1319,7 +1414,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1329,7 +1424,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1339,7 +1434,7 @@
|
||||
sodipodi:cy="29.207693"
|
||||
sodipodi:cx="29.392656"
|
||||
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
|
||||
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"
|
||||
@ -1349,7 +1444,7 @@
|
||||
sodipodi:cy="30.352861"
|
||||
sodipodi:cx="29.77438"
|
||||
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
|
||||
transform="matrix(0.72825401,0,0,0.72825401,0.26819761,-37.594811)"
|
||||
@ -1358,30 +1453,36 @@
|
||||
<path
|
||||
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"
|
||||
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
|
||||
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"
|
||||
id="path3872"
|
||||
sodipodi:nodetypes="cc" />
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<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"
|
||||
d="m 249.76021,-82.544001 7.95495,-7.954951"
|
||||
id="path3874" />
|
||||
id="path3874"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path3876"
|
||||
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
|
||||
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"
|
||||
id="path3878"
|
||||
sodipodi:nodetypes="cc" />
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path3880"
|
||||
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"
|
||||
sodipodi:nodetypes="cc" />
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
@ -1401,7 +1502,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1411,7 +1512,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1421,7 +1522,7 @@
|
||||
sodipodi:cy="29.207693"
|
||||
sodipodi:cx="29.392656"
|
||||
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
|
||||
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"
|
||||
@ -1431,7 +1532,7 @@
|
||||
sodipodi:cy="30.352861"
|
||||
sodipodi:cx="29.77438"
|
||||
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>
|
||||
<path
|
||||
id="path34138-1-7"
|
||||
@ -1440,7 +1541,8 @@
|
||||
sodipodi:nodetypes="cccccccccccccccccccc"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
inkscape:export-ydpi="103.61" />
|
||||
inkscape:export-ydpi="103.61"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(1.2181818,0,0,1.2181818,-488.7342,39.213763)"
|
||||
@ -1452,7 +1554,7 @@
|
||||
inkscape:label="#g4504"
|
||||
transform="matrix(1.6946172,0,0,1.6946172,90.69312,69.91641)">
|
||||
<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"
|
||||
sodipodi:cx="14.5"
|
||||
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"
|
||||
transform="matrix(1.3565115,0,0,1.3564842,148.6163,-105.84566)" />
|
||||
<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"
|
||||
sodipodi:cx="14.5"
|
||||
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"
|
||||
transform="matrix(0.8476709,0,0,0.8476539,155.99448,-91.479567)" />
|
||||
<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"
|
||||
sodipodi:cx="29.392656"
|
||||
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"
|
||||
transform="matrix(0.4552142,0,0,0.4578395,154.92379,-94.080092)" />
|
||||
<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"
|
||||
sodipodi:cx="29.77438"
|
||||
sodipodi:cy="30.352861"
|
||||
@ -1505,13 +1607,13 @@
|
||||
sodipodi:cy="-85.6007"
|
||||
sodipodi:rx="21.428572"
|
||||
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)"
|
||||
sodipodi:start="3.1415927"
|
||||
sodipodi:end="6.2831853" />
|
||||
<path
|
||||
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:rx="49.642857"
|
||||
sodipodi:cy="-85.243561"
|
||||
@ -1527,7 +1629,7 @@
|
||||
<path
|
||||
sodipodi:open="true"
|
||||
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:rx="21.428572"
|
||||
sodipodi:cy="-85.6007"
|
||||
@ -1539,7 +1641,7 @@
|
||||
sodipodi:end="3.1415927" />
|
||||
<path
|
||||
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:rx="20.357143"
|
||||
sodipodi:cy="-85.6007"
|
||||
@ -1558,7 +1660,7 @@
|
||||
sodipodi:cy="-85.243561"
|
||||
sodipodi:rx="49.642857"
|
||||
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)" />
|
||||
</g>
|
||||
</g>
|
||||
@ -1580,7 +1682,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1590,7 +1692,7 @@
|
||||
sodipodi:cy="26.6875"
|
||||
sodipodi:cx="14.5"
|
||||
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
|
||||
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"
|
||||
@ -1600,7 +1702,7 @@
|
||||
sodipodi:cy="29.207693"
|
||||
sodipodi:cx="29.392656"
|
||||
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
|
||||
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"
|
||||
@ -1610,7 +1712,7 @@
|
||||
sodipodi:cy="30.352861"
|
||||
sodipodi:cx="29.77438"
|
||||
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
|
||||
transform="matrix(0.33832187,0,0,0.33832187,410.06766,-39.187259)"
|
||||
@ -1620,7 +1722,7 @@
|
||||
sodipodi:end="6.2831853"
|
||||
sodipodi:start="3.1415927"
|
||||
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:rx="21.428572"
|
||||
sodipodi:cy="-85.6007"
|
||||
@ -1637,7 +1739,7 @@
|
||||
sodipodi:cy="-85.243561"
|
||||
sodipodi:rx="49.642857"
|
||||
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)" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
@ -1654,7 +1756,7 @@
|
||||
sodipodi:cy="-85.6007"
|
||||
sodipodi:rx="21.428572"
|
||||
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)"
|
||||
sodipodi:open="true" />
|
||||
<path
|
||||
@ -1665,11 +1767,11 @@
|
||||
sodipodi:cy="-85.6007"
|
||||
sodipodi:rx="20.357143"
|
||||
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)" />
|
||||
<path
|
||||
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:rx="49.642857"
|
||||
sodipodi:cy="-85.243561"
|
||||
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
345
ground/openpilotgcs/share/openpilotgcs/dials/default/gps-signal.svg
Normal file → Executable file
@ -14,7 +14,7 @@
|
||||
height="80.827866"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="gps-signal.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
@ -408,6 +408,233 @@
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@ -416,16 +643,16 @@
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.959798"
|
||||
inkscape:cx="62.249814"
|
||||
inkscape:zoom="1.979899"
|
||||
inkscape:cx="83.531555"
|
||||
inkscape:cy="43.870219"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="svg10068"
|
||||
inkscape:current-layer="layer6"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="725"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="823"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -454,7 +681,7 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Edouard Lafargue</dc:title>
|
||||
@ -468,21 +695,29 @@
|
||||
inkscape:label="Dark background"
|
||||
id="g2932"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-205.8687,-331.45166)">
|
||||
transform="translate(-205.8687,-331.45166)"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="background"
|
||||
inkscape:label="#g8543">
|
||||
<g
|
||||
transform="matrix(0.79280486,0,0,0.72374721,322.67019,100.52996)"
|
||||
id="g4023"
|
||||
style="display:inline">
|
||||
<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" />
|
||||
style="fill:url(#linearGradient4033);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
|
||||
id="rect4025"
|
||||
width="289.19211"
|
||||
height="111.67988"
|
||||
x="-147.32065"
|
||||
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
|
||||
inkscape:label="#rect4388"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -494,7 +729,7 @@
|
||||
height="64.785042"
|
||||
width="151.41518"
|
||||
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
|
||||
transform="translate(229.23003,365.4229)"
|
||||
style="display:inline"
|
||||
@ -549,7 +784,7 @@
|
||||
ry="2" />
|
||||
</g>
|
||||
<rect
|
||||
style="fill:#332d2d;fill-opacity:1;stroke:none"
|
||||
style="fill:none;stroke:none"
|
||||
id="rect3718"
|
||||
width="52.798534"
|
||||
height="37.510921"
|
||||
@ -660,30 +895,43 @@
|
||||
height="61.754585"
|
||||
width="148.38472"
|
||||
id="needle"
|
||||
style="fill:#332d2d;fill-opacity:1;stroke:none;display:inline" />
|
||||
style="fill:#1a1a1a;fill-opacity:1;stroke:none;display:inline" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="foreground"
|
||||
inkscape:label="Foreground"
|
||||
style="display:inline">
|
||||
style="display:inline"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="g3178"
|
||||
transform="translate(64.636327,-10.20833)">
|
||||
<path
|
||||
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
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="rect2924"
|
||||
sodipodi:nodetypes="cccccccccccccccccccccc" />
|
||||
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
|
||||
id="g2928"
|
||||
transform="matrix(0.53532208,0,0,0.53532208,-271.81544,-86.17791)">
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g2928-2">
|
||||
<path
|
||||
transform="translate(0.08444214,0)"
|
||||
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"
|
||||
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:ry="20.714285"
|
||||
sodipodi:rx="20.714285"
|
||||
sodipodi:cy="195.93361"
|
||||
sodipodi:cx="569.28571"
|
||||
id="path2930"
|
||||
style="fill:#fff954;fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
id="path2930-4"
|
||||
style="fill:url(#radialGradient3137);fill-opacity:1;stroke:#fcaa21;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
sodipodi:type="arc" />
|
||||
<rect
|
||||
ry="2.2728431"
|
||||
@ -691,16 +939,43 @@
|
||||
x="590.45447"
|
||||
height="45.456863"
|
||||
width="4.5456862"
|
||||
id="rect2932"
|
||||
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"
|
||||
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" />
|
||||
<rect
|
||||
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="rect2934"
|
||||
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"
|
||||
id="rect2934-5"
|
||||
width="4.5456862"
|
||||
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>
|
||||
<rect
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 33 KiB |
851
ground/openpilotgcs/share/openpilotgcs/dials/default/lineardial-horizontal.svg
Normal file → Executable file
@ -14,7 +14,7 @@
|
||||
height="47.114098"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="lineardial-horizontal.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
@ -22,6 +22,54 @@
|
||||
style="display:inline">
|
||||
<defs
|
||||
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
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
orient="auto"
|
||||
@ -224,6 +272,602 @@
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@ -233,15 +877,15 @@
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="2.8"
|
||||
inkscape:cx="152.93622"
|
||||
inkscape:cy="20.867055"
|
||||
inkscape:cx="92.416951"
|
||||
inkscape:cy="61.481315"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:current-layer="green"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="725"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="823"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -271,21 +915,40 @@
|
||||
inkscape:label="Dark background"
|
||||
id="g2932"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-227.44331,-365.7337)">
|
||||
transform="translate(-227.44331,-365.7337)"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="background"
|
||||
inkscape:label="#g8543">
|
||||
<rect
|
||||
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect2936"
|
||||
width="302.25623"
|
||||
height="43.114098"
|
||||
x="229.44331"
|
||||
y="367.7337"
|
||||
ry="3.1816578"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998" />
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g3081"
|
||||
transform="matrix(0.99025687,0,0,0.91248427,234.44213,443.04453)">
|
||||
<path
|
||||
style="fill:url(#linearGradient4992);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
|
||||
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"
|
||||
id="rect4025"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sssssssss" />
|
||||
<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
|
||||
inkscape:label="#rect4388"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -297,7 +960,7 @@
|
||||
height="9.2538376"
|
||||
width="260.53882"
|
||||
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
|
||||
style="fill:#332d2d;fill-opacity:1;stroke:none"
|
||||
id="bargraph"
|
||||
@ -316,25 +979,62 @@
|
||||
inkscape:groupmode="layer"
|
||||
id="layer5"
|
||||
inkscape:label="Green Zone"
|
||||
style="display:inline">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:#04b629;fill-opacity:1;stroke:none;display:inline"
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="green"
|
||||
inkscape:label="#g4183">
|
||||
<rect
|
||||
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="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="22.858707"
|
||||
y="29.431705"
|
||||
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:export-ydpi="88.809998"
|
||||
inkscape:label="#rect4388"
|
||||
transform="scale(1,-1)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Yellow Zone"
|
||||
style="display:inline">
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="g3793">
|
||||
<rect
|
||||
@ -358,6 +1058,56 @@
|
||||
id="rect3786"
|
||||
style="fill:none;stroke:none" />
|
||||
</g>
|
||||
<g
|
||||
id="yellow"
|
||||
inkscape:label="#g4292">
|
||||
<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
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Red zone"
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="red"
|
||||
inkscape:label="#g4338">
|
||||
<rect
|
||||
inkscape:export-ydpi="88.809998"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
@ -367,19 +1117,12 @@
|
||||
x="22.858707"
|
||||
height="9.2538376"
|
||||
width="260.53882"
|
||||
id="yellow"
|
||||
style="fill:#f1b907;fill-opacity:1;stroke:none;display:inline"
|
||||
inkscape:label="#rect5741" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Red zone"
|
||||
style="display:inline">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
id="hghg"
|
||||
style="fill:#cf0e0e;fill-opacity:1;stroke:none;display:inline"
|
||||
id="red"
|
||||
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"
|
||||
@ -387,25 +1130,41 @@
|
||||
ry="0.68289828"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="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
|
||||
inkscape:groupmode="layer"
|
||||
id="layer6"
|
||||
inkscape:label="Indicator"
|
||||
style="display:inline">
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true">
|
||||
<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"
|
||||
id="needle"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:label="#path5747" />
|
||||
inkscape:label="#path5747"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="Text"
|
||||
style="display:inline">
|
||||
style="display:none">
|
||||
<rect
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
id="field"
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 39 KiB |
682
ground/openpilotgcs/share/openpilotgcs/dials/default/lineardial-vertical.svg
Normal file → Executable file
@ -14,14 +14,98 @@
|
||||
height="322.58304"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="dials-master-linear-vertical.svg"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="lineardial-vertical.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
inkscape:export-ydpi="103.61"
|
||||
style="display:inline">
|
||||
<defs
|
||||
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
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
orient="auto"
|
||||
@ -231,6 +315,364 @@
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@ -239,16 +681,16 @@
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.4"
|
||||
inkscape:cx="-2.9467106"
|
||||
inkscape:cy="214.52047"
|
||||
inkscape:zoom="1.722"
|
||||
inkscape:cx="-187.33422"
|
||||
inkscape:cy="155.10613"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:current-layer="background"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="949"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="823"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -283,17 +725,37 @@
|
||||
id="background"
|
||||
inkscape:label="#g8543"
|
||||
transform="matrix(0,-1,1,0,-8.719326,769.86218)">
|
||||
<rect
|
||||
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect2936"
|
||||
width="318.58304"
|
||||
height="43.012333"
|
||||
x="213.06563"
|
||||
y="367.78458"
|
||||
ry="3.1741481"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998" />
|
||||
<path
|
||||
sodipodi:nodetypes="sssssssss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect4025"
|
||||
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"
|
||||
style="fill:url(#linearGradient3162);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccccc"
|
||||
style="fill:#1a1a1a;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.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"
|
||||
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
|
||||
inkscape:label="#rect4388"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -301,52 +763,128 @@
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
ry="0.68289828"
|
||||
y="395.16541"
|
||||
x="250.30202"
|
||||
x="252.30202"
|
||||
height="9.2538376"
|
||||
width="260.53882"
|
||||
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
|
||||
style="fill:#332d2d;fill-opacity:1;stroke:none"
|
||||
style="fill:#332d2d;fill-opacity:1;stroke:none;display:inline"
|
||||
id="bargraph"
|
||||
width="260.53882"
|
||||
height="9.2538376"
|
||||
x="250.30202"
|
||||
x="252.302"
|
||||
y="395.16541"
|
||||
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" />
|
||||
<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
|
||||
inkscape:groupmode="layer"
|
||||
id="layer5"
|
||||
inkscape:label="Green Zone"
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:#04b629;fill-opacity:1;stroke:none;display:inline"
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="green"
|
||||
inkscape:label="#g4104"
|
||||
transform="translate(0,-2)">
|
||||
<rect
|
||||
transform="matrix(0,-1,1,0,0,0)"
|
||||
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="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="-153.97397"
|
||||
y="158.98152"
|
||||
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"
|
||||
transform="matrix(0,-1,1,0,0,0)" />
|
||||
inkscape:label="#rect4388"
|
||||
transform="scale(1,-1)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Yellow Zone"
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="yellow"
|
||||
inkscape:label="#g4159"
|
||||
transform="translate(0,-2)">
|
||||
<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"
|
||||
@ -355,21 +893,38 @@
|
||||
x="-153.97397"
|
||||
height="9.2538376"
|
||||
width="260.53882"
|
||||
id="yellow"
|
||||
style="fill:#f1b907;fill-opacity:1;stroke:none;display:inline"
|
||||
inkscape:label="#rect5741"
|
||||
transform="matrix(0,-1,1,0,0,0)" />
|
||||
id="rect3946-9-6"
|
||||
style="fill:url(#linearGradient4212);fill-opacity:1;stroke:none;display:inline" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Red zone"
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:#cf0e0e;fill-opacity:1;stroke:none;display:inline"
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="red"
|
||||
inkscape:label="#g4224"
|
||||
transform="translate(0,-2)">
|
||||
<rect
|
||||
transform="matrix(0,-1,1,0,0,0)"
|
||||
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="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"
|
||||
@ -378,40 +933,55 @@
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
transform="matrix(0,-1,1,0,0,0)" />
|
||||
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
|
||||
inkscape:groupmode="layer"
|
||||
id="layer6"
|
||||
inkscape:label="Indicator"
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#c2bfbf;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"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 149.75986,-115.1656 0,14.26841 12,-7.13421 -12,-7.1342 z"
|
||||
id="needle"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:label="#path5747" />
|
||||
inkscape:label="#path5747"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="Text"
|
||||
style="display:inline"
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<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"
|
||||
width="36.996838"
|
||||
height="12.626906"
|
||||
x="4.9244938"
|
||||
y="285.58621"
|
||||
transform="translate(129.62194,-129.52019)"
|
||||
x="132.54643"
|
||||
y="154.06602"
|
||||
inkscape:label="#rect2878" />
|
||||
<rect
|
||||
inkscape:label="#rect2878"
|
||||
y="170.06602"
|
||||
x="134.54643"
|
||||
x="132.54643"
|
||||
height="12.626906"
|
||||
width="36.996838"
|
||||
id="value"
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 34 KiB |
235
ground/openpilotgcs/share/openpilotgcs/dials/default/textonly.svg
Normal file → Executable file
@ -14,7 +14,7 @@
|
||||
height="80.827866"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="textonly.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
@ -480,19 +480,6 @@
|
||||
offset="1"
|
||||
id="stop5228-8" />
|
||||
</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
|
||||
id="linearGradient5226-1">
|
||||
<stop
|
||||
@ -949,6 +936,158 @@
|
||||
fx="29.77438"
|
||||
fy="7.0922189"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@ -961,12 +1100,12 @@
|
||||
inkscape:cx="56.191298"
|
||||
inkscape:cy="90.710362"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:current-layer="g4122"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="693"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="823"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -982,7 +1121,7 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
<dc:title />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Edouard Lafargue</dc:title>
|
||||
@ -1000,29 +1139,6 @@
|
||||
<g
|
||||
id="background"
|
||||
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
|
||||
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"
|
||||
@ -1034,6 +1150,39 @@
|
||||
id="tspan2987"
|
||||
x="30"
|
||||
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
|
||||
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 38 KiB |
135
ground/openpilotgcs/share/openpilotgcs/dials/deluxe/lineardial-horizontal.svg
Normal file → Executable file
@ -14,8 +14,8 @@
|
||||
height="70.597504"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.1 "
|
||||
sodipodi:docname="lineardial-horizontal.svg"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="lineardial-horizontal-old2.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
inkscape:export-ydpi="103.61"
|
||||
@ -25,15 +25,19 @@
|
||||
<linearGradient
|
||||
id="linearGradient4439">
|
||||
<stop
|
||||
style="stop-color:#1a1a1a;stop-opacity:1"
|
||||
style="stop-color:#666666;stop-opacity:0;"
|
||||
offset="0"
|
||||
id="stop4441" />
|
||||
<stop
|
||||
id="stop4443"
|
||||
offset="0.19742694"
|
||||
style="stop-color:#808080;stop-opacity:1" />
|
||||
offset="0.31684026"
|
||||
style="stop-color:#a3a3a3;stop-opacity:1;" />
|
||||
<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"
|
||||
id="stop4445" />
|
||||
</linearGradient>
|
||||
@ -57,15 +61,11 @@
|
||||
<stop
|
||||
id="stop4389"
|
||||
offset="0"
|
||||
style="stop-color:#4d4d4d;stop-opacity:1" />
|
||||
style="stop-color:#8a8a8a;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0.60976541"
|
||||
id="stop4391" />
|
||||
<stop
|
||||
id="stop4393"
|
||||
style="stop-color:#181818;stop-opacity:1;"
|
||||
offset="1"
|
||||
style="stop-color:#4d4d4d;stop-opacity:1" />
|
||||
id="stop4391" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4361">
|
||||
@ -237,15 +237,15 @@
|
||||
<stop
|
||||
id="stop3905"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1" />
|
||||
style="stop-color:#676767;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0.3220683"
|
||||
offset="0.43894145"
|
||||
id="stop3907" />
|
||||
<stop
|
||||
id="stop3909"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:1" />
|
||||
style="stop-color:#7d7d7d;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5375">
|
||||
@ -425,46 +425,34 @@
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5116">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5118" />
|
||||
<stop
|
||||
id="stop5124"
|
||||
offset="0.35911319"
|
||||
style="stop-color:#dcaf28;stop-opacity:1" />
|
||||
offset="0"
|
||||
style="stop-color:#ffc001;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
style="stop-color:#844700;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5120" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5106">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5108" />
|
||||
<stop
|
||||
id="stop5114"
|
||||
offset="0.36023793"
|
||||
offset="0"
|
||||
style="stop-color:#00a000;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
style="stop-color:#003d00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5110" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5096">
|
||||
<stop
|
||||
style="stop-color:#100000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5098" />
|
||||
<stop
|
||||
id="stop5104"
|
||||
offset="0.36453304"
|
||||
style="stop-color:#aa0000;stop-opacity:1" />
|
||||
offset="0"
|
||||
style="stop-color:#e60000;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#0c0000;stop-opacity:1"
|
||||
style="stop-color:#710000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5100" />
|
||||
</linearGradient>
|
||||
@ -687,7 +675,7 @@
|
||||
x2="87.074203"
|
||||
y2="168.83261"
|
||||
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
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5106"
|
||||
@ -697,7 +685,7 @@
|
||||
x2="86.644958"
|
||||
y2="173.46591"
|
||||
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
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5116"
|
||||
@ -707,7 +695,7 @@
|
||||
x2="86.547356"
|
||||
y2="168.82289"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0,1,-1,0,-11.23354,-270.8763)" />
|
||||
gradientTransform="matrix(0,1,-1.0055415,0,-10.459485,-270.8763)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5129"
|
||||
@ -932,7 +920,7 @@
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3899"
|
||||
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"
|
||||
y1="68.860146"
|
||||
x2="-150.75359"
|
||||
@ -1120,16 +1108,16 @@
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="3.1841238"
|
||||
inkscape:cx="140.38399"
|
||||
inkscape:zoom="5.5410688"
|
||||
inkscape:cx="55.238424"
|
||||
inkscape:cy="35.455778"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer5"
|
||||
inkscape:current-layer="background"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="706"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="957"
|
||||
inkscape:window-x="-5"
|
||||
inkscape:window-y="2"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -1163,8 +1151,7 @@
|
||||
inkscape:label="Dark background"
|
||||
id="g2932"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-368.2988,-507.08981)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-368.2988,-507.08981)">
|
||||
<g
|
||||
id="background"
|
||||
inkscape:label="#g4447">
|
||||
@ -1225,17 +1212,16 @@
|
||||
id="layer5"
|
||||
inkscape:label="Green Zone"
|
||||
style="display:inline"
|
||||
transform="translate(-140.85549,-141.35611)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-140.85549,-141.35611)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline"
|
||||
id="green"
|
||||
width="260.53882"
|
||||
height="32.20755"
|
||||
x="-411.77084"
|
||||
y="-184.00433"
|
||||
ry="2.3767958"
|
||||
width="261.80212"
|
||||
height="32.929432"
|
||||
x="-413.03415"
|
||||
y="-184.72621"
|
||||
ry="2.430068"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -1246,17 +1232,16 @@
|
||||
id="layer4"
|
||||
inkscape:label="Yellow Zone"
|
||||
style="display:none"
|
||||
transform="translate(-140.85549,-141.35611)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-140.85549,-141.35611)">
|
||||
<rect
|
||||
inkscape:export-ydpi="88.809998"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
ry="2.4231479"
|
||||
y="-184.63248"
|
||||
x="-411.45679"
|
||||
x="-412.90054"
|
||||
height="32.835663"
|
||||
width="260.53882"
|
||||
width="261.98257"
|
||||
id="yellow"
|
||||
style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline"
|
||||
inkscape:label="#rect5741"
|
||||
@ -1267,17 +1252,16 @@
|
||||
id="layer3"
|
||||
inkscape:label="Red zone"
|
||||
style="display:none"
|
||||
transform="translate(-140.85549,-141.35611)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-140.85549,-141.35611)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline"
|
||||
id="red"
|
||||
width="260.23901"
|
||||
height="32.519711"
|
||||
x="-411.38739"
|
||||
y="-184.35484"
|
||||
ry="2.399832"
|
||||
width="261.86325"
|
||||
height="32.880653"
|
||||
x="-413.01163"
|
||||
y="-184.71579"
|
||||
ry="2.4264681"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -1288,17 +1272,18 @@
|
||||
id="layer6"
|
||||
inkscape:label="Indicator"
|
||||
style="display:inline"
|
||||
transform="translate(-140.85549,-141.35611)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-140.85549,-141.35611)">
|
||||
<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"
|
||||
width="32.035065"
|
||||
height="6.0045304"
|
||||
x="152.63882"
|
||||
y="-157.12926"
|
||||
width="33.114704"
|
||||
height="5.0989962"
|
||||
x="151.5576"
|
||||
y="-156.22531"
|
||||
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
|
||||
inkscape:groupmode="layer"
|
||||
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
219
ground/openpilotgcs/share/openpilotgcs/dials/deluxe/lineardial-vertical.svg
Normal file → Executable file
@ -14,20 +14,31 @@
|
||||
height="322.58304"
|
||||
id="svg10068"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.1 "
|
||||
sodipodi:docname="lineardial-vertical.svg"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="lineardial-vertical-old2.svg"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\My Gauges\vbat-001.png"
|
||||
inkscape:export-xdpi="103.61"
|
||||
inkscape:export-ydpi="103.61"
|
||||
style="display:inline">
|
||||
<defs
|
||||
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
|
||||
id="linearGradient3903">
|
||||
<stop
|
||||
id="stop3905"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1" />
|
||||
style="stop-color:#656565;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0.39386007"
|
||||
@ -35,7 +46,7 @@
|
||||
<stop
|
||||
id="stop3909"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:1" />
|
||||
style="stop-color:#757575;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5375">
|
||||
@ -83,15 +94,19 @@
|
||||
<stop
|
||||
id="stop5348"
|
||||
offset="0"
|
||||
style="stop-color:#1a1a1a;stop-opacity:1" />
|
||||
style="stop-color:#9c9c9c;stop-opacity:0;" />
|
||||
<stop
|
||||
style="stop-color:#666666;stop-opacity:1"
|
||||
offset="0.35277387"
|
||||
id="stop5350" />
|
||||
id="stop3921"
|
||||
offset="0.359375"
|
||||
style="stop-color:#6c6c6c;stop-opacity:0.88793105;" />
|
||||
<stop
|
||||
style="stop-color:#5f5f5f;stop-opacity:0.62931037;"
|
||||
offset="0.62630206"
|
||||
id="stop3923" />
|
||||
<stop
|
||||
id="stop5352"
|
||||
offset="1"
|
||||
style="stop-color:#1a1a1a;stop-opacity:1" />
|
||||
style="stop-color:#9c9c9c;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5326">
|
||||
@ -215,46 +230,34 @@
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5116">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5118" />
|
||||
<stop
|
||||
id="stop5124"
|
||||
offset="0.37640449"
|
||||
style="stop-color:#dcaf28;stop-opacity:1" />
|
||||
offset="0"
|
||||
style="stop-color:#ffc001;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
style="stop-color:#844700;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5120" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5106">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5108" />
|
||||
<stop
|
||||
id="stop5114"
|
||||
offset="0.38184431"
|
||||
offset="0"
|
||||
style="stop-color:#00a000;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
style="stop-color:#003d00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5110" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5096">
|
||||
<stop
|
||||
style="stop-color:#100000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5098" />
|
||||
<stop
|
||||
id="stop5104"
|
||||
offset="0.39717463"
|
||||
style="stop-color:#aa0000;stop-opacity:1" />
|
||||
offset="0"
|
||||
style="stop-color:#e60000;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#0c0000;stop-opacity:1"
|
||||
style="stop-color:#710000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5100" />
|
||||
</linearGradient>
|
||||
@ -475,7 +478,8 @@
|
||||
y1="132.84332"
|
||||
x2="-58.661255"
|
||||
y2="169.46072"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0045664,0,0,0.98072534,3.8285685,3.8328979)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5106"
|
||||
@ -484,7 +488,8 @@
|
||||
y1="133.15433"
|
||||
x2="-38.946774"
|
||||
y2="168.58655"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0048708,0,0,1.0000284,3.816285,2.2385824)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5116"
|
||||
@ -493,7 +498,8 @@
|
||||
y1="133.16322"
|
||||
x2="-17.108463"
|
||||
y2="168.82289"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0057658,0,0,0.99502095,3.8176724,2.8357789)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5129"
|
||||
@ -711,7 +717,8 @@
|
||||
x1="-246.82069"
|
||||
y1="353.9455"
|
||||
x2="-247.44464"
|
||||
y2="412.00528" />
|
||||
y2="412.00528"
|
||||
gradientTransform="matrix(1,0,0,0.98663274,0,3.8538758)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5375"
|
||||
@ -727,11 +734,21 @@
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3899"
|
||||
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"
|
||||
y1="74.562233"
|
||||
x2="-135.50557"
|
||||
y2="74.562233" />
|
||||
x2="-136.75557"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@ -740,16 +757,16 @@
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.9843492"
|
||||
inkscape:cx="13.888309"
|
||||
inkscape:cy="302.67927"
|
||||
inkscape:zoom="7.87"
|
||||
inkscape:cx="0.68217946"
|
||||
inkscape:cy="151.28502"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer6"
|
||||
inkscape:current-layer="layer4"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="706"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="957"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
showguides="true"
|
||||
@ -765,7 +782,7 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Edouard Lafargue</dc:title>
|
||||
@ -779,8 +796,7 @@
|
||||
inkscape:label="Dark background"
|
||||
id="g2932"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-357.06525,-236.21351)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-357.06525,-236.21351)">
|
||||
<g
|
||||
id="background"
|
||||
inkscape:label="#g5354">
|
||||
@ -789,39 +805,39 @@
|
||||
style="fill:url(#linearGradient5344);fill-opacity:1;stroke:none"
|
||||
id="rect2936"
|
||||
width="318.58304"
|
||||
height="46.756046"
|
||||
height="46.131046"
|
||||
x="-556.79657"
|
||||
y="358.44128"
|
||||
ry="3.4504199"
|
||||
y="357.50378"
|
||||
ry="3.4042974"
|
||||
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:#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
|
||||
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="2.2944832"
|
||||
y="365.23175"
|
||||
x="-519.56018"
|
||||
height="31.09215"
|
||||
width="260.53882"
|
||||
ry="2.9537699"
|
||||
y="360.57819"
|
||||
x="-519.12665"
|
||||
height="40.026031"
|
||||
width="265.4249"
|
||||
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
|
||||
@ -829,17 +845,16 @@
|
||||
id="layer5"
|
||||
inkscape:label="Green Zone"
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:url(#linearGradient5112);fill-opacity:1;stroke:none;display:inline"
|
||||
id="green"
|
||||
width="260.53882"
|
||||
height="34.0919"
|
||||
x="-153.97397"
|
||||
y="134.02345"
|
||||
ry="2.5158536"
|
||||
width="261.80789"
|
||||
height="34.092869"
|
||||
x="-150.90765"
|
||||
y="136.26584"
|
||||
ry="2.5159254"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -849,18 +864,17 @@
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Yellow Zone"
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
inkscape:export-ydpi="88.809998"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
ry="2.5158532"
|
||||
y="134.02345"
|
||||
x="-153.97397"
|
||||
height="34.091896"
|
||||
width="260.53882"
|
||||
ry="2.5033269"
|
||||
y="136.19191"
|
||||
x="-151.04408"
|
||||
height="33.92215"
|
||||
width="262.04108"
|
||||
id="yellow"
|
||||
style="fill:url(#linearGradient5122);fill-opacity:1;stroke:none;display:inline"
|
||||
inkscape:label="#rect5741"
|
||||
@ -871,17 +885,16 @@
|
||||
id="layer3"
|
||||
inkscape:label="Red zone"
|
||||
style="display:none"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
inkscape:label="#rect5741"
|
||||
style="fill:url(#linearGradient5102);fill-opacity:1;stroke:none;display:inline"
|
||||
id="red"
|
||||
width="260.53882"
|
||||
height="34.589863"
|
||||
x="-154.0755"
|
||||
y="134.00487"
|
||||
ry="2.5526016"
|
||||
width="261.72849"
|
||||
height="33.923153"
|
||||
x="-150.95049"
|
||||
y="135.25487"
|
||||
ry="2.503401"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\W433\g9905.png"
|
||||
inkscape:export-xdpi="88.809998"
|
||||
inkscape:export-ydpi="88.809998"
|
||||
@ -894,35 +907,35 @@
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<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"
|
||||
width="33.162418"
|
||||
height="5.9393759"
|
||||
x="135.64999"
|
||||
y="-107.91632"
|
||||
inkscape:label="#rect5246" />
|
||||
width="34.173222"
|
||||
height="5.9349518"
|
||||
x="136.20108"
|
||||
y="-114.68695"
|
||||
inkscape:label="#rect5246"
|
||||
ry="2.4981377" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="Text"
|
||||
style="display:inline"
|
||||
transform="translate(-129.62194,129.52019)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(-129.62194,129.52019)">
|
||||
<rect
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none"
|
||||
id="field"
|
||||
width="33.853165"
|
||||
width="46.305515"
|
||||
height="12.626906"
|
||||
x="128.30692"
|
||||
x="129.09726"
|
||||
y="157.31393"
|
||||
inkscape:label="#rect2878" />
|
||||
<rect
|
||||
inkscape:label="#rect2878"
|
||||
y="170.91206"
|
||||
x="128.88902"
|
||||
x="129.9335"
|
||||
height="12.626906"
|
||||
width="32.851257"
|
||||
width="45.176544"
|
||||
id="value"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none" />
|
||||
</g>
|
||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
@ -172,7 +172,7 @@
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Qt Creator; Copyright Nokia Corporation</string>
|
||||
<string>OpenPilot GCS; Copyright OpenPilot</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>@ICON@</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
@ -182,7 +182,7 @@
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>@EXECUTABLE@</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.nokia.qtcreator</string>
|
||||
<string>org.openpilot.openpilotgcs</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.3.1</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
|
@ -239,6 +239,8 @@ int main(int argc, char **argv)
|
||||
setrlimit(RLIMIT_NOFILE, &rl);
|
||||
#endif
|
||||
|
||||
QApplication::setGraphicsSystem("raster");
|
||||
|
||||
SharedTools::QtSingleApplication app((QLatin1String(appNameC)), argc, argv);
|
||||
|
||||
QString locale = QLocale::system().name();
|
||||
|
@ -10,5 +10,6 @@
|
||||
<dependency name="UAVTalk" version="1.0.0"/>
|
||||
<dependency name="UAVObjectUtil" version="1.0.0"/>
|
||||
<dependency name="UAVSettingsImportExport" version="1.0.0"/>
|
||||
<dependency name="UAVObjectWidgetUtils" version="1.0.0"/>
|
||||
</dependencyList>
|
||||
</plugin>
|
||||
|
@ -30,9 +30,6 @@
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="configgadget.qrc">:/configgadget/images/coptercontrol.svg</pixmap>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
|
7
ground/openpilotgcs/src/plugins/config/config.pri
Normal 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)
|
@ -1,13 +1,8 @@
|
||||
TEMPLATE = lib
|
||||
TARGET = Config
|
||||
DEFINES += CONFIG_LIBRARY
|
||||
QT += svg
|
||||
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(config_dependencies.pri)
|
||||
INCLUDEPATH += ../../libs/eigen
|
||||
OTHER_FILES += Config.pluginspec
|
||||
HEADERS += configplugin.h \
|
||||
@ -19,25 +14,21 @@ HEADERS += configplugin.h \
|
||||
fancytabwidget.h \
|
||||
configinputwidget.h \
|
||||
configoutputwidget.h \
|
||||
configtaskwidget.h \
|
||||
configairframewidget.h \
|
||||
config_pro_hw_widget.h \
|
||||
config_cc_hw_widget.h \
|
||||
configccattitudewidget.h \
|
||||
mixercurvewidget.h \
|
||||
mixercurvepoint.h \
|
||||
mixercurveline.h \
|
||||
configccpmwidget.h \
|
||||
configstabilizationwidget.h \
|
||||
assertions.h \
|
||||
calibration.h \
|
||||
defaultattitudewidget.h \
|
||||
smartsavebutton.h \
|
||||
defaulthwsettingswidget.h \
|
||||
inputchannelform.h \
|
||||
configcamerastabilizationwidget.h \
|
||||
outputchannelform.h \
|
||||
configrevowidget.h
|
||||
configrevowidget.h \
|
||||
config_global.h
|
||||
SOURCES += configplugin.cpp \
|
||||
configgadgetconfiguration.cpp \
|
||||
configgadgetwidget.cpp \
|
||||
@ -45,16 +36,12 @@ SOURCES += configplugin.cpp \
|
||||
configgadgetoptionspage.cpp \
|
||||
configgadget.cpp \
|
||||
fancytabwidget.cpp \
|
||||
configtaskwidget.cpp \
|
||||
configinputwidget.cpp \
|
||||
configoutputwidget.cpp \
|
||||
configairframewidget.cpp \
|
||||
config_pro_hw_widget.cpp \
|
||||
config_cc_hw_widget.cpp \
|
||||
configccattitudewidget.cpp \
|
||||
mixercurvewidget.cpp \
|
||||
mixercurvepoint.cpp \
|
||||
mixercurveline.cpp \
|
||||
configccpmwidget.cpp \
|
||||
configstabilizationwidget.cpp \
|
||||
twostep.cpp \
|
||||
@ -62,7 +49,6 @@ SOURCES += configplugin.cpp \
|
||||
gyro-calibration.cpp \
|
||||
alignment-calibration.cpp \
|
||||
defaultattitudewidget.cpp \
|
||||
smartsavebutton.cpp \
|
||||
defaulthwsettingswidget.cpp \
|
||||
inputchannelform.cpp \
|
||||
configcamerastabilizationwidget.cpp \
|
||||
|
@ -40,7 +40,10 @@ ConfigCCHWWidget::ConfigCCHWWidget(QWidget *parent) : ConfigTaskWidget(parent)
|
||||
{
|
||||
m_telemetry = new Ui_CC_HW_Widget();
|
||||
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_MainPort",m_telemetry->cbTele);
|
||||
addUAVObjectToWidgetRelation("HwSettings","CC_RcvrPort",m_telemetry->cbRcvr);
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGCCHWWIDGET_H
|
||||
|
||||
#include "ui_cc_hw_settings.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
@ -50,6 +50,7 @@ private slots:
|
||||
|
||||
private:
|
||||
Ui_CC_HW_Widget *m_telemetry;
|
||||
QSvgRenderer *m_renderer;
|
||||
};
|
||||
|
||||
#endif // CONFIGCCHWWIDGET_H
|
||||
|
@ -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)
|
@ -1,11 +1,14 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file ahrs_bl.h
|
||||
* @file config_global.h
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* @brief Main AHRS_BL header.
|
||||
* @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
|
||||
@ -23,30 +26,16 @@
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef AHRS_BL_H
|
||||
#define AHRS_BL_H
|
||||
#ifndef CONFIG_GLOBAL_H
|
||||
#define CONFIG_GLOBAL_H
|
||||
|
||||
/* PIOS Includes */
|
||||
#include <pios.h>
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
/** Start programming
|
||||
returns: true if FLASH erased and ready to program
|
||||
*/
|
||||
bool
|
||||
StartProgramming(void);
|
||||
#if defined(CONFIG_LIBRARY)
|
||||
# define CONFIG_EXPORT Q_DECL_EXPORT
|
||||
#else
|
||||
# define CONFIG_EXPORT Q_DECL_IMPORT
|
||||
#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
|
||||
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 */
|
||||
#endif // CONFIG_GLOBAL_H
|
@ -39,7 +39,7 @@ ConfigProHWWidget::ConfigProHWWidget(QWidget *parent) : ConfigTaskWidget(parent)
|
||||
m_telemetry = new Ui_PRO_HW_Widget();
|
||||
m_telemetry->setupUi(this);
|
||||
|
||||
setupButtons(m_telemetry->saveTelemetryToRAM,m_telemetry->saveTelemetryToSD);
|
||||
addApplySaveButtons(m_telemetry->saveTelemetryToRAM,m_telemetry->saveTelemetryToSD);
|
||||
addUAVObjectToWidgetRelation("HwSettings","TelemetrySpeed",m_telemetry->telemetrySpeed);
|
||||
enableControls(false);
|
||||
populateWidgets();
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGPROHWWIDGET_H
|
||||
|
||||
#include "ui_pro_hw_settings.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
|
@ -95,7 +95,7 @@ ConfigAirframeWidget::ConfigAirframeWidget(QWidget *parent) : ConfigTaskWidget(p
|
||||
m_aircraft = new Ui_AircraftWidget();
|
||||
m_aircraft->setupUi(this);
|
||||
|
||||
setupButtons(m_aircraft->saveAircraftToRAM,m_aircraft->saveAircraftToSD);
|
||||
addApplySaveButtons(m_aircraft->saveAircraftToRAM,m_aircraft->saveAircraftToSD);
|
||||
|
||||
addUAVObject("SystemSettings");
|
||||
addUAVObject("MixerSettings");
|
||||
@ -2179,7 +2179,6 @@ void ConfigAirframeWidget::addToDirtyMonitor()
|
||||
addWidget(m_aircraft->elevonSlider1);
|
||||
addWidget(m_aircraft->elevonSlider2);
|
||||
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->ccpmEngineChannel);
|
||||
addWidget(m_aircraft->widget_3->m_ccpm->ccpmServoWChannel);
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGAIRFRAMEWIDGET_H
|
||||
|
||||
#include "ui_airframe.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGCAMERASTABILIZATIONWIDGET_H
|
||||
|
||||
#include "ui_camerastabilization.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
|
@ -44,7 +44,7 @@ ConfigCCAttitudeWidget::ConfigCCAttitudeWidget(QWidget *parent) :
|
||||
connect(ui->zeroBias,SIGNAL(clicked()),this,SLOT(startAccelCalibration()));
|
||||
|
||||
|
||||
setupButtons(ui->applyButton,ui->saveButton);
|
||||
addApplySaveButtons(ui->applyButton,ui->saveButton);
|
||||
addUAVObject("AttitudeSettings");
|
||||
|
||||
// Connect the help button
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CCATTITUDEWIDGET_H
|
||||
|
||||
#include "ui_ccattitude.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGccpmWIDGET_H
|
||||
|
||||
#include "ui_ccpm.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGGADGET_H
|
||||
|
||||
#include <coreplugin/iuavgadget.h>
|
||||
#include "configgadgetwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
|
||||
class IUAVGadget;
|
||||
//class QList<int>;
|
||||
@ -46,7 +46,7 @@ public:
|
||||
ConfigGadget(QString classId, ConfigGadgetWidget *widget, QWidget *parent = 0);
|
||||
~ConfigGadget();
|
||||
|
||||
QWidget *widget() { return m_widget; }
|
||||
QWidget *widget() { return (QWidget*)m_widget; }
|
||||
void loadConfiguration(IUAVGadgetConfiguration* config);
|
||||
|
||||
private:
|
||||
|
@ -17,5 +17,6 @@
|
||||
<file>images/gyroscope.png</file>
|
||||
<file>images/TX.svg</file>
|
||||
<file>images/camera.png</file>
|
||||
<file>images/TX2.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -40,7 +40,7 @@
|
||||
#include <QMessageBox>
|
||||
//#include "fancytabwidget.h"
|
||||
#include "utils/mytabbedstackwidget.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
|
||||
class ConfigGadgetWidget: public QWidget
|
||||
{
|
||||
|
@ -41,8 +41,8 @@
|
||||
#include <utils/stylehelper.h>
|
||||
#include <QMessageBox>
|
||||
|
||||
#define ACCESS_MIN_MOVE -6
|
||||
#define ACCESS_MAX_MOVE 6
|
||||
#define ACCESS_MIN_MOVE -3
|
||||
#define ACCESS_MAX_MOVE 3
|
||||
#define STICK_MIN_MOVE -8
|
||||
#define STICK_MAX_MOVE 8
|
||||
|
||||
@ -54,15 +54,15 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent)
|
||||
m_config = new Ui_InputWidget();
|
||||
m_config->setupUi(this);
|
||||
|
||||
setupButtons(m_config->saveRCInputToRAM,m_config->saveRCInputToSD);
|
||||
addApplySaveButtons(m_config->saveRCInputToRAM,m_config->saveRCInputToSD);
|
||||
|
||||
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);
|
||||
inputChannelForm * inp=new inputChannelForm(this,index==0);
|
||||
m_config->channelSettings->layout()->addWidget(inp);
|
||||
inp->ui->channelName->setText(name);
|
||||
inp->setName(name);
|
||||
addUAVObjectToWidgetRelation("ManualControlSettings","ChannelGroups",inp->ui->channelGroup,index);
|
||||
addUAVObjectToWidgetRelation("ManualControlSettings","ChannelNumber",inp->ui->channelNumber,index);
|
||||
addUAVObjectToWidgetRelation("ManualControlSettings","ChannelMin",inp->ui->channelMin,index);
|
||||
@ -108,7 +108,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent)
|
||||
m_renderer = new QSvgRenderer();
|
||||
QGraphicsScene *l_scene = m_config->graphicsView->scene();
|
||||
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.
|
||||
|
||||
@ -401,6 +401,7 @@ void ConfigInputWidget::wizardSetUpStep(enum wizardSteps step)
|
||||
case wizardChooseMode:
|
||||
{
|
||||
m_config->graphicsView->setVisible(true);
|
||||
m_config->graphicsView->fitInView(m_txBackground, Qt::KeepAspectRatio );
|
||||
setTxMovement(nothing);
|
||||
m_config->wzText->setText(tr("Please choose your transmiter type.\n"
|
||||
"Mode 1 means your throttle stick is on the right\n"
|
||||
@ -718,7 +719,7 @@ void ConfigInputWidget::identifyControls()
|
||||
m_config->wzText->clear();
|
||||
setTxMovement(nothing);
|
||||
|
||||
QTimer::singleShot(500, this, SLOT(wzNext()));
|
||||
QTimer::singleShot(2500, this, SLOT(wzNext()));
|
||||
}
|
||||
|
||||
void ConfigInputWidget::identifyLimits()
|
||||
@ -1096,7 +1097,7 @@ void ConfigInputWidget::invertControls()
|
||||
QCheckBox * cb=qobject_cast<QCheckBox *>(wd);
|
||||
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])) ||
|
||||
(!cb->isChecked() && (manualSettingsData.ChannelMax[index]<manualSettingsData.ChannelMin[index])))
|
||||
{
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGINPUTWIDGET_H
|
||||
|
||||
#include "ui_input.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
|
@ -50,13 +50,13 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren
|
||||
m_config->setupUi(this);
|
||||
|
||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||
setupButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD);
|
||||
addApplySaveButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD);
|
||||
addUAVObject("ActuatorSettings");
|
||||
|
||||
UAVSettingsImportExportFactory * importexportplugin = pm->getObject<UAVSettingsImportExportFactory>();
|
||||
connect(importexportplugin,SIGNAL(importAboutToBegin()),this,SLOT(stopTests()));
|
||||
|
||||
setupButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD);
|
||||
addApplySaveButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD);
|
||||
addUAVObject("ActuatorSettings");
|
||||
|
||||
// NOTE: we have channel indices from 0 to 9, but the convention for OP is Channel 1 to Channel 10.
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGOUTPUTWIDGET_H
|
||||
|
||||
#include "ui_output.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
|
@ -29,6 +29,8 @@
|
||||
|
||||
#include "ui_revosensors.h"
|
||||
#include "configtaskwidget.h"
|
||||
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
|
@ -34,286 +34,110 @@
|
||||
#include <QtGui/QPushButton>
|
||||
#include <QDesktopServices>
|
||||
#include <QUrl>
|
||||
#include <QList>
|
||||
|
||||
ConfigStabilizationWidget::ConfigStabilizationWidget(QWidget *parent) : ConfigTaskWidget(parent)
|
||||
{
|
||||
stabSettings = StabilizationSettings::GetInstance(getObjectManager());
|
||||
|
||||
m_stabilization = new Ui_StabilizationWidget();
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
connect(this,SIGNAL(widgetContentsChanged(QWidget*)),this,SLOT(processLinkedWidgets(QWidget*)));
|
||||
}
|
||||
|
||||
|
||||
ConfigStabilizationWidget::~ConfigStabilizationWidget()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
void ConfigStabilizationWidget::updateRateRollKP(double val)
|
||||
void ConfigStabilizationWidget::realtimeUpdatesSlot(int value)
|
||||
{
|
||||
if (m_stabilization->linkRateRP->isChecked()) {
|
||||
m_stabilization->ratePitchKp->setValue(val);
|
||||
}
|
||||
m_stabilization->realTimeUpdates_6->setCheckState((Qt::CheckState)value);
|
||||
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::updateRateRollKI(double val)
|
||||
void ConfigStabilizationWidget::linkCheckBoxes(int value)
|
||||
{
|
||||
if (m_stabilization->linkRateRP->isChecked()) {
|
||||
m_stabilization->ratePitchKi->setValue(val);
|
||||
}
|
||||
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::updateRateRollILimit(double val)
|
||||
void ConfigStabilizationWidget::processLinkedWidgets(QWidget * widget)
|
||||
{
|
||||
if (m_stabilization->linkRateRP->isChecked()) {
|
||||
m_stabilization->ratePitchILimit->setValue(val);
|
||||
if(m_stabilization->checkBox_7->checkState()==Qt::Checked)
|
||||
{
|
||||
if(widget== m_stabilization->RateRollKp_2)
|
||||
{
|
||||
m_stabilization->RatePitchKp->setValue(m_stabilization->RateRollKp_2->value());
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigStabilizationWidget::updateRatePitchKP(double val)
|
||||
{
|
||||
if (m_stabilization->linkRateRP->isChecked()) {
|
||||
m_stabilization->rateRollKp->setValue(val);
|
||||
else if(widget== m_stabilization->RateRollKi_2)
|
||||
{
|
||||
m_stabilization->RatePitchKi->setValue(m_stabilization->RateRollKi_2->value());
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigStabilizationWidget::updateRatePitchKI(double val)
|
||||
{
|
||||
if (m_stabilization->linkRateRP->isChecked()) {
|
||||
m_stabilization->rateRollKi->setValue(val);
|
||||
else if(widget== m_stabilization->RateRollILimit_2)
|
||||
{
|
||||
m_stabilization->RatePitchILimit->setValue(m_stabilization->RateRollILimit_2->value());
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigStabilizationWidget::updateRatePitchILimit(double val)
|
||||
{
|
||||
if (m_stabilization->linkRateRP->isChecked()) {
|
||||
m_stabilization->rateRollILimit->setValue(val);
|
||||
else if(widget== m_stabilization->RatePitchKp)
|
||||
{
|
||||
m_stabilization->RateRollKp_2->setValue(m_stabilization->RatePitchKp->value());
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigStabilizationWidget::updateRollKP(double val)
|
||||
{
|
||||
if (m_stabilization->linkAttitudeRP->isChecked()) {
|
||||
m_stabilization->pitchKp->setValue(val);
|
||||
else if(widget== m_stabilization->RatePitchKi)
|
||||
{
|
||||
m_stabilization->RateRollKi_2->setValue(m_stabilization->RatePitchKi->value());
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigStabilizationWidget::updateRollKI(double val)
|
||||
{
|
||||
if (m_stabilization->linkAttitudeRP->isChecked()) {
|
||||
m_stabilization->pitchKi->setValue(val);
|
||||
else if(widget== m_stabilization->RatePitchILimit)
|
||||
{
|
||||
m_stabilization->RateRollILimit_2->setValue(m_stabilization->RatePitchILimit->value());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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);
|
||||
if(m_stabilization->checkBox_8->checkState()==Qt::Checked)
|
||||
{
|
||||
if(widget== m_stabilization->AttitudeRollKp)
|
||||
{
|
||||
m_stabilization->AttitudePitchKp_2->setValue(m_stabilization->AttitudeRollKp->value());
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigStabilizationWidget::updatePitchKI(double val)
|
||||
{
|
||||
if (m_stabilization->linkAttitudeRP->isChecked()) {
|
||||
m_stabilization->rollKi->setValue(val);
|
||||
else if(widget== m_stabilization->AttitudeRollKi)
|
||||
{
|
||||
m_stabilization->AttitudePitchKi_2->setValue(m_stabilization->AttitudeRollKi->value());
|
||||
}
|
||||
else if(widget== m_stabilization->AttitudeRollILimit)
|
||||
{
|
||||
m_stabilization->AttitudePitchILimit_2->setValue(m_stabilization->AttitudeRollILimit->value());
|
||||
}
|
||||
else if(widget== m_stabilization->AttitudePitchKp_2)
|
||||
{
|
||||
m_stabilization->AttitudeRollKp->setValue(m_stabilization->AttitudePitchKp_2->value());
|
||||
}
|
||||
else if(widget== m_stabilization->AttitudePitchKi_2)
|
||||
{
|
||||
m_stabilization->AttitudeRollKi->setValue(m_stabilization->AttitudePitchKi_2->value());
|
||||
}
|
||||
else if(widget== m_stabilization->AttitudePitchILimit_2)
|
||||
{
|
||||
m_stabilization->AttitudeRollILimit->setValue(m_stabilization->AttitudePitchILimit_2->value());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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) );
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
#define CONFIGSTABILIZATIONWIDGET_H
|
||||
|
||||
#include "ui_stabilization.h"
|
||||
#include "configtaskwidget.h"
|
||||
#include "../uavobjectwidgetutils/configtaskwidget.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
@ -47,30 +47,11 @@ public:
|
||||
|
||||
private:
|
||||
Ui_StabilizationWidget *m_stabilization;
|
||||
StabilizationSettings* stabSettings;
|
||||
QTimer updateTimer;
|
||||
|
||||
QTimer * realtimeUpdates;
|
||||
private slots:
|
||||
virtual void refreshWidgetsValues();
|
||||
void updateObjectsFromWidgets();
|
||||
void realtimeUpdateToggle(bool);
|
||||
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);
|
||||
void realtimeUpdatesSlot(int);
|
||||
void linkCheckBoxes(int value);
|
||||
void processLinkedWidgets(QWidget*);
|
||||
};
|
||||
|
||||
#endif // ConfigStabilizationWidget_H
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|