Count from the log again on Reset Serial Numbers
The button started the numbers again at one. N1MM's manual says it "sets serial numbers on all computers to the highest value in any of the logs, plus 1", and its own handler re-reads the highest number per band out of the log, so a mixed network came apart at exactly the point the button is meant to repair: the N1MM stations counted on from the highest number and this one started at one, sending numbers that had already gone out. ContestSession.RestartNumbers fills the pool from the log, which is where the reset now lands. SerialNumbersFrom is gone with it, and so is the pool this station sent afterwards: N1MM sends none, because each station works the same number out of its own copy of the log. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015NZkFxHde1iifAQemFTHxf
This commit is contained in:
@@ -411,14 +411,15 @@ public sealed class AppSession : IDisposable
|
||||
}
|
||||
}
|
||||
|
||||
/// Starts the serial numbers again at one. The contacts already logged keep
|
||||
/// the numbers they were sent with; it is the next number that changes.
|
||||
/// Starts the serial numbers again from the log: the next number becomes
|
||||
/// the highest one in it plus one. The contacts already logged keep the
|
||||
/// numbers they were sent with. N1MM sends no pool with this — every
|
||||
/// station works the same number out of its own copy of the log.
|
||||
public void ResetSerialNumbers()
|
||||
{
|
||||
if (Logging is not null)
|
||||
{
|
||||
Logging.SerialNumbersFrom = DateTime.UtcNow;
|
||||
_ = link?.SendSerialNumbersAsync(Logging.Numbers.Snapshot());
|
||||
Logging.RestartNumbers();
|
||||
Changed?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -378,7 +378,8 @@ public sealed partial class NetworkStatusWindow : RefreshableWindow
|
||||
}
|
||||
}
|
||||
|
||||
/// Starts the serial numbers again at one, here and at every station.
|
||||
/// Counts the serial numbers from the log again, here and at every
|
||||
/// station: the next number is the highest one logged plus one.
|
||||
private async void OnResetSerialNumbers(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
if (link is null)
|
||||
@@ -387,7 +388,7 @@ public sealed partial class NetworkStatusWindow : RefreshableWindow
|
||||
}
|
||||
session.ResetSerialNumbers();
|
||||
await link.SendResetSerialNumbersAsync();
|
||||
Say("serial numbers start again at one");
|
||||
Say($"serial numbers start again at {session.Logging?.NextNumberOn(null)}");
|
||||
}
|
||||
|
||||
private void OnLogEverywhereChanged(object? sender, RoutedEventArgs e)
|
||||
|
||||
@@ -456,7 +456,7 @@ public sealed class StationLink : IDisposable
|
||||
computerName),
|
||||
cancellation);
|
||||
|
||||
/// Tells every station to start its serial numbers again at one.
|
||||
/// Tells every station to count its serial numbers from the log again.
|
||||
public Task<int> SendResetSerialNumbersAsync(CancellationToken cancellation = default) =>
|
||||
SendAsync(StationMessages.ResetSerialNumbers(StationNumber, computerName), cancellation);
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace Nonemm.Network;
|
||||
/// | `CONTESTNAME` | which contest the sender is logging | yes | yes |
|
||||
/// | `TIME` | the sender's clock | yes | yes |
|
||||
/// | `MASTER` | which station is the master for the cluster and the time | yes | yes |
|
||||
/// | `RESETQSONRS` | start the serial numbers again at one | yes | yes |
|
||||
/// | `RESETQSONRS` | count the serial numbers from the log again | yes | yes |
|
||||
/// | `ReserveNr` | a serial number the sender has taken for a contact | yes | yes |
|
||||
/// | `QSONRS` | the highest serial number taken on each band | yes | yes |
|
||||
/// | `STACKCALL` | a contact for another station's call stack | yes | yes |
|
||||
@@ -304,8 +304,10 @@ public static class StationMessages
|
||||
public static StationRecord Master(string masterName, int stationNumber, string computerName) =>
|
||||
Record("MASTER", stationNumber, computerName, [masterName]);
|
||||
|
||||
/// Start the serial numbers again at one. It is sent when an operator finds
|
||||
/// the entry has been logging with numbers from a contest before this one.
|
||||
/// Count the serial numbers from the log again, so the next one is the
|
||||
/// highest logged plus one. Each station works that out from its own copy
|
||||
/// of the log, so the message carries nothing. N1MM's manual calls it "only
|
||||
/// for use when you have screwed up".
|
||||
public static StationRecord ResetSerialNumbers(int stationNumber, string computerName) =>
|
||||
Record("RESETQSONRS", stationNumber, computerName, []);
|
||||
|
||||
|
||||
@@ -68,19 +68,15 @@ public sealed class ContestSession
|
||||
|
||||
public int StationNumber { get; set; } = 1;
|
||||
|
||||
/// Contacts logged before this are not counted when the next serial number
|
||||
/// is worked out, so Reset Serial Numbers starts them again at one. The
|
||||
/// contacts already logged keep the numbers they were sent with. It lasts
|
||||
/// as long as the program is open, the way N1MM's does.
|
||||
public DateTime SerialNumbersFrom
|
||||
/// Starts the serial numbers again: the pool is filled from the log, so the
|
||||
/// next number is the highest number in it plus one. That is what N1MM's
|
||||
/// Reset Serial Numbers at all Stations does, at every station of the
|
||||
/// entry, and it leaves the contacts already logged with the numbers they
|
||||
/// were sent with.
|
||||
public void RestartNumbers()
|
||||
{
|
||||
get;
|
||||
set
|
||||
{
|
||||
field = value;
|
||||
SeedNumbers();
|
||||
NumbersRestarted?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
SeedNumbers();
|
||||
NumbersRestarted?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
/// The numbers have been started again, so a position holding one it took
|
||||
@@ -278,6 +274,6 @@ public sealed class ContestSession
|
||||
? Log.Qsos.Where(q =>
|
||||
Contest.SessionOf(q.TimestampUtc) == Contest.SessionOf(DateTime.UtcNow))
|
||||
: Log.Qsos;
|
||||
Numbers.SeedFrom(counted.Where(q => q.TimestampUtc >= SerialNumbersFrom));
|
||||
Numbers.SeedFrom(counted);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user