mirror of
https://github.com/smittix/intercept.git
synced 2026-07-08 01:28:13 -07:00
Persist Meteor decode job state
This commit is contained in:
+55
-43
@@ -177,12 +177,14 @@ class WeatherSatDecoder:
|
||||
self._pty_master_fd: int | None = None
|
||||
self._current_satellite: str = ''
|
||||
self._current_frequency: float = 0.0
|
||||
self._current_mode: str = ''
|
||||
self._capture_start_time: float = 0
|
||||
self._device_index: int = -1
|
||||
self._capture_output_dir: Path | None = None
|
||||
self._on_complete_callback: Callable[[], None] | None = None
|
||||
self._capture_phase: str = 'idle'
|
||||
self._current_mode: str = ''
|
||||
self._capture_start_time: float = 0
|
||||
self._device_index: int = -1
|
||||
self._capture_output_dir: Path | None = None
|
||||
self._on_complete_callback: Callable[[], None] | None = None
|
||||
self._capture_phase: str = 'idle'
|
||||
self._last_error_message: str = ''
|
||||
self._last_process_returncode: int | None = None
|
||||
|
||||
# Ensure output directory exists
|
||||
self._output_dir.mkdir(parents=True, exist_ok=True)
|
||||
@@ -314,11 +316,13 @@ class WeatherSatDecoder:
|
||||
|
||||
self._current_satellite = satellite
|
||||
self._current_frequency = sat_info['frequency']
|
||||
self._current_mode = sat_info['mode']
|
||||
self._device_index = -1 # Offline decode does not claim an SDR device
|
||||
self._capture_start_time = time.time()
|
||||
self._capture_phase = 'decoding'
|
||||
self._stop_event.clear()
|
||||
self._current_mode = sat_info['mode']
|
||||
self._device_index = -1 # Offline decode does not claim an SDR device
|
||||
self._capture_start_time = time.time()
|
||||
self._capture_phase = 'decoding'
|
||||
self._last_error_message = ''
|
||||
self._last_process_returncode = None
|
||||
self._stop_event.clear()
|
||||
|
||||
try:
|
||||
self._running = True
|
||||
@@ -408,11 +412,13 @@ class WeatherSatDecoder:
|
||||
|
||||
self._current_satellite = satellite
|
||||
self._current_frequency = sat_info['frequency']
|
||||
self._current_mode = sat_info['mode']
|
||||
self._device_index = device_index
|
||||
self._capture_start_time = time.time()
|
||||
self._capture_phase = 'tuning'
|
||||
self._stop_event.clear()
|
||||
self._current_mode = sat_info['mode']
|
||||
self._device_index = device_index
|
||||
self._capture_start_time = time.time()
|
||||
self._capture_phase = 'tuning'
|
||||
self._last_error_message = ''
|
||||
self._last_process_returncode = None
|
||||
self._stop_event.clear()
|
||||
|
||||
try:
|
||||
self._running = True
|
||||
@@ -886,16 +892,17 @@ class WeatherSatDecoder:
|
||||
|
||||
if was_running:
|
||||
# Collect exit status (returncode is only set after poll/wait)
|
||||
if process and process.returncode is None:
|
||||
try:
|
||||
process.wait(timeout=5)
|
||||
except subprocess.TimeoutExpired:
|
||||
process.kill()
|
||||
process.wait()
|
||||
retcode = process.returncode if process else None
|
||||
if retcode and retcode != 0:
|
||||
self._capture_phase = 'error'
|
||||
self._emit_progress(CaptureProgress(
|
||||
if process and process.returncode is None:
|
||||
try:
|
||||
process.wait(timeout=5)
|
||||
except subprocess.TimeoutExpired:
|
||||
process.kill()
|
||||
process.wait()
|
||||
retcode = process.returncode if process else None
|
||||
self._last_process_returncode = retcode
|
||||
if retcode and retcode != 0:
|
||||
self._capture_phase = 'error'
|
||||
self._emit_progress(CaptureProgress(
|
||||
status='error',
|
||||
satellite=self._current_satellite,
|
||||
frequency=self._current_frequency,
|
||||
@@ -1138,13 +1145,15 @@ class WeatherSatDecoder:
|
||||
self._images.clear()
|
||||
return count
|
||||
|
||||
def _emit_progress(self, progress: CaptureProgress) -> None:
|
||||
"""Emit progress update to callback."""
|
||||
if self._callback:
|
||||
try:
|
||||
self._callback(progress)
|
||||
except Exception as e:
|
||||
logger.error(f"Error in progress callback: {e}")
|
||||
def _emit_progress(self, progress: CaptureProgress) -> None:
|
||||
"""Emit progress update to callback."""
|
||||
if progress.status == 'error' and progress.message:
|
||||
self._last_error_message = str(progress.message)
|
||||
if self._callback:
|
||||
try:
|
||||
self._callback(progress)
|
||||
except Exception as e:
|
||||
logger.error(f"Error in progress callback: {e}")
|
||||
|
||||
def get_status(self) -> dict:
|
||||
"""Get current decoder status."""
|
||||
@@ -1152,16 +1161,19 @@ class WeatherSatDecoder:
|
||||
if self._running and self._capture_start_time:
|
||||
elapsed = int(time.time() - self._capture_start_time)
|
||||
|
||||
return {
|
||||
'available': self._decoder is not None,
|
||||
'decoder': self._decoder,
|
||||
'running': self._running,
|
||||
'satellite': self._current_satellite,
|
||||
'frequency': self._current_frequency,
|
||||
'mode': self._current_mode,
|
||||
'elapsed_seconds': elapsed,
|
||||
'image_count': len(self._images),
|
||||
}
|
||||
return {
|
||||
'available': self._decoder is not None,
|
||||
'decoder': self._decoder,
|
||||
'running': self._running,
|
||||
'satellite': self._current_satellite,
|
||||
'frequency': self._current_frequency,
|
||||
'mode': self._current_mode,
|
||||
'capture_phase': self._capture_phase,
|
||||
'elapsed_seconds': elapsed,
|
||||
'image_count': len(self._images),
|
||||
'last_error': self._last_error_message,
|
||||
'last_returncode': self._last_process_returncode,
|
||||
}
|
||||
|
||||
|
||||
# Global decoder instance
|
||||
|
||||
Reference in New Issue
Block a user