44import zipfile
55import json
66from typing import List , Optional
7- from collections import namedtuple
87from pathlib import Path
98
109from PySide6 .QtCore import Slot , QThreadPool , QFile , QProcess , Qt
1514from log_utils import LogObject
1615from qt_extensions import Worker , QBusyIndicatorGoodBad , BusyIndicatorState
1716from external_processes import external_processes , get_install_dir
17+ from gui_state import LogicState , PioEnv , FWVersion
1818
1919log = logging .getLogger ('' )
20- FWVersion = namedtuple ('FWVersion' , ['nice_name' , 'url' ])
21- PioEnv = namedtuple ('FWVersion' , ['nice_name' , 'raw_name' ])
2220
2321
2422def 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-
9676class 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 :
0 commit comments