from __future__ import print_function from mbientlab.metawear import MetaWear, libmetawear, parse_value from mbientlab.metawear.cbindings import * from time import sleep, time from threading import Event #from datetime import datetime import platform import sys #BOARD = 'E4:B7:03:21:06:34' #TEMP_SENSORS = ['0x58','0x59','0X5d'] #BOARD = 'DD:61:E7:D3:C3:2F' #TEMP_SENSORS = [] BOARD = 'F6:8F:C5:17:6C:DD' TEMP_SENSORS = ['0x51','0x52'] ACCEL_SENSOR = '0x69' TIME = 20 # in seconds TIME_MINUTE = 60 LOG_FILE_NAME_TEMP = 'logs/temp_data.txt' LOG_FILE_NAME_ACCEL = 'logs/accel_data.txt' PERIOD_SECOND = 60 TEMP_FREQUENCY = 2 TEMP_PERIOD = int((1.0/TEMP_FREQUENCY) * PERIOD_SECOND) ACCEL_FREQUENCY = 40 ACCEL_PERIOD = int((1.0/ACCEL_FREQUENCY) * PERIOD_SECOND) G = 9.80665 class State: def __init__(self, device): self.device = device self.samples = 0 self.accel_samples = 0 self.temp_timer = self._setup_temp_timer() self.accel_timer = self._setup_accel_timer() self.t0 = 0 self.callback_temp = FnVoid_VoidP_DataP(self.temp_data_handler) self.callback_accel = FnVoid_VoidP_DataP(self.accel_data_handler) self.temp_sensors_list = [] #self.engine = gv.start_matlab_engine() def temp_data_handler(self, ctx, data): """ Tell device what to do with temperature data as it's gathered Parses data, writes data to temperature log file, prints data """ t = time() - self.t0 sensor = self.temp_sensors_list[self.samples % len(self.temp_sensors_list) ] self.samples+= 1 temp_str = str(parse_value(data)[0]) + "." + str(int(parse_value(data)[1])*.00390625)[2:] temp = float(temp_str) output = str(sensor) + " " + str(t) + " " + temp_str #+ " " + str(datetime.now().strftime('%M:%S.%f')) with open(LOG_FILE_NAME_TEMP, 'a') as f: f.write(output+ "\n") f.close print(output) def accel_data_handler(self, ctx, data): """ Tell device what to do with accelorometer data as it's gathered Parses data, writes data to accelorometer log file, prints data """ self.accel_samples += 1 t = time() - self.t0 x_val = (int(parse_value(data)[0])<<8) + int(parse_value(data)[1]) y_val = (int(parse_value(data)[2])<<8) + int(parse_value(data)[3]) z_val = (int(parse_value(data)[4])<<8) + int(parse_value(data)[5]) # need to fix signed vs unsigned int if x_val >= 0x8000: x_val = -((65535 - x_val) + 1) if y_val >= 0x8000: y_val = -((65535 - y_val) + 1) if z_val >= 0x8000: z_val = -((65535 - z_val) + 1) output = "%s %s %s %s" % (t, x_val, y_val, z_val) with open(LOG_FILE_NAME_ACCEL, 'a') as f: f.write(output+ "\n") f.close print(output) def setup_temp_stream(self, device_addr): print("Setting up stream for %s" % (hex(device_addr))) self.temp_sensors_list.append(hex(device_addr)) register_addr = 0x00 value = c_uint8(0x01) libmetawear.mbl_mw_i2c_write(self.device.board, device_addr, register_addr, byref(value), 1) value = c_uint8(0x02) libmetawear.mbl_mw_i2c_write(self.device.board, device_addr, register_addr, byref(value), 1) value = c_uint8(0x03) libmetawear.mbl_mw_i2c_write(self.device.board, device_addr, register_addr, byref(value), 1) sleep(1.0) signal = libmetawear.mbl_mw_i2c_get_data_signal(self.device.board,2,0xa) libmetawear.mbl_mw_datasignal_subscribe(signal, None, self.callback_temp) self._setup_read_event(self.temp_timer, signal, device_addr) return signal def setup_accel_stream(self, device_addr): # Not done! Same as temp stream print("Setting up stream for %s" % (hex(device_addr))) PWR_MGMT_1 = 0x6B value = c_uint8(0x0) libmetawear.mbl_mw_i2c_write(self.device.board, device_addr, PWR_MGMT_1, byref(value), 1) value = c_uint8(0x00) libmetawear.mbl_mw_i2c_write(self.device.board, device_addr, 0x1c, byref(value), 1) value = c_uint8(0x00) libmetawear.mbl_mw_i2c_write(self.device.board, device_addr, 0x1b, byref(value), 1) sleep(1.0) signal = libmetawear.mbl_mw_i2c_get_data_signal(self.device.board, 6, 0xb) libmetawear.mbl_mw_datasignal_subscribe(signal, None, self.callback_accel) self._setup_read_event_accel(self.accel_timer, signal, device_addr) return signal def stop_stream(self, signal): libmetawear.mbl_mw_timer_stop(self.temp_timer) libmetawear.mbl_mw_timer_stop(self.accel_timer) libmetawear.mbl_mw_datasignal_unsubscribe(signal) libmetawear.mbl_mw_debug_disconnect(self.device.board) def _setup_temp_timer(self): e = Event() result = [None] def timer_handler(ctx, pointer): result[0] = RuntimeError("Could not create timer") if pointer == None else pointer e.set() fn_wrapper = FnVoid_VoidP_VoidP(timer_handler) libmetawear.mbl_mw_timer_create_indefinite(self.device.board, TEMP_PERIOD, 0, None, fn_wrapper) e.wait() if (result[0] is RuntimeError): raise result[0] return result[0] def _setup_accel_timer(self): e = Event() result = [None] def timer_handler(ctx, pointer): result[0] = RuntimeError("Could not create timer") if pointer == None else pointer e.set() fn_wrapper = FnVoid_VoidP_VoidP(timer_handler) libmetawear.mbl_mw_timer_create_indefinite(self.device.board, ACCEL_PERIOD, 0, None, fn_wrapper) e.wait() if (result[0] is RuntimeError): raise result[0] return result[0] def _setup_read_event(self, timer, signal, device_addr): register_addr = 0x00 e = Event() result = [None] def commands_recorded(ctx, event, status): result[0] = RuntimeError("Could not create read event") if status != Const.STATUS_OK else None e.set() fn_wrapper = FnVoid_VoidP_VoidP_Int(commands_recorded) libmetawear.mbl_mw_event_record_commands(timer) parameters= I2cReadParameters(device_addr=device_addr, register_addr= register_addr) libmetawear.mbl_mw_datasignal_read_with_parameters(signal, byref(parameters)) libmetawear.mbl_mw_event_end_record(timer, None, fn_wrapper) e.wait() if (result[0] is RuntimeError): raise result[0] def _setup_read_event_accel(self, timer, signal, device_addr): register_addr = 0x3B e = Event() result = [None] def commands_recorded(ctx, event, status): result[0] = RuntimeError("Could not create read event") if status != Const.STATUS_OK else None e.set() fn_wrapper = FnVoid_VoidP_VoidP_Int(commands_recorded) libmetawear.mbl_mw_event_record_commands(timer) parameters= I2cReadParameters(device_addr=device_addr, register_addr= register_addr) libmetawear.mbl_mw_datasignal_read_with_parameters(signal, byref(parameters)) libmetawear.mbl_mw_event_end_record(timer, None, fn_wrapper) e.wait() if (result[0] is RuntimeError): raise result[0] #clear log files with open(LOG_FILE_NAME_TEMP, 'w') as f: f.write("") f.close() with open(LOG_FILE_NAME_ACCEL, 'w') as f: f.write("") f.close() if sys.version_info[0] == 2: range = xrange for i in range(len(sys.argv)): if i == 2: TIME = float(sys.argv[i]) if i == 3: PERIOD = int(sys.argv[i]) # Bluetooth Connectivity d = MetaWear(BOARD) d.connect() print("Connected to " + d.address) s = State(d) sleep(1.0) # Config print("Configuring streams") signals = [] for sensor in TEMP_SENSORS: signals.append(s.setup_temp_stream(int(sensor, 16))) #signals.append(s.setup_accel_stream(int(ACCEL_SENSOR, 16))) # Start data stream print("\nStreaming data for %s minutes\n" % (TIME/TIME_MINUTE)) s.t0= time() libmetawear.mbl_mw_timer_start(s.temp_timer) #libmetawear.mbl_mw_timer_start(s.accel_timer) sleep(TIME) # Clean up for stream in signals: s.stop_stream(stream) sleep(1.0) print("\nDone streaming") print("\nTotal Samples Received: %d" %(s.samples)) sleep(1.0) s.device.disconnect() sleep(1.0)