w7sst / MorseRunner

Morse Runner Community Edition
Mozilla Public License 2.0
63 stars 12 forks source link

Improve QSO exchanges after entering partial callsign #315

Open w7sst opened 4 months ago

w7sst commented 4 months ago

Summary

When the user has copied only part of the simulated callsign, the station will respond by repeating its callsign and sometimes its exchange. When doing so, there are currently limited messages being returned. Actual contests use different and shorter messages as compared to the MRCE simulation. This change is related to Issue #314.

Motivation

Improved realism. One of the goals of MRCE is to create a realistic contest simulation. This change will improve the realism of the contest exchange when partial callsigns are entered.

Detailed Description

After the user enters a partially-correct callsign, the existing simulation will return the following messages:

DE <call> <exch>
DE <call> <call> <exch>
<call> <call> <exch>

Seasoned contesters will minimize the length of messages being sent by eliminating the DE and sending both corrected call and exchange information. To that end, we will add the following (shorter) messages:

<call> <call> <exch>
<call> <exch>
<call> <call>

Both sets of response messages should be sent in a random manner with priority given to the shorter messages.

Additional context

I found this paper, Do's and Don'ts of CW Contesting and More Do’s and Don’ts in CW Contesting, written by Rob Brownstein, K6RB. It discusses recommended practices for CW Contesting. It was posted by the K1USN group who sponsor the weekly CWOPS SST Contest. I thought it was a good read.

On page 2 of the second article in the above link, it mentioned:

Some people will hold off sending an exchange if a runner sends the wrong call. For example, if I sent K4PP 5nn ca to K3PP, he may send K3PP K3PP and pause without sending an exchange. I would then send K3PP 5nn ca. Then, he would send tu 5nn pa. However, doing this delays both the runner and pouncer, and only the runner is at risk of losing points. So, why not be a good citizen and send K3PP 5nn pa rather than holding off the exchange. If the runner gets it, and fixes it, then great. If not, you’ve done your job without delaying either of you.

Based on the above, we should keep the exchange after the corrected callsign and increase the frequency of responses of this type. We also want to shorten the responses as mentioned in the article.

Tasks

w7sst commented 4 months ago

Here is the link to build v1.85-dev.3 which includes this change.

w7sst commented 4 months ago

The comment below is copied from the Pull Request/Review...

When running a simulation, sometimes a callsign is copied incorrectly and entered into the Callsign exchange entry field. After hitting Enter, the partial callsign is sent. The calling station will respond with a corrected callsign and optionally the exchange information.

There are two scenarios.

1 - User sends partial call only (using F5 function key)

This condition can easily be created by following these steps:

  1. start a simulation in Single Call mode.
  2. Enter the calling callsign, but change the last letter.
  3. Hit F5 to send the partial callsign.
  4. This will now enter the osNeedCallNr state.
  5. The calling station will send a response with the corrected callsign and optional exchange.

State osNeedCallNr

The following messages are sent after receiving a partially-correct callsign from the user without an exchange. The first column shows the original messages and the second column shows the revised messages.

Original Freq Revised (v1.85) Freq
DE <call> 50% DE <call> 16.7% (1/6)
DE <call> <call> 50% DE <call> <call> 16.7% (1/6)
. . <call> <call> 16.7% (1/6)
. . <call> <call> <exch> 16.7% (1/6)
. . <call> <exch> 33.3% (1/3)

The following is the new code showing the responses for this case (osNeedCallNr).

    // osNeedCallNr - They have sent an almost-correct callsign.
     osNeedCallNr:
      if (RunMode = rmHst) then
        Result := msgDeMyCall1
      else
        case Trunc(R2*6) of
          0: Result := msgDeMyCall1;    // DE <my>
          1: Result := msgDeMyCall2;    // DE <my> <my>
          2: Result := msgMyCall2;      // <my> <my>
          3: Result := msgMyCallNr2;    // <my> <my> <exch>
          4,5: Result := msgMyCallNr1;  // <my> <exch>
        end;

2 - User sends partial call and their exchange (using Enter key)

This condition can easily be created by following these steps:

  1. start a simulation in Single Call mode.
  2. Enter the calling callsign, but change the last letter.
  3. Hit Enter to send the partial callsign and exchange
  4. This will now enter the osNeedCall state.
  5. The calling station will send a response with the corrected callsign and exchange.

State osNeedCall

The following messages are sent after receiving a partially-correct callsign and exchange information from the user. The first column shows the original messages and the second column shows the revised messages. Notice the revised messages are now always sending the exchange. I suppose I should leave out the exchange on one of these.

Original Freq Revised (v1.85) Freq
DE <call> <exch> 50% DE <call> <exch> 16.7% (1/6)
DE <call> <call> <exch> 25% DE <call> <call> <exch> 16.7% (1/6)
<call> <call> <exch> 25% <call> <call> <exch> 33.3% (1/3)
. . <call> <exch> 33.3% (1/3)

The following is the new code showing the responses for this case (osNeedCall).

    // osNeedCall - I have their Exch (NR), but need user to correct my call.
    osNeedCall:
      if (RunMode = rmHst) then
        Result := msgDeMyCallNr1
      else
        case Trunc(R2*6) of
          0: Result := msgDeMyCallNr1;  // DE <my> <exch>
          1: Result := msgDeMyCallNr2;  // DE <my> <my> <exch>
          2,3: Result := msgMyCallNr2;  // <my> <my> <exch>
          4,5: Result := msgMyCallNr1;  // <my> <exch>
        end;