Biblioteca .NET pentru recunoasterea indicativelor de radioamator in text decodat (RTTY, CW, ...): forma indicativului, tara DXCC (cty.dat), confirmarea din MASTER.SCP si lista statiilor auzite. Fara interfata grafica, ca sa poata fi folosita in toate aplicatiile noastre (RttyDecoder si altele).
- tinte:
netstandard2.0sinet8.0 - datele (cty.dat, MASTER.SCP) sunt incluse in biblioteca; optional se actualizeaza saptamanal
- aceleasi rezultate ca aplicatia Android (Yaesu-FTX1-CAT-Control), verificate de teste
| Forma | Exemplu | Tara cautata dupa |
|---|---|---|
| indicativ simplu (regula din Android) | YO9VA, 3B8CF, K1A |
indicativ |
| prefix litera+cifra urmat de cifra, doar daca cty.dat are prefixul | S50A, A61BK, E73A, T77C, 3DA0RS |
indicativ |
sufix neutru /P /M /QRP /A /B /LH /J /R |
YO9VA/P |
indicativ |
maritim / aeronautic mobil /MM /AM |
OH2BH/MM |
- (fara tara) |
| prefix de tara inainte | DL/YO9VA, KH6/W6IWI/P |
prefix (DL, KH6) |
| alt district | W6IWI/4 |
W4IWI |
| prefix de tara dupa | DL1ABC/EA8 |
EA8 |
Formele din randul al doilea seamana cu zgomotul de decodare (I00P, K00A), de aceea se
accepta doar cand cty.dat confirma un prefix de cel putin 2 caractere (S5, A6, E7, ...; 3 pentru
3DA). Callsign.TryParse(word, out c) fara cty.dat ramane exact regula Android; CallsignRecognizer
si Callsign.TryParse(word, cty, out c) folosesc si confirmarea.
Punctuatia din jurul cuvantului ((YO9VA),) e ignorata. Indicativele din cty.dat cu intrare exacta
(=4U1ITU, zone suprascrise) au prioritate fata de prefix.
using HamCallsign;
// o data, la pornire (copiile din cache daca exista si sunt valide, altfel cele incluse)
string cache = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "YO9VA", "MyApp");
var data = ReferenceData.Load(cache);
_ = ReferenceData.UpdateAsync(cache); // in fundal; datele noi se folosesc la urmatoarea pornire
var recognizer = data.CreateRecognizer();
recognizer.MyCall = "YO9VA"; // indicativul propriu: recunoscut, dar nu intra in lista
// un singur cuvant
var m = recognizer.Recognize("DL/W6IWI");
// m.Entity.Name = "Fed. Rep. of Germany", m.Entity.Continent = "EU", m.Status = FormatOnly (W6IWI nu e in MASTER.SCP)
// text pe bucati, exact cum vine din decodor
var tracker = new CallsignTracker(recognizer);
tracker.CallsignRecognized += match => { /* evidentiere in terminal */ };
tracker.StationHeard += (station, isNew) => { /* actualizare lista */ };
tracker.Feed("CQ CQ DE W6I");
tracker.Feed("WI W6IWI K\n");
IReadOnlyList<HeardStation> stations = tracker.Stations; // cele mai recente primele
File.WriteAllText("statii.csv", tracker.ToCsv());Pentru evidentierea in terminal, CallsignHighlighter imparte fluxul in bucati de afisat:
var hl = new CallsignHighlighter(recognizer);
foreach (var seg in hl.Feed(chunk))
if (seg.Match is { } m) AddColored(seg.Text, m.Status); // indicativ (fara punctuatie)
else AddPlain(seg.Text); // restul, inclusiv spatii si '\n'
ShowProvisional(hl.PendingWord); // cuvantul neterminat, decis la urmatoarea bucataCallsignStatus:
Known- forma valida si indicativul e in MASTER.SCP sau in lista LoTW (match.KnownInspune in care)FormatOnly- forma valida, dar necunoscut (poate fi corect sau o eroare de decodare)Own- indicativul propriu
MASTER.SCP si LoTW se folosesc doar ca semn de incredere; biblioteca nu corecteaza niciodata textul.
ReferenceData.UpdateAsync(folder) descarca cty.dat (country-files.com) si MASTER.SCP
(supercheckpartial.com) daca cele din folder sunt mai vechi de 7 zile, si lista utilizatorilor LoTW
(lotw-user-activity.csv, ARRL) daca e mai veche de o zi - cu If-Modified-Since, deci o lista
neschimbata nu se mai descarca. Din LoTW se pastreaza doar indicativele active in ultimii 3 ani
(~120.000). LoTW nu e inclusa in biblioteca (~6 MB): pana la prima descarcare lista e goala
(includeLotw: false o sare). Un fisier se inlocuieste doar
daca cel nou e valid, scrierea e atomica, iar la orice eroare (fara internet etc.) nu se intampla
nimic - nu arunca exceptii.
Separat, pentru ca are nevoie de cont si de internet: QRZ.com (serviciul XML) si HamQTH.com
(gratuit). CallsignVerifier verifica intai listele locale, apoi QRZ.com, apoi HamQTH.com, o singura
data pe indicativ si sesiune, cu cautarile pe rand:
using HamCallsign.Online;
var verifier = new CallsignVerifier(c => recognizer.KnownIn(c) != KnownSources.None);
verifier.QrzUsername = "..."; verifier.QrzPassword = "..."; // optional
verifier.HamQthUsername = "..."; verifier.HamQthPassword = "..."; // optional
verifier.VerificationUpdated += Redraw; // pe firul UI
verifier.RequestVerification(match.Callsign); // nu se asteapta
var state = verifier.GetState(match.Callsign); // Pending / Confirmed / NotFound / Unavailable
var info = verifier.GetResult(match.Callsign); // nume, oras, tara, grid (daca l-a gasit online)Se lucreaza pe indicativul de baza: YO9VA/P si DL/YO9VA folosesc raspunsul pentru YO9VA.
Ca submodul git:
git submodule add https://github.com/Eugen68/HamCallsign.git external/HamCallsign<ProjectReference Include="..\..\external\HamCallsign\src\HamCallsign\HamCallsign.csproj" />Mai tarziu si ca pachet NuGet (dotnet pack src/HamCallsign; CI-ul publica .nupkg ca artefact).
dotnet testtests/HamCallsign.Tests/Golden/android_callsigns.txt contine raspunsurile aplicatiei Android
(CwTextRepair.esteIndicativValid si CtyDatabase.cauta) pentru 79.018 cuvinte, generate cu
patch-ul tools/android-patch/callsign-prefix.patch aplicat (prefixele S5, A6, E7, ...). Daca regula se
schimba in Android, fisierul se regenereaza cu:
tools/android-golden/regenerate.sh /cale/catre/Yaesu-FTX1-CAT-ControlMIT, vezi LICENSE. Datele terte: THIRD-PARTY-NOTICES.md.