2 Commits

6 changed files with 27 additions and 38 deletions
-7
View File
@@ -5,13 +5,6 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.3.1] - 2026-05-20
### Hot fix
- Improved update logging
- Improved update settings
## [0.3.0] - 2026-05-19
### Added
+3 -3
View File
@@ -1,6 +1,6 @@
# Thor Watcher
**Version:** 0.3.1
**Version:** 0.3.0
Micromate (Series 4) watcher agent for Terra-View fleet management. Runs as a Windows system tray application, scans THORDATA for Micromate unit activity, sends heartbeat data to Terra-View, and (optionally) forwards `.IDFH`/`.IDFW` event files to a seismo-relay SFM server.
@@ -29,7 +29,7 @@ build.bat
```
Produces:
- `dist\thor-watcher-0.3.1.exe` — upload to Gitea release
- `dist\thor-watcher-0.3.0.exe` — upload to Gitea release
- `dist\thor-watcher.exe` — use with Inno Setup
Then run Inno Setup Compiler on `installer.iss` to produce `thor-watcher-setup.exe`.
@@ -121,7 +121,7 @@ Posted to `api_url` on each API interval:
{
"source_id": "THOR-PC",
"source_type": "series4_watcher",
"version": "0.3.1",
"version": "0.3.0",
"generated_at": "2026-03-20T14:30:00Z",
"log_tail": ["...last 25 log lines..."],
"units": [
+1 -1
View File
@@ -3,7 +3,7 @@
[Setup]
AppName=Thor Watcher
AppVersion=0.3.1
AppVersion=0.2.0
AppPublisher=Terra-Mechanics Inc.
DefaultDirName={pf}\ThorWatcher
DefaultGroupName=Thor Watcher
+11 -3
View File
@@ -1,5 +1,5 @@
"""
Thor Watcher — Series 4 Ingest Agent v0.3.1
Thor Watcher — Series 4 Ingest Agent v0.3.0
Micromate (Series 4) ingest agent for Terra-View.
@@ -29,7 +29,7 @@ import event_forwarder
# ── Version ───────────────────────────────────────────────────────────────────
VERSION = "0.3.1"
VERSION = "0.3.0"
# ── Config ────────────────────────────────────────────────────────────────────
@@ -168,8 +168,16 @@ def scan_thordata(root: str) -> Dict[str, Dict[str, Any]]:
parsed = parse_mlg_filename(fname)
if not parsed:
continue
unit_id, ts = parsed
unit_id, _ = parsed # keep unit_id only
full_path = os.path.join(unit_path, fname)
try:
mtime = os.path.getmtime(full_path)
ts = datetime.fromtimestamp(mtime)
except Exception:
continue
current = unit_map.get(unit_id)
if current is None or ts > current["last_call"]:
unit_map[unit_id] = {
+6 -15
View File
@@ -1,5 +1,5 @@
"""
Thor Watcher — Settings Dialog v0.3.1
Thor Watcher — Settings Dialog v0.3.0
Provides a Tkinter settings dialog that doubles as a first-run wizard.
@@ -487,21 +487,12 @@ class SettingsDialog:
def _build_tab_updates(self, nb):
f = self._tab_frame(nb, "Updates")
# Current version display
tk.Label(f, text="Current Version", anchor="w").grid(
row=0, column=0, sticky="w", padx=(8, 4), pady=(8, 2)
)
tk.Label(
f, text="v{}".format(watcher.VERSION), anchor="w",
font=("TkDefaultFont", 9, "bold"),
).grid(row=0, column=1, sticky="w", padx=(0, 8), pady=(8, 2))
tk.Label(f, text="Auto-Update Source", anchor="w").grid(
row=1, column=0, sticky="w", padx=(8, 4), pady=(8, 2)
row=0, column=0, sticky="w", padx=(8, 4), pady=(8, 2)
)
radio_frame = tk.Frame(f)
radio_frame.grid(row=1, column=1, sticky="w", padx=(0, 8), pady=(8, 2))
radio_frame.grid(row=0, column=1, sticky="w", padx=(0, 8), pady=(8, 2))
ttk.Radiobutton(
radio_frame, text="Gitea (default)",
@@ -522,10 +513,10 @@ class SettingsDialog:
).grid(row=0, column=2, sticky="w")
tk.Label(f, text="Update Server URL", anchor="w").grid(
row=2, column=0, sticky="w", padx=(8, 4), pady=4
row=1, column=0, sticky="w", padx=(8, 4), pady=4
)
self._update_url_entry = ttk.Entry(f, textvariable=self.var_update_url, width=42)
self._update_url_entry.grid(row=2, column=1, sticky="ew", padx=(0, 8), pady=4)
self._update_url_entry.grid(row=1, column=1, sticky="ew", padx=(0, 8), pady=4)
tk.Label(
f,
@@ -537,7 +528,7 @@ class SettingsDialog:
"still works when disabled."
),
justify="left", fg="#555555", wraplength=380,
).grid(row=3, column=0, columnspan=2, sticky="w", padx=(8, 8), pady=(4, 8))
).grid(row=2, column=0, columnspan=2, sticky="w", padx=(8, 8), pady=(4, 8))
self._on_update_source_change()
+6 -9
View File
@@ -1,5 +1,5 @@
"""
Thor Watcher System Tray Launcher v0.3.1
Thor Watcher System Tray Launcher v0.3.0
Requires: pystray, Pillow, tkinter (stdlib)
Run with: pythonw thor_tray.py (no console window)
@@ -126,17 +126,17 @@ def check_for_update():
cfg = _read_config()
update_source = str(cfg.get("update_source", "gitea")).strip().lower()
update_url = str(cfg.get("update_url", "")).strip()
except Exception as exc:
_update_log("config read failed in check_for_update: {} — defaulting to gitea".format(exc))
except Exception:
update_source = "gitea"
update_url = ""
if update_source == "disabled":
return None, None
_update_log("Checking for update (source={}, version={})".format(
update_source, _CURRENT_VERSION
))
if update_source == "disabled":
return None, None
if update_source == "url":
return _check_for_update_url(update_url)
else:
@@ -472,11 +472,8 @@ class WatcherTray:
def _icon_updater(self):
"""Periodically refresh the tray icon and check for updates."""
_update_log("Updater thread started (version={}, first check in ~30s)".format(_CURRENT_VERSION))
last_status = None
# Initial first-check fires at counter==3 (~30s) so we get a confirmation
# line in the log soon after startup; subsequent checks every ~5 min.
update_check_counter = 27
update_check_counter = 0 # check every ~5 min (30 × 10s ticks)
while not self.stop_event.is_set():
icon_status = self._tray_status()