wintest screen Pense-bête personnel
Quelques infos et astuces au sujet du logiciel WinTest.
N'a pas vocation à être diffusé

La documentation Wintest est ici : https://docs.win-test.com/wiki/Main_Page

Enregistreur audio
Télécharger le codeur gratuit Lame : http://www.free-codecs.com/LAME_ACM_Codec_download.htm
Le décompacter dans un dossier C:\Lame

Enregistrez Sous Windows 10 :
En mode CMD administrateur : 

C:\Windows\SysWOW64\rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 0 C:\LAME\LameACM.inf

Base de données contest REF
Télécharger le fichier REF.DTB : http://download.win-test.com/databases/

Le copier dans le dossier : C:\ProgramData\Win-Test\databases

Scripts LUA
La documentation est ici : http://download.win-test.com/v4/lua/LuaApiDoc.txt
Les constantes sont ici : http://download.win-test.com/v4/lua/constants.wts
Les scripts sont à placer dans le dossier scripts, chez moi : C:\ProgramData\Win-Test\scripts

Mes scripts :
OnBandChange.wts. A chaque changement de bande, on peut déclencher une action. Ici, on change la puissance par bande afin de s'adapter à la puissance d'excitation du PA et on envoie une commande personnalisée pour fonctionner avec mon script de DXcluster (voir mon Github).

Protocole UDP entre WT et WT-DXcluster
Ayant eu besoin de faire dialoguer avec WT un script Python que j'ai écrit pour envoyer des spots, j'ai eu à décortiquer le protocole utilisé par Wintest. (merci à F6FVY pour son aide)

La trame est envoyée avec un checksum propre à Wintest.
On fait la somme du contenu de la trame, on ne garde que l'octet de poids faible et on met le bit de poids le plus fort à 1

Par exemple, une trame :
trame UDP WT

La somme de "0x52 0x43 0x56 ......... 0x22" est :  0x121F

On garde l'octet de poids faible, donc 0x1F
on met le bit de poids fort à 1 : 0x1F | 0x80 = 0x9F
le checksum est donc toujours un octet compris entre 0x80 et 0xFF
on rajoute de checksum à la fin de la trame, soit : "0x52 0x43 0x56 ......... 0x22 0x9F" 

En Python, la fonction que j'ai écrite :

   #############################################
    # calculate spot checksum
    #############################################
    def checksum(self,spot):
        sum = 0                                         # sum of all char in string
        for i in spot:
            sum += ord(i)                               # sum in int10
        sumMSB = (sum % 128) + 128                      # get LSByte and force MSBit to 1
        checksum = sumMSB.to_bytes(1,byteorder='big')   # convert to bytes format to be added to frame
        return checksum

Protocole UDP broadcast STATUS

Les trames sont de la forme : b'STATUS: "STN1" "STN2" 0 7 1 0 212900 "0" 0 "1" 214400 "TK5EP"\xd3\x00'
ce qui correspond à :
STATUS: "StationName" "ToStation" <StationFlags> <BandID> <ModeID><ActiveRadio> <FreqR1> <ManualFreqR1> <FreqR2> <ManualFreqR2> <PassFreq>"OpCallsign"

StationFlags :
STATION_RUN     0                   // Default
STATION_RUN2    1                  // Bit 0 : If set : RUN2, if not set RUN or RUN1
STATION_MULTI   (1 << 1)        // Bit 1 : 2 - If set : Multiplier station
STATION_SUPPORT (1 << 2)   // Bit 2 : 4 - If set : Support
(inband) / Partner station

BandID:
2KM       0
160        1
80          2
40          3
30          4
20          5
17          6
15          7
12          8
10          9
50          10
70          11
144        12
220        13
432        14
900        15
1296      16
2300      17
3400      18
5700      19
10000    20
24000    21
47000    22
76000    23
120000  24
145000  25
241000  26
60          27

ModeID:
MODE_CW     0
MODE_SSB    1
MODE_RTTY  2
MODE_FM      3
MODE_PSK    4
MODE_PKT    5
MODE_FT8     6
MODE_FT4     7

ActiveRadio :
Radio_1 = 0
Radio_2 = 1
Les fréquences sont exprimées en centaines de Hz. Ex 14123.4 = 141234