Exemple #1
0
Fichier : Mip.py Projet : mi0u/Mip
 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)
Exemple #2
0
Fichier : Mip.py Projet : mi0u/Mip
 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')
Exemple #3
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 #4
0
        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
Exemple #5
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 #6
0
 def stop(self):
     console.set_idle_timer_disabled(False)
     if self.tindeq.ready:
         self.tindeq.end_logging_weight()
         self.tindeq.sleep()
     cb.reset()
Exemple #7
0
 def will_close(self):
     self.mesh.die()
     cb.reset()
Exemple #8
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 #9
0
	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 
Exemple #11
0
 def close(self):
     cb.reset()
Exemple #12
0
 def ble_disconnect(self, sender):
     cb.reset()
Exemple #13
0
        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.
Exemple #14
0
 def will_close(self):
   cb.reset()
Exemple #15
0
Fichier : Mip.py Projet : mi0u/Mip
 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)
Exemple #16
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 #17
0
 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