--- a/src/eric7/MicroPython/Devices/DeviceBase.py Fri Mar 03 17:49:36 2023 +0100 +++ b/src/eric7/MicroPython/Devices/DeviceBase.py Fri Mar 03 19:03:33 2023 +0100 @@ -664,7 +664,9 @@ """.format( name, recursive, force ) - out, err = self._interface.execute(command, mode=self._submitMode) + out, err = self._interface.execute( + command, mode=self._submitMode, timeout=20000 + ) if err: raise OSError(self._shortError(err)) return ast.literal_eval(out.decode("utf-8")) @@ -913,49 +915,62 @@ @exception OSError raised to indicate an issue with the device """ command = """ -res = {} +def get_device_data(): + res = {} -import os as __os_ -uname = __os_.uname() -res['sysname'] = uname.sysname -res['nodename'] = uname.nodename -res['release'] = uname.release -res['version'] = uname.version -res['machine'] = uname.machine + import os + uname = os.uname() + res['sysname'] = uname.sysname + res['nodename'] = uname.nodename + res['release'] = uname.release + res['version'] = uname.version + res['machine'] = uname.machine -import sys as __sys_ -res['py_platform'] = __sys_.platform -res['py_version'] = __sys_.version + import sys + res['py_platform'] = sys.platform + res['py_version'] = sys.version -try: - res['mpy_name'] = __sys_.implementation.name -except AttributeError: - res['mpy_name'] = 'unknown' + try: + res['mpy_name'] = sys.implementation.name + except AttributeError: + res['mpy_name'] = 'unknown' -try: - res['mpy_version'] = '.'.join((str(i) for i in __sys_.implementation.version)) -except AttributeError: - res['mpy_version'] = 'unknown' + try: + res['mpy_version'] = '.'.join((str(i) for i in sys.implementation.version)) + except AttributeError: + res['mpy_version'] = 'unknown' -try: - import pimoroni as __pimoroni_ - res['mpy_variant'] = 'Pimoroni Pico' try: - import version as __version_ - res['mpy_variant_info'] = __version_.BUILD - res['mpy_variant_version'] = __version_.BUILD.split('-')[2][1:] - del __version_ + import pimoroni + res['mpy_variant'] = 'Pimoroni Pico' + try: + import version + res['mpy_variant_info'] = version.BUILD + res['mpy_variant_version'] = version.BUILD.split('-')[2][1:] + except ImportError: + res['mpy_variant_info'] = '' + res['mpy_variant_version'] = '' except ImportError: + res['mpy_variant'] = '' res['mpy_variant_info'] = '' res['mpy_variant_version'] = '' - del __pimoroni_ -except ImportError: - res['mpy_variant'] = '' - res['mpy_variant_info'] = '' - res['mpy_variant_version'] = '' -print(res) -del res, uname, __os_, __sys_ + res['mip'] = False + res['upip'] = False + try: + import mip + res['mip'] = True + except ImportError: + try: + import upip + res['upip'] = True + except ImportError: + pass + + return res + +print(get_device_data()) +del get_device_data """ out, err = self._interface.execute(command, mode=self._submitMode) if err: @@ -971,100 +986,97 @@ @exception OSError raised to indicate an issue with the device """ command = """ -res = {} +def get_board_info(): + res = {} -import gc as __gc_ -__gc_.enable() -__gc_.collect() -mem_alloc = __gc_.mem_alloc() -mem_free = __gc_.mem_free() -mem_total = mem_alloc + mem_free -res['mem_total_kb'] = mem_total / 1024.0 -res['mem_used_kb'] = mem_alloc / 1024.0 -res['mem_used_pc'] = mem_alloc / mem_total * 100.0 -res['mem_free_kb'] = mem_free / 1024.0 -res['mem_free_pc'] = mem_free / mem_total * 100.0 -del __gc_, mem_alloc, mem_free, mem_total + import gc + gc.enable() + gc.collect() + mem_alloc = gc.mem_alloc() + mem_free = gc.mem_free() + mem_total = mem_alloc + mem_free + res['mem_total_kb'] = mem_total / 1024.0 + res['mem_used_kb'] = mem_alloc / 1024.0 + res['mem_used_pc'] = mem_alloc / mem_total * 100.0 + res['mem_free_kb'] = mem_free / 1024.0 + res['mem_free_pc'] = mem_free / mem_total * 100.0 + del gc, mem_alloc, mem_free, mem_total + + import os + uname = os.uname() + res['sysname'] = uname.sysname + res['nodename'] = uname.nodename + res['release'] = uname.release + res['version'] = uname.version + res['machine'] = uname.machine -import os as __os_ -uname = __os_.uname() -res['sysname'] = uname.sysname -res['nodename'] = uname.nodename -res['release'] = uname.release -res['version'] = uname.version -res['machine'] = uname.machine - -import sys as __sys_ -res['py_platform'] = __sys_.platform -res['py_version'] = __sys_.version + import sys + res['py_platform'] = sys.platform + res['py_version'] = sys.version -try: - res['mpy_name'] = __sys_.implementation.name -except AttributeError: - res['mpy_name'] = 'unknown' -try: - res['mpy_version'] = '.'.join((str(i) for i in __sys_.implementation.version)) -except AttributeError: - res['mpy_version'] = 'unknown' -try: - import pimoroni as __pimoroni_ - res['mpy_variant'] = 'Pimoroni Pico' + try: + res['mpy_name'] = sys.implementation.name + except AttributeError: + res['mpy_name'] = 'unknown' + try: + res['mpy_version'] = '.'.join((str(i) for i in sys.implementation.version)) + except AttributeError: + res['mpy_version'] = 'unknown' try: - import version as __version_ - res['mpy_variant_info'] = __version_.BUILD - res['mpy_variant_version'] = __version_.BUILD.split('-')[2][1:] - del __version_ + import pimoroni + res['mpy_variant'] = 'Pimoroni Pico' + try: + import version + res['mpy_variant_info'] = version.BUILD + res['mpy_variant_version'] = version.BUILD.split('-')[2][1:] + except ImportError: + res['mpy_variant_info'] = '' + res['mpy_variant_version'] = '' except ImportError: + res['mpy_variant'] = '' res['mpy_variant_info'] = '' res['mpy_variant_version'] = '' - del __pimoroni_ -except ImportError: - res['mpy_variant'] = '' - res['mpy_variant_info'] = '' - res['mpy_variant_version'] = '' -try: - stat_ = __os_.statvfs('/flash') - res['flash_info_available'] = True - res['flash_total_kb'] = stat_[2] * stat_[0] / 1024.0 - res['flash_free_kb'] = stat_[3] * stat_[0] / 1024.0 - res['flash_used_kb'] = res['flash_total_kb'] - res['flash_free_kb'] - res['flash_free_pc'] = res['flash_free_kb'] / res['flash_total_kb'] * 100.0 - res['flash_used_pc'] = res['flash_used_kb'] / res['flash_total_kb'] * 100.0 - del stat_ -except AttributeError: - res['flash_info_available'] = False + try: + stat_ = os.statvfs('/flash') + res['flash_info_available'] = True + res['flash_total_kb'] = stat_[2] * stat_[0] / 1024.0 + res['flash_free_kb'] = stat_[3] * stat_[0] / 1024.0 + res['flash_used_kb'] = res['flash_total_kb'] - res['flash_free_kb'] + res['flash_free_pc'] = res['flash_free_kb'] / res['flash_total_kb'] * 100.0 + res['flash_used_pc'] = res['flash_used_kb'] / res['flash_total_kb'] * 100.0 + except AttributeError: + res['flash_info_available'] = False -try: - import machine as __mc_ - if isinstance(__mc_.freq(), tuple): - res['mc_frequency_mhz'] = __mc_.freq()[0] / 1000000.0 - else: - res['mc_frequency_mhz'] = __mc_.freq() / 1000000.0 - res['mc_id'] = __mc_.unique_id() - del __mc_ -except ImportError: try: - import microcontroller as __mc_ - res['mc_frequency_mhz'] = __mc_.cpu.frequency / 1000000.0 - res['mc_temp_c'] = __mc_.cpu.temperature - res['mc_id'] = __mc_.cpu.uid - del __mc_ + import machine as mc + if isinstance(mc.freq(), tuple): + res['mc_frequency_mhz'] = mc.freq()[0] / 1000000.0 + else: + res['mc_frequency_mhz'] = mc.freq() / 1000000.0 + res['mc_id'] = mc.unique_id() except ImportError: - res['mc_frequency'] = None - res['mc_temp'] = None -if 'mc_id' in res: - res['mc_id'] = ':'.join('{0:02X}'.format(x) for x in res['mc_id']) + try: + import microcontroller as mc + res['mc_frequency_mhz'] = mc.cpu.frequency / 1000000.0 + res['mc_temp_c'] = mc.cpu.temperature + res['mc_id'] = mc.cpu.uid + except ImportError: + res['mc_frequency'] = None + res['mc_temp'] = None + if 'mc_id' in res: + res['mc_id'] = ':'.join('{0:02X}'.format(x) for x in res['mc_id']) -try: - import ulab as __ulab_ - res['ulab'] = __ulab_.__version__ - del __ulab_ -except ImportError: - res['ulab'] = None + try: + import ulab + res['ulab'] = ulab.__version__ + except ImportError: + res['ulab'] = None -print(res) -del res, __os_, __sys_, uname + return res + +print(get_board_info()) +del get_board_info """ out, err = self._interface.execute(command, mode=self._submitMode) if err: @@ -1102,25 +1114,26 @@ @exception OSError raised to indicate an issue with the device """ command = """ -try: - import rtc as __rtc_ - print( - '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}' - .format(*__rtc_.RTC().datetime[:6]) - ) - del __rtc_ -except: - import time as __time_ +def get_time(): try: - print(__time_.strftime('%Y-%m-%d %H:%M:%S', __time_.localtime())) - except AttributeError: - tm = __time_.localtime() + import rtc print( '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}' - .format(tm[0], tm[1], tm[2], tm[3], tm[4], tm[5]) + .format(*rtc.RTC().datetime[:6]) ) - del tm - del __time_ + except: + import time + try: + print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) + except AttributeError: + tm = time.localtime() + print( + '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}' + .format(tm[0], tm[1], tm[2], tm[3], tm[4], tm[5]) + ) + +get_time() +del get_time """ out, err = self._interface.execute(command, mode=self._submitMode) if err: @@ -1199,6 +1212,56 @@ raise OSError(self._shortError(err)) ################################################################## + ## Methods below implement package management related methods + ################################################################## + + def upipInstall(self, packages): + """ + Public method to install packages using 'upip'. + + @return tuple containing the command output and errors + @return tuple of (str, str) + """ + command = """ +def upip_install(): + import upip + upip.install({0}) + +upip_install() +del upip_install +""".format(repr(packages)) + return self._interface.execute(command, mode=self._submitMode, timeout=60000) + + def mipInstall(self, package, version, mpy): + """ + Public method + + @param package package name + @type str + @param version package version + @type str + @param mpy flag indicating to install as '.mpy' file + @type bool + @return tuple containing the command output and errors + @return tuple of (str, str) + """ + parameterStr = repr(package) + if version: + parameterStr += ", version={0}".format(repr(version)) + if not mpy: + parameterStr += ", mpy=False" + + command = """ +def mip_install(): + import mip + mip.install({0}) + +mip_install() +del mip_install +""".format(parameterStr) + return self._interface.execute(command, mode=self._submitMode, timeout=60000) + + ################################################################## ## Methods below implement WiFi related methods ##################################################################