From 4eb64078fa32e10afcf673d5cfe9c492245566cc Mon Sep 17 00:00:00 2001 From: Eric Tsai Date: Fri, 3 Nov 2017 16:42:47 -0700 Subject: [PATCH] API v0.2.0 commit --- MetaWear-SDK-Cpp | 2 +- examples/anonymous_datasignals.py | 76 +++++++++++++++++++++++++++++++ examples/led.py | 1 + examples/multi_device.py | 8 +++- examples/scan_connect.py | 1 + mbientlab/metawear/__init__.py | 13 ++---- setup.py | 2 +- 7 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 examples/anonymous_datasignals.py diff --git a/MetaWear-SDK-Cpp b/MetaWear-SDK-Cpp index d81a6d3..261098d 160000 --- a/MetaWear-SDK-Cpp +++ b/MetaWear-SDK-Cpp @@ -1 +1 @@ -Subproject commit d81a6d3d46df59b8e764632fec07dbf491a5ce5b +Subproject commit 261098db60b65a82b26fb11c2101d12bd3354de1 diff --git a/examples/anonymous_datasignals.py b/examples/anonymous_datasignals.py new file mode 100644 index 0000000..f15c595 --- /dev/null +++ b/examples/anonymous_datasignals.py @@ -0,0 +1,76 @@ +# usage: python anonymous_datasignals.py [mac] +from __future__ import print_function +from mbientlab.metawear import MetaWear, libmetawear, parse_value +from mbientlab.metawear.cbindings import * +from time import sleep +from threading import Event + +import platform +import sys + +if sys.version_info[0] == 2: + range = xrange + +metawear = MetaWear(sys.argv[1]) +metawear.connect() +print("Connected") + +sync_event = Event() +result = {} +def handler(board, signals, len): + result['length'] = len + result['signals'] = cast(signals, POINTER(c_void_p * len)) if signals is not None else None + sync_event.set() +handler_fn = FnVoid_VoidP_VoidP_UInt(handler) + +class DataHandler: + def __init__(self, signal): + raw = libmetawear.mbl_mw_anonymous_datasignal_get_identifier(signal) + self.identifier = cast(raw, c_char_p).value.decode("ascii") + self.data_handler_fn = FnVoid_DataP(lambda ptr: print({"identifier": self.identifier, "epoch": ptr.contents.epoch, "value": parse_value(ptr)})) + + libmetawear.mbl_mw_memory_free(raw) + +print("Creating anonymous signals") +libmetawear.mbl_mw_settings_set_connection_parameters(metawear.board, 7.5, 7.5, 0, 6000) +sleep(1.0) +libmetawear.mbl_mw_metawearboard_create_anonymous_datasignals(metawear.board, handler_fn) +sync_event.wait() + +if (result['signals'] == None): + if (result['length'] != 0): + print("Error creating anonymous signals, status = " + str(result['length'])) + else: + print("No active loggers detected") +else: + dl_event = Event() + libmetawear.mbl_mw_logging_stop(metawear.board) + + print(str(result['length']) + " active loggers discovered") + handlers = [] + for x in range(0, result['length']): + wrapper = DataHandler(result['signals'].contents[x]) + libmetawear.mbl_mw_anonymous_datasignal_subscribe(result['signals'].contents[x], wrapper.data_handler_fn) + handlers.append(wrapper) + + def progress_update_handler(left, total): + if (left == 0): + dl_event.set() + + def unknown_entry_handler(id, epoch, data, length): + print("unknown entry = " + str(id)) + + print("Downloading log") + progress_update_fn = FnVoid_UInt_UInt(progress_update_handler) + unknown_entry_fn = FnVoid_UByte_Long_UByteP_UByte(unknown_entry_handler) + download_handler= LogDownloadHandler(received_progress_update = progress_update_fn, + received_unknown_entry = unknown_entry_fn, received_unhandled_entry = cast(None, FnVoid_DataP)) + libmetawear.mbl_mw_logging_download(metawear.board, 10, byref(download_handler)) + dl_event.wait() + + print("Download completed") + libmetawear.mbl_mw_macro_erase_all(metawear.board) + libmetawear.mbl_mw_debug_reset_after_gc(metawear.board) + libmetawear.mbl_mw_debug_disconnect(metawear.board) + + sleep(1.0) diff --git a/examples/led.py b/examples/led.py index 785cd2d..1b11435 100644 --- a/examples/led.py +++ b/examples/led.py @@ -1,3 +1,4 @@ +# usage: python led.py [mac] from mbientlab.metawear import MetaWear, libmetawear from mbientlab.metawear.cbindings import * from time import sleep diff --git a/examples/multi_device.py b/examples/multi_device.py index f7ba9b4..32bf2c8 100644 --- a/examples/multi_device.py +++ b/examples/multi_device.py @@ -1,3 +1,4 @@ +# usage: python multi_device [mac1] [mac2] ... [mac(n)] from mbientlab.metawear import MetaWear, libmetawear, parse_value from mbientlab.metawear.cbindings import * from time import sleep @@ -6,6 +7,9 @@ import platform import sys +if sys.version_info[0] == 2: + range = xrange + class State: def __init__(self, device): self.device = device @@ -17,7 +21,7 @@ def data_handler(self, data): self.samples+= 1 states = [] -for i in xrange(len(sys.argv) - 1): +for i in range(len(sys.argv) - 1): d = MetaWear(sys.argv[i + 1]) d.connect() print("Connected to " + d.address) @@ -25,7 +29,7 @@ def data_handler(self, data): for s in states: print("configuring device") - libmetawear.mbl_mw_settings_set_connection_parameters(s.device.board, 7.5, 7.5, 0, 6000); + libmetawear.mbl_mw_settings_set_connection_parameters(s.device.board, 7.5, 7.5, 0, 6000) libmetawear.mbl_mw_acc_set_odr(s.device.board, 25.0); libmetawear.mbl_mw_acc_set_range(s.device.board, 16.0); libmetawear.mbl_mw_acc_write_acceleration_config(s.device.board); diff --git a/examples/scan_connect.py b/examples/scan_connect.py index 62afbdc..025890f 100644 --- a/examples/scan_connect.py +++ b/examples/scan_connect.py @@ -1,3 +1,4 @@ +# usage: python scan_connect.py from mbientlab.metawear import MetaWear from mbientlab.metawear.cbindings import * from gattlib import DiscoveryService diff --git a/mbientlab/metawear/__init__.py b/mbientlab/metawear/__init__.py index b0168e9..98237d7 100644 --- a/mbientlab/metawear/__init__.py +++ b/mbientlab/metawear/__init__.py @@ -9,7 +9,6 @@ import os import platform import requests -import sets import time import uuid @@ -45,8 +44,8 @@ def parse_value(p_data): """ if (p_data.contents.type_id == DataTypeId.UINT32): return cast(p_data.contents.value, POINTER(c_uint)).contents.value - elif (p_data.contents.type_id == DataTypeId.INT32): - return cast(p_data.contents.value, POINTER(c_int).contents).value + elif (p_data.contents.type_id == DataTypeId.INT32 or p_data.contents.type_id == DataTypeId.SENSOR_ORIENTATION): + return cast(p_data.contents.value, POINTER(c_int)).contents.value elif (p_data.contents.type_id == DataTypeId.FLOAT): return cast(p_data.contents.value, POINTER(c_float)).contents.value elif (p_data.contents.type_id == DataTypeId.CARTESIAN_FLOAT): @@ -87,8 +86,6 @@ def on_notification(self, handle, data): class MetaWear(object): _METABOOT_SERVICE = uuid.UUID("00001530-1212-efde-1523-785feabcd123") - _METABOOT_CONTROL_POINT = GattChar(service_uuid_high = 0x000015301212efde, service_uuid_low = 0x1523785feabcd123, - uuid_high = 0x000015311212efde, uuid_low = 0x1523785feabcd123) def __init__(self, address, **kwargs): """ @@ -148,7 +145,7 @@ def connect(self, **kwargs): """ self.gatt.connect(True, channel_type='random') - self.services = sets.Set() + self.services = set() for s in self.gatt.discover_primary(): self.services.add(s['uuid']) @@ -185,7 +182,7 @@ def _write_gatt_char(self, caller, write_type, ptr_gattchar, value, length): buffer.append(value[i]) handle = self.characteristics[_gattchar_to_string(ptr_gattchar.contents)] - if self.in_metaboot_mode and ptr_gattchar.contents == MetaWear._METABOOT_CONTROL_POINT: + if (write_type == GattCharWriteType.WITH_RESPONSE): self.gatt.write_by_handle_async(handle, bytes(bytearray(buffer)), self.response) else: self.gatt.write_cmd_by_handle(handle, bytes(bytearray(buffer))) @@ -292,7 +289,7 @@ def print_dfu_start(): self._on_error = FnVoid_charP(self._dfu_error) path = self._download_firmware() if 'version' not in kwargs else self._download_firmware(version = kwargs['version']) - buffer = create_string_buffer(bytes(path)) + buffer = create_string_buffer(path.encode('ascii')) self._dfu_delegate = DfuDelegate(on_dfu_started = self._on_started, on_dfu_cancelled = self._on_cancelled, on_transfer_percentage = self._on_transfer, on_successful_file_transferred = self._on_successful, on_error = self._on_error) libmetawear.mbl_mw_metawearboard_perform_dfu(self.board, byref(self._dfu_delegate), buffer.raw) diff --git a/setup.py b/setup.py index d95a096..abb77e0 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ def run(self): setup( name='metawear', packages=['mbientlab', 'mbientlab.metawear'], - version='0.1.9', + version='0.2.0', description='Python bindings for the MetaWear C++ SDK by MbientLab', long_description=open(os.path.join(os.path.dirname(__file__), "README.rst")).read(), package_data={'mbientlab.metawear': ['libmetawear.so*']},