Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorWalter Bender <walter@sugarlabs.org>2013-05-16 22:05:58 (GMT)
committer Walter Bender <walter@sugarlabs.org>2013-06-11 20:04:54 (GMT)
commitda170b77bd8cced61aee121a1eba49c01964e0c0 (patch)
tree22e0843bdd56518b3eddf27843a3c327686f174b /plugins
parent80b28ac38aa846ce43335e1eafe1f14fd0f480bf (diff)
oz plugins
Diffstat (limited to 'plugins')
-rw-r--r--plugins/currency/__init__.py0
-rw-r--r--plugins/currency/currency.py83
-rw-r--r--plugins/currency/icons/currencyoff.svg45
-rw-r--r--plugins/currency/icons/currencyon.svg121
-rw-r--r--plugins/currency/images/1 dollaroff.svg298
-rw-r--r--plugins/currency/images/1 dollarsmall.svg54
-rw-r--r--plugins/currency/images/10 centsoff.svg292
-rw-r--r--plugins/currency/images/10 centssmall.svg54
-rw-r--r--plugins/currency/images/10 dollarsoff.svg104
-rw-r--r--plugins/currency/images/10 dollarssmall.svg55
-rw-r--r--plugins/currency/images/100 dollarsoff.svg54
-rw-r--r--plugins/currency/images/100 dollarssmall.svg105
-rw-r--r--plugins/currency/images/2 dollarsoff.svg279
-rw-r--r--plugins/currency/images/2 dollarssmall.svg54
-rw-r--r--plugins/currency/images/20 centsoff.svg257
-rw-r--r--plugins/currency/images/20 centssmall.svg54
-rw-r--r--plugins/currency/images/20 dollarsoff.svg105
-rw-r--r--plugins/currency/images/20 dollarssmall.svg55
-rw-r--r--plugins/currency/images/5 centsoff.svg288
-rw-r--r--plugins/currency/images/5 centssmall.svg54
-rw-r--r--plugins/currency/images/5 dollarsoff.svg95
-rw-r--r--plugins/currency/images/5 dollarssmall.svg55
-rw-r--r--plugins/currency/images/50 centsoff.svg54
-rw-r--r--plugins/currency/images/50 centssmall.svg54
-rw-r--r--plugins/currency/images/50 dollarsoff.svg54
-rw-r--r--plugins/currency/images/50 dollarssmall.svg105
-rw-r--r--plugins/wedo_plugin/WeDoMore.py183
-rw-r--r--plugins/wedo_plugin/__init__.py0
-rw-r--r--plugins/wedo_plugin/icons/WeDooff.svg71
-rw-r--r--plugins/wedo_plugin/icons/WeDoon.svg71
-rw-r--r--plugins/wedo_plugin/usb/__init__.py92
-rw-r--r--plugins/wedo_plugin/usb/_debug.py77
-rw-r--r--plugins/wedo_plugin/usb/_interop.py135
-rw-r--r--plugins/wedo_plugin/usb/backend/__init__.py368
-rw-r--r--plugins/wedo_plugin/usb/backend/libusb01.py582
-rw-r--r--plugins/wedo_plugin/usb/backend/libusb10.py654
-rw-r--r--plugins/wedo_plugin/usb/backend/openusb.py707
-rw-r--r--plugins/wedo_plugin/usb/control.py252
-rw-r--r--plugins/wedo_plugin/usb/core.py856
-rw-r--r--plugins/wedo_plugin/usb/legacy.py334
-rw-r--r--plugins/wedo_plugin/usb/util.py260
-rw-r--r--plugins/wedo_plugin/wedo_plugin.py302
42 files changed, 7772 insertions, 0 deletions
diff --git a/plugins/currency/__init__.py b/plugins/currency/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/currency/__init__.py
diff --git a/plugins/currency/currency.py b/plugins/currency/currency.py
new file mode 100644
index 0000000..4d9a7ed
--- /dev/null
+++ b/plugins/currency/currency.py
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+#Copyright (c) 2011, Walter Bender
+#
+# 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 2 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import gtk
+from time import time
+import os.path
+from gettext import gettext as _
+
+try:
+ from sugar.datastore import datastore
+except ImportError:
+ pass
+
+from plugins.plugin import Plugin
+from TurtleArt.tapalette import make_palette, define_logo_function
+from TurtleArt.talogo import primitive_dictionary, logoerror, \
+ media_blocks_dictionary
+from TurtleArt.taconstants import MEDIA_SHAPES, NO_IMPORT, SKIN_PATHS, \
+ EXPAND_SKIN, BLOCKS_WITH_SKIN
+
+class Currency(Plugin):
+ """ a class for defining palette of money """
+
+ def __init__(self, parent):
+ self.tw = parent
+
+ def setup(self):
+ self.heap = self.tw.lc.heap
+ self.keyboard = self.tw.lc.keyboard
+ self.title_height = int((self.tw.canvas.height / 20) * self.tw.scale)
+
+ SKIN_PATHS.append('plugins/currency/images')
+
+ self._currency_palette()
+
+ def _currency_palette(self):
+ palette = make_palette(
+ 'currency', colors=["#FFFFFF", "#A0A0A0"],
+ help_string=_('Palette of Australian currencies'))
+
+ self._make_constant(palette, '5 cents', 0.05, expand=(0, 10))
+ self._make_constant(palette, '10 cents', 0.1, expand=(0, 10))
+ self._make_constant(palette, '20 cents', 0.2, expand=(0, 10))
+ self._make_constant(palette, '50 cents', 0.5, expand=(0, 10))
+ self._make_constant(palette, '1 dollar', 1, expand=(0, 10))
+ self._make_constant(palette, '2 dollars', 2, expand=(0, 10))
+
+ self._make_constant(palette, '5 dollars', 5, expand=(60, 20))
+ self._make_constant(palette, '10 dollars', 10, expand=(60, 20))
+ self._make_constant(palette, '20 dollars', 20, expand=(60, 20))
+ self._make_constant(palette, '50 dollars', 50, expand=(60, 20))
+ self._make_constant(palette, '100 dollars', 100, expand=(60, 20))
+
+ def _make_constant(self, palette, block_name, constant, expand=(0, 0)):
+ """ Factory for constant blocks """
+ palette.add_block(block_name,
+ style='box-style-media',
+ label='',
+ default=constant,
+ prim_name=block_name,
+ help_string=_(str(constant)))
+ BLOCKS_WITH_SKIN.append(block_name)
+ NO_IMPORT.append(block_name)
+ MEDIA_SHAPES.append(block_name + 'off')
+ MEDIA_SHAPES.append(block_name + 'small')
+ if expand > 0:
+ EXPAND_SKIN[block_name] = expand
+ self.tw.lc.def_prim(block_name, 0, lambda self: constant)
+
diff --git a/plugins/currency/icons/currencyoff.svg b/plugins/currency/icons/currencyoff.svg
new file mode 100644
index 0000000..7a4825a
--- /dev/null
+++ b/plugins/currency/icons/currencyoff.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.0"
+ width="55"
+ height="55"
+ id="svg2">
+ <metadata
+ id="metadata10">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs8" />
+ <rect
+ width="55"
+ height="55"
+ x="0"
+ y="0"
+ id="rect3269"
+ style="fill:#282828;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <text
+ x="10.554688"
+ y="42.207031"
+ id="text2993"
+ xml:space="preserve"
+ style="font-size:11px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"><tspan
+ x="10.554688"
+ y="42.207031"
+ id="tspan2995"
+ style="font-size:48px;font-weight:bold;fill:#ffffff;-inkscape-font-specification:Sans Bold">$</tspan></text>
+</svg>
diff --git a/plugins/currency/icons/currencyon.svg b/plugins/currency/icons/currencyon.svg
new file mode 100644
index 0000000..9bcba86
--- /dev/null
+++ b/plugins/currency/icons/currencyon.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="55"
+ height="55"
+ id="svg2">
+ <metadata
+ id="metadata20">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs5">
+ <linearGradient
+ x1="0"
+ y1="22"
+ x2="74"
+ y2="22"
+ id="linearGradient2431"
+ xlink:href="#linearGradient3166"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3333,0,0,0.3333,27.031478,32.193732)" />
+ <linearGradient
+ x1="0"
+ y1="22"
+ x2="74"
+ y2="22"
+ id="linearGradient2428"
+ xlink:href="#linearGradient3166"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3333,0,0,0.3333,27.031478,45.064925)" />
+ <linearGradient
+ x1="0"
+ y1="22"
+ x2="74"
+ y2="22"
+ id="linearGradient3172"
+ xlink:href="#linearGradient3166"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3166">
+ <stop
+ id="stop3168"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3170"
+ style="stop-color:#ffff00;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="22"
+ x2="74"
+ y2="22"
+ id="linearGradient2557"
+ xlink:href="#linearGradient3166"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3333,0,0,0.3333,9.2560985,9.9123239)" />
+ <linearGradient
+ x1="0"
+ y1="22"
+ x2="74"
+ y2="22"
+ id="linearGradient2561"
+ xlink:href="#linearGradient3166"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3333,0,0,0.3333,8.962951,22.783517)" />
+ <linearGradient
+ x1="0"
+ y1="22"
+ x2="74"
+ y2="22"
+ id="linearGradient2461"
+ xlink:href="#linearGradient3166"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3333,0,0,0.3333,27.031478,32.193732)" />
+ <linearGradient
+ x1="0"
+ y1="22"
+ x2="74"
+ y2="22"
+ id="linearGradient2463"
+ xlink:href="#linearGradient3166"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3333,0,0,0.3333,27.031478,45.064925)" />
+ </defs>
+ <rect
+ width="55"
+ height="55"
+ rx="0"
+ x="0"
+ y="0"
+ id="rect2839"
+ style="fill:#ffd200;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <text
+ x="10.554688"
+ y="42.207031"
+ id="text2993"
+ xml:space="preserve"
+ style="font-size:11px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"><tspan
+ x="10.554688"
+ y="42.207031"
+ id="tspan2995"
+ style="font-size:48px;font-weight:bold;fill:#ffffff;-inkscape-font-specification:Sans Bold">$</tspan></text>
+</svg>
diff --git a/plugins/currency/images/1 dollaroff.svg b/plugins/currency/images/1 dollaroff.svg
new file mode 100644
index 0000000..1299d26
--- /dev/null
+++ b/plugins/currency/images/1 dollaroff.svg
@@ -0,0 +1,298 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="70"
+ version="1.1"
+ viewBox="0 0 71 70"
+ width="71"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="1 dollaroff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-108.06607"
+ inkscape:cy="112"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,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
+"
+ height="70"
+ width="71" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/1 dollarsmall.svg b/plugins/currency/images/1 dollarsmall.svg
new file mode 100644
index 0000000..4f887a0
--- /dev/null
+++ b/plugins/currency/images/1 dollarsmall.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="40"
+ version="1.1"
+ viewBox="0 0 40.57143 40"
+ width="40.57143"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="1 dollarsmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-115.56607"
+ inkscape:cy="107"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,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 "
+ height="40"
+ width="40.57143" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/10 centsoff.svg b/plugins/currency/images/10 centsoff.svg
new file mode 100644
index 0000000..821f6f0
--- /dev/null
+++ b/plugins/currency/images/10 centsoff.svg
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="70"
+ version="1.1"
+ viewBox="0 0 71 70"
+ width="71"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="10 centsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-123.06607"
+ inkscape:cy="99"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,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
+"
+ height="70"
+ width="71" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/10 centssmall.svg b/plugins/currency/images/10 centssmall.svg
new file mode 100644
index 0000000..825d0ef
--- /dev/null
+++ b/plugins/currency/images/10 centssmall.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="40"
+ version="1.1"
+ viewBox="0 0 40.57143 40"
+ width="40.57143"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="10 centssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-365.56607"
+ inkscape:cy="12"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,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 "
+ height="40"
+ width="40.57143" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/10 dollarsoff.svg b/plugins/currency/images/10 dollarsoff.svg
new file mode 100644
index 0000000..73d94e6
--- /dev/null
+++ b/plugins/currency/images/10 dollarsoff.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="55"
+ version="1.1"
+ viewBox="0 0 117 55"
+ width="117"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="10 dollarsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-67.723576"
+ inkscape:cy="87.999997"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="-8.0163699e-07"
+ x="2.2370994e-14"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
+HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
+MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AHUDASIA
+AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
+AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
+ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
+p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
+AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
+BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
+U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
+uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCW7uRu
+dBIN6oXAY9cevI45Gen4VWt0ttUFxNcxlmhIjASTryeO2DnjBq/dW6pZSBlDOAW54+b16j+Yqnp0
+YGmXAO1svxyQOg9OfyAx6DGB2Xs9DmsmtSL+zoBHu+yOsmOFMvBz6HPTn0z7VdiiSMkC2nMePv5H
+X6Zz3/nWeVlhk+VFdm7q8iY56554/wABWlD5Una4Ix0Vn+nY1hioqUbS1Ekk9AnVFRW8tjuOMZx/
+npUZcpykfB65bnqf8auXyolpG4RzggY5Jxg9utYx1Oy3FJLlYJB/DIjZH4YrghhotXsapIe99Ibq
+OOOHK5Cu+/gH0x3pl5eyxyGNI1du2X25/TH6ipYpNO8uNItRtyV5y7HLHuScVfSG2uc+U9vOT/zz
+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
+U4pK5Ase8nPI7UUUVtcwsf/Z
+"
+ height="55"
+ width="117" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/10 dollarssmall.svg b/plugins/currency/images/10 dollarssmall.svg
new file mode 100644
index 0000000..f2784ea
--- /dev/null
+++ b/plugins/currency/images/10 dollarssmall.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="25.8547"
+ version="1.1"
+ viewBox="0 0 55 25.8547"
+ width="55"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="10 dollarssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="2"
+ inkscape:cx="41.363688"
+ inkscape:cy="21.113258"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+<image
+ y="0"
+ x="0"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AHUDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCW7uRu dBIN6oXAY9cevI45Gen4VWt0ttUFxNcxlmhIjASTryeO2DnjBq/dW6pZSBlDOAW54+b16j+Yqnp0 YGmXAO1svxyQOg9OfyAx6DGB2Xs9DmsmtSL+zoBHu+yOsmOFMvBz6HPTn0z7VdiiSMkC2nMePv5H X6Zz3/nWeVlhk+VFdm7q8iY56554/wABWlD5Una4Ix0Vn+nY1hioqUbS1Ekk9AnVFRW8tjuOMZx/ npUZcpykfB65bnqf8auXyolpG4RzggY5Jxg9utYx1Oy3FJLlYJB/DIjZH4YrghhotXsapIe99Ibq OOOHK5Cu+/gH0x3pl5eyxyGNI1du2X25/TH6ipYpNO8uNItRtyV5y7HLHuScVfSG2uc+U9vOT/zz kVv65rqjhqa9SXBM5abU54ZCj2rI4OcO+D/KrtjNJfxswVUwcFS24npgD35rVudMhlTyZo+M/Lng p9PSs/S7Y2UbsrFyJCDgcEDIOPXoevvxgV1wdtCHBJaGnpjXdvDPcIzIhKrllzz9QMd/5eozVm8Y SQ6vBp3n75XcJIVVQIyTxyetbaNG1kzyea8rkZ5VUZsYzzxyGznAOWHUjjh/EKLp+saZJGysizs5 cDO7BXknHPAH4Ck9dSlpZHZSaxcW52tMZWPTaFA7c9OnX/61VZLy5vFUTvuC+wFcnZaXN4kzqWoM 7ROSIoIzhVA4xUxt5PDWoW/lySGwuX8po5Dny29v8/0qlZa2Jd3pc6pRgYxk0VW853JESF8ddvQU UwsPu1do3WM4yDgYz+GOv5EU3TWEto8R8xArbeQcjpjnGSOnXt+mZc6oTCzFBJEVKuhUE/X368jv 254N7TJ4UtpA11FliSj7s/jz7+/65okmmEZXRI1pGzsXLkA8KWwx/D9KVreOCfC3MikgBRvwTThq sMkTBbiALyd+eSev3Tj3qiNRSB4riSzH2kKY5JMc5z0x14B9fX8MK12h2ubFwpW1RGdpMPkMxye/ euP8Qi4MjSSQbraIhEJ6Enknr17e1dAupLqcLou+KRCdpJB4IPI+n+HrU8drc6ppoSaK38gE7Wjf GQDwcdjnHfvWFGLv7xomcvBoN1c2TSWbiCZDzGwI5645/wDrUy1ub2xuBHfx4XaWG046HBz1xgAk jrxjFehyObS2jW2hUvIMPIw6ZBGf6Y9qyJNLKQK9xGpnEu4eYpIXkYYqCCTjgj/d7A10WGmOt9Vh a0a3uMsoJXZ345J46H5lxzzj3qGKIWB3rIJIzINzMcsBxzjjd2PXkjPOcVyV1dyteyNZr+6RthYH JwGyAD/3z6nv3IrX0S6EJnknDm28s+YhJ+c9gPxI596cbpilZo1Lm6MdnPKyzyIuHC9PLJOCpGPy 6jIPpXGaze/aL7TUa1ULuKnggtnbnPv1/P6VsandyXF632VXiQIEaPgAY5KgegOTg+n0FZslpNM6 GTGY+VPGR+OP849Oa6FBuJzc6Uun3jdK8RSaRENPudsflE7G8sEOpOc56/59RS3WqN4ivbW3hGYI ZBLLIq4H5fn+ftWjZ+Hda12RltrEXSj5mLxqQPYEnA+g5ou/D97osggvrT7G5GUAX5O3RgcZ4GaV lfl/4cd38S/zR0Fq8fkjy2+X1BzmiudhnuIlI5kB5BHP8qKt00Qpy7fiNLK4kBBU5+ZQuc47eg+n /wCupbS6hHyyRRSgNnJUEE+/qcAc0yVSJGWUc56gdv0qMvJGMn95H6j5v8n8/rVtXJT/AK/yZfuw UuGKxh42G5GCjARioH5dOOnFQXdw187PbqqSNOVLOQvJ7ZJGCeetJbX43R5McsYBBVv7p5I/Ncjj t710FotsCGt3XzFLMg3D7pAymc8Lxwe2T2rirPk8zpjO+4+20eztYY5raTduyNrHIb8iMHgZ69eK fYXVnpsKpJcKrpuLhotrEc4yf4tp43en0pBeWdlDGnmA5be6gbMHnt2yM5Hvn0rE1C/tbsrp8Eoe SfO1lOVG3nBI9cY/OuWnORrGzNo+IofNJtn88rljs/hJPYjHH44+tY+syXbQzT/aWjEhBk52ogPH +RU+lLZ6Tokep6kAsUgwqgcuMEjAHXOOK5bXNbvdZm2NB9ntkb93Aq4APqfU103CxbVFhQJGY2Xb xg85zznnqf8AGrJdYwY0V/NZh8uAflBHXHHVay7K8l2rHMCq7SrMw4bpjPbOOOasqr/PhwJC37t4 +eOwOOfw7du9aRdjKUe44xCQSP5h+QgsTyTk/wCeatW+nNMvyLIMD0yOuMAjvwPpg0sf2DZIJJJb d1KAIw49evrzzWrpl6sUckLo++N+GCMQwPJ6D3qnNiUNNz1LwhbJaeGbNSnDAtIQOSx5zVPx9FC/ haaWVMiN1aIkcj5gOPwJ/OpfCniCxudKW285fNj+UgHrUXjLVLS50ttPDbnfGcHoAQcn8v1rmjf2 lzZ25DyJVI+aGQbG55IFFaD6YuepA/2FFFejf+rnC/P8i/f6fHOGbhW65x1Ncvc2H2eZQzOrEFsD HIP0ooqKbbdmXNcquhYYkaQFyxx09umf5Ct3TrZVjT97MCuDlSOcdunTtRRXn5o3GCsxU37wl5oV jc2X2ZzcbdwOQ4B4yPQ+vpVSy8LWqSSCMyncuCZCp2jPbj/ZoorwHi6lOLaf5nZCPPNRvZeVh8/h SzlXbJdXZAOSquoUH1xt61VbwdZwxlY7q5CkEkMVPPr93/OaKK7MPWqSipSd7kVpNNpdCIeF4OVN 3OTnOcLz168VbtdJitIjGZZZELbvmOMcYxx257UUV7dNGSm2tTV0/STeTsYnMZjXH3uSD2z/AJHJ 4rQfw/dhw8JhQg8jGMjPTj2/z1oopTk0zaCuhG8O3ZcsPJyeSQcf0pJtPnsYl83ZgnHymiiiEm3Y U4pK5Ase8nPI7UUUVtcwsf/Z "
+ height="25.8547"
+ width="55" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/100 dollarsoff.svg b/plugins/currency/images/100 dollarsoff.svg
new file mode 100644
index 0000000..8a65bb9
--- /dev/null
+++ b/plugins/currency/images/100 dollarsoff.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="55"
+ version="1.1"
+ viewBox="0 0 134 55"
+ width="134"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="100 dollarsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-172.24001"
+ inkscape:cy="44"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="-2.253418e-06"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AIYDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCzqGqi zuFiKEkrn72PwqI6q5TasJcFcNtlAwOmMVS1e3M96/zkBIuF7dTVNLePOAFDYPAXnAB/wrP2MZx1 PJpxVrmxJqTRMwaFmbGQFkUjORih9XSH/l3JAxysykH1x+tZa2auRvlcxrgtzj8KZdm2hcBQGZeg 6/nWf1aDfU1Sivso37XW0uQfKgLAdSJBwc1MLyVmINvsGzcHeQBcjqM/rWfpUj2+k3Go3BUxRcQo f4m7/wAjXLX2ozXs7zTzMxzkIzcAdRgVKwNOW9/vO2niZxjZJI7T+0ZpXdY3s3ZR8/77oOoOcdqp Sa5cq7qLeKXaRlY5g3Pf+dcT9pyGUOY88HBxn/61RCcgnLAE9ea0/s+jtYp4mo92dr/wkxBKGxlU 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 "
+ height="55"
+ width="134" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/100 dollarssmall.svg b/plugins/currency/images/100 dollarssmall.svg
new file mode 100644
index 0000000..3695601
--- /dev/null
+++ b/plugins/currency/images/100 dollarssmall.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="22.574627"
+ version="1.1"
+ viewBox="0 0 55 22.574627"
+ width="55"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="100 dollarssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="58.911764"
+ inkscape:cy="31.000877"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+<image
+ y="0"
+ x="0"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
+HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
+MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AIYDASIA
+AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
+AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
+ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
+p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
+AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
+BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
+U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
+uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCzqGqi
+zuFiKEkrn72PwqI6q5TasJcFcNtlAwOmMVS1e3M96/zkBIuF7dTVNLePOAFDYPAXnAB/wrP2MZx1
+PJpxVrmxJqTRMwaFmbGQFkUjORih9XSH/l3JAxysykH1x+tZa2auRvlcxrgtzj8KZdm2hcBQGZeg
+6/nWf1aDfU1Sivso37XW0uQfKgLAdSJBwc1MLyVmINvsGzcHeQBcjqM/rWfpUj2+k3Go3BUxRcQo
+f4m7/wAjXLX2ozXs7zTzMxzkIzcAdRgVKwNOW9/vO2niZxjZJI7T+0ZpXdY3s3ZR8/77oOoOcdqp
+Sa5cq7qLeKXaRlY5g3Pf+dcT9pyGUOY88HBxn/61RCcgnLAE9ea0/s+jtYp4mo92dr/wkxBKGxlU
+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
+"
+ height="22.574627"
+ width="55" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/2 dollarsoff.svg b/plugins/currency/images/2 dollarsoff.svg
new file mode 100644
index 0000000..0f1a6ce
--- /dev/null
+++ b/plugins/currency/images/2 dollarsoff.svg
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="70"
+ version="1.1"
+ viewBox="0 0 70 70"
+ width="70"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="2 dollarsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-124.56607"
+ inkscape:cy="94"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,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
+TkSuQmCC
+"
+ height="70"
+ width="70" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/2 dollarssmall.svg b/plugins/currency/images/2 dollarssmall.svg
new file mode 100644
index 0000000..ef8e77d
--- /dev/null
+++ b/plugins/currency/images/2 dollarssmall.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="40"
+ version="1.1"
+ viewBox="0 0 40 40"
+ width="40"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="2 dollarssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-472.06607"
+ inkscape:cy="-156"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,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 TkSuQmCC "
+ height="40"
+ width="40" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/20 centsoff.svg b/plugins/currency/images/20 centsoff.svg
new file mode 100644
index 0000000..25e77fe
--- /dev/null
+++ b/plugins/currency/images/20 centsoff.svg
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="70"
+ version="1.1"
+ viewBox="0 0 70 70"
+ width="70"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="20 centsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-109.56607"
+ inkscape:cy="101"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,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
+XodtAAAAAElFTkSuQmCC
+"
+ height="70"
+ width="70" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/20 centssmall.svg b/plugins/currency/images/20 centssmall.svg
new file mode 100644
index 0000000..10d8e80
--- /dev/null
+++ b/plugins/currency/images/20 centssmall.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="40"
+ version="1.1"
+ viewBox="0 0 40 40"
+ width="40"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="20 centssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-479.06607"
+ inkscape:cy="-197"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,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 XodtAAAAAElFTkSuQmCC "
+ height="40"
+ width="40" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/20 dollarsoff.svg b/plugins/currency/images/20 dollarsoff.svg
new file mode 100644
index 0000000..64eabd7
--- /dev/null
+++ b/plugins/currency/images/20 dollarsoff.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="55"
+ version="1.1"
+ viewBox="0 0 122 55"
+ width="122"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="20 dollarsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-75.566073"
+ inkscape:cy="105"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="-4.4480385e-07"
+ x="0"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
+HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
+MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AHoDASIA
+AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
+AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
+ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
+p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
+AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
+BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
+U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
+uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCV7hGw
+vPPFUJri1e4+dJG4HzLnA/Kp3zvUfPjI46Z49ax7uDfcsyqww3J2kknHsPb1/wDrefGKejPqpScF
+eJoH7Ioci3nO3HCgk/lV+3t7KdMmCZT1wx2nnHrWRayeXAqSiZURcfKpIOAO2P5+9atvMuCimaQY
++8ykfl8oq1TjfYwq15qN+YmkuYdNtpZYoiH6kSE4HOeozxyeR+RrN1Dxg9nJGkVkMkHcsucg54xj
+1yOeeoqW+jjhjkmSRlkwC4TP7z0yF5zxjI5+oGKzbG2XctxjeqAiMqdoXJHTtzz93jGcAdK7o01F
+aHzNSu6lR850Wl6nq14ytcadHbQ++S5/A8fnW2zhVB2k1y/nTHnzXLcDIJH/AOqtm20//RyZ3kZi
+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
+"
+ height="55"
+ width="122" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/20 dollarssmall.svg b/plugins/currency/images/20 dollarssmall.svg
new file mode 100644
index 0000000..c5ad6a3
--- /dev/null
+++ b/plugins/currency/images/20 dollarssmall.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="24.795082"
+ version="1.1"
+ viewBox="0 0 55 24.795082"
+ width="55"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="20 dollarssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="2"
+ inkscape:cx="45.381168"
+ inkscape:cy="24.560276"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+<image
+ y="0"
+ x="0"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AHoDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCV7hGw vPPFUJri1e4+dJG4HzLnA/Kp3zvUfPjI46Z49ax7uDfcsyqww3J2kknHsPb1/wDrefGKejPqpScF eJoH7Ioci3nO3HCgk/lV+3t7KdMmCZT1wx2nnHrWRayeXAqSiZURcfKpIOAO2P5+9atvMuCimaQY +8ykfl8oq1TjfYwq15qN+YmkuYdNtpZYoiH6kSE4HOeozxyeR+RrN1Dxg9nJGkVkMkHcsucg54xj 1yOeeoqW+jjhjkmSRlkwC4TP7z0yF5zxjI5+oGKzbG2XctxjeqAiMqdoXJHTtzz93jGcAdK7o01F aHzNSu6lR850Wl6nq14ytcadHbQ++S5/A8fnW2zhVB2k1y/nTHnzXLcDIJH/AOqtm20//RyZ3kZi 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 "
+ height="24.795082"
+ width="55" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/5 centsoff.svg b/plugins/currency/images/5 centsoff.svg
new file mode 100644
index 0000000..94b3ab4
--- /dev/null
+++ b/plugins/currency/images/5 centsoff.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="70"
+ version="1.1"
+ viewBox="0 0 70 70"
+ width="70"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="1 centoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-117.06607"
+ inkscape:cy="100"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3235"
+ xlink:href="data:image/png;base64,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
+RU5ErkJggg==
+"
+ height="70"
+ width="70" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/5 centssmall.svg b/plugins/currency/images/5 centssmall.svg
new file mode 100644
index 0000000..c59b97a
--- /dev/null
+++ b/plugins/currency/images/5 centssmall.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="40"
+ version="1.1"
+ viewBox="0 0 40 40"
+ width="40"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="1 centsmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-111.56607"
+ inkscape:cy="93"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3091"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAABGCAYAAABxLuKEAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzFvGd8XeWV7//d/fR+jprVm1Us25J7w2Bsio1poRMIoYYQIIFAEhIS5iaTAVIoARI6GDBgusHg 3gu2LLmqWZIl2Vaz6tHpbf9fyPGd+U/m3iST3HnenRdn72f9PmutZ63f+j1b4H9g6brOyy+/lN7a esxms1oXKIqSqaqqFolE7JqmnQaG4onEWpvNPja1pto/c/rM4J//e7KjjQl5hf/0PQr/rAevXPEm 133zJk73nODxJx6X58yZW9zX23dha2vrjHg8vqi8vNyrqiqpZJKUriNLEiaTiXAkgtVi0eOJhOD3 +xFFsbGvr2+dpmmh6urqV2tra4/PO+fc1Nx583WAI0eOUFlZ+Q/f/z8cmJ07tjF33gIAHvvZIze3 H2+fu3Dhgm/YrLZEb2+ft6mpiYaGBmKxGKdOniSVSjEWCBAOR5FlkWRSRxRFFFXF43aQlpaG1+tj 8uTJTJw4MQoM9w2N/CwciZ1++IcPfgqwYf0azl988T/Ujn8YMJ+v/pRll1zKb558vLS/r29O8YQJ D1qdNrWxubno67pavb29U+jp6QVAUzWSqSR2mwOz2YTNZsNgMCDLCnoiRiSRZHR0jFgsxthYgNGR QYKhCBazkcrKSn32lClCeUU5NpdzvajKTx/v6Ox96KFH9r/w3PN857t3/0Ps+W8D47KZGfIHueu2 W6wOt/t3+Xn5mU6n8+Itm7fom7dsFkLhMNFYDKfLQXFhIdkTsklLT8Pn86EoKmaTGQQwGU2omkoi EgFRZHjUTyyeJBAYIx6N0NffR0NDI21tbcQTUYKBMSrKyvVrr75GyMnI/E3tkSanf2Toe3PnLogs v+Iy/X8UmLdee4kbb7md73/v7l/Pmzfv7qGhIfN7770nDQ4Ocqqvn7y8PIqKipg6ZQpetwuHzYam aWgGDVmSkGSFWCxGMplEEARSqRSiAKlUCklWCEZipJIJNFkiFA4TDAaJRCL0jwxQv7+e2j1f47ba Magq85csji9bujS4du3aX1x66aXvD48M9Sy+8JL/t8CsWvkWV113Iz9+8P4FDrv9XwqKis5Zs2YN hw4dYnR0lPz8fKZUT6ZmylTMRiNep5tkKkVK1xEEgfb2dgoKClBNZr7e+zU11TXUH6inpqaG5oYj 5OYXkkylaGpuIRqNMnVyFZFIBIPBwOioH0WRSek6vb09NDY28vXXexkcPE1xcTFXXnklJpPp98FA 4IVb7rjn2MaNG1m0aNE/H5gfPXAfXo9bTiH+wON2Pz4yMsw7767E7/eTkZ7B4sWLKS8vx+0wEw6F yfD6iIYjSIpKOBbHaDKyYcMGfF4fGTk5NDQ0UFBQwNatW/ne9+5hxRuvU11dzZGjjUiygs/rJSsr k2OtrRQXF5NMJpCSOiajkWgqSTgWxR8KsH3DJurq6wgEgyxZvISZs2bpRotjUUGOb1vFlNnJ+rq9 TK2e8VfbKf0toMjAtt1fU1JU8MoVl1/+wxUrVvDVV18hGlTOXXguy5cvp6S4GLfLhSTIKIoBQVKI p3T6BgapqKpi3foNVE+bRmNzM5FYFI/HQ0vrMZLJJOFolHAojKYZGBkZIT0tDaPRwJZtWxFFEc2g YTabcdssCAIokshgby9ZXh95BQWUTiwjEAyxcdNWenr7hdys9OvD8UTioYcebKmu+d+10D8cmKSu O4b7u5uWLFlS/uyzz5r27NkjVFRUcPu3vs2COXMxqwbsFisGUSZGCpvdTjyRoP7gAVK6jmYwEI1G SUtLo62tDbfHQyQa5eSJE5SUlBAKhbBaLIyOjjI6Oko0GkXVVEb9ftxuNwaDgfr6eoKBAIPDQxhM Zibk5HC0sQmjyYjFYmbatOmk+XwcOniQr7/eLbmdrkUOpzP1k5/8eO9zz70Q/Vuc4K9a77z5Wv7N 133jwPLll9qeeOIJBgYGuPbaazn3vHNxW+0oiooqK5BIEo0n2LJrGzfddBNNu3fjTfOhKgqbN23i 7rvv5qmnnmLWrFkMDg7icjg51XUCPZki3ZeGIAiYzWb6+vooLCxEFEX6+/spLy+nsbERj8fD4YZG cnJzkbTTfF27n7FAgNKSIiRZIZFIMnfObLKzs1j13jt8+MEqdJ2H0PVTuq4/LwhC4q+x96/2mHSv q/GWb97g+vW/PS4MDQ9z2223sWzZMlRFxeZ2oho0kqkU/sAY2bm5DIwMMzQ0hMfjYdKkSezZvZtp NdNoa2tDFEU++OADZk2bgSgI6KkUoWCQwoICuk6eoK2tDY/Hg9/vx+V2M+ofxefzkZ+fz+bNmzCY LWhGI6qmsW7DBibk5lJelAeCQCgcRgQcThdlpYWcHhhg67ZtWMzWC4PBAL947F/2Pvvss/Gv9+zi 5Zdf+fuAueOWb7L/wCHuvPVbx+fNmzfhhT/+SYilRB5++GHmzJpFKh7F7bByeniUlpZmMjMzCYZD hCJhREEiHAojKwqbNm6mvKKCo0cb+PLLNdhtViZVVrBj53bsDht5ebn09HSTmZmB2+0kHApSU13N 4cMH8bg9JJJJVE0jFAxjMVuJRaO43W727N5FTXUNfb29lJWVs3nrNkZGhsnLyUZEx2I2U1xUTAqJ r9auFWRVPcdus+Y/+OCDu6ZNnxn4uzzm5T8+x6P/61/pbG1avfTii4tefvllY3//aR544EFyc3OI RaMokoAoiBjNFgYHBxkeHiYnJweASDiCJEts27qNtLQ0Nqxfj81qpaSkGD2ZICPNx8jICFlZmaiK TFpaGmNjY9is44afOnmCsomliKLAe++vwuv2MDQ0hNlsRpZlujo7mTVzFkePHKF66lRa29qpra1l 4cJzSKVSJONxbDYrug5FRUUkUjq1e/fhcXsmxaMx4x+e+cNXC+bN0Ve+9/7fBsxnn69BTMUfv2TZ sltWrFhh6OnpER566CEKciegSiImowEEgZaWZuxODyaTifb2drq6ujh9+jRVVVXs3rWLiy+6iIGB AebMmUNHx3GC/hHS03yYTSbKJk7EbrMjSxK5uTn4R0fRVBWL2UxXVxflZWWsXbuOK6/8Bs3NzUyb VsPmTZvIyszC4/XicDiwWCzY7XY2btzEt265BZfLxcDpfgxGI5FIFFGSkESB/OwJdJ48wd69e5lW Uz21u6fn4GXfuKr58P79vPDii38dMNs2rsVuNV+QmZHxwubNm6mvrxfuuusuampqiAX9xGNRREHk 8JEjTMjJ47PVqzEYDJjNZgRBwOPxcKCulvz8PLZs3kRmRjqqIjN71kwK8vNIxKKUFBcRCIx7iMlo wD86Qnp6GrIkEhjzY7GYsdttCIJARmYmBk0llUxQkJ/H2vUbOO+88+ju7kZVVWpra5lYUcGmzZs5 evQIVquN7Nw8kvEobreLgH8El91GWXk5Bw8dpr6+XiotKbnqphtuWnXO4vMH/mqPefWNFUp97d4n nU5n6TvvvMNNN91ERWXFeM4giabIJFNJYvE4XSe7qa6uZs+ePRQUFODzpeH3+5k9o5rBgQHycnP4 cs0XFBUVE4mEMRqNWMxGJEBRVQRBwGg0YjKZkEQRXddxOp1kZWUhCAI6OjarDafDTu2+vZSWlBCO Jdi6dRuapiLLMiajEcVgpqSkCIvZzNjYGI2NDZjMZvRkAoMsIegJkjpMnjyZD1d9SEFenpCVkVZ2 530/+Oq1V17+TzXOXwQmEQk+4vX67vro40/IzSniwiUXoIgiRk1BTUUQJIlAQmLDtp2YjUYO1dfy /e/fz47tW7FaTHSfOkEsGsViseBwOCgqKsJsMqAqEmaTEU3TSAKyJJFMJlEUBV3XiUQiKIoyvodE gng8jqaqiALEohGMBg2jQcM/OsoVly/nWGsbBs2AJMt0dbTT1XGclpYWPB4PTqeT/r4eqiZNIqmD pGhoBgPhSJSZc+bw9AsvCBOrphacaG0au/WWb21/4Pv38fKrr/9lYD7/5EM0RbZ7PJ6PRVFUamtr uen6G7BajSTiMRRJIJWMk0KkobkNu9XKxJIiplVP4U9//BPz583FbrNhMhppb28nkUjQ19eH2WzG YbeTSMSRpPFXJpNJUqkUqVQKRVGQJGk8aZ5pKFVVJR6PEwwGkWWZSCSCx+NBFEUKCwvQEWhtPUYi mWRwaIgpk6vw+rwkEnF8Xi+trS1cc/XVhENBfF4v8XhsvM+SZRTNQHtHJ6dOndKrJ1fNUjXtq8UX Lev591iI//7HssuuJCsr68mysjLjxx9/zLkLF2KzW0glE5hMKpKoIykavf0DKKoy7hXG8XC48sor zhqUmZnJ9OnTKS0tpbi4mEQigSzLZ3NQPB4nGo1iNBoxGo0oioKiKMiyTCqVAiAcDqMoCg6HA0EQ cLvdyLKMqqqEQyHGRkeZWFLMnNkz0VQFTRaQSXLp0gvxuR1Mr57KSy+9xLp16zhx8gSSJJHm8yKJ AoKe5Af33UdLU4Ogg6m9vf26scCY8S+GUltzA1MnTyrq6+t7+OTJk97u7m6WX3IJqixgs5pIJWII QgpRVkDWOHykgeKifFw2M6IkoqoKmqqgyBKaphKNxohGozgcDnw+H6P+UQQBBEFAFEUMBsNZ79H1 cfokGo2O5xV9nMWTZZlEIkEikSAWi6HrOtFodBwITSUrawKRSISiokLS3E5cLiehYACX04GmKRQW lbDwnAXEYlGCgQDRcJhYPE4ymSQYDqMqKtu3b9dnz549Z8PGjZ9u2LCx+z95TGFpOfv3106pqKgo 279/PzNmzMBoNCJJoKeSGDQVRZExmSy0tx+nqKiI3t5eBF0nEo0SCoWQJPlsSf/JJ5/w85//nMce e4zmlhaEvxA+uj4Oin6GjhCE8WZfEATC4TCJRAJRFIlEIqRSKfx+P+FwGFWW6e/ro7e3m0g4hCxJ xMJhYuEwmiwjCQIWo5GxsTE++GAVMO7JsiwjAna7A1XVOO+8c6mrqxPcbrcuCsLj/8lj3lrxBh99 /AnLL77g40hCd+0/cFRYvnwZRhUcFgOxeIyUIKAjoZlsdHZ20dt9grKSYhqbmsnLK0QQRRAEDAYj iqoxa85cZs2eTUnpRHbt2o3FasXlciMKIrKioCgqsXgCRVEJBIJoBiOhUBghBbFoDFU1kEymSKZS iIJAKBKlqa2DLbv38vzzzxGOREkkUxQUFiLLEoqmoBoMaEYj8WQSk9nMvroDXHb5pSjS+CkqKQqJ RAJJltFUFfQUbq+XY8dahXSfL//uu+7+/O2VK3vOesyN37yZF55/7kqzxeqpq6sTpk6uxGk1Y1Bk YrE4iqKSSqYQBJHBwUFaW4+Rm5tLZmYmw8PDHDvWgqIoZ70hkUgQDodJT09nwoQJ3HDDDQwOjFfG msGA0WjCYrYA4Pf7MRqN+P3+8bBK6aiahiiJGM1mZEUBUaSjo5P169axecM67rzzTm699VaqqqoY HR0FQDsDpCCI2Gx2BgeHSE9P5+s9X2MwjqcPIZnEaDAgkMKgqeipJHPmzGHjxo3YbDZWr/5sUWtT 4/8OJV3XWbv2qwszsrJdx1rbmDathkQ0iCYJaKqBSCSK0WhClhXq6urO0gbHjh1j5syZ7N9fx9jY GJqmkUqliEWjmM1mEonEmdrGx8XLltHRdYKxYIjW9uN89Oln9PX1EQwGGRoaQj1T0wQj4fFqVZZx e9wcbWzk9888xxtvvc3B+v089/TvmVxVxbZt29izZw+SJOHz+ZA1DYPJhNFsJhSJ8MZbb1FSUkJF RQXvv/8esViMVCqBLIokolGCY6OosoymaSiKQiQS0SdPnnz/pk2bxLOh5HY5JJfL9bw/ELS0tBwT pldPxmc3ogg6SCpmi43RkTHWrd/AwNAwkiTR39/L/HnzEEWBispKnn76aS666CJGRkbGj92Ujs1m o6+vD6PRiM3hxJeWzp6v97Kvdj9l5RXYrWZ0XWdwcJBAIIAsy8iyjD8wRjga4cOPPyI7N5/a+kP0 9nTzkx89RF3tPmRFpbS0lOnTp1NYWDh+qqkGRFlhaHiYZ//wHFdfcw1paelnisJSKirKCQUCRMIh RFFGkCQkSSQcS+Jxezh2rEXIyyuwlpaWvvbKa6+NSt+68TpOnh7Qc7Myf9HRdUKz26xMnlSOqsgI 6EiyRCKZxOXx0HXyFEldJ5FIkJWZidlkwmq1ERjzI4giFquVhsZG1q3fyNx582k51kpuXt44kR0O Y7fb6Ojo4Hh7Gzu2bWHXrt3MnTsPq91GMpli9eersTvcdHV3097Vxdq169m5dTsXXbCYubNnEY1E uGTZMsrKynG63GiaAVUzkNIFamvrcDkdPP6vv2b27FlMnlRJX18fs2bOJBKJsHfffixmE4Ikoqkq kgA6KWRZweFw8dbK9zj//EVsWPule8furz8WX39rJdMnVfzUajFbe3t7ycvNQUQnnkgiyRoIkEjE efmVlxkcHhqPP0Fg4sSJGAwGNE1D13WmTJnC7j172L5jJ929fWzdtp27vvMdunt60QxGQGBwcIjy 8jI0VebxX/+Kb950E4lkklRK59333mNqdQ3bd+6m8VgbO3Z/zbnnLuKKyy+nbt9ePC4X8+fPR9UM xONx9FSKvr5+RkbHeOGPL7Jq1Sqam5pI8/m4YPFiSCWJhsO88/bbGE1mrvjG1dicLhTVwMDQEIlU EqvFjCIKmExG7E4n0XiMUHDMfjbHHDp0aL7FYiEQCJCZ5kMSBWwWM4Kgoygyzc0tnH/+Yiorq0jE IphMRnKzJ2C1mAgFx85UlaM4HU56e3pJpVLMmzePjIwM9u7di9/v57XXXsVkNrNr1y4mTZrMDTd8 E1EUGR4e5qmnnsJut1NdU820mmocNgsjw0NsWL+OLZs2sWzZMrxeL7IsI0kSRqORurp6Vq4cJ+Hf fPNNlixZQlNTExdddCEAiqKQlpbG9ddfRywW48MPP0BRNAwGI16vD0VSCAZCjAXGCIcjeD1eOjs6 cTqdyw83tVpFgGAwaO7v6yMZHzdaEgXQk6SSCZIJqJ46jZ7uXj777DOGh4dRZYn+vl7MRiNWk4m2 tnbq6+s5cOAA8+bPx2Qy8e6772I0Gqmvr+fgwYM0NjYhIHLsWBuNDc3cdtsd2O12/vjHP3Lo0GEu ueQShoeGOXWyky+/XIPP6+aiC5YwZepk+vr6yMjIwGAw8MILLyAIAl+s+QJd19m5cydlZeX4/X78 fj+awXA2z5nNZr7e8zW7du0iLy+fPXu+pru7l3gsQSQaZXTUjyyNs7vFJcU0NDYwYcIEnn3qt7ni wUMH3aIoztVBd9psKLKEKApEIxGikTBj/gADAwO0tbVzzjkLmTd3DvPmzMZuH88tfX29CALjHuN0 kpWZydKlS/niiy9YuHAhsiyzatUqBgaGSCV19u+vo7e3l3MWLGTlypX88Ic/5NFHfzYeomcKtW9c cRkzp9XQ3NTAlZdfTiQSIRwOMzw8TFdXJ8FgkFMnT+JL8zFv3jzmzZtLIBAgLy+PVDJJMplEFASC wSATsrM5b9Eidu3axfz585EkGZPJjNFowudNIxqNoGoaGRkZDA0OYbVaGB0dNYk7tm+z5OXlEY1G Bc1iwaBJxMIBBFkmpZqwud00HDtGShQZGh5BkTX21x4gEIiCaOB4Rw8Wt4PFF19IXmERoXCC3/7m Ga688goSiQQLFy5k8+bNlJdPpP14G1arBZfbyVhojDtvv40P3n8Ph82K2WhAkyVKyicSDgT56P1V PPzwwyDBWCCAwWCgt/80omompWt4PB4yMp00Hq3n4QceZvbMGjZt2sDomB/VoBFNJIlFwzQ3NfL5 6tU88vNfsHXXLnbu3UvvQD+9/b2E46HxkzAVI9PjIBaNIGgWfXJpQZk0ffq0TEWSvnvixAk0o5Hc rAwUSUAQJBTVQFdXFwcOHsJktjAyOopBVcjKysJqs3Lk6FHiyQQ2k4bTbkcWBXZu28ply5dht1vx +0dZ8/nnXH/9dVitNpqbm/jwww+5/fbb8LqcZ5vKyspKRFHEYrGgGcbfeffdd2M2m7FZbaz54gtU RcFmd9DR2YXP48Xrc5Ofn897765iZHiU5Zctx+v2YLPakM/0YBazCc1gxJuWzp/++CLBQIDMrEyM morLYUdVFOLJFLIsk9Rhb+1+Jk+ZKvT39tSLoVBo8fjocwRZVonFEoiCTDgcIRAIcvz4cVRVQRAE HA4H/f39ZGRm0tHZwemB0wwND9N7qhsxlSTN5eLO225GFmJ0d5+ir6ebtDQvVrMJRZZ47dVX+MmP HmLypEpkeZyLcTqdGAwGHA4HqqqepR/S09PPVNNJrrrqKp588kkikQhlZWW88eYrzJ0zh4yMCfz4 xz/h4KH9fPvmb1JXtw+DphCPR4nFImer6TH/GB6PB7fbjXqmYxdFiVAohABnejd1vLMXBJLJVIV0 7sJzppiNxmVDQ0O4velk+XyYjQZMJjOiLGM2m8jIzKK3r5/+/tNccfllNDY2cODgQdLS0igrL0NT TSSSIMoiRrOJw0cP89mnq5kxfToXXnABIyMjfPTRh9xxxx2cM38eqWQCj9uFdubo/XNnHY/HESWJ aDTK5MmTOdN6YzSamD1nDrv37GHJBRciCkl27drNJZddw9DgaQoL8pg6uQqvx4PL6UBVFeLRKNFY DKPBhC4IVFRO4tNPPyGRiJOZkYbFZARdJ5FIouuAKLF163Zqpk0jGPBvk5PJ5ChAIh5HEMbpA9BJ JnWOtbZTu38PRpMZtzed+fPn896qVWiaQmlZGT6fl9KyMlJJBb9/hFBolCPNLWTnF/D0U78jGo0S i8XYsH4t3/3ud8nLy0OSJGRZJh6JoMvj/VU4FMJkMiEKAiazGVVVGRsbQ1EUNFVDskrYSkvZsWs3 X3zxBcXFE4jHkixbchE3fPM63B4jRsUAwNDw8Fl6wmqxEQqHScQTNDY2ct3113O6vw9JHCcVRFEk lUqAkELQdZLJJJIsk4jHVWn27NnTTEbDZROyswnHI2RlZCIDophCFBNUTZpKx8k+sibksOGrNRg1 E/m5hQhIbFy3ie1bd5JMjFFVVUl6ZibZ2fkoqolwOISAgMViYtnSpbgcDnSdM0RVEkUz8Mc/voLV 5iQSS9DT0weCRFfXSdxuH8fbOzje3knLsXZWffIJJaUTKZtYyrHmBqZXT6ewIJ/cnAz27dtNui+D 8MgYfb39oIPJaEYzGojFoiAI9J/ux2m3oSoKFRNLiZ0hygRBIBIdRbPaiSOzY+cuFsyYwbG21i5Z 1dR9g4ODZGdnYzKZCYdCaEaVRDyOwWAgFAphMhmpr6ujurqGwqJ89u3bhyDAjFlTKSgoRBLg1KmT xOJJzBYr2Tm5BEaNDJw+TSAYIRLpwWA0YTAYkc7wvENDg/j9fhYuPIfR0dGzHI2qqmeJK0mS6Ont 5d+e+DW3ffsW9GSSq6/6BuFwhHg8QTQWx2KxsXfvPnJzi/F4vPgjcboajzF5chX+sUHMVivZ2Tm0 He+gpMRL58lT5EzIpLenm0AwjCxpRMIx4noKo8FAPB7D4/YclGfOmtX/1erPsNvt9AwOIkoioigS iyVweZz09baRSCRwuV3E43GaGhu45pqrcLlc42LCcJjRoUHGAiE2rFvLqe5uMifksHjxYiZXTeLg gXpMJhuRSBSDwThOcGsaO3fu5MYbbyQWi2E+w+z/mbT6M0lls9n46quv+OEDDyCSQhAFQsEAA0N+ nnn2Ge6///vMmTcfWZbo7h1g3bp1tLa10XSshQ2bNvKnPzzFunXrOdndy+y5c9mwaTORSIT5c2dD KkkgECArLYPRcJSRQBCDwUAsHmF0dLRT0HXdtOzCxa1XXnFFRvvJU9RUVuAwqiTiUVSjyltvvUdR +SSOHG3g1ptvYvfuXQQCQXp7ewmHw5ROnMgVl1xAIBRi1B+gr7+fpuYWJuQWMGVyFcWFeZw4cRJJ AFmW0XUdRVF49913+enPHmP58uWIoojP5yMajdLb28vQiB+TQUVRFE6eOsGKFa9jMmgYNJXt27cT jCS5+ppr6ezspLGxkXgijt1soqm5mXA0gsfrxWQ2caKjkynVNbQf7yQtM4OC/ELq6+vo7DjO9Jpq TAYNVTBgcro42NBAV2cb1ZUT2bO37mJZEITQgjkzjaYzCoNkeRnhaJR4LII/NIbdbqfjeBuLFy3i ueeeY3BgEJPRRH5+Pueecy4msxmP14sWCNLT248owJzZs+jpHyAcCnGqpxdFVenq7MRsMuHzejh4 8CDFpRNpbTtGJBJmxYoV45IPVeXIkSPU7ttHeUU5wWAAQRBw2R2EwkG2b99BMp7kqutu4MOPPuLA gTpS8TgzZkwnKzONnOxM+vr7cblcRKIRCnLzaWpqxul04LDZWffVWmpqppLmdXH40GFmz5qNJKnE kwk62tsoKS5gYGAQfyDYLwFcfunymvT09ApBEFEVGUVVkGURq9VK1aTJJGJRmpsasTucnL9oIbNm T+fW225B1WQ6O9s5PTRCfn4+g4ODmIwadpuVdI+LRCxCNBwmFAox4g9w4uQpPC4b9fX1XHPDzXzz hmu4/PJLiSdiGIwakWiY3Tt34PW6KSkuJGtCOhnpaYz5/Zw81YOsqMxfeB7fufcHfLVuPSZNYfGi hVROLCYtPYtNmzYTi8UZ9Y/hcXvxup047HaKioo4VH+QhqMNjAwNUFFeQmZGJi6Hl4ig43K7+PKL 1SxdulSvP1AvLLpo+aMiwJQpU96Jx+P6xLIyRFFE1VREUSSZTDIwMEAgECAaiZKdnU1l5SQOHDjE d7/7PX7600fp7u6lv78fo9GI2+0+W5PYDCbcdicuuwM9lsBsMrF/fy1Wq5UJWVl0d3cjCAIGg4FE IkFnZyfhcJgjR8ZHrIIgMDQ0RDQaxWAw0NPTTVVVFXfeeSeH6veTleZhzqyZVJSVE4lE8AfGSMtI x+Pzcnqgn98//RS/f+oZNmzaRO2+OvKLCjFoBkRJ4sSJLsxmM6FQmFR9DlaEAAATk0lEQVQyhaqq BAIBJEkS+vr6915x2fLT0qZ1X3L5VdceK8zP/bnH6yM45sdsNCCJ40fr8NAIra2tlE6ciNfr4623 3ubEiZNkZk3gjjvuZMqUqUyfMY3+vl4cDicDp/sxm82oqobT7SIUiVA8cSLNLS20H2+HVIJZs2fT 0trOzGnVlJSUsHnzZmRZZvPmzeyvreX+++9nZGQYt9tFPBFncGCQ3Lw8Ojs6cft8XLb0Yi6+YAll paVIkojd4cRkc/DmmysoKi5h7rwFnH/+EpKpFAcOHGZgZJiammn4vGkUFxUwOHQam92BphqIoxOL xWltaSY3J4fu7lN1F19y6TvSGyve5qP3VwoHDhy4ubyy0mFQFVLJ+Jn5kEZ7+3FESUIUJYKhMKFI hLkLFnDJpZfS2dXFG2+9xScffkBpSQmZmRmkkgnMZjMmuxXVaEQxGTnU2MDvfv8U+bl5GFSZObPn 4PKmk+bzcPz4cSZOnEhDw1EaGhp58oknCATGMJmMKKpCMpGksbGRwqJiiouLcXt9OEwaORMmoMgS RqMZk9nCxq3b2Lx5C23txzlytIHsnBwWLzqfufPnE08k2bJjJ26HE5NRw+1xogOpJJhsVt5//31y JkzAbDYzY8aMb73x1jsnZYArrr4utXTZsi+SgaHv6pqV3sExJvgMqIkEqiyQke7lxMlTHG1o4rrr bmJoZJCbb7waSdZYdO4S7r33PtLT0+noOM7pwRF6e3ppbW0jgUzWhGw2rv2Ck11d3HT9dSxatIh4 CvRkDJPJTGVlFZIkkp6eyZw58xHPVMboSYL+MeLxBJFYHF0UGQmGOdHdQ0nuBMLxKIIgYzAaGA0E +fyTj/nRDx9k4cKFvPrKq/zowQexWmz89re/pby0lP6eHsJhPw5HLkF/AEESSYgCkqBTt28vP/7x j2lpOTbk94/Vwb+Ts67dsLl6w6cr9y9cspT+0wO4HVY0IYHFaKS7t5ev9+6jrLwCVbVQf2A/kpxi 2rSZaIqFcCLGG6+/xs5dO7HbbVRVVVJUUMzh5lZOnx5kdLCP5UsvQFVUmpuamDd/HnPnzmXylCnE YjFGRkZwOh0YjSZ6enoJBgL09/WQnuYjFouxt7aWV197g9b2Ljw+N4vPmce3v/1tXG4vkWiER372 cwJ+P88++ywOhwOvz8f+2loaG5o5cuQIU6dOxe/309DUwOyZszBpRuwuF7qiMDoyyLsr3+M73/kO jz/+m41PP/3U4pLyCl0C2LZtG4vOXdhTWJB/2/z5822aIpNKJtEFEVnQSaZSrF79Oddccy09Pac5 1trCtddexYYNm4lFE7z80h+pLC/n+/d/j2/fchMXLF6M1+MmEAzR3t5KWXEB93/ve1RWVpCfn8/R I0dYteoDPvjwAyKRMGVlE0mlUgiCgNPtxefzkUgkOHXqFJqmkZbmY9u2bQSDATRNo7Wllbq6feTm 5eNyOll26WVcftll3HLLLezZs4eBgQE0TcPnTSMcDnP48GGmT5/O0PAQRoMBr8eLrKiIisLHH33A 4sVLOHDgACUlJf9r+RVXHjg7PnnttdcAyMpI71UV6cqCnCw0k5mhkVFMiojD6WT6jBmMjQX48st1 zJ07G1kRiSeS7Nixi4ceuI+K8jJcTjsjI8MIeopjLc24vT4CY2Pcc9ft4wMufXzQVVJcRE72BFwe F+XlZbz44p9oaWlm3ry5BMPjtKPDbic3J5e+vl4i4RATJ06kpqaaB37wAPPnzSEtLZ0nnvgNjz/x FMePt+FyOvnZz35GMBhk165dGI1GXC43uq7T09PDpEmT2LBxA9NrpuFyjif1QCTMO++8zfJLluuN jY0dj/3q17f8hxHtn9c7H3164g9P/uuPptdMxWR3EkvoqMQZHhkBQeTgwUOUlU3C43Gik+SN11ew ZPFFOK0GFEXCoKoYNJVwKEDOhGyMZiuZmRkU5GRz8kQng4NDKKpyViI2tbqaSDRCNBYjJzubRx/9 GbPnLsRqtaIDggBet4uRoUE8Xg8DAwM4HE5sVgser4dvXPkNFp2/kLb2Tl5+6UUyMzMxGDRyc3Op q6snMzMLRVFobz9OeXk506ZPx2G3ockq8WSSt997l+uvuxZdR9i1a9cjRxuba/+MxX+QgcyYUjU6 aebs348lYujxGBWFpaQkOyabBU2F7o4u+gd60UUJl8vH9ddczVVXXsSpvkEMZjuhWApd1DDbfIRi caKhMSxGlYamJiwOH1k5RQyOhFm/cQfBcIo/PP0sY8OjTCwqobigiNu/fRu//82vSEYDxCMhEvEk m7ftpnjSVJKCxNSpNaiKRDgchpTO6MgQGT4v37/nDv71V49z9EgjH3+0msyMbEpLyojrKXSSDA32 YDTI6PEQoVCAsXiUzr4+jnedwma18uJLf+K9Dz9Z9e+x+A/A7Ni5hcmVlT/95S//bUzTDKSle1A0 hVgkjiCoLL1kGUZNoaujnVgshi89nXdWvk9BQT59fX0YDAZUVcVg0MjJyWNiWQXTps1ganUNp/tP oygKE0tLmTVrFocPH+aKK64kmQKP10djUzP5BUV861vf4sc/+QmqppFK6Tgcdo63t2G1WMjOziYW i51VXf257+rt7SUnJ4fm5mba2lqRJIntO7aTl5vLmjVruPrqaxgbG8Nic+B0udFTKX735BPc+u1v 6cMjI8krr/jGUkEQ/oMW7z+E0quvvs7q1Wvi995zz7Gjhw9dXTW5ktLySnp7+hB0AVkRmDixlNp9 e7GYzRgsNnRBZGhgALPZTHNzMzt37iQ/P58jDQ340tIIBIKsXbuOFFBfV8+JEyfw+XwMDg4iKRLJ lE4kGmNwcBBBEEnpSTTNgM1mx2KxoKgqH338EdOn1eAfGcVmtxEYGyMcDp/Vz0SjMQ4ebiAzI4PC wkLS0tLIzMwc7/Qz0smeMAGXy0U0nkAXJDZt3EhmZiZVleXC+++v2ltYWPjIPXffpb/1zsq/DAzA V59/yrdv/06DJnNxSWlRlmIwkpY2gd5TPUCcZCxKQX4+W7fvYGBohI4Tp5g/ayYnT52isLAQs9lM f38/qsHIxk2b6entY87cedTV7ic3N49IJML777/PbbfdhiTLfPHFGkZGRsjIzGJ/XR3RaJiiomJW r/6ccxeeSzQapbZ2H6dP99PW2kooFDzL01osFhKJBJqm0dM7QFVVFRkZGWzfvp1Jkybxh+eeY/as mfi8bkwmM8NjIXpPD/CbJ5/kvnu+ox9vOxbq7hv68S//7fEj/x6U/xRKABcuu5Qj9bVcfdVVD/3+ qd+mBgYGsDuclFdMQlZUkok4bqcDv9+P1WplYHAYTRu/FbJ9+3YyMjL47LPPGBsLMGfOXKKxOJ9+ tprqmmnE43GOHz/Ovffey8aNG6mrP0BxSSmCKCOKEna7k97ePgYGBlFV9YwKS6Cvr5/S0onk5ORy 9GgD7cePMzQ0zPDwCOFwhIGBQYpLivn8iy843nGcgoICVq5cyR23305ZWRmKouL3+7Hb7fzyl7/i 2WefpbunJ/X5Z5/tWPHOO+93tbf9/2H4y6rN5//0Ip+tWds5Z/rsxtH+vqsmlhTpST0pmCx2EtEw 0UiEgYHTzJo5jVNdHXT39hKORMgvKCAaiyFKIhajxtbNW0jzZZCemcm+vXuJxWK0tLTgcDjQdR3/ 4DBmg5HKigoGTw/gcbrQLDZESSYzY7xliEejbNiwiYrySkZGx/B60zGZrOjIGIxmvlq7Hq83HavL TigUQpZktm/bRl9vL9dcdRmKojAWDOH1pnPXnbdz43VXY7FaefmV18S1W3YWv/LsE5z7F27C/ZfK 8P3793P3vfc1pPt8M2VVKc5IT9eLSkqEsbFRRvx+8guLUBSZgoJ8NKMJGBcBiaJIZUUFqWSC0tKJ aJqBA4cOUVBQQDQSYfHixRiNRkZHRykqLiYzK4sv1nzBWGCMykmVnB4aoqKinM2bN3HOgvn09PQQ CISor68nmUwSCoVYvXo1xcXFhMNhPB4PiUSC9z54n87jHYQCAbKzs7nj9jtQVIVEKoXL6eFffvVL 8vJymTlrDq+9/nr4jjvuqHxv1QeDn325/i/a/18C8+KLL/KLR37Es396+e3R0eGawoK8UkXUKSyr xB8IkozHAR1FEIil4NNPP+XCCy8kFApx8OBBigoLOXLkKB9++DGVkyaRmZGB1+MhHo+zYcMGHHYH r735BidOneTipUs5f/FiDh89AoJAT3c3DpuVGdOms2HDBgLBEKqqcvDgQQRBYPHixWzfvp2mpqZx lZamEYnHcFjtDA4Ocu/3vkcqmUIzGZAlhRdfeQWz2cp5ixaxfceOkWnTpn/3pm/fvvm/sv3/CAzA lu07eOZ3T/L8i6+sVCWW1kytygxG40Jp+SSGBgcJ+IcxqDLNbceZNWsWR48exWQycd5557F921ac ThfTpk+nuaWF66+7juwJE5g/fz59fX1omkb5pErS0tM5eOggTpcLVdPY+/VeFiyYT5rPS2ZmBo8+ +ig1NdOZOnUqmZmZ1NXVUVVVxcmTJ7n11lsB2LlzJ+eefx5bt2zhF4/+HBgfjWiakUcfewxZUbno kkv0Des3nOzo6Hjvd8889/ivHnuUTVu2/n3AAHy5dtzVbrjq8k9WffL5MrvV7LUYVAqKikgmdfoG /RRkeZBEyC8oZPfXX3OsvYOqyZOQZJm+/j46OjvIycpAkgRGRoapmVbDu++vYvr06WzZvJnysnJe euklZEmisqKKfXv3cfNNt3D9jTdhNJpRNY1Dhw9zemCAZZdcwotvvM7S5Zfw/Asv0NzcwsUXXsSx lha+e/d3sVjGtX2xWIx777uXOXPmMn36DL76am334MDAEx999sVjwP8RFPgbL4vqum679IJz9ixY sKB04XnnC+VVU4X+3j5OtTdiMI1r7sbbhjIOHDkKuo7X58NoNPLh++9x+2234XA48PjSCEVirF+/ nmPHjp1l8bKyshBFieXLl/OLx36BIivMmjWL/r4+srKyOHjwIEeOHGHJ0gvZtXMn1ZOnQCJFZnoG 0USchQsXIooitbW1PP/889x2++0giWzZsjXW3t7x1pYdO2/9a239m+5EPvbYY9Hmts7nPB7P1Pr6 A2V5udmIOjgyJtDfdxo9lSQ3Iw2zUWUsHCXtTPtvtVjIzEhj27btdHV1UlBYhKoZSEtLw2w2k0wm KSoq4tJLL8VoNHPzzTdx8cUXYzab6ersJJWI8/nqz5hcVcUly5bxxisv8cPv308yEmH27JmYzQZK yypIpVI89NBDHDp0iHvuuYdAKMTHH38arK6edt9Lr73+87/F1r/5evHvf/NrSionyVvWr//OsYbG Z2668QZyikrwelz093STjEcQBYF4QkdVVcxmMy0tLTQ1HiWlw/DwEIXFJby+4m2yMjPxnfGoQ4cO 0dbWRlXVZLKzJzB37lz27duH1WJBlURmzJiByWTi8OHDVE+pJhyJYDKZMFhMqKrGijfeZO3atdx1 1124XC6ampv56NPPuPba62oeePhHdT/90cP88t8e/78b+PcCA7Bxw1csOv9CPnjrjemvvvLSO6XF +flzFyyUpk6bSTwFTU3NWGUBp8tFKpUkHotjMKrE4nH6+/tpbT/OxPJKOjo66ezswGQy4fOlEY/H CEeCCILI8NAQ5557LocPHuSceXOJx+Mk4gnMZhP+sSSZWVkMj/lZt3kj++rqyHU7OPe88wiHw/rn n38utLa1rdl78MjSv8c++AuV71+zFp0/rnMbON23b83mHcURXV7x/J9eCb3wwnPU7duhZ2e5ke12 mjo76R8LEJEk/KEQ4VCAvNxsFi2cz4Q0J7IeRROTDPWdpCDbRzQwTHlRAUsWzufyZRdhlAXmzZlN MK6jmO2IBguoZiJCnGdffp577r+Hnu4TXH7JxVRMmsq+/Qf4zr33h6bNX3D53oNHlr707FN/Ly7/ /Y9ePPLQD/jVE7/jpw89YE3qyac//uTDWy688CK9orxCyM7OxuN2E48nOH68g3giMe4dXh9WqwVR lIjFYuNSEAFMRiOBQBBFURBEAavFSigUwj82RktLC9u2bSMUClFUWEhFRTnJVApZkti/fz+rP10z 9s2bb/rR4iWLX15w3qLYoYP1VE2e+j8HzJ/Xyrde47obb2H79k1ljzzyyDMDp7rOmzJlslhQUKhP q6kRDFYnKWROnDxBKBQiGAgSjoxfvTEaTSQScYxGI9Fo7MxlihCpVAo9lUTSU9gdDrKzs7HbbCRi Yfbt3cvBQ4eQJOlUWprvl2++98l7giAMv/3G69xw87f+2/b8wz+s89TTv+H++x7EPzqU/+wzT136 zDPP/ECWlaypU6vF9PRMiooKsdvtSJKE2WLGYrEQCUcYHR09O9Q3mc3EYzFS+rictqmpUY9EIsLx jg6amhqJR+InvV7P3isuv+LThx/52Zv/aBvgn/Qppo8/WMnl37gOgDVrPhfDsWSJGAumv73ized2 7dpZHgxGEEWdzMwM3ev1CRkZGQSDQbxeL4lEAqPRyOHDh+nv7ycUiRBLwTnnnLNFUZT6JUuWrB0Z Da2vmTYttWD+vH/G9oF/4jeq/ry2797D/Nmzzv7WdV1paG5xbtq40fXqK6/U5ORk28fGxlLJZLIS 6DUajQH/qN+QnpHelZ9feGBwcEB67dVXOgVB8P/5GZ98vIrLLr/qn7rv/w8NvZCOTzTlUQAAAABJ RU5ErkJggg== "
+ height="40"
+ width="40" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/5 dollarsoff.svg b/plugins/currency/images/5 dollarsoff.svg
new file mode 100644
index 0000000..e16f9a7
--- /dev/null
+++ b/plugins/currency/images/5 dollarsoff.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="55"
+ version="1.1"
+ viewBox="0 0 110 55"
+ width="110"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="5 dollarsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="2"
+ inkscape:cx="-9.75"
+ inkscape:cy="58.615385"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
+HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
+MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AG4DASIA
+AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
+AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
+ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
+p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
+AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
+BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
+U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
+uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCWfKqo
+XcMf3TiqcjPLkEuSOQADxVpnJABOc1RtITFqUkZuHEn3lBPyuMdD7jOcZ966Fojaaadya2iyDvEm
+PdSP1q7HaQOBkN+dRW1xNJI8VxCI5U5BU8OPUf59KsKMHPNHNoNSl3EuCbW1xErYHfrjvz+v/wCv
+FPRt0SMepUE1HfsTasAB+PaoLiRY9NchygEPDL1XjgiueW5pG+7KF9re2VobSPzXU4aRjhF/xrNe
+71FGLG8QnIBUAYB/Kk0rSWv0eQy+WiMBx1Zuv+frWl/wi5Kt5dwwz1DDOf8AOaRyzryb0ZBbapKp
+AkdZgeSUGGA/ka6K0uyiCSIgq6gg9ciuOksJrS4aORgNnXackitLRrorI1sCAhBZM9sYzTVupUKr
+l7stTpzqFwD1X8qPt92ULjy9o68c/XGaotMkWDIcAnBY9AaebhVj8sGPLY+bPPTGOvbkfhWvu2HG
+Cb2KGs306yW6xvKrzSHd5EYZiAp4AII64qXTZxNbtmaWV1cq/nIFdDgcEAAe/wCNNvDdHy3tZEV0
+JyjjKuD645FR2UcsLTzTNG087Bn2g7RgAAD8BRZmii76bFqOMFckEnHrVJYWkEqYKXDYmjbrh/4f
+0wp9QCKuXBkitHKrztPJbHb9azry7y5MUpRxCAAwGcjnB9D05HernJXMnzGhZXa3s27yysipwD0K
+tjn8x/nmrrDHtWBZ30UJAUnKsVePcCI052gH2IAAz/Efw047uGR9gbDehBH+etSkn1LXNa7EvPOE
+ZKZ2ng46r7j1+n/6i6e183TZIVXfmLCq3GeOAasAb/lHJHXjOPrUqqVUDqRke+RjOfTr71yzbua3
+ujndKW6jtbX7Njy3fBVm/wBrnIx6d8jp+Fa7i7F42IpGiBBDicgAf7uMHv1rKnEltqzGORkjyHPl
+x78KRgkAe/ce3rW7a3AKZVpXUqR+8Xafb0zyB+XvVo4JKzsZPiGDyXjmIGefM8s/ewM/0x/kVm2V
+yLe7DfPIyOEJXAJjfoc+nGfTmtrV5AtlM8kPm/JjpnHGAfbjisLR9Omur4XUgk8qLBQspwfQDnjt
+Qyqa10Nq6YxTeWGYtgFdqA7eo69Onf2FRiWGZY4mNuWGQoaIDPfscfy71NdLKZvk3YwOhf8ApUBj
+m3Z2vu6ZzJ/jWsUdSsT7WjGMIFHZRihdzjjp61CN5YApIT0P3yPyNX1gZR1FbJJbjlV0tETUA72p
+REVmYhQGGRycVzlzGsjFvMaSUOeF3AH0OOmM81t6hNh4kXGcFixPA6YGO5JxWdLZQ3sPySIJTG2w
+5xk5yMY6jr+VYcrZDfczbiRRfLAAFztaTGTg8YP8vxNXLdoAhuECssT4ZX3fIcnBGPoOcipkso5J
+nmeWOQzx5ZgBlGHtzkdiPpS2Vo9rsjaZFdyWMe4EbiemM/UfUUcrHdMtvdoliZxIzeTKAVPdGPA6
+Z78+nSrkNylzG2whvmBbPY8/4ms6Ky8o3MG0+VPEcDOdpHGM/j1/wq7BAYpY3HdNrgdCQOv6Vm1c
+tJrcZd2iTlZNkbSL03jgj0NVLee+uL57KOGCBYjgtksAMZGOnatW5mhtbd55ztRBkmsI6lLEbm8W
+JY2+VQGznOPu+55BPpjH1lXMK/La/U19RlhsrB0nlKll+U/xMR6e9S2GoQ6lZLLDwR8rqeNprlDp
+93cBru5bc7jd85wcZ7Z4xz0qK2uLjTrv7RCdw4Ei54ZfQ/0NVYypz5dDspcjOP0piM7EKMEniiK4
+hvLdJ4WJjcZGeo9j71X1KS9t7BptOVHuIcsYmTd5q9xxyD6YraMrI6paRvuRSa5Y2sckrpcvAgJ8
+9FBVyB25zz0B/kOa1oZEuLWC4VSqyxK4UnpkZrhP7Wtr/ThYGBoHlGB5oIhidhhnx27ke59zXdxR
+pa2sFur7lijVFYn7wAwDUczZzwblLUyW1DT5ODLnBB+63Y5Hb1phudOgKMgJIGBgsMDAH8gPyoor
+WOxrfmkrjEutPULsiIx0w7D/AD0H5Uq3FgJFkEB3Kcg724Oc/wA+aKKatY15I32NBJI5kWRW27hn
+aQaeGVf4gR9KKK5ZSaZV+hHdJDOqLPHvCsHUE9x3qFrSycozRZMZyu5mOCTknr1J70UUMqMIvdDX
+sbJz80eR67m5qa20W0nRkEShQOhLf40UU7WMqqUYtpGhb6QlomyAqqZzjnrUxtCDzIv5Giiq5nax
+xqpK9yq8rpIyec/y+hNMaVWA3NnHrmiiqex0p2Vz/9k=
+"
+ height="55"
+ width="110" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/5 dollarssmall.svg b/plugins/currency/images/5 dollarssmall.svg
new file mode 100644
index 0000000..91e4b3e
--- /dev/null
+++ b/plugins/currency/images/5 dollarssmall.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="27.5"
+ version="1.1"
+ viewBox="0 0 55 27.5"
+ width="55"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="5 dollarssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="18.327273"
+ inkscape:cx="29.409723"
+ inkscape:cy="16.205357"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+<image
+ y="0"
+ x="0"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AG4DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCWfKqo XcMf3TiqcjPLkEuSOQADxVpnJABOc1RtITFqUkZuHEn3lBPyuMdD7jOcZ966Fojaaadya2iyDvEm PdSP1q7HaQOBkN+dRW1xNJI8VxCI5U5BU8OPUf59KsKMHPNHNoNSl3EuCbW1xErYHfrjvz+v/wCv FPRt0SMepUE1HfsTasAB+PaoLiRY9NchygEPDL1XjgiueW5pG+7KF9re2VobSPzXU4aRjhF/xrNe 71FGLG8QnIBUAYB/Kk0rSWv0eQy+WiMBx1Zuv+frWl/wi5Kt5dwwz1DDOf8AOaRyzryb0ZBbapKp AkdZgeSUGGA/ka6K0uyiCSIgq6gg9ciuOksJrS4aORgNnXackitLRrorI1sCAhBZM9sYzTVupUKr l7stTpzqFwD1X8qPt92ULjy9o68c/XGaotMkWDIcAnBY9AaebhVj8sGPLY+bPPTGOvbkfhWvu2HG Cb2KGs306yW6xvKrzSHd5EYZiAp4AII64qXTZxNbtmaWV1cq/nIFdDgcEAAe/wCNNvDdHy3tZEV0 JyjjKuD645FR2UcsLTzTNG087Bn2g7RgAAD8BRZmii76bFqOMFckEnHrVJYWkEqYKXDYmjbrh/4f 0wp9QCKuXBkitHKrztPJbHb9azry7y5MUpRxCAAwGcjnB9D05HernJXMnzGhZXa3s27yysipwD0K tjn8x/nmrrDHtWBZ30UJAUnKsVePcCI052gH2IAAz/Efw047uGR9gbDehBH+etSkn1LXNa7EvPOE ZKZ2ng46r7j1+n/6i6e183TZIVXfmLCq3GeOAasAb/lHJHXjOPrUqqVUDqRke+RjOfTr71yzbua3 ujndKW6jtbX7Njy3fBVm/wBrnIx6d8jp+Fa7i7F42IpGiBBDicgAf7uMHv1rKnEltqzGORkjyHPl x78KRgkAe/ce3rW7a3AKZVpXUqR+8Xafb0zyB+XvVo4JKzsZPiGDyXjmIGefM8s/ewM/0x/kVm2V yLe7DfPIyOEJXAJjfoc+nGfTmtrV5AtlM8kPm/JjpnHGAfbjisLR9Omur4XUgk8qLBQspwfQDnjt Qyqa10Nq6YxTeWGYtgFdqA7eo69Onf2FRiWGZY4mNuWGQoaIDPfscfy71NdLKZvk3YwOhf8ApUBj m3Z2vu6ZzJ/jWsUdSsT7WjGMIFHZRihdzjjp61CN5YApIT0P3yPyNX1gZR1FbJJbjlV0tETUA72p REVmYhQGGRycVzlzGsjFvMaSUOeF3AH0OOmM81t6hNh4kXGcFixPA6YGO5JxWdLZQ3sPySIJTG2w 5xk5yMY6jr+VYcrZDfczbiRRfLAAFztaTGTg8YP8vxNXLdoAhuECssT4ZX3fIcnBGPoOcipkso5J nmeWOQzx5ZgBlGHtzkdiPpS2Vo9rsjaZFdyWMe4EbiemM/UfUUcrHdMtvdoliZxIzeTKAVPdGPA6 Z78+nSrkNylzG2whvmBbPY8/4ms6Ky8o3MG0+VPEcDOdpHGM/j1/wq7BAYpY3HdNrgdCQOv6Vm1c tJrcZd2iTlZNkbSL03jgj0NVLee+uL57KOGCBYjgtksAMZGOnatW5mhtbd55ztRBkmsI6lLEbm8W JY2+VQGznOPu+55BPpjH1lXMK/La/U19RlhsrB0nlKll+U/xMR6e9S2GoQ6lZLLDwR8rqeNprlDp 93cBru5bc7jd85wcZ7Z4xz0qK2uLjTrv7RCdw4Ei54ZfQ/0NVYypz5dDspcjOP0piM7EKMEniiK4 hvLdJ4WJjcZGeo9j71X1KS9t7BptOVHuIcsYmTd5q9xxyD6YraMrI6paRvuRSa5Y2sckrpcvAgJ8 9FBVyB25zz0B/kOa1oZEuLWC4VSqyxK4UnpkZrhP7Wtr/ThYGBoHlGB5oIhidhhnx27ke59zXdxR pa2sFur7lijVFYn7wAwDUczZzwblLUyW1DT5ODLnBB+63Y5Hb1phudOgKMgJIGBgsMDAH8gPyoor WOxrfmkrjEutPULsiIx0w7D/AD0H5Uq3FgJFkEB3Kcg724Oc/wA+aKKatY15I32NBJI5kWRW27hn aQaeGVf4gR9KKK5ZSaZV+hHdJDOqLPHvCsHUE9x3qFrSycozRZMZyu5mOCTknr1J70UUMqMIvdDX sbJz80eR67m5qa20W0nRkEShQOhLf40UU7WMqqUYtpGhb6QlomyAqqZzjnrUxtCDzIv5Giiq5nax xqpK9yq8rpIyec/y+hNMaVWA3NnHrmiiqex0p2Vz/9k= "
+ height="27.5"
+ width="55" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/50 centsoff.svg b/plugins/currency/images/50 centsoff.svg
new file mode 100644
index 0000000..2992ae5
--- /dev/null
+++ b/plugins/currency/images/50 centsoff.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="80"
+ version="1.1"
+ viewBox="0 0 80 80"
+ width="80"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="50 centsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-230.56607"
+ inkscape:cy="136"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3361"
+ xlink:href="data:image/png;base64,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 "
+ height="80"
+ width="80" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/50 centssmall.svg b/plugins/currency/images/50 centssmall.svg
new file mode 100644
index 0000000..533e287
--- /dev/null
+++ b/plugins/currency/images/50 centssmall.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="40"
+ version="1.1"
+ viewBox="0 0 40 40"
+ width="40"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="50 centssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-57.06607"
+ inkscape:cy="190"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="0"
+ x="0"
+ id="image3046"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAABGCAYAAABxLuKEAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzFvHd4nOd15v17p/eCGQxm0HsvBEgABKsoS1QxLVmWKFnlkpPYGzubbKx8u+usY3uz9rXZbK6N S75PXjfFyWfRkqxmMbJEmqQoUiwSSKITvfcBZgbTe3n3D4BvHMstLtnnL4AAhu9z5nnOuc9932cE /o3X8tw0JZU10venXn+jc25udn82mzsokwn+surqVzp27x4qcjnXbv3O4uwUZVW1/6bPKfwuX3x6 aoya2kbpe1EUZSf+4Rmtw+HonJubO3H16tWiZDKJXq8XLRaLsLW1Ja6urQn5+fk0NDTQ0NDwHYvF 8u3V1dWx++67L5nncGUBpseGqWls/V0++u82MLAdjL4b7z0xPDD48HuXL+9aX193CjKZvKuzk46O DrGwsFAQhO3HUCqVxFNJIpEIM7OzjI+NMTo6CoKQqamu9nZ0dMzce++9f+4oKrv6u37u3zgwA/29 tHd0/4t/u3H96l03b97s7OvrOxgMBo8GgyHybXk0VFfT0NCIPd+OVqtFp9WRSCbQaDTodDqi0Shq jYZoNEomnUatUROJRAmFggwNDjE1PU04HCIjKDGbzRdLSkpGDhw4cO7AwcM/EgQh+5vu5SfXbxSY iYkJ6uvrmRwf7pmfm7XNzc93zc8vfGFmdgaZTEZLcwt19XXs2b0HlVJBJpFABFQqFV6vF4fDQS6X Q61SMTU9jdPpJN9uJxAIkE6nCQaD2O12NBoN8XgcjUaDXCZj1ePn2rVr3OjrE+OxmKDWaGhpbp7Q aTVf+MM/+pOX/68GZm5ujsrKSkZHR10v/eB7feNjY06bzSZ86EMfwm63Y7FYEASBdDqN2WxGrVIh 5kRyuRzhcBiZXI5apQJArVbz8ssvc+TIEYx6PQButxubzYZSqUSpVCKXy1Gr1SQScXKCklAohCAI yGQyPB4Pbrebt956i+bm5tMf/+S/v+f/WmC+8IUvcO+99zpfffXVgfJSh7O5qRG9Xo9OpwPAbDYj k8kIhUKcO3eO9XU3Bw8exuUqpKSkhIWFBQoKChBFkXQ6zcmTJ+ns7MRqtpDL5bBYLExOTuJ2u4nH 4yQSCdbW1rjjjjuob2j85wDLZIiiSCwWQ6/XiydOnBAUCsW1//qlv+oeHR2lqanp19qf/Nf5o96r F3niyd8zfeUrX50tLSuzHdq/VzCZjOh1OtRqNdlshlw2xwvPP09fXx+V5eXcduQIwUic5eUV3Jse HAUFKNVq0tkswVCY0bFxtFodedY8NBodiUSCCxcvkk5naGpu4Y4778RoNPH88y+gUiqoq6sllUpi MhlRq1Rk0mky6bSwe3cHbvd6Yffent3Hjz/8/ML0OF/7/77+r96j7NcJTDQSN//hx598p6I037S/ u0Uwma2YzHbSGYjF0xQ4S/j+cy/Ss+8QZms+RrONiopqGmprUMpl+DY3eOP1f2JmYpxsKolSJpCf ZyUWDqHTa0lnkrx1/hwbm25a21owmQ3EEzEGBvs5fNshEGRMz8wiVyhJJFMEgiEMRhN6g5F0Jsud d90t5JKRD371f37px+U1Db/OFv91V+mZb36LO+44qPi7v3vabc+32R5//FH0ej2hUIRcLserr77K ww8/zEsvvURTUxNKpRK9Xo9Go8Hn89Ha2srCwgIbGxtEIhHm5+epqqpibGyM+++/n/n5eZaXl8lk MgB0dXVRWVlJf38//f391NXVUVVVxfqam/n5eZxOJ3q9nr1795LL5QCIxWIEg0GKnA5OfP/7xBPJ qc9/8a/q5qfGqPgJTPVbC8wrP3iRjzx83PTpP/73fRaLufrRxx5Br9fuJEc1P/jBD6iurmZ5eZn8 /HwymQzLy8scP36c5eVlVlZWqK6uxmg0cunSJVpbW/H7/SSTSVQqFcFgkPPnz/Pkk09y/fp18vPz KSgoIJVKEYlEEAQBpVLJ2toaJcWlZDIZ6ecAPp8Pt9uN0+mko6ODXCaFXC7npZdfIRqNXv78F//q YH/vFTq69/92ArM0N09pZQWiKFo+8//82axMJlgfe+xRIZNNMzjYh1yuoKioGJPJTCAQIBAIkMvl KCgoYG1tjcbGRkpKSnj33XcxGo1UV1czNTWFy+XC7XZz/vx5CgoKEASBZDJJKpUiGo3ywAMP4Pf7 KSoqYmVlZbusq9UoFAp0Wr1Upfr7+9na2sLlcmG1Wpmenqa+vh5XQT4yQUChUvPKK6+I8Xi89/Nf /Kue0aF+mto6fmlgfmmOKa2swOte0zz1J38yIpfLrR/96CNCOBxmenqampparNY8AoEg8/PzTE1N sbi4iFarJRAIsL6+jkql4uLFi1y5coWxsTE2NjZIp9OcOXOG5eVlPvWpT1FaWsrQ0BCCIHD06FGa m5sZGBggGo2SSqXwer2oVCqSyST5+fl4vV7efvttXnrpJeRyOaFQiPz8fCYmJrj99tuJRCJEo1E0 Wi1bW1s89thjgkql6v7cn/+nvsbW9t/8xLz5+qs47E799587saDX6+333XcfWq0WjVbNwsICPp+P 69ev8+lPf5pMJsM777xDPB4HoKOjg+HhYRwOB9FolObmZi5fvsza2hpKpRKVSoXJZGJpaYmysjI6 OzvJZrNcvXqVZDKJzWbD6/USiUTIZrPcc889mEwmAOZm56msrCQQCPD222/T3d1NeXk5169f58iR I8hkMkaHB1EqlTQ2txAOhxFFkfd6rzE6MTnzv/72KzWTE2PU1f/8nPMzy/XQ0BDf/OY3+c4/PFv8 //7d/xqTK+T5Dz74EeRyGfZ8O9euXcPhcKBUKgmHw9hsNjQaDWVlZTQ1NWE2m3n55W0A2tPTg8fj wWq1Mj8/zwc+8AG0Wi2HDx+mra1Nwj5+vx+Xy4VOp8Nut7N//360Wi0dHR24XC4ymQw2mw21Wk00 EiUWi1FeXk4wGGRwcBC1Ws3o6Citra1YrVYEQeTylcsolCr0O6CxsrKKQCiU19zUuP+jjz7+7C86 FO8LzNmzZ9m3bx8zMzPNf/M///qUTi0vfuSRh4V0OonZbKK39z3S6Qxer5dwOExTUxOZTAatVovd buf8+fO8+OKL3H333VRUVBCLxYjFYpjNZinnjI2NoVarKS4uZm5ujqWlJVKpFIFAALVazdraGpWV leh0OtxuN8XFxcTjcfr6+lCr1QiCDKVSKb0ZlZWVZDIZBEFAq9WysLDA2uoK1dU1TE/PUFNTg1qt JhaLU1xSyubmZkVH+67ay5evvPqdb32T13/0o18cmPm5GXbv6eTs2bN//Morr/xvtVpTft+HjgqJ RBy93oAobgcuP99BPB6np6eHeDyO0WhErVZz/vx5Njc3+dM//VOmpqZoamrC5/MhCAImk4lkMkko FMJgMJBMJpmcnCQcDhOJROju7kav1xOPxzGZTESjUZLJJAUFBWQyGQYGBqioqCAQCJBnzSMWi5HN ZlEoFBQWFnL+/Hlqa2vR7DShBQ47Op0OhVKJWq3eaSsU6A1G6urqBLfb3frggx+p+8QffvKVn3Vi 3pdj4tGw/lvf+N/XE4lkw8GDBzAYddKJMJstDA0NkZeXh0wmY319nV27dnFz5CYlJaWYzSZAYGFh no2NTSKRCF1dnUzPzFBeXo5cvv1Ov/3227S1tREIBDh79izNzc3EYjECgQBKpQqlQsHtt38AnU6H z+cDIBgMUljowu8PkEwmKSkpwe1209XVxcTEBENDQ+zfvx+r1Uoul2N+bg4AjVbLzZs3USqVtLe3 o1SpEBBIpVPilcuXhUcfftA+MTWV2733kP8n4/C+qnT9Wu896+vr9bt3d5Bvt6FWaygocOL1+hga GsJoNJJIJEilUuh0OgYGBigvr9ipDttJrqqqGr/fz65duxgfn0Cj1pBKJrHb7RiNRmZmZgiHw6yu rrJr1y4aGhro6elh7969HNh/gFxOZGFhgbm5Ofr6+nA6nTidTjQaLQBarZbNzU3pRL755pvk5eUR CoWkk+R0uRgcGpIYAK1Wy+XLlzGbTPh8XpQKhbB//z7xwoUL3pa2XfGfjsP7ArOystpoNpsFu91O JpPB5XLx2muvMTY2xqlTpxgcHGRsbIxEIoHP52N8fByHw4FWqyUcDqNQKNjc3GTv3r1SZ722tkYo FMLj8WDJy6O1pYWvfOUrNDQ0YLFYmJ6exu12s7q6itvtZs+ePWi1Wnp7e5HJZGg0GrRaLaOjoyws LCAIAiUlJcTjcd555x0KCwuprKxELpej1+tRqVScO3eO9vZ2mpubmZ6epr29nYKCAgYHB9Hr9QSD QSxmszAyMiJOT07+u1+YY1aWFx3Xr1//740NDa7S0lJUSgUDQ4MYjUa8Xi9PPfUUS0tLdHRsA6Si oiLeffddWlpaCYVCuFwuotEoSqWSkZERstksFy5cwGg0snv3bra2thgcGKC4pITbb7+dL3/5y5w5 c4Z0Os2NGzcYGxtjeWmZ06dPMz4+TldXF4cPH+bq1avMzc1x5MgRZmdnUSgUlJWVoVarmZyc5NCh Q+Tl5VFYWIjP5+PKlStotVr8fj+JRIJQKCRVv/7+fqqrqxEEATGXIxQMCMlU+uZzL7x09idjobj1 xcL8LPF43Lm+vt6+b283oigCcKOvj9KSEmpra4nH4+j1epxOJ4lEQkK52WxGqgYulwu9Xo/FYqGw sBC1Wk1jYyPT09MUFRdRUVHB+vo64+PjfPKTnyQQCLC1tUUymcRisZBMpMjLy5O4mImJCR544AGi sRjjY2OUl5ejVCoxmUzMzc1hsVjQarXo9Xrm5+e5du0aKpUKpVKJ3W7H5XJRVFREPB6nvLycs2fP otFoSKVSpFJp7rzzTk79+Gze5NSYta620f++wJRXVPHiD54/Go5EUKlUpNNpwqEgSoWC5uZmrFYr U1NTFBYWkkwmkclkVFRUoNfrWVxcora2llgshs/nw2g0AtsNnUwmo729nb6+PkRR5MyZM5SVlWE2 m2lsbESpVKJQKNja2iIYDFJZUYVSqSSbzRIOh/F4PLzyyivkcjmKi4vZvXs3Z8+epaOjg2AwyN69 ezl79iwFBQUSXgoGg3R2dmI0GvH7/Xg8HpqamhgZGcFoNJLL5ZDJZKh0WrLZLIlE8uPFJcWf+5kn BmBqampPUdH2u6xSqZDL5QSDQWZmZrBYLBiNRuz2bYBnNptxOBxUVFTQ19dHW1sby8vLiKKIRqNB EISdtqGGVCqFyWSiqKiI4eFhhoeHUSgUZDIZAoEAoVAIm82GKIoM9A9SWFi4/fXAAFVVVfh8Prq7 u6UOuqCggFAohN1uJx6PS8g6l8sRCAS4ePEibreb5eVlwuEw99xzD9PT0yQSCRwOB8FgEJVKhX8r Qr7NSjqdIplIat+XfKcmxwHw+XyV5WXlKBQKRFGkoKCAlpYWGhoasNvtrK6ukk6ncTqdrKys4PF4 kMlkUkXY3NykqKgIhUJBIBBAoVDQ2LgNu3O5LCqVitnZWZRKJU6nk66uLjKZjNQHhUIh/P4AgiBw 5MgRDh48iMVikSqNWq3G5/ORy+WIx+PSVQW4evUqly5dwu/3c/ToUUwmE1VVVfT09PCjHQB38OBB amtrSSQS29fRbCaZTFJcXMxrP/zh594XmNq6BtbXVmozmUxnUXEx6XQajUbDxMQEs7OzLC4uUlxc TFVVFb29vRgMBrq7u6msrEQmk0l0wO7du/H5fIyOjpJKpZDJZGxsbLC2tsZ7vb185Stfkbpqi8VC NptFFEWsVit5eXm4XC7sdhuZTAbDznWMRqPo9Xp6e3s5ffo0brebjY0NBEEgm90WBqqqqmhsbGT3 7t3k5eURDAbZ2NhgamqKiYkJenp6MBgMBINBRkZGiMfjjIyMkMtuB7iyspLNjc169+aGdGqkqzQ1 NXmPAJiNBlQqJaOjo5x643WOf/RRcrkso6OjlJdXUFdXx82Rmzh3+pqNjU0OHTxMb28vCoUCo9GI 0WjA6SwgGAzt5BwD6XQKjUaD0WjEZrNx6dIlEokEBoOBaDQKIGEjk9nE3z/zHdRqDXK5jLw8K6FQ mHxHPtFolGg0SjAYxGQyYTAYUCqVBAIBotEoOp0OnU6HzWaTXm9hYYF0Os3MzAxdXV2o1WqpotVW V6AzmDAbTQdSsVAxMC0FRhRF4Zlvfv3jJYUuBDGHVqNhcGCA//hnTxFL5dBo1GxubvLOxXewWCzY 7fnYbduQu6y0DIfDwUc/+qh0xDPpFKKQw+vzUl1TRSQSZmNjnYqKKmKxGK2trczMzHDz5k2qq6tZ WlpieHiYVColXb8HH3yQixcvEgwGcblczMzO4A9sUVFRTkdHB9FolHg8jkqlor29ncHBbVjhcrkw mUwoFArkcjler5fR0VG02u1Ee+PGDXw+HwcPHmRtbY2qilKi0ThWs1Gcn524kI5vFSu1eaJsYnyU 0dGbwsDAgKuiokIUBAG5XI5CqeDUqVP09r7H4OAgU1NTeL1e5HI5crmckZERLl68yIEDBxAEgUQi QTgcRhAEFEoFsViM1dVVXC4XwWCA6upqRFEkEAhw6dIlfD4fZWVlrKyskJ+fT1tbG/n5+ezatQsA k8nEjRs3yGQyLC0tSZ33ysqKdB0FQZAklNraWpRKpfT/zs3NkUqlsFgsVFRUkMvluO2229i1axct LS3Mz8+j0Wgwm81kMhny8x3C6OiYYnl5WQ4gq29oIhjwH4onEtbS0lJBqVQSDAbRajTY8/MBgVgs Rjqd5oEHHmBpaQmPx4NeryeZTG4HUaGUjrdcLpfoyFgsRiKRwGaz8+CDD7GxsSGRT1arFZ/Ph0wm I5lM8t577xGNRvH7/aRSKXp7e3E6naytrbG0tMTly5fp6enBYrGgUGxnAK/XKzWwBoMBh8Oxg09S ZLNZBEFgfX0dtVqNXq/H6/WytraGXq/HaDSy5d9icXERmUzA4XDg8Xi08UQyD0AmiqLM4/U+UeBw yPV6PYIgcPHiRWQyGVaLhcbGBm6//XYOHTpEf38/BoOB22+/HZPJRFtbG4lEgnQ6LYGqdDpNKBQi GAySzWaJxWIIgsDW1hZarZaysjIymQz33nsvR44cYWNjg2AwiNPppLCwkGg0SjabZWFhgbKyMh56 6CEOHDjAoUOHiMViyOVyIpEIcrmcdDpNJpMhm82STqfRarXkcrltqXcHckxPT0t0xC3Q5/F4tnFR UTFjY2NoNBpAJD/fbvT5th4EkHk9G0b3+vrHm5qaRL1eh1arxePxcOjwYeYX5kkmU6ytrWEymXA4 HJSVlZFMJllbW0Oj0TA6Oiphhng8zuLiItFolFAotI2cb9wgEtm+Yna7nY2NDfR6PdlsFpPJJAGz wsJCJicnsdlslJeXc+zYMbLZLGVlZWi1Wvbu3UsikUAmk+Fed5NMJvF6vaTTabLZrMQJOxwOdDqd BOIKCwsJBoPk5eVJ/Vh1dTXj4+NEY1FmZ2dJpzOk02nKysoIh0O7ABRut7tmYWGBe+46KkQiUQwG PTKZDIVCgc1m31EUBS5cuIBSqWRpaWnbgcC2tJrJZKSjGovFyMvLI5GIodPpkMvllJSUMDExzurq Kl7vFul0mqqqKuRyOeFwGLfbjVqtxmQyodVqSafTLC8vI5PJkMvleDwenE4nY2NjjI2NUVhYSHVV jaRABgIBDAYDOp2OVCqFSqWisLCQXC5HOp2mvLycra0tBEEgHA5jNpvp6+tj//795OVZiYYCyOUy DAYDBQVOZmbmPjwy0P8Fxebm5p9tbW2JZpNZUKm3aUCFQsHC/AJWiwWfz4sgCBQVFUkgC7YbSKVS SVFREblcjlwuh2pHi1apVOh0OoqKimhvb2d4eIja2lqczkLeeOMNCb1qNBpsNhurq6vMz89TW1tL VVUVoVCI0dFRNjY2eP755/F6vTidTil/FRcXo9VqSSQSBINBCTUDUjsBkM1mUe4QVel0GpfLRTab pbW1lVwux7Xea7S0tJBKp9EpNCiVSvyBgEOl0hplmUxGl5+fL+TEHGIuh8fj4fbbb2dsbAz5TslT qVRsbm4yPj6OVqtlaWkJs9m8c6psEq2o1+sJBAIEg0EUCgXJZHLb8xKPEY1GSKfTUmWQyWScOXOG SCRCeXm51PG+/fbbXL16lbfeeguLxcLhw4fRarVMTExgsVhoaWkhFAqh0WgkUv1Wok2lUoiiiEwm I5FIEIvFpJbh1lVTqVT4fD6mpqbYvXubTxZzOWKxGACZTFpcXVt7RiaTyfwWi0VMJpOk0mkMegOV lZU89NCDzMzMMDY2JvEf7e3tlJaW0tXVRTabJZVKEY/HcTgcFBYWIpfLd5g6OTkxh9FoJJVKodfr iUajDAwMSP2N2+1Gq9WSyWRIJBISNjlw4AAmswmr1crq2jY/s7KygsViwePxcPPmTQwGAxqNhlwu h8vlklwVmUyG3M4mt7a20OsN0pUXRRG9Xk8kEiEYDFJQUMD582+j2uGObTY7qVQKZ4FTyGSyF+Sf +cx/vrmyuvppp8uJQqVEppQTiUbQ6nRYrWaGhkd5992rRCLbMuyVK1doaGjY6X9y6HQ6Mpk04XAI nU6LWr2tKm64N9FqdRgMRoYGRygrLScUCrNn9x6WFpdQq9QE/AHCoTBVlVXMzs7h3/Kj12hwOpx4 PR7seTYsZgs11TXU1daxt7sbjVqNRqtFEATJCiKXyyVFM5PJkMlk8Po8WK0W5Ao5SpUSmULG6OhN AkE/VquFZDJBNpclmcmQZ9JDLolCLicnU+Hxev6DrLm5dclut5NOp0RR3O5eFXIFk1NTfO973yMa jfDQQw9RX19PSUkJGo2GZDIp5ZVAIIBer8dqtWI0GjEYDJhMJvx+P36/H6/XSzQaYWFhgaKiIiwW i8S0iaJIS0uLBAMKC4tYd7tRKBXkcjm0Wi2Li4uoVCpmZmYwGo34fD78fj+Li4vI5XKi0SgejwdR FEmlUoTD4R08FJDggyAIJOIJSktLicfiFBcXo9FoCIVC3Lx5c7uvE2Ssr7sRYL6srNwtEwQhbTQa /8Ln8wkymYxYNEoikWCgv5/77rsfi8WCw+GgvLxcojBvnRa1Wo3VakWhUKBUKhFFkWQySSwWw+12 S8HT6/UkEgkWFxeZnp7GZDJJ+GN0dBSXy0VpaSkGg17KH6lUiueeew6DwUAgEKC0tJSTJ0/S1tYm 5ZTR0VH6+vq4evUqP/zhD5mfn6e3t5fXXnsNo8GAKIqIokgoFCKRSDA4OMjExATpdFoq6el0GlEU EWQylhaXSaZSL+/bf8CrADCbzYMji/OUlBSj02qJRqPk5eWhUql4/PHHOX36NOl0mry8PDKZzLbl Sy5HoVCgUCgQBEG6x7FYTMIwBQUFlJWVIYoi0WgUURR59dVXcblcFBcXA2C32zly5AiTk5NYLBYq Kyvx+XxUVVVx11134Xa7GR0dxWKx0NnZyblz52hpbaOtrY2rV69yC5RubGxw5coV2tra+PCHP4xa sw3u0uk0yWQStVqN3+/nwIEDtyiW7eBkRcxmK7lsmkw2i1ar3ZKaSJPJdC0ajW3lcrk8BGE7Y+/Z w8baKv/0T6+Ty2UpLy8nFovhcrkkzkIul5PNZkkmk4TDYalX8Xg8JBIJRkdH2bdvH3V1dYyNjaFQ KHA6nSiVShKJBLlcjqqqKmZmZti1a9f2ayXiJJNJLl68yOTkJKWlpRLRtbGxgUqlIj8/H7fbTW1t Le3t7ZSXlzMzM8OlS5eIxWK88MILaHUaPB4PSqWSgoIC1Go1Xq+X2267jUgkQiAQIJvNUVlZiVKp ZMO7icVi9Tts+V+XAqPT6QMWiznj8XhFl8slBAIBnE4nyWiEBx7YQzKZYH19HZlMxvLyMiaTicrK SvLy8iT10OPxsLm5SS6Xk3LQLapz//79EjczPT2NRrP90MlkEo1GQ11dHbAti9wCl3a7ndtuu42T J09SV1fH1NQUZrOZyspKioqK+Ju/+Rvuv/9+IpEIHo+HtbU1iTINBAKUV5QB8PTTT7O2tkYmk6Gl pYULFy6wb98+xsbG6Orsort7L4lYGJ9vSywqKpKvL68mYUcl+Iu/+CzJZFzldq9/oKamhlw2iz8Q QKfV8sILP+D8+fNMT0+zvr5OdXU1vb29dHZ24vV60e3Yy1Sqf9aIp6amEASBJ554gqeffprGxkZm ZmY4dOgQ6XSao0ePkslkiMfjhMNhzp07h1Kp3JFrt/OQwWAgk8lgNpsRBIGGhgb0ej2HDh3izTdP UVxcTGtbG3Ozs+Tn5zM7O0tZWRn5+fnU1NRw4eIFKisrWVhY4IknnuDgwYNoNBq2trbo7+9HFEUe eug46XQWISeysDAvFDidH+s+fPvwF7/4xW0Gz+UqFMvKys4GgyFEUaS+vp6hwUFKSkpoa2ujs7MT h8OBw+FAEAR27drFlStXsFgsKJVKKe/odDopcWq1WkRRpKuri6997WtSFbnjjjtQKpWUlJQgl8tx u92UlJQwPj7O+Pg4fr8fnU5HOBxma2uLffv20dPTQ3d3N0tLS3zuc59jfHychx99FJVSSX19PXK5 fPuEJ5NEo1GmpqZIJBIA1NXVUVNTI70J+/btQ6vVcvToUURRlHrAeDxGwB8y3zJjSwye0WhclMtl ntXV1fxCp5N4PM7q6iqtra0sLS1JQlU8Huexxx7j1KlTfPe738VgMHDo0CGJt43FYvj9fvbv349C ocDhcHD//fejVCr59re/jV6v57bbbiOdTvOxj32M1dVVpqamdqyqCfQ6LVqtlsLCQlwuJ3Z7PgMD A5w4cYLq6mqefPJJ2jt28/yJE9TX17OxsUF1dTUajYZ0Os3ly5cpKSnBas3DUVCAXC5nfHxc4qQP HTrEsWPHGB8fp6amllAojDsYIJVK9TU2Nb8k5U/Y9vyXV9REjx071pVMJBvteTacBU5u3rxJaVkZ TqdTMucEg0EqKiooKipCpVLx+uuvk++wIyKyurpCMpVk5OYIxz50jEzYHuZkAAAOzElEQVQmzcBA P42N9VisFkwmM9XV1Zw6dYqBgQFsNhsVFRXU1tZSXl6OxWJh9549VFVVo1KpOXPmLH//3e+iUqn5 4pe+RHt7B8FQCK1WS3NzM6dPn2b37t3Mz88zPT2Nx+OhsrISm83G4sICroIC3r16larKSjRqDTNT U1jNFpwFTvpu3KCpsQG5TGTo5k3Rku9cbO/sluydMkAahHA4HNn19XURoKKiQvLIZTIZWltbMRgM 1NfX79CbdmpqaqioqEAuV7C0tCQ1kA6HA5vNxuzsLE1NTcTjCWQyudQ4tra28gd/8Af4/X7+9m// lhMnTpBIJMhms5w9e5bPfvazvPHGG9x999088MAD7Nmzh9OnTxMIBLBYLJJ6ed9997G+vk48Hken 09HU1CSRUKVlpbz00kuS4ai/v5877ryTaCzGlStXJCy24/8TysvL3q8S3FplZWV/l81mBbVaTSgU orW1lcXFRZLJJCaTidraWnp6esjlciiVStxuNw0NDfT399HU1ERDQ4Ok8SSTSYaHh6mqqmJlZYW1 tTUUCgVqtZqenh4KCgro7Ozkj/7ojwiFQly9epWLFy9it9v57Gc/S35+PktLSywvL/Pcc8/R399P PB4nGAzS1tbG0NCQZLC+RW4VFBTgcrkYGxtjfm5OEvKeffZZ/H6/JL2YzWaqqqoAQXKVRmNR/9TE 5M8OTEFBwXKebZvQ8fm2qKio4OLFi8A/q4o+nw+VSkUkEmFjY4Pdu3fjdrvZ2toiFosxPT1NU1MT 8/PzNDc388Ybb1BVVcX42BilpaUAhMNhvF4voVCI2Z2qct999/HUU0+RzWYxGo2YTCaWl5ex2Wx8 5jOfoaOjg3PnzkmYJBKJMD4+zj3HjuFwOCTn508iW1EUcTgc3HbbbTz55JM71IeT0dFRamtrMRj0 rK2tYbZYlhRKhbu2vu5nB0YQBH9xUTErKyvo9TrS6TTHH36YgYGB7Y45l8NkMpFKpbDb7SwsLHDy 5ElaW9tYXFwkm80yt/NO/aT2s7m5SU1tDU899RSvvfYa//iP/8izzz7LyZMnefnll1GpVExOTjI3 N4dKpeLs2bN0d29PtBw7doylpSU+8IEPEA6Hpdc7evQoKpWK50+ckNTOdDpNa2vrjosrjkKhkFjC gYEBvv/97+Pz+Th+/Dg63fb+hoeHxUw69ebujm73z71KpWUVUVEUnwkGgzt8ixxbXh5DQ0PE43Fk MpkEwK5evYrf7+djH/sYxcXFJJNJ4vE4JSUlRKNRyWLW2dnJ/Pw8SqWSvXv30tbWxkc+8hE+//nP 89hjj/GXf/mX6HQ6LBYL8Xic/Px8ysrKiEQi7N+/n+npaVZXV3n66aeRy+XMzs5SUlLCxYsXaWpq wmAw4Ha7UalUUjO5uLgocUKTk5P09fWh0Wg4duwYNTU1tw4BSqWS6elpobi45DI/td7njzEYDMvF xcVMTEyIGvU2JnnkkUc4efIk6+vrpNNpVldXuXLlijQqs7i4gEajkcpzMpkkkUhQXl7O9M64zerq Gk6nk5qaGtLptNTwGQwGysrKsNlsElFdW1tLJBKRbGw6nY6jR4/ykY98hIWFBVQqFevr67z99tuo VCrJP+P1evn6179OR0cHBQUFBAIBNjY22NzcpLi4GJvNRjabRSaTYbPZcLvd7N+/n8Gh/qGB6+/9 /MD03bhGPBJ+WqfTfSweT+De2BBvAbbHH3+c69ev8+Uvf5mvfvWrkpvya1/7GqFQSHIZGI1G4vE4 8Xic4eFh9uzZQzKZpKmpEUEQGBsbQ6/Xc+XKlW2PnEJBNBplaWkJhUIhUZWhUIiZmRlyuRxlZWVs bm6iUCiIx+MSEV5TU0NLSwtra2sSU1ddXb3jAt2ivb2d6upqDAYDarUamWx7uzabjfn5efHmzdHc 4OBg8ON/+B8m2zv3/ovA/Au3w+49XQBbZ0/96FmHIz+7urp6QpArENjuYx555BFEUZSMPMePH+fS pUtMz0xJD11eXi5pPHV1dfT19UmiVkVFBRqNhkwmw+7du7FarQCk02mJCVSr1USjUTY2NiQDdWlp qST2qVQqYrEYarWac+fO4XA46Ozs5PTp09TV1VFfX8/6+jqOggKCwaDE1m1tbVFVVYUoiqyvrzMw MCCYzaYT1dXVvycIQu6XXiWAO+85Jsbj8dNKrf6xpe1yLYbDIRKJOCqVkrXlRbKpBC8+9yxmvQaj Xo9GrSGbyRLwB3A6CnDkOyjId1BTXY1Bb2B4aJj//x//gW9/61tsuNcpLSkmEg7h9XpYXJhncWEe EBEESKWT5MQsoXAQuVzGlt9HQ2M9IyPDyOUyNBo1ao0Km92GP7DFzdGbqDUqDEYD5946y+joTcRs BoVMgB2XRWlpKdmciM+3JY6MjeMsKn5ao1I/9cEPP/y+oMAvmFf6z3/+X+I9+/bffOKxj7YEg8FG p9MpKuRyYXV1Fb1OiyjmqKooZ3hoCK1Oj81mx+v1sr6+zptvvkk6leLGjRtsuDdIxONUV1Vx8OBB UqkkJ0+eJBQK0d7ezsrysmQDs1gsLC4tYjKZWF1dpaioiNW1VQoLCzGbzahUKubm5igqLmJubo6m piaam5uJRiMsLS2h020bpp0uJ56NDRRyOdlcju7uvdtEfTAknj9/XjCYTH9fWlb+X4KRaOD7zz3/ M/f/c2cJmpubAairq/tEWVnZvVNTU0IymRTz8qwcOXJE4jQOHjxIXX29pCXf8s3J5XJ+//d/n8bG Rtrb27l+/TpvvvkmHo+HI0eOkEwmeemll7DZbEQiERobG5HJZGQyGeRyuURsl5WVSTCgsrISg8GA IAioVCqWlpYYGhoiPz8fURTJZDJ84xvfYGhoCJvNRn19PQ8+dBxbXh5yuVw8feoU1TU1ny4qcPxx PB4P3vvBD/287f/iIYuluWmq65sC2Wz2xwqF8q+nZ2YFEJhbWOLuu+9mZW2dH589h8A2IX2L89Vo NJSXl3P58mVEUeT1118nlUpRWVnJo48+itVqZdeuXZK7/JYetby8jCAIBALb5qFbyuEtvdnv90sj hZubm4yOjpJOp3njjTcwGo3U19dz+PBh3nvvPeYXF5ma2TYpZXM5fvDiS0JbW9tTWbny690Hbkt2 7933i7b+L5PvT6/SnYn6ra2tnMvl+h9+v79qdW39YZ1WQ1Kp5K67jpLLifQNDDI2Nk4ymeSNN96g srKS9vZ2urq6CAaDUqVwuVy89dZbaDQaKioquPvuu1lcXMRms5FMJjEajZJVTalUUl297Rfe2tqi q6uL4eFhCQokEgmeeOIJiXK4RaJdu3aN//alL6FVqnaYxYj46g9/KNTW1v7HeDb3rF4h/5XGkH+l mchnv/8cDXW1qbvuuuuflpeXPxQKhy2ZdEqhVGmw2uxUVFRQXFyMWq3m6NGjEtY5efIkuVwOhULB /Pw84XCYmpoaFhYWACRMolarpQkR39aWZP4xGo1sbGzQ2trKyMgIMplM4nxGRkYkLsjpdDI9Pc3K ygqf+tSnUOzIKQgy8YUXXmDv3r2HE9ncaUUuGzh45I5fZcu/+rDoqR+foaSoMGsymf7eYrH8idfr 01gtFllmR54wGo2srq7S29uLx+OhpaWF/Px8VCoVIyMjLC4ucuPGDVZWVrhFnd6aLVpaWpLmkxRK peTQPHPmDF6vF7VavV2Cd8r5LSfVocOHGRsdJZPJMDo6yiOPPCI9r0KhFH/wwgvCnj17jsu1+h/n GfSJjq6eX3W7//rx4h2NWPaj115ZSyTiDrvNLpSUFEuN5S1/yoULF0iltu1lPT09ZDIZVldXMZlM bG5u0t7ezvz8PBaLhRdffJGjR48yPDxM195uent7efzxx7l06RJWq5WVlRUaGxvZ3NzkwIEDPPPM M7S0tLC4uEhhYSFOp1OyxoqiSF5eHt955rscveOOooqa+rVftqffSmAAPvrQA3R3d+8rLCy8UlJS Ioq5rGA2m7dFcb8flUolzRu89tprJBIJjh8/jtFoZGhoiMiOl7i4uJj+/n4KCgq45557GBwcpLGl ianJKUZGRvjwhz+Mx+NhYmKCrq4u/H4/k5OTRCIROjo6qKyslHx/giAgyGRsbW2JFy9cEFpa2w6L yPrNZnOkuqbul2/qtxGYW+v0j04Wut0b00WFLl0sFhU1Go1gMBgwGAySZ6WkpITz589z7tw56urq KCos3K48Ow7KqqoqPvjBDzI+Nk5LSwujE2N0d3dz5swZhoeH6enpkSweU1NTWK1WPvGJT+DxbJJK plBr1DuiGYSCQfG93vdye/f2dDnseUMbvlC2sanl19rbrx2YlYUZisur6e/vb1+am/6kLc/6SZ/P x+LiouhwOITKykrJUiKXy5EJAiaDSUqyW1tbXL58mXg8jlqtRi6XYzAYMFhNO6M4AjLZtv1EJpPh dDopKirCbDaT3XGABoNBRkdHmZ2dFXU6neB0Osnlcp8zGo1/3bnvNvHX3dtvFBiAwcFBdu3axbWr l6xT09N5pSUl3alU6qOZTOZAKpWy7ljORIPBINTX1VJQ4MBg2HZTZbJZxB0NSqlUEYls4xmH3U46 nZZMQLcEvW03eJDx8QlGJ6dEq9UqKBQKEonEaY1GU2k2W16amZl+7mO/9/vTWr05/Zvs6zcOzE+u nxzb9fr9usG+Gw0atboYxP+6urpKOBzskIlJMpmsaLVaherqarRarWQVEQRh25kgbuvguVyOra0t AoGANNazY2qcMDkKY8lk8mvZXNazd+++d51OZxDg2rvv0NVz6Leyn9/ZB+tMTY5TW7dtFxFFUXnh /Fv3xSP+zuLi4k/5fD7ZzZs3jQqFAr1eT319PXqdHovVQiwcF+fm5oSZmRkymYyvrKwcl8u1mEql viGKOQ7eedf3BEFIwfaoYkVl9e/k+X/nnzj00+vtMz9SWa02VSAY/tOtLX97Nps9pNVqHcFgYNu3 p9ShUav+nUqlEmx2+9XQxtKEOS+f5j1dv9UPzvll6988MD+9Tr7ycuPk5GSDo8DZqtWoz9gdRSsf uPPI4q2fj49O0NBU/2/+XP8HpTm8YTvCoeQAAAAASUVORK5CYII= "
+ height="40"
+ width="40" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/50 dollarsoff.svg b/plugins/currency/images/50 dollarsoff.svg
new file mode 100644
index 0000000..48169d9
--- /dev/null
+++ b/plugins/currency/images/50 dollarsoff.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="55"
+ version="1.1"
+ viewBox="0 0 129 55"
+ width="129"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="50 dollarsoff.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-320.60686"
+ inkscape:cy="43.999999"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><image
+ y="-4.21012e-07"
+ x="1.7763568e-15"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AIEDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDV8xUf y2JJAUlsccnA/WoHitZHyVyz+uRnIP8AQGrmQT0xUFy5jjJU7WPQ9q+VvrZHZGTWqKxS1bduj6Mw 6ntgn+QqN2s4wSCAqnqMnGDj+bfrVmCWYr/yzZgDg88/hSSTEFjKu0/pWkYu6uDm+W1zJvJrW0jS Ro3ZXbYAg5PGO59BW7a3RklaCKFbdQckyNk5PJHXrnPTNczq0yXNxbWyhtxkD5I4xyK2vI2sxVmM ipz9BycehwD+hr3aMbQTe55l3JttlqHUXudWFlbtGzL/AKyTOR9B61tyI9soLfMoHJ9Pzrg/DkiC 5kupbkRIhyeOSTk4H+Fdiuu2Uts0rTgwAhHYoRyQeMevH61rOmpFqbiYNz4jt7i5LR29yCo2EMg6 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 "
+ height="55"
+ width="129" /></svg> \ No newline at end of file
diff --git a/plugins/currency/images/50 dollarssmall.svg b/plugins/currency/images/50 dollarssmall.svg
new file mode 100644
index 0000000..4312f4a
--- /dev/null
+++ b/plugins/currency/images/50 dollarssmall.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ enable-background="new 0 0 55 55"
+ height="23.449612"
+ version="1.1"
+ viewBox="0 0 55 23.449612"
+ width="55"
+ x="0px"
+ xml:space="preserve"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="50 dollarssmall.svg"><metadata
+ id="metadata23"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs21" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="725"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="57.883638"
+ inkscape:cy="30.486034"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+<image
+ y="0"
+ x="0"
+ id="image3048"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
+HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
+MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA3AIEDASIA
+AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
+AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
+ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
+p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
+AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
+BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
+U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
+uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDV8xUf
+y2JJAUlsccnA/WoHitZHyVyz+uRnIP8AQGrmQT0xUFy5jjJU7WPQ9q+VvrZHZGTWqKxS1bduj6Mw
+6ntgn+QqN2s4wSCAqnqMnGDj+bfrVmCWYr/yzZgDg88/hSSTEFjKu0/pWkYu6uDm+W1zJvJrW0jS
+Ro3ZXbYAg5PGO59BW7a3RklaCKFbdQckyNk5PJHXrnPTNczq0yXNxbWyhtxkD5I4xyK2vI2sxVmM
+ipz9BycehwD+hr3aMbQTe55l3JttlqHUXudWFlbtGzL/AKyTOR9B61tyI9soLfMoHJ9Pzrg/DkiC
+5kupbkRIhyeOSTk4H+Fdiuu2Uts0rTgwAhHYoRyQeMevH61rOmpFqbiYNz4jt7i5LR29yCo2EMg6
+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
+"
+ height="23.449612"
+ width="55" /></svg> \ No newline at end of file
diff --git a/plugins/wedo_plugin/WeDoMore.py b/plugins/wedo_plugin/WeDoMore.py
new file mode 100644
index 0000000..62eed58
--- /dev/null
+++ b/plugins/wedo_plugin/WeDoMore.py
@@ -0,0 +1,183 @@
+#Copyright (c) 2011, 2012, Ian Daniher
+#Copyright (c) 2012, Tony Forster, Walter Bender
+#
+# 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 2 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import sys
+import os
+sys.path.append(os.path.dirname(__file__))
+import usb.core
+
+import logging
+logger = logging.getLogger('WeDoMore')
+
+
+UNAVAILABLE = None
+TILTSENSOR = [38, 39]
+DISTANCESENSOR = [176, 177, 178, 179]
+MOTOR = [0, 1, 2, 3, 238, 239]
+TILT_FORWARD = 0
+TILT_LEFT = 1
+TILT_RIGHT = 2
+TILT_BACK = 3
+NO_TILT = -1
+
+
+def scan_for_devices():
+ ''' Find all available devices '''
+ return usb.core.find(find_all=True, idVendor=0x0694, idProduct=0x0003)
+
+
+class WeDo:
+ def __init__(self, device=None):
+ """Find a USB device with the VID and PID of the Lego
+ WeDo. If the HID kernel driver is active, detatch
+ it."""
+ self.dev = None
+ self.number = 0
+ self.dev = device
+ if self.dev is None:
+ logging.debug("No Lego WeDo found")
+ else:
+ self.init_device()
+ self.valMotorA = 0
+ self.valMotorB = 0
+
+ def init_device(self):
+ ''' Reinit device associated with the WeDo instance '''
+ if self.dev is not None:
+ try:
+ if self.dev.is_kernel_driver_active(0):
+ try:
+ self.dev.detach_kernel_driver(0)
+ except usb.core.USBError as e:
+ logger.error(
+ "Could not detatch kernel driver: %s" % (str(e)))
+ except usb.core.USBError as e:
+ logger.error("Could not talk to WeDo device: %s" % (str(e)))
+ self.endpoint = self.dev[0][(0,0)][0]
+
+ def getRawData(self):
+ """Read 64 bytes from the WeDo's endpoint, but only
+ return the last eight."""
+ try:
+ data = list(self.endpoint.read(64)[-8:])
+ except usb.core.USBError as e:
+ logger.error("Could not read from WeDo device: %s" % (str(e)))
+ return None
+ return data
+
+ def processMotorValues(self, value):
+ """Check to make sure motor values are sane."""
+ retValue = int(value)
+ if 0 < value < 101:
+ retValue += 27
+ elif -101 < value < 0:
+ retValue -= 27
+ elif value == 0:
+ retValue = 0
+ return retValue
+
+ def setMotors(self, valMotorA, valMotorB):
+ """Arguments should be in form of a number between 0
+ and 100, positive or negative. Magic numbers used for
+ the ctrl_transfer derived from sniffing USB coms."""
+ if self.dev is None:
+ return
+ self.valMotorA = self.processMotorValues(valMotorA)
+ self.valMotorB = self.processMotorValues(valMotorB)
+ data = [64, self.valMotorA&0xFF, self.valMotorB&0xFF,
+ 0x00, 0x00, 0x00, 0x00, 0x00]
+ try:
+ self.dev.ctrl_transfer(bmRequestType = 0x21, bRequest = 0x09,
+ wValue = 0x0200, wIndex = 0,
+ data_or_wLength = data)
+ except usb.core.USBError as e:
+ logger.error("Could not write to driver: %s" % (str(e)))
+
+ def getData(self):
+ """Sensor data is contained in the 2nd and 4th byte, with
+ sensor IDs being contained in the 3rd and 5th byte
+ respectively."""
+ rawData = self.getRawData()
+ if rawData is not None:
+ sensorData = {rawData[3]: rawData[2], rawData[5]: rawData[4]}
+ else:
+ sensorData = {}
+ return sensorData
+
+ def processTilt(self, v):
+ """Use a series of elif/value-checks to process the tilt
+ sensor data."""
+ if v in range(10, 40):
+ return TILT_BACK
+ elif v in range(60, 90):
+ return TILT_RIGHT
+ elif v in range(170, 190):
+ return TILT_FORWARD
+ elif v in range(220, 240):
+ return TILT_LEFT
+ elif v in range(120, 140):
+ return NO_TILT
+ else:
+ return NO_TILT
+
+ def getTilt(self):
+ if self.dev is None:
+ return UNAVAILABLE
+ data = self.getData()
+ for num in data.keys():
+ if num in TILTSENSOR:
+ return self.processTilt(data[num])
+ return UNAVAILABLE
+
+ def getDistance(self):
+ if self.dev is None:
+ return UNAVAILABLE
+ data = self.getData()
+ for num in data.keys():
+ if num in DISTANCESENSOR:
+ return data[num] - 69
+ return UNAVAILABLE
+
+ # TODO: check motor availability
+
+ def setMotorA(self, valMotorA):
+ self.setMotors(valMotorA, self.valMotorB)
+ return self.valMotorA
+
+ def setMotorB(self, valMotorB):
+ self.setMotors(self.valMotorA, valMotorB)
+ return self.valMotorB
+
+ def getMotorA(self):
+ if self.dev is None:
+ return UNAVAILABLE
+ if self.valMotorA == 0:
+ return 0
+ elif self.valMotorA < 0:
+ return self.valMotorA + 27
+ else:
+ return self.valMotorA - 27
+
+ def getMotorB(self):
+ if self.dev is None:
+ return UNAVAILABLE
+ if self.valMotorB == 0:
+ return 0
+ elif self.valMotorB < 0:
+ return self.valMotorB + 27
+ else:
+ return self.valMotorB - 27
diff --git a/plugins/wedo_plugin/__init__.py b/plugins/wedo_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/wedo_plugin/__init__.py
diff --git a/plugins/wedo_plugin/icons/WeDooff.svg b/plugins/wedo_plugin/icons/WeDooff.svg
new file mode 100644
index 0000000..cc43d44
--- /dev/null
+++ b/plugins/wedo_plugin/icons/WeDooff.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="55"
+ height="55"
+ viewBox="0 0 55 55"
+ id="svg2"
+ xml:space="preserve"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="WeDooff.svg"><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="504"
+ id="namedview10"
+ showgrid="false"
+ inkscape:zoom="4.2909091"
+ inkscape:cx="27.5"
+ inkscape:cy="27.5"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" /><metadata
+ id="metadata15"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs13"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 27.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="55 : 27.5 : 1"
+ inkscape:persp3d-origin="27.5 : 18.333333 : 1"
+ id="perspective12" />
+
+
+
+
+ </defs><rect
+ width="55"
+ height="55"
+ x="0"
+ y="0"
+ id="rect3269"
+ style="fill:#282828;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
+ d="m 11.421095,15.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z"
+ id="path7"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ style="fill:#ffffff;fill-opacity:1"
+ id="path2823"
+ d="m 35.421095,15.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" /><path
+ d="m 35.421095,39.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z"
+ id="path2825"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ style="fill:#ffffff;fill-opacity:1"
+ id="path2827"
+ d="m 11.421095,39.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" /></svg>
diff --git a/plugins/wedo_plugin/icons/WeDoon.svg b/plugins/wedo_plugin/icons/WeDoon.svg
new file mode 100644
index 0000000..16d54d2
--- /dev/null
+++ b/plugins/wedo_plugin/icons/WeDoon.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="55"
+ height="55"
+ viewBox="0 0 55 55"
+ id="svg2"
+ xml:space="preserve"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="WeDoon.svg"><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="504"
+ id="namedview10"
+ showgrid="false"
+ inkscape:zoom="4.2909091"
+ inkscape:cx="27.5"
+ inkscape:cy="27.5"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" /><metadata
+ id="metadata15"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs13"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 27.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="55 : 27.5 : 1"
+ inkscape:persp3d-origin="27.5 : 18.333333 : 1"
+ id="perspective12" />
+
+
+
+
+ </defs><rect
+ width="55"
+ height="55"
+ x="0"
+ y="0"
+ id="rect3269"
+ style="fill:#ffd200;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path
+ d="m 11.421095,15.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z"
+ id="path7"
+ style="fill:#ff0000;fill-opacity:1" /><path
+ style="fill:#ff0000;fill-opacity:1"
+ id="path2823"
+ d="m 35.421095,15.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" /><path
+ d="m 35.421095,39.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z"
+ id="path2825"
+ style="fill:#ff0000;fill-opacity:1" /><path
+ style="fill:#ff0000;fill-opacity:1"
+ id="path2827"
+ d="m 11.421095,39.380686 c 0,2.0569 1.66964,3.72654 3.72654,3.72654 2.05489,0 3.72453,-1.66964 3.72453,-3.72654 0,-2.05489 -1.66897,-3.72788 -3.72453,-3.72788 -2.0569,0 -3.72654,1.67299 -3.72654,3.72788 z" /></svg> \ No newline at end of file
diff --git a/plugins/wedo_plugin/usb/__init__.py b/plugins/wedo_plugin/usb/__init__.py
new file mode 100644
index 0000000..8909cf2
--- /dev/null
+++ b/plugins/wedo_plugin/usb/__init__.py
@@ -0,0 +1,92 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+r"""PyUSB - Easy USB access in Python
+
+This package exports the following modules and subpackages:
+
+ core - the main USB implementation
+ legacy - the compatibility layer with 0.x version
+ backend - the support for backend implementations.
+
+Since version 1.0, main PyUSB implementation lives in the 'usb.core'
+module. New applications are encouraged to use it.
+"""
+
+import logging
+import os
+
+__author__ = 'Wander Lairson Costa'
+
+__all__ = ['legacy', 'core', 'backend', 'util']
+
+
+def _setup_log():
+ from usb import _debug
+ logger = logging.getLogger('usb')
+ debug_level = os.getenv('PYUSB_DEBUG_LEVEL')
+
+ if debug_level is not None:
+ _debug.enable_tracing(True)
+ filename = os.getenv('PYUSB_LOG_FILENAME')
+
+ LEVELS = {'debug': logging.DEBUG,
+ 'info': logging.INFO,
+ 'warning': logging.WARNING,
+ 'error': logging.ERROR,
+ 'critical': logging.CRITICAL}
+
+ level = LEVELS.get(debug_level, logging.CRITICAL + 10)
+ logger.setLevel(level = level)
+
+ try:
+ handler = logging.FileHandler(filename)
+ except:
+ handler = logging.StreamHandler()
+
+ fmt = logging.Formatter('%(asctime)s %(levelname)s:%(name)s:%(message)s')
+ handler.setFormatter(fmt)
+ logger.addHandler(handler)
+ else:
+ class NullHandler(logging.Handler):
+ def emit(self, record):
+ pass
+
+ # We set the log level to avoid delegation to the
+ # parent log handler (if there is one).
+ # Thanks to Chris Clark to pointing this out.
+ logger.setLevel(logging.CRITICAL + 10)
+
+ logger.addHandler(NullHandler())
+
+
+_setup_log()
+
+# We import all 'legacy' module symbols to provide compatility
+# with applications that use 0.x versions.
+from usb.legacy import *
diff --git a/plugins/wedo_plugin/usb/_debug.py b/plugins/wedo_plugin/usb/_debug.py
new file mode 100644
index 0000000..13b0ced
--- /dev/null
+++ b/plugins/wedo_plugin/usb/_debug.py
@@ -0,0 +1,77 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+__author__ = 'Wander Lairson Costa'
+
+__all__ = ['methodtrace', 'functiontrace']
+
+import logging
+import usb._interop as _interop
+
+_enable_tracing = False
+
+def enable_tracing(enable):
+ global _enable_tracing
+ _enable_tracing = enable
+
+def _trace_function_call(logger, fname, *args, **named_args):
+ logger.debug(
+ # TODO: check if 'f' is a method or a free function
+ fname + '(' + \
+ ', '.join((str(val) for val in args)) + \
+ ', '.join((name + '=' + str(val) for name, val in named_args.items())) + ')'
+ )
+
+# decorator for methods calls tracing
+def methodtrace(logger):
+ def decorator_logging(f):
+ if not _enable_tracing:
+ return f
+ def do_trace(*args, **named_args):
+ # this if is just a optimization to avoid unecessary string formatting
+ if logging.DEBUG >= logger.getEffectiveLevel():
+ fn = type(args[0]).__name__ + '.' + f.__name__
+ _trace_function_call(logger, fn, *args[1:], **named_args)
+ return f(*args, **named_args)
+ _interop._update_wrapper(do_trace, f)
+ return do_trace
+ return decorator_logging
+
+# decorator for methods calls tracing
+def functiontrace(logger):
+ def decorator_logging(f):
+ if not _enable_tracing:
+ return f
+ def do_trace(*args, **named_args):
+ # this if is just a optimization to avoid unecessary string formatting
+ if logging.DEBUG >= logger.getEffectiveLevel():
+ _trace_function_call(logger, f.__name__, *args, **named_args)
+ return f(*args, **named_args)
+ _interop._update_wrapper(do_trace, f)
+ return do_trace
+ return decorator_logging
diff --git a/plugins/wedo_plugin/usb/_interop.py b/plugins/wedo_plugin/usb/_interop.py
new file mode 100644
index 0000000..6069d5e
--- /dev/null
+++ b/plugins/wedo_plugin/usb/_interop.py
@@ -0,0 +1,135 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+# All the hacks necessary to assure compatibility across all
+# supported versions come here.
+# Please, note that there is one version check for each
+# hack we need to do, this makes maintenance easier... ^^
+
+import sys
+import array
+
+__all__ = ['_reduce', '_set', '_next', '_groupby', '_sorted', '_update_wrapper']
+
+# we support Python >= 2.3
+assert sys.hexversion >= 0x020300f0
+
+# On Python 3, reduce became a functools module function
+try:
+ import functools
+ _reduce = functools.reduce
+except (ImportError, AttributeError):
+ _reduce = reduce
+
+# we only have the builtin set type since 2.5 version
+try:
+ _set = set
+except NameError:
+ import sets
+ _set = sets.Set
+
+# On Python >= 2.6, we have the builtin next() function
+# On Python 2.5 and before, we have to call the iterator method next()
+def _next(iter):
+ try:
+ return next(iter)
+ except NameError:
+ return iter.next()
+
+# groupby is available only since 2.4 version
+try:
+ import itertools
+ _groupby = itertools.groupby
+except (ImportError, AttributeError):
+ # stolen from Python docs
+ class _groupby(object):
+ # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
+ # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
+ def __init__(self, iterable, key=None):
+ if key is None:
+ key = lambda x: x
+ self.keyfunc = key
+ self.it = iter(iterable)
+ self.tgtkey = self.currkey = self.currvalue = object()
+ def __iter__(self):
+ return self
+ def next(self):
+ while self.currkey == self.tgtkey:
+ self.currvalue = _next(self.it) # Exit on StopIteration
+ self.currkey = self.keyfunc(self.currvalue)
+ self.tgtkey = self.currkey
+ return (self.currkey, self._grouper(self.tgtkey))
+ def _grouper(self, tgtkey):
+ while self.currkey == tgtkey:
+ yield self.currvalue
+ self.currvalue = _next(self.it) # Exit on StopIteration
+ self.currkey = self.keyfunc(self.currvalue)
+
+# builtin sorted function is only availale since 2.4 version
+try:
+ _sorted = sorted
+except NameError:
+ def _sorted(l, key=None, reverse=False):
+ # sort function on Python 2.3 does not
+ # support 'key' parameter
+ class KeyToCmp(object):
+ def __init__(self, K):
+ self.key = K
+ def __call__(self, x, y):
+ kx = self.key(x)
+ ky = self.key(y)
+ if kx < ky:
+ return reverse and 1 or -1
+ elif kx > ky:
+ return reverse and -1 or 1
+ else:
+ return 0
+ tmp = list(l)
+ tmp.sort(KeyToCmp(key))
+ return tmp
+
+try:
+ import functools
+ _update_wrapper = functools.update_wrapper
+except (ImportError, AttributeError):
+ def _update_wrapper(wrapper, wrapped):
+ wrapper.__name__ = wrapped.__name__
+ wrapper.__module__ = wrapped.__module__
+ wrapper.__doc__ = wrapped.__doc__
+ wrapper.__dict__ = wrapped.__dict__
+
+def as_array(data=None):
+ if data is None:
+ return array.array('B')
+ try:
+ return array.array('B', data)
+ except TypeError:
+ # When you pass a unicode string, you got a TypeError
+ # if first parameter is not 'u'
+ return array.array('u', data)
+
diff --git a/plugins/wedo_plugin/usb/backend/__init__.py b/plugins/wedo_plugin/usb/backend/__init__.py
new file mode 100644
index 0000000..67ee00f
--- /dev/null
+++ b/plugins/wedo_plugin/usb/backend/__init__.py
@@ -0,0 +1,368 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+r"""usb.backend - Backend interface.
+
+This module exports:
+
+IBackend - backend interface.
+
+Backends are Python objects which implement the IBackend interface.
+The easiest way to do so is inherinting from IBackend.
+
+PyUSB already provides backends for libusb versions 0.1 and 1.0,
+and OpenUSB library. Backends modules included with PyUSB are required to
+export the get_backend() function, which returns an instance of a backend
+object. You can provide your own customized backend if you
+want to. Bellow you find a skeleton of a backend implementation module:
+
+import usb.backend
+
+class MyBackend(usb.backend.IBackend):
+ pass
+
+def get_backend():
+ return MyBackend()
+
+You can use your customized backend by passing it as the backend parameter of the
+usb.core.find() function. For example:
+
+import custom_backend
+import usb.core
+
+myidVendor = 0xfffe
+myidProduct = 0x0001
+
+mybackend = custom_backend.get_backend()
+
+dev = usb.core.find(backend = mybackend, idProduct=myidProduct,
+ idVendor=myidVendor)
+
+For custom backends, you are not required to supply the get_backend() function,
+since the application code will instantiate the backend.
+
+If you do not provide a backend to the find() function, it will use one of the
+defaults backend according to its internal rules. For details, consult the
+find() function documentation.
+"""
+
+__author__ = 'Wander Lairson Costa'
+
+__all__ = ['IBackend', 'libusb01', 'libusb10', 'openusb']
+
+def _not_implemented(func):
+ raise NotImplementedError(func.__name__)
+
+class IBackend(object):
+ r"""Backend interface.
+
+ IBackend is the basic interface for backend implementations. By default,
+ the methods of the interface raise a NotImplementedError exception. A
+ backend implementation should replace the methods to provide the funcionality
+ necessary.
+
+ As Python is a dynamic typed language, you are not obligated to inherit from
+ IBackend: everything that bahaves like an IBackend is an IBackend. But you
+ are strongly recommended to do so, inheriting from IBackend provides consistent
+ default behavior.
+ """
+ def enumerate_devices(self):
+ r"""This function is required to return an iterable object which
+ yields an implementation defined device identification for each
+ USB device found in the system.
+
+ The device identification object is used as argument to other methods
+ of the interface.
+ """
+ _not_implemented(self.enumerate_devices)
+
+ def get_device_descriptor(self, dev):
+ r"""Return the device descriptor of the given device.
+
+ The object returned is required to have all the Device Descriptor
+ fields accessible as member variables. They must be convertible (but
+ not required to be equal) to the int type.
+
+ dev is an object yielded by the iterator returned by the enumerate_devices()
+ method.
+ """
+ _not_implemented(self.get_device_descriptor)
+
+ def get_configuration_descriptor(self, dev, config):
+ r"""Return a configuration descriptor of the given device.
+
+ The object returned is required to have all the Configuration Descriptor
+ fields acessible as member variables. They must be convertible (but
+ not required to be equal) to the int type.
+
+ The dev parameter is the already described device identification object.
+ config is the logical index of the configuration (not the bConfigurationValue
+ field). By "logical index" we mean the relative order of the configurations
+ returned by the peripheral as a result of GET_DESCRIPTOR request.
+ """
+ _not_implemented(self.get_configuration_descriptor)
+
+ def get_interface_descriptor(self, dev, intf, alt, config):
+ r"""Return an interface descriptor of the given device.
+
+ The object returned is required to have all the Interface Descriptor
+ fields accessible as member variables. They must be convertible (but
+ not required to be equal) to the int type.
+
+ The dev parameter is the already described device identification object.
+ The intf parameter is the interface logical index (not the bInterfaceNumber field)
+ and alt is the alternate setting logical index (not the bAlternateSetting value).
+ Not every interface has more than one alternate setting. In this case, the alt
+ parameter should be zero. config is the configuration logical index (not the
+ bConfigurationValue field).
+ """
+ _not_implemented(self.get_interface_descriptor)
+
+ def get_endpoint_descriptor(self, dev, ep, intf, alt, config):
+ r"""Return an endpoint descriptor of the given device.
+
+ The object returned is required to have all the Endpoint Descriptor
+ fields acessible as member variables. They must be convertible (but
+ not required to be equal) to the int type.
+
+ The ep parameter is the endpoint logical index (not the bEndpointAddress
+ field) of the endpoint descriptor desired. intf, alt and config are the same
+ values already described in the get_interface_descriptor() method.
+ """
+ _not_implemented(self.get_endpoint_descriptor)
+
+ def open_device(self, dev):
+ r"""Open the device for data exchange.
+
+ This method opens the device identified by the dev parameter for communication.
+ This method must be called before calling any communication related method, such
+ as transfer methods.
+
+ It returns a handle identifying the communication instance. This handle must be
+ passed to the communication methods.
+ """
+ _not_implemented(self.open_device)
+
+ def close_device(self, dev_handle):
+ r"""Close the device handle.
+
+ This method closes the device communication channel and releases any
+ system resources related to it.
+ """
+ _not_implemented(self.close_device)
+
+ def set_configuration(self, dev_handle, config_value):
+ r"""Set the active device configuration.
+
+ This method should be called to set the active configuration
+ of the device. The dev_handle parameter is the value returned
+ by the open_device() method and the config_value parameter is the
+ bConfigurationValue field of the related configuration descriptor.
+ """
+ _not_implemented(self.set_configuration)
+
+ def get_configuration(self, dev_handle):
+ r"""Get the current active device configuration.
+
+ This method returns the bConfigurationValue of the currently
+ active configuration. Depending on the backend and the OS,
+ either a cached value may be returned or a control request may
+ be issued. The dev_handle parameter is the value returned by
+ the open_device method.
+ """
+ _not_implemented(self.get_configuration)
+
+ def set_interface_altsetting(self, dev_handle, intf, altsetting):
+ r"""Set the interface alternate setting.
+
+ This method should only be called when the interface has more than
+ one alternate setting. The dev_handle is the value returned by the
+ open_device() method. intf and altsetting are respectivelly the
+ bInterfaceNumber and bAlternateSetting fields of the related interface.
+ """
+ _not_implemented(self.set_interface_altsetting)
+
+ def claim_interface(self, dev_handle, intf):
+ r"""Claim the given interface.
+
+ Interface claiming is not related to USB spec itself, but it is
+ generally an necessary call of the USB libraries. It requests exclusive
+ access to the interface on the system. This method must be called
+ before using one of the transfer methods.
+
+ dev_handle is the value returned by the open_device() method and
+ intf is the bInterfaceNumber field of the desired interface.
+ """
+ _not_implemented(self.claim_interface)
+
+ def release_interface(self, dev_handle, intf):
+ r"""Release the claimed interface.
+
+ dev_handle and intf are the same parameters of the claim_interface
+ method.
+ """
+ _not_implemented(self.release_interface)
+
+ def bulk_write(self, dev_handle, ep, intf, data, timeout):
+ r"""Perform a bulk write.
+
+ dev_handle is the value returned by the open_device() method.
+ The ep parameter is the bEndpointAddress field whose endpoint
+ the data will be sent to. intf is the bInterfaceNumber field
+ of the interface containing the endpoint. The data parameter
+ is the data to be sent. It must be an instance of the array.array
+ class. The timeout parameter specifies a time limit to the operation
+ in miliseconds.
+
+ The method returns the number of bytes written.
+ """
+ _not_implemented(self.bulk_write)
+
+ def bulk_read(self, dev_handle, ep, intf, size, timeout):
+ r"""Perform a bulk read.
+
+ dev_handle is the value returned by the open_device() method.
+ The ep parameter is the bEndpointAddress field whose endpoint
+ the data will be received from. intf is the bInterfaceNumber field
+ of the interface containing the endpoint. The size parameter
+ is the number of bytes to be read. The timeout parameter specifies
+ a time limit to the operation in miliseconds.
+
+ The method returns an array.array object containing the data read.
+ """
+ _not_implemented(self.bulk_read)
+
+ def intr_write(self, dev_handle, ep, intf, data, timeout):
+ r"""Perform an interrupt write.
+
+ dev_handle is the value returned by the open_device() method.
+ The ep parameter is the bEndpointAddress field whose endpoint
+ the data will be sent to. intf is the bInterfaceNumber field
+ of the interface containing the endpoint. The data parameter
+ is the data to be sent. It must be an instance of the array.array
+ class. The timeout parameter specifies a time limit to the operation
+ in miliseconds.
+
+ The method returns the number of bytes written.
+ """
+ _not_implemented(self.intr_write)
+
+ def intr_read(self, dev_handle, ep, intf, size, timeout):
+ r"""Perform an interrut read.
+
+ dev_handle is the value returned by the open_device() method.
+ The ep parameter is the bEndpointAddress field whose endpoint
+ the data will be received from. intf is the bInterfaceNumber field
+ of the interface containing the endpoint. The size parameter
+ is the number of bytes to be read. The timeout parameter specifies
+ a time limit to the operation in miliseconds.
+
+ The method returns an array.array object containing the data read.
+ """
+ _not_implemented(self.intr_read)
+
+ def iso_write(self, dev_handle, ep, intf, data, timeout):
+ r"""Perform an isochronous write.
+
+ dev_handle is the value returned by the open_device() method.
+ The ep parameter is the bEndpointAddress field whose endpoint
+ the data will be sent to. intf is the bInterfaceNumber field
+ of the interface containing the endpoint. The data parameter
+ is the data to be sent.It must be an instance of the array.array
+ class. The timeout parameter specifies a time limit to the operation
+ in miliseconds.
+
+ The method returns the number of bytes written.
+ """
+ _not_implemented(self.iso_write)
+
+ def iso_read(self, dev_handle, ep, intf, size, timeout):
+ r"""Perform an isochronous read.
+
+ dev_handle is the value returned by the open_device() method.
+ The ep parameter is the bEndpointAddress field whose endpoint
+ the data will be received from. intf is the bInterfaceNumber field
+ of the interface containing the endpoint. The size parameter
+ is the number of bytes to be read. The timeout parameter specifies
+ a time limit to the operation in miliseconds.
+
+ The method returns an array.array object containing the data read.
+ """
+ _not_implemented(self.iso_read)
+
+ def ctrl_transfer(self,
+ dev_handle,
+ bmRequestType,
+ bRequest,
+ wValue,
+ wIndex,
+ data_or_wLength,
+ timeout):
+ r"""Perform a control transfer on the endpoint 0.
+
+ The direction of the transfer is inferred from the bmRequestType
+ field of the setup packet.
+
+ dev_handle is the value returned by the open_device() method.
+ bmRequestType, bRequest, wValue and wIndex are the same fields
+ of the setup packet. data_or_wLength is either the payload to be sent
+ to the device, if any, as an array.array object (None there is no
+ payload) for OUT requests in the data stage or the wLength field
+ specifying the number of bytes to read for IN requests in the data
+ stage. The timeout parameter specifies a time limit to the operation
+ in miliseconds.
+
+ Return the number of bytes written (for OUT transfers) or the data
+ read (for IN transfers), as an array.array object.
+ """
+ _not_implemented(self.ctrl_transfer)
+
+ def reset_device(self, dev_handle):
+ r"""Reset the device."""
+ _not_implemented(self.reset_device)
+
+ def is_kernel_driver_active(self, dev_handle, intf):
+ r"""Determine if a kernel driver is active on an interface.
+
+ If a kernel driver is active, you cannot claim the interface,
+ and the backend will be unable to perform I/O.
+ """
+ _not_implemented(self.is_kernel_driver_active)
+
+ def detach_kernel_driver(self, dev_handle, intf):
+ r"""Detach a kernel driver from an interface.
+
+ If successful, you will then be able to claim the interface
+ and perform I/O.
+ """
+ _not_implemented(self.detach_kernel_driver)
+
+ def attach_kernel_driver(self, dev_handle, intf):
+ r"""Re-attach an interface's kernel driver, which was previously
+ detached using detach_kernel_driver()."""
+ _not_implemented(self.attach_kernel_driver)
diff --git a/plugins/wedo_plugin/usb/backend/libusb01.py b/plugins/wedo_plugin/usb/backend/libusb01.py
new file mode 100644
index 0000000..cf344c0
--- /dev/null
+++ b/plugins/wedo_plugin/usb/backend/libusb01.py
@@ -0,0 +1,582 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+from ctypes import *
+import ctypes.util
+import os
+import usb.backend
+import usb.util
+import sys
+from usb.core import USBError
+from usb._debug import methodtrace
+import usb._interop as _interop
+import logging
+
+__author__ = 'Wander Lairson Costa'
+
+__all__ = ['get_backend']
+
+_logger = logging.getLogger('usb.backend.libusb01')
+
+# usb.h
+
+_PC_PATH_MAX = 4
+
+if sys.platform != 'win32' and sys.platform != 'cygwin':
+ _PATH_MAX = os.pathconf('.', _PC_PATH_MAX)
+else:
+ _PATH_MAX = 511
+
+# libusb-win32 makes all structures packed, while
+# default libusb only does for some structures
+# _PackPolicy defines the structure packing according
+# to the platform.
+class _PackPolicy(object):
+ pass
+
+if sys.platform == 'win32' or sys.platform == 'cygwin':
+ _PackPolicy._pack_ = 1
+
+# Data structures
+
+class _usb_descriptor_header(Structure):
+ _pack_ = 1
+ _fields_ = [('blength', c_uint8),
+ ('bDescriptorType', c_uint8)]
+
+class _usb_string_descriptor(Structure):
+ _pack_ = 1
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('wData', c_uint16)]
+
+class _usb_endpoint_descriptor(Structure, _PackPolicy):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bEndpointAddress', c_uint8),
+ ('bmAttributes', c_uint8),
+ ('wMaxPacketSize', c_uint16),
+ ('bInterval', c_uint8),
+ ('bRefresh', c_uint8),
+ ('bSynchAddress', c_uint8),
+ ('extra', POINTER(c_uint8)),
+ ('extralen', c_int)]
+
+class _usb_interface_descriptor(Structure, _PackPolicy):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bInterfaceNumber', c_uint8),
+ ('bAlternateSetting', c_uint8),
+ ('bNumEndpoints', c_uint8),
+ ('bInterfaceClass', c_uint8),
+ ('bInterfaceSubClass', c_uint8),
+ ('bInterfaceProtocol', c_uint8),
+ ('iInterface', c_uint8),
+ ('endpoint', POINTER(_usb_endpoint_descriptor)),
+ ('extra', POINTER(c_uint8)),
+ ('extralen', c_int)]
+
+class _usb_interface(Structure, _PackPolicy):
+ _fields_ = [('altsetting', POINTER(_usb_interface_descriptor)),
+ ('num_altsetting', c_int)]
+
+class _usb_config_descriptor(Structure, _PackPolicy):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('wTotalLength', c_uint16),
+ ('bNumInterfaces', c_uint8),
+ ('bConfigurationValue', c_uint8),
+ ('iConfiguration', c_uint8),
+ ('bmAttributes', c_uint8),
+ ('bMaxPower', c_uint8),
+ ('interface', POINTER(_usb_interface)),
+ ('extra', POINTER(c_uint8)),
+ ('extralen', c_int)]
+
+class _usb_device_descriptor(Structure, _PackPolicy):
+ _pack_ = 1
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bcdUSB', c_uint16),
+ ('bDeviceClass', c_uint8),
+ ('bDeviceSubClass', c_uint8),
+ ('bDeviceProtocol', c_uint8),
+ ('bMaxPacketSize0', c_uint8),
+ ('idVendor', c_uint16),
+ ('idProduct', c_uint16),
+ ('bcdDevice', c_uint16),
+ ('iManufacturer', c_uint8),
+ ('iProduct', c_uint8),
+ ('iSerialNumber', c_uint8),
+ ('bNumConfigurations', c_uint8)]
+
+class _usb_device(Structure, _PackPolicy):
+ pass
+
+class _usb_bus(Structure, _PackPolicy):
+ pass
+
+_usb_device._fields_ = [('next', POINTER(_usb_device)),
+ ('prev', POINTER(_usb_device)),
+ ('filename', c_int8 * (_PATH_MAX + 1)),
+ ('bus', POINTER(_usb_bus)),
+ ('descriptor', _usb_device_descriptor),
+ ('config', POINTER(_usb_config_descriptor)),
+ ('dev', c_void_p),
+ ('devnum', c_uint8),
+ ('num_children', c_ubyte),
+ ('children', POINTER(POINTER(_usb_device)))]
+
+_usb_bus._fields_ = [('next', POINTER(_usb_bus)),
+ ('prev', POINTER(_usb_bus)),
+ ('dirname', c_char * (_PATH_MAX + 1)),
+ ('devices', POINTER(_usb_device)),
+ ('location', c_uint32),
+ ('root_dev', POINTER(_usb_device))]
+
+_usb_dev_handle = c_void_p
+
+class _DeviceDescriptor:
+ def __init__(self, dev):
+ desc = dev.descriptor
+ self.bLength = desc.bLength
+ self.bDescriptorType = desc.bDescriptorType
+ self.bcdUSB = desc.bcdUSB
+ self.bDeviceClass = desc.bDeviceClass
+ self.bDeviceSubClass = desc.bDeviceSubClass
+ self.bDeviceProtocol = desc.bDeviceProtocol
+ self.bMaxPacketSize0 = desc.bMaxPacketSize0
+ self.idVendor = desc.idVendor
+ self.idProduct = desc.idProduct
+ self.bcdDevice = desc.bcdDevice
+ self.iManufacturer = desc.iManufacturer
+ self.iProduct = desc.iProduct
+ self.iSerialNumber = desc.iSerialNumber
+ self.bNumConfigurations = desc.bNumConfigurations
+ self.address = dev.devnum
+ self.bus = dev.bus[0].location
+
+_lib = None
+
+def _load_library():
+ if sys.platform != 'cygwin':
+ candidates = ('usb-0.1', 'usb', 'libusb0')
+ for candidate in candidates:
+ libname = ctypes.util.find_library(candidate)
+ if libname is not None: break
+ else:
+ # corner cases
+ # cygwin predefines library names with 'cyg' instead of 'lib'
+ try:
+ return CDLL('cygusb0.dll')
+ except:
+ _logger.error('Libusb 0 could not be loaded in cygwin', exc_info=True)
+
+ raise OSError('USB library could not be found')
+ return CDLL(libname)
+
+def _setup_prototypes(lib):
+ # usb_dev_handle *usb_open(struct usb_device *dev);
+ lib.usb_open.argtypes = [POINTER(_usb_device)]
+ lib.usb_open.restype = _usb_dev_handle
+
+ # int usb_close(usb_dev_handle *dev);
+ lib.usb_close.argtypes = [_usb_dev_handle]
+
+ # int usb_get_string(usb_dev_handle *dev,
+ # int index,
+ # int langid,
+ # char *buf,
+ # size_t buflen);
+ lib.usb_get_string.argtypes = [
+ _usb_dev_handle,
+ c_int,
+ c_int,
+ c_char_p,
+ c_size_t
+ ]
+
+ # int usb_get_string_simple(usb_dev_handle *dev,
+ # int index,
+ # char *buf,
+ # size_t buflen);
+ lib.usb_get_string_simple.argtypes = [
+ _usb_dev_handle,
+ c_int,
+ c_char_p,
+ c_size_t
+ ]
+
+ # int usb_get_descriptor_by_endpoint(usb_dev_handle *udev,
+ # int ep,
+ # unsigned char type,
+ # unsigned char index,
+ # void *buf,
+ # int size);
+ lib.usb_get_descriptor_by_endpoint.argtypes = [
+ _usb_dev_handle,
+ c_int,
+ c_ubyte,
+ c_ubyte,
+ c_void_p,
+ c_int
+ ]
+
+ # int usb_get_descriptor(usb_dev_handle *udev,
+ # unsigned char type,
+ # unsigned char index,
+ # void *buf,
+ # int size);
+ lib.usb_get_descriptor.argtypes = [
+ _usb_dev_handle,
+ c_ubyte,
+ c_ubyte,
+ c_void_p,
+ c_int
+ ]
+
+ # int usb_bulk_write(usb_dev_handle *dev,
+ # int ep,
+ # const char *bytes,
+ # int size,
+ # int timeout);
+ lib.usb_bulk_write.argtypes = [
+ _usb_dev_handle,
+ c_int,
+ c_char_p,
+ c_int,
+ c_int
+ ]
+
+ # int usb_bulk_read(usb_dev_handle *dev,
+ # int ep,
+ # char *bytes,
+ # int size,
+ # int timeout);
+ lib.usb_bulk_read.argtypes = [
+ _usb_dev_handle,
+ c_int,
+ c_char_p,
+ c_int,
+ c_int
+ ]
+
+ # int usb_interrupt_write(usb_dev_handle *dev,
+ # int ep,
+ # const char *bytes,
+ # int size,
+ # int timeout);
+ lib.usb_interrupt_write.argtypes = [
+ _usb_dev_handle,
+ c_int,
+ c_char_p,
+ c_int,
+ c_int
+ ]
+
+ # int usb_interrupt_read(usb_dev_handle *dev,
+ # int ep,
+ # char *bytes,
+ # int size,
+ # int timeout);
+ lib.usb_interrupt_read.argtypes = [
+ _usb_dev_handle,
+ c_int,
+ c_char_p,
+ c_int,
+ c_int
+ ]
+
+ # int usb_control_msg(usb_dev_handle *dev,
+ # int requesttype,
+ # int request,
+ # int value,
+ # int index,
+ # char *bytes,
+ # int size,
+ # int timeout);
+ lib.usb_control_msg.argtypes = [
+ _usb_dev_handle,
+ c_int,
+ c_int,
+ c_int,
+ c_int,
+ c_char_p,
+ c_int,
+ c_int
+ ]
+
+ # int usb_set_configuration(usb_dev_handle *dev, int configuration);
+ lib.usb_set_configuration.argtypes = [_usb_dev_handle, c_int]
+
+ # int usb_claim_interface(usb_dev_handle *dev, int interface);
+ lib.usb_claim_interface.argtypes = [_usb_dev_handle, c_int]
+
+ # int usb_release_interface(usb_dev_handle *dev, int interface);
+ lib.usb_release_interface.argtypes = [_usb_dev_handle, c_int]
+
+ # int usb_set_altinterface(usb_dev_handle *dev, int alternate);
+ lib.usb_set_altinterface.argtypes = [_usb_dev_handle, c_int]
+
+ # int usb_resetep(usb_dev_handle *dev, unsigned int ep);
+ lib.usb_resetep.argtypes = [_usb_dev_handle, c_int]
+
+ # int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
+ lib.usb_clear_halt.argtypes = [_usb_dev_handle, c_int]
+
+ # int usb_reset(usb_dev_handle *dev);
+ lib.usb_reset.argtypes = [_usb_dev_handle]
+
+ # char *usb_strerror(void);
+ lib.usb_strerror.argtypes = []
+ lib.usb_strerror.restype = c_char_p
+
+ # void usb_set_debug(int level);
+ lib.usb_set_debug.argtypes = [c_int]
+
+ # struct usb_device *usb_device(usb_dev_handle *dev);
+ lib.usb_device.argtypes = [_usb_dev_handle]
+ lib.usb_device.restype = POINTER(_usb_device)
+
+ # struct usb_bus *usb_get_busses(void);
+ lib.usb_get_busses.restype = POINTER(_usb_bus)
+
+def _check(retval):
+ if retval is None:
+ errmsg = _lib.usb_strerror()
+ else:
+ ret = int(retval)
+ if ret < 0:
+ errmsg = _lib.usb_strerror()
+ # No error means that we need to get the error
+ # message from the return code
+ # Thanks to Nicholas Wheeler to point out the problem...
+ # Also see issue #2860940
+ if errmsg.lower() == 'no error':
+ errmsg = os.strerror(-ret)
+ else:
+ return ret
+ raise USBError(errmsg, ret)
+
+# implementation of libusb 0.1.x backend
+class _LibUSB(usb.backend.IBackend):
+ @methodtrace(_logger)
+ def enumerate_devices(self):
+ _check(_lib.usb_find_busses())
+ _check(_lib.usb_find_devices())
+ bus = _lib.usb_get_busses()
+ while bool(bus):
+ dev = bus[0].devices
+ while bool(dev):
+ yield dev[0]
+ dev = dev[0].next
+ bus = bus[0].next
+
+ @methodtrace(_logger)
+ def get_device_descriptor(self, dev):
+ return _DeviceDescriptor(dev)
+
+ @methodtrace(_logger)
+ def get_configuration_descriptor(self, dev, config):
+ if config >= dev.descriptor.bNumConfigurations:
+ raise IndexError('Invalid configuration index ' + str(config))
+ return dev.config[config]
+
+ @methodtrace(_logger)
+ def get_interface_descriptor(self, dev, intf, alt, config):
+ cfgdesc = self.get_configuration_descriptor(dev, config)
+ if intf >= cfgdesc.bNumInterfaces:
+ raise IndexError('Invalid interface index ' + str(interface))
+ interface = cfgdesc.interface[intf]
+ if alt >= interface.num_altsetting:
+ raise IndexError('Invalid alternate setting index ' + str(alt))
+ return interface.altsetting[alt]
+
+ @methodtrace(_logger)
+ def get_endpoint_descriptor(self, dev, ep, intf, alt, config):
+ interface = self.get_interface_descriptor(dev, intf, alt, config)
+ if ep >= interface.bNumEndpoints:
+ raise IndexError('Invalid endpoint index ' + str(ep))
+ return interface.endpoint[ep]
+
+ @methodtrace(_logger)
+ def open_device(self, dev):
+ return _check(_lib.usb_open(dev))
+
+ @methodtrace(_logger)
+ def close_device(self, dev_handle):
+ _check(_lib.usb_close(dev_handle))
+
+ @methodtrace(_logger)
+ def set_configuration(self, dev_handle, config_value):
+ _check(_lib.usb_set_configuration(dev_handle, config_value))
+
+ @methodtrace(_logger)
+ def set_interface_altsetting(self, dev_handle, intf, altsetting):
+ _check(_lib.usb_set_altinterface(dev_handle, altsetting))
+
+ @methodtrace(_logger)
+ def get_configuration(self, dev_handle):
+ bmRequestType = usb.util.build_request_type(
+ usb.util.CTRL_IN,
+ usb.util.CTRL_TYPE_STANDARD,
+ usb.util.CTRL_RECIPIENT_DEVICE
+ )
+ return self.ctrl_transfer(dev_handle,
+ bmRequestType,
+ 0x08,
+ 0,
+ 0,
+ 1,
+ 100
+ )[0]
+
+
+ @methodtrace(_logger)
+ def claim_interface(self, dev_handle, intf):
+ _check(_lib.usb_claim_interface(dev_handle, intf))
+
+ @methodtrace(_logger)
+ def release_interface(self, dev_handle, intf):
+ _check(_lib.usb_release_interface(dev_handle, intf))
+
+ @methodtrace(_logger)
+ def bulk_write(self, dev_handle, ep, intf, data, timeout):
+ return self.__write(_lib.usb_bulk_write,
+ dev_handle,
+ ep,
+ intf,
+ data, timeout)
+
+ @methodtrace(_logger)
+ def bulk_read(self, dev_handle, ep, intf, size, timeout):
+ return self.__read(_lib.usb_bulk_read,
+ dev_handle,
+ ep,
+ intf,
+ size,
+ timeout)
+
+ @methodtrace(_logger)
+ def intr_write(self, dev_handle, ep, intf, data, timeout):
+ return self.__write(_lib.usb_interrupt_write,
+ dev_handle,
+ ep,
+ intf,
+ data,
+ timeout)
+
+ @methodtrace(_logger)
+ def intr_read(self, dev_handle, ep, intf, size, timeout):
+ return self.__read(_lib.usb_interrupt_read,
+ dev_handle,
+ ep,
+ intf,
+ size,
+ timeout)
+
+ @methodtrace(_logger)
+ def ctrl_transfer(self,
+ dev_handle,
+ bmRequestType,
+ bRequest,
+ wValue,
+ wIndex,
+ data_or_wLength,
+ timeout):
+ if usb.util.ctrl_direction(bmRequestType) == usb.util.CTRL_OUT:
+ address, length = data_or_wLength.buffer_info()
+ length *= data_or_wLength.itemsize
+ return _check(_lib.usb_control_msg(
+ dev_handle,
+ bmRequestType,
+ bRequest,
+ wValue,
+ wIndex,
+ cast(address, c_char_p),
+ length,
+ timeout
+ ))
+ else:
+ data = _interop.as_array((0,) * data_or_wLength)
+ read = int(_check(_lib.usb_control_msg(
+ dev_handle,
+ bmRequestType,
+ bRequest,
+ wValue,
+ wIndex,
+ cast(data.buffer_info()[0],
+ c_char_p),
+ data_or_wLength,
+ timeout
+ )))
+ return data[:read]
+
+ @methodtrace(_logger)
+ def reset_device(self, dev_handle):
+ _check(_lib.usb_reset(dev_handle))
+
+ @methodtrace(_logger)
+ def detach_kernel_driver(self, dev_handle, intf):
+ _check(_lib.usb_detach_kernel_driver_np(dev_handle, intf))
+
+ def __write(self, fn, dev_handle, ep, intf, data, timeout):
+ address, length = data.buffer_info()
+ length *= data.itemsize
+ return int(_check(fn(
+ dev_handle,
+ ep,
+ cast(address, c_char_p),
+ length,
+ timeout
+ )))
+
+ def __read(self, fn, dev_handle, ep, intf, size, timeout):
+ data = _interop.as_array((0,) * size)
+ address, length = data.buffer_info()
+ length *= data.itemsize
+ ret = int(_check(fn(
+ dev_handle,
+ ep,
+ cast(address, c_char_p),
+ length,
+ timeout
+ )))
+ return data[:ret]
+
+def get_backend():
+ global _lib
+ try:
+ if _lib is None:
+ _lib = _load_library()
+ _setup_prototypes(_lib)
+ _lib.usb_init()
+ return _LibUSB()
+ except Exception:
+ _logger.error('Error loading libusb 0.1 backend', exc_info=True)
+ return None
diff --git a/plugins/wedo_plugin/usb/backend/libusb10.py b/plugins/wedo_plugin/usb/backend/libusb10.py
new file mode 100644
index 0000000..cb2a566
--- /dev/null
+++ b/plugins/wedo_plugin/usb/backend/libusb10.py
@@ -0,0 +1,654 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+from ctypes import *
+import ctypes.util
+import usb.util
+import sys
+import logging
+from usb._debug import methodtrace
+import usb._interop as _interop
+import errno
+
+__author__ = 'Wander Lairson Costa'
+
+__all__ = [
+ 'get_backend',
+ 'LIBUSB_SUCESS',
+ 'LIBUSB_ERROR_IO',
+ 'LIBUSB_ERROR_INVALID_PARAM',
+ 'LIBUSB_ERROR_ACCESS',
+ 'LIBUSB_ERROR_NO_DEVICE',
+ 'LIBUSB_ERROR_NOT_FOUND',
+ 'LIBUSB_ERROR_BUSY',
+ 'LIBUSB_ERROR_TIMEOUT',
+ 'LIBUSB_ERROR_OVERFLOW',
+ 'LIBUSB_ERROR_PIPE',
+ 'LIBUSB_ERROR_INTERRUPTED',
+ 'LIBUSB_ERROR_NO_MEM',
+ 'LIBUSB_ERROR_NOT_SUPPORTED',
+ 'LIBUSB_ERROR_OTHER'
+ ]
+
+_logger = logging.getLogger('usb.backend.libusb10')
+
+# libusb.h
+
+# return codes
+
+LIBUSB_SUCCESS = 0
+LIBUSB_ERROR_IO = -1
+LIBUSB_ERROR_INVALID_PARAM = -2
+LIBUSB_ERROR_ACCESS = -3
+LIBUSB_ERROR_NO_DEVICE = -4
+LIBUSB_ERROR_NOT_FOUND = -5
+LIBUSB_ERROR_BUSY = -6
+LIBUSB_ERROR_TIMEOUT = -7
+LIBUSB_ERROR_OVERFLOW = -8
+LIBUSB_ERROR_PIPE = -9
+LIBUSB_ERROR_INTERRUPTED = -10
+LIBUSB_ERROR_NO_MEM = -11
+LIBUSB_ERROR_NOT_SUPPORTED = -12
+LIBUSB_ERROR_OTHER = -99
+
+# map return codes to strings
+_str_error = {
+ LIBUSB_SUCCESS:'Success (no error)',
+ LIBUSB_ERROR_IO:'Input/output error',
+ LIBUSB_ERROR_INVALID_PARAM:'Invalid parameter',
+ LIBUSB_ERROR_ACCESS:'Access denied (insufficient permissions)',
+ LIBUSB_ERROR_NO_DEVICE:'No such device (it may have been disconnected)',
+ LIBUSB_ERROR_NOT_FOUND:'Entity not found',
+ LIBUSB_ERROR_BUSY:'Resource busy',
+ LIBUSB_ERROR_TIMEOUT:'Operation timed out',
+ LIBUSB_ERROR_OVERFLOW:'Overflow',
+ LIBUSB_ERROR_PIPE:'Pipe error',
+ LIBUSB_ERROR_INTERRUPTED:'System call interrupted (perhaps due to signal)',
+ LIBUSB_ERROR_NO_MEM:'Insufficient memory',
+ LIBUSB_ERROR_NOT_SUPPORTED:'Operation not supported or unimplemented on this platform',
+ LIBUSB_ERROR_OTHER:'Unknown error'
+}
+
+# map return code to errno values
+_libusb_errno = {
+ LIBUSB_SUCCESS:None,
+ LIBUSB_ERROR_IO:errno.__dict__.get('EIO', None),
+ LIBUSB_ERROR_INVALID_PARAM:errno.__dict__.get('EINVAL', None),
+ LIBUSB_ERROR_ACCESS:errno.__dict__.get('EACCES', None),
+ LIBUSB_ERROR_NO_DEVICE:errno.__dict__.get('ENODEV', None),
+ LIBUSB_ERROR_NOT_FOUND:errno.__dict__.get('ENOENT', None),
+ LIBUSB_ERROR_BUSY:errno.__dict__.get('EBUSY', None),
+ LIBUSB_ERROR_TIMEOUT:errno.__dict__.get('ETIMEDOUT', None),
+ LIBUSB_ERROR_OVERFLOW:errno.__dict__.get('EOVERFLOW', None),
+ LIBUSB_ERROR_PIPE:errno.__dict__.get('EPIPE', None),
+ LIBUSB_ERROR_INTERRUPTED:errno.__dict__.get('EINTR', None),
+ LIBUSB_ERROR_NO_MEM:errno.__dict__.get('ENOMEM', None),
+ LIBUSB_ERROR_NOT_SUPPORTED:errno.__dict__.get('ENOSYS', None),
+ LIBUSB_ERROR_OTHER:None
+}
+
+# Data structures
+
+class _libusb_endpoint_descriptor(Structure):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bEndpointAddress', c_uint8),
+ ('bmAttributes', c_uint8),
+ ('wMaxPacketSize', c_uint16),
+ ('bInterval', c_uint8),
+ ('bRefresh', c_uint8),
+ ('bSynchAddress', c_uint8),
+ ('extra', POINTER(c_ubyte)),
+ ('extra_length', c_int)]
+
+class _libusb_interface_descriptor(Structure):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bInterfaceNumber', c_uint8),
+ ('bAlternateSetting', c_uint8),
+ ('bNumEndpoints', c_uint8),
+ ('bInterfaceClass', c_uint8),
+ ('bInterfaceSubClass', c_uint8),
+ ('bInterfaceProtocol', c_uint8),
+ ('iInterface', c_uint8),
+ ('endpoint', POINTER(_libusb_endpoint_descriptor)),
+ ('extra', POINTER(c_ubyte)),
+ ('extra_length', c_int)]
+
+class _libusb_interface(Structure):
+ _fields_ = [('altsetting', POINTER(_libusb_interface_descriptor)),
+ ('num_altsetting', c_int)]
+
+class _libusb_config_descriptor(Structure):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('wTotalLength', c_uint16),
+ ('bNumInterfaces', c_uint8),
+ ('bConfigurationValue', c_uint8),
+ ('iConfiguration', c_uint8),
+ ('bmAttributes', c_uint8),
+ ('bMaxPower', c_uint8),
+ ('interface', POINTER(_libusb_interface)),
+ ('extra', POINTER(c_ubyte)),
+ ('extra_length', c_int)]
+
+class _libusb_device_descriptor(Structure):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bcdUSB', c_uint16),
+ ('bDeviceClass', c_uint8),
+ ('bDeviceSubClass', c_uint8),
+ ('bDeviceProtocol', c_uint8),
+ ('bMaxPacketSize0', c_uint8),
+ ('idVendor', c_uint16),
+ ('idProduct', c_uint16),
+ ('bcdDevice', c_uint16),
+ ('iManufacturer', c_uint8),
+ ('iProduct', c_uint8),
+ ('iSerialNumber', c_uint8),
+ ('bNumConfigurations', c_uint8)]
+
+_lib = None
+_init = None
+
+_libusb_device_handle = c_void_p
+
+def _load_library():
+ if sys.platform != 'cygwin':
+ candidates = ('usb-1.0', 'libusb-1.0', 'usb')
+ for candidate in candidates:
+ libname = ctypes.util.find_library(candidate)
+ if libname is not None: break
+ else:
+ # corner cases
+ # cygwin predefines library names with 'cyg' instead of 'lib'
+ try:
+ return CDLL('cygusb-1.0.dll')
+ except Exception:
+ _logger.error('Libusb 1.0 could not be loaded in cygwin', exc_info=True)
+
+ raise OSError('USB library could not be found')
+ # Windows backend uses stdcall calling convention
+ if sys.platform == 'win32':
+ l = WinDLL(libname)
+ else:
+ l = CDLL(libname)
+ # On FreeBSD 8/9, libusb 1.0 and libusb 0.1 are in the same shared
+ # object libusb.so, so if we found libusb library name, we must assure
+ # it is 1.0 version. We just try to get some symbol from 1.0 version
+ if not hasattr(l, 'libusb_init'):
+ raise OSError('USB library could not be found')
+ return l
+
+def _setup_prototypes(lib):
+ # void libusb_set_debug (libusb_context *ctx, int level)
+ lib.libusb_set_debug.argtypes = [c_void_p, c_int]
+
+ # int libusb_init (libusb_context **context)
+ lib.libusb_init.argtypes = [POINTER(c_void_p)]
+
+ # void libusb_exit (struct libusb_context *ctx)
+ lib.libusb_exit.argtypes = [c_void_p]
+
+ # ssize_t libusb_get_device_list (libusb_context *ctx,
+ # libusb_device ***list)
+ lib.libusb_get_device_list.argtypes = [
+ c_void_p,
+ POINTER(POINTER(c_void_p))
+ ]
+
+ # void libusb_free_device_list (libusb_device **list,
+ # int unref_devices)
+ lib.libusb_free_device_list.argtypes = [
+ POINTER(c_void_p),
+ c_int
+ ]
+
+ # libusb_device *libusb_ref_device (libusb_device *dev)
+ lib.libusb_ref_device.argtypes = [c_void_p]
+ lib.libusb_ref_device.restype = c_void_p
+
+ # void libusb_unref_device(libusb_device *dev)
+ lib.libusb_unref_device.argtypes = [c_void_p]
+
+ # int libusb_open(libusb_device *dev, libusb_device_handle **handle)
+ lib.libusb_open.argtypes = [c_void_p, POINTER(_libusb_device_handle)]
+
+ # void libusb_close(libusb_device_handle *dev_handle)
+ lib.libusb_close.argtypes = [_libusb_device_handle]
+
+ # int libusb_set_configuration(libusb_device_handle *dev,
+ # int configuration)
+ lib.libusb_set_configuration.argtypes = [_libusb_device_handle, c_int]
+
+ # int libusb_get_configuration(libusb_device_handle *dev,
+ # int *config)
+ lib.libusb_get_configuration.argtypes = [_libusb_device_handle, POINTER(c_int)]
+
+ # int libusb_claim_interface(libusb_device_handle *dev,
+ # int interface_number)
+ lib.libusb_claim_interface.argtypes = [_libusb_device_handle, c_int]
+
+ # int libusb_release_interface(libusb_device_handle *dev,
+ # int interface_number)
+ lib.libusb_release_interface.argtypes = [_libusb_device_handle, c_int]
+
+ # int libusb_set_interface_alt_setting(libusb_device_handle *dev,
+ # int interface_number,
+ # int alternate_setting)
+ lib.libusb_set_interface_alt_setting.argtypes = [
+ _libusb_device_handle,
+ c_int,
+ c_int
+ ]
+
+ # int libusb_reset_device (libusb_device_handle *dev)
+ lib.libusb_reset_device.argtypes = [_libusb_device_handle]
+
+ # int libusb_kernel_driver_active(libusb_device_handle *dev,
+ # int interface)
+ lib.libusb_kernel_driver_active.argtypes = [
+ _libusb_device_handle,
+ c_int
+ ]
+
+ # int libusb_detach_kernel_driver(libusb_device_handle *dev,
+ # int interface)
+ lib.libusb_detach_kernel_driver.argtypes = [
+ _libusb_device_handle,
+ c_int
+ ]
+
+ # int libusb_attach_kernel_driver(libusb_device_handle *dev,
+ # int interface)
+ lib.libusb_attach_kernel_driver.argtypes = [
+ _libusb_device_handle,
+ c_int
+ ]
+
+ # int libusb_get_device_descriptor(
+ # libusb_device *dev,
+ # struct libusb_device_descriptor *desc
+ # )
+ lib.libusb_get_device_descriptor.argtypes = [
+ c_void_p,
+ POINTER(_libusb_device_descriptor)
+ ]
+
+ # int libusb_get_config_descriptor(
+ # libusb_device *dev,
+ # uint8_t config_index,
+ # struct libusb_config_descriptor **config
+ # )
+ lib.libusb_get_config_descriptor.argtypes = [
+ c_void_p,
+ c_uint8,
+ POINTER(POINTER(_libusb_config_descriptor))
+ ]
+
+ # void libusb_free_config_descriptor(
+ # struct libusb_config_descriptor *config
+ # )
+ lib.libusb_free_config_descriptor.argtypes = [
+ POINTER(_libusb_config_descriptor)
+ ]
+
+ # int libusb_get_string_descriptor_ascii(libusb_device_handle *dev,
+ # uint8_t desc_index,
+ # unsigned char *data,
+ # int length)
+ lib.libusb_get_string_descriptor_ascii.argtypes = [
+ _libusb_device_handle,
+ c_uint8,
+ POINTER(c_ubyte),
+ c_int
+ ]
+
+ # int libusb_control_transfer(libusb_device_handle *dev_handle,
+ # uint8_t bmRequestType,
+ # uint8_t bRequest,
+ # uint16_t wValue,
+ # uint16_t wIndex,
+ # unsigned char *data,
+ # uint16_t wLength,
+ # unsigned int timeout)
+ lib.libusb_control_transfer.argtypes = [
+ _libusb_device_handle,
+ c_uint8,
+ c_uint8,
+ c_uint16,
+ c_uint16,
+ POINTER(c_ubyte),
+ c_uint16,
+ c_uint
+ ]
+
+ #int libusb_bulk_transfer(
+ # struct libusb_device_handle *dev_handle,
+ # unsigned char endpoint,
+ # unsigned char *data,
+ # int length,
+ # int *transferred,
+ # unsigned int timeout
+ # )
+ lib.libusb_bulk_transfer.argtypes = [
+ _libusb_device_handle,
+ c_ubyte,
+ POINTER(c_ubyte),
+ c_int,
+ POINTER(c_int),
+ c_uint
+ ]
+
+ # int libusb_interrupt_transfer(
+ # libusb_device_handle *dev_handle,
+ # unsigned char endpoint,
+ # unsigned char *data,
+ # int length,
+ # int *actual_length,
+ # unsigned int timeout
+ # );
+ lib.libusb_interrupt_transfer.argtypes = [
+ _libusb_device_handle,
+ c_ubyte,
+ POINTER(c_ubyte),
+ c_int,
+ POINTER(c_int),
+ c_uint
+ ]
+
+ # uint8_t libusb_get_bus_number(libusb_device *dev)
+ lib.libusb_get_bus_number.argtypes = [c_void_p]
+ lib.libusb_get_bus_number.restype = c_uint8
+
+ # uint8_t libusb_get_device_address(libusb_device *dev)
+ lib.libusb_get_device_address.argtypes = [c_void_p]
+ lib.libusb_get_device_address.restype = c_uint8
+
+
+
+# check a libusb function call
+def _check(retval):
+ if isinstance(retval, int):
+ retval = c_int(retval)
+ if isinstance(retval, c_int):
+ if retval.value < 0:
+ from usb.core import USBError
+ ret = retval.value
+ raise USBError(_str_error[ret], ret, _libusb_errno[ret])
+ return retval
+
+# wrap a device
+class _Device(object):
+ def __init__(self, devid):
+ self.devid = _lib.libusb_ref_device(devid)
+ def __del__(self):
+ _lib.libusb_unref_device(self.devid)
+
+# wrap a descriptor and keep a reference to another object
+# Thanks to Thomas Reitmayr.
+class _WrapDescriptor(object):
+ def __init__(self, desc, obj = None):
+ self.obj = obj
+ self.desc = desc
+ def __getattr__(self, name):
+ return getattr(self.desc, name)
+
+# wrap a configuration descriptor
+class _ConfigDescriptor(object):
+ def __init__(self, desc):
+ self.desc = desc
+ def __del__(self):
+ _lib.libusb_free_config_descriptor(self.desc)
+ def __getattr__(self, name):
+ return getattr(self.desc.contents, name)
+
+# initialize and finalize the library
+class _Initializer(object):
+ def __init__(self):
+ _check(_lib.libusb_init(None))
+ def __del__(self):
+ _lib.libusb_exit(None)
+
+
+# iterator for libusb devices
+class _DevIterator(object):
+ def __init__(self):
+ self.dev_list = POINTER(c_void_p)()
+ self.num_devs = _check(_lib.libusb_get_device_list(
+ None,
+ byref(self.dev_list))
+ ).value
+ def __iter__(self):
+ for i in range(self.num_devs):
+ yield _Device(self.dev_list[i])
+ def __del__(self):
+ _lib.libusb_free_device_list(self.dev_list, 1)
+
+# implementation of libusb 1.0 backend
+class _LibUSB(usb.backend.IBackend):
+ @methodtrace(_logger)
+ def enumerate_devices(self):
+ return _DevIterator()
+
+ @methodtrace(_logger)
+ def get_device_descriptor(self, dev):
+ dev_desc = _libusb_device_descriptor()
+ _check(_lib.libusb_get_device_descriptor(dev.devid, byref(dev_desc)))
+ dev_desc.bus = _lib.libusb_get_bus_number(dev.devid)
+ dev_desc.address = _lib.libusb_get_device_address(dev.devid)
+ return dev_desc
+
+ @methodtrace(_logger)
+ def get_configuration_descriptor(self, dev, config):
+ cfg = POINTER(_libusb_config_descriptor)()
+ _check(_lib.libusb_get_config_descriptor(dev.devid,
+ config, byref(cfg)))
+ return _ConfigDescriptor(cfg)
+
+ @methodtrace(_logger)
+ def get_interface_descriptor(self, dev, intf, alt, config):
+ cfg = self.get_configuration_descriptor(dev, config)
+ if intf >= cfg.bNumInterfaces:
+ raise IndexError('Invalid interface index ' + str(intf))
+ i = cfg.interface[intf]
+ if alt >= i.num_altsetting:
+ raise IndexError('Invalid alternate setting index ' + str(alt))
+ return _WrapDescriptor(i.altsetting[alt], cfg)
+
+ @methodtrace(_logger)
+ def get_endpoint_descriptor(self, dev, ep, intf, alt, config):
+ i = self.get_interface_descriptor(dev, intf, alt, config)
+ if ep > i.bNumEndpoints:
+ raise IndexError('Invalid endpoint index ' + str(ep))
+ return _WrapDescriptor(i.endpoint[ep], i)
+
+ @methodtrace(_logger)
+ def open_device(self, dev):
+ handle = _libusb_device_handle()
+ _check(_lib.libusb_open(dev.devid, byref(handle)))
+ return handle
+
+ @methodtrace(_logger)
+ def close_device(self, dev_handle):
+ _lib.libusb_close(dev_handle)
+
+ @methodtrace(_logger)
+ def set_configuration(self, dev_handle, config_value):
+ _check(_lib.libusb_set_configuration(dev_handle, config_value))
+
+ @methodtrace(_logger)
+ def get_configuration(self, dev_handle):
+ config = c_int()
+ _check(_lib.libusb_get_configuration(dev_handle, byref(config)))
+ return config.value
+
+ @methodtrace(_logger)
+ def set_interface_altsetting(self, dev_handle, intf, altsetting):
+ _check(_lib.libusb_set_interface_alt_setting(dev_handle,
+ intf,
+ altsetting))
+
+ @methodtrace(_logger)
+ def claim_interface(self, dev_handle, intf):
+ _check(_lib.libusb_claim_interface(dev_handle, intf))
+
+ @methodtrace(_logger)
+ def release_interface(self, dev_handle, intf):
+ _check(_lib.libusb_release_interface(dev_handle, intf))
+
+ @methodtrace(_logger)
+ def bulk_write(self, dev_handle, ep, intf, data, timeout):
+ return self.__write(_lib.libusb_bulk_transfer,
+ dev_handle,
+ ep,
+ intf,
+ data,
+ timeout)
+
+ @methodtrace(_logger)
+ def bulk_read(self, dev_handle, ep, intf, size, timeout):
+ return self.__read(_lib.libusb_bulk_transfer,
+ dev_handle,
+ ep,
+ intf,
+ size,
+ timeout)
+
+ @methodtrace(_logger)
+ def intr_write(self, dev_handle, ep, intf, data, timeout):
+ return self.__write(_lib.libusb_interrupt_transfer,
+ dev_handle,
+ ep,
+ intf,
+ data,
+ timeout)
+
+ @methodtrace(_logger)
+ def intr_read(self, dev_handle, ep, intf, size, timeout):
+ return self.__read(_lib.libusb_interrupt_transfer,
+ dev_handle,
+ ep,
+ intf,
+ size,
+ timeout)
+
+# TODO: implement isochronous
+# @methodtrace(_logger)
+# def iso_write(self, dev_handle, ep, intf, data, timeout):
+# pass
+
+
+# @methodtrace(_logger)
+# def iso_read(self, dev_handle, ep, intf, size, timeout):
+# pass
+
+ @methodtrace(_logger)
+ def ctrl_transfer(self,
+ dev_handle,
+ bmRequestType,
+ bRequest,
+ wValue,
+ wIndex,
+ data_or_wLength,
+ timeout):
+ if usb.util.ctrl_direction(bmRequestType) == usb.util.CTRL_OUT:
+ buff = data_or_wLength
+ else:
+ buff = _interop.as_array((0,) * data_or_wLength)
+
+ addr, length = buff.buffer_info()
+ length *= buff.itemsize
+
+ ret = _check(_lib.libusb_control_transfer(dev_handle,
+ bmRequestType,
+ bRequest,
+ wValue,
+ wIndex,
+ cast(addr,
+ POINTER(c_ubyte)),
+ length,
+ timeout))
+
+ if usb.util.ctrl_direction(bmRequestType) == usb.util.CTRL_OUT:
+ return ret.value
+ else:
+ return buff[:ret.value]
+
+ @methodtrace(_logger)
+ def reset_device(self, dev_handle):
+ _check(_lib.libusb_reset_device(dev_handle))
+
+ @methodtrace(_logger)
+ def is_kernel_driver_active(self, dev_handle, intf):
+ return bool(_check(_lib.libusb_kernel_driver_active(dev_handle, intf)))
+
+ @methodtrace(_logger)
+ def detach_kernel_driver(self, dev_handle, intf):
+ _check(_lib.libusb_detach_kernel_driver(dev_handle, intf))
+
+ @methodtrace(_logger)
+ def attach_kernel_driver(self, dev_handle, intf):
+ _check(_lib.libusb_attach_kernel_driver(dev_handle, intf))
+
+ def __write(self, fn, dev_handle, ep, intf, data, timeout):
+ address, length = data.buffer_info()
+ length *= data.itemsize
+ transferred = c_int()
+ _check(fn(dev_handle,
+ ep,
+ cast(address, POINTER(c_ubyte)),
+ length,
+ byref(transferred),
+ timeout))
+ return transferred.value
+
+ def __read(self, fn, dev_handle, ep, intf, size, timeout):
+ data = _interop.as_array((0,) * size)
+ address, length = data.buffer_info()
+ length *= data.itemsize
+ transferred = c_int()
+ _check(fn(dev_handle,
+ ep,
+ cast(address, POINTER(c_ubyte)),
+ length,
+ byref(transferred),
+ timeout))
+ return data[:transferred.value]
+
+def get_backend():
+ global _lib, _init
+ try:
+ if _lib is None:
+ _lib = _load_library()
+ _setup_prototypes(_lib)
+ _init = _Initializer()
+ return _LibUSB()
+ except Exception:
+ _logger.error('Error loading libusb 1.0 backend', exc_info=True)
+ return None
diff --git a/plugins/wedo_plugin/usb/backend/openusb.py b/plugins/wedo_plugin/usb/backend/openusb.py
new file mode 100644
index 0000000..23e4d45
--- /dev/null
+++ b/plugins/wedo_plugin/usb/backend/openusb.py
@@ -0,0 +1,707 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+from ctypes import *
+import ctypes.util
+import usb.util
+from usb._debug import methodtrace
+import logging
+import errno
+
+__author__ = 'Wander Lairson Costa'
+
+__all__ = [
+ 'get_backend'
+ 'OPENUSB_SUCCESS'
+ 'OPENUSB_PLATFORM_FAILURE'
+ 'OPENUSB_NO_RESOURCES'
+ 'OPENUSB_NO_BANDWIDTH'
+ 'OPENUSB_NOT_SUPPORTED'
+ 'OPENUSB_HC_HARDWARE_ERROR'
+ 'OPENUSB_INVALID_PERM'
+ 'OPENUSB_BUSY'
+ 'OPENUSB_BADARG'
+ 'OPENUSB_NOACCESS'
+ 'OPENUSB_PARSE_ERROR'
+ 'OPENUSB_UNKNOWN_DEVICE'
+ 'OPENUSB_INVALID_HANDLE'
+ 'OPENUSB_SYS_FUNC_FAILURE'
+ 'OPENUSB_NULL_LIST'
+ 'OPENUSB_CB_CONTINUE'
+ 'OPENUSB_CB_TERMINATE'
+ 'OPENUSB_IO_STALL'
+ 'OPENUSB_IO_CRC_ERROR'
+ 'OPENUSB_IO_DEVICE_HUNG'
+ 'OPENUSB_IO_REQ_TOO_BIG'
+ 'OPENUSB_IO_BIT_STUFFING'
+ 'OPENUSB_IO_UNEXPECTED_PID'
+ 'OPENUSB_IO_DATA_OVERRUN'
+ 'OPENUSB_IO_DATA_UNDERRUN'
+ 'OPENUSB_IO_BUFFER_OVERRUN'
+ 'OPENUSB_IO_BUFFER_UNDERRUN'
+ 'OPENUSB_IO_PID_CHECK_FAILURE'
+ 'OPENUSB_IO_DATA_TOGGLE_MISMATCH'
+ 'OPENUSB_IO_TIMEOUT'
+ 'OPENUSB_IO_CANCELED'
+ ]
+
+_logger = logging.getLogger('usb.backend.openusb')
+
+OPENUSB_SUCCESS = 0
+OPENUSB_PLATFORM_FAILURE = -1
+OPENUSB_NO_RESOURCES = -2
+OPENUSB_NO_BANDWIDTH = -3
+OPENUSB_NOT_SUPPORTED = -4
+OPENUSB_HC_HARDWARE_ERROR = -5
+OPENUSB_INVALID_PERM = -6
+OPENUSB_BUSY = -7
+OPENUSB_BADARG = -8
+OPENUSB_NOACCESS = -9
+OPENUSB_PARSE_ERROR = -10
+OPENUSB_UNKNOWN_DEVICE = -11
+OPENUSB_INVALID_HANDLE = -12
+OPENUSB_SYS_FUNC_FAILURE = -13
+OPENUSB_NULL_LIST = -14
+OPENUSB_CB_CONTINUE = -20
+OPENUSB_CB_TERMINATE = -21
+OPENUSB_IO_STALL = -50
+OPENUSB_IO_CRC_ERROR = -51
+OPENUSB_IO_DEVICE_HUNG = -52
+OPENUSB_IO_REQ_TOO_BIG = -53
+OPENUSB_IO_BIT_STUFFING = -54
+OPENUSB_IO_UNEXPECTED_PID = -55
+OPENUSB_IO_DATA_OVERRUN = -56
+OPENUSB_IO_DATA_UNDERRUN = -57
+OPENUSB_IO_BUFFER_OVERRUN = -58
+OPENUSB_IO_BUFFER_UNDERRUN = -59
+OPENUSB_IO_PID_CHECK_FAILURE = -60
+OPENUSB_IO_DATA_TOGGLE_MISMATCH = -61
+OPENUSB_IO_TIMEOUT = -62
+OPENUSB_IO_CANCELED = -63
+
+_openusb_errno = {
+ OPENUSB_SUCCESS:None,
+ OPENUSB_PLATFORM_FAILURE:None,
+ OPENUSB_NO_RESOURCES:errno.__dict__.get('ENOMEM', None),
+ OPENUSB_NO_BANDWIDTH:None,
+ OPENUSB_NOT_SUPPORTED:errno.__dict__.get('ENOSYS', None),
+ OPENUSB_HC_HARDWARE_ERROR:errno.__dict__.get('EIO', None),
+ OPENUSB_INVALID_PERM:errno.__dict__.get('EBADF', None),
+ OPENUSB_BUSY:errno.__dict__.get('EBUSY', None),
+ OPENUSB_BADARG:errno.__dict__.get('EINVAL', None),
+ OPENUSB_NOACCESS:errno.__dict__.get('EACCES', None),
+ OPENUSB_PARSE_ERROR:None,
+ OPENUSB_UNKNOWN_DEVICE:errno.__dict__.get('ENODEV', None),
+ OPENUSB_INVALID_HANDLE:errno.__dict__.get('EINVAL', None),
+ OPENUSB_SYS_FUNC_FAILURE:None,
+ OPENUSB_NULL_LIST:None,
+ OPENUSB_CB_CONTINUE:None,
+ OPENUSB_CB_TERMINATE:None,
+ OPENUSB_IO_STALL:errno.__dict__.get('EIO', None),
+ OPENUSB_IO_CRC_ERROR:errno.__dict__.get('EIO', None),
+ OPENUSB_IO_DEVICE_HUNG:errno.__dict__.get('EIO', None),
+ OPENUSB_IO_REQ_TOO_BIG:errno.__dict__.get('E2BIG', None),
+ OPENUSB_IO_BIT_STUFFING:None,
+ OPENUSB_IO_UNEXPECTED_PID:errno.__dict__.get('ESRCH', None),
+ OPENUSB_IO_DATA_OVERRUN:errno.__dict__.get('EOVERFLOW', None),
+ OPENUSB_IO_DATA_UNDERRUN:None,
+ OPENUSB_IO_BUFFER_OVERRUN:errno.__dict__.get('EOVERFLOW', None),
+ OPENUSB_IO_BUFFER_UNDERRUN:None,
+ OPENUSB_IO_PID_CHECK_FAILURE:None,
+ OPENUSB_IO_DATA_TOGGLE_MISMATCH:None,
+ OPENUSB_IO_TIMEOUT:errno.__dict__.get('ETIMEDOUT', None),
+ OPENUSB_IO_CANCELED:errno.__dict__.get('EINTR', None)
+}
+
+class _usb_endpoint_desc(Structure):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bEndpointAddress', c_uint8),
+ ('bmAttributes', c_uint8),
+ ('wMaxPacketSize', c_uint16),
+ ('bInterval', c_uint8),
+ ('bRefresh', c_uint8),
+ ('bSynchAddress', c_uint8)]
+
+class _usb_interface_desc(Structure):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bInterfaceNumber', c_uint8),
+ ('bAlternateSetting', c_uint8),
+ ('bNumEndpoints', c_uint8),
+ ('bInterfaceClass', c_uint8),
+ ('bInterfaceSubClass', c_uint8),
+ ('bInterfaceProtocol', c_uint8),
+ ('iInterface', c_uint8)]
+
+class _usb_config_desc(Structure):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('wTotalLength', c_uint16),
+ ('bNumInterfaces', c_uint8),
+ ('bConfigurationValue', c_uint8),
+ ('iConfiguration', c_uint8),
+ ('bmAttributes', c_uint8),
+ ('bMaxPower', c_uint8)]
+
+class _usb_device_desc(Structure):
+ _fields_ = [('bLength', c_uint8),
+ ('bDescriptorType', c_uint8),
+ ('bcdUSB', c_uint16),
+ ('bDeviceClass', c_uint8),
+ ('bDeviceSubClass', c_uint8),
+ ('bDeviceProtocol', c_uint8),
+ ('bMaxPacketSize0', c_uint8),
+ ('idVendor', c_uint16),
+ ('idProduct', c_uint16),
+ ('bcdDevice', c_uint16),
+ ('iManufacturer', c_uint8),
+ ('iProduct', c_uint8),
+ ('iSerialNumber', c_uint8),
+ ('bNumConfigurations', c_uint8)]
+
+class _openusb_request_result(Structure):
+ _fields_ = [('status', c_int32),
+ ('transfered_bytes', c_uint32)]
+
+class _openusb_ctrl_request(Structure):
+ class _openusb_ctrl_setup(Structure):
+ _fields_ = [('bmRequestType', c_uint8),
+ ('bRequest', c_uint8),
+ ('wValue', c_uint16),
+ ('wIndex', c_uint16)]
+ _fields_ = [('payload', POINTER(c_uint8)),
+ ('length', c_uint32),
+ ('timeout', c_uint32),
+ ('flags', c_uint32),
+ ('result', _openusb_request_result),
+ ('next', c_void_p)]
+
+class _openusb_intr_request(Structure):
+ _fields_ = [('interval', c_uint16),
+ ('payload', POINTER(c_uint8)),
+ ('length', c_uint32),
+ ('timeout', c_uint32),
+ ('flags', c_uint32),
+ ('result', _openusb_request_result),
+ ('next', c_void_p)]
+
+class _openusb_bulk_request(Structure):
+ _fields_ = [('payload', POINTER(c_uint8)),
+ ('length', c_uint32),
+ ('timeout', c_uint32),
+ ('flags', c_uint32),
+ ('result', _openusb_request_result),
+ ('next', c_void_p)]
+
+class _openusb_isoc_pkts(Structure):
+ class _openusb_isoc_packet(Structure):
+ _fields_ = [('payload', POINTER(c_uint8)),
+ ('length', c_uint32)]
+ _fields_ = [('num_packets', c_uint32),
+ ('packets', POINTER(_openusb_isoc_packet))]
+
+class _openusb_isoc_request(Structure):
+ _fields_ = [('start_frame', c_uint32),
+ ('flags', c_uint32),
+ ('pkts', _openusb_isoc_pkts),
+ ('isoc_results', POINTER(_openusb_request_result)),
+ ('isoc_status', c_int32),
+ ('next', c_void_p)]
+
+_openusb_devid = c_uint64
+_openusb_busid = c_uint64
+_openusb_handle = c_uint64
+_openusb_dev_handle = c_uint64
+
+_lib = None
+_ctx = None
+
+def _load_library():
+ libname = ctypes.util.find_library('openusb')
+ if libname is None:
+ raise OSError('USB library could not be found')
+ return CDLL(libname)
+
+def _setup_prototypes(lib):
+ # int32_t openusb_init(uint32_t flags , openusb_handle_t *handle);
+ lib.openusb_init.argtypes = [c_uint32, POINTER(_openusb_handle)]
+ lib.openusb_init.restype = c_int32
+
+ # void openusb_fini(openusb_handle_t handle );
+ lib.openusb_fini.argtypes = [_openusb_handle]
+
+ # uint32_t openusb_get_busid_list(openusb_handle_t handle,
+ # openusb_busid_t **busids,
+ # uint32_t *num_busids);
+ lib.openusb_get_busid_list.argtypes = [
+ _openusb_handle,
+ POINTER(POINTER(_openusb_busid)),
+ POINTER(c_uint32)
+ ]
+
+ # void openusb_free_busid_list(openusb_busid_t * busids);
+ lib.openusb_free_busid_list.argtypes = [POINTER(_openusb_busid)]
+
+ # uint32_t openusb_get_devids_by_bus(openusb_handle_t handle,
+ # openusb_busid_t busid,
+ # openusb_devid_t **devids,
+ # uint32_t *num_devids);
+ lib.openusb_get_devids_by_bus.argtypes = [
+ _openusb_handle,
+ _openusb_busid,
+ POINTER(POINTER(_openusb_devid)),
+ POINTER(c_uint32)
+ ]
+
+ lib.openusb_get_devids_by_bus.restype = c_int32
+
+ # void openusb_free_devid_list(openusb_devid_t * devids);
+ lib.openusb_free_devid_list.argtypes = [POINTER(_openusb_devid)]
+
+ # int32_t openusb_open_device(openusb_handle_t handle,
+ # openusb_devid_t devid ,
+ # uint32_t flags,
+ # openusb_dev_handle_t *dev);
+ lib.openusb_open_device.argtypes = [
+ _openusb_handle,
+ _openusb_devid,
+ c_uint32,
+ POINTER(_openusb_dev_handle)
+ ]
+
+ lib.openusb_open_device.restype = c_int32
+
+ # int32_t openusb_close_device(openusb_dev_handle_t dev);
+ lib.openusb_close_device.argtypes = [_openusb_dev_handle]
+ lib.openusb_close_device.restype = c_int32
+
+ # int32_t openusb_set_configuration(openusb_dev_handle_t dev,
+ # uint8_t cfg);
+ lib.openusb_set_configuration.argtypes = [_openusb_dev_handle, c_uint8]
+ lib.openusb_set_configuration.restype = c_int32
+
+ # int32_t openusb_get_configuration(openusb_dev_handle_t dev,
+ # uint8_t *cfg);
+ lib.openusb_get_configuration.argtypes = [_openusb_dev_handle, POINTER(c_uint8)]
+ lib.openusb_get_configuration.restype = c_int32
+
+ # int32_t openusb_claim_interface(openusb_dev_handle_t dev,
+ # uint8_t ifc,
+ # openusb_init_flag_t flags);
+ lib.openusb_claim_interface.argtypes = [
+ _openusb_dev_handle,
+ c_uint8,
+ c_int
+ ]
+
+ lib.openusb_claim_interface.restype = c_int32
+
+ # int32_t openusb_release_interface(openusb_dev_handle_t dev,
+ # uint8_t ifc);
+ lib.openusb_release_interface.argtypes = [
+ _openusb_dev_handle,
+ c_uint8
+ ]
+
+ lib.openusb_release_interface.restype = c_int32
+
+ # int32_topenusb_set_altsetting(openusb_dev_handle_t dev,
+ # uint8_t ifc,
+ # uint8_t alt);
+ lib.openusb_set_altsetting.argtypes = [
+ _openusb_dev_handle,
+ c_uint8,
+ c_uint8
+ ]
+ lib.openusb_set_altsetting.restype = c_int32
+
+ # int32_t openusb_reset(openusb_dev_handle_t dev);
+ lib.openusb_reset.argtypes = [_openusb_dev_handle]
+ lib.openusb_reset.restype = c_int32
+
+ # int32_t openusb_parse_device_desc(openusb_handle_t handle,
+ # openusb_devid_t devid,
+ # uint8_t *buffer,
+ # uint16_t buflen,
+ # usb_device_desc_t *devdesc);
+ lib.openusb_parse_device_desc.argtypes = [
+ _openusb_handle,
+ _openusb_devid,
+ POINTER(c_uint8),
+ c_uint16,
+ POINTER(_usb_device_desc)
+ ]
+
+ lib.openusb_parse_device_desc.restype = c_int32
+
+ # int32_t openusb_parse_config_desc(openusb_handle_t handle,
+ # openusb_devid_t devid,
+ # uint8_t *buffer,
+ # uint16_t buflen,
+ # uint8_t cfgidx,
+ # usb_config_desc_t *cfgdesc);
+ lib.openusb_parse_config_desc.argtypes = [
+ _openusb_handle,
+ _openusb_devid,
+ POINTER(c_uint8),
+ c_uint16,
+ c_uint8,
+ POINTER(_usb_config_desc)
+ ]
+ lib.openusb_parse_config_desc.restype = c_int32
+
+ # int32_t openusb_parse_interface_desc(openusb_handle_t handle,
+ # openusb_devid_t devid,
+ # uint8_t *buffer,
+ # uint16_t buflen,
+ # uint8_t cfgidx,
+ # uint8_t ifcidx,
+ # uint8_t alt,
+ # usb_interface_desc_t *ifcdesc);
+ lib.openusb_parse_interface_desc.argtypes = [
+ _openusb_handle,
+ _openusb_devid,
+ POINTER(c_uint8),
+ c_uint16,
+ c_uint8,
+ c_uint8,
+ c_uint8,
+ POINTER(_usb_interface_desc)
+ ]
+
+ lib.openusb_parse_interface_desc.restype = c_int32
+
+ # int32_t openusb_parse_endpoint_desc(openusb_handle_t handle,
+ # openusb_devid_t devid,
+ # uint8_t *buffer,
+ # uint16_t buflen,
+ # uint8_t cfgidx,
+ # uint8_t ifcidx,
+ # uint8_t alt,
+ # uint8_t eptidx,
+ # usb_endpoint_desc_t *eptdesc);
+ lib.openusb_parse_endpoint_desc.argtypes = [
+ _openusb_handle,
+ _openusb_devid,
+ POINTER(c_uint8),
+ c_uint16,
+ c_uint8,
+ c_uint8,
+ c_uint8,
+ c_uint8,
+ POINTER(_usb_endpoint_desc)
+ ]
+
+ lib.openusb_parse_interface_desc.restype = c_int32
+
+ # const char *openusb_strerror(int32_t error );
+ lib.openusb_strerror.argtypes = [c_int32]
+ lib.openusb_strerror.restype = c_char_p
+
+ # int32_t openusb_ctrl_xfer(openusb_dev_handle_t dev,
+ # uint8_t ifc,
+ # uint8_t ept,
+ # openusb_ctrl_request_t *ctrl);
+ lib.openusb_ctrl_xfer.argtypes = [
+ _openusb_dev_handle,
+ c_uint8,
+ c_uint8,
+ POINTER(_openusb_ctrl_request)
+ ]
+
+ lib.openusb_ctrl_xfer.restype = c_int32
+
+ # int32_t openusb_intr_xfer(openusb_dev_handle_t dev,
+ # uint8_t ifc,
+ # uint8_t ept,
+ # openusb_intr_request_t *intr);
+ lib.openusb_intr_xfer.argtypes = [
+ _openusb_dev_handle,
+ c_uint8,
+ c_uint8,
+ POINTER(_openusb_intr_request)
+ ]
+
+ lib.openusb_bulk_xfer.restype = c_int32
+
+ # int32_t openusb_bulk_xfer(openusb_dev_handle_t dev,
+ # uint8_t ifc,
+ # uint8_t ept,
+ # openusb_bulk_request_t *bulk);
+ lib.openusb_bulk_xfer.argtypes = [
+ _openusb_dev_handle,
+ c_uint8,
+ c_uint8,
+ POINTER(_openusb_bulk_request)
+ ]
+
+ lib.openusb_bulk_xfer.restype = c_int32
+
+ # int32_t openusb_isoc_xfer(openusb_dev_handle_t dev,
+ # uint8_t ifc,
+ # uint8_t ept,
+ # openusb_isoc_request_t *isoc);
+ lib.openusb_isoc_xfer.argtypes = [
+ _openusb_dev_handle,
+ c_uint8,
+ c_uint8,
+ POINTER(_openusb_isoc_request)
+ ]
+
+ lib.openusb_isoc_xfer.restype = c_int32
+
+def _check(retval):
+ ret = retval.value
+ if ret != 0:
+ from usb.core import USBError
+ raise USBError(_lib.openusb_strerror(ret), ret, _openusb_errno[ret])
+ return retval
+
+class _Context(object):
+ def __init__(self):
+ self.handle = _openusb_handle()
+ _check(_lib.openusb_init(0, byref(self.handle)))
+ def __del__(self):
+ _lib.openusb_fini(self.handle)
+
+class _BusIterator(object):
+ def __init__(self):
+ self.buslist = POINTER(openusb_busid)()
+ num_busids = c_uint32()
+ _check(_lib.openusb_get_busid_list(_ctx.handle,
+ byref(self.buslist),
+ byref(num_busids)))
+ self.num_busids = num_busids.value
+ def __iter__(self):
+ for i in range(self.num_busids):
+ yield self.buslist[i]
+ def __del__(self):
+ _lib.openusb_free_busid_list(self.buslist)
+
+class _DevIterator(object):
+ def __init__(self, busid):
+ self.devlist = POINTER(_openusb_devid)()
+ num_devids = c_uint32()
+ _check(_lib.openusb_get_devids_by_bus(_ctx.handle,
+ busid,
+ byref(self.devlist),
+ byref(num_devids)))
+ self.num_devids = num_devids.value
+ def __iter__(self):
+ for i in range(self.num_devids):
+ yield self.devlist[i]
+ def __del__(self):
+ _lib.openusb_free_devid_list(self.devlist)
+
+class _OpenUSB(usb.backend.IBackend):
+ @methodtrace(_logger)
+ def enumerate_devices(self):
+ for bus in _BusIterator():
+ for devid in _DevIterator(bus):
+ yield devid
+
+ @methodtrace(_logger)
+ def get_device_descriptor(self, dev):
+ desc = _usb_device_desc()
+ _check(_lib.openusb_parse_device_desc(_ctx.handle,
+ dev,
+ None,
+ 0,
+ byref(desc)))
+ desc.bus = None
+ desc.address = None
+ return desc
+
+ @methodtrace(_logger)
+ def get_configuration_descriptor(self, dev, config):
+ desc = _usb_config_desc()
+ _check(_lib.openusb_parse_config_desc(_ctx.handle,
+ dev,
+ None,
+ 0,
+ config,
+ byref(desc)))
+ return desc
+
+ @methodtrace(_logger)
+ def get_interface_descriptor(self, dev, intf, alt, config):
+ desc = _usb_interface_desc()
+ _check(_lib.openusb_parse_interface_desc(_ctx.handle,
+ dev,
+ None,
+ 0,
+ config,
+ intf,
+ alt,
+ byref(desc)))
+ return desc
+
+ @methodtrace(_logger)
+ def get_endpoint_descriptor(self, dev, ep, intf, alt, config):
+ desc = _usb_endpoint_desc()
+ _check(_lib.openusb_parse_endpoint_desc(_ctx.handle,
+ dev,
+ None,
+ 0,
+ config,
+ intf,
+ alt,
+ ep,
+ byref(desc)))
+ return desc
+
+ @methodtrace(_logger)
+ def open_device(self, dev):
+ handle = _openusb_dev_handle()
+ _check(_lib.openusb_open_device(_ctx.handle, dev, 0, byref(handle)))
+ return handle
+
+ @methodtrace(_logger)
+ def close_device(self, dev_handle):
+ _lib.openusb_close_device(dev_handle)
+
+ @methodtrace(_logger)
+ def set_configuration(self, dev_handle, config_value):
+ _check(_lib.openusb_set_configuration(dev_handle, config_value))
+
+ @methodtrace(_logger)
+ def get_configuration(self, dev_handle):
+ config = c_uint8()
+ _check(_lib.openusb_get_configuration(dev_handle, byref(config)))
+ return config.value
+
+ @methodtrace(_logger)
+ def set_interface_altsetting(self, dev_handle, intf, altsetting):
+ _check(_lib.set_altsetting(dev_handle, intf, altsetting))
+
+ @methodtrace(_logger)
+ def claim_interface(self, dev_handle, intf):
+ _check(_lib.openusb_claim_interface(dev_handle, intf, 0))
+
+ @methodtrace(_logger)
+ def release_interface(self, dev_handle, intf):
+ _lib.openusb_release_interface(dev_handle, intf)
+
+ @methodtrace(_logger)
+ def bulk_write(self, dev_handle, ep, intf, data, timeout):
+ request = _openusb_bulk_request()
+ memset(byref(request), 0, sizeof(request))
+ request.payload, request.length = data.buffer_info()
+ request.timeout = timeout
+ _check(_lib.openusb_bulk_xfer(dev_handle, intf, ep, byref(request)))
+ return request.transfered_bytes.value
+
+ @methodtrace(_logger)
+ def bulk_read(self, dev_handle, ep, intf, size, timeout):
+ request = _openusb_bulk_request()
+ buffer = array.array('B', '\x00' * size)
+ memset(byref(request), 0, sizeof(request))
+ request.payload, request.length = buffer.buffer_info()
+ request.timeout = timeout
+ _check(_lib.openusb_bulk_xfer(dev_handle, intf, ep, byref(request)))
+ return buffer[:request.transfered_bytes.value]
+
+ @methodtrace(_logger)
+ def intr_write(self, dev_handle, ep, intf, data, timeout):
+ request = _openusb_intr_request()
+ memset(byref(request), 0, sizeof(request))
+ payload, request.length = data.buffer_info()
+ request.payload = cast(payload, POINTER(c_uint8))
+ request.timeout = timeout
+ _check(_lib.openusb_intr_xfer(dev_handle, intf, ep, byref(request)))
+ return request.transfered_bytes.value
+
+ @methodtrace(_logger)
+ def intr_read(self, dev_handle, ep, intf, size, timeout):
+ request = _openusb_intr_request()
+ buffer = array.array('B', '\x00' * size)
+ memset(byref(request), 0, sizeof(request))
+ payload, request.length = buffer.buffer_info()
+ request.payload = cast(payload, POINTER(c_uint8))
+ request.timeout = timeout
+ _check(_lib.openusb_intr_xfer(dev_handle, intf, ep, byref(request)))
+ return buffer[:request.transfered_bytes.value]
+
+# TODO: implement isochronous
+# @methodtrace(_logger)
+# def iso_write(self, dev_handle, ep, intf, data, timeout):
+# pass
+
+# @methodtrace(_logger)
+# def iso_read(self, dev_handle, ep, intf, size, timeout):
+# pass
+
+ @methodtrace(_logger)
+ def ctrl_transfer(self,
+ dev_handle,
+ bmRequestType,
+ bRequest,
+ wValue,
+ wIndex,
+ data_or_wLength,
+ timeout):
+ request = _openusb_ctrl_request()
+ request.setup.bmRequestType = bmRequestType
+ request.setup.bRequest = bRequest
+ request.setup.wValue
+ request.setup.wIndex
+ request.timeout = timeout
+
+ direction = usb.util.ctrl_direction(bmRequestType)
+
+ if direction == ENDPOINT_OUT:
+ buffer = data_or_wLength
+ else:
+ buffer = array.array('B', '\x00' * data_or_wLength)
+
+ payload, request.length = buffer.buffer_info()
+ request.payload = cast(payload, POINTER(c_uint8))
+
+ ret = _check(_lib.openusb_ctrl_xfer(dev_handle, 0, 0, byref(request)))
+
+ if direction == ENDPOINT_OUT:
+ ret
+ else:
+ buffer[:ret]
+
+ @methodtrace(_logger)
+ def reset_device(self, dev_handle):
+ _check(_lib.openusb_reset(dev_handle))
+
+def get_backend():
+ try:
+ global _lib, _ctx
+ if _lib is None:
+ _lib = _load_library()
+ _setup_prototypes(_lib)
+ _ctx = _Context()
+ return _OpenUSB()
+ except Exception:
+ _logger.error('Error loading OpenUSB backend', exc_info=True)
+ return None
diff --git a/plugins/wedo_plugin/usb/control.py b/plugins/wedo_plugin/usb/control.py
new file mode 100644
index 0000000..8647c14
--- /dev/null
+++ b/plugins/wedo_plugin/usb/control.py
@@ -0,0 +1,252 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+r"""usb.control - USB standard control requests
+
+This module exports:
+
+get_status - get recipeint status
+clear_feature - clear a recipient feature
+set_feature - set a recipient feature
+get_descriptor - get a device descriptor
+set_descriptor - set a device descriptor
+get_configuration - get a device configuration
+set_configuration - set a device configuration
+get_interface - get a device interface
+set_interface - set a device interface
+"""
+
+__author__ = 'Wander Lairson Costa'
+
+__all__ = ['get_status',
+ 'clear_feature',
+ 'set_feature',
+ 'get_descriptor',
+ 'set_descriptor',
+ 'get_configuration',
+ 'set_configuration',
+ 'get_interface',
+ 'set_interface',
+ 'ENDPOINT_HALT',
+ 'FUNCTION_SUSPEND',
+ 'DEVICE_REMOTE_WAKEUP',
+ 'U1_ENABLE',
+ 'U2_ENABLE',
+ 'LTM_ENABLE']
+
+import usb.util as util
+import usb.core as core
+
+def _parse_recipient(recipient, direction):
+ if recipient is None:
+ r = util.CTRL_RECIPIENT_DEVICE
+ wIndex = 0
+ elif isinstance(recipient, core.Interface):
+ r = util.CTRL_RECIPIENT_INTERFACE
+ wIndex = recipient.bInterfaceNumber
+ elif isinstance(recipient, core.Endpoint):
+ r = util.CTRL_RECIPIENT_ENDPOINT
+ wIndex = recipient.bEndpointAddress
+ else:
+ raise ValueError('Invalid recipient.')
+ bmRequestType = util.build_request_type(
+ direction,
+ util.CTRL_TYPE_STANDARD,
+ r
+ )
+ return (bmRequestType, wIndex)
+
+# standard feature selectors from USB 2.0/3.0
+ENDPOINT_HALT = 0
+FUNCTION_SUSPEND = 0
+DEVICE_REMOTE_WAKEUP = 1
+U1_ENABLE = 48
+U2_ENABLE = 49
+LTM_ENABLE = 50
+
+def get_status(dev, recipient = None):
+ r"""Return the status for the specified recipient.
+
+ dev is the Device object to which the request will be
+ sent to.
+
+ The recipient can be None (on which the status will be queried
+ on the device), an Interface or Endpoint descriptors.
+
+ The status value is returned as an integer with the lower
+ word being the two bytes status value.
+ """
+ bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_IN)
+ ret = dev.ctrl_transfer(bmRequestType = bmRequestType,
+ bRequest = 0x00,
+ wIndex = wIndex,
+ data_or_wLength = 2)
+ return ret[0] | (ret[1] << 8)
+
+def clear_feature(dev, feature, recipient = None):
+ r"""Clear/disable a specific feature.
+
+ dev is the Device object to which the request will be
+ sent to.
+
+ feature is the feature you want to disable.
+
+ The recipient can be None (on which the status will be queried
+ on the device), an Interface or Endpoint descriptors.
+ """
+ bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_OUT)
+ dev.ctrl_transfer(bmRequestType = bmRequestType,
+ bRequest = 0x01,
+ wIndex = wIndex,
+ wValue = feature)
+
+def set_feature(dev, feature, recipient = None):
+ r"""Set/enable a specific feature.
+
+ dev is the Device object to which the request will be
+ sent to.
+
+ feature is the feature you want to enable.
+
+ The recipient can be None (on which the status will be queried
+ on the device), an Interface or Endpoint descriptors.
+ """
+ bmRequestType, wIndex = _parse_recipient(recipient, util.CTRL_OUT)
+ dev.ctrl_transfer(bmRequestType = bmRequestType,
+ bRequest = 0x03,
+ wIndex = wIndex,
+ wValue = feature)
+
+def get_descriptor(dev, desc_size, desc_type, desc_index, wIndex = 0):
+ r"""Return the specified descriptor.
+
+ dev is the Device object to which the request will be
+ sent to.
+
+ desc_size is the descriptor size.
+
+ desc_type and desc_index are the descriptor type and index,
+ respectively. wIndex index is used for string descriptors
+ and represents the Language ID. For other types of descriptors,
+ it is zero.
+ """
+ wValue = desc_index | (desc_type << 8)
+ bmRequestType = util.build_request_type(
+ util.CTRL_IN,
+ util.CTRL_TYPE_STANDARD,
+ util.CTRL_RECIPIENT_DEVICE
+ )
+ return dev.ctrl_transfer(
+ bmRequestType = bmRequestType,
+ bRequest = 0x06,
+ wValue = wValue,
+ wIndex = wIndex,
+ data_or_wLength = desc_size
+ )
+
+def set_descriptor(dev, desc, desc_type, desc_index, wIndex = None):
+ r"""Update an existing descriptor or add a new one.
+
+ dev is the Device object to which the request will be
+ sent to.
+
+ The desc parameter is the descriptor to be sent to the device.
+ desc_type and desc_index are the descriptor type and index,
+ respectively. wIndex index is used for string descriptors
+ and represents the Language ID. For other types of descriptors,
+ it is zero.
+ """
+ wValue = desc_index | (desc_type << 8)
+ bmRequestType = util.build_request_type(
+ util.CTRL_OUT,
+ util.CTRL_TYPE_STANDARD,
+ util.CTRL_RECIPIENT_DEVICE
+ )
+ dev.ctrl_transfer(
+ bmRequestType = bmRequestType,
+ bRequest = 0x07,
+ wValue = wValue,
+ wIndex = wIndex,
+ data_or_wLength = desc
+ )
+
+def get_configuration(dev):
+ r"""Get the current active configuration of the device.
+
+ dev is the Device object to which the request will be
+ sent to.
+
+ This function differs from the Device.get_active_configuration
+ method because the later may use cached data, while this
+ function always does a device request.
+ """
+ bmRequestType = util.build_request_type(
+ util.CTRL_IN,
+ util.CTRL_TYPE_STANDARD,
+ util.CTRL_RECIPIENT_DEVICE
+ )
+ return dev.ctrl_transfer(
+ bmRequestType,
+ bRequest = 0x08,
+ data_or_wLength = 1
+ )[0]
+
+def set_configuration(dev, bConfigurationNumber):
+ r"""Set the current device configuration.
+
+ dev is the Device object to which the request will be
+ sent to.
+ """
+ dev.set_configuration(bConfigurationNumber)
+
+def get_interface(dev, bInterfaceNumber):
+ r"""Get the current alternate setting of the interface.
+
+ dev is the Device object to which the request will be
+ sent to.
+ """
+ bmRequestType = util.build_request_type(
+ util.CTRL_IN,
+ util.CTRL_TYPE_STANDARD,
+ util.CTRL_RECIPIENT_INTERFACE
+ )
+ return dev.ctrl_transfer(
+ bmRequestType = bmRequestType,
+ bRequest = 0x0a,
+ wIndex = bInterfaceNumber,
+ data_or_wLength = 1
+ )[0]
+
+def set_interface(dev, bInterfaceNumber, bAlternateSetting):
+ r"""Set the alternate setting of the interface.
+
+ dev is the Device object to which the request will be
+ sent to.
+ """
+ dev.set_interface_altsetting(bInterfaceNumber, bAlternateSetting)
+
diff --git a/plugins/wedo_plugin/usb/core.py b/plugins/wedo_plugin/usb/core.py
new file mode 100644
index 0000000..c90d011
--- /dev/null
+++ b/plugins/wedo_plugin/usb/core.py
@@ -0,0 +1,856 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+r"""usb.core - Core USB features.
+
+This module exports:
+
+Device - a class representing a USB device.
+Configuration - a class representing a configuration descriptor.
+Interface - a class representing an interface descriptor.
+Endpoint - a class representing an endpoint descriptor.
+find() - a function to find USB devices.
+"""
+
+__author__ = 'Wander Lairson Costa'
+
+__all__ = ['Device', 'Configuration', 'Interface', 'Endpoint', 'find']
+
+import usb.util as util
+import copy
+import operator
+import usb._interop as _interop
+import logging
+
+_logger = logging.getLogger('usb.core')
+
+_DEFAULT_TIMEOUT = 1000
+
+def _set_attr(input, output, fields):
+ for f in fields:
+ setattr(output, f, int(getattr(input, f)))
+
+class _ResourceManager(object):
+ def __init__(self, dev, backend):
+ self.backend = backend
+ self._active_cfg_index = None
+ self.dev = dev
+ self.handle = None
+ self._claimed_intf = _interop._set()
+ self._alt_set = {}
+ self._ep_type_map = {}
+
+ def managed_open(self):
+ if self.handle is None:
+ self.handle = self.backend.open_device(self.dev)
+ return self.handle
+
+ def managed_close(self):
+ if self.handle is not None:
+ self.backend.close_device(self.handle)
+ self.handle = None
+
+ def managed_set_configuration(self, device, config):
+ if config is None:
+ cfg = device[0]
+ elif isinstance(config, Configuration):
+ cfg = config
+ elif config == 0: # unconfigured state
+ class FakeConfiguration(object):
+ def __init__(self):
+ self.index = None
+ self.bConfigurationValue = 0
+ cfg = FakeConfiguration()
+ else:
+ cfg = util.find_descriptor(device, bConfigurationValue=config)
+ self.managed_open()
+ self.backend.set_configuration(self.handle, cfg.bConfigurationValue)
+ # cache the index instead of the object to avoid cyclic references
+ # of the device and Configuration (Device tracks the _ResourceManager,
+ # which tracks the Configuration, which tracks the Device)
+ self._active_cfg_index = cfg.index
+ # after changing configuration, our alternate setting and endpoint type caches
+ # are not valid anymore
+ self._ep_type_map.clear()
+ self._alt_set.clear()
+
+ def managed_claim_interface(self, device, intf):
+ self.managed_open()
+ if intf is None:
+ cfg = self.get_active_configuration(device)
+ i = cfg[(0,0)].bInterfaceNumber
+ elif isinstance(intf, Interface):
+ i = intf.bInterfaceNumber
+ else:
+ i = intf
+ if i not in self._claimed_intf:
+ self.backend.claim_interface(self.handle, i)
+ self._claimed_intf.add(i)
+
+ def managed_release_interface(self, device, intf):
+ if intf is None:
+ cfg = self.get_active_configuration(device)
+ i = cfg[(0,0)].bInterfaceNumber
+ elif isinstance(intf, Interface):
+ i = intf.bInterfaceNumber
+ else:
+ i = intf
+ if i in self._claimed_intf:
+ self.backend.release_interface(self.handle, i)
+ self._claimed_intf.remove(i)
+
+ def managed_set_interface(self, device, intf, alt):
+ if intf is None:
+ i = self.get_interface(device, intf)
+ elif isinstance(intf, Interface):
+ i = intf
+ else:
+ cfg = self.get_active_configuration(device)
+ if alt is not None:
+ i = util.find_descriptor(cfg, bInterfaceNumber=intf, bAlternateSetting=alt)
+ else:
+ i = util.find_descriptor(cfg, bInterfaceNumber=intf)
+ self.managed_claim_interface(device, i)
+ if alt is None:
+ alt = i.bAlternateSetting
+ self.backend.set_interface_altsetting(self.handle, i.bInterfaceNumber, alt)
+ self._alt_set[i.bInterfaceNumber] = alt
+
+ def get_interface(self, device, intf):
+ # TODO: check the viability of issuing a GET_INTERFACE
+ # request when we don't have a alternate setting cached
+ if intf is None:
+ cfg = self.get_active_configuration(device)
+ return cfg[(0,0)]
+ elif isinstance(intf, Interface):
+ return intf
+ else:
+ cfg = self.get_active_configuration(device)
+ if intf in self._alt_set:
+ return util.find_descriptor(cfg,
+ bInterfaceNumber=intf,
+ bAlternateSetting=self._alt_set[intf])
+ else:
+ return util.find_descriptor(cfg, bInterfaceNumber=intf)
+
+ def get_active_configuration(self, device):
+ if self._active_cfg_index is None:
+ self.managed_open()
+ cfg = util.find_descriptor(
+ device,
+ bConfigurationValue=self.backend.get_configuration(self.handle)
+ )
+ if cfg is None:
+ raise USBError('Configuration not set')
+ self._active_cfg_index = cfg.index
+ return cfg
+ return device[self._active_cfg_index]
+
+ def get_endpoint_type(self, device, address, intf):
+ intf = self.get_interface(device, intf)
+ key = (address, intf.bInterfaceNumber, intf.bAlternateSetting)
+ try:
+ return self._ep_type_map[key]
+ except KeyError:
+ e = util.find_descriptor(intf, bEndpointAddress=address)
+ etype = util.endpoint_type(e.bmAttributes)
+ self._ep_type_map[key] = etype
+ return etype
+
+ def release_all_interfaces(self, device):
+ claimed = copy.copy(self._claimed_intf)
+ for i in claimed:
+ self.managed_release_interface(device, i)
+
+ def dispose(self, device, close_handle = True):
+ self.release_all_interfaces(device)
+ if close_handle:
+ self.managed_close()
+ self._ep_type_map.clear()
+ self._alt_set.clear()
+ self._active_cfg_index = None
+
+class USBError(IOError):
+ r"""Exception class for USB errors.
+
+ Backends must raise this exception when USB related errors occur.
+ The backend specific error code is available through the
+ 'backend_error_code' member variable.
+ """
+
+ def __init__(self, strerror, error_code = None, errno = None):
+ r"""Initialize the object.
+
+ This initializes the USBError object. The strerror and errno are passed
+ to the parent object. The error_code parameter is attributed to the
+ backend_error_code member variable.
+ """
+ IOError.__init__(self, errno, strerror)
+ self.backend_error_code = error_code
+
+class Endpoint(object):
+ r"""Represent an endpoint object.
+
+ This class contains all fields of the Endpoint Descriptor
+ according to the USB Specification. You may access them as class
+ properties. For example, to access the field bEndpointAddress
+ of the endpoint descriptor:
+
+ >>> import usb.core
+ >>> dev = usb.core.find()
+ >>> for cfg in dev:
+ >>> for i in cfg:
+ >>> for e in i:
+ >>> print e.bEndpointAddress
+ """
+
+ def __init__(self, device, endpoint, interface = 0,
+ alternate_setting = 0, configuration = 0):
+ r"""Initialize the Endpoint object.
+
+ The device parameter is the device object returned by the find()
+ function. endpoint is the endpoint logical index (not the endpoint address).
+ The configuration parameter is the logical index of the
+ configuration (not the bConfigurationValue field). The interface
+ parameter is the interface logical index (not the bInterfaceNumber field)
+ and alternate_setting is the alternate setting logical index (not the
+ bAlternateSetting value). Not every interface has more than one alternate
+ setting. In this case, the alternate_setting parameter should be zero.
+ By "logical index" we mean the relative order of the configurations returned by the
+ peripheral as a result of GET_DESCRIPTOR request.
+ """
+ self.device = device
+ intf = Interface(device, interface, alternate_setting, configuration)
+ self.interface = intf.bInterfaceNumber
+ self.index = endpoint
+
+ backend = device._ctx.backend
+
+ desc = backend.get_endpoint_descriptor(
+ device._ctx.dev,
+ endpoint,
+ interface,
+ alternate_setting,
+ configuration
+ )
+
+ _set_attr(
+ desc,
+ self,
+ (
+ 'bLength',
+ 'bDescriptorType',
+ 'bEndpointAddress',
+ 'bmAttributes',
+ 'wMaxPacketSize',
+ 'bInterval',
+ 'bRefresh',
+ 'bSynchAddress'
+ )
+ )
+
+ def write(self, data, timeout = None):
+ r"""Write data to the endpoint.
+
+ The parameter data contains the data to be sent to the endpoint and
+ timeout is the time limit of the operation. The transfer type and
+ endpoint address are automatically inferred.
+
+ The method returns the number of bytes written.
+
+ For details, see the Device.write() method.
+ """
+ return self.device.write(self.bEndpointAddress, data, self.interface, timeout)
+
+ def read(self, size, timeout = None):
+ r"""Read data from the endpoint.
+
+ The parameter size is the number of bytes to read and timeout is the
+ time limit of the operation.The transfer type and endpoint address
+ are automatically inferred.
+
+ The method returns an array.array object with the data read.
+
+ For details, see the Device.read() method.
+ """
+ return self.device.read(self.bEndpointAddress, size, self.interface, timeout)
+
+class Interface(object):
+ r"""Represent an interface object.
+
+ This class contains all fields of the Interface Descriptor
+ according to the USB Specification. You may access them as class
+ properties. For example, to access the field bInterfaceNumber
+ of the interface descriptor:
+
+ >>> import usb.core
+ >>> dev = usb.core.find()
+ >>> for cfg in dev:
+ >>> for i in cfg:
+ >>> print i.bInterfaceNumber
+ """
+
+ def __init__(self, device, interface = 0,
+ alternate_setting = 0, configuration = 0):
+ r"""Initialize the interface object.
+
+ The device parameter is the device object returned by the find()
+ function. The configuration parameter is the logical index of the
+ configuration (not the bConfigurationValue field). The interface
+ parameter is the interface logical index (not the bInterfaceNumber field)
+ and alternate_setting is the alternate setting logical index (not the
+ bAlternateSetting value). Not every interface has more than one alternate
+ setting. In this case, the alternate_setting parameter should be zero.
+ By "logical index" we mean the relative order of the configurations returned by the
+ peripheral as a result of GET_DESCRIPTOR request.
+ """
+ self.device = device
+ self.alternate_index = alternate_setting
+ self.index = interface
+ self.configuration = configuration
+
+ backend = device._ctx.backend
+
+ desc = backend.get_interface_descriptor(
+ self.device._ctx.dev,
+ interface,
+ alternate_setting,
+ configuration
+ )
+
+ _set_attr(
+ desc,
+ self,
+ (
+ 'bLength',
+ 'bDescriptorType',
+ 'bInterfaceNumber',
+ 'bAlternateSetting',
+ 'bNumEndpoints',
+ 'bInterfaceClass',
+ 'bInterfaceSubClass',
+ 'bInterfaceProtocol',
+ 'iInterface',
+ )
+ )
+
+ def set_altsetting(self):
+ r"""Set the interface alternate setting."""
+ self.device.set_interface_altsetting(
+ self.bInterfaceNumber,
+ self.bAlternateSetting
+ )
+
+ def __iter__(self):
+ r"""Iterate over all endpoints of the interface."""
+ for i in range(self.bNumEndpoints):
+ yield Endpoint(
+ self.device,
+ i,
+ self.index,
+ self.alternate_index,
+ self.configuration
+ )
+ def __getitem__(self, index):
+ r"""Return the Endpoint object in the given position."""
+ return Endpoint(
+ self.device,
+ index,
+ self.index,
+ self.alternate_index,
+ self.configuration
+ )
+
+class Configuration(object):
+ r"""Represent a configuration object.
+
+ This class contains all fields of the Configuration Descriptor
+ according to the USB Specification. You may access them as class
+ properties. For example, to access the field bConfigurationValue
+ of the configuration descriptor:
+
+ >>> import usb.core
+ >>> dev = usb.core.find()
+ >>> for cfg in dev:
+ >>> print cfg.bConfigurationValue
+ """
+
+ def __init__(self, device, configuration = 0):
+ r"""Initialize the configuration object.
+
+ The device parameter is the device object returned by the find()
+ function. The configuration parameter is the logical index of the
+ configuration (not the bConfigurationValue field). By "logical index"
+ we mean the relative order of the configurations returned by the
+ peripheral as a result of GET_DESCRIPTOR request.
+ """
+ self.device = device
+ self.index = configuration
+
+ backend = device._ctx.backend
+
+ desc = backend.get_configuration_descriptor(
+ self.device._ctx.dev,
+ configuration
+ )
+
+ _set_attr(
+ desc,
+ self,
+ (
+ 'bLength',
+ 'bDescriptorType',
+ 'wTotalLength',
+ 'bNumInterfaces',
+ 'bConfigurationValue',
+ 'iConfiguration',
+ 'bmAttributes',
+ 'bMaxPower'
+ )
+ )
+
+ def set(self):
+ r"""Set this configuration as the active one."""
+ self.device.set_configuration(self.bConfigurationValue)
+
+ def __iter__(self):
+ r"""Iterate over all interfaces of the configuration."""
+ for i in range(self.bNumInterfaces):
+ alt = 0
+ try:
+ while True:
+ yield Interface(self.device, i, alt, self.index)
+ alt += 1
+ except (USBError, IndexError):
+ pass
+ def __getitem__(self, index):
+ r"""Return the Interface object in the given position.
+
+ index is a tuple of two values with interface index and
+ alternate setting index, respectivally. Example:
+
+ >>> interface = config[(0, 0)]
+ """
+ return Interface(self.device, index[0], index[1], self.index)
+
+
+class Device(object):
+ r"""Device object.
+
+ This class contains all fields of the Device Descriptor according
+ to the USB Specification. You may access them as class properties.
+ For example, to access the field bDescriptorType of the device
+ descriptor:
+
+ >>> import usb.core
+ >>> dev = usb.core.find()
+ >>> dev.bDescriptorType
+
+ Additionally, the class provides methods to communicate with
+ the hardware. Typically, an application will first call the
+ set_configuration() method to put the device in a known configured
+ state, optionally call the set_interface_altsetting() to select the
+ alternate setting (if there is more than one) of the interface used,
+ and call the write() and read() method to send and receive data.
+
+ When working in a new hardware, one first try would be like this:
+
+ >>> import usb.core
+ >>> dev = usb.core.find(idVendor=myVendorId, idProduct=myProductId)
+ >>> dev.set_configuration()
+ >>> dev.write(1, 'test')
+
+ This sample finds the device of interest (myVendorId and myProductId should be
+ replaced by the corresponding values of your device), then configures the device
+ (by default, the configuration value is 1, which is a typical value for most
+ devices) and then writes some data to the endpoint 0x01.
+
+ Timeout values for the write, read and ctrl_transfer methods are specified in
+ miliseconds. If the parameter is omitted, Device.default_timeout value will
+ be used instead. This property can be set by the user at anytime.
+ """
+
+ def __init__(self, dev, backend):
+ r"""Initialize the Device object.
+
+ Library users should normally get a Device instance through
+ the find function. The dev parameter is the identification
+ of a device to the backend and its meaning is opaque outside
+ of it. The backend parameter is a instance of a backend
+ object.
+ """
+ self._ctx = _ResourceManager(dev, backend)
+ self.__default_timeout = _DEFAULT_TIMEOUT
+
+ desc = backend.get_device_descriptor(dev)
+
+ _set_attr(
+ desc,
+ self,
+ (
+ 'bLength',
+ 'bDescriptorType',
+ 'bcdUSB',
+ 'bDeviceClass',
+ 'bDeviceSubClass',
+ 'bDeviceProtocol',
+ 'bMaxPacketSize0',
+ 'idVendor',
+ 'idProduct',
+ 'bcdDevice',
+ 'iManufacturer',
+ 'iProduct',
+ 'iSerialNumber',
+ 'bNumConfigurations',
+ 'address',
+ 'bus'
+ )
+ )
+
+ self.bus = int(desc.bus) if desc.bus is not None else None
+ self.address = int(desc.address) if desc.address is not None else None
+
+ def set_configuration(self, configuration = None):
+ r"""Set the active configuration.
+
+ The configuration parameter is the bConfigurationValue field of the
+ configuration you want to set as active. If you call this method
+ without parameter, it will use the first configuration found.
+ As a device hardly ever has more than one configuration, calling
+ the method without parameter is enough to get the device ready.
+ """
+ self._ctx.managed_set_configuration(self, configuration)
+
+ def get_active_configuration(self):
+ r"""Return a Configuration object representing the current configuration set."""
+ return self._ctx.get_active_configuration(self)
+
+ def set_interface_altsetting(self, interface = None, alternate_setting = None):
+ r"""Set the alternate setting for an interface.
+
+ When you want to use an interface and it has more than one alternate setting,
+ you should call this method to select the alternate setting you would like
+ to use. If you call the method without one or the two parameters, it will
+ be selected the first one found in the Device in the same way of set_configuration
+ method.
+
+ Commonly, an interface has only one alternate setting and this call is
+ not necessary. For most of the devices, either it has more than one alternate
+ setting or not, it is not harmful to make a call to this method with no arguments,
+ as devices will silently ignore the request when there is only one alternate
+ setting, though the USB Spec allows devices with no additional alternate setting
+ return an error to the Host in response to a SET_INTERFACE request.
+
+ If you are in doubt, you may want to call it with no arguments wrapped by
+ a try/except clause:
+
+ >>> try:
+ >>> dev.set_interface_altsetting()
+ >>> except usb.core.USBError:
+ >>> pass
+ """
+ self._ctx.managed_set_interface(self, interface, alternate_setting)
+
+ def reset(self):
+ r"""Reset the device."""
+ self._ctx.dispose(self, False)
+ self._ctx.backend.reset_device(self._ctx.handle)
+ self._ctx.dispose(self, True)
+
+ def write(self, endpoint, data, interface = None, timeout = None):
+ r"""Write data to the endpoint.
+
+ This method is used to send data to the device. The endpoint parameter
+ corresponds to the bEndpointAddress member whose endpoint you want to
+ communicate with. The interface parameter is the bInterfaceNumber field
+ of the interface descriptor which contains the endpoint. If you do not
+ provide one, the first one found will be used, as explained in the
+ set_interface_altsetting() method.
+
+ The data parameter should be a sequence like type convertible to
+ array type (see array module).
+
+ The timeout is specified in miliseconds.
+
+ The method returns the number of bytes written.
+ """
+ backend = self._ctx.backend
+
+ fn_map = {
+ util.ENDPOINT_TYPE_BULK:backend.bulk_write,
+ util.ENDPOINT_TYPE_INTR:backend.intr_write,
+ util.ENDPOINT_TYPE_ISO:backend.iso_write
+ }
+
+ intf = self._ctx.get_interface(self, interface)
+ fn = fn_map[self._ctx.get_endpoint_type(self, endpoint, intf)]
+ self._ctx.managed_claim_interface(self, intf)
+
+ return fn(
+ self._ctx.handle,
+ endpoint,
+ intf.bInterfaceNumber,
+ _interop.as_array(data),
+ self.__get_timeout(timeout)
+ )
+
+ def read(self, endpoint, size, interface = None, timeout = None):
+ r"""Read data from the endpoint.
+
+ This method is used to receive data from the device. The endpoint parameter
+ corresponds to the bEndpointAddress member whose endpoint you want to
+ communicate with. The interface parameter is the bInterfaceNumber field
+ of the interface descriptor which contains the endpoint. If you do not
+ provide one, the first one found will be used, as explained in the
+ set_interface_altsetting() method. The size parameters tells how many
+ bytes you want to read.
+
+ The timeout is specified in miliseconds.
+
+ The method returns an array object with the data read.
+ """
+ backend = self._ctx.backend
+
+ fn_map = {
+ util.ENDPOINT_TYPE_BULK:backend.bulk_read,
+ util.ENDPOINT_TYPE_INTR:backend.intr_read,
+ util.ENDPOINT_TYPE_ISO:backend.iso_read
+ }
+
+ intf = self._ctx.get_interface(self, interface)
+ fn = fn_map[self._ctx.get_endpoint_type(self, endpoint, intf)]
+ self._ctx.managed_claim_interface(self, intf)
+
+ return fn(
+ self._ctx.handle,
+ endpoint,
+ intf.bInterfaceNumber,
+ size,
+ self.__get_timeout(timeout)
+ )
+
+
+ def ctrl_transfer(self, bmRequestType, bRequest, wValue=0, wIndex=0,
+ data_or_wLength = None, timeout = None):
+ r"""Do a control transfer on the endpoint 0.
+
+ This method is used to issue a control transfer over the
+ endpoint 0(endpoint 0 is required to always be a control endpoint).
+
+ The parameters bmRequestType, bRequest, wValue and wIndex are the
+ same of the USB Standard Control Request format.
+
+ Control requests may or may not have a data payload to write/read.
+ In cases which it has, the direction bit of the bmRequestType
+ field is used to infere the desired request direction. For
+ host to device requests (OUT), data_or_wLength parameter is
+ the data payload to send, and it must be a sequence type convertible
+ to an array object. In this case, the return value is the number of data
+ payload written. For device to host requests (IN), data_or_wLength
+ is the wLength parameter of the control request specifying the
+ number of bytes to read in data payload. In this case, the return
+ value is the data payload read, as an array object.
+ """
+ if util.ctrl_direction(bmRequestType) == util.CTRL_OUT:
+ a = _interop.as_array(data_or_wLength)
+ elif data_or_wLength is None:
+ a = 0
+ else:
+ a = data_or_wLength
+
+ self._ctx.managed_open()
+
+ return self._ctx.backend.ctrl_transfer(
+ self._ctx.handle,
+ bmRequestType,
+ bRequest,
+ wValue,
+ wIndex,
+ a,
+ self.__get_timeout(timeout)
+ )
+
+ def is_kernel_driver_active(self, interface):
+ r"""Determine if there is kernel driver associated with the interface.
+
+ If a kernel driver is active, and the object will be unable to perform I/O.
+ """
+ self._ctx.managed_open()
+ return self._ctx.backend.is_kernel_driver_active(self._ctx.handle, interface)
+
+ def detach_kernel_driver(self, interface):
+ r"""Detach a kernel driver.
+
+ If successful, you will then be able to perform I/O.
+ """
+ self._ctx.managed_open()
+ self._ctx.backend.detach_kernel_driver(self._ctx.handle, interface)
+
+ def attach_kernel_driver(self, interface):
+ r"""Re-attach an interface's kernel driver, which was previously
+ detached using detach_kernel_driver()."""
+ self._ctx.managed_open()
+ self._ctx.backend.attach_kernel_driver(self._ctx.handle, interface)
+
+ def __iter__(self):
+ r"""Iterate over all configurations of the device."""
+ for i in range(self.bNumConfigurations):
+ yield Configuration(self, i)
+
+ def __getitem__(self, index):
+ r"""Return the Configuration object in the given position."""
+ return Configuration(self, index)
+
+ def __del__(self):
+ self._ctx.dispose(self)
+
+ def __get_timeout(self, timeout):
+ if timeout is not None:
+ return timeout
+ return self.__default_timeout
+
+ def __set_def_tmo(self, tmo):
+ if tmo < 0:
+ raise ValueError('Timeout cannot be a negative value')
+ self.__default_timeout = tmo
+
+ def __get_def_tmo(self):
+ return self.__default_timeout
+
+ default_timeout = property(
+ __get_def_tmo,
+ __set_def_tmo,
+ doc = 'Default timeout for transfer I/O functions'
+ )
+
+def find(find_all=False, backend = None, custom_match = None, **args):
+ r"""Find an USB device and return it.
+
+ find() is the function used to discover USB devices.
+ You can pass as arguments any combination of the
+ USB Device Descriptor fields to match a device. For example:
+
+ find(idVendor=0x3f4, idProduct=0x2009)
+
+ will return the Device object for the device with
+ idVendor Device descriptor field equals to 0x3f4 and
+ idProduct equals to 0x2009.
+
+ If there is more than one device which matchs the criteria,
+ the first one found will be returned. If a matching device cannot
+ be found the function returns None. If you want to get all
+ devices, you can set the parameter find_all to True, then find
+ will return an list with all matched devices. If no matching device
+ is found, it will return an empty list. Example:
+
+ printers = find(find_all=True, bDeviceClass=7)
+
+ This call will get all the USB printers connected to the system.
+ (actually may be not, because some devices put their class
+ information in the Interface Descriptor).
+
+ You can also use a customized match criteria:
+
+ dev = find(custom_match = lambda d: d.idProduct=0x3f4 and d.idvendor=0x2009)
+
+ A more accurate printer finder using a customized match would be like
+ so:
+
+ def is_printer(dev):
+ import usb.util
+ if dev.bDeviceClass == 7:
+ return True
+ for cfg in dev:
+ if usb.util.find_descriptor(cfg, bInterfaceClass=7) is not None:
+ return True
+
+ printers = find(find_all=True, custom_match = is_printer)
+
+ Now even if the device class code is in the interface descriptor the
+ printer will be found.
+
+ You can combine a customized match with device descriptor fields. In this
+ case, the fields must match and the custom_match must return True. In the our
+ previous example, if we would like to get all printers belonging to the
+ manufacturer 0x3f4, the code would be like so:
+
+ printers = find(find_all=True, idVendor=0x3f4, custom_match=is_printer)
+
+ If you want to use find as a 'list all devices' function, just call
+ it with find_all = True:
+
+ devices = find(find_all=True)
+
+ Finally, you may pass a custom backend to the find function:
+
+ find(backend = MyBackend())
+
+ PyUSB has builtin backends for libusb 0.1, libusb 1.0 and OpenUSB.
+ If you do not supply a backend explicitly, find() function will select
+ one of the predefineds backends according to system availability.
+
+ Backends are explained in the usb.backend module.
+ """
+
+ def device_iter(k, v):
+ for dev in backend.enumerate_devices():
+ d = Device(dev, backend)
+ if (custom_match is None or custom_match(d)) and \
+ _interop._reduce(
+ lambda a, b: a and b,
+ map(
+ operator.eq,
+ v,
+ map(lambda i: getattr(d, i), k)
+ ),
+ True
+ ):
+ yield d
+
+ if backend is None:
+ import usb.backend.libusb10 as libusb10
+ import usb.backend.libusb01 as libusb01
+ import usb.backend.openusb as openusb
+
+ for m in (libusb10, openusb, libusb01):
+ backend = m.get_backend()
+ if backend is not None:
+ _logger.info('find(): using backend "%s"', m.__name__)
+ break
+ else:
+ raise ValueError('No backend available')
+
+ k, v = args.keys(), args.values()
+
+ if find_all:
+ return [d for d in device_iter(k, v)]
+ else:
+ try:
+ return _interop._next(device_iter(k, v))
+ except StopIteration:
+ return None
diff --git a/plugins/wedo_plugin/usb/legacy.py b/plugins/wedo_plugin/usb/legacy.py
new file mode 100644
index 0000000..0c9c52c
--- /dev/null
+++ b/plugins/wedo_plugin/usb/legacy.py
@@ -0,0 +1,334 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+import usb.core as core
+import usb.util as util
+import usb._interop as _interop
+import usb.control as control
+
+__author__ = 'Wander Lairson Costa'
+
+USBError = core.USBError
+
+CLASS_AUDIO = 1
+CLASS_COMM = 2
+CLASS_DATA = 10
+CLASS_HID = 3
+CLASS_HUB = 9
+CLASS_MASS_STORAGE = 8
+CLASS_PER_INTERFACE = 0
+CLASS_PRINTER = 7
+CLASS_VENDOR_SPEC = 255
+DT_CONFIG = 2
+DT_CONFIG_SIZE = 9
+DT_DEVICE = 1
+DT_DEVICE_SIZE = 18
+DT_ENDPOINT = 5
+DT_ENDPOINT_AUDIO_SIZE = 9
+DT_ENDPOINT_SIZE = 7
+DT_HID = 33
+DT_HUB = 41
+DT_HUB_NONVAR_SIZE = 7
+DT_INTERFACE = 4
+DT_INTERFACE_SIZE = 9
+DT_PHYSICAL = 35
+DT_REPORT = 34
+DT_STRING = 3
+ENDPOINT_ADDRESS_MASK = 15
+ENDPOINT_DIR_MASK = 128
+ENDPOINT_IN = 128
+ENDPOINT_OUT = 0
+ENDPOINT_TYPE_BULK = 2
+ENDPOINT_TYPE_CONTROL = 0
+ENDPOINT_TYPE_INTERRUPT = 3
+ENDPOINT_TYPE_ISOCHRONOUS = 1
+ENDPOINT_TYPE_MASK = 3
+ERROR_BEGIN = 500000
+MAXALTSETTING = 128
+MAXCONFIG = 8
+MAXENDPOINTS = 32
+MAXINTERFACES = 32
+RECIP_DEVICE = 0
+RECIP_ENDPOINT = 2
+RECIP_INTERFACE = 1
+RECIP_OTHER = 3
+REQ_CLEAR_FEATURE = 1
+REQ_GET_CONFIGURATION = 8
+REQ_GET_DESCRIPTOR = 6
+REQ_GET_INTERFACE = 10
+REQ_GET_STATUS = 0
+REQ_SET_ADDRESS = 5
+REQ_SET_CONFIGURATION = 9
+REQ_SET_DESCRIPTOR = 7
+REQ_SET_FEATURE = 3
+REQ_SET_INTERFACE = 11
+REQ_SYNCH_FRAME = 12
+TYPE_CLASS = 32
+TYPE_RESERVED = 96
+TYPE_STANDARD = 0
+TYPE_VENDOR = 64
+
+class Endpoint(object):
+ r"""Endpoint descriptor object."""
+ def __init__(self, ep):
+ self.address = ep.bEndpointAddress
+ self.interval = ep.bInterval
+ self.maxPacketSize = ep.wMaxPacketSize
+ self.type = util.endpoint_type(ep.bmAttributes)
+
+class Interface(object):
+ r"""Interface descriptor object."""
+ def __init__(self, intf):
+ self.alternateSetting = intf.bAlternateSetting
+ self.interfaceNumber = intf.bInterfaceNumber
+ self.iInterface = intf.iInterface
+ self.interfaceClass = intf.bInterfaceClass
+ self.interfaceSubClass = intf.bInterfaceSubClass
+ self.interfaceProtocol = intf.bInterfaceProtocol
+ self.endpoints = [Endpoint(e) for e in intf]
+
+class Configuration(object):
+ r"""Configuration descriptor object."""
+ def __init__(self, cfg):
+ self.iConfiguration = cfg.iConfiguration
+ self.maxPower = cfg.bMaxPower << 2
+ self.remoteWakeup = (cfg.bmAttributes >> 5) & 1
+ self.selfPowered = (cfg.bmAttributes >> 6) & 1
+ self.totalLength = cfg.wTotalLength
+ self.value = cfg.bConfigurationValue
+ self.interfaces = [
+ list(g) for k, g in _interop._groupby(
+ _interop._sorted(
+ [Interface(i) for i in cfg],
+ key=lambda i: i.interfaceNumber
+ ),
+ lambda i: i.alternateSetting)
+ ]
+
+class DeviceHandle(object):
+ def __init__(self, dev):
+ self.dev = dev
+ self.__claimed_interface = -1
+
+ def bulkWrite(self, endpoint, buffer, timeout = 100):
+ r"""Perform a bulk write request to the endpoint specified.
+
+ Arguments:
+ endpoint: endpoint number.
+ buffer: sequence data buffer to write.
+ This parameter can be any sequence type.
+ timeout: operation timeout in miliseconds. (default: 100)
+ Returns the number of bytes written.
+ """
+ return self.dev.write(endpoint, buffer, self.__claimed_interface, timeout)
+
+ def bulkRead(self, endpoint, size, timeout = 100):
+ r"""Performs a bulk read request to the endpoint specified.
+
+ Arguments:
+ endpoint: endpoint number.
+ size: number of bytes to read.
+ timeout: operation timeout in miliseconds. (default: 100)
+ Return a tuple with the data read.
+ """
+ return self.dev.read(endpoint, size, self.__claimed_interface, timeout)
+
+ def interruptWrite(self, endpoint, buffer, timeout = 100):
+ r"""Perform a interrupt write request to the endpoint specified.
+
+ Arguments:
+ endpoint: endpoint number.
+ buffer: sequence data buffer to write.
+ This parameter can be any sequence type.
+ timeout: operation timeout in miliseconds. (default: 100)
+ Returns the number of bytes written.
+ """
+ return self.dev.write(endpoint, buffer, self.__claimed_interface, timeout)
+
+ def interruptRead(self, endpoint, size, timeout = 100):
+ r"""Performs a interrupt read request to the endpoint specified.
+
+ Arguments:
+ endpoint: endpoint number.
+ size: number of bytes to read.
+ timeout: operation timeout in miliseconds. (default: 100)
+ Return a tuple with the data read.
+ """
+ return self.dev.read(endpoint, size, self.__claimed_interface, timeout)
+
+ def controlMsg(self, requestType, request, buffer, value = 0, index = 0, timeout = 100):
+ r"""Perform a control request to the default control pipe on a device.
+
+ Arguments:
+ requestType: specifies the direction of data flow, the type
+ of request, and the recipient.
+ request: specifies the request.
+ buffer: if the transfer is a write transfer, buffer is a sequence
+ with the transfer data, otherwise, buffer is the number of
+ bytes to read.
+ value: specific information to pass to the device. (default: 0)
+ index: specific information to pass to the device. (default: 0)
+ timeout: operation timeout in miliseconds. (default: 100)
+ Return the number of bytes written.
+ """
+ return self.dev.ctrl_transfer(
+ requestType,
+ request,
+ wValue = value,
+ wIndex = index,
+ data_or_wLength = buffer,
+ timeout = timeout
+ )
+
+ def clearHalt(self, endpoint):
+ r"""Clears any halt status on the specified endpoint.
+
+ Arguments:
+ endpoint: endpoint number.
+ """
+ cfg = self.dev.get_active_configuration()
+ intf = util.find_descriptor(cfg, bInterfaceNumber = self.__claimed_interface)
+ e = util.find_descriptor(intf, bEndpointAddress = endpoint)
+ control.clear_feature(self.dev, control.ENDPOINT_HALT, e)
+
+ def claimInterface(self, interface):
+ r"""Claims the interface with the Operating System.
+
+ Arguments:
+ interface: interface number or an Interface object.
+ """
+ if_num = interface.interfaceNumber \
+ if isinstance(interface, Interface) else interface
+
+ util.claim_interface(self.dev, if_num)
+ self.__claimed_interface = if_num
+
+ def releaseInterface(self):
+ r"""Release an interface previously claimed with claimInterface."""
+ util.release_interface(self.dev, self.__claimed_interface)
+ self.__claimed_interface = -1
+
+ def reset(self):
+ r"""Reset the specified device by sending a RESET
+ down the port it is connected to."""
+ self.dev.reset()
+
+ def resetEndpoint(self, endpoint):
+ r"""Reset all states for the specified endpoint.
+
+ Arguments:
+ endpoint: endpoint number.
+ """
+ self.clearHalt(endpoint)
+
+ def setConfiguration(self, configuration):
+ r"""Set the active configuration of a device.
+
+ Arguments:
+ configuration: a configuration value or a Configuration object.
+ """
+ self.dev.set_configuration(configuration)
+
+ def setAltInterface(self, alternate):
+ r"""Sets the active alternate setting of the current interface.
+
+ Arguments:
+ alternate: an alternate setting number or an Interface object.
+ """
+ self.dev.set_interface_altsetting(self.__claimed_interface, alternate)
+
+ def getString(self, index, length, langid = None):
+ r"""Retrieve the string descriptor specified by index
+ and langid from a device.
+
+ Arguments:
+ index: index of descriptor in the device.
+ length: number of bytes of the string
+ langid: Language ID. If it is omittedi, will be
+ used the first language.
+ """
+ return util.get_string(self.dev, length, index, langid).encode('ascii')
+
+ def getDescriptor(self, desc_type, desc_index, length, endpoint = -1):
+ r"""Retrieves a descriptor from the device identified by the type
+ and index of the descriptor.
+
+ Arguments:
+ desc_type: descriptor type.
+ desc_index: index of the descriptor.
+ len: descriptor length.
+ endpoint: ignored.
+ """
+ return control.get_descriptor(self.dev, length, desc_type, desc_index)
+
+ def detachKernelDriver(self, interface):
+ r"""Detach a kernel driver from the interface (if one is attached,
+ we have permission and the operation is supported by the OS)
+
+ Arguments:
+ interface: interface number or an Interface object.
+ """
+ self.dev.detach_kernel_driver(interface)
+
+class Device(object):
+ r"""Device descriptor object"""
+ def __init__(self, dev):
+ self.deviceClass = dev.bDeviceClass
+ self.deviceSubClass = dev.bDeviceSubClass
+ self.deviceProtocol = dev.bDeviceProtocol
+ self.deviceVersion = dev.bcdDevice
+ self.devnum = None
+ self.filename = ''
+ self.iManufacturer = dev.iManufacturer
+ self.iProduct = dev.iProduct
+ self.iSerialNumber = dev.iSerialNumber
+ self.idProduct = dev.idProduct
+ self.idVendor = dev.idVendor
+ self.maxPacketSize = dev.bMaxPacketSize0
+ self.usbVersion = dev.bcdUSB
+ self.configurations = [Configuration(c) for c in dev]
+ self.dev = dev
+
+ def open(self):
+ r"""Open the device for use.
+
+ Return a DeviceHandle object
+ """
+ return DeviceHandle(self.dev)
+
+class Bus(object):
+ r"""Bus object."""
+ def __init__(self):
+ self.dirname = ''
+ self.localtion = 0
+ self.devices = [Device(d) for d in core.find(find_all=True)]
+
+def busses():
+ r"""Return a tuple with the usb busses."""
+ return (Bus(),)
+
diff --git a/plugins/wedo_plugin/usb/util.py b/plugins/wedo_plugin/usb/util.py
new file mode 100644
index 0000000..1f8cee3
--- /dev/null
+++ b/plugins/wedo_plugin/usb/util.py
@@ -0,0 +1,260 @@
+# Copyright (C) 2009-2011 Wander Lairson Costa
+#
+# The following terms apply to all files associated
+# with the software unless explicitly disclaimed in individual files.
+#
+# The authors hereby grant permission to use, copy, modify, distribute,
+# and license this software and its documentation for any purpose, provided
+# that existing copyright notices are retained in all copies and that this
+# notice is included verbatim in any distributions. No written agreement,
+# license, or royalty fee is required for any of the authorized uses.
+# Modifications to this software may be copyrighted by their authors
+# and need not follow the licensing terms described here, provided that
+# the new terms are clearly indicated on the first page of each file where
+# they apply.
+#
+# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# MODIFICATIONS.
+
+r"""usb.util - Utility functions.
+
+This module exports:
+
+endpoint_address - return the endpoint absolute address.
+endpoint_direction - return the endpoint transfer direction.
+endpoint_type - return the endpoint type
+ctrl_direction - return the direction of a control transfer
+build_request_type - build a bmRequestType field of a control transfer.
+find_descriptor - find an inner descriptor.
+claim_interface - explicitly claim an interface.
+release_interface - explicitly release an interface.
+dispose_resources - release internal resources allocated by the object.
+get_string - retrieve a string descriptor from the device.
+"""
+
+__author__ = 'Wander Lairson Costa'
+
+import operator
+import usb._interop as _interop
+
+# descriptor type
+DESC_TYPE_DEVICE = 0x01
+DESC_TYPE_CONFIG = 0x02
+DESC_TYPE_STRING = 0x03
+DESC_TYPE_INTERFACE = 0x04
+DESC_TYPE_ENDPOINT = 0x05
+
+# endpoint direction
+ENDPOINT_IN = 0x80
+ENDPOINT_OUT = 0x00
+
+# endpoint type
+ENDPOINT_TYPE_CTRL = 0x00
+ENDPOINT_TYPE_ISO = 0x01
+ENDPOINT_TYPE_BULK = 0x02
+ENDPOINT_TYPE_INTR = 0x03
+
+# control request type
+CTRL_TYPE_STANDARD = (0 << 5)
+CTRL_TYPE_CLASS = (1 << 5)
+CTRL_TYPE_VENDOR = (2 << 5)
+CTRL_TYPE_RESERVED = (3 << 5)
+
+# control request recipient
+CTRL_RECIPIENT_DEVICE = 0
+CTRL_RECIPIENT_INTERFACE = 1
+CTRL_RECIPIENT_ENDPOINT = 2
+CTRL_RECIPIENT_OTHER = 3
+
+# control request direction
+CTRL_OUT = 0x00
+CTRL_IN = 0x80
+
+_ENDPOINT_ADDR_MASK = 0x0f
+_ENDPOINT_DIR_MASK = 0x80
+_ENDPOINT_TRANSFER_TYPE_MASK = 0x03
+_CTRL_DIR_MASK = 0x80
+
+def endpoint_address(address):
+ r"""Return the endpoint absolute address.
+
+ The address parameter is the bEndpointAddress field
+ of the endpoint descriptor.
+ """
+ return address & _ENDPOINT_ADDR_MASK
+
+def endpoint_direction(address):
+ r"""Return the endpoint direction.
+
+ The address parameter is the bEndpointAddress field
+ of the endpoint descriptor.
+ The possible return values are ENDPOINT_OUT or ENDPOINT_IN.
+ """
+ return address & _ENDPOINT_DIR_MASK
+
+def endpoint_type(bmAttributes):
+ r"""Return the transfer type of the endpoint.
+
+ The bmAttributes parameter is the bmAttributes field
+ of the endpoint descriptor.
+ The possible return values are: ENDPOINT_TYPE_CTRL,
+ ENDPOINT_TYPE_ISO, ENDPOINT_TYPE_BULK or ENDPOINT_TYPE_INTR.
+ """
+ return bmAttributes & _ENDPOINT_TRANSFER_TYPE_MASK
+
+def ctrl_direction(bmRequestType):
+ r"""Return the direction of a control request.
+
+ The bmRequestType parameter is the value of the
+ bmRequestType field of a control transfer.
+ The possible return values are CTRL_OUT or CTRL_IN.
+ """
+ return bmRequestType & _CTRL_DIR_MASK
+
+def build_request_type(direction, type, recipient):
+ r"""Build a bmRequestType field for control requests.
+
+ These is a conventional function to build a bmRequestType
+ for a control request.
+
+ The direction parameter can be CTRL_OUT or CTRL_IN.
+ The type parameter can be CTRL_TYPE_STANDARD, CTRL_TYPE_CLASS,
+ CTRL_TYPE_VENDOR or CTRL_TYPE_RESERVED values.
+ The recipient can be CTRL_RECIPIENT_DEVICE, CTRL_RECIPIENT_INTERFACE,
+ CTRL_RECIPIENT_ENDPOINT or CTRL_RECIPIENT_OTHER.
+
+ Return the bmRequestType value.
+ """
+ return recipient | type | direction
+
+def find_descriptor(desc, find_all=False, custom_match=None, **args):
+ r"""Find an inner descriptor.
+
+ find_descriptor works in the same way the core.find() function does,
+ but it acts on general descriptor objects. For example, suppose you
+ have a Device object called dev and want a Configuration of this
+ object with its bConfigurationValue equals to 1, the code would
+ be like so:
+
+ >>> cfg = util.find_descriptor(dev, bConfigurationValue=1)
+
+ You can use any field of the Descriptor as a match criteria, and you
+ can supply a customized match just like core.find() does. The
+ find_descriptor function also accepts the find_all parameter to get
+ a list of descriptor instead of just one.
+ """
+ def desc_iter(k, v):
+ for d in desc:
+ if (custom_match is None or custom_match(d)) and \
+ _interop._reduce(
+ lambda a, b: a and b,
+ map(
+ operator.eq,
+ v,
+ map(lambda i: getattr(d, i), k)
+ ),
+ True
+ ):
+ yield d
+
+ k, v = args.keys(), args.values()
+
+ if find_all:
+ return [d for d in desc_iter(k, v)]
+ else:
+ try:
+ return _interop._next(desc_iter(k, v))
+ except StopIteration:
+ return None
+
+def claim_interface(device, interface):
+ r"""Explicitly claim an interface.
+
+ PyUSB users normally do not have to worry about interface claiming,
+ as the library takes care of it automatically. But there are situations
+ where you need deterministic interface claiming. For these uncommon
+ cases, you can use claim_interface.
+
+ If the interface is already claimed, either through a previously call
+ to claim_interface or internally by the device object, nothing happens.
+ """
+ device._ctx.managed_claim_interface(device, interface)
+
+def release_interface(device, interface):
+ r"""Explicitly release an interface.
+
+ This function is used to release an interface previously claimed,
+ either through a call to claim_interface or internally by the
+ device object.
+
+ Normally, you do not need to worry about claiming policies, as
+ the device object takes care of it automatically.
+ """
+ device._ctx.managed_release_interface(device, interface)
+
+def dispose_resources(device):
+ r"""Release internal resources allocated by the object.
+
+ Sometimes you need to provide deterministic resources
+ freeing, for example to allow another application to
+ talk to the device. As Python does not provide deterministic
+ destruction, this function releases all internal resources
+ allocated by the device, like device handle and interface
+ policy.
+
+ After calling this function, you can continue using the device
+ object normally. If the resources will be necessary again, it
+ will allocate them automatically.
+ """
+ device._ctx.dispose(device)
+
+def get_string(dev, length, index, langid = None):
+ r"""Retrieve a string descriptor from the device.
+
+ dev is the Device object to which the request will be
+ sent to.
+
+ length is the length of string in number of characters.
+
+ index is the string descriptor index and langid is the Language
+ ID of the descriptor. If langid is omitted, the string descriptor
+ of the first Language ID will be returned.
+
+ The return value is the unicode string present in the descriptor.
+ """
+ from usb.control import get_descriptor
+ if langid is None:
+ # Asking for the zero'th index is special - it returns a string
+ # descriptor that contains all the language IDs supported by the device.
+ # Typically there aren't many - often only one. The language IDs are 16
+ # bit numbers, and they start at the third byte in the descriptor. See
+ # USB 2.0 specification section 9.6.7 for more information.
+ #
+ # Note from libusb 1.0 sources (descriptor.c)
+ buf = get_descriptor(
+ dev,
+ 1024,
+ DESC_TYPE_STRING,
+ 0
+ )
+ assert len(buf) >= 4
+ langid = buf[2] | (buf[3] << 8)
+
+ buf = get_descriptor(
+ dev,
+ length * 2 + 2, # string is utf16 + 2 bytes of the descriptor
+ DESC_TYPE_STRING,
+ index,
+ langid
+ )
+ return buf[2:].tostring().decode('utf-16-le')
diff --git a/plugins/wedo_plugin/wedo_plugin.py b/plugins/wedo_plugin/wedo_plugin.py
new file mode 100644
index 0000000..2c92535
--- /dev/null
+++ b/plugins/wedo_plugin/wedo_plugin.py
@@ -0,0 +1,302 @@
+#Copyright (c) 2012, Tony Forster, Ian Daniher, Walter Bender
+#
+# 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 2 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from gettext import gettext as _
+
+from plugins.plugin import Plugin
+from WeDoMore import WeDo, scan_for_devices, UNAVAILABLE
+
+from TurtleArt.tapalette import make_palette
+from TurtleArt.taconstants import XO1, XO15
+from TurtleArt.talogo import primitive_dictionary
+
+import logging
+_logger = logging.getLogger('turtleart-activity WeDo plugin')
+
+
+class Wedo_plugin(Plugin):
+
+ def __init__(self, parent):
+ ''' Scan for WeDo devices '''
+ self.WeDos = []
+ device_list = scan_for_devices()
+ for i, dev in enumerate(device_list):
+ self.WeDos.append(WeDo(device=dev))
+ self.WeDos[-1].number = i
+ self._parent = parent
+ if len(self.WeDos) == 0:
+ self._status = False # no WeDo devices found
+ self.active_wedo = None
+ else:
+ self._status = True
+ self.active_wedo = 0
+
+ def setup(self):
+ ''' Setup palettes '''
+ palette = make_palette('WeDo', colors=["#FF6060", "#A06060"],
+ help_string=_('Palette of WeDo blocks'))
+
+ primitive_dictionary['wedoselect'] = self.wedo_select
+ palette.add_block('wedoselect',
+ style='basic-style-1arg',
+ default = 1,
+ label=_('WeDo'),
+ help_string=_('set current WeDo device'),
+ prim_name = 'wedoselect')
+
+ self._parent.lc.def_prim(
+ 'wedoselect', 1,
+ lambda self, n: primitive_dictionary['wedoselect'](n))
+
+ primitive_dictionary['wedocount'] = self.wedo_count
+ palette.add_block('wedogetcount',
+ style='box-style',
+ label=_('number of WeDos'),
+ help_string=_('number of WeDo devices'),
+ prim_name = 'wedocount')
+
+ self._parent.lc.def_prim(
+ 'wedocount', 0, lambda self: primitive_dictionary['wedocount']())
+
+ primitive_dictionary['wedotilt'] = self.wedo_gettilt
+ palette.add_block('tilt',
+ style='box-style',
+ label=_('tilt'),
+ help_string=_('tilt sensor output: (-1 == no tilt,\
+ 0 == tilt forward, 3 == tilt back, 1 == tilt left, 2 == tilt right)'),
+ value_block=True,
+ prim_name = 'wedotilt')
+ self._parent.lc.def_prim(
+ 'wedotilt', 0, lambda self: primitive_dictionary['wedotilt']())
+
+ primitive_dictionary['wedodistance'] = self.wedo_getdistance
+ palette.add_block('wedodistance',
+ style='box-style',
+ label=_('distance'),
+ help_string=_('distance sensor output'),
+ value_block=True,
+ prim_name = 'wedodistance')
+ self._parent.lc.def_prim(
+ 'wedodistance', 0,
+ lambda self: primitive_dictionary['wedodistance']())
+
+ primitive_dictionary['wedogetMotorA'] = self.wedo_getmotora
+ palette.add_block('wedogetMotorA',
+ style='box-style',
+ label=_('Motor A'),
+ help_string=_('returns the current value of Motor A'),
+ value_block=True,
+ prim_name = 'wedogetMotorA')
+
+ self._parent.lc.def_prim(
+ 'wedogetMotorA', 0,
+ lambda self: primitive_dictionary['wedogetMotorA']())
+
+ primitive_dictionary['wedogetMotorB'] = self.wedo_getmotorb
+ palette.add_block('wedogetMotorB',
+ style='box-style',
+ label=_('Motor B'),
+ help_string=_('returns the current value of Motor B'),
+ value_block=True,
+ prim_name = 'wedogetMotorB')
+ self._parent.lc.def_prim(
+ 'wedogetMotorB', 0,
+ lambda self: primitive_dictionary['wedogetMotorB']())
+
+ primitive_dictionary['wedosetMotorA'] = self.wedo_setmotora
+ palette.add_block('wedosetMotorA',
+ style = 'basic-style-1arg',
+ label = _('Motor A'),
+ default = 30,
+ prim_name = 'wedosetMotorA',
+ help_string = _('set the value for Motor A'))
+ self._parent.lc.def_prim(
+ 'wedosetMotorA', 1,
+ lambda self, a: primitive_dictionary['wedosetMotorA'](a))
+
+ primitive_dictionary['wedosetMotorB'] = self.wedo_setmotorb
+ palette.add_block('wedosetMotorB',
+ style = 'basic-style-1arg',
+ label = _('Motor B'),
+ default = 30,
+ prim_name = 'wedosetMotorB',
+ help_string = _('set the value for Motor B'))
+ self._parent.lc.def_prim(
+ 'wedosetMotorB', 1,
+ lambda self, b: primitive_dictionary['wedosetMotorB'](b))
+
+ def wedo_select(self, i):
+ ''' Select current device '''
+ if self.wedo_count() == 0:
+ self.active_wedo = None
+ self._parent.showlabel(
+ 'status', _('WeDo is unavailable'))
+ return
+ if type(i) == unicode:
+ i = str(i.encode('ascii', 'replace'))
+ if type(i) == float or type(i) == str:
+ i = int(i)
+ if type(i) != int:
+ i = 1
+ if i < 0:
+ i = -i
+ if i < 0 or i > self.wedo_count() - 1:
+ self._parent.showlabel(
+ 'status', _('WeDo %d is unavailable; defaulting to 1') % (i))
+ i -= 1 # Userspace counts from 1; internally, we count from 0
+ if i > self.wedo_count() - 1:
+ i = 0
+ self.active_wedo = i
+
+ def wedo_count(self):
+ ''' How many devices are available? '''
+ n = len(self.WeDos)
+ for wedo in self.WeDos:
+ if wedo.dev is None:
+ n -= 1
+ return n
+
+ def wedo_find(self):
+ ''' Find an available device '''
+ for wedo in self.WeDos:
+ if wedo.dev is not None:
+ return self.WeDos.index(wedo)
+ return None
+
+ def wedo_gettilt(self):
+ if self.active_wedo is None:
+ self.active_wedo = self.wedo_find()
+ if self.active_wedo is None:
+ self._parent.showlabel('status', _('WeDo is unavailable'))
+ return -1
+ tilt = self.WeDos[self.active_wedo].getTilt()
+ if tilt == UNAVAILABLE:
+ # Should we look for tilt on another WeDo?
+ self._parent.showlabel(
+ 'status', _('%s is unavailable on WeDo %d') % (
+ _('tilt'), self.active_wedo + 1))
+ return -1
+ else:
+ return tilt
+
+ def wedo_getdistance(self):
+ if self.active_wedo is None:
+ self.active_wedo = self.wedo_find()
+ if self.active_wedo is None:
+ self._parent.showlabel('status', _('WeDo is unavailable'))
+ return 0
+ distance = self.WeDos[self.active_wedo].getDistance()
+ if distance == UNAVAILABLE:
+ # Should we look for distance on another WeDo?
+ self._parent.showlabel(
+ 'status', _('%s is unavailable on WeDo %d') % (
+ _('distance'), self.active_wedo + 1))
+ return 0
+ else:
+ return distance
+
+ def wedo_getmotora(self):
+ if self.active_wedo is None:
+ self.active_wedo = self.wedo_find()
+ if self.active_wedo is None:
+ self._parent.showlabel('status', _('WeDo is unavailable'))
+ return 0
+ speed = self.WeDos[self.active_wedo].getMotorA()
+ if speed == UNAVAILABLE:
+ self._parent.showlabel(
+ 'status', _('%s is unavailable on WeDo %d') % (
+ _('Motor A'), self.active_wedo + 1))
+ return 0
+ else:
+ return speed
+
+ def wedo_getmotorb(self):
+ if self.active_wedo is None:
+ self.active_wedo = self.wedo_find()
+ if self.active_wedo is None:
+ self._parent.showlabel('status', _('WeDo is unavailable'))
+ return 0
+ speed = self.WeDos[self.active_wedo].getMotorB()
+ if speed == UNAVAILABLE:
+ self._parent.showlabel(
+ 'status', _('%s is unavailable on WeDo %d') % (
+ _('Motor B'), self.active_wedo + 1))
+ return 0
+ else:
+ return speed
+
+ def wedo_setmotora(self, speed):
+ if self.active_wedo is None:
+ self.active_wedo = self.wedo_find()
+ if self.active_wedo is None:
+ self._parent.showlabel('status', _('WeDo is unavailable'))
+ return
+ status = self.WeDos[self.active_wedo].setMotorA(speed)
+ if status == UNAVAILABLE:
+ self._parent.showlabel(
+ 'status', _('%s is unavailable on WeDo %d') % (
+ _('Motor A'), self.active_wedo + 1))
+
+ def wedo_setmotorb(self, speed):
+ if self.active_wedo is None:
+ self.active_wedo = self.wedo_find()
+ if self.active_wedo is None:
+ self._parent.showlabel('status', _('WeDo is unavailable'))
+ return
+ status = self.WeDos[self.active_wedo].setMotorB(speed)
+ if status == UNAVAILABLE:
+ self._parent.showlabel(
+ 'status', _('%s is unavailable on WeDo %d') % (
+ _('Motor B'), self.active_wedo + 1))
+
+ def start(self):
+ ''' Each time program starts, scan for devices and reset status '''
+ for wedo in self.WeDos:
+ wedo.dev = None
+ self.active_wedo = None
+ device_list = scan_for_devices()
+ if len(device_list) > 0:
+ self.status = True
+ if self.active_wedo is None:
+ self.active_wedo = 0
+ else:
+ self.status = False
+ for i, dev in enumerate(device_list):
+ if i < len(self.WeDos):
+ self.WeDos[i].dev = dev
+ self.WeDos[i].number = i
+ self.WeDos[i].init_device() # Reinitial device
+ else:
+ self.WeDos.append(WeDo(device=dev))
+ self.WeDos[i].number = i
+
+ def stop(self):
+ if self._status:
+ for wedo in self.WeDos:
+ if wedo.dev is not None:
+ wedo.setMotors(0, 0)
+
+ def goto_background(self):
+ pass
+
+ def return_to_foreground(self):
+ pass
+
+ def quit(self):
+ if self._status:
+ for wedo in self.WeDos:
+ if wedo.dev is not None:
+ wedo.setMotors(0, 0)