def did_disconnect_peripheral(self, p, error): self.log.warning( 'Disconnected, error: %s' % (error,)) self.ready = False self.peripheral = None self.read_c = None self.write_c = None self.readvalue = None cb.reset() value_list = [0xffff] self._on_receive(value_list)
def disconnect(self): if self.ready: #self.ready = False self.log.info( 'Disconnecting...') time.sleep(.5) self.send([0xFC]) time.sleep(.5) cb.reset() self.ready = False self.peripheral = None self.write_c = None self.read_c = None self.readvalue = None #time.sleep(.5) self.log.info( 'Disconnected')
def discover_BLE_characteristics(lodBLE): """ discover bluetooth le peripherals and their chracteristics expects lodBLE : a list of dictionaries defining what to be searched returns bleDelegate object """ cb.set_verbose(True) cb.reset() Delg = bleDelegate(lodBLE) cb.set_central_delegate(Delg) cb.scan_for_peripherals() logger.info('Waiting for callbacks state=%s' % (cb.get_state())) while not Delg.allFound(): time.sleep(1) logger.info('found %d characteristics' % len(Delg.charFound)) cb.stop_scan() return Delg
def cmd_fn(out_msg, cmd_type, cmd_counter=0, to_counter=0, warning=False, to_max=80): global in_buf in_buf = (out_msg + '\n').encode('utf-8') while True: if self.py_ble_uart.peripheral: #ui.animate(self.blink, 0.1) try: ui.animate(self.blink, 0.1) # Sends commands to buffer if len(in_buf): if self.DEBUG: print('the length of in_buff is ', len(in_buf)) in_chars = in_buf self.py_ble_buffer.buffer(in_chars) in_buf = '' # if events then process them while len(self.event_queue ) and self.py_ble_uart.peripheral: if self.DEBUG: print('processing events') event = self.event_queue.pop() if 'post' in event: response = json.loads(event['post']) if 'cmd' in response: try: self.py_ble_uart.write( (event['post'] + '\n').encode()) # print(f"event: {event}") self.print_wrap( f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) if self.DEBUG: print('sent a post cmd') continue except: resp_string = "Connecting" break else: if self.DEBUG: print('cmd not in post') try: if self.DEBUG: print('printing event response') self.print_wrap( f"event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) if cmd_type in response['ack']: return response[ 'resp'], cmd_counter else: continue except: if self.DEBUG: print( 'could not get event response') continue else: if self.DEBUG: print('No post in event') self.print_wrap(f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) except KeyboardInterrupt as e: cb.reset() print(f"Ctrl-C Exiting: {e}") break time.sleep(0.2) ui.animate(self.blink, 0.1) cmd_counter = cmd_counter + 1 to_counter = to_counter + 1 if self.DEBUG: print('cmd_counter', cmd_counter) if warning and to_counter > to_max: self.console_box_.text = "Ooops. MetreAce needs to be restarted. \n Eject mouthpiece, close the phone app, and try again" break else: resp_string = "NOT connected" return resp_string, cmd_counter
def execute_transfer(self): global in_buf in_buf = b'' cb.reset() cb.set_central_delegate(self.py_ble_uart) cb.scan_for_peripherals() self.event_queue.append({ 'src': 'py_ble', 'ack': 'cb', 'ok': True, 'status': 'STATUS_BLE_SCANNING_FOR_PERIPHERALS' }) while not self.py_ble_uart.peripheral: if len(self.event_queue): event = self.event_queue.pop() if self.DEBUG: print(f"event: {event}") if self.py_ble_uart.peripheral: self.console_box_.alpha = 1 self.console_box_.text = ("Connecting to MetreAce instrument") #dev_icon_path = 'images/MetreAceDev.png' self.d0.alpha = 0.5 #self.instr_icon.image = ui.Image.named(dev_icon_path) self.instr_icon.alpha = 0.25 def is_dst(dt=None, tzone="UTC"): if dt is None: dt = datetime.datetime.utcnow() t_zone = timezone(tzone) timezone_aware_date = t_zone.localize(dt, is_dst=None) return timezone_aware_date.tzinfo._dst.seconds def calc_utc_offset(timeval): tz_dict = { "US/Eastern": 5, "US/Central": 6, "US/Mountain": 7, "US/Pacific": 8, "US/Alaska": 9, "US/Hawaii": 10, } try: with open('log/timezone_settings.json') as f: tzsource = json.loads(f) tz = tzsource['timezone'] except: tz = 'US/Pacific' dt1 = datetime.datetime.fromtimestamp(timeval).astimezone( timezone(tz)) dst_term_sec = is_dst(datetime.datetime(int(dt1.year), int(dt1.month), int(dt1.day)), tzone="US/Pacific") tz_factor = int(tz_dict[tz]) - dst_term_sec / 3600 return int(tz_factor) def cmd_fn(out_msg, cmd_type, cmd_counter=0, to_counter=0, warning=False, to_max=80): global in_buf in_buf = (out_msg + '\n').encode('utf-8') while True: if self.py_ble_uart.peripheral: #ui.animate(self.blink, 0.1) try: ui.animate(self.blink, 0.1) # Sends commands to buffer if len(in_buf): if self.DEBUG: print('the length of in_buff is ', len(in_buf)) in_chars = in_buf self.py_ble_buffer.buffer(in_chars) in_buf = '' # if events then process them while len(self.event_queue ) and self.py_ble_uart.peripheral: if self.DEBUG: print('processing events') event = self.event_queue.pop() if 'post' in event: response = json.loads(event['post']) if 'cmd' in response: try: self.py_ble_uart.write( (event['post'] + '\n').encode()) # print(f"event: {event}") self.print_wrap( f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) if self.DEBUG: print('sent a post cmd') continue except: resp_string = "Connecting" break else: if self.DEBUG: print('cmd not in post') try: if self.DEBUG: print('printing event response') self.print_wrap( f"event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) if cmd_type in response['ack']: return response[ 'resp'], cmd_counter else: continue except: if self.DEBUG: print( 'could not get event response') continue else: if self.DEBUG: print('No post in event') self.print_wrap(f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) except KeyboardInterrupt as e: cb.reset() print(f"Ctrl-C Exiting: {e}") break time.sleep(0.2) ui.animate(self.blink, 0.1) cmd_counter = cmd_counter + 1 to_counter = to_counter + 1 if self.DEBUG: print('cmd_counter', cmd_counter) if warning and to_counter > to_max: self.console_box_.text = "Ooops. MetreAce needs to be restarted. \n Eject mouthpiece, close the phone app, and try again" break else: resp_string = "NOT connected" return resp_string, cmd_counter time.sleep(2) if self.py_ble_uart.peripheral: print('this is what alpha d0 is ' + str(self.d0.alpha)) self.v_['ble_status'].text = 'Connected' self.console_box_.text = "Connected" self.d0.alpha = 0.5 if self.DEBUG: print( 'will be using ' + self.cwd + '/data_files/dat_files/ as current working directory for writing log files' ) global counter counter = 0 time.sleep(0.2) connect_msg_txt = json.dumps({ "cmd": "set_ble_state", "active": True }) cmd_fn(connect_msg_txt, "set_ble_state") ble_icon_path = 'images/ble_connected.png' self.ble_status_icon_.image = ui.Image.named(ble_icon_path) self.ble_status_icon_.background_color = "white" #### Set the time and timezone offset (account for DST) time.sleep(0.2) current_time = int(time.time()) out_msg00 = json.dumps({ "cmd": "set_time", "time": str(current_time) }) r00, no_counter = cmd_fn(out_msg00, "set_time") # Here is command to set timezone/DST offset_hrs = calc_utc_offset(current_time) time.sleep(2) out_msg0 = json.dumps({ "cmd": "set_time_offset", "offset": str(offset_hrs) }) r0, no_counter = cmd_fn(out_msg0, "set_time_offset") time.sleep(0.5) out_msg1 = json.dumps({"cmd": "listdir", "path": "/sd"}) try: r1, no_counter = cmd_fn(out_msg1, "listdir", warning=True, to_max=120) list_of_dirs = r1['dir'] file_sizes = r1['stat'] except: ConsoleAlert( 'Connection Error! Remove Mouthpiece, Close App, Try Again!', self.v_) ble_icon_path = 'images/ble_off.png' self.ble_status_icon_.image = ui.Image.named(ble_icon_path) self.ble_status_icon_.background_color = 'black' #out_msg2 =json.dumps({"cmd": "disconnect_ble"}) #rstring, no_counter = cmd_fn(out_msg2) return False self.console_box_.text = str(list_of_dirs) file_list = [] for file in list_of_dirs: if file.startswith('.'): continue elif file.endswith('.bin'): file_list.append(file) # HAVE A MESSAGE IF NO FILES READY TO BE UPLOADED self.ble_status_icon_.background_color = 'orange' self.v_['ble_status'].alpha = 0.5 self.console_box_.text = 'Found ' + str( len(file_list)) + ' test files on your MetreAce' time.sleep(0.5) out_msg_text = json.dumps({"cmd": "oled", "text": "Uploading..."}) cmd_fn(out_msg_text, "oled", warning=True) FLAG = False file_wrongsize = [] first_alert = True for file in list_of_dirs: timeout_counter = 1 if file.startswith('._'): if self.DEBUG: print('I SEE ' + file) out_msg_del_e = json.dumps({ "cmd": "remove", "path": "/sd/" + file }) r_del, counter = cmd_fn(out_msg_del_e, "remove", warning=True, to_max=150) elif file.endswith(('.bin', '.json')): if "device" in file: if self.DEBUG: print('I SEE ' + file) print('Skipping over ' + file) continue elif "params" in file: if self.DEBUG: print('I SEE ' + file) print('Skipping over ' + file) continue else: if self.DEBUG: print('I SEE ' + file) file_ix = list_of_dirs.index(file) file_size = file_sizes[file_ix] try: self.console_box_.text = 'Fetching ' + str( file_list.index(file) + 1) + ' out of ' + str( len(file_list) ) + ' test files from your MetreAce' except: pass if file.endswith('.bin'): counter = 1 filename, ext = file.split('.') if int(filename) < 1614306565 and first_alert: ConsoleAlert( 'Warning: May need to replace clock battery!', self.v_) first_alert = False out_msg = json.dumps({ "cmd": "ble_get_file", "path": "/sd/" + file }) in_buf = (out_msg + '\n').encode('utf-8') result_resp = [] while self.py_ble_uart.peripheral: try: if len(in_buf): in_chars = in_buf self.py_ble_buffer.buffer(in_chars) in_buf = '' if len(self.event_queue): event = self.event_queue.pop() if 'post' in event: try: response = json.loads( event['post']) if 'cmd' in response: self.py_ble_uart.write( (event['post'] + '\n').encode()) self.print_wrap( f"cmd_event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) else: self.print_wrap( f"no_cmd_event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) if response['ok']: try: result_resp.append( str(response[ 'resp'])) self.print_wrap( f"resp_event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) except: result_resp.append( str(response['ack'] )) self.print_wrap( f"ack_event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) else: if self.DEBUG: print( "RESPONSE IS NOT OKAY" ) break except: pass else: if self.DEBUG: print(str(event)) #response = json.loads(str(event)) if event['ok']: self.print_wrap( f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) pass else: FLAG = True self.print_wrap( f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) break time.sleep(0.2) ui.animate(self.blink, 0.1) counter = counter + 1 timeout_counter = timeout_counter + 1 if timeout_counter > 2000: self.console_box_.text = "One of your tests could not be processed" break except KeyboardInterrupt as e: cb.reset() print(f"Ctrl-C Exiting: {e}") break if "{'file_path': './result.bin'}" in result_resp: if self.DEBUG: print( 'ENTERING TRANSFER AND REMOVAL ATTEMPT' ) try: shutil.move( './result.bin', self.base_dir + '/data_files/uploaded_files/' + file) upload_size = os.stat( self.base_dir + '/data_files/uploaded_files/' + file)[6] if self.DEBUG: print('Sent move command') if upload_size == file_size: if self.DEBUG: print( 'upload and file size are the same size' ) out_msg_del = json.dumps({ "cmd": "remove", "path": "/sd/" + file }) r_del, counter = cmd_fn( out_msg_del, "remove", cmd_counter=counter, warning=True) if self.DEBUG: print('Sent remove command here') else: if self.DEBUG: print('FILE IS THE WRONG SIZE') size_diff = file_size - upload_size file_wrongsize.append(file) file_wrongsize.append(size_diff) out_msg_del = json.dumps({ "cmd": "remove", "path": "/sd/" + file }) r_del, counter = cmd_fn( out_msg_del, "remove", cmd_counter=counter, warning=True) if file.endswith('bin'): counter = counter + 1 break # No break and no continue makes it exit and not remove the bin file elif file.endswith('json'): pass except: if self.DEBUG: print( 'BROKE OUT OF TRANSFER AND REMOVAL ATTEMPT' ) break if FLAG: counter = 0 cb.reset() return False else: continue # Now use FileConverter fc = FileConverter(self.console_box_, file_wrongsize) cwd = os.getcwd() if self.DEBUG: print('THIS IS THE CURRENT DIR: ' + cwd) print('THIS IS SELF.BASEDIR: ' + self.base_dir) conversion_status = fc.match_files( self.base_dir + '/data_files/uploaded_files', self.base_dir + '/data_files/processed_files', self.base_dir + '/data_files/converted_files', self.base_dir + '/data_files/unpaired_files') self.console_box_.text = 'Transfer of ' + str( len(file_list)) + ' out of ' + str( len(file_list)) + ' test files complete' self.ble_status_icon_.background_color = 'white' self.v_['ble_status'].text = '' self.d0.alpha = 0 self.d1.alpha = 0 self.d2.alpha = 0 self.d3.alpha = 0 self.d4.alpha = 0 self.instr_icon.alpha = 0.1 try: out_msg_txt = json.dumps({ "cmd": "set_ble_state", "active": False }) cmd_fn(out_msg_txt, "set_ble_state", to_max=20) except: if self.DEBUG: print('could not send disconnect command') self.console_box_.text = 'Disconnecting from MetreAce Instrument' try: out_msg2 = json.dumps({"cmd": "disconnect_ble"}) rstring, no_counter = cmd_fn(out_msg2, "disconnect_ble", to_max=15) except: if self.DEBUG: print('could not send disconnect command') ConsoleAlert('Remove Mouthpiece!', self.v_) ble_icon_path = 'images/ble_off.png' self.ble_status_icon_.image = ui.Image.named(ble_icon_path) self.ble_status_icon_.background_color = 'black' return conversion_status
def stop(self): console.set_idle_timer_disabled(False) if self.tindeq.ready: self.tindeq.end_logging_weight() self.tindeq.sleep() cb.reset()
def will_close(self): self.mesh.die() cb.reset()
def did_discover_services(self, p, error): for s in p.services: if s.uuid == '180D': print 'Discovered heart rate service, discovering characteristitcs...' p.discover_characteristics(s) def did_discover_characteristics(self, s, error): print 'Did discover characteristics...' for c in s.characteristics: #print c.uuid if c.uuid == '2A37': self.peripheral.set_notify_value(c, True) def did_update_value(self, c, error): heart_rate = struct.unpack('<B', c.value[1])[0] #self.values.append(heart_rate) print 'Heart rate: %i' % heart_rate self.log.annotate('%d' % heart_rate) mngr = HeartRateManager() cb.set_verbose(True) cb.set_central_delegate(mngr) print 'Scanning for peripherals...' cb.scan_for_peripherals() try: while True: pass except KeyboardInterrupt: cb.reset()
def close(self): """ terminate ble activity """ cb.reset()
def execute_transfer(self): global in_buf in_buf = b'' cb.reset() cb.set_central_delegate(self.py_ble_uart) cb.scan_for_peripherals() self.event_queue.append({'src':'py_ble', 'ack':'cb', 'ok':True, 'status':'STATUS_BLE_SCANNING_FOR_PERIPHERALS'}) self.progress_bar_.update_progress_bar(0) while not self.py_ble_uart.peripheral: if len(self.event_queue): event = self.event_queue.pop() print(f"event: {event}") if self.py_ble_uart.peripheral: self.console_box_.text = ("Connecting to MetreAce instrument") def is_dst(dt=None, tzone="UTC"): if dt is None: dt = datetime.datetime.utcnow() t_zone = timezone(tzone) timezone_aware_date = t_zone.localize(dt, is_dst=None) return timezone_aware_date.tzinfo._dst.seconds def calc_utc_offset(timeval): tz_dict = {"US/Eastern": 5, "US/Central": 6, "US/Mountain": 7, "US/Pacific": 8, "US/Alaska": 9, "US/Hawaii": 10, } try: with open('log/timezone_settings.json') as f: tzsource = json.loads(f) tz = tzsource['timezone'] except: tz = 'US/Pacific' dt1 = datetime.datetime.fromtimestamp(timeval).astimezone(timezone(tz)) dst_term_sec = is_dst(datetime.datetime(int(dt1.year), int(dt1.month), int(dt1.day)), tzone="US/Pacific") tz_factor = int(tz_dict[tz]) - dst_term_sec/3600 print('THIS IS THE AMOUNT TO SUBTRACT from GMT interp in hours', tz_factor) return int(tz_factor) def cmd_fn(out_msg, show_progress = False, cmd_counter = 0, to_counter = 0, warning = False, to_max = 60): global in_buf #print(f"json_text: {out_msg}") in_buf = (out_msg + '\n').encode('utf-8') #print(in_buf) while True: if self.py_ble_uart.peripheral: #print('self.py_ble_uart.peripheral connection made') #print(cmd_counter) try: if show_progress: if self.progress_bar_.fillbar_.width < 0.8: self.progress_bar_.update_progress_bar(cmd_counter*.005) else: self.progress_bar_.update_progress_bar(cmd_counter*.0025) # Sends commands to buffer if len(in_buf): print('the length of in_buff is ', len(in_buf)) in_chars = in_buf self.py_ble_buffer.buffer(in_chars) in_buf = '' # if events then process them if len(self.event_queue) and self.py_ble_uart.peripheral: print('processing events') event = self.event_queue.pop() if 'post' in event: response = json.loads(event['post']) print('recieved event post') if 'cmd' in response: try: self.py_ble_uart.write((event ['post']+'\n').encode()) # print(f"event: {event}") self.print_wrap(f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) print('sent a post cmd') continue except: resp_string = "Connecting" break else: print('cmd not in post') try: print('printing event response') self.print_wrap(f"event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) return response['resp'], cmd_counter except: print('could not get event response') continue else: print('No post in event') self.print_wrap(f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) except KeyboardInterrupt as e: cb.reset() print(f"Ctrl-C Exiting: {e}") break time.sleep(0.2) cmd_counter = cmd_counter + 1 to_counter = to_counter + 1 print('cmd_counter', cmd_counter) if warning and to_counter > to_max: self.console_box_.text = "Ooops. MetreAce needs to be restarted. \n Eject mouthpiece, close the phone app, and try again" break else: resp_string = "NOT connected" return resp_string, cmd_counter time.sleep(2) if self.py_ble_uart.peripheral: self.v_['ble_status'].text = 'Connected' self.console_box_.text = "Connected" global counter counter = 0 connect_msg_txt =json.dumps({"cmd":"set_ble_state","active":True}) cmd_fn(connect_msg_txt, show_progress = False) ble_icon_path = 'images/ble_connected.png' self.ble_status_icon_.image = ui.Image.named(ble_icon_path) self.ble_status_icon_.background_color = "white" #### Set the time and timezone offset (account for DST) time.sleep(2) current_time = int(time.time()) out_msg00 =json.dumps({"cmd": "set_time","time": str(current_time)}) r00, no_counter = cmd_fn(out_msg00) # Here is command to set timezone/DST offset_hrs = calc_utc_offset(current_time) out_msg0 =json.dumps({"cmd": "set_time_offset","offset": str(offset_hrs)}) r0, no_counter = cmd_fn(out_msg0) out_msg1 =json.dumps({"cmd": "listdir","path": "/sd"}) try: r1, no_counter = cmd_fn(out_msg1, warning = True, to_max = 120) list_of_dirs = r1['dir'] file_sizes = r1['stat'] except: ConsoleAlert('Connection Error! Remove Mouthpiece, Close App, Try Again!', self.v_) ble_icon_path = 'images/ble_off.png' self.ble_status_icon_.image = ui.Image.named(ble_icon_path) self.ble_status_icon_.background_color = 'black' #out_msg2 =json.dumps({"cmd": "disconnect_ble"}) #rstring, no_counter = cmd_fn(out_msg2) return False self.console_box_.text = str(list_of_dirs) file_list = [] for file in list_of_dirs: if file.startswith('.'): continue elif file.endswith('.bin'): file_list.append(file) # HAVE A MESSAGE IF NO FILES READY TO BE UPLOADED self.ble_status_icon_.background_color = 'orange' self.console_box_.text = 'Found ' + str(len(file_list)) + ' test files on your MetreAce' time.sleep(0.5) out_msg_text =json.dumps({"cmd":"oled", "text":"Uploading..."}) cmd_fn(out_msg_text, show_progress = False, warning = True) FLAG = False file_wrongsize = [] first_alert = True for file in list_of_dirs: timeout_counter = 1 if file.startswith('._'): print('I SEE ' + file) out_msg_del_e =json.dumps({"cmd": "remove", "path": "/sd/" + file}) r_del, counter = cmd_fn(out_msg_del_e, show_progress = False, warning = True) elif file.endswith(('.bin', '.json')): if "device" in file: print('I SEE ' + file) print('Skipping over ' + file) continue elif "params" in file: print('I SEE ' + file) print('Skipping over ' + file) continue else: print('I SEE ' + file) file_ix = list_of_dirs.index(file) file_size = file_sizes[file_ix] try: self.console_box_.text = 'Fetching ' + str(file_list.index(file) + 1) + ' out of ' + str(len(file_list)) + ' test files from your MetreAce' except: pass if file.endswith('.bin'): counter = 1 filename, ext = file.split('.') if int(filename) < 1614306565 and first_alert: ConsoleAlert('Warning: May need to replace clock battery!', self.v_) first_alert = False out_msg =json.dumps({"cmd": "ble_get_file", "path": "/sd/" + file}) in_buf = (out_msg + '\n').encode('utf-8') result_resp = [] while self.py_ble_uart.peripheral: try: if self.progress_bar_.fillbar_.width < 0.8: self.progress_bar_.update_progress_bar(counter*.005) else: self.progress_bar_.update_progress_bar(counter*.0025) if len(in_buf): in_chars = in_buf self.py_ble_buffer.buffer(in_chars) in_buf = '' if len(self.event_queue): event = self.event_queue.pop() if 'post' in event: try: response = json.loads(event['post']) if 'cmd' in response: self.py_ble_uart.write((event ['post']+'\n').encode()) self.print_wrap(f"cmd_event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) else: self.print_wrap(f"no_cmd_event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) if response['ok']: try: result_resp.append(response['resp']) self.print_wrap(f"resp_event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) except: result_resp.append(response['ack']) self.print_wrap(f"ack_event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) else: break except: self.console_box_.text = "Ooops. MetreAce needs to be restarted. \n Eject mouthpiece, close the phone app, and try again" break else: print(str(event)) #response = json.loads(str(event)) if event['ok']: self.print_wrap(f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) pass else: FLAG = True self.print_wrap(f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) break time.sleep(0.2) counter = counter + 1 timeout_counter = timeout_counter + 1 if timeout_counter > 120: self.console_box_.text = "Ooops. MetreAce needs to be restarted. \n Eject mouthpiece, close the phone app, and try again" break except KeyboardInterrupt as e: cb.reset() print(f"Ctrl-C Exiting: {e}") break if len(result_resp) > 2: try: shutil.move('./result.bin', 'data_files/uploaded_files/' + file) upload_size = os.stat('data_files/uploaded_files/' + file)[6] if upload_size == file_size: out_msg_del =json.dumps({"cmd": "remove", "path": "/sd/" + file}) r_del, counter = cmd_fn(out_msg_del, show_progress = True, cmd_counter = counter, warning = True) else: size_diff = file_size - upload_size file_wrongsize.append(file) file_wrongsize.append(size_diff) if file.endswith('bin'): counter = counter + 1 self.progress_bar_.update_progress_bar(counter*.002) break except: break if FLAG: counter = 0 cb.reset() return False else: continue # Now use FileConverter fc = FileConverter(self.progress_bar_, self.console_box_, file_wrongsize) cwd = os.getcwd() conversion_status = fc.match_files(cwd + '/' + 'data_files/uploaded_files', cwd + '/' +'data_files/processed_files', cwd + '/' +'data_files/converted_files') self.console_box_.text = 'Transfer of ' + str(len(file_list)) + ' out of ' + str(len(file_list)) + ' test files complete' self.progress_bar_.update_progress_bar(1) self.ble_status_icon_.background_color = 'white' self.v_['ble_status'].text = '' out_msg_txt =json.dumps({"cmd":"set_ble_state","active":False}) cmd_fn(out_msg_txt, show_progress = False) #out_msg_tone =json.dumps({"cmd": "avr", "payload": { "cmd": "tone", "freq":"1000", "duration":"1000" }}) #cmd_fn(out_msg_tone, show_progress = False) self.console_box_.text = 'Disconnecting from MetreAce Instrument' #outmsg_s0 = json.dumps({'cmd':'avr', 'payload':{ "cmd": "sensors", "rep_ms":0, "smpl_ms":0, "n":1 }}) #cmd_fn(outmsg_s0, show_progress = False) #outmsg_t0 = json.dumps({'cmd':'avr', 'payload':{ "cmd": "thermistor", "rep_ms":0, "smpl_ms":0, "n":1 }}) #cmd_fn(outmsg_t0, show_progress = False) out_msg2 =json.dumps({"cmd": "disconnect_ble"}) rstring, no_counter = cmd_fn(out_msg2, show_progress = True) self.console_box_.text = rstring ConsoleAlert('Remove Mouthpiece!', self.v_) ble_icon_path = 'images/ble_off.png' self.ble_status_icon_.image = ui.Image.named(ble_icon_path) self.ble_status_icon_.background_color = 'black' return conversion_status
def close(self): cb.reset()
def ble_disconnect(self, sender): cb.reset()
self.profile.startup_delay = sender.text def post_shutter_delay(self, sender): self.profile.post_shutter_delay = sender.text mcmd = BLEDeviceManager() cb.set_central_delegate(mcmd) cb.scan_for_peripherals() width = min(ui.get_window_size()) # full screen if width >= 768: view = ui.load_view('gui') view.present() view['console_textview'].editable = False # split screen and slide out menu: elif width == 320 or width == 694 or width == 507: view = ui.load_view('gui_tiny') view.present() # fallback else: view = ui.load_view('gui_tiny') view.present() view.wait_modal() # block 'till view closes. cb.reset() # reset the ble connection.
def will_close(self): cb.reset()
def _on_receive(self,value_list): self.log.info('_on_receive') data={} #------ Notification events ------ if value_list[0] == 0xffff: # disconnect self.log.info( 'disconnected' ) data={'info':'disconnected'} elif value_list[0] == 0x0A: # gesture detection 1b self.log.info( 'gesture detection %s', map(hex,value_list)) data={'gesture':_Manager.gesture[value_list[1]]} elif value_list[0] == 0x0C: # radar response 1b self.log.info( 'radar response %s', map(hex,value_list)) data={'value':_Manager.value[value_list[1]]} elif value_list[0] == 0x04: # mip detection 1b self.log.info( 'mip detected %s', map(hex,value_list)) data={'id':value_list[1]} elif value_list[0] == 0x1A: # shake detection 0b self.log.info( 'shake detection %s', map(hex,value_list)) elif value_list[0] == 0x03: # ir code 3-5b self.log.info( 'ir code %s', map(hex,value_list)) data={'irCode':value_list[1:]} elif value_list[0] == 0xFA: # sleep 0b self.log.warning( 'sleep %s', map(hex,value_list)) self.ready = False cb.reset() elif value_list[0] == 0x1D: # clap times 1b self.log.info( 'clap times %s', map(hex,value_list)) data={'clap':value_list[1]} elif value_list[0] == 0x79: # mip status 2b p=_Manager._percentage(value_list[1]) self.log.info( 'mip status %s', map(hex,value_list)) data={'battery':p, 'position':_Manager.position[value_list[2]]} elif value_list[0] == 0x81: # weight update 1b self.log.info( 'weight update %s', map(hex,value_list)) deg=value_list[1] if deg>45: deg=deg-257 data={'deg':deg} #------- Requested events -------- elif value_list[0] == 0x82: #game mode self.log.info( 'gameMode %s', map(hex,value_list)) v = _Manager.mode[value_list[1]] data={'mode':v} elif value_list[0] == 0x83: #chest led self.log.info( 'chestLed %s', map(hex,value_list)) v = value_list[1:] data={'ledRGB':v} elif value_list[0] == 0x8B: #head led self.log.info( 'headLed %s', map(hex,value_list)) v = value_list[1:] data={'led1234':v} elif value_list[0] == 0x85: #odometer self.log.info( 'odometer %s', map(hex,value_list)) v = (16**6*value_list[1]+16**4*value_list[2]+16**2*value_list[3]+value_list[4])/4850.0 data={'meters':v} elif value_list[0] == 0x0D: #radar status self.log.info( 'radarStatus %s', map(hex,value_list)) v = _Manager.status[value_list[1]] data={'status':v} elif value_list[0] == 0x11: #Ir status self.log.info( 'irStatus %s', map(hex,value_list)) v = 'on' if value_list[1] else 'off' data={'status':v} elif value_list[0] == 0x13: #user data self.log.info( 'userData %s', map(hex,value_list)) v = hex(value_list[1]) data={'address':v, 'data':value_list[2]} elif value_list[0] == 0x14: #software version self.log.info( 'version %s', map(hex,value_list)) d = str(value_list[3])+'-'+str(value_list[2])+'-'+str(value_list[1]) v = value_list[4] data={'date':d, 'version':v} elif value_list[0] == 0x19: #hardware version self.log.info( 'hardware %s', map(hex,value_list)) c = value_list[1] v = value_list[2] data={'voiceChip':c, 'version':v} elif value_list[0] == 0x16: #volume self.log.info( 'volume %s', map(hex,value_list)) v = value_list[1] data={'value':v} elif value_list[0] == 0x1F: #clap status self.log.info( 'clapStatus %s', map(hex,value_list)) s = 'on' if value_list[1] else 'off' v = 16**2*value_list[2]+value_list[3] data={'status':s, 'delay':v} else: self.log.warning( 'unhandled event received %s', map(hex,value_list)) data={'data':value_list} value_list[0] = 0x00 self.on_event(_Manager.events[value_list[0]],data)
def button_press(sender): if sender.name == 'button1': mngr.send_cmd(b'%') elif sender.name == 'button2': mngr.send_cmd(b'#') class BadgeView(ui.View): def will_close(self): cb.reset() # main -------------------------------- v = ui.load_view('IoTBadge_searching') v.present() mngr = MLDPManager() cb.set_central_delegate(mngr) cb.scan_for_peripherals() while not mngr.peripheral: pass v.close() sleep(1) v = ui.load_view('IoTBadge') v.background_color = '#05001d' v.present() mngr.send_cmd(b'$') v.wait_modal() cb.reset()
def will_close(self): cb.reset()
def cmd_fn(out_msg, show_progress = False, cmd_counter = 0, to_counter = 0, warning = False, to_max = 60): global in_buf #print(f"json_text: {out_msg}") in_buf = (out_msg + '\n').encode('utf-8') #print(in_buf) while True: if self.py_ble_uart.peripheral: #print('self.py_ble_uart.peripheral connection made') #print(cmd_counter) try: if show_progress: if self.progress_bar_.fillbar_.width < 0.8: self.progress_bar_.update_progress_bar(cmd_counter*.005) else: self.progress_bar_.update_progress_bar(cmd_counter*.0025) # Sends commands to buffer if len(in_buf): print('the length of in_buff is ', len(in_buf)) in_chars = in_buf self.py_ble_buffer.buffer(in_chars) in_buf = '' # if events then process them if len(self.event_queue) and self.py_ble_uart.peripheral: print('processing events') event = self.event_queue.pop() if 'post' in event: response = json.loads(event['post']) print('recieved event post') if 'cmd' in response: try: self.py_ble_uart.write((event ['post']+'\n').encode()) # print(f"event: {event}") self.print_wrap(f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) print('sent a post cmd') continue except: resp_string = "Connecting" break else: print('cmd not in post') try: print('printing event response') self.print_wrap(f"event: {response}", self.INDENT_STR, self.CONSOLE_WIDTH) return response['resp'], cmd_counter except: print('could not get event response') continue else: print('No post in event') self.print_wrap(f"event: {event}", self.INDENT_STR, self.CONSOLE_WIDTH) except KeyboardInterrupt as e: cb.reset() print(f"Ctrl-C Exiting: {e}") break time.sleep(0.2) cmd_counter = cmd_counter + 1 to_counter = to_counter + 1 print('cmd_counter', cmd_counter) if warning and to_counter > to_max: self.console_box_.text = "Ooops. MetreAce needs to be restarted. \n Eject mouthpiece, close the phone app, and try again" break else: resp_string = "NOT connected" return resp_string, cmd_counter