Six faults from an evening on 60 m, all in the same family: the engine judging a station by what the log wants from it and forgetting what is already under way. - An exchange was abandoned mid-QSO. The reply lands in the same period the ladder is re-read, and that period was judged before the reply was taken into account, so a better-ranked caller took the slot from a station that had just come back to us. The answer is settled first now, and our own report counts as being inside the exchange too — which also protects a QSO the operator started by hand. - A station just picked started with misses against it. Its transmit slot was unknown until a second decode, and with the parity unknown every period counted, including the one spent transmitting to it. - The freed slot after "it is working somebody else" was thrown away: the period's decodes are in hand, so the next station is picked from them rather than fifteen seconds later. Never mid-over. - Auto-call is never armed from a stored setting — not at launch, not on a profile switch. It is the one feature that puts the station on the air by itself and OpsLog starts with Windows. - It says what it is waiting for: a wanted station in a QSO with somebody else now shows beside the Auto button instead of looking idle. - Switching profile left the previous logbook's verdicts on screen. The worked-index, chase-new and the frontend's cached verdicts are dropped when the logbook changes. FT decodes: distance column, a message addressed to you set whole in green (the station you are calling keeps a tint — most of what it sends goes to other people), badge order L / Wkd / WL, list cleared when the RIG changes band. Rotor: new world-map compass from EC1KD's design, with the Ultrabeam boom and second lobe restored and the compact form preserved; the classic dial is kept and Settings → Rotator chooses between them. Stop no longer flickers on a rotor standing still — movement was inferred from a degree, less than the jitter a controller reports at rest.
40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
// Which rotor dial to draw.
|
|
//
|
|
// Two compasses ship: the current one (night map, square scale, mouse pointer,
|
|
// target marker) and the original small light-map dial. Neither is more correct
|
|
// than the other — one operator reads the big map at a glance, another wants the
|
|
// compact dial that was there before — so it is a preference, not a migration.
|
|
//
|
|
// A UI preference rather than a settings-database key: it decides what a widget
|
|
// looks like, nothing is transmitted from it, and it belongs to the screen it is
|
|
// read on. It is portable all the same (see lib/uiPref), so a copied folder
|
|
// keeps the dial its owner chose.
|
|
import { writeUiPref } from '@/lib/uiPref';
|
|
|
|
export const KEY_ROTOR_STYLE = 'opslog.rotorStyle';
|
|
|
|
export type RotorStyle = 'modern' | 'classic';
|
|
|
|
export function rotorStyle(): RotorStyle {
|
|
try {
|
|
return localStorage.getItem(KEY_ROTOR_STYLE) === 'classic' ? 'classic' : 'modern';
|
|
} catch {
|
|
return 'modern';
|
|
}
|
|
}
|
|
|
|
// Same shape as the distance unit: the compasses are rendered from two call
|
|
// sites, and a preference changed in Settings has to reach both without either
|
|
// of them polling for it.
|
|
const listeners = new Set<() => void>();
|
|
|
|
export function setRotorStyle(style: RotorStyle): void {
|
|
writeUiPref(KEY_ROTOR_STYLE, style);
|
|
listeners.forEach((l) => l());
|
|
}
|
|
|
|
export function subscribeRotorStyle(fn: () => void): () => void {
|
|
listeners.add(fn);
|
|
return () => { listeners.delete(fn); };
|
|
}
|