diff --git a/changelog.json b/changelog.json index f2bae48..89a7874 100644 --- a/changelog.json +++ b/changelog.json @@ -5,12 +5,22 @@ "en": [ "When TQSL refuses an upload, the log now carries the exact ADIF record it was given and the station location it was told to sign with. 'No QSOs processed' covers several unrelated causes and the temp file is deleted the moment TQSL returns, so the one piece of evidence that mattered was the one nobody could see.", "An Elecraft console for the K3/K4, in a tab of its own when the CAT backend is Elecraft or Kenwood: power, volume, RF and mic gain, squelch, preamp, attenuator, NB, NR, AGC, filter width, antenna, RIT/XIT with a clear, keyer speed, S-meter, SWR, MOX and an ATU tune. The meter scaling is marked provisional and the raw readings go to the log — it was written from the K3 Programmer's Reference without a radio to hand, and a wrongly scaled SWR bar reports a good match on a bad antenna.", - "Type a number in the callsign field and press Enter to move the radio: kHz for a frequency (28500 → 28.500 MHz), or a band on its own (20, 160, 6…). It is where the hands already are — reading a spot and reaching for the frequency box is what loses the station. Ambiguous numbers are read as bands, since 40 kHz and 160 kHz are nowhere anyone tunes." + "Type a number in the callsign field and press Enter to move the radio: kHz for a frequency (28500 → 28.500 MHz), or a band on its own (20, 160, 6…). It is where the hands already are — reading a spot and reaching for the frequency box is what loses the station. Ambiguous numbers are read as bands, since 40 kHz and 160 kHz are nowhere anyone tunes.", + "Yaesu console: the mic gain is read and written on the rig's own 0-100 scale. It was treated as 0-255, so an FTDX101 set to 80 showed 38 and every attempt to move the slider was refused by the radio and sprang back.", + "Yaesu console: the power slider goes to 200 W on the models that make it (FTDX101MP and the like), and follows the radio if it ever reports more than expected. The slider, not the rig, was the 100 W limit.", + "Yaesu console: the NAR button (narrow IF filter) is shown only when the radio answers the command, and says what it is. A button that did nothing when pressed read as a fault in the rig.", + "The frequency readout now steps the Hz digits under the mouse wheel too, not just the kHz ones — 100, 10 and 1 Hz. Zero-beating a CW signal is a few tens of Hz, and it was the one move the display would not make.", + "The split-pile-up chaser only appears in CW: the marker comes from a skimmer decoding a report, so on SSB or FT8 there is nothing for it to chase." ], "fr": [ "Quand TQSL refuse un envoi, le journal contient désormais l'enregistrement ADIF exact qui lui a été remis et l'emplacement de station demandé pour la signature. « No QSOs processed » recouvre plusieurs causes sans rapport et le fichier temporaire est supprimé dès que TQSL rend la main : la seule pièce à conviction utile était justement invisible.", "Une console Elecraft pour les K3/K4, dans un onglet dédié quand le CAT est réglé sur Elecraft ou Kenwood : puissance, volume, gain HF et micro, squelch, préampli, atténuateur, NB, NR, AGC, largeur de filtre, antenne, RIT/XIT avec effacement, vitesse du manipulateur, S-mètre, ROS, MOX et accord de l'ATU. L'échelle des mesures est signalée comme provisoire et les valeurs brutes partent dans le journal — la console a été écrite d'après le manuel de programmation du K3, sans radio sous la main, et une barre de ROS mal calibrée annonce un bon accord sur une mauvaise antenne.", - "Taper un nombre dans le champ indicatif puis Entrée déplace la radio : en kHz pour une fréquence (28500 → 28.500 MHz), ou une bande seule (20, 160, 6…). C'est là que sont déjà les mains — lire un spot puis aller chercher la case fréquence, c'est ce qui fait perdre la station. Les nombres ambigus sont lus comme des bandes : 40 kHz ou 160 kHz ne sont nulle part où l'on s'accorde." + "Taper un nombre dans le champ indicatif puis Entrée déplace la radio : en kHz pour une fréquence (28500 → 28.500 MHz), ou une bande seule (20, 160, 6…). C'est là que sont déjà les mains — lire un spot puis aller chercher la case fréquence, c'est ce qui fait perdre la station. Les nombres ambigus sont lus comme des bandes : 40 kHz ou 160 kHz ne sont nulle part où l'on s'accorde.", + "Console Yaesu : le gain micro est lu et écrit sur l'échelle 0-100 de la radio. Il était traité en 0-255 : un FTDX101 réglé sur 80 affichait 38, et toute tentative de bouger le curseur était refusée par la radio et revenait en place.", + "Console Yaesu : le curseur de puissance monte à 200 W sur les modèles qui la sortent (FTDX101MP et consorts), et suit la radio si elle annonce davantage. C'était le curseur, pas la radio, qui plafonnait à 100 W.", + "Console Yaesu : le bouton NAR (filtre FI étroit) n'apparaît que si la radio répond à la commande, et indique ce qu'il fait. Un bouton sans effet passait pour une panne de la radio.", + "L'affichage de fréquence fait maintenant défiler aussi les chiffres des Hz à la molette, pas seulement ceux des kHz — 100, 10 et 1 Hz. Se caler au zéro-beat sur un signal CW se joue à quelques dizaines de Hz, et c'était le seul geste que l'affichage refusait.", + "Le chasseur de pile-up en split n'apparaît qu'en CW : le marqueur vient d'un skimmer qui décode un report, donc en SSB ou en FT8 il n'a rien à chasser." ] }, { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 9abce97..a8156bc 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -244,10 +244,15 @@ function fmtFreqDots(mhzStr: string): string { } // FreqWheelDisplay renders a frequency (MHz string) like fmtFreqDots — MHz.kHz.Hz -// — but makes the three kHz digits scroll-sensitive: rolling the mouse wheel over -// the hundreds / tens / units-of-kHz digit steps the frequency by 100 / 10 / 1 kHz -// (up = wheel up). onNudge receives the delta in Hz. The MHz and Hz digits are -// static (only kHz stepping was requested). Used in the header + compact top bar. +// — and makes the kHz AND Hz digits scroll-sensitive: rolling the wheel over a +// digit steps the frequency by that digit (100/10/1 kHz, then 100/10/1 Hz; up = +// wheel up). onNudge receives the delta in Hz. +// +// The Hz digits were static at first, on the grounds that only kHz stepping had +// been asked for. An FTDX101 operator put it plainly: the fine tuning is exactly +// what a mouse is wanted for — zero-beating a CW signal or nudging onto an SSB +// voice is a few tens of Hz, and it was the one move the display would not make. +// The MHz digits stay static: a wheel notch that changes band is not fine tuning. function FreqWheelDisplay({ mhz, onNudge, className, placeholder = '—.———.———' }: { mhz: string; onNudge: (deltaHz: number) => void; className?: string; placeholder?: string; }) { @@ -257,6 +262,7 @@ function FreqWheelDisplay({ mhz, onNudge, className, placeholder = '—.—— const khz = frac.slice(0, 3); // [hundreds, tens, units] of kHz const hz = frac.slice(3, 6); const stepHz = [100_000, 10_000, 1_000]; // per kHz digit: 100 / 10 / 1 kHz + const stepHzFine = [100, 10, 1]; // per Hz digit return ( {intPart}. @@ -268,7 +274,15 @@ function FreqWheelDisplay({ mhz, onNudge, className, placeholder = '—.—— {d} ))} - .{hz} + . + {hz.split('').map((d, i) => ( + { if (e.ctrlKey || e.metaKey) return; e.preventDefault(); e.stopPropagation(); onNudge(e.deltaY < 0 ? stepHzFine[i] : -stepHzFine[i]); }} + className="cursor-ns-resize rounded-[2px] hover:bg-primary/25 transition-colors" + title="Scroll to change frequency"> + {d} + + ))} ); } diff --git a/frontend/src/components/FlexPanel.tsx b/frontend/src/components/FlexPanel.tsx index 4ca65ca..8d57f86 100644 --- a/frontend/src/components/FlexPanel.tsx +++ b/frontend/src/components/FlexPanel.tsx @@ -677,6 +677,10 @@ export function FlexPanel({ onCWSpeed, onReportRST }: { onCWSpeed?: (wpm: number in the log, which is done mid-QSO with one hand. The offset sits beside it because it is the one number retuned while chasing — everything else about the feature is configured once. */} + {/* CW ONLY. The marker comes from a skimmer decoding a CW report, + so on SSB or FT8 there is nothing to chase — and a switch that + cannot fire is an invitation to wonder why it does nothing. */} + {isCW && (<>