Exemple #1
0
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
Exemple #2
0
    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()
Exemple #3
0
Fichier : Mip.py Projet : mi0u/Mip
 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
Exemple #4
0
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()
Exemple #5
0
		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())
Exemple #7
0
    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
Exemple #8
0
    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 = []
Exemple #9
0
    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()

Exemple #10
0
                    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()
Exemple #11
0
    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