def main(): address = "D9:05:CD:93:E5:FC" #select_device() print("start connecting ", address) device = MetaWear(address) device.connect() print("Connected") pattern = LedPattern(repeat_count=Const.LED_REPEAT_INDEFINITELY) libmetawear.mbl_mw_led_load_preset_pattern(byref(pattern), LedPreset.SOLID) libmetawear.mbl_mw_led_write_pattern(device.board, byref(pattern), LedColor.GREEN) libmetawear.mbl_mw_led_play(device.board) sleep(5.0) libmetawear.mbl_mw_led_stop_and_clear(device.board) sleep(1.0) device.disconnect() sleep(1.0)
device = MetaWear('FB:81:71:31:92:7A') device.connect() # Callback function to process/parse the battery data def data_handler(self, ctx, data): print("%s -> %s" % (self.device.address, parse_value(data))) callback = FnVoid_VoidP_DataP(data_handler) print("Configuring device") libmetawear.mbl_mw_settings_set_connection_parameters(device.board, 7.5, 7.5, 0, 6000) battery_signal = libmetawear.mbl_mw_settings_get_battery_state_data_signal( device.board) libmetawear.mbl_mw_datasignal_subscribe(battery_signal, None, callback) sleep(1.0) libmetawear.mbl_mw_datasignal_read(battery_signal) sleep(5.0) libmetawear.mbl_mw_datasignal_unsubscribe(battery_signal) libmetawear.mbl_mw_debug_disconnect(device.board) device.on_disconnect = lambda status: print("we are disconnected!") device.disconnect()
class MetaWearClient(object): """A MetaWear communication client. This client bridges the gap between the `MetaWear C++ API <https://github.com/mbientlab/Metawear-CppAPI>`_ and a GATT communication package in Python. It provides Pythonic interface to using the MetaWear boards, allowing for rapid development and testing. :param str address: A Bluetooth MAC address to a MetaWear board. :param str device: Specifying which Bluetooth device to use. Defaults to ``hci0``. :param bool connect: If client should connect automatically, or wait for explicit :py:meth:`~MetaWearClient.connect` call. Default is ``True``. :param bool debug: If printout of all sent and received data should be done. """ def __init__(self, address, device='hci0', connect=True, debug=False): """Constructor.""" self._address = address self._debug = debug if self._debug: add_stream_logger() log.info("Creating MetaWearClient for {0}...".format(address)) self.mw = MetaWear(self._address, device=device) log.info("Client started for BLE device {0} on {1}...".format( self._address, device)) self.accelerometer = None #self.gpio = None self.gyroscope = None self.magnetometer = None self.barometer = None self.ambient_light = None self.switch = None self.settings = None self.temperature = None self.haptic = None self.led = None self.sensorfusion = None if connect: self.connect() @property def board(self): return self.mw.board @property def firmware_version(self): return self.mw.info['firmware'] @property def hardware_version(self): return self.mw.info['hardware'] @property def manufacturer(self): return self.mw.info['manufacturer'] @property def serial(self): return self.mw.info['serial'] @property def model(self): return self.mw.info['model'] def __str__(self): return "MetaWearClient, {0}: {1}".format( self._address, self.mw.info) def __repr__(self): return "<MetaWearClient, {0}>".format(self._address) def connect(self): """Connect this client to the MetaWear device.""" self.mw.connect() self._initialize_modules() def disconnect(self): """Disconnects this client from the MetaWear device.""" self.mw.disconnect() def _initialize_modules(self): #self.gpio = modules.GpioModule( # self.board, # libmetawear.mbl_mw_metawearboard_lookup_module( # self.board, modules.Modules.MBL_MW_MODULE_GPIO), # debug=self._debug) self.accelerometer = modules.AccelerometerModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_ACCELEROMETER), debug=self._debug) self.gyroscope = modules.GyroscopeModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_GYRO), debug=self._debug) self.magnetometer = modules.MagnetometerModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_MAGNETOMETER), debug=self._debug) self.barometer = modules.BarometerModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_BAROMETER), debug=self._debug) self.ambient_light = modules.AmbientLightModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_AMBIENT_LIGHT), debug=self._debug) self.switch = modules.SwitchModule(self.board, debug=self._debug) self.settings = modules.SettingsModule(self.board, debug=self._debug) self.temperature = modules.TemperatureModule( self.board, debug=self._debug) self.haptic = modules.HapticModule(self.board, debug=self._debug) self.led = modules.LEDModule(self.board, debug=self._debug) self.sensorfusion = modules.SensorFusionModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_SENSOR_FUSION), debug=self._debug)
class s1: def __init__(self, filename,sensorAddress): self.device = MetaWear(sensorAddress) self.board = self.device.board self.filename = filename self.device.connect() self.cnt = 0 print("connected to", self.device.address) sleep(2) self.sensordatastr = "" self.EulerAngels= None self.euler_signal = None self.checkLogFiles(self.filename) self.euler_callback = FnVoid_VoidP_DataP(self.data_handler) self.sensorData = {"Name":self.filename,"epoch":0,"heading":0,"pitch":0,"roll":0,"yaw":0,"logs":0} self.checkLogFiles("log1.csv") ######################################################################## def close(self): libmetawear.mbl_mw_sensor_fusion_stop(self.board) libmetawear.mbl_mw_sensor_fusion_clear_enabled_mask(self.board) libmetawear.mbl_mw_datasignal_unsubscribe(self.euler_signal) self.device.disconnect() sleep(1) print("DISCONNETED") ######################################################################## def checkLogFiles(self,filename): path.exists(filename) res = path.exists(filename) if res == False: print("no file found, creating file") f = open(filename,"w+") f.close() print ("file created") with open(filename, mode='w+') as csv_file: fieldnames = ['epoch', 'pitch', 'roll','yaw'] writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter = ',') writer.writeheader() else: print ("File found in the path") ######################################################################## def logData(self,filename,data): f = open(filename,"a+") f.write(data) f.write("\n") f.close() ######################################################################## def data_handler(self,content,data): EulerAngels = parse_value(data) #print (EulerAngels) pi = pointer(EulerAngels) self.sensordatastr = str(data.contents.epoch)+","+ str(("%.4f" %pi.contents.heading)) +","+ str(("%.4f" %pi.contents.pitch))+","+ str(("%.4f" %pi.contents.roll))+","+str(("%.4f" %pi.contents.yaw)) #print (sensordatastr) self.logData(self.filename,self.sensordatastr) #sleep(0.05) self.sensorData["epoch"] = (data.contents.epoch) self.sensorData["heading"] = ("%.4f" %pi.contents.heading) self.sensorData["pitch"] = ("%.4f" %pi.contents.pitch) self.sensorData["roll"] = ("%.4f" %pi.contents.roll) self.sensorData["yaw"] = ("%.4f" %pi.contents.yaw) self.sensorData["logs"] = self.cnt self.cnt = self.cnt +1 print (self.sensorData) sleep(0.02) ######################################################################## def run(self): try: self.euler_signal = libmetawear.mbl_mw_sensor_fusion_get_data_signal(self.board, SensorFusionData.EULER_ANGLE) libmetawear.mbl_mw_datasignal_subscribe(self.euler_signal, None, self.euler_callback) libmetawear.mbl_mw_sensor_fusion_enable_data(self.board, SensorFusionData.EULER_ANGLE) libmetawear.mbl_mw_sensor_fusion_set_mode(self.board, SensorFusionMode.NDOF) libmetawear.mbl_mw_sensor_fusion_write_config(self.board) libmetawear.mbl_mw_sensor_fusion_start(self.board) self.e.wait() input("") except KeyboardInterrupt as e: print (e) self.close() sys.exit()
class MetaWearClient(object): """A MetaWear communication client. This client bridges the gap between the `MetaWear C++ API <https://github.com/mbientlab/Metawear-CppAPI>`_ and a GATT communication package in Python. It provides Pythonic interface to using the MetaWear boards, allowing for rapid development and testing. :param str address: A Bluetooth MAC address to a MetaWear board. :param str device: Specifying which Bluetooth device to use. Defaults to ``hci0`` on Linux. Not available on Windows. :param bool connect: If client should connect automatically, or wait for explicit :py:meth:`~MetaWearClient.connect` call. Default is ``True``. :param bool debug: If printout of all sent and received data should be done. """ def __init__(self, address, device='hci0', connect=True, debug=False): """Constructor.""" self._address = address self._debug = debug if self._debug: add_stream_logger() log.info("Creating MetaWearClient for {0}...".format(address)) self.mw = MetaWear(self._address, hci_mac=device) log.debug("Client started for BLE device {0}...".format(self._address)) self.accelerometer = None #self.gpio = None self.gyroscope = None self.magnetometer = None self.barometer = None self.ambient_light = None self.switch = None self.settings = None self.temperature = None self.haptic = None self.led = None self.sensorfusion = None if connect: self.connect() @property def board(self): return self.mw.board @property def firmware_version(self): return self.mw.info['firmware'] @property def hardware_version(self): return self.mw.info['hardware'] @property def manufacturer(self): return self.mw.info['manufacturer'] @property def serial(self): return self.mw.info['serial'] @property def model(self): return self.mw.info['model'] def __str__(self): return "MetaWearClient, {0}: {1}".format( self._address, self.mw.info) def __repr__(self): return "<MetaWearClient, {0}>".format(self._address) def connect(self): """Connect this client to the MetaWear device.""" self.mw.connect() self._initialize_modules() def disconnect(self): """Disconnects this client from the MetaWear device.""" self.mw.disconnect() def _initialize_modules(self): #self.gpio = modules.GpioModule( # self.board, # libmetawear.mbl_mw_metawearboard_lookup_module( # self.board, modules.Modules.MBL_MW_MODULE_GPIO)) self.accelerometer = modules.AccelerometerModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_ACCELEROMETER)) self.gyroscope = modules.GyroscopeModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_GYRO)) self.magnetometer = modules.MagnetometerModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_MAGNETOMETER)) self.barometer = modules.BarometerModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_BAROMETER)) self.ambient_light = modules.AmbientLightModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_AMBIENT_LIGHT)) self.switch = modules.SwitchModule(self.board) self.settings = modules.SettingsModule(self.board) self.temperature = modules.TemperatureModule(self.board) self.haptic = modules.HapticModule(self.board) self.led = modules.LEDModule(self.board) self.sensorfusion = modules.SensorFusionModule( self.board, libmetawear.mbl_mw_metawearboard_lookup_module( self.board, modules.Modules.MBL_MW_MODULE_SENSOR_FUSION))
class sens1: ## INSTANTIATE THE CLASS ## def __init__(self, **kwargs): print("Go Sensor Class!!") ## INITIALISE THE DEVICE CONNECTION ## def DevConnect(self, device): self.device = MetaWear(device) self.board = self.device.board #self.sensordatastr = "" # Don't seem to need this ? ? print("Connected to Sensor") self.euler_signal = None try: self.device.connect() # Attempt connection except: print("FAILED TO CONNECT...") ## Do Nothing Here - For other Class ## def startup(self): print("For Posterity...") ## CONTINUOUS RUN ## def DevRun(self): try: ## Get data and print to console ## self.euler_signal = libmetawear.mbl_mw_sensor_fusion_get_data_signal( self.board, SensorFusionData.EULER_ANGLE) self.euler_callback = FnVoid_VoidP_DataP( lambda context, data: print("epoch: %s, euler %s\n" % ( data.contents.epoch, parse_value(data)))) ## Required for data extraction ## libmetawear.mbl_mw_datasignal_subscribe(self.euler_signal, None, self.euler_callback) libmetawear.mbl_mw_sensor_fusion_enable_data( self.board, SensorFusionData.EULER_ANGLE) libmetawear.mbl_mw_sensor_fusion_set_mode(self.board, SensorFusionMode.NDOF) libmetawear.mbl_mw_sensor_fusion_write_config(self.board) libmetawear.mbl_mw_sensor_fusion_start(self.board) #input('') # Don't seem to need this ? ? except OSError as err: print("OS ERROR {}".format(err)) self.DevClose() print("Device closed properly...") sys.exit() except ValueError: print("Error with variable...") self.DevClose() print("Device closed properly...") sys.exit() except: print("Unexpected Error:", sys.exc_info()[0]) self.DevClose() print("Device closed properly...") sys.exit() ## CLOSE THE CONNECTION PROPERLY ## def DevClose(self): libmetawear.mbl_mw_sensor_fusion_stop(self.board) libmetawear.mbl_mw_sensor_fusion_clear_enabled_mask(self.board) libmetawear.mbl_mw_datasignal_unsubscribe(self.euler_signal) self.device.disconnect() sleep(1)
class sens1: filename = 'log1.csv' # Log file - remove later ## INSTANTIATE THE CLASS ## def __init__(self, **kwargs): self.cnt = 0 print("Go Sensor Class!!") ## INITIALISE THE DEVICE CONNECTION ## def DevConnect(self, device): self.device = MetaWear(device) self.board = self.device.board #self.sensordatastr = "" # Don't seem to need this ? ? self.euler_signal = None # only needed in 'close()' print("Connected to sensor 1") try: self.device.connect() except: print("FAILED TO CONNECT...") ## SETUP VARIOUS VARIABLES ## def startup(self): try: self.sensordatastr = "" self.EulerAngels = None self.euler_signal = None #self.checkLogFiles(self.filename) # create/check csv backup file ## ERROR HERE - REMOVED ## #self.euler_callback = FnVoid_VoidP_DataP(self.data_handler) ## Create Data Dictionary ## self.sensorData = { "epoch": 0, "heading": 0, "pitch": 0, "roll": 0, "yaw": 0, "logs": 0 } # removed 'filename' except OSError as err: print("OS ERROR {}".format(err)) self.DevClose() print("Device closed properly...") sys.exit() except ValueError: print("Error with variable...") self.DevClose() print("Device closed properly...") sys.exit() except: print("Unexpected Error:", sys.exc_info()[0]) self.DevClose() print("Device closed properly...") sys.exit() ## CONTINUOUS RUN - Threaded? ## def DevRun(self): try: ## Retrieve Sensor Data? ## self.euler_signal = libmetawear.mbl_mw_sensor_fusion_get_data_signal( self.board, SensorFusionData.EULER_ANGLE) ## View Data Directly - Removed ## #self.euler_callback = FnVoid_VoidP_DataP(lambda context,data:print("epoch: %s, euler %s\n" % (data.contents.epoch, parse_value(data)))) ## From initi function ## self.euler_callback = FnVoid_VoidP_DataP(self.data_handler) ## All required for Data Extraction? ## libmetawear.mbl_mw_datasignal_subscribe(self.euler_signal, None, self.euler_callback) libmetawear.mbl_mw_sensor_fusion_enable_data( self.board, SensorFusionData.EULER_ANGLE) libmetawear.mbl_mw_sensor_fusion_set_mode(self.board, SensorFusionMode.NDOF) libmetawear.mbl_mw_sensor_fusion_write_config(self.board) libmetawear.mbl_mw_sensor_fusion_start(self.board) #self.e.wait() # what is this for ? ? - removed #input('') # what is this for ? ? - Does nothing ## Catch ANY errors ## except OSError as err: print("OS ERROR {}".format(err)) self.DevClose() print("Device closed properly...") sys.exit() except ValueError: print("Error with variable...") self.DevClose() print("Device closed properly...") sys.exit() except: print("Unexpected Error:", sys.exc_info()[0]) self.DevClose() print("Device closed properly...") sys.exit() ## CLOSE THE CONNECTION PROPERLY ## def DevClose(self): libmetawear.mbl_mw_sensor_fusion_stop(self.board) libmetawear.mbl_mw_sensor_fusion_clear_enabled_mask(self.board) libmetawear.mbl_mw_datasignal_unsubscribe(self.euler_signal) self.device.disconnect() time.sleep(1) def data_handler(self, content, data): ## Extract data values? ## EulerAngels = parse_value(data) #print (EulerAngels) # REMOVE pi = pointer(EulerAngels) #self.sensordatastr = str(data.contents.epoch)+","+ str(("%.4f" %pi.contents.heading)) +","+ str(("%.4f" %pi.contents.pitch))+","+ str(("%.4f" %pi.contents.roll))+","+str(("%.4f" %pi.contents.yaw)) ## Backup 'data' to csv file ## #print (sensordatastr) # REMOVE #self.logData(self.filename,self.sensordatastr) #sleep(0.05) ## Update Dictionary data fields ## self.sensorData["epoch"] = (data.contents.epoch) self.sensorData["heading"] = ("%.4f" % pi.contents.heading) self.sensorData["pitch"] = ("%.4f" % pi.contents.pitch) self.sensorData["roll"] = ("%.4f" % pi.contents.roll) self.sensorData["yaw"] = ("%.4f" % pi.contents.yaw) self.sensorData["logs"] = self.cnt self.cnt = self.cnt + 1 print(self.sensorData) # View Dictionary #sleep(0.02) # REMOVED ## REMOVE - CHECK/CREATE CSV FILE ## def checkLogFiles(self, filename): ## Does CSV file exist ## res = os.path.exists(filename) ## Create if doesn't exist ## if res == False: print("no file found, creating file") f = open(filename, "w+") f.close() print("file created") with open(filename, mode='w+') as csv_file: fieldnames = ['epoch', 'pitch', 'roll', 'yaw'] writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=',') writer.writeheader() ## File already existed ## else: print("File found in the path")