# OpsLog

<a href="https://discord.gg/FYM8yw5pT" target="_blank">
  <img src="https://img.shields.io/badge/Discord-Rejoindre%20le%20serveur-5865F2?logo=discord&logoColor=white" alt="Rejoindre notre Discord" />
</a>

Un logiciel de log radioamateur moderne et rapide pour Windows — saisie en
bandeau unique, CAT en temps réel pour **OmniRig**, **FlexRadio/SmartSDR** natif,
**Icom CI-V** natif (USB **et** à distance par internet, en remplacement de
RS-BA1) et **TCI** (SunSDR / Expert Electronics), cluster DX avec alertes de
spots, suivi des diplômes, cartes, log de concours, gestion des QSL et un
concepteur de cartes QSL. Construit avec **Wails v2** (backend Go + frontend
React/TypeScript), **100 % Go** (sans CGO) : SQLite pour la configuration,
**MySQL partagé** optionnel pour le journal afin que plusieurs opérateurs
partagent un même log. Entièrement thémable et bilingue (anglais / français).

Développé par **F4BPO**.

---

## Compilation / développement

- **Dev :** `wails dev` (rechargement à chaud Vite ; méthodes Go accessibles sur http://localhost:34115).
- **Build :** `wails build` (utiliser la version wails v2.11 du projet — `~/go/bin/wails.exe`).
- **Régénérer les bindings Go↔TS** après modification des méthodes `App`
  exportées : `wails generate module`.
- **Release :** `.vscode/release.ps1` (Ctrl+Maj+P → *Tasks: Run Task* →
  *Release OpsLog*) — incrémente la version, pousse le source sur Gitea, compile
  l'exe et le publie sur les releases Gitea + GitHub.

---

## Journalisation

- **Bandeau de saisie unique :** indicatif, RST émis/reçu, nom/QTH/locator,
  bande/mode, fréquence TX/RX (split), heure de début/fin, commentaire/note. Le
  **drapeau** de l'entité contactée est affiché en grand à côté des champs RST.
- **Recherche d'indicatif** (QRZ.com / HamQTH) avec photo, pré-remplissage du
  nom/QTH/locator et onglet QRZ.com.
- **Résolution DXCC hors ligne** depuis `cty.dat` (pays, zones CQ/ITU,
  continent), avec gestion des `/MM` `/AM` `/B` (balise) et des changements de
  district (`/8`, `/W6`), plus les dérogations DXpédition de ClubLog par dates.
- **QSO récents**, matrice **déjà contactés** (par créneau bande/mode),
  re-résolution en masse depuis cty/QRZ/ClubLog, envoi en masse vers les services
  QSL. Un **compteur de sélection** en direct, une bascule **Tout sélectionner /
  Tout désélectionner**, et une limite d'affichage qui garde le journal complet
  rapide **mais qui saute dès qu'un filtre est actif** (toutes les correspondances
  sont montrées, pas seulement la première page).
- **Constructeur de filtres QSO avancé** (champ / opérateur / valeur, ET / OU,
  préréglages enregistrés) avec **export ADIF** des lignes filtrées ou
  sélectionnées.
- **Recherche de doublons** (Outils) — regroupe les QSO par même indicatif +
  bande + mode (optionnellement même jour / minute) et permet de choisir lesquels
  supprimer.
- **Conforme ADIF 3.1.7** en import/export : dictionnaire complet des champs,
  30 colonnes promues, éditeur générique de « champs supplémentaires » et modes
  d'export standard/complet.
- **Profils :** chaque réglage est par profil ; chaque profil peut pointer son
  journal vers le fichier SQLite local ou une base **MySQL partagée**
  (multi-opérateur).

## Cartes & antenne

- **Vue principale = deux volets configurables** (par profil, Réglages → Général
  → *Vue principale*) : carte grand-cercle, carte locator (rue), la grille du
  cluster, la grille des déjà-contactés, les QSO récents, les **commandes
  FlexRadio**, la **console Icom** ou le panneau **Net control**.
- **Carte grand-cercle** avec distance & azimut trajet court/long, fonds de carte
  sélectionnables (Light / Voyager / Street / Satellite, tous sans clé et
  légendés) et le(s) **lobe(s) du faisceau d'antenne** tracés depuis l'azimut du
  rotor.
- **Compas de rotor** (azimutal équidistant, clic pour tourner) piloté par
  **PstRotator** (UDP), un **Rotator Genius 4O3A** (TCP natif) ou un **microHAM
  ARCO** contrôlé nativement — sans PstRotator — via le **réseau** ou l'**USB**
  avec son protocole Yaesu GS-232A.
- **Support Ultrabeam** (Normal / inversé 180° / bidirectionnel) : la direction
  rayonnée est en vert et le **boom mécanique** en gris, à la fois sur le compas
  et sur la carte, pour toujours savoir où pointe l'antenne.

## Cluster DX

- Plusieurs serveurs de cluster avec reconnexion auto, un maître pour les
  commandes.
- **Barre latérale de filtres** (recherche d'indicatif, masquer-déjà-contactés,
  grouper les doublons, bande / mode / statut / source) partagée entre l'onglet
  Cluster et le volet cluster de la vue principale, avec bascule affichage/masquage.
- **Statut** par spot (nouveau / nouvelle bande / nouveau créneau / contacté),
  clic pour accorder la radio, et une **bandmap** multi-bandes (bandes façon
  panadapter). En option, tous les **modes numériques comptent comme un seul**
  (style DXCC) pour le coloriage nouveau/nouveau-créneau et les badges de la
  matrice des déjà-contactés (Réglages → Général).
- Les spots **POTA** sont étiquetés avec leur référence de parc (via
  `api.pota.app`).
- **Alertes de spots :** règles sur indicatif / pays / bande /
  mode / spotter, avec notification sonore, visuelle et e-mail (Outils →
  *Gestion des alertes*).

## Contrôle CAT

Quatre backends natifs (Réglages → CAT), chacun avec reconnexion auto et une
connexion rapide non bloquante — une radio éteinte ne fige jamais l'application :

- **OmniRig** (Rig 1/2, changement à chaud) — fonctionne avec toute radio
  supportée par OmniRig.
- **FlexRadio (SmartSDR)** via l'API TCP de la radio — fréquence / mode / split
  de la slice en temps réel, découverte UDP, et **spots panadapter** (les spots
  du cluster poussés sur l'écran Flex ; un clic remplit l'indicatif et **accorde
  la radio sur la bonne fréquence ET le bon mode**).
- **Icom CI-V** — natif, via le port **USB** de la radio *ou* par internet via le
  **serveur LAN intégré** de la radio (voir *Icom à distance* ci-dessous). Ni
  RS-BA1 ni Remote Utility nécessaires.
- **TCI** (WebSocket) — SunSDR / ExpertSDR2 et tout serveur compatible TCI :
  fréquence / mode / PTT / split, plus spots panorama optionnels.

Le mode est lu depuis la radio ; le sous-mode numérique (FT4 vs FT8) est déduit
de la fréquence. Les **antennes RX/TX Flex par bande** sont configurables et
appliquées automatiquement au changement de bande.

### Onglet de commande FlexRadio (façon SmartSDR)

Affiché uniquement quand le backend CAT est une FlexRadio :

- **Émission :** puissance RF, puissance d'accord, TUNE, MOX, processeur de
  parole (NOR/DX/DX+), VOX (+ niveau + délai), moniteur (+ niveau), gain micro.
- **Réception (slice active) :** sélecteurs d'**antenne** RX/TX et une bascule
  **DAX** (audio d'émission via DAX, pour WSJT-X & co), mode/seuil AGC, niveau
  audio, NB / WNB / NR / ANF, et — sur les radios **SmartSDR v4** (séries 8000 /
  Aurora) — les filtres DSP supplémentaires **NRL, NRS, NRF** (avec niveau) plus
  **RNN** (réduction de bruit par IA) et **ANFT** (notch automatique FFT),
  affichés automatiquement si la radio les supporte. **RIT / XIT** avec accord
  molette / ±.
- **Coupleur d'antenne (ATU) :** accord / bypass / mémoires.
- **Amplificateur :** la carte de commande suit l'ampli configuré, avec une liste
  déroulante pour le choisir quand **plusieurs amplificateurs** sont configurés
  (p. ex. deux SPE en parallèle). Voir *Amplis & commutateurs* ci-dessous.
- **Mesures en direct** via le flux UDP VITA-49 : S-mètre (unités S), puissance
  directe (W), ROS, ALC, température PA, tension, plus les mesures de l'ampli.

### Onglet de commande Icom

Affiché quand le backend CAT est Icom (USB ou réseau). Une console complète façon
RS-BA1 :

- **Double afficheur VFO** (MAIN / SUB) avec la grande fréquence tabulaire, le
  badge de mode, la bande et l'offset RIT/ΔTX, et une **rangée de boutons de
  mode** (SSB / CW / RTTY / PSK / AM / FM).
- **Scope de spectre + waterfall** (panadapter) : ON/OFF, CTR/FIX, double-clic
  pour accorder, et boutons **◀ ⊙ ▶** pour centrer le scope sur la fréquence
  actuelle (±50 kHz) et le décaler à gauche/droite.
- **Mesures en direct** toujours visibles : S-mètre (clic → remplir le RST),
  puissance en watts, ROS.
- **DSP réception :** gain AF / RF, squelch, AGC, préampli, atténuateur, filtre
  (FIL1/2/3), NB, NR, ANF et — **en CW seulement** — l'**APF** (filtre de pic
  audio).
- **Passe-bande / notch :** Twin PBT (intérieur / extérieur), notch manuel +
  position.
- **Émission :** puissance RF, MOX, TUNE, **split avec offset automatique**
  (+5 kHz en SSB, +1 kHz en CW), et moniteur. **En phonie seulement** : gain
  micro, processeur de parole, VOX (+ gain + anti-VOX). Les commandes qui ne
  s'appliquent pas au mode courant sont masquées automatiquement.
- **Bandes & antenne :** boutons de bande en un clic et sélection ANT1/ANT2.
- **Clarificateurs :** RIT et ΔTX avec accord molette / ± (Ctrl+←/→ décale le
  RIT).
- Boutons **Marche / Arrêt** (manuels par choix — l'application ne réveille
  jamais la radio à la connexion).
- La **manipulation CW** peut passer par le keyer intégré de la radio (voir
  *Keyers* ci-dessous).

### Icom à distance (par internet, sans RS-BA1)

OpsLog parle directement le protocole réseau intégré de l'IC-7610 — il
**remplace à la fois l'Icom Remote Utility et RS-BA1**. Saisissez l'IP de la
radio, le nom/mot de passe Network User1 et l'adresse CI-V, et toute la console
Icom fonctionne sur le LAN/internet : login + token (renouvelé automatiquement),
tunnel CI-V, retransmission côté réception pour une liaison très stable même
avec le panadapter en flux, et Marche/Arrêt manuel. (L'audio est hors périmètre
— utilisez la radio en USB + une liaison voix comme Mumble.)

## Keyers & audio

- **Keyer CW** avec macros et macros sur touches F. Le moteur du keyer est
  sélectionnable : **WinKeyer** (K1EL WK1/2/3 sur port COM), **FlexRadio CWX**
  (le keyer intégré de la radio via l'API SmartSDR — type-ahead et retour arrière,
  sans WinKeyer ni SmartCAT), **Icom** (le keyer intégré de la radio via CI-V —
  sans matériel supplémentaire, fonctionne aussi à distance) ou **TCI**.
- **Keyer vocal numérique** (DVK) : enregistrer les messages vocaux F1–F6 et les
  émettre.
- **Enregistrement audio des QSO :** capture continue en tampon glissant ; au
  *Log QSO* le contact est sauvegardé dans un WAV par QSO
  (`INDICATIF_AAAAMMJJ_HHMMSS.wav`) ; mixe RX + micro.

## Amplis & commutateurs

- **Amplificateurs** — configurez **un ou plusieurs** amplis (Réglages →
  Amplificateur est une liste ; p. ex. deux SPE en parallèle pour plus de
  puissance). La carte de chaque ampli apparaît sur l'onglet FlexRadio et dans
  **Station Control**, avec une liste déroulante pour choisir lequel afficher ; la
  barre de statut du bas porte **une pastille cliquable par ampli** (vert =
  OPERATE, orange = STANDBY, rouge = hors ligne). Supportés :
  - **PowerGenius XL** (4O3A) en TCP direct — operate/standby, sélecteur de mode
    ventilateur et affichage des défauts.
  - **SPE Expert** (1.3K-FA / 1.5K-FA / 2K-FA) via **USB** (COM virtuel) ou le
    **réseau** (pont RS232-Ethernet) — operate/standby, Marche/Arrêt, niveau de
    sortie Low / Mid / High, une barre de puissance et le statut en direct (bande,
    ROS, courant PA, température, avertissements/alarmes).
  - **ACOM** (500S / 600S / 700S / 1200S / 2020S) via **USB** ou le **réseau**
    (pont RS232-Ethernet) — operate/standby/arrêt et télémétrie en direct
    (puissance directe & réfléchie, ROS, température PA, bande, ventilateur,
    défauts). La mise en marche fonctionne via un câble série reliant les lignes
    DTR/RTS.
- Commutateur d'antenne **Antenna Genius** (4O3A) via TCP/GSCP — un widget de
  commutation A/B ancré.
- Panneau **Station Control** (ancrable, widgets réordonnables par glisser) : le
  **rotor**, la commande d'éléments **Ultrabeam** et des **cartes relais** —
  WebSwitch 1216H, KMTronic, **Denkovi** USB (bit-bang FT245 D2XX, 4 ou 8 relais)
  et USB-série générique (CH340 / LCUS, protocole A0) — pour l'alimentation, les
  antennes et accessoires de la station.
- **Relais automatiques** (Réglages) : bascule les relais de Station Control
  automatiquement selon la fréquence / bande de la radio (comme PstRotator) — par
  relais, une fenêtre de fréquence ou un ensemble de bandes.

## QSL & diplômes

- **Moteur de diplômes :** définitions intégrées + personnalisées (partagées
  **globalement** entre profils) — DXCC, WAS / WAZ / WAC, WPX,
  IOTA / POTA / SOTA / WWFF, **DDFM**, contacté/confirmé/validé par bande & mode,
  règles OU et affectation manuelle de références, détection de référence en
  direct à la saisie de l'indicatif, **import de listes de références** pour les
  totaux/noms, et un **Rescan** qui relit le journal (récupère les nouvelles
  confirmations LoTW/QRZ).
- **Services QSL :** ClubLog (upload ADIF par lots), LoTW, QRZ.com, eQSL —
  upload et **téléchargement des confirmations** (qui rafraîchit automatiquement
  les stats de diplômes).
- **Concepteur de cartes QSL** (voir ci-dessous).
- **eQSL par e-mail :** clic droit sur un QSO → *Envoyer l'eQSL par e-mail* via
  le compte SMTP configuré. (Outlook/Hotmail désactivent le SMTP basic-auth —
  utilisez Gmail avec un mot de passe d'application, ou un mot de passe
  d'application Microsoft.)

## Log de concours

- **Onglet Contest :** choisissez un concours (liste ADIF `CONTEST_ID` intégrée)
  et un échange (numéro de série courant ou échange fixe). OpsLog remplit
  automatiquement `CONTEST_ID` et les numéros émis/reçus (`STX` / `SRX`), impose
  un début/fin de fenêtre, signale les doublons et tient un tableau de score en
  direct.

## Statistiques

- **Tableau de bord des statistiques :** tuiles de synthèse (QSO, indicatifs
  uniques, entités DXCC, continents, % confirmés) plus des graphiques — QSO **par
  mode**, un split **CW / phonie / data** par bande, l'**activité dans le temps**
  (vues glissantes jour / 7 jours / 30 jours / 12 mois), par opérateur et par
  continent. Filtres par plage de dates, par opérateur et par concours, et une vue
  **Table** qui reprend chaque graphique.

## Statut opérateur en direct (événements spéciaux)

Pour un indicatif d'événement spécial multi-op sur un journal MySQL partagé (ex.
**TM74TFR**), la publication est **automatique** — aucun réglage à activer.
Chaque instance OpsLog envoie un battement de cœur de son activité (indicatif de
l'opérateur, bande, fréquence, mode) dans une table `live_status` toutes les
~15 s, et repasse *hors antenne* automatiquement 5 min après le dernier QSO
logué. Un petit rendu PHP
([`docs/livestatus/tm74-status.php`](docs/livestatus/tm74-status.php)) sur votre
propre serveur web lit cette table et produit une page/image en direct que vous
pouvez intégrer sur la bio **QRZ.com** de la station
(`<img src="…/tm74-status.php?img=1">`). OpsLog écrit seulement dans la base —
ce n'est pas un serveur web.

## Net control

- **Log de net dirigé** (Outils → Net) : un roster global (`nets.json`) plus une
  session active en mémoire — pointez les stations présentes, puis loguez-les une
  par une ou tout le net d'un coup (**Logger tout le monde**) en utilisant la
  fréquence CAT. **Glisser-déposer** entre les deux listes (roster → on air démarre
  un QSO, on air → roster l'enregistre), et après chaque log la station on air
  suivante est sélectionnée automatiquement pour enchaîner les contacts.

## Apparence & langue

- **Thèmes :** quatre thèmes complets (Clair chaud, Sombre chaud, Graphite
  sombre, Contraste élevé) plus **Auto** (suit la préférence clair/sombre du
  système), sélectionnables dans Réglages → Général. Chaque panneau et chaque
  table AG-Grid suit le thème.
- **Bilingue :** interface complète **anglais / français**, avec un choix de
  drapeau au premier lancement et un sélecteur dans Réglages → Général.

## Sécurité

- **Coffre à secrets :** chiffrement optionnel par phrase de passe des mots de
  passe stockés (AES-GCM + PBKDF2). Les valeurs chiffrées sont portables ; une
  seule invite de déverrouillage au lancement les déchiffre pour la session.

## Intégrations (sortantes)

- **Émetteurs UDP :** pousser la fréquence actuelle vers **PstRotator**, les
  infos radio au format **N1MM `RadioInfo`**, ou un **enregistrement ADIF à
  chaque QSO logué** — pour que les outils externes (contrôle de rotor,
  applications numériques, autres logiciels de log) restent synchronisés.

## Divers

- **Démarrage automatique :** lancer des programmes externes (WSJT-X, JTAlert,
  contrôle de rotor…) au démarrage d'OpsLog, en sautant ceux déjà lancés.
- **Sauvegarde :** sauvegarde optionnelle base + ADIF à la fermeture.
- **Vérification de mise à jour** au démarrage et toutes les 5 minutes (et à
  l'ouverture d'Aide → À propos), avec un toast (désactivable), plus une fenêtre
  **Nouveautés** qui affiche le changelog (anglais / français) au premier
  lancement après une mise à jour — réouvrable à tout moment depuis le menu Aide.
- **Télémétrie d'usage anonyme** (un battement de cœur quotidien : ID
  d'installation aléatoire + version + OS — aucune donnée d'indicatif ou de QSO ;
  désactivable dans les Préférences).

---

## Concepteur de cartes QSL

Outils → *Concepteur de cartes QSL…* transforme quelques photos en une carte
eQSL soignée :

1. Choisissez 1 à 6 photos (jpeg/png). OpsLog les analyse hors ligne (grille de
   détail/luminance) et propose **3 designs** — indicatif dans la zone la plus
   calme de la meilleure photo, nom de l'opérateur, zones CQ/ITU + ligne locator,
   drapeau du pays, les autres photos en inserts encadrés, et un encart de
   confirmation par QSO.
2. Choisissez une proposition et affinez-la : cliquez un élément pour le
   sélectionner, glissez pour déplacer, changez la police / le préréglage de
   style (gel or, gel argent, contour blanc classique, script, plat) et les
   réglages par préréglage dans le panneau de droite.
3. Enregistrez le modèle (les photos sont copiées dans
   `data/qsl/templates/<id>/`, les originaux peuvent donc être déplacés). Un
   modèle peut être le défaut par profil.

Envoi : clic droit sur un QSO → *Envoyer l'eQSL par e-mail*. La carte est rendue
avec les données de ce QSO, matricée en JPEG ≤ 800 Ko, archivée dans
`data/qsl/outbox/` et envoyée via le compte SMTP configuré à l'adresse trouvée
par la recherche QRZ/HamQTH. En cas de succès le QSO est marqué `EQSL_SENT=Y`
(ADIF). Les modèles de sujet/corps de l'e-mail sont dans le concepteur (variables
`{CALL} {DATE} {BAND} {MODE} {MYCALL}`).

Polices : Archivo Black, Lilita One, Baloo 2, Oswald, Great Vibes, Allura
(toutes OFL, embarquées — licences dans `internal/qslcard/assets/fonts/`) ;
Cooper Black est proposée si MS Office l'a installée. Drapeaux : flag-icons
(MIT), embarqués pour les entités DXCC couramment contactées.

---

## Données & stockage

- La **config** (réglages, profils, radios/antennes, nœuds de cluster, cache de
  recherche, listes de diplômes, modèles QSL) réside toujours dans le fichier
  SQLite local sous `data/` — instantané même quand le journal est sur un MySQL
  lointain.
- Le **journal** (QSO) réside là où pointe le profil actif : le fichier SQLite
  local ou une base **MySQL** partagée par profil.

---

*An English version of this document is available in [README.md](README.md).*
