src/eric7/MicroPython/Devices/CircuitPythonUpdater/CircupFunctions.py

Sun, 16 Mar 2025 12:53:12 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 16 Mar 2025 12:53:12 +0100
branch
eric7
changeset 11170
6d6199d668fb
parent 11090
f5f5f5803935
permissions
-rw-r--r--

Added the Adafruit Feather nRF52840 to the list of known NRF52 boards and changed the list of known CircuitPython boards to be more explicit with respect to Adafruit boards (i.e. VID 0x239A).

9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
11090
f5f5f5803935 Updated copyright for 2025.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11011
diff changeset
3 # Copyright (c) 2023 - 2025 Detlev Offenbach <detlev@die-offenbachs.de>
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing variants of some 'circup' functions suitable for 'eric-ide'
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 integration.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 #
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 # Copyright of the original sources:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 # Copyright (c) 2019 Adafruit Industries
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 #
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 import os
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 import shutil
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 import circup
11011
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
20 import circup.command_utils
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
21 import circup.module
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
22 import circup.shared
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 import requests
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 from PyQt6.QtCore import QCoreApplication
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 from eric7.EricWidgets import EricMessageBox
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 def find_modules(device_path, bundles_list):
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 Function to extract metadata from the connected device and available bundles and
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 returns this as a list of Module instances representing the modules on the device.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34
10900
4139f17d07ad MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
35 @param device_path path to the connected board or a disk backend object
4139f17d07ad MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
36 @type str or circup.DiskBackend
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @param bundles_list list of supported bundles
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @type list of circup.Bundle
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @return list of Module instances describing the current state of the
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 modules on the connected device
11011
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
41 @rtype list of circup.module.Module
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 """
10908
ef1b3cd9a6ca Fixed some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10900
diff changeset
43 backend = (
ef1b3cd9a6ca Fixed some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10900
diff changeset
44 circup.DiskBackend(device_path, circup.logger)
ef1b3cd9a6ca Fixed some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10900
diff changeset
45 if isinstance(device_path, str)
ef1b3cd9a6ca Fixed some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10900
diff changeset
46 else device_path
ef1b3cd9a6ca Fixed some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10900
diff changeset
47 )
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 result = []
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 try:
10900
4139f17d07ad MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
50 device_modules = backend.get_device_versions()
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 bundle_modules = circup.get_bundle_versions(bundles_list)
11011
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
52 for key, device_metadata in device_modules.items():
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
53 if key in bundle_modules:
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 path = device_metadata["path"]
11011
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
55 bundle_metadata = bundle_modules[key]
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 repo = bundle_metadata.get("__repo__")
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 bundle = bundle_metadata.get("bundle")
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 device_version = device_metadata.get("__version__")
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 bundle_version = bundle_metadata.get("__version__")
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 mpy = device_metadata["mpy"]
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 compatibility = device_metadata.get("compatibility", (None, None))
11011
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
62 module_name = (
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
63 path.split(os.sep)[-1]
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
64 if not path.endswith(os.sep)
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
65 else path[:-1].split(os.sep)[-1] + os.sep
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
66 )
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 result.append(
11011
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
68 circup.module.Module(
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
69 module_name,
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
70 backend,
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 repo,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 device_version,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 bundle_version,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 mpy,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 bundle,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 compatibility,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 )
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 )
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 except Exception as ex:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 # If it's not possible to get the device and bundle metadata, bail out
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 # with a friendly message and indication of what's gone wrong.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 EricMessageBox.critical(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 None,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 QCoreApplication.translate("CircupFunctions", "Find Modules"),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 QCoreApplication.translate(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 "CircupFunctions", """<p>There was an error: {0}</p>"""
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 ).format(str(ex)),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 )
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 return result
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 def ensure_latest_bundle(bundle):
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 Function to ensure that there's a copy of the latest library bundle available so
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 circup can check the metadata contained therein.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @param bundle reference to the target Bundle object.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 @type circup.Bundle
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 tag = bundle.latest_tag
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 do_update = False
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 if tag == bundle.current_tag:
11011
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
104 for platform in circup.shared.PLATFORMS:
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 # missing directories (new platform added on an existing install
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 # or side effect of pytest or network errors)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 do_update = do_update or not os.path.isdir(bundle.lib_dir(platform))
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 else:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 do_update = True
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 if do_update:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 try:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 circup.get_bundle(bundle, tag)
11011
f1f1c8d0255d Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10908
diff changeset
114 circup.command_utils.tags_data_save_tag(bundle.key, tag)
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 except requests.exceptions.HTTPError as ex:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 EricMessageBox.critical(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 None,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 QCoreApplication.translate("CircupFunctions", "Download Bundle"),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 QCoreApplication.translate(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 "CircupFunctions",
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 """<p>There was a problem downloading the bundle. Please try"""
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 """ again in a moment.</p><p>Error: {0}</p>""",
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 ).format(str(ex)),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 )
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 def get_circuitpython_version(device_path):
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 Function to return the version number of CircuitPython running on the board
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 connected via ``device_path``, along with the board ID.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 This is obtained from the 'boot_out.txt' file on the device, whose first line
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 will start with something like this:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 Adafruit CircuitPython 4.1.0 on 2019-08-02;
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 While the second line is:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 Board ID:raspberry_pi_pico
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 @param device_path path to the connected board.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 @type str
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 @return tuple with the version string for CircuitPython and the board ID string
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 @rtype tuple of (str, str)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 try:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 with open(os.path.join(device_path, "boot_out.txt")) as boot:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 version_line = boot.readline()
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 circuit_python = version_line.split(";")[0].split(" ")[-3]
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 board_line = boot.readline()
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 board_id = (
9748
df9520c864f2 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9740
diff changeset
152 board_line[9:].strip() if board_line.startswith("Board ID:") else ""
9740
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 )
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 except FileNotFoundError:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 EricMessageBox.critical(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 None,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 QCoreApplication.translate("CircupFunctions", "Download Bundle"),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 QCoreApplication.translate(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 "CircupFunctions",
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 """<p>Missing file <b>boot_out.txt</b> on the device: wrong path or"""
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 """ drive corrupted.</p>""",
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 ),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 )
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 circuit_python, board_id = "", ""
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 return (circuit_python, board_id)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 def install_module(device_path, device_modules, name, py, mod_names):
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 Function to find a connected device and install a given module name.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 Installation is done if it is available in the current module bundle and is not
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 already installed on the device.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 @param device_path path to the connected board
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 @type str
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 @param device_modules list of module metadata from the device
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 @type list of dict
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 @param name name of the module to be installed
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 @type str
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 @param py flag indicating if the module should be installed from source or
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 from a pre-compiled module
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 @type bool
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 @param mod_names dictionary containing metadata from modules that can be generated
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 with circup.get_bundle_versions()
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 @type dict
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 @return flag indicating success
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 @rtype bool
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 if not name:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 return False
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 elif name in mod_names:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 library_path = os.path.join(device_path, "lib")
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 if not os.path.exists(library_path): # pragma: no cover
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 os.makedirs(library_path)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 metadata = mod_names[name]
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 bundle = metadata["bundle"]
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 # Grab device modules to check if module already installed
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 if name in device_modules:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 # ignore silently
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 return False
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 if py:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 # Use Python source for module.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 source_path = metadata["path"] # Path to Python source version.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 if os.path.isdir(source_path):
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 target = os.path.basename(os.path.dirname(source_path))
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 target_path = os.path.join(library_path, target)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 # Copy the directory.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 shutil.copytree(source_path, target_path)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 return True
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 else:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 target = os.path.basename(source_path)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 target_path = os.path.join(library_path, target)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 # Copy file.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 shutil.copyfile(source_path, target_path)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 return True
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 else:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 # Use pre-compiled mpy modules.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 module_name = os.path.basename(metadata["path"]).replace(".py", ".mpy")
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 if not module_name:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 # Must be a directory based module.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 module_name = os.path.basename(os.path.dirname(metadata["path"]))
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 major_version = circup.CPY_VERSION.split(".")[0]
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 bundle_platform = "{0}mpy".format(major_version)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 bundle_path = os.path.join(bundle.lib_dir(bundle_platform), module_name)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 if os.path.isdir(bundle_path):
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 target_path = os.path.join(library_path, module_name)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 # Copy the directory.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 shutil.copytree(bundle_path, target_path)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 return True
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 elif os.path.isfile(bundle_path):
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 target = os.path.basename(bundle_path)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 target_path = os.path.join(library_path, target)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 # Copy file.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 shutil.copyfile(bundle_path, target_path)
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 return True
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 else:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 EricMessageBox.critical(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 None,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 QCoreApplication.translate("CircupFunctions", "Install Modules"),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 QCoreApplication.translate(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 "CircupFunctions",
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 """<p>The compiled version of module <b>{0}</b> cannot be"""
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 """ found.</p>""",
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 ).format(name),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 )
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 return False
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 else:
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 EricMessageBox.critical(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 None,
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 QCoreApplication.translate("CircupFunctions", "Install Modules"),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 QCoreApplication.translate(
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 "CircupFunctions", """<p>The module name <b>{0}</b> is not known.</p>"""
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 ).format(name),
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 )
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 return False
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 def patch_circup():
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 Function to patch 'circup' to use our functions adapted to the use within the
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 eric-ide.
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 """
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 circup.ensure_latest_bundle = ensure_latest_bundle
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 circup.find_modules = find_modules
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 circup.get_circuitpython_version = get_circuitpython_version
90072e10ae9b MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 circup.install_module = install_module

eric ide

mercurial