# ... # configure sensors libmetawear.mbl_mw_acc_set_odr(board, 100.0) libmetawear.mbl_mw_acc_set_range(board, 8.0) libmetawear.mbl_mw_acc_write_acceleration_config(board) libmetawear.mbl_mw_baro_bosch_set_standby_time( board, BaroBmp280StandbyTime._0_5ms ) libmetawear.mbl_mw_baro_bosch_set_oversampling( board, BaroBoschOversampling.STANDARD ) libmetawear.mbl_mw_baro_bosch_set_iir_filter( board, BaroBoschIirFilter.OFF ) libmetawear.mbl_mw_baro_bosch_write_config(board) # set up loggers pointers = {} for name, signal in { 'accel': libmetawear.mbl_mw_acc_get_acceleration_data_signal, 'pres': libmetawear.mbl_mw_baro_bosch_get_pressure_data_signal, 'switch': libmetawear.mbl_mw_switch_get_state_data_signal, }: e = threading.Event() def cb(ctx, ptr): global pointers pointers[name] = ptr e.set() cfunc_cb = FnVoid_VoidP_VoidP(cb) libmetawear.mbl_mw_datasignal_log( signal, None, cfunc_cb ) e.wait() # start logging libmetawear.mbl_mw_acc_enable_acceleration_sampling(board) libmetawear.mbl_mw_acc_start(board) libmetawear.mbl_mw_baro_bosch_start(board) libmetawear.mbl_mw_logging_start(board, 0) # (disconnect while logging is in progress) # stop logging libmetawear.mbl_mw_acc_stop(board) libmetawear.mbl_mw_acc_disable_acceleration_sampling(board) libmetawear.mbl_mw_baro_bosch_stop(board) libmetawear.mbl_mw_logging_stop(board) # set up download # first define and set up callbacks DATA_HANDLERS = { DataTypeId.UINT32: lambda x: cast( x.contents.value, POINTER(c_uint)).contents.value, DataTypeId.INT32: lambda x: cast( x.contents.value, POINTER(c_int)).contents.value, DataTypeId.FLOAT: lambda x: cast( x.contents.value, POINTER(c_float)).contents.value, DataTypeId.CARTESIAN_FLOAT: lambda x: cast( x.contents.value, POINTER(CartesianFloat)).contents, DataTypeId.BATTERY_STATE: lambda x: cast( x.contents.value, POINTER(BatteryState)).contents, DataTypeId.BYTE_ARRAY: _byte_array_handler, DataTypeId.TCS34725_ADC: lambda x: cast( x.contents.value, POINTER(Tcs34725ColorAdc)).contents, DataTypeId.EULER_ANGLE: lambda x: cast( x.contents.value, POINTER(EulerAngles)).contents, DataTypeId.QUATERNION: lambda x: cast( x.contents.value, POINTER(Quaternion)).contents, DataTypeId.CORRECTED_CARTESIAN_FLOAT: lambda x: cast( x.contents.value, POINTER(CorrectedCartesianFloat)).contents } def data_error_handler(data): logger.error('Unrecognized data type id: ' + str(data.contents.type_id)) def create_data_cb(logger_name): filename = generate_filename(mac_address, logger_name) path = (pathlib.Path(export_location) / filename) if not path.exists(): f = path.open('w') writer = csv.writer(f) else: f = path.open('a') writer = csv.writer(f) files[logger_name] = (path, f) def cb(context, data): nonlocal writer value = deepcopy( DATA_HANDLERS.get(data.contents.type_id, data_error_handler)(data) ) epoch = int(data.contents.epoch) if isinstance(value, CartesianFloat): values = [value.x, value.y, value.z] else: values = [value] writer.writerow([str(epoch), str(datetime.utcfromtimestamp(epoch / 1000)), ''] + values) f.flush() return FnVoid_VoidP_DataP(cb) def progress_cb(ctx, entries_left, total_entries): print(entries_left, total_entries) for name, ptr in pointers.items(): cb = create_cb(name) libmetawear.mbl_mw_logger_subscribe(ptr, None, cb) progress_cb = FnVoid_VoidP_UInt_UInt(progress_cb) handler = LogDownloadHandler( received_progress_update=progress_update ) # reduce the interval to 7.5ms libmetawear.mbl_mw_settings_set_connection_parameters( board, 7.5, 7.5, 0, 6000 ) # now start the download libmetawear.mbl_mw_logging_download(board, 1000, byref(handler))