예제 #1
0
파일: led.py 프로젝트: takotab/nano4run
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)
예제 #2
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()
예제 #3
0
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)
예제 #4
0
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()	
예제 #5
0
파일: client.py 프로젝트: hbldh/pymetawear
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))
예제 #6
0
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)
예제 #7
0
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")