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 __init__(self): self.background_color = 'white' self.label = ui.Label() self.label.text = "Init" self.label.text_color = "black" self.label.font = ('<system>', 64) self.label.flex = 'LRTB' self.add_subview(self.label) self.mesh = button_demo.MeshManager() self.mesh.ready = self.ready self.mesh.press = self.press self.mesh.hold = self.hold self.mesh.double_press = self.double_press cb.set_central_delegate(self.mesh) cb.scan_for_peripherals()
def connect(self): self.log.info('Connecting...') self.peripheral = None if cb.get_state() <> 5: self.log.warning('Bluetooth not enabled...') while cb.get_state() <> 5: time.sleep(1) cb.set_central_delegate(self) self.log.info( '## Scanning for peripherals... ##') with self.cv: cb.scan_for_peripherals() self.cv.wait(15) if not self.ready: self.disconnect() result = False else: result = True self.log.info(result) return result
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()
print "Services:" for s in p.services: print "-" + str(s.uuid) p.discover_characteristics(s) def did_discover_characteristics(self, s, error): print "Characteristics:" for c in s.characteristics: print "-" + str(c.uuid) def did_write_value(self, c, error): time.sleep(0.5) def did_update_value(self, c, error): time.sleep(0.5) delegate = codeBlue() for i in range(4): sys.stdout.write("\rScanning For Devices" + "." * i) time.sleep(1) cb.set_central_delegate(delegate) cb.scan_for_peripherals() try: while True: pass except KeyboardInterrupt: cb.reset() cb.stop_scan() sys.exit()
if self.peripheral is None: return packedR = struct.pack('<l', int(1)) print("Resetting Integration") self.peripheral.write_characteristic_value(self.reset, packedR, True) def __del__(self): if not self.peripheral is None: cb.cancel_peripheral_connection(self.peripheral) if __name__ == '__main__': pid = PIDController() print('Scanning for peripherals...') cb.set_central_delegate(pid) cb.scan_for_peripherals() cb.set_verbose(False) try: time.sleep(10) while True: try: setpoint = struct.unpack('<l', pid.setpoint.value)[0] print("setpoint read to be: {}".format(setpoint)) except: pass pid.setSetpoint(10000 * random()) pid.setK(100 * random()) pid.setT(1000 * random())
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 setup(self): """ Add components to screen, start searcing for tindeq """ console.set_idle_timer_disabled(True) self.start_time = -5 self.active = False # status of repeater test self._state = IdleRepeaterState # parameters for test self.countdown_time = 5 self.work_interval = 7 self.rest_interval = 3 self.num_intervals = 30 self.num_sets_remaining = 1 self.zeropoint = 0 # test y/n? self.mode = 'test' # root node to hold all graphical elements self.root = Node(parent=self) # reels for interval timer self.reels = [] for i in range(2): reel = ReelNode(10) self.root.add_child(reel) self.reels.append(reel) # start counter at work interval self.reels[0].set_value(self.work_interval) # add decimal place for second self.dot = LabelNode('.', font=('Avenir Next', digit_h)) self.root.add_child(self.dot) # and a light shaded overlay to highlight actual digits self.overlay = SpriteNode(size=(max(self.size / 3), digit_h + 10)) self.overlay.shader = Shader(shader_src) self.root.add_child(self.overlay) # add a msgbox; will show status and current load self.background_color = "red" msg_font = ('Avenir Next', 30) self.msgbox = LabelNode('scanning for device', msg_font, color='white') self.cyclebox = LabelNode('', msg_font, color='white') self.root.add_child(self.msgbox) self.root.add_child(self.cyclebox) self.plot = Plot(parent=self.root, xsize=0.35, ysize=0.2, position=(0, 0), nticks=5) # add progressor, with this scene as parent self.tindeq = TindeqProgressor(self) # start scanning for peripherals cb.set_central_delegate(self.tindeq) cb.scan_for_peripherals() self.did_change_size() # buffers for data! self.times = [] self.data = []
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()
resp = printbyte.byte_pbyte(c.value) print "[%]", resp print except Exception as e: try: print "[-] No Response" print except: pass pass responses.append(c.uuid) def did_write_value(self, c, error): try: print "[+] Payload Finished %s\n[=] Scanning Info On %s" % ( c.uuid[:6], self.peripheral.name[:6]) except: pass cb.set_central_delegate(BlueBorne()) ani_load("[*] Scanning For Devices", 5, 0.15, (6, 8)) cb.scan_for_peripherals() try: while True: time.sleep(0.1) except KeyboardInterrupt: cb.reset() cb.stop_scan()
def step_speed(self, sender): self.profile.step_speed = sender.text def vibration_duration(self, sender): self.profile.vibration_duration = sender.text def startup_delay(self, sender): 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()
for s in p.services: if s.uuid == 'FFE0': print 'Found Service ' + s.uuid print 'Looking for Characteristic FFE1' p.discover_characteristics(s) def did_discover_characteristics(self, s, error): for c in s.characteristics: if c.uuid == 'FFE1': print 'Found Characteristic ' + c.uuid print 'Writing H' self.peripheral.write_characteristic_value(c, 'H', False) cb.set_central_delegate( MyCentralManagerDelegate() ) print 'Looking for HM-10-BLE module' cb.scan_for_peripherals() # Keep the connection alive until the 'Stop' button is pressed: try: while True: pass except KeyboardInterrupt: # Disconnect everything: cb.reset() # ============================== # arduino
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