Refactored ZeroBorg plugin

This commit is contained in:
Fabio Manganiello 2019-12-23 00:36:53 +01:00
parent 7a7acbe6b9
commit 50a7746bf0
2 changed files with 32 additions and 15 deletions

View file

@ -25,7 +25,7 @@ class GpioSensorDistancePlugin(GpioPlugin, GpioSensorPlugin):
""" """
def __init__(self, trigger_pin: int, echo_pin: int, measurement_interval: float = 0.1, def __init__(self, trigger_pin: int, echo_pin: int, measurement_interval: float = 0.15,
timeout: float = 2.0, warmup_time: float = 2.0, *args, **kwargs): timeout: float = 2.0, warmup_time: float = 2.0, *args, **kwargs):
""" """
:param trigger_pin: GPIO PIN where you connected your sensor trigger PIN (the one that triggers the :param trigger_pin: GPIO PIN where you connected your sensor trigger PIN (the one that triggers the
@ -36,7 +36,7 @@ class GpioSensorDistancePlugin(GpioPlugin, GpioSensorPlugin):
:param measurement_interval: When running in continuous mode (see :param measurement_interval: When running in continuous mode (see
:func:`platypush.plugins.gpio.sensor.distance.GpioSensorDistancePlugin.start_measurement`) this parameter :func:`platypush.plugins.gpio.sensor.distance.GpioSensorDistancePlugin.start_measurement`) this parameter
indicates how long should be waited between two measurements (default: 0.1 seconds) indicates how long should be waited between two measurements (default: 0.15 seconds)
:param timeout: The echo-wait will terminate and the plugin will return null if no echo has been :param timeout: The echo-wait will terminate and the plugin will return null if no echo has been
received after this time (default: 1 second). received after this time (default: 1 second).

View file

@ -102,7 +102,7 @@ class GpioZeroborgPlugin(Plugin):
self.auto_mode = False self.auto_mode = False
self._direction = None self._direction = None
self._drive_thread: Optional[threading.Thread] = None self._drive_thread: Optional[threading.Thread] = None
self._can_run: bool = False self._motors = [0, 0, 0, 0]
self.zb = ZeroBorg.ZeroBorg() self.zb = ZeroBorg.ZeroBorg()
self.zb.Init() self.zb.Init()
@ -164,7 +164,7 @@ class GpioZeroborgPlugin(Plugin):
def _run(): def _run():
try: try:
while self._can_run and self._direction: while self._direction:
if self._direction == Direction.DIR_AUTO_TOGGLE.value: if self._direction == Direction.DIR_AUTO_TOGGLE.value:
if self.auto_mode: if self.auto_mode:
self._direction = None self._direction = None
@ -176,36 +176,34 @@ class GpioZeroborgPlugin(Plugin):
if self._direction == Direction.DIR_AUTO.value: if self._direction == Direction.DIR_AUTO.value:
self.auto_mode = True self.auto_mode = True
motors = [0, 0, 0, 0]
try: try:
if self.auto_mode: if self.auto_mode:
self._direction = self._get_direction_from_sensors() self._direction = self._get_direction_from_sensors()
time.sleep(0.1) time.sleep(0.1)
if self._direction in self.directions and self._direction != Direction.DIR_AUTO.value: if self._direction in self.directions and self._direction != Direction.DIR_AUTO.value:
motors = self.directions[self._direction] self._motors = self.directions[self._direction]
else: else:
self.logger.warning('Invalid direction {}: stopping motors'.format(self._direction)) self.logger.warning('Invalid direction {}: stopping motors'.format(self._direction))
except Exception as e: except Exception as e:
self.logger.error('Error on _get_direction_from_sensors: {}'.format(str(e))) self.logger.error('Error on _get_direction_from_sensors: {}'.format(str(e)))
break break
for i, power in enumerate(motors): for i, power in enumerate(self._motors):
method = getattr(self.zb, 'SetMotor{}'.format(i+1)) method = getattr(self.zb, 'SetMotor{}'.format(i+1))
method(power) method(power)
finally: finally:
self.stop() self.zb.MotorsOff()
self.zb.ResetEpo()
self._drive_thread = None self._drive_thread = None
self._can_run = True
self._direction = direction.lower() self._direction = direction.lower()
get_bus().post(ZeroborgDriveEvent(direction=self._direction, motors=self.directions[self._direction]))
if not self._drive_thread: if not self._drive_thread:
self._drive_thread = threading.Thread(target=_run) self._drive_thread = threading.Thread(target=_run)
self._drive_thread.start() self._drive_thread.start()
get_bus().post(ZeroborgDriveEvent(direction=self._direction, motors=self.directions[self._direction]))
return {'status': 'running', 'direction': direction} return {'status': 'running', 'direction': direction}
@action @action
@ -214,16 +212,35 @@ class GpioZeroborgPlugin(Plugin):
Turns off the motors Turns off the motors
""" """
self._can_run = False
self.auto_mode = False self.auto_mode = False
self._direction = None
if self._drive_thread and threading.get_ident() != self._drive_thread.ident: if self._drive_thread:
self._drive_thread.join() self._drive_thread.join()
self.zb.MotorsOff()
self.zb.ResetEpo()
get_bus().post(ZeroborgStopEvent()) get_bus().post(ZeroborgStopEvent())
return {'status': 'stopped'} return {'status': 'stopped'}
@action
def status(self) -> dict:
"""
Get the current direction and motors power. Example response::
..code-block:: json
{
"status": "running",
"direction": "up",
"motors": [1.0, 1.0, -1.0, -1.0]
}
"""
return {
'status': 'running' if self._direction else 'stopped',
'direction': self._direction,
'motors': [getattr(self.zb, 'GetMotor{}'.format(i+1))() for i in range(4)],
}
# vim:sw=4:ts=4:et: # vim:sw=4:ts=4:et: