The function keys send through cwdaemon or a WinKeyer, with N1MM's message macros. Escape stops sending. Settings are read with the reflection serializer rather than a generated one: the generated one hands back null for every property the file leaves out instead of the value the property is declared with, which crashed the program the first time a new setting was added. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
55 lines
2.3 KiB
Markdown
55 lines
2.3 KiB
Markdown
# Opening a Nonemm log in N1MM
|
|
|
|
Checked on 2026-08-27 against N1MM Logger+ 1.0.11031 by writing a log here,
|
|
copying it to a Windows machine and opening it there. N1MM read the contest, its
|
|
categories and the contacts.
|
|
|
|
Three things had to be right, and none of them is obvious from the schema.
|
|
|
|
## The `Contest` table needs a row for the contest
|
|
|
|
`ContestInstance` says which contest a log is; the `Contest` table says what that
|
|
contest *is*. N1MM reads it in `Contest.FromRow` when it opens a log and throws
|
|
`InvalidOperationException: No current row` if the row is missing, which reaches
|
|
the operator as "A runtime error occurred".
|
|
|
|
So the definition row is written whenever a contest is opened, not only when it
|
|
is created — a log made before this was understood gets its row the next time it
|
|
is opened. `ContestDefinitions.For` builds the row from the contest's own rules:
|
|
the display and Cabrillo names, the mode, the dupe type and the multiplier
|
|
names.
|
|
|
|
## The overlay category cannot be empty
|
|
|
|
An empty `ContestInstance.OverlayCategory` is answered with "Invalid Overlay
|
|
Category:" and the log will not open. An entry with no overlay says `N/A`.
|
|
|
|
N1MM's list is not the Cabrillo specification's list. N1MM offers:
|
|
|
|
N/A, ROOKIE, BAND-LIMITED, TB-WIRES, OVER-50, HQ, NOVICE-TECH, EXPERT
|
|
|
|
so that is what the contest dialog offers.
|
|
|
|
## The sent exchange omits the report
|
|
|
|
N1MM's contest dialog says "Omit RST: CQWW: 05". `SentExchange` for CQ WW is
|
|
`14`, not `599 14`; for a serial number contest it is `001`. The report is fixed
|
|
for the whole contest and the entry window fills it in per contact.
|
|
|
|
## Getting the schema in the first place
|
|
|
|
N1MM ships no template database. `ham.s3db` is built at run time by applying SQL
|
|
migration files that N1MM writes out from string resources inside
|
|
`N1MMLogger.net.exe`. To read them: decompile the executable, parse
|
|
`N1MMLogger.Net.Resources.resx`, and take the untyped `<data>` entries named
|
|
`DXLogDDL_0001_initial_schema_and_data` through `DXLogDDL_0004_updates`. The QSO
|
|
table is `DXLOG` and the current `PRAGMA user_version` is 4.
|
|
|
|
`src/Nonemm.Storage/Schema.sql` is that schema, flattened to the state version 4
|
|
leaves behind.
|
|
|
|
## One thing to avoid
|
|
|
|
Do not replace the database file under a running N1MM. It does not notice and
|
|
throws on the next read.
|