9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1
|
# -*- coding: utf-8 -*- |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2
|
|
10439
|
3
|
# Copyright (c) 2023 - 2024 Detlev Offenbach <detlev@die-offenbachs.de> |
9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4
|
# |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7
|
Module implementing the device interface class for STM32 STLink boards. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10
|
import os |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12
|
from PyQt6.QtCore import QStandardPaths, QUrl, pyqtSlot |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13
|
from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14
|
from PyQt6.QtWidgets import QMenu |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16
|
from eric7 import Globals, Preferences |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17
|
from eric7.EricWidgets import EricFileDialog, EricMessageBox |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18
|
from eric7.EricWidgets.EricApplication import ericApp |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19
|
from eric7.EricWidgets.EricProcessDialog import EricProcessDialog |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20
|
from eric7.SystemUtilities import FileSystemUtilities |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22
|
from ..MicroPythonWidget import HAS_QTCHART |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
from . import FirmwareGithubUrls |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
from .DeviceBase import BaseDevice |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27
|
class STLinkDevice(BaseDevice): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
Class implementing the device for PyBoard boards. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
DeviceVolumeName = "NODE_" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34
|
def __init__(self, microPythonWidget, deviceType, parent=None): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36
|
Constructor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38
|
@param microPythonWidget reference to the main MicroPython widget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39
|
@type MicroPythonWidget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40
|
@param deviceType device type assigned to this device interface |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
@param parent reference to the parent object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43
|
@type QObject |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45
|
super().__init__(microPythonWidget, deviceType, parent) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47
|
self._submitMode = "paste" # use 'paste' mode |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
self.__workspace = self.__findWorkspace() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
self.__createSTLinkMenu() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53
|
def setButtons(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55
|
Public method to enable the supported action buttons. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
super().setButtons() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
self.microPython.setActionButtons( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
run=True, repl=True, files=True, chart=HAS_QTCHART |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63
|
def forceInterrupt(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65
|
Public method to determine the need for an interrupt when opening the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66
|
serial connection. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68
|
@return flag indicating an interrupt is needed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
def deviceName(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75
|
Public method to get the name of the device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77
|
@return name of the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80
|
return self.tr("STM32 STLink") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82
|
def canStartRepl(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84
|
Public method to determine, if a REPL can be started. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86
|
@return tuple containing a flag indicating it is safe to start a REPL |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87
|
and a reason why it cannot. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88
|
@rtype tuple of (bool, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90
|
return True, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92
|
def canStartPlotter(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
Public method to determine, if a Plotter can be started. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
@return tuple containing a flag indicating it is safe to start a |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97
|
Plotter and a reason why it cannot. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98
|
@rtype tuple of (bool, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
return True, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102
|
def canRunScript(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104
|
Public method to determine, if a script can be executed. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106
|
@return tuple containing a flag indicating it is safe to start a |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107
|
Plotter and a reason why it cannot. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108
|
@rtype tuple of (bool, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110
|
return True, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112
|
def runScript(self, script): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114
|
Public method to run the given Python script. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116
|
@param script script to be executed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119
|
pythonScript = script.split("\n") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120
|
self.sendCommands(pythonScript) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122
|
def canStartFileManager(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124
|
Public method to determine, if a File Manager can be started. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126
|
@return tuple containing a flag indicating it is safe to start a |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127
|
File Manager and a reason why it cannot. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128
|
@rtype tuple of (bool, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130
|
return True, "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132
|
def supportsLocalFileAccess(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134
|
Public method to indicate file access via a local directory. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136
|
@return flag indicating file access via local directory |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139
|
return self.__deviceVolumeMounted() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141
|
def __deviceVolumeMounted(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143
|
Private method to check, if the device volume is mounted. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145
|
@return flag indicated a mounted device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148
|
if self.__workspace and not os.path.exists(self.__workspace): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149
|
self.__workspace = "" # reset |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151
|
return self.DeviceVolumeName in self.getWorkspace(silent=True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153
|
def getWorkspace(self, silent=False): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155
|
Public method to get the workspace directory. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157
|
@param silent flag indicating silent operations |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158
|
@type bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159
|
@return workspace directory used for saving files |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162
|
if self.__workspace: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163
|
# return cached entry |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164
|
return self.__workspace |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166
|
self.__workspace = self.__findWorkspace(silent=silent) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167
|
return self.__workspace |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169
|
def __findWorkspace(self, silent=False): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171
|
Private method to find the workspace directory. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173
|
@param silent flag indicating silent operations |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174
|
@type bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175
|
@return workspace directory used for saving files |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178
|
# Attempts to find the path on the filesystem that represents the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179
|
# plugged in PyBoard board. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180
|
deviceDirectories = FileSystemUtilities.findVolume( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181
|
self.DeviceVolumeName, findAll=True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184
|
if deviceDirectories: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185
|
if len(deviceDirectories) == 1: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186
|
return deviceDirectories[0] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188
|
return self.selectDeviceDirectory(deviceDirectories) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190
|
# return the default workspace and give the user a warning (unless |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191
|
# silent mode is selected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192
|
if not silent: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193
|
EricMessageBox.warning( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194
|
self.microPython, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195
|
self.tr("Workspace Directory"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196
|
self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197
|
"Python files for STLink boards can be edited in" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198
|
" place, if the device volume is locally" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199
|
" available. Such a volume was not found. In" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200
|
" place editing will not be available." |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204
|
return super().getWorkspace() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206
|
def getDocumentationUrl(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208
|
Public method to get the device documentation URL. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210
|
@return documentation URL of the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213
|
return Preferences.getMicroPython("MicroPythonDocuUrl") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215
|
def getFirmwareUrl(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217
|
Public method to get the device firmware download URL. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219
|
@return firmware download URL of the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222
|
return Preferences.getMicroPython("MicroPythonFirmwareUrl") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224
|
def __createSTLinkMenu(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226
|
Private method to create the STLink submenu. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228
|
self.__stlinkMenu = QMenu(self.tr("STLink Functions")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230
|
self.__showMpyAct = self.__stlinkMenu.addAction( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231
|
self.tr("Show MicroPython Versions"), self.__showFirmwareVersions |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233
|
self.__stlinkMenu.addSeparator() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234
|
self.__stlinkInfoAct = self.__stlinkMenu.addAction( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235
|
self.tr("Show STLink Device Information"), self.__showDeviceInfo |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237
|
self.__stlinkMenu.addSeparator() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238
|
self.__flashMpyAct = self.__stlinkMenu.addAction( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239
|
self.tr("Flash MicroPython Firmware"), self.__flashMicroPython |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241
|
self.__stlinkMenu.addSeparator() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242
|
self.__resetAct = self.__stlinkMenu.addAction( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243
|
self.tr("Reset Device"), self.__resetDevice |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246
|
def addDeviceMenuEntries(self, menu): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248
|
Public method to add device specific entries to the given menu. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250
|
@param menu reference to the context menu |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251
|
@type QMenu |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253
|
connected = self.microPython.isConnected() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254
|
linkConnected = self.microPython.isLinkConnected() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
255
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
256
|
self.__showMpyAct.setEnabled(connected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257
|
self.__stlinkInfoAct.setEnabled(not linkConnected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
258
|
self.__flashMpyAct.setEnabled(not linkConnected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259
|
self.__resetAct.setEnabled(connected) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261
|
menu.addMenu(self.__stlinkMenu) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
262
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263
|
def hasFlashMenuEntry(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
264
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
265
|
Public method to check, if the device has its own flash menu entry. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
266
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
267
|
@return flag indicating a specific flash menu entry |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
268
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
269
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
270
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
271
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
272
|
def __stlinkToolAvailable(self, toolname): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
273
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
274
|
Private method to check the availability of the given STLink tool. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
275
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
276
|
Note: supported tools are st-info and st-flash |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
277
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
278
|
@param toolname name of the tool to be checked |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
279
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
280
|
@return flag indicating the availability of the given STLink tool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
281
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
282
|
@exception ValueError raised to indicate an illegal tool name |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
283
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
284
|
if toolname not in ("st-info", "st-flash"): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
285
|
raise ValueError("Illegal tool name given.") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
286
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
287
|
preferencesKey = "StInfoPath" if toolname == "st-info" else "StFlashPath" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
288
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
289
|
available = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
290
|
program = Preferences.getMicroPython(preferencesKey) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
291
|
if not program: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
292
|
program = toolname |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
293
|
if FileSystemUtilities.isinpath(program): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
294
|
available = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
295
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
296
|
if FileSystemUtilities.isExecutable(program): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
297
|
available = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
298
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
299
|
if not available: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
300
|
msg = ( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
301
|
self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
302
|
"""The STLink information tool <b>st-info</b> cannot be found or""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
303
|
""" is not executable. Ensure it is in the search path or""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
304
|
""" configure it on the MicroPython configuration page.""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
305
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
306
|
if toolname == "st-info" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
307
|
else self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
308
|
"""The STLink firmware flashing tool <b>st-flash</b> cannot be""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
309
|
""" found or is not executable. Ensure it is in the search path""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
310
|
""" or configure it on the MicroPython configuration page.""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
311
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
312
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
313
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
314
|
self.microPython, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
315
|
self.tr("{0} not available").format(toolname), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
316
|
msg, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
317
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
318
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
319
|
return available |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
320
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
321
|
def __stflashAvailable(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
322
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
323
|
Private method to check the availability of the 'st-flash' firmware flashing |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
324
|
tool. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
325
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
326
|
@return flag indicating the availability of the 'st-flash' firmware flashing |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
327
|
tool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
328
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
329
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
330
|
return self.__stlinkToolAvailable("st-flash") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
331
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
332
|
def __stinfoAvailable(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
333
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
334
|
Private method to check the availability of the 'st-info' tool. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
335
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
336
|
@return flag indicating the availability of the 'st-info' tool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
337
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
338
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
339
|
return self.__stlinkToolAvailable("st-flash") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
340
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
341
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
342
|
def __flashMicroPython(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
343
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
344
|
Private slot to flash a MicroPython firmware. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
345
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
346
|
if self.__stflashAvailable(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
347
|
ok2continue = EricMessageBox.question( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
348
|
None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
349
|
self.tr("Flash MicroPython Firmware"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
350
|
self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
351
|
"""Ensure that only one STLink device is connected. Press OK""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
352
|
""" to continue.""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
353
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
354
|
EricMessageBox.Cancel | EricMessageBox.Ok, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
355
|
EricMessageBox.Cancel, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
356
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
357
|
if ok2continue: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
358
|
program = Preferences.getMicroPython("StFlashPath") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
359
|
if not program: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
360
|
program = "st-flash" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
361
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
362
|
downloadsPath = QStandardPaths.standardLocations( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
363
|
QStandardPaths.StandardLocation.DownloadLocation |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
364
|
)[0] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
365
|
firmware = EricFileDialog.getOpenFileName( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
366
|
self.microPython, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
367
|
self.tr("Flash MicroPython Firmware"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
368
|
downloadsPath, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
369
|
self.tr("MicroPython Firmware Files (*.hex *.bin);; All Files (*)"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
370
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
371
|
if firmware and os.path.exists(firmware): |
9972
|
372
|
args = ["--connect-under-reset"] |
9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
373
|
if os.path.splitext(firmware)[-1].lower() == ".hex": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
374
|
args.extend(["--format", "ihex", "write", firmware]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
375
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
376
|
args.extend(["write", firmware, "0x08000000"]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
377
|
dlg = EricProcessDialog( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
378
|
outputTitle=self.tr("'st-flash' Output"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
379
|
windowTitle=self.tr("Flash MicroPython Firmware"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
380
|
showInput=False, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
381
|
combinedOutput=True, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
382
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
383
|
res = dlg.startProcess(program, args) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
384
|
if res: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
385
|
dlg.exec() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
386
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
387
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
388
|
def __showDeviceInfo(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
389
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
390
|
Private slot to show some information about connected STLink devices. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
391
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
392
|
if self.__stinfoAvailable(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
393
|
program = Preferences.getMicroPython("StInfoPath") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
394
|
if not program: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
395
|
program = "st-info" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
396
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
397
|
dlg = EricProcessDialog( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
398
|
self.tr("'st-info' Output"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
399
|
self.tr("STLink Device Information"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
400
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
401
|
res = dlg.startProcess(program, ["--probe"]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
402
|
if res: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
403
|
dlg.exec() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
404
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
405
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
406
|
def __showFirmwareVersions(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
407
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
408
|
Private slot to show the firmware version of the connected device and the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
409
|
available firmware version. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
410
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
411
|
if self.microPython.isConnected(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
412
|
if self._deviceData["mpy_name"] != "micropython": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
413
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
414
|
None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
415
|
self.tr("Show MicroPython Versions"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
416
|
self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
417
|
"""The firmware of the connected device cannot be""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
418
|
""" determined or the board does not run MicroPython.""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
419
|
""" Aborting...""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
420
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
421
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
422
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
423
|
ui = ericApp().getObject("UserInterface") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
424
|
request = QNetworkRequest(QUrl(FirmwareGithubUrls["micropython"])) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
425
|
reply = ui.networkAccessManager().head(request) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
426
|
reply.finished.connect(lambda: self.__firmwareVersionResponse(reply)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
427
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
428
|
@pyqtSlot(QNetworkReply) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
429
|
def __firmwareVersionResponse(self, reply): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
430
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
431
|
Private slot handling the response of the latest version request. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
432
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
433
|
@param reply reference to the reply object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
434
|
@type QNetworkReply |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
435
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
436
|
latestUrl = reply.url().toString() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
437
|
tag = latestUrl.rsplit("/", 1)[-1] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
438
|
while tag and not tag[0].isdecimal(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
439
|
# get rid of leading non-decimal characters |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
440
|
tag = tag[1:] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
441
|
latestVersion = Globals.versionToTuple(tag) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
442
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
443
|
if self._deviceData["mpy_version"] == "unknown": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
444
|
currentVersionStr = self.tr("unknown") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
445
|
currentVersion = (0, 0, 0) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
446
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
447
|
currentVersionStr = self._deviceData["mpy_version"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
448
|
currentVersion = Globals.versionToTuple(currentVersionStr) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
449
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
450
|
msg = self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
451
|
"<h4>MicroPython Version Information</h4>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
452
|
"<table>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
453
|
"<tr><td>Installed:</td><td>{0}</td></tr>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
454
|
"<tr><td>Available:</td><td>{1}</td></tr>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
455
|
"</table>" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
456
|
).format(currentVersionStr, tag) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
457
|
if currentVersion < latestVersion: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
458
|
msg += self.tr("<p><b>Update available!</b></p>") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
459
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
460
|
EricMessageBox.information( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
461
|
None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
462
|
self.tr("MicroPython Version"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
463
|
msg, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
464
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
465
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
466
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
467
|
def __resetDevice(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
468
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
469
|
Private slot to reset the connected device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
470
|
""" |
9989
|
471
|
if self.microPython.isConnected(): |
|
472
|
self.executeCommands( |
|
473
|
"import machine\nmachine.reset()\n", mode=self._submitMode |
|
474
|
) |
9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
475
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
476
|
|
10683
779cda568acb
Changed the source code and the source code documentation to improve the indication of unused method/function arguments.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
477
|
def createDevice(microPythonWidget, deviceType, _vid, _pid, _boardName, _serialNumber): |
9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
478
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
479
|
Function to instantiate a MicroPython device object. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
480
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
481
|
@param microPythonWidget reference to the main MicroPython widget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
482
|
@type MicroPythonWidget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
483
|
@param deviceType device type assigned to this device interface |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
484
|
@type str |
10683
779cda568acb
Changed the source code and the source code documentation to improve the indication of unused method/function arguments.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
485
|
@param _vid vendor ID (unused) |
9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
486
|
@type int |
10683
779cda568acb
Changed the source code and the source code documentation to improve the indication of unused method/function arguments.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
487
|
@param _pid product ID (unused) |
9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
488
|
@type int |
10683
779cda568acb
Changed the source code and the source code documentation to improve the indication of unused method/function arguments.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
489
|
@param _boardName name of the board (unused) |
9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
490
|
@type str |
10683
779cda568acb
Changed the source code and the source code documentation to improve the indication of unused method/function arguments.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
491
|
@param _serialNumber serial number of the board (unused) |
9958
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
492
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
493
|
@return reference to the instantiated device object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
494
|
@rtype PyBoardDevice |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
495
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
496
|
return STLinkDevice(microPythonWidget, deviceType) |