Skip to content

Commit fd7a48e

Browse files
Merge pull request #7 from OpenAstroTech/bugfix/js/misc-minor-fixes
Bugfix/js/misc minor fixes
2 parents e34ef50 + ed2124b commit fd7a48e

File tree

6 files changed

+97
-36
lines changed

6 files changed

+97
-36
lines changed

OATFWGUI/external_processes.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ def start(self, extra_args: List[str], finish_signal: Optional):
3131

3232
all_args = self.base_args + extra_args
3333
self.qproc.setArguments(all_args)
34-
self.qproc.finished.connect(finish_signal)
34+
if finish_signal is not None:
35+
self.qproc.finished.connect(finish_signal)
3536
log.info(f'Starting {self.proc_name} with args: {all_args}')
3637
self.qproc.start()
3738
# Not sure why, but the process doesn't start without these
@@ -45,6 +46,7 @@ def start(self, extra_args: List[str], finish_signal: Optional):
4546
self.cleanup()
4647

4748
def cleanup(self):
49+
log.debug(f'Cleaning up external process: {self.proc_name}. Exited with {self.qproc.exitCode()}')
4850
self.stdout_text = ''
4951
self.stderr_text = ''
5052
self.qproc.deleteLater()

OATFWGUI/gui_logic.py

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import zipfile
55
import json
66
from typing import List, Optional
7-
from collections import namedtuple
87
from pathlib import Path
98

109
from PySide6.QtCore import Slot, QThreadPool, QFile, QProcess, Qt
@@ -15,10 +14,9 @@
1514
from log_utils import LogObject
1615
from qt_extensions import Worker, QBusyIndicatorGoodBad, BusyIndicatorState
1716
from external_processes import external_processes, get_install_dir
17+
from gui_state import LogicState, PioEnv, FWVersion
1818

1919
log = logging.getLogger('')
20-
FWVersion = namedtuple('FWVersion', ['nice_name', 'url'])
21-
PioEnv = namedtuple('FWVersion', ['nice_name', 'raw_name'])
2220

2321

2422
def get_pio_environments(fw_dir: Path) -> List[PioEnv]:
@@ -45,10 +43,8 @@ def get_pio_environments(fw_dir: Path) -> List[PioEnv]:
4543
}
4644
pio_environments = []
4745
for raw_env in raw_pio_envs:
48-
if raw_env in nice_name_lookup:
49-
pio_env = PioEnv(nice_name_lookup[raw_env], raw_env)
50-
else:
51-
pio_env = PioEnv(raw_env, raw_env)
46+
# Try to match a raw env to nice name, fallback to raw env
47+
pio_env = PioEnv(nice_name_lookup.get(raw_env, raw_env), raw_env)
5248
pio_environments.append(pio_env)
5349
return pio_environments
5450

@@ -77,22 +73,6 @@ def extract_fw(zipfile_name: Path) -> Path:
7773
return fw_dir
7874

7975

80-
class LogicState:
81-
release_list: Optional[List[FWVersion]] = None
82-
release_idx: Optional[int] = None
83-
fw_dir: Optional[Path] = None
84-
pio_envs: List[PioEnv] = []
85-
pio_env: Optional[str] = None
86-
config_file_path: Optional[str] = None
87-
build_success: bool = False
88-
serial_ports: List[str] = []
89-
upload_port: Optional[str] = None
90-
91-
def __setattr__(self, key, val):
92-
log.debug(f'LogicState updated: {key} {getattr(self, key)} -> {val}')
93-
super().__setattr__(key, val)
94-
95-
9676
class BusinessLogic:
9777
def __init__(self, main_app: 'MainWidget'):
9878
self.logic_state = LogicState()
@@ -184,8 +164,8 @@ def get_fw_versions_result(main_app: 'MainWidget', fw_versions_list: List[FWVers
184164

185165
def download_and_extract_fw(self) -> str:
186166
self.main_app.wSpn_download.setState(BusyIndicatorState.BUSY)
187-
fw_idx = self.main_app.wCombo_fw_version.currentIndex()
188-
zip_url = self.logic_state.release_list[fw_idx].url
167+
self.logic_state.release_idx = self.main_app.wCombo_fw_version.currentIndex()
168+
zip_url = self.logic_state.release_list[self.logic_state.release_idx].url
189169
zipfile_name = download_fw(zip_url)
190170

191171
self.logic_state.fw_dir = extract_fw(zipfile_name)
@@ -256,8 +236,8 @@ def build_fw(self):
256236
@Slot()
257237
def pio_build_finished(self):
258238
log.info(f'platformio build finished')
259-
exit_state = external_processes['platformio'].qproc.exitCode()
260-
if exit_state == QProcess.NormalExit:
239+
exit_code = external_processes['platformio'].qproc.exitCode()
240+
if exit_code == 0:
261241
log.info('Normal exit')
262242
self.main_app.wSpn_build.setState(BusyIndicatorState.GOOD)
263243
self.logic_state.build_success = True
@@ -278,14 +258,21 @@ def refresh_ports(self):
278258
@Slot()
279259
def pio_refresh_ports_finished(self):
280260
log.info(f'platformio refresh ports finished')
281-
exit_state = external_processes['platformio'].qproc.exitCode()
282-
if exit_state == QProcess.NormalExit:
261+
exit_code = external_processes['platformio'].qproc.exitCode()
262+
if exit_code == 0:
283263
log.info('Normal exit')
284264
else:
285265
log.error('Did not exit normally')
286266
stdout_data = external_processes['platformio'].stdout_text
287-
all_port_data = json.loads(stdout_data)
288-
self.logic_state.serial_ports = [port_data['port'] for port_data in all_port_data]
267+
if stdout_data:
268+
try:
269+
all_port_data = json.loads(stdout_data)
270+
except json.decoder.JSONDecodeError as e:
271+
log.error(f'JSONDecodeError: {e} with\n{repr(stdout_data)}')
272+
all_port_data = []
273+
self.logic_state.serial_ports = [port_data['port'] for port_data in all_port_data]
274+
else:
275+
self.logic_state.serial_ports = []
289276

290277
self.main_app.wCombo_serial_port.clear()
291278
for serial_port in self.logic_state.serial_ports:
@@ -325,8 +312,8 @@ def upload_fw(self):
325312
@Slot()
326313
def pio_upload_finished(self):
327314
log.info(f'platformio upload finished')
328-
exit_state = external_processes['platformio'].qproc.exitCode()
329-
if exit_state == QProcess.NormalExit:
315+
exit_code = external_processes['platformio'].qproc.exitCode()
316+
if exit_code == 0:
330317
log.info('Normal exit')
331318
self.main_app.wSpn_upload.setState(BusyIndicatorState.GOOD)
332319
else:

OATFWGUI/gui_state.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import logging
2+
from typing import NamedTuple, List, Optional
3+
from pathlib import Path
4+
5+
6+
log = logging.getLogger('')
7+
8+
9+
class FWVersion(NamedTuple):
10+
nice_name: str
11+
url: str
12+
13+
14+
class PioEnv(NamedTuple):
15+
nice_name: str
16+
raw_name: str
17+
18+
19+
class LogicState:
20+
release_list: Optional[List[FWVersion]] = None
21+
release_idx: Optional[int] = None
22+
fw_dir: Optional[Path] = None
23+
pio_envs: List[PioEnv] = []
24+
pio_env: Optional[str] = None
25+
config_file_path: Optional[str] = None
26+
build_success: bool = False
27+
serial_ports: List[str] = []
28+
upload_port: Optional[str] = None
29+
30+
def __setattr__(self, key, val):
31+
log.debug(f'LogicState updated: {key} {getattr(self, key)} -> {val}')
32+
super().__setattr__(key, val)

OATFWGUI/log_utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
import os
44
import enum
55
import html
6-
import platform
76
from pathlib import Path
87
from datetime import datetime
98
from typing import Tuple
109

1110
from PySide6.QtCore import Signal, QObject
1211

1312
from external_processes import get_install_dir
13+
from platform_check import get_platform, PlatformEnum
14+
1415

1516
class LogObject(QObject):
1617
log_signal = Signal(str)
@@ -62,7 +63,7 @@ def _colour_html(self, levelno: int) -> Tuple[str, str]:
6263
return pre, post
6364

6465
def format(self, record):
65-
if self.colour_type == LogColourTypes.terminal and 'windows' not in platform.system().lower():
66+
if self.colour_type == LogColourTypes.terminal and get_platform() != PlatformEnum.WINDOWS:
6667
# only use terminal colors when not in windows, they don't work by default
6768
pre, post = self._colour_terminal(record.levelno)
6869
log_str = pre + super().format(record) + post

OATFWGUI/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ def setup_environment():
4848
add_external_process('platformio', 'platformio', [])
4949

5050
external_processes['platformio'].start(['system', 'info'], None)
51+
external_processes['platformio'].start(['settings', 'set', 'check_platformio_interval', '9999'], None)
52+
external_processes['platformio'].start(['settings', 'set', 'check_prune_system_threshold', '0'], None)
5153

5254

5355
class MainWindow(QMainWindow):

OATFWGUI/platform_check.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import enum
2+
import platform
3+
import logging
4+
5+
platform_lookup_cache = None
6+
log = logging.getLogger('')
7+
8+
9+
class PlatformEnum(enum.Enum):
10+
LINUX = enum.auto()
11+
WINDOWS = enum.auto()
12+
UNKNOWN = enum.auto()
13+
14+
15+
def get_platform() -> PlatformEnum:
16+
global platform_lookup_cache
17+
if platform_lookup_cache is not None:
18+
# Not really for performance, but so that we can use the logger
19+
# without worrying about recursion
20+
return platform_lookup_cache
21+
22+
# No logging just yet!!
23+
platform_str = platform.system().lower()
24+
if 'windows' in platform_str:
25+
platform_lookup = PlatformEnum.WINDOWS
26+
elif 'linux' in platform_str:
27+
platform_lookup = PlatformEnum.LINUX
28+
else:
29+
platform_lookup = PlatformEnum.UNKNOWN
30+
platform_lookup_cache = platform_lookup # Cache return
31+
# We can now use logging
32+
33+
log.debug(f'platform_str={platform_str}')
34+
if platform_lookup == PlatformEnum.UNKNOWN:
35+
log.warning(f'Unknown platform {platform_str}!')
36+
37+
return platform_lookup

0 commit comments

Comments
 (0)