Skip to content

Commit

Permalink
Add bit:commander extension to microbit (#166)
Browse files Browse the repository at this point in the history
4tronix is creating a new game controller style add-on for the microbit.
This adds support for that functionality.
This also adds better support for microbit IO Pin Service
This also adds better support for async/eventloop
  • Loading branch information
ukBaz committed Oct 4, 2017
1 parent eb97523 commit 42d8296
Show file tree
Hide file tree
Showing 14 changed files with 447 additions and 65 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ script:
# Shared
- coverage run -m unittest -v tests.test_tools
- coverage run --append -m unittest -v tests.test_dbus_tools
- coverage run --append -m unittest -v tests.test_async_tools
# Level 100
- coverage run --append -m unittest -v tests.test_adapter
- coverage run --append -m unittest -v tests.test_advertisement
Expand Down
14 changes: 6 additions & 8 deletions bluezero/GATT.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,12 @@ def emit(self, record):
from bluezero import device

dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
mainloop = GObject.MainLoop()

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.addHandler(NullHandler())


def generic_error_cb(error):
"""Generic Error Callback function."""
logger.error('D-Bus call failed: ' + str(error))
mainloop.quit()


class Service:
"""Remote GATT Service."""

Expand Down Expand Up @@ -428,6 +421,11 @@ def UUIDs(self):
return self.profile_props.Get(constants.GATT_PROFILE_IFACE, 'UUIDs')


def generic_error_cb(error):
"""Generic Error Callback function."""
logger.error('D-Bus call failed: ' + str(error))


def register_app_cb():
"""Application registration callback."""
logger.info('GATT application registered')
Expand All @@ -436,7 +434,7 @@ def register_app_cb():
def register_app_error_cb(error):
"""Application registration error callback."""
logger.warning('Failed to register application: ' + str(error))
mainloop.quit()
# mainloop.quit()


class GattManager:
Expand Down
22 changes: 10 additions & 12 deletions bluezero/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,11 @@

# D-Bus imports
import dbus
import dbus.mainloop.glib

# python-bluezero imports
from bluezero import constants
from bluezero import dbus_tools

# Main eventloop import
try:
from gi.repository import GLib as GObject
except ImportError:
import gobject as GObject
from bluezero import async_tools

import logging
try: # Python 2.7+
Expand All @@ -25,9 +19,6 @@ def emit(self, record):
pass


# Initialise the mainloop
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
logger.addHandler(NullHandler())
Expand Down Expand Up @@ -98,7 +89,7 @@ def __init__(self, adapter_addr=None):

self._nearby_timeout = 10
self._nearby_count = 0
self.mainloop = GObject.MainLoop()
self.mainloop = async_tools.EventLoop()

self.bus.add_signal_receiver(dbus_tools.interfaces_added,
dbus_interface=constants.DBUS_OM_IFACE,
Expand Down Expand Up @@ -224,10 +215,17 @@ def nearby_discovery(self, timeout=10):
self._nearby_timeout = timeout
self._nearby_count = 0

GObject.timeout_add(1000, self._discovering_timeout)
# GLib.timeout_add(1000, self._discovering_timeout)
self.mainloop.add_timer(1000, self._discovering_timeout)
self.adapter_methods.StartDiscovery()
self.mainloop.run()

def stop_discovery(self):
"""Stop scanning of nearby Bluetooth devices."""
self.adapter_methods.StopDiscovery()

def run(self):
self.mainloop.run()

def quit(self):
self.mainloop.quit()
49 changes: 49 additions & 0 deletions bluezero/async_tools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Main eventloop import
from gi.repository import GLib

import logging
try: # Python 2.7+
from logging import NullHandler
except ImportError:
class NullHandler(logging.Handler):
def emit(self, record):
pass

logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
logger.addHandler(NullHandler())


class EventLoop:
# def generic_error_cb(self, error):
# """Generic Error Callback function."""
# logger.error('D-Bus call failed: ' + str(error))
# self.mainloop.quit()

# def __new__(cls):
# return object.__new__(cls)

def __init__(self):
self.mainloop = GLib.MainLoop()

# @property
# def run(self):
# return self.mainloop.is_running()
#
# @run.setter
# def run(self, state):
# if state:
# self.mainloop.run()
# else:
# self.mainloop.quit()
def run(self):
self.mainloop.run()

def quit(self):
self.mainloop.quit()

def is_running(self):
self.mainloop.is_running()

def add_timer(self, time, callback):
GLib.timeout_add(time, callback)
12 changes: 6 additions & 6 deletions bluezero/central.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,6 @@ def emit(self, record):
logger.addHandler(NullHandler())


def generic_error_cb(error):
"""Generic Error Callback function."""
logger.error('D-Bus call failed: ' + str(error))
mainloop.quit()


class Central:
"""Create a BLE instance taking the Central role."""

Expand Down Expand Up @@ -92,3 +86,9 @@ def connect(self, profile=None):
def disconnect(self):
"""Disconnect from the remote device."""
self.rmt_device.disconnect()

def run(self):
self.dongle.run()

def quit(self):
self.dongle.quit()
22 changes: 0 additions & 22 deletions bluezero/dbus_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,11 @@ def emit(self, record):
# D-Bus import
import dbus
import dbus.mainloop.glib
try:
from gi.repository import GObject
except ImportError:
import gobject as GObject

# python-bluezero constants import
from bluezero import constants

dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
mainloop = GObject.MainLoop()

logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
Expand Down Expand Up @@ -300,20 +295,3 @@ def get_props(adapter=None,
descriptor)

return get_dbus_iface(dbus.PROPERTIES_IFACE, get_dbus_obj(path_obj))


#############################
# Interface search functions
#############################

def start_mainloop():
mainloop.run()


def stop_mainloop():
mainloop.quit()


def generic_error_cb(error):
print('D-Bus call failed: ' + str(error))
mainloop.quit()
Loading

0 comments on commit 42d8296

Please sign in to comment.