Add the core, contest, storage and format layers

Frequencies, bands, modes, callsigns, grid squares and the country file live in
Nonemm.Core. Nonemm.Contests holds the scoring engine and CQ WW and CQ WPX.
Nonemm.Storage writes N1MM's DXLOG schema, and Nonemm.Formats writes Cabrillo
3.0 and reads and writes ADIF.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik
2026-08-27 10:27:51 +00:00
commit 0f84bc8972
68 changed files with 3823 additions and 0 deletions

48
OBJECTIVE.md Normal file
View File

@@ -0,0 +1,48 @@
# Objective
Nonemm is a contest logger for amateur radio: a from-scratch reimplementation of N1MM Logger+ in C#, running on Linux and Windows.
This is what the finished program has to do.
## Scope
Contest rules, log formats and the database schema are written from their published definitions and are fully compatible with N1MM.
## Requirements
**N1MM file compatibility.** The log database is N1MM's `.s3db`, in N1MM's schema. User-defined
contests are `.udc` files. Macros and message files are N1MM's. A log written by either program
opens in the other. Columns N1MM caches and we compute — points, multiplier flags — get written
anyway so N1MM is happy, and are ignored on read. New storage extends N1MM's tables instead of
changing them. Keep the store behind an interface; it may be a hosted database later, but the
file on disk is N1MM's format.
**No N1MM code in the repo.** N1MM decompiles, and it's the reference when the published rules
are unclear or easy to get wrong. Check against it in a scratchpad; what lands in the repo is
written from the published rule.
**Where N1MM is wrong, don't copy the bug.** Follow the published rule and add a test that says
what N1MM returns and why we don't.
**Work without the optional inputs.** The country file and callsign database aren't bundled;
they're downloaded from the same places N1MM gets them, and validated before anything is
replaced. A failed download leaves the old file alone. Without a country file, country- and
continent-scored contests lose accuracy but still run. With no radio connected, frequency and
mode stay wherever they were last typed.
**Leave out what can't be done properly.** A check-window column with no data behind it stays
out rather than showing a guess.
**Logic is testable without a UI.** What space does, when a dupe fires, what a QSO scores — that
lives in a project with no UI framework reference and is covered by unit tests.
**Reimplement most of N1MM's features.** It's fine if some are left out for simplicity, but the main
core must be preserved -- it's a fully ready-to-use networked (multi-station) contest logger, with
all the features necessary for efficient contest operation -- dupe checks, partial matching, telnet cluster,
band view, no wasted space.
## Done
An operator works a contest end to end — dupes and mults flagged as they type, bandmap and
cluster feeding stations, radio and log following each other — exports a Cabrillo the sponsor
accepts, and can open the log in N1MM.