Compare commits
3 Commits
76387ad17a
..
v0.3.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 05429bdda3 | |||
| 5340332f32 | |||
| 4870f3ee87 |
@@ -5,6 +5,13 @@ 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/),
|
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).
|
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
|
## [0.3.0] - 2026-05-19
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Thor Watcher
|
# Thor Watcher
|
||||||
|
|
||||||
**Version:** 0.3.0
|
**Version:** 0.3.1
|
||||||
|
|
||||||
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.
|
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:
|
Produces:
|
||||||
- `dist\thor-watcher-0.3.0.exe` — upload to Gitea release
|
- `dist\thor-watcher-0.3.1.exe` — upload to Gitea release
|
||||||
- `dist\thor-watcher.exe` — use with Inno Setup
|
- `dist\thor-watcher.exe` — use with Inno Setup
|
||||||
|
|
||||||
Then run Inno Setup Compiler on `installer.iss` to produce `thor-watcher-setup.exe`.
|
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_id": "THOR-PC",
|
||||||
"source_type": "series4_watcher",
|
"source_type": "series4_watcher",
|
||||||
"version": "0.3.0",
|
"version": "0.3.1",
|
||||||
"generated_at": "2026-03-20T14:30:00Z",
|
"generated_at": "2026-03-20T14:30:00Z",
|
||||||
"log_tail": ["...last 25 log lines..."],
|
"log_tail": ["...last 25 log lines..."],
|
||||||
"units": [
|
"units": [
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
[Setup]
|
[Setup]
|
||||||
AppName=Thor Watcher
|
AppName=Thor Watcher
|
||||||
AppVersion=0.2.0
|
AppVersion=0.3.1
|
||||||
AppPublisher=Terra-Mechanics Inc.
|
AppPublisher=Terra-Mechanics Inc.
|
||||||
DefaultDirName={pf}\ThorWatcher
|
DefaultDirName={pf}\ThorWatcher
|
||||||
DefaultGroupName=Thor Watcher
|
DefaultGroupName=Thor Watcher
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Thor Watcher — Series 4 Ingest Agent v0.3.0
|
Thor Watcher — Series 4 Ingest Agent v0.3.1
|
||||||
|
|
||||||
Micromate (Series 4) ingest agent for Terra-View.
|
Micromate (Series 4) ingest agent for Terra-View.
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ import event_forwarder
|
|||||||
|
|
||||||
# ── Version ───────────────────────────────────────────────────────────────────
|
# ── Version ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
VERSION = "0.3.0"
|
VERSION = "0.3.1"
|
||||||
|
|
||||||
|
|
||||||
# ── Config ────────────────────────────────────────────────────────────────────
|
# ── Config ────────────────────────────────────────────────────────────────────
|
||||||
|
|||||||
+15
-6
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Thor Watcher — Settings Dialog v0.3.0
|
Thor Watcher — Settings Dialog v0.3.1
|
||||||
|
|
||||||
Provides a Tkinter settings dialog that doubles as a first-run wizard.
|
Provides a Tkinter settings dialog that doubles as a first-run wizard.
|
||||||
|
|
||||||
@@ -487,12 +487,21 @@ class SettingsDialog:
|
|||||||
def _build_tab_updates(self, nb):
|
def _build_tab_updates(self, nb):
|
||||||
f = self._tab_frame(nb, "Updates")
|
f = self._tab_frame(nb, "Updates")
|
||||||
|
|
||||||
tk.Label(f, text="Auto-Update Source", anchor="w").grid(
|
# Current version display
|
||||||
|
tk.Label(f, text="Current Version", anchor="w").grid(
|
||||||
row=0, column=0, sticky="w", padx=(8, 4), pady=(8, 2)
|
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)
|
||||||
|
)
|
||||||
|
|
||||||
radio_frame = tk.Frame(f)
|
radio_frame = tk.Frame(f)
|
||||||
radio_frame.grid(row=0, column=1, sticky="w", padx=(0, 8), pady=(8, 2))
|
radio_frame.grid(row=1, column=1, sticky="w", padx=(0, 8), pady=(8, 2))
|
||||||
|
|
||||||
ttk.Radiobutton(
|
ttk.Radiobutton(
|
||||||
radio_frame, text="Gitea (default)",
|
radio_frame, text="Gitea (default)",
|
||||||
@@ -513,10 +522,10 @@ class SettingsDialog:
|
|||||||
).grid(row=0, column=2, sticky="w")
|
).grid(row=0, column=2, sticky="w")
|
||||||
|
|
||||||
tk.Label(f, text="Update Server URL", anchor="w").grid(
|
tk.Label(f, text="Update Server URL", anchor="w").grid(
|
||||||
row=1, column=0, sticky="w", padx=(8, 4), pady=4
|
row=2, 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 = ttk.Entry(f, textvariable=self.var_update_url, width=42)
|
||||||
self._update_url_entry.grid(row=1, column=1, sticky="ew", padx=(0, 8), pady=4)
|
self._update_url_entry.grid(row=2, column=1, sticky="ew", padx=(0, 8), pady=4)
|
||||||
|
|
||||||
tk.Label(
|
tk.Label(
|
||||||
f,
|
f,
|
||||||
@@ -528,7 +537,7 @@ class SettingsDialog:
|
|||||||
"still works when disabled."
|
"still works when disabled."
|
||||||
),
|
),
|
||||||
justify="left", fg="#555555", wraplength=380,
|
justify="left", fg="#555555", wraplength=380,
|
||||||
).grid(row=2, column=0, columnspan=2, sticky="w", padx=(8, 8), pady=(4, 8))
|
).grid(row=3, column=0, columnspan=2, sticky="w", padx=(8, 8), pady=(4, 8))
|
||||||
|
|
||||||
self._on_update_source_change()
|
self._on_update_source_change()
|
||||||
|
|
||||||
|
|||||||
+9
-6
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Thor Watcher — System Tray Launcher v0.3.0
|
Thor Watcher — System Tray Launcher v0.3.1
|
||||||
Requires: pystray, Pillow, tkinter (stdlib)
|
Requires: pystray, Pillow, tkinter (stdlib)
|
||||||
|
|
||||||
Run with: pythonw thor_tray.py (no console window)
|
Run with: pythonw thor_tray.py (no console window)
|
||||||
@@ -126,17 +126,17 @@ def check_for_update():
|
|||||||
cfg = _read_config()
|
cfg = _read_config()
|
||||||
update_source = str(cfg.get("update_source", "gitea")).strip().lower()
|
update_source = str(cfg.get("update_source", "gitea")).strip().lower()
|
||||||
update_url = str(cfg.get("update_url", "")).strip()
|
update_url = str(cfg.get("update_url", "")).strip()
|
||||||
except Exception:
|
except Exception as exc:
|
||||||
|
_update_log("config read failed in check_for_update: {} — defaulting to gitea".format(exc))
|
||||||
update_source = "gitea"
|
update_source = "gitea"
|
||||||
update_url = ""
|
update_url = ""
|
||||||
|
|
||||||
if update_source == "disabled":
|
|
||||||
return None, None
|
|
||||||
|
|
||||||
_update_log("Checking for update (source={}, version={})".format(
|
_update_log("Checking for update (source={}, version={})".format(
|
||||||
update_source, _CURRENT_VERSION
|
update_source, _CURRENT_VERSION
|
||||||
))
|
))
|
||||||
|
|
||||||
|
if update_source == "disabled":
|
||||||
|
return None, None
|
||||||
if update_source == "url":
|
if update_source == "url":
|
||||||
return _check_for_update_url(update_url)
|
return _check_for_update_url(update_url)
|
||||||
else:
|
else:
|
||||||
@@ -472,8 +472,11 @@ class WatcherTray:
|
|||||||
|
|
||||||
def _icon_updater(self):
|
def _icon_updater(self):
|
||||||
"""Periodically refresh the tray icon and check for updates."""
|
"""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
|
last_status = None
|
||||||
update_check_counter = 0 # check every ~5 min (30 × 10s ticks)
|
# 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
|
||||||
|
|
||||||
while not self.stop_event.is_set():
|
while not self.stop_event.is_set():
|
||||||
icon_status = self._tray_status()
|
icon_status = self._tray_status()
|
||||||
|
|||||||
Reference in New Issue
Block a user