Removed RBNThread to see what is the effect.

Now connects ALSO WITH QT5  !!!
Code cleanups
Defined localdbg with value -16 to see debug only from this form
This commit is contained in:
OH1KH 2022-01-14 14:56:10 +02:00
parent 696e372dc4
commit f5d72ff423
2 changed files with 106 additions and 302 deletions

View File

@ -228,10 +228,10 @@ object frmGrayline: TfrmGrayline
Left = 158
Top = 32
end
object tmrRemoveDots: TTimer
Enabled = False
object tmrSpotDots: TTimer
Interval = 1000
OnTimer = tmrRemoveDotsTimer
Enabled = False
OnTimer = tmrSpotDotsTimer
Left = 40
Top = 32
end

View File

@ -22,27 +22,6 @@ type
const
MAX_ITEMS = 300;
type
TRBNThread = class(TThread)
private
lTelnet : TLTelnetClientComponent;
login : String;
watchFor : String;
delAfter : Word;
cs : TRTLCriticalSection;
function ConnectToRBN : Boolean;
function GetEmptyPos : Word;
function SpotterExists(spotter : String) : Word;
procedure lConnect(aSocket: TLSocket);
procedure lDisconnect(aSocket: TLSocket);
procedure lReceive(aSocket: TLSocket);
procedure AddToList(spot : String);
protected
procedure Execute; override;
end;
type
@ -64,7 +43,7 @@ type
sbtnGrayLine : TSpeedButton;
tmrAutoConnect : TTimer;
tmrGrayLine: TTimer;
tmrRemoveDots: TTimer;
tmrSpotDots: TTimer;
procedure acConnectExecute(Sender : TObject);
procedure acLinkToRbnMonitorExecute(Sender: TObject);
procedure acShowStatusBarExecute(Sender : TObject);
@ -82,12 +61,20 @@ type
procedure sbtnGrayLineClick(Sender : TObject);
procedure tmrAutoConnectTimer(Sender : TObject);
procedure tmrGrayLineTimer(Sender: TObject);
procedure tmrRemoveDotsTimer(Sender: TObject);
procedure tmrSpotDotsTimer(Sender: TObject);
private
lTelnet : TLTelnetClientComponent;
csRBN : TRTLCriticalSection;
RBNThread : TRBNThread;
login : String;
delAfter : integer;
watchFor : String;
LocalDbg : boolean;
procedure lConnect(aSocket: TLSocket);
procedure lDisconnect(aSocket: TLSocket);
procedure lReceive(aSocket: TLSocket);
function ConnectToRBN : Boolean;
public
RBNSpotList : array[1..MAX_ITEMS] of TRBNList;
@ -114,19 +101,17 @@ implementation
uses dUtils, dData, uMyIni, dDXCluster, fNewQSO;
procedure TRBNThread.lConnect(aSocket: TLSocket);
procedure TfrmGrayline.lConnect(aSocket: TLSocket);
begin
frmGrayline.rbn_status := 'Connected';
Synchronize(@frmGrayline.SynRBN)
rbn_status := 'Connected';
end;
procedure TRBNThread.lDisconnect(aSocket: TLSocket);
procedure TfrmGrayline.lDisconnect(aSocket: TLSocket);
begin
frmGrayline.rbn_status := 'Disconnected';
Synchronize(@frmGrayline.SynRBN)
rbn_status := 'Disconnected';
end;
procedure TRBNThread.lReceive(aSocket: TLSocket);
procedure TfrmGrayline.lReceive(aSocket: TLSocket);
const
CR = #13;
LF = #10;
@ -147,19 +132,19 @@ begin
begin
tmp := Copy(Buffer, sStart, sStop - sStart);
tmp := trim(tmp);
if dmData.DebugLevel >=1 then Writeln(tmp);
if LocalDbg then Writeln('Rcvd:',tmp);
itmp := Pos('DX DE',UpperCase(tmp));
if (itmp > 0) or TryStrToFloat(copy(tmp,1,Pos(' ',tmp)-1),f) then
begin
//Writeln('RBN:',tmp);
AddToList(tmp);
if LocalDbg then Writeln(' RBN:',tmp);
AddSpotToList(tmp);
end
else begin
if (Pos('LOGIN',UpperCase(tmp)) > 0) and (cqrini.ReadString('RBN','login','') <> '') then
lTelnet.SendMessage(cqrini.ReadString('RBN','login','')+#13+#10);
if (Pos('please enter your call',LowerCase(tmp)) > 0) and (cqrini.ReadString('RBN','login','') <> '') then
lTelnet.SendMessage(cqrini.ReadString('RBN','login','')+#13+#10);
//Writeln('RBN:',tmp)
if LocalDbg then Writeln('RBN:',tmp)
end;
sStart := sStop + 1;
if sStart > Length(Buffer) then
@ -173,7 +158,7 @@ begin
lTelnet.CallAction
end;
function TRBNThread.GetEmptyPos : Word;
function TfrmGrayline.GetEmptyPos : Word;
var
i : Integer;
begin
@ -188,7 +173,7 @@ begin
end
end;
function TRBNThread.SpotterExists(spotter : String) : Word;
function TfrmGrayline.SpotterExists(spotter : String) : Word;
var
i : Integer;
begin
@ -203,145 +188,7 @@ begin
end
end;
procedure TRBNThread.AddToList(spot : String);
procedure GetRealCoordinate(lat,long : String; var latitude, longitude: Currency);
var
s,d : String;
begin
s := lat;
d := long;
if ((Length(s)=0) or (Length(d)=0)) then
begin
longitude := 0;
latitude := 0;
exit
end;
if s[Length(s)] = 'S' then
s := '-' +s ;
s := copy(s,1,Length(s)-1);
if pos('.',s) > 0 then
s[pos('.',s)] := FormatSettings.DecimalSeparator;
if not TryStrToCurr(s,latitude) then
latitude := 0;
if d[Length(d)] = 'W' then
d := '-' + d ;
d := copy(d,1,Length(d)-1);
if pos('.',d) > 0 then
d[pos('.',d)] := FormatSettings.DecimalSeparator;
if not TryStrToCurr(d,longitude) then
longitude := 0;
if dmData.DebugLevel>=4 then
begin
//Writeln('Lat: ',latitude);
//Writeln('Long: ',longitude);
end;
end;
procedure ParseSpot(spot : String; var spotter, dxstn, freq, mode, stren : String);
var
i : Integer;
y : Integer;
b : Array of String[50];
p : Integer=0;
begin
SetLength(b,1);
for i:=1 to Length(spot) do
begin
if spot[i]<>' ' then
b[p] := b[p]+spot[i]
else begin
if (b[p]<>'') then
begin
inc(p);
SetLength(b,p+1)
end
end
end;
spotter := b[2];
i := pos('-', spotter);
if i > 0 then
spotter := copy(spotter, 1, i-1);
dxstn := b[4];
freq := b[3];
mode := b[5];
stren := b[6]
end;
var
spotter : String;
call : String;
stren : String;
freq : String;
lat : String;
long : String;
index : Word;
band : String;
tmp : Integer;
wCall : String;
mode : String;
latitude, longitude: Currency;
begin
ParseSpot(spot, spotter, call, freq, mode, stren);
if watchFor<>'' then
begin
if Pos('*',watchFor) > 0 then //ZL*
begin
wCall := copy(watchFor,1,Pos('*',watchFor)-1);
if (Pos(wCall,call) <> 1) then //all callsign started with ZL
exit
end
else begin
if (call <> watchFor) then exit;
end
end;
if dmData.DebugLevel>=1 then
begin
Writeln('Spotter:',spotter,'*');
Writeln('Signal: ',stren,'*');
Writeln('*Freq: ',freq,'*')
end;
dmDXCluster.id_country(spotter,lat,long);
index := SpotterExists(spotter);
if index = 0 then //spotter doesn't exist, we need new position
index := GetEmptyPos;
if index = 0 then
begin
Writeln('CRITICAL ERROR! THIS SHOULD NOT HAPPEN, RBN LIST IS FULL');
exit
end;
band := dmDXCluster.GetBandFromFreq(freq,True);
frmGrayline.RBNSpotList[index].band := band;
frmGrayline.RBNSpotList[index].spotter := spotter;
frmGrayline.RBNSpotList[index].time := now;
if TryStrToInt(stren,tmp) then
frmGrayline.RBNSpotList[index].strengt := tmp
else
frmGrayline.RBNSpotList[index].strengt := 0;
GetRealCoordinate(lat,long,latitude, longitude);
frmGrayline.RBNSpotList[index].lat := latitude;
frmGrayline.RBNSpotList[index].long := longitude;
if dmData.DebugLevel>=1 then
begin
Writeln('call: ',call);
Writeln('spotter:',spotter);
Writeln('stren: ',stren);
Writeln('freq: ',freq);
Writeln('band: ',dmDXCluster.GetBandFromFreq(freq,True));
Writeln('Lat: ',lat);
Writeln('Long: ',long)
end;
end;
function TRBNThread.ConnectToRBN : Boolean;
function TfrmGrayline.ConnectToRBN : Boolean;
var
server : String;
port : Integer;
@ -356,7 +203,7 @@ begin
if not TryStrToInt(tmp,port) then
port := 7000; //default value
if dmData.DebugLevel>=1 then Writeln('Server:',server,' Port:',port);
if LocalDbg then Writeln('Server:',server,' Port:',port);
lTelnet.OnConnect := @lConnect;
lTelnet.OnDisconnect := @lDisconnect;
@ -369,41 +216,11 @@ begin
on E : Exception do
begin
Result := False;
if dmData.DebugLevel>=1 then Writeln('Can not connect to RBN! ',E.Message)
if LocalDbg then Writeln('Can not connect to RBN! ',E.Message)
end
end
end;
procedure TRBNThread.Execute;
begin
if not ConnectToRBN then
begin
if dmData.DebugLevel>=1 then Writeln('Can not connect to RBN!');
FreeAndNil(lTelnet);
exit
end;
InitCriticalSection(cs);
while not Terminated do
begin
EnterCriticalsection(cs);
try
login := cqrini.ReadString('RBN','login','');
watchFor := cqrini.ReadString('RBN','watch','');
finally
LeaveCriticalsection(cs)
end;
//RemoveOldSpots; done now by tmrRemoveDots
Synchronize(@frmGrayline.SynRBN);
sleep(1000)
end;
lTelnet.Disconnect(true);
sleep(100);
FreeAndNil(lTelnet);
frmGrayline.rbn_status :='Disconnected';
DoneCriticalsection(cs)
end;
procedure TfrmGrayline.acShowStatusBarExecute(Sender : TObject);
begin
if acShowStatusBar.Checked then
@ -425,16 +242,17 @@ begin
else begin
if acConnect.Caption = 'Disconnect' then
begin
RBNThread.Terminate;
acConnect.Caption := 'Connect to RBN';
sbGrayLine.SimpleText := rbn_status;//'Disconnected';
pumLinkToRBNMonitor.Enabled:=true;
if ltelnet <> nil then
Begin
lTelnet.Disconnect;
sleep(100);
FreeAndNil(lTelnet);
rbn_status := 'Disconnected';
end;
end
else begin
acLinkToRbnMonitor.Checked :=false;
RBNThread := TRBNThread.Create(True);
RBNThread.FreeOnTerminate := True;
RBNThread.Start
ConnectToRBN;
end
end
end;
@ -448,7 +266,6 @@ begin
rbn_status := 'Linked to RBNMonitor'
else
rbn_status := 'Disconnected';
sbGrayLine.SimpleText := rbn_status;
end;
procedure TfrmGrayline.FormCreate(Sender: TObject);
@ -457,8 +274,7 @@ var
i : Integer;
begin
InitCriticalSection(csRBN);
tmrRemoveDots.Enabled:=false;
RBNThread := nil;
tmrSpotDots.Enabled:=false;
for i:=1 to MAX_ITEMS do
RBNSpotList[i].band := '';
ImageFile := dmData.HomeDir+'images'+PathDelim+'grayline.bmp';
@ -466,6 +282,13 @@ begin
ImageFile := ExpandFileNameUTF8('..'+PathDelim+'share'+PathDelim+'cqrlog'+
PathDelim+'images'+PathDelim+'grayline.bmp');
ob:=new(Pgrayline,init(ImageFile));
//set debug rules for this form
// bit 5, %10000, ---> -16 for routines in this form
LocalDbg := dmData.DebugLevel >= 1 ;
if dmData.DebugLevel < 0 then
LocalDbg := LocalDbg or ((abs(dmData.DebugLevel) and 16) = 16 );
end;
procedure TfrmGrayline.FormShow(Sender: TObject);
@ -479,28 +302,33 @@ begin
tmrGrayLineTimer(nil);
tmrAutoConnect.Enabled := True;
delAfter := cqrini.ReadInteger('RBN','deleteAfter',60);
tmrRemoveDots.Interval:=1000; //remove Spots(DOts) timer will always run 1 sec period.
tmrRemoveDots.Enabled:=true;
tmrSpotDots.Interval:=1000; //remove Spots(DOts) timer will always run 1 sec period.
tmrSpotDots.Enabled:=true;
end;
procedure TfrmGrayline.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
tmrGrayLine.Enabled := False;
tmrAutoConnect.Enabled:=False;
tmrRemoveDots.Enabled:=False;
sleep(100)
tmrSpotDots.Enabled:=False;
if ltelnet <> nil then
Begin
lTelnet.Disconnect;
sleep(100);
FreeAndNil(lTelnet);
end;
RemoveOldSpots(0);
end;
procedure TfrmGrayline.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
if RBNThread<>nil then RBNThread.Terminate;
cqrini.WriteBool('Grayline','Statusbar',sbGrayLine.Visible);
dmUtils.SaveWindowPos(frmGrayline)
end;
procedure TfrmGrayline.FormDestroy(Sender: TObject);
begin
if dmData.DebugLevel>=1 then Writeln('Closing GrayLine window');
if LocalDbg then Writeln('Closing GrayLine window');
dispose(ob,done);
DoneCriticalsection(csRBN)
end;
@ -544,23 +372,25 @@ end;
procedure TfrmGrayline.pumClearAllSpotsClick(Sender: TObject);
begin
tmrRemoveDots.Enabled:=False;
tmrSpotDots.Enabled:=False;
RemoveOldSpots(0);
delAfter := cqrini.ReadInteger('RBN','deleteAfter',60);
tmrRemoveDots.Enabled:=true;
tmrSpotDots.Enabled:=true;
end;
procedure TfrmGrayline.pumWatchForClick(Sender: TObject);
var inpWF:string;
begin
EnterCriticalsection(csRBN);
watchFor := cqrini.ReadString('RBN','watch','');
if InputQuery('Watch for:','', false, watchFor) then
inpWF := cqrini.ReadString('RBN','watch','');
if InputQuery('Watch for:','Enter up- or lowcase callsign or prefix and asterisk like OK2* ', false, inpWF) then
Begin
pumWatchFor.Caption:='Watch for: '+uppercase(watchFor);
cqrini.WriteString('RBN','watch',watchFor);
EnterCriticalsection(csRBN);
watchFor:= uppercase(inpWF);
pumWatchFor.Caption:='Watch for: '+watchFor;
cqrini.WriteString('RBN','watch',watchFor);
LeaveCriticalsection(csRBN);
RemoveOldSpots(0);
end;
LeaveCriticalsection(csRBN);
end;
procedure TfrmGrayline.sbtnGrayLineClick(Sender : TObject);
@ -582,7 +412,7 @@ begin
exit;
end;
if cqrini.ReadBool('RBN','AutoConnect',False) and (cqrini.ReadString('RBN','login','') <> '')
and (RBNThread = nil) then acConnect.Execute;
and (lTelnet = nil) then acConnect.Execute;
tmrAutoConnect.Enabled:=False; //job is done, nex initiate when FormShow run
end;
@ -592,9 +422,9 @@ begin
Refresh
end;
procedure TfrmGrayline.tmrRemoveDotsTimer(Sender: TObject);
procedure TfrmGrayline.tmrSpotDotsTimer(Sender: TObject);
begin
tmrRemoveDots.Enabled:=false;
tmrSpotDots.Enabled:=false;
dec(delAfter);
if delAfter < 1 then
@ -602,8 +432,22 @@ begin
delAfter := cqrini.ReadInteger('RBN','deleteAfter',60);
RemoveOldSpots(delAfter);
end;
sbGrayLine.SimpleText := rbn_status;
if rbn_status='Connected' then
Begin
acConnect.Caption := 'Disconnect';
pumLinkToRBNMonitor.Enabled:=false;
end
else
Begin
acConnect.Caption := 'Connect to RBN';
pumLinkToRBNMonitor.Enabled:=True;
end;
tmrRemoveDots.Enabled:=true;
SynRBN;
tmrSpotDots.Enabled:=true;
end;
procedure TfrmGrayline.kresli;
@ -655,18 +499,6 @@ var
c : TColor;
begin
sbGrayLine.SimpleText := rbn_status;
if rbn_status='Connected' then
Begin
acConnect.Caption := 'Disconnect';
pumLinkToRBNMonitor.Enabled:=false;
end
else
Begin
acConnect.Caption := 'Connect to RBN';
pumLinkToRBNMonitor.Enabled:=True;
end;
ob^.body_smaz;
for i:=1 to MAX_ITEMS do
begin
@ -678,13 +510,14 @@ begin
if band<>RBNSpotList[i].band then
Continue
end;
{
Writeln('Syn:spotter:',RBNSpotList[i].spotter);
Writeln('Syn:stren: ',RBNSpotList[i].strengt);
Writeln('Syn:band: ',RBNSpotList[i].band);
Writeln('Syn:lat: ',RBNSpotList[i].lat);
Writeln('Syn:long: ',RBNSpotList[i].long);
}
if LocalDbg then
begin
Writeln('Syn:spotter:',RBNSpotList[i].spotter);
Writeln('Syn:stren: ',RBNSpotList[i].strengt);
Writeln('Syn:band: ',RBNSpotList[i].band);
Writeln('Syn:lat: ',RBNSpotList[i].lat);
Writeln('Syn:long: ',RBNSpotList[i].long);
end;
case RBNSpotList[i].strengt of
11..20 : c := cqrini.ReadInteger('RBN','20db',clPurple);
21..30 : c := cqrini.ReadInteger('RBN','30db',clMaroon);
@ -698,36 +531,6 @@ begin
Refresh
end;
function TfrmGrayline.GetEmptyPos : Word;
var
i : Integer;
begin
Result := 0;
for i:= 1 to MAX_ITEMS do
begin
if frmGrayline.RBNSpotList[i].band='' then
begin
Result := i;
break
end
end
end;
function TfrmGrayline.SpotterExists(spotter : String) : Word;
var
i : Integer;
begin
Result := 0;
for i:= 1 to MAX_ITEMS do
begin
if frmGrayline.RBNSpotList[i].spotter=spotter then
begin
Result := i;
break
end
end
end;
procedure TfrmGrayline.RemoveOldSpots(RemoveAfter:integer); //setting RemoveAfter:=0 removes all Spots
var
i : Integer;
@ -783,10 +586,10 @@ procedure TfrmGrayline.AddSpotToList(spot : String);
d[pos('.',d)] := FormatSettings.DecimalSeparator;
if not TryStrToCurr(d,longitude) then
longitude := 0;
if dmData.DebugLevel>=4 then
if LocalDbg then
begin
//Writeln('Lat: ',latitude);
//Writeln('Long: ',longitude);
Writeln('Lat: ',latitude);
Writeln('Long: ',longitude);
end;
end;
@ -834,7 +637,7 @@ begin
end
end;
if dmData.DebugLevel>=1 then
if LocalDbg then
begin
Writeln('Spotter:',spotter,'*');
Writeln('Signal: ',stren,'*');
@ -865,17 +668,18 @@ begin
GetRealCoordinate(lat,long,latitude, longitude);
frmGrayline.RBNSpotList[index].lat := latitude;
frmGrayline.RBNSpotList[index].long := longitude;
if dmData.DebugLevel>=1 then
if LocalDbg then
begin
Write('call: ',call);
Write(' spotter:',spotter);
Write(' stren: ',stren);
Write(' freq: ',freq);
Write(' band: ',dmDXCluster.GetBandFromFreq(freq,True));
Write(' Lat: ',lat);
Writeln(' Long: ',long)
Write('Add call: ',call);
Write('Add spotter:',spotter);
Write('Add stren: ',stren);
Write('Add freq: ',freq);
Write('Add band: ',dmDXCluster.GetBandFromFreq(freq,True));
Write('Add Lat: ',lat);
Writeln('Add Long: ',long)
end;
SynRBN;
end;
end.