Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.vscode/settings.json
8 changes: 3 additions & 5 deletions examples/pizza/Pizza.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from pybleno.hci_socket import Emit
from pybleno.hci_socket.Emit import Emit
import _thread
import time

Expand Down Expand Up @@ -28,9 +28,9 @@
'ON_FIRE': 4
}

class Pizza():
class Pizza(Emit):
def __init__(self):
#events.EventEmitter.call(this)
super(Pizza, self).__init__()
self.toppings = PizzaToppings['NONE']
self.crust = PizzaCrust['NORMAL']

Expand All @@ -52,5 +52,3 @@ def on_timeout():
result = PizzaBakeResult['ON_FIRE']
self.emit('ready', [result]);
thread.start_new_thread(on_timeout, ())

Emit.Patch(Pizza)
7 changes: 3 additions & 4 deletions pybleno/Bleno.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import platform
import sys
from . import UuidUtil
from .hci_socket import Emit

platform = platform.system().lower()

Expand All @@ -16,6 +15,7 @@
else:
raise Exception('Unsupported platform')

from .hci_socket.Emit import Emit
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Import moved after L13 because the glob import results in Emit referring to the module, not the class.


class Error(Exception):
def __init__(self, message):
Expand All @@ -30,8 +30,9 @@ def is_callable(callback):
return hasattr(callback, '__call__')


class Bleno:
class Bleno(Emit):
def __init__(self):
super(Bleno, self).__init__()
self.platform = 'unknown'
self.state = 'unknown'
self.address = 'unknown'
Expand Down Expand Up @@ -194,5 +195,3 @@ def updateRssi(self, callback=None):
def onRssiUpdate(self, rssi):
self.emit('rssiUpdate', [rssi])


Emit.Patch(Bleno)
42 changes: 21 additions & 21 deletions pybleno/BlenoPrimaryService.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from . import UuidUtil
import json
from .hci_socket import Emit
from .hci_socket.Emit import Emit


class BlenoPrimaryService(dict):
class BlenoPrimaryService(Emit):
def __init__(self, options):
super(BlenoPrimaryService, self).__init__()
self._dict = {}

self['uuid'] = UuidUtil.removeDashes(options['uuid'])
self['characteristics'] = options['characteristics'] if 'characteristics' in options else []

Expand All @@ -16,55 +18,53 @@ def __str__(self):
})

def __setitem__(self, key, item):
self.__dict__[key] = item
self._dict[key] = item

def __getitem__(self, key):
return self.__dict__[key]
return self._dict[key]

def __repr__(self):
return repr(self.__dict__)
return repr(self._dict)

def __len__(self):
return len(self.__dict__)
return len(self._dict)

def __delitem__(self, key):
del self.__dict__[key]
del self._dict[key]

def clear(self):
return self.__dict__.clear()
return self._dict.clear()

def copy(self):
return self.__dict__.copy()
return self._dict.copy()

def has_key(self, k):
return k in self.__dict__
return k in self._dict

def update(self, *args, **kwargs):
return self.__dict__.update(*args, **kwargs)
return self._dict.update(*args, **kwargs)

def keys(self):
return self.__dict__.keys()
return self._dict.keys()

def values(self):
return self.__dict__.values()
return self._dict.values()

def items(self):
return self.__dict__.items()
return self._dict.items()

def pop(self, *args):
return self.__dict__.pop(*args)
return self._dict.pop(*args)

def __cmp__(self, dict_):
return self.__cmp__(self.__dict__, dict_)
return self.__cmp__(self._dict, dict_)

def __contains__(self, item):
return item in self.__dict__
return item in self._dict

def __iter__(self):
return iter(self.__dict__)
return iter(self._dict)

def __unicode__(self):
return unicode(repr(self.__dict__))

return unicode(repr(self._dict))

Emit.Patch(BlenoPrimaryService)
42 changes: 21 additions & 21 deletions pybleno/Characteristic.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from .hci_socket import Emit
from .hci_socket.Emit import Emit
from . import UuidUtil


class Characteristic(dict):
class Characteristic(Emit):
RESULT_SUCCESS = 0x00
RESULT_INVALID_OFFSET = 0x07
RESULT_ATTR_NOT_LONG = 0x0b
Expand All @@ -11,6 +11,8 @@ class Characteristic(dict):

def __init__(self, options=None):
super(Characteristic, self).__init__()
self._dict = {}

if options is None:
options = {}
self['uuid'] = UuidUtil.removeDashes(options['uuid'])
Expand Down Expand Up @@ -71,55 +73,53 @@ def onIndicate(self):
pass

def __setitem__(self, key, item):
self.__dict__[key] = item
self._dict[key] = item

def __getitem__(self, key):
return self.__dict__[key]
return self._dict[key]

def __repr__(self):
return repr(self.__dict__)
return repr(self._dict)

def __len__(self):
return len(self.__dict__)
return len(self._dict)

def __delitem__(self, key):
del self.__dict__[key]
del self._dict[key]

def clear(self):
return self.__dict__.clear()
return self._dict.clear()

def copy(self):
return self.__dict__.copy()
return self._dict.copy()

def has_key(self, k):
return k in self.__dict__
return k in self._dict

def update(self, *args, **kwargs):
return self.__dict__.update(*args, **kwargs)
return self._dict.update(*args, **kwargs)

def keys(self):
return self.__dict__.keys()
return self._dict.keys()

def values(self):
return self.__dict__.values()
return self._dict.values()

def items(self):
return self.__dict__.items()
return self._dict.items()

def pop(self, *args):
return self.__dict__.pop(*args)
return self._dict.pop(*args)

def __cmp__(self, dict_):
return self.__dict__.__cmp__(dict_)
return self._dict.__cmp__(dict_)

def __contains__(self, item):
return item in self.__dict__
return item in self._dict

def __iter__(self):
return iter(self.__dict__)
return iter(self._dict)

def __unicode__(self):
return unicode(repr(self.__dict__))

return unicode(repr(self._dict))

Emit.Patch(Characteristic)
9 changes: 4 additions & 5 deletions pybleno/hci_socket/AclStream.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from . import Emit
from .Emit import Emit
from .Smp import Smp


class AclStream:
class AclStream(Emit):
def __init__(self, hci, handle, localAddressType, localAddress, remoteAddressType, remoteAddress):
super(AclStream, self).__init__()
self._hci = hci
self._handle = handle
self.encrypted = False
Expand All @@ -17,7 +18,7 @@ def push(self, cid, data):
if data:
self.emit('data', [cid, data])
else:
self.emit('end', []);
self.emit('end', [])

def pushEncrypt(self, encrypt):
self.encrypted = True if encrypt else False
Expand All @@ -27,5 +28,3 @@ def pushEncrypt(self, encrypt):
def pushLtkNegReply(self):
self.emit('ltkNegReply', [])


Emit.Patch(AclStream)
7 changes: 3 additions & 4 deletions pybleno/hci_socket/Bindings.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import platform
from . import Emit
from .Emit import Emit

from .Hci import Hci
from .Gap import Gap
from .Gatt import Gatt
from .AclStream import AclStream


class BlenoBindings:
class BlenoBindings(Emit):
def __init__(self):
super(BlenoBindings, self).__init__()
self._state = None

self._advertising = False
Expand Down Expand Up @@ -168,5 +169,3 @@ def onAclDataPkt(self, handle, cid, data):
if (self._handle == handle and self._aclStream):
self._aclStream.push(cid, data)


Emit.Patch(BlenoBindings)
58 changes: 23 additions & 35 deletions pybleno/hci_socket/Emit.py
Original file line number Diff line number Diff line change
@@ -1,43 +1,31 @@
def on(self, event, handler):
self._events = self._events
handlers = self._events[event] = self._events[event] if event in self._events else []
handlers.append(handler)


def off(self, event, handler):
handlers = self._events[event] = self._events[event] if event in self._events else []
handlers.remove(handler)


def emit(self, event, arguments):
# print self._events
# print self._events[event]
handlers = self._events[event] if event in self._events else []
for handler in handlers:
handler(*arguments)

class Emit:
def __init__(self):
self._events = {}

def once(self, event, arguments, handler):
def temporary_handler(*arguments):
self.off(event, temporary_handler)
handler(*arguments)
def on(self, event, handler):
if event not in self._events:
self._events[event] = []

self.on(event, temporary_handler)
self._events[event].append(handler)

def off(self, event, handler):
if event not in self._events:
return

# class Emit:
def Patch(clzz):
clzz.on = on
clzz.emit = emit
clzz.off = off
clzz.once = once
self._events[event].remove(handler)

old_init = clzz.__init__
def emit(self, event, arguments):
# print self._events
# print self._events[event]
if event not in self._events:
return

def new_init(self, *k, **kw):
self._events = {}
old_init(self, *k, **kw)
for handler in self._events[event]:
handler(*arguments)

clzz.__init__ = new_init
def once(self, event, arguments, handler):
def temporary_handler(*arguments):
self.off(event, temporary_handler)
handler(*arguments)

# Patch = staticmethod(Patch)
self.on(event, temporary_handler)
8 changes: 4 additions & 4 deletions pybleno/hci_socket/Gap.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import platform
import array
from . import Emit, Hci
from . import Hci
from .Emit import Emit
from .Io import *

isLinux = (platform.system() == 'Linux')
isIntelEdison = False # isLinux && (os.release().indexOf('edison') !== -1)
isYocto = False # isLinux && (os.release().indexOf('yocto') !== -1)


class Gap:
class Gap(Emit):
def __init__(self, hci):
super(Gap, self).__init__()
self._hci = hci

self._advertiseState = None
Expand Down Expand Up @@ -193,5 +195,3 @@ def onHciLeAdvertiseEnableSet(self, status):

self.emit('advertisingStop', [])


Emit.Patch(Gap)
Loading