Skip to content
This repository was archived by the owner on Jul 20, 2025. It is now read-only.

Commit 5e18fae

Browse files
authored
Merge pull request #23 from mbientlab/mw_usb_rebase
usb: add mw usb class for scanning and connecting over usb serial.
2 parents c31f5ce + 31a7a5d commit 5e18fae

File tree

5 files changed

+410
-10
lines changed

5 files changed

+410
-10
lines changed

examples/log_acc_perf.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# usage: python3 log_acc_perf.py [mac]
2+
from __future__ import print_function
3+
from mbientlab.metawear import MetaWear, libmetawear, parse_value, create_voidp, create_voidp_int
4+
from mbientlab.metawear.cbindings import *
5+
from threading import Event
6+
7+
import sys
8+
import time
9+
10+
print("Searching for device...")
11+
d = MetaWear(sys.argv[1])
12+
d.connect()
13+
print("Connected to " + d.address)
14+
15+
print("Configuring device")
16+
17+
try:
18+
print("Get and log acc signal")
19+
signal = libmetawear.mbl_mw_acc_get_acceleration_data_signal(d.board)
20+
logger = create_voidp(lambda fn: libmetawear.mbl_mw_datasignal_log(signal, None, fn), resource = "acc_logger")
21+
22+
print("Start logging")
23+
libmetawear.mbl_mw_logging_start(d.board, 0)
24+
25+
print("Start acc")
26+
libmetawear.mbl_mw_acc_set_odr(d.board, 400.)
27+
libmetawear.mbl_mw_acc_write_acceleration_config(d.board)
28+
libmetawear.mbl_mw_acc_enable_acceleration_sampling(d.board)
29+
libmetawear.mbl_mw_acc_start(d.board)
30+
31+
print("Logging data for 10s")
32+
time.sleep(10.0)
33+
34+
print("Setop acc")
35+
libmetawear.mbl_mw_acc_stop(d.board)
36+
libmetawear.mbl_mw_acc_disable_acceleration_sampling(d.board)
37+
38+
print("Stop logging")
39+
libmetawear.mbl_mw_logging_stop(d.board)
40+
41+
print("Flush cache if MMS")
42+
libmetawear.mbl_mw_logging_flush_page(d.board)
43+
44+
print("Downloading data")
45+
libmetawear.mbl_mw_settings_set_connection_parameters(d.board, 7.5, 7.5, 0, 6000)
46+
time.sleep(1.0)
47+
48+
print("Setup Download handler")
49+
e = Event()
50+
read_count = 0
51+
def progress_update_handler(context, entries_left, total_entries):
52+
if (entries_left == 0):
53+
e.set()
54+
55+
fn_wrapper = FnVoid_VoidP_UInt_UInt(progress_update_handler)
56+
download_handler = LogDownloadHandler(context = None, \
57+
received_progress_update = fn_wrapper, \
58+
received_unknown_entry = cast(None, FnVoid_VoidP_UByte_Long_UByteP_UByte), \
59+
received_unhandled_entry = cast(None, FnVoid_VoidP_DataP))
60+
61+
def data_handler(p):
62+
global read_count
63+
read_count += 2
64+
#print("{epoch: %d, value: %s}" % (p.contents.epoch, parse_value(p)))
65+
66+
callback = FnVoid_VoidP_DataP(lambda ctx, p: data_handler(p))
67+
68+
print("Subscribe to logger")
69+
libmetawear.mbl_mw_logger_subscribe(logger, None, callback)
70+
71+
print("Download data")
72+
dl_time = time.time()
73+
libmetawear.mbl_mw_logging_download(d.board, 0, byref(download_handler))
74+
e.wait()
75+
dl_time = time.time() - dl_time
76+
print("Entry Read Count: %d" % (read_count))
77+
print("Entry Read Rate: %0.1f entries/s" % (read_count/dl_time))
78+
79+
except RuntimeError as err:
80+
print(err)
81+
finally:
82+
print("Resetting device")
83+
84+
e = Event()
85+
d.on_disconnect = lambda status: e.set()
86+
print("Debug reset")
87+
libmetawear.mbl_mw_debug_reset(d.board)
88+
e.wait()

examples/log_download.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# usage: python3 log_download.py [mac]
2+
from __future__ import print_function
3+
from mbientlab.metawear import MetaWear, libmetawear, parse_value
4+
from mbientlab.metawear.cbindings import *
5+
from time import sleep, strftime
6+
from threading import Event
7+
8+
import platform
9+
import sys
10+
11+
if sys.version_info[0] == 2:
12+
range = xrange
13+
14+
# connect
15+
metawear = MetaWear(sys.argv[1])
16+
metawear.connect()
17+
print("Connected")
18+
19+
# setup
20+
e = Event()
21+
result = {}
22+
23+
# handler fxn
24+
def handler(ctx, board, signals, len):
25+
result['length'] = len
26+
result['signals'] = cast(signals, POINTER(c_void_p * len)) if signals is not None else None
27+
e.set()
28+
# handler fxn ptr
29+
handler_fn = FnVoid_VoidP_VoidP_VoidP_UInt(handler)
30+
31+
# datahandler class
32+
class DataHandler:
33+
def __init__(self, signal):
34+
self.identifier = libmetawear.mbl_mw_anonymous_datasignal_get_identifier(signal)
35+
self.filename = self.identifier.decode() + '-' + strftime("%m-%d-%Y-%H-%M-%S") + '.csv'
36+
self.file = None
37+
#self.data_handler_fn = FnVoid_VoidP_DataP(lambda ctx, ptr: print({"identifier": self.identifier, "epoch": ptr.contents.epoch, "value": parse_value(ptr)}))
38+
self.data_handler_fn = FnVoid_VoidP_DataP(lambda ctx, ptr: self.write(ctx, ptr))
39+
def write(self, ctx, ptr):
40+
d_struct = parse_value(ptr)
41+
if self.file is None:
42+
print("Opening %s for write." % (self.filename))
43+
self.file = open(self.filename, 'w')
44+
self.file.write('epoch,' + ','.join([f[0] for f in d_struct._fields_]) + '\n')
45+
data = [str(getattr(d_struct, f[0])) for f in d_struct._fields_]
46+
self.file.write(str(ptr.contents.epoch) + ',' + ','.join(data) + '\n')
47+
def __del__(self):
48+
if self.file is not None:
49+
self.file.close()
50+
51+
# setup ble
52+
libmetawear.mbl_mw_settings_set_connection_parameters(metawear.board, 7.5, 7.5, 0, 6000)
53+
sleep(1.0)
54+
55+
# create anonymous signal
56+
print("Creating anonymous signals")
57+
libmetawear.mbl_mw_metawearboard_create_anonymous_datasignals(metawear.board, None, handler_fn)
58+
e.wait()
59+
60+
# make sense of logging signals found
61+
if (result['signals'] == None):
62+
if (result['length'] != 0):
63+
print("Error creating anonymous signals, status = " + str(result['length']))
64+
else:
65+
print("No active loggers detected")
66+
else:
67+
e.clear()
68+
# stop logging
69+
libmetawear.mbl_mw_logging_stop(metawear.board)
70+
# print results
71+
print(str(result['length']) + " active loggers discovered")
72+
handlers = []
73+
# analyze results
74+
for x in range(0, result['length']):
75+
wrapper = DataHandler(result['signals'].contents[x])
76+
# subscribe to download if good signal
77+
libmetawear.mbl_mw_anonymous_datasignal_subscribe(result['signals'].contents[x], None, wrapper.data_handler_fn)
78+
handlers.append(wrapper)
79+
# progress handler fxn
80+
def progress_update_handler(ctx, left, total):
81+
if (left == 0):
82+
e.set()
83+
# unknown entry handler fxn
84+
def unknown_entry_handler(ctx, id, epoch, data, length):
85+
print("unknown entry = " + str(id))
86+
# download handlers
87+
print("Downloading log")
88+
progress_update_fn = FnVoid_VoidP_UInt_UInt(progress_update_handler)
89+
unknown_entry_fn = FnVoid_VoidP_UByte_Long_UByteP_UByte(unknown_entry_handler)
90+
download_handler= LogDownloadHandler(context = None, received_progress_update = progress_update_fn,
91+
received_unknown_entry = unknown_entry_fn, received_unhandled_entry = cast(None, FnVoid_VoidP_DataP))
92+
# download
93+
libmetawear.mbl_mw_logging_download(metawear.board, 10, byref(download_handler))
94+
# wait until done
95+
e.wait()
96+
# wait 1s
97+
sleep(1.0)
98+
print("Download completed")
99+
e.clear()
100+
metawear.on_disconnect = lambda status: e.set()
101+
# disconnect
102+
libmetawear.mbl_mw_debug_disconnect(metawear.board)
103+
e.wait()
104+

examples/stream_gyro_packed.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def gyro_data_handler(self, ctx, data):
7070
libmetawear.mbl_mw_gyro_bmi270_stop(s.device.board)
7171
libmetawear.mbl_mw_gyro_bmi270_disable_rotation_sampling(s.device.board)
7272

73-
gyro = llibmetawear.mbl_mw_gyro_bmi270_get_packed_rotation_data_signal(s.device.board)
73+
gyro = libmetawear.mbl_mw_gyro_bmi270_get_packed_rotation_data_signal(s.device.board)
7474
libmetawear.mbl_mw_datasignal_unsubscribe(gyro)
7575

7676
libmetawear.mbl_mw_debug_disconnect(s.device.board)

mbientlab/metawear/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
init_libmetawear(libmetawear)
1616

1717
from .metawear import MetaWear
18+
from .metawear import MetaWearUSB
1819

1920
_value_parsers = {
2021
DataTypeId.UINT32: lambda p: cast(p.contents.value, POINTER(c_uint)).contents.value,

0 commit comments

Comments
 (0)