Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/plugins/wedo_plugin/wedo_plugin.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/wedo_plugin/wedo_plugin.py')
-rw-r--r--plugins/wedo_plugin/wedo_plugin.py453
1 files changed, 207 insertions, 246 deletions
diff --git a/plugins/wedo_plugin/wedo_plugin.py b/plugins/wedo_plugin/wedo_plugin.py
index 765046d..d0958f5 100644
--- a/plugins/wedo_plugin/wedo_plugin.py
+++ b/plugins/wedo_plugin/wedo_plugin.py
@@ -1,4 +1,9 @@
-#Copyright (c) 2012-13 Tony Forster, Ian Daniher, Walter Bender
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2011, 2012 Ian Daniher
+# Copyright (c) 2012 Tony Forster, Walter Bender, Alan Aguiar
+# Copyright (c) 2013 Alan Aguiar
#
# 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
@@ -14,286 +19,242 @@
# 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
-
+import os
+import sys
+sys.path.insert(0, os.path.abspath('./plugins/wedo_plugin'))
from TurtleArt.tapalette import make_palette
-from TurtleArt.taprimitive import (ArgSlot, Primitive)
-from TurtleArt.tatype import TYPE_NUMBER, TYPE_INT
-
+from TurtleArt.tapalette import palette_name_to_index
+from TurtleArt.tapalette import special_block_colors
+from TurtleArt.tapalette import palette_blocks
+from TurtleArt.talogo import logoerror
+from TurtleArt.taprimitive import Primitive, ArgSlot
+from TurtleArt.tatype import TYPE_INT, TYPE_NUMBER
+from plugins.plugin import Plugin
+from wedo import WeDo, scan_for_devices, UNAVAILABLE
+from gettext import gettext as _
-import logging
-_logger = logging.getLogger('turtleart-activity WeDo plugin')
+COLOR_NOTPRESENT = ["#A0A0A0","#808080"]
+COLOR_PRESENT = ["#FF6060", "#A06060"]
+ERROR_NO_NUMBER = _("The parameter must be a integer, not '%s'")
+ERROR_SPEED = _('Motor speed must be an integer between -100 and 100')
+WEDO_FOUND = _('WeDo found %s bricks')
+WEDO_NOT_FOUND = _('WeDo not found')
+INDEX_NOT_FOUND = _('WeDo number %s was not found')
+ERROR = -1
class Wedo_plugin(Plugin):
def __init__(self, parent):
- ''' Scan for WeDo devices '''
+ Plugin.__init__(self)
+ self.tw = parent
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
+ self.active_wedo = 0
def setup(self):
- ''' Setup palettes '''
- palette = make_palette('WeDo', colors=["#FF6060", "#A06060"],
- help_string=_('Palette of WeDo blocks'))
+
+ palette = make_palette('wedo', COLOR_NOTPRESENT, _('Palette of WeDo blocks'),
+ translation=_('wedo'))
+
+ palette.add_block('wedorefresh',
+ style='basic-style',
+ label=_('refresh WeDo'),
+ prim_name='wedorefresh',
+ help_string=_('Search for a connected WeDo.'))
+ self.tw.lc.def_prim('wedorefresh', 0,
+ Primitive(self.refresh))
+ special_block_colors['wedorefresh'] = COLOR_PRESENT[:]
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,
- Primitive(self.prim_wedo_select,
- arg_descs=[ArgSlot(TYPE_NUMBER)]))
+ style='basic-style-1arg',
+ default = 1,
+ label=_('WeDo'),
+ help_string=_('set current WeDo device'),
+ prim_name = 'wedoselect')
+ self.tw.lc.def_prim('wedoselect', 1,
+ Primitive(self.select, arg_descs=[ArgSlot(TYPE_NUMBER)]))
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,
- Primitive(self.prim_wedo_count, return_type=TYPE_INT))
+ style='box-style',
+ label=_('number of WeDos'),
+ help_string=_('number of WeDo devices'),
+ prim_name = 'wedocount')
+ self.tw.lc.def_prim('wedocount', 0,
+ Primitive(self.count, TYPE_INT))
palette.add_block('tilt',
- style='box-style',
- label=_('tilt'),
- help_string=_('tilt sensor output: (-1 == no 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,
- Primitive(self.prim_wedo_get_tilt, return_type=TYPE_INT))
+ value_block=True,
+ prim_name = 'wedotilt')
+ self.tw.lc.def_prim('wedotilt', 0,
+ Primitive(self.getTilt, TYPE_INT))
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,
- Primitive(self.prim_wedo_get_distance, return_type=TYPE_INT))
-
+ style='box-style',
+ label=_('distance'),
+ help_string=_('distance sensor output'),
+ value_block=True,
+ prim_name = 'wedodistance')
+ self.tw.lc.def_prim('wedodistance', 0,
+ Primitive(self.getDistance, TYPE_INT))
+
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,
- Primitive(self.prim_wedo_get_motor_a, return_type=TYPE_INT))
+ style='box-style',
+ label=_('Motor A'),
+ help_string=_('returns the current value of Motor A'),
+ value_block=True,
+ prim_name = 'wedogetMotorA')
+ self.tw.lc.def_prim('wedogetMotorA', 0,
+ Primitive(self.getMotorA, TYPE_INT))
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,
- Primitive(self.prim_wedo_get_motor_b, return_type=TYPE_INT))
+ style='box-style',
+ label=_('Motor B'),
+ help_string=_('returns the current value of Motor B'),
+ value_block=True,
+ prim_name = 'wedogetMotorB')
+ self.tw.lc.def_prim('wedogetMotorB', 0,
+ Primitive(self.getMotorB, TYPE_INT))
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,
- Primitive(self.prim_wedo_set_motor_a,
- arg_descs=[ArgSlot(TYPE_INT)]))
+ style = 'basic-style-1arg',
+ label = _('Motor A'),
+ default = 30,
+ prim_name = 'wedosetMotorA',
+ help_string = _('set the value for Motor A'))
+ self.tw.lc.def_prim('wedosetMotorA', 1,
+ Primitive(self.setMotorA, arg_descs=[ArgSlot(TYPE_NUMBER)]))
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,
- Primitive(self.prim_wedo_set_motor_b,
- arg_descs=[ArgSlot(TYPE_INT)]))
-
- def prim_wedo_select(self, i):
+ style = 'basic-style-1arg',
+ label = _('Motor B'),
+ default = 30,
+ prim_name = 'wedosetMotorB',
+ help_string = _('set the value for Motor B'))
+ self.tw.lc.def_prim('wedosetMotorB', 1,
+ Primitive(self.setMotorB, arg_descs=[ArgSlot(TYPE_NUMBER)]))
+
+ ############################### Turtle signals ############################
+
+ def stop(self):
+ self.stop_all()
+
+ def quit(self):
+ self.stop_all()
+
+ ################################# Primitives ##############################
+
+ def refresh(self):
+ self.wedo_find()
+ self.change_color_blocks()
+ if self.WeDos:
+ n = self.count()
+ self.tw.showlabel('print', WEDO_FOUND % int(n))
+ else:
+ self.tw.showlabel('print', WEDO_NOT_FOUND)
+
+ def select(self, i):
''' Select current device '''
- if self.prim_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.prim_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.prim_wedo_count() - 1:
- i = 0
- self.active_wedo = i
-
- def prim_wedo_count(self):
+ if self.count() == 0:
+ raise logoerror(WEDO_NOT_FOUND)
+ try:
+ t = int(i)
+ t = t - 1
+ except:
+ raise logoerror(ERROR_NO_NUMBER % i)
+ if (t < self.count()) and (t >= 0):
+ self.active_wedo = t
+ else:
+ raise logoerror(INDEX_NOT_FOUND % (t + 1))
+
+ def 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
+ return len(self.WeDos)
- 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 prim_wedo_get_tilt(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
+ def getTilt(self):
+ if self.WeDos:
+ wedo = self.WeDos[self.active_wedo]
+ if wedo.tilt == UNAVAILABLE:
+ return ERROR
+ return wedo.tilt
else:
- return tilt
-
- def prim_wedo_get_distance(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
+ return ERROR
+
+ def getDistance(self):
+ if self.WeDos:
+ wedo = self.WeDos[self.active_wedo]
+ if wedo.distance == UNAVAILABLE:
+ return ERROR
+ return wedo.distance
else:
- return distance
-
- def prim_wedo_get_motor_a(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
+ return ERROR
+
+ def getMotorA(self):
+ if self.WeDos:
+ wedo = self.WeDos[self.active_wedo]
+ return wedo.motor_a
else:
- return speed
-
- def prim_wedo_get_motor_b(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
+ return ERROR
+
+ def getMotorB(self):
+ if self.WeDos:
+ wedo = self.WeDos[self.active_wedo]
+ return wedo.motor_b
else:
- return speed
-
- def prim_wedo_set_motor_a(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 prim_wedo_set_motor_b(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 '''
+ return ERROR
+
+ def setMotorA(self, speed):
+ try:
+ speed = int(speed)
+ except:
+ raise logoerror(ERROR_SPEED)
+ if speed > 100 or speed < -100:
+ raise logoerror(ERROR_SPEED)
+ if self.WeDos:
+ wedo = self.WeDos[self.active_wedo]
+ wedo.motor_a = speed
+
+ def setMotorB(self, speed):
+ try:
+ speed = int(speed)
+ except:
+ raise logoerror(ERROR_SPEED)
+ if speed > 100 or speed < -100:
+ raise logoerror(ERROR_SPEED)
+ if self.WeDos:
+ wedo = self.WeDos[self.active_wedo]
+ wedo.motor_b = speed
+
+ ############################### Useful functions ##########################
+
+ def wedo_find(self):
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)
+ self.active_wedo = 0
+ self.WeDos = []
+ for dev in scan_for_devices():
+ w = WeDo(dev)
+ self.WeDos.append(w)
- def goto_background(self):
- pass
+ def stop_all(self):
+ for wedo in self.WeDos:
+ wedo.motor_a = 0
+ wedo.motor_b = 0
- def return_to_foreground(self):
- pass
+ def change_color_blocks(self):
+ index = palette_name_to_index('wedo')
+ if (index is not None):
+ wedo_blocks = palette_blocks[index]
+ for block in self.tw.block_list.list:
+ if block.type in ['proto', 'block']:
+ if block.name in wedo_blocks:
+ if (self.WeDos) or (block.name == 'wedorefresh'):
+ special_block_colors[block.name] = COLOR_PRESENT[:]
+ else:
+ special_block_colors[block.name] = COLOR_NOTPRESENT[:]
+ block.refresh()
+ self.tw.regenerate_palette(index)
- def quit(self):
- if self._status:
- for wedo in self.WeDos:
- if wedo.dev is not None:
- wedo.setMotors(0, 0)