RBN monitor added

This commit is contained in:
Petr Hlozek 2015-06-01 06:09:58 +02:00
parent eb01d87462
commit 13dfe1717c
31 changed files with 3152 additions and 741 deletions

BIN
images/connect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

BIN
images/disconnect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

BIN
images/font.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 B

BIN
images/go-bottom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

BIN
images/help.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 B

BIN
images/rbn_list.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 B

View File

@ -7,6 +7,7 @@ Legend:
1.9.1
+ support sending CW via HamLib library added
+ CW type window is not modal window anymore
+ RBN monitor added
- Export configuration of opened log doesn't reflect recent changes - fixed
- station that were not added to DX cluster window (because of filter criteria) were added to bandmap - fixed

View File

@ -82,7 +82,7 @@
<MinVersion Major="1" Minor="2" Release="1" Valid="True"/>
</Item10>
</RequiredPackages>
<Units Count="83">
<Units Count="86">
<Unit0>
<Filename Value="cqrlog.lpr"/>
<IsPartOfProject Value="True"/>
@ -696,6 +696,30 @@
<ResourceBaseClass Value="Form"/>
<UnitName Value="fBandMapWatch"/>
</Unit82>
<Unit83>
<Filename Value="fRbnFilter.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmRbnFilter"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="fRbnFilter"/>
</Unit83>
<Unit84>
<Filename Value="fRbnMonitor.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmRbnMonitor"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="fRbnMonitor"/>
</Unit84>
<Unit85>
<Filename Value="fRbnServer.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmRbnServer"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="fRbnServer"/>
</Unit85>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -18,7 +18,7 @@ uses
fRebuildMembStat,uVersion,fAbout,fChangelog,fBigSquareStat,feQSLDownload,
feQSLUpload,fSOTAExport, fNewQSODefValues, fQSLExpPref, fRotControl,
dLogUpload, fLogUploadStatus,frCWKeys, fCallAlert, fNewCallAlert,
fConfigStorage;
fConfigStorage, fRbnFilter, fRbnMonitor, fRbnServer;
var
Splash : TfrmSplash;
@ -54,6 +54,7 @@ begin
Application.CreateForm(TfrmRotControl, frmRotControl);
Application.CreateForm(TfrmLogUploadStatus, frmLogUploadStatus);
Application.CreateForm(TfrmCWType, frmCWType);
Application.CreateForm(TfrmRbnMonitor, frmRbnMonitor);
Splash.Update;
application.ProcessMessages;

Binary file not shown.

View File

@ -7,9 +7,9 @@ object dmDXCC: TdmDXCC
VerticalOffset = 377
Width = 434
object Q: TSQLQuery
FieldDefs = <>
BeforeOpen = QBeforeOpen
Transaction = trQ
ReadOnly = False
Params = <>
ParseSQL = False
left = 168
@ -22,8 +22,8 @@ object dmDXCC: TdmDXCC
top = 80
end
object Q1: TSQLQuery
FieldDefs = <>
Transaction = trQ1
ReadOnly = False
Params = <>
ParseSQL = False
left = 112
@ -36,8 +36,8 @@ object dmDXCC: TdmDXCC
top = 80
end
object qDXCCRef: TSQLQuery
FieldDefs = <>
Transaction = trDXCCRef
ReadOnly = False
Params = <>
ParseSQL = False
left = 40
@ -49,19 +49,19 @@ object dmDXCC: TdmDXCC
left = 40
top = 80
end
object dsrValid: TDatasource
object dsrValid: TDataSource
DataSet = qValid
left = 304
top = 80
end
object dsrDeleted: TDatasource
object dsrDeleted: TDataSource
DataSet = qDeleted
left = 304
top = 24
end
object qValid: TSQLQuery
FieldDefs = <>
Transaction = trValid
ReadOnly = False
Params = <>
left = 376
top = 80
@ -79,7 +79,7 @@ object dmDXCC: TdmDXCC
top = 24
end
object qDeleted: TSQLQuery
ReadOnly = False
FieldDefs = <>
Params = <>
ParseSQL = False
left = 376

View File

@ -1,22 +1,24 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TdmDXCC','FORMDATA',[
'TPF0'#7'TdmDXCC'#6'dmDXCC'#8'OnCreate'#7#16'DataModuleCreate'#9'OnDestroy'#7
+#17'DataModuleDestroy'#14'OldCreateOrder'#8#6'Height'#3#214#0#16'HorizontalO'
+'ffset'#3#178#2#14'VerticalOffset'#3'y'#1#5'Width'#3#178#1#0#9'TSQLQuery'#1
+'Q'#10'BeforeOpen'#7#11'QBeforeOpen'#11'Transaction'#7#3'trQ'#8'ReadOnly'#8#6
+'Params'#14#0#8'ParseSQL'#8#4'left'#3#168#0#3'top'#2#24#0#0#15'TSQLTransacti'
+'on'#3'trQ'#6'Active'#8#6'Action'#7#6'caNone'#4'left'#3#168#0#3'top'#2'P'#0#0
+#9'TSQLQuery'#2'Q1'#11'Transaction'#7#4'trQ1'#8'ReadOnly'#8#6'Params'#14#0#8
+'ParseSQL'#8#4'left'#2'p'#3'top'#2#24#0#0#15'TSQLTransaction'#4'trQ1'#6'Acti'
+'ve'#8#6'Action'#7#6'caNone'#4'left'#2'p'#3'top'#2'P'#0#0#9'TSQLQuery'#8'qDX'
+'CCRef'#11'Transaction'#7#9'trDXCCRef'#8'ReadOnly'#8#6'Params'#14#0#8'ParseS'
+'QL'#8#4'left'#2'('#3'top'#2#24#0#0#15'TSQLTransaction'#9'trDXCCRef'#6'Activ'
+'e'#8#6'Action'#7#6'caNone'#4'left'#2'('#3'top'#2'P'#0#0#11'TDatasource'#8'd'
+'srValid'#7'DataSet'#7#6'qValid'#4'left'#3'0'#1#3'top'#2'P'#0#0#11'TDatasour'
+'ce'#10'dsrDeleted'#7'DataSet'#7#8'qDeleted'#4'left'#3'0'#1#3'top'#2#24#0#0#9
+'TSQLQuery'#6'qValid'#11'Transaction'#7#7'trValid'#8'ReadOnly'#8#6'Params'#14
+#0#4'left'#3'x'#1#3'top'#2'P'#0#0#15'TSQLTransaction'#7'trValid'#6'Active'#8
+#6'Action'#7#6'caNone'#4'left'#3#216#0#3'top'#2'P'#0#0#15'TSQLTransaction'#9
+'trDeleted'#6'Active'#8#6'Action'#7#6'caNone'#4'left'#3#221#0#3'top'#2#24#0#0
+#9'TSQLQuery'#8'qDeleted'#8'ReadOnly'#8#6'Params'#14#0#8'ParseSQL'#8#4'left'
+#3'x'#1#3'top'#2#24#0#0#0
+'Q'#9'FieldDefs'#14#0#10'BeforeOpen'#7#11'QBeforeOpen'#11'Transaction'#7#3't'
+'rQ'#6'Params'#14#0#8'ParseSQL'#8#4'left'#3#168#0#3'top'#2#24#0#0#15'TSQLTra'
+'nsaction'#3'trQ'#6'Active'#8#6'Action'#7#6'caNone'#4'left'#3#168#0#3'top'#2
+'P'#0#0#9'TSQLQuery'#2'Q1'#9'FieldDefs'#14#0#11'Transaction'#7#4'trQ1'#6'Par'
+'ams'#14#0#8'ParseSQL'#8#4'left'#2'p'#3'top'#2#24#0#0#15'TSQLTransaction'#4
+'trQ1'#6'Active'#8#6'Action'#7#6'caNone'#4'left'#2'p'#3'top'#2'P'#0#0#9'TSQL'
+'Query'#8'qDXCCRef'#9'FieldDefs'#14#0#11'Transaction'#7#9'trDXCCRef'#6'Param'
+'s'#14#0#8'ParseSQL'#8#4'left'#2'('#3'top'#2#24#0#0#15'TSQLTransaction'#9'tr'
+'DXCCRef'#6'Active'#8#6'Action'#7#6'caNone'#4'left'#2'('#3'top'#2'P'#0#0#11
+'TDataSource'#8'dsrValid'#7'DataSet'#7#6'qValid'#4'left'#3'0'#1#3'top'#2'P'#0
+#0#11'TDataSource'#10'dsrDeleted'#7'DataSet'#7#8'qDeleted'#4'left'#3'0'#1#3
+'top'#2#24#0#0#9'TSQLQuery'#6'qValid'#9'FieldDefs'#14#0#11'Transaction'#7#7
+'trValid'#6'Params'#14#0#4'left'#3'x'#1#3'top'#2'P'#0#0#15'TSQLTransaction'#7
+'trValid'#6'Active'#8#6'Action'#7#6'caNone'#4'left'#3#216#0#3'top'#2'P'#0#0
+#15'TSQLTransaction'#9'trDeleted'#6'Active'#8#6'Action'#7#6'caNone'#4'left'#3
+#221#0#3'top'#2#24#0#0#9'TSQLQuery'#8'qDeleted'#9'FieldDefs'#14#0#6'Params'
+#14#0#8'ParseSQL'#8#4'left'#3'x'#1#3'top'#2#24#0#0#0
]);

View File

@ -102,6 +102,8 @@ type
procedure LoadDXCCRefArray;
procedure LoadExceptionArray;
procedure RunCallAlertCmd(call,band,mode,freq : String);
end;
var
@ -1218,6 +1220,9 @@ begin
end
end;
initialization
{$I dDXCluster.lrs}

View File

@ -858,12 +858,23 @@ object dmData: TdmData
object qBandMapFil: TSQLQuery
FieldDefs = <>
Params = <>
left = 269
top = 390
left = 256
top = 488
end
object trBandMapFil: TSQLTransaction
Active = False
left = 269
top = 448
left = 256
top = 424
end
object qRbnMon: TSQLQuery
FieldDefs = <>
Params = <>
left = 176
top = 15
end
object trRbnMon: TSQLTransaction
Active = False
left = 256
top = 16
end
end

View File

@ -320,6 +320,8 @@ LazarusResources.Add('TdmData','FORMDATA',[
+'efault-character-set=utf8'#6#0#0#10'Terminator'#6#1';'#13'CommentsinSQL'#9
+#10'UseSetTerm'#9#9'UseCommit'#9#10'UseDefines'#9#4'left'#3#200#1#3'top'#3
+#208#0#0#0#9'TSQLQuery'#11'qBandMapFil'#9'FieldDefs'#14#0#6'Params'#14#0#4'l'
+'eft'#3#13#1#3'top'#3#134#1#0#0#15'TSQLTransaction'#12'trBandMapFil'#6'Activ'
,'e'#8#4'left'#3#13#1#3'top'#3#192#1#0#0#0
+'eft'#3#0#1#3'top'#3#232#1#0#0#15'TSQLTransaction'#12'trBandMapFil'#6'Active'
,#8#4'left'#3#0#1#3'top'#3#168#1#0#0#9'TSQLQuery'#7'qRbnMon'#9'FieldDefs'#14#0
+#6'Params'#14#0#4'left'#3#176#0#3'top'#2#15#0#0#15'TSQLTransaction'#8'trRbnM'
+'on'#6'Active'#8#4'left'#3#0#1#3'top'#2#16#0#0#0
]);

View File

@ -102,6 +102,8 @@ type
scQSLExport : TSQLScript;
scMySQLConfig: TSQLScript;
qBandMapFil: TSQLQuery;
qRbnMon: TSQLQuery;
trRbnMon: TSQLTransaction;
trBandMapFil: TSQLTransaction;
tmrDBPing: TTimer;
trCQRLOG: TSQLTransaction;
@ -161,7 +163,7 @@ type
aProf : Array of TExpProfile;
aSCP : Array of String[20];
MySQLProcess : TProcess;
csPreviousQSO : TRTLCriticalSection;
fMySQLVersion : Currency;
function FindLib(const Path,LibName : String) : String;
@ -190,6 +192,8 @@ type
}
MainCon : TSQLConnection;
BandMapCon : TSQLConnection;
RbnMonCon : TSQLConnection;
eQSLUsers : Array of ShortString;
CallArray : Array [0..MaxCall] of String[20];
IsFilter : Boolean;
@ -266,7 +270,9 @@ type
function BandModFromFreq(freq : String;var mode,band : String) : Boolean;
function TriggersExistsOnCqrlog_main : Boolean;
function GetLastAllertCallId(const callsign,band,mode : String) : Integer;
function SkipBandMapDateTime(callsign,band,mode,LastDate,LastTime : String) : Boolean;
function CallExistsInLog(callsign,band,mode,LastDate,LastTime : String) : Boolean;
function RbnMonDXCCInfo(adif : Word; band, mode : String;DxccWithLoTW:Boolean; var index : integer) : String;
function RbnCallExistsInLog(callsign,band,mode,LastDate,LastTime : String) : Boolean;
procedure SaveQSO(date : TDateTime; time_on,time_off,call : String; freq : Currency;mode,rst_s,
rst_r, stn_name,qth,qsl_s,qsl_r,qsl_via,iota,pwr : String; itu,waz : Integer;
@ -509,6 +515,8 @@ begin
dmDXCluster.dbDXC.Connected := False;
if dmLogUpload.LogUploadCon.Connected then
dmLogUpload.LogUploadCon.Connected := False;
if RbnMonCon.Connected then
RbnMonCon.Connected := False;
if fMySQLVersion < 5.5 then
begin
@ -516,7 +524,10 @@ begin
(MainCon as TMySQL51Connection).Port := StrToInt(port);
(BandMapCon as TMySQL51Connection).HostName := host;
(BandMapCon as TMySQL51Connection).Port := StrToInt(port)
(BandMapCon as TMySQL51Connection).Port := StrToInt(port);
(RbnMonCon as TMySQL51Connection).HostName := host;
(RbnMonCon as TMySQL51Connection).Port := StrToInt(port)
end
else begin
if fMySQLVersion = 5.5 then
@ -525,14 +536,20 @@ begin
(MainCon as TMySQL55Connection).Port := StrToInt(port);
(BandMapCon as TMySQL55Connection).HostName := host;
(BandMapCon as TMySQL55Connection).Port := StrToInt(port)
(BandMapCon as TMySQL55Connection).Port := StrToInt(port);
(RbnMonCon as TMySQL55Connection).HostName := host;
(RbnMonCon as TMySQL55Connection).Port := StrToInt(port)
end
else begin
(MainCon as TMySQL56Connection).HostName := host;
(MainCon as TMySQL56Connection).Port := StrToInt(port);
(BandMapCon as TMySQL56Connection).HostName := host;
(BandMapCon as TMySQL56Connection).Port := StrToInt(port)
(BandMapCon as TMySQL56Connection).Port := StrToInt(port);
(RbnMonCon as TMySQL56Connection).HostName := host;
(RbnMonCon as TMySQL56Connection).Port := StrToInt(port)
end
end;
MainCon.UserName := user;
@ -543,6 +560,10 @@ begin
BandMapCon.Password := pass;
BandMapCon.DatabaseName := 'information_schema';
RbnMonCon.UserName := user;
RbnMonCon.Password := pass;
RbnMonCon.DatabaseName := 'information_schema';
if fMySQLVersion < 5.5 then
begin
(dmDXCluster.dbDXC as TMySQL51Connection).HostName := host;
@ -588,7 +609,8 @@ begin
MainCon.Connected := True;
dmDXCluster.dbDXC.Connected := True;
dmLogUpload.LogUploadCon.Connected := True;
BandMapCon.Connected := True
BandMapCon.Connected := True;
RbnMonCon.Connected := True;
except
on E : Exception do
begin
@ -705,6 +727,14 @@ begin
qBandMapFil.ExecSQL;
trBandMapFil.Commit;
if trRbnMon.Active then trRbnMon.Rollback;
qRbnMon.Close;
qRbnMon.SQL.Text := 'use ' + fDBName;
if (fDebugLevel>=1) then Writeln(qRbnMon.SQL.Text);
trRbnMon.StartTransaction;
qRbnMon.ExecSQL;
trRbnMon.Commit;
Q.SQL.Text := 'SELECT * FROM cqrlog_config';
trQ.StartTransaction;
l := TStringList.Create;
@ -1059,6 +1089,7 @@ var
MySQLVer : String;
param : String;
begin
InitCriticalSection(csPreviousQSO);
cqrini := nil;
IsSFilter := False;
@ -1178,16 +1209,19 @@ begin
if fMySQLVersion < 5.5 then
begin
MainCon := TMySQL51Connection.Create(self);
BandMapCon := TMySQL51Connection.Create(self)
BandMapCon := TMySQL51Connection.Create(self);
RbnMonCon := TMySQL51Connection.Create(self);
end
else if fMySQLVersion < 5.6 then
begin
MainCon := TMySQL55Connection.Create(self);
BandMapCon := TMySQL55Connection.Create(self)
BandMapCon := TMySQL55Connection.Create(self);
RbnMonCon := TMySQL55Connection.Create(self)
end
else begin
MainCon := TMySQL56Connection.Create(self);
BandMapCon := TMySQL56Connection.Create(self)
BandMapCon := TMySQL56Connection.Create(self);
RbnMonCon := TMySQL56Connection.Create(self)
end;
MainCon.KeepConnection := True;
@ -1207,6 +1241,12 @@ begin
qBandMapFil.DataBase := BandMapCon;
trBandMapFil.DataBase := BandMapCon;
RbnMonCon.KeepConnection := True;
RbnMonCon.Transaction := trRbnMon;
qRbnMon.Transaction := trRbnMon;
qRbnMon.DataBase := RbnMonCon;
trRbnMon.DataBase := RbnMonCon;
DLLSSLName := dmData.cDLLSSLName;
DLLUtilName := dmData.cDLLUtilName;
@ -1315,6 +1355,7 @@ begin
DeleteFile(dmData.HomeDir + 'xplanet'+PathDelim+'marker');
BandMapCon.Connected := False;
MainCon.Connected := False;
DoneCriticalsection(csPreviousQSO);
KillMySQL(False)
end;
@ -3899,13 +3940,15 @@ begin
end
end;
function TdmData.SkipBandMapDateTime(callsign,band,mode,LastDate,LastTime : String) : Boolean;
function TdmData.CallExistsInLog(callsign,band,mode,LastDate,LastTime : String) : Boolean;
var
sql : String;
begin
Result := False;
qBandMapFil.Close;
EnterCriticalsection(csPreviousQSO);
try
Result := False;
qBandMapFil.Close;
//this ugly query is because I made a stupid mistake when stored qsodate and time_on as Varchar(), now it's probably
//too late to rewrite it (Petr, OK2CQR)
sql := 'select id_cqrlog_main from cqrlog_main where (callsign= '+QuotedStr(callsign)+') and (band = '+QuotedStr(band)+') '+
@ -3917,10 +3960,121 @@ begin
Result := qBandMapFil.RecordCount > 0
finally
qBandMapFil.Close;
trBandMapFil.RollBack
trBandMapFil.RollBack;
LeaveCriticalsection(csPreviousQSO)
end
end;
function TdmData.RbnMonDXCCInfo(adif : Word; band, mode : String;DxccWithLoTW:Boolean; var index : integer) : String;
var
sAdif : String = '';
begin
// index : 0 - unknown country, no qsl needed
// index : 1 - New country
// index : 2 - New band country
// index : 3 - New mode country
// index : 4 - QSL needed
if (adif = 0) then
begin
Result := 'Unknown country';
index := 0;
exit
end;
index := 1;
sAdif := IntToStr(adif);
if trRbnMon.Active then
trRbnMon.Rollback;
try try
if DxccWithLoTW then
qRbnMon.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+
sAdif+' AND band='+QuotedStr(band)+' AND ((qsl_r='+
QuotedStr('Q')+') OR (lotw_qslr='+QuotedStr('L')+')) AND mode='+
QuotedStr(mode)+' LIMIT 1'
else
qRbnMon.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+
sAdif+' AND band='+QuotedStr(band)+' AND qsl_r='+
QuotedStr('Q')+ ' AND mode='+QuotedStr(mode)+' LIMIT 1';
trRbnMon.StartTransaction;
qRbnMon.Open;
if qRbnMon.Fields[0].AsInteger > 0 then
begin
Result := 'Confirmed country!!';
index := 0
end
else begin
qRbnMon.Close;
qRbnMon.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+
sAdif+' AND band='+QuotedStr(band)+' AND mode='+
QuotedStr(mode)+' LIMIT 1';
qRbnMon.Open;
if qRbnMon.Fields[0].AsInteger > 0 then
begin
Result := 'QSL needed !!';
index := 4
end
else begin
qRbnMon.Close;
qRbnMon.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+
sAdif+' AND band='+QuotedStr(band)+' LIMIT 1';
qRbnMon.Open;
if qRbnMon.Fields[0].AsInteger > 0 then
begin
Result := 'New mode country!!';
index := 3
end
else begin
qRbnMon.Close;
qRbnMon.SQL.Text := 'SELECT id_cqrlog_main FROM '+dmData.DBName+'.cqrlog_main WHERE adif='+
sAdif+' LIMIT 1';
qRbnMon.Open;
if qRbnMon.Fields[0].AsInteger>0 then
begin
Result := 'New band country!!';
index := 2
end
else begin
Result := 'New country!!';
index := 1
end
end
end
end
except
on E : Exception do
Writeln(E.Message)
end
finally
qRbnMon.Close;
trRbnMon.Rollback
end
end;
function TdmData.RbnCallExistsInLog(callsign,band,mode,LastDate,LastTime : String) : Boolean;
var
sql : String;
begin
try
Result := False;
qRbnMon.Close;
//this ugly query is because I made a stupid mistake when stored qsodate and time_on as Varchar(), now it's probably
//too late to rewrite it (Petr, OK2CQR)
sql := 'select id_cqrlog_main from cqrlog_main where (callsign= '+QuotedStr(callsign)+') and (band = '+QuotedStr(band)+') '+
'and (mode = '+QuotedStr(mode)+') and (str_to_date(concat(qsodate,'+QuotedStr(' ')+',time_on), '+
QuotedStr('%Y-%m-%d %H:%i')+')) > str_to_date('+QuotedStr(LastDate+' '+LastTime)+', '+QuotedStr('%Y-%m-%d %H:%i')+')';
qRbnMon.SQL.Text := sql;
if fDebugLevel>=1 then Writeln(qRbnMon.SQL.Text);
qRbnMon.Open;
Result := qRbnMon.RecordCount > 0
finally
qRbnMon.Close;
trRbnMon.RollBack
end
end;
initialization
{$I dData.lrs}

View File

@ -56,6 +56,11 @@ const
cIngnoreFreq: array [0..cMaxIgnoreFreq] of string =
('1800.0', '3500.0', '7000.0', '10100.0', '14000.0', '21000.0', '28000.0');
C_RBN_CONT = 'AF,AN,AS,EU,NA,SA,OC';
C_RBN_BANDS = '160M,80M,40M,30M,20M,17M,15M,12M,10M,6M,2M';
C_RBN_MODES = 'CW,RTTY,PSK31';
type
{ TdmUtils }

View File

@ -27,7 +27,7 @@ object frmBandMap: TfrmBandMap
Left = 0
Height = 26
Top = 0
Width = 259
Width = 255
Caption = 'toolBandMap'
Images = imglBandMap
TabOrder = 0

View File

@ -448,7 +448,7 @@ begin
skip := False;
if not (frmBandMap.FDateFilterType = dftShowAll) then
skip := dmData.SkipBandMapDateTime(AddArray[y].Call,AddArray[y].Band,AddArray[y].Mode,LastDate,LastTime);
skip := dmData.CallExistsInLog(AddArray[y].Call,AddArray[y].Band,AddArray[y].Mode,LastDate,LastTime);
if frmBandMap.FOnlyLoTW and frmBandMap.FOnlyEQSL then
begin

View File

@ -177,7 +177,7 @@ begin
if cmbStoreCalbook.ItemIndex>0 then
Sections := Sections + 'CallBook,';
if cmbStoreRbn.ItemIndex>0 then
Sections := Sections + 'RBN,';
Sections := Sections + 'RBN,RBNFilter,';
if cmbStoreOnlineLog.ItemIndex>0 then
Sections := Sections + 'OnlineLog,';
if cmbStoreWindowSize.ItemIndex>0 then

View File

@ -1,7 +1,7 @@
object frmNewQSO: TfrmNewQSO
Left = 368
Height = 651
Top = 331
Top = 303
Width = 807
HelpType = htKeyword
HelpKeyword = 'help/index.html'
@ -2122,6 +2122,9 @@ object frmNewQSO: TfrmNewQSO
object MenuItem52: TMenuItem
Action = acLogUploadStatus
end
object MenuItem91: TMenuItem
Action = acRBNMonitor
end
end
object MenuItem3: TMenuItem
Caption = 'Statistics'
@ -2801,6 +2804,11 @@ object frmNewQSO: TfrmNewQSO
ImageIndex = 15
OnExecute = acRefreshTimeExecute
end
object acRBNMonitor: TAction
Category = 'Window'
Caption = 'RBN monitor'
OnExecute = acRBNMonitorExecute
end
end
object imgMain: TImageList
left = 200

File diff suppressed because it is too large Load Diff

View File

@ -62,6 +62,7 @@ type
acLogUploadStatus: TAction;
acHotkeys: TAction;
acRefreshTime: TAction;
acRBNMonitor: TAction;
acUploadToAll: TAction;
acUploadToHrdLog: TAction;
acUploadToClubLog: TAction;
@ -91,6 +92,7 @@ type
MenuItem88: TMenuItem;
MenuItem89: TMenuItem;
MenuItem90: TMenuItem;
MenuItem91: TMenuItem;
mnuOnlineLog: TMenuItem;
MenuItem54: TMenuItem;
MenuItem55: TMenuItem;
@ -306,6 +308,7 @@ type
procedure acOpenLogExecute(Sender: TObject);
procedure acPropExecute(Sender: TObject);
procedure acQSOListExecute(Sender: TObject);
procedure acRBNMonitorExecute(Sender: TObject);
procedure acRefreshTimeExecute(Sender: TObject);
procedure acRefreshTRXExecute(Sender: TObject);
procedure acReloadCWExecute(Sender: TObject);
@ -559,7 +562,7 @@ type
procedure NewQSO;
procedure ClearAll;
procedure SavePosition;
procedure NewQSOFromSpot(call,freq,mode : String);
procedure NewQSOFromSpot(call,freq,mode : String;FromRbn : Boolean = False);
procedure SetEditLabel;
procedure UnsetEditLabel;
procedure StoreClubInfo(where,StoreText : String);
@ -626,7 +629,7 @@ uses dUtils, fChangeLocator, dDXCC, dDXCluster, dData, fMain, fSelectDXCC, fGray
fQSODetails, fWAZITUStat, fIOTAStat, fGraphStat, fImportProgress, fBandMap,
fLongNote, fRefCall, fKeyTexts, fCWType, fExportProgress, fPropagation, fCallAttachment,
fQSLViewer, fCWKeys, uMyIni, fDBConnect, fAbout, uVersion, fChangelog,
fBigSquareStat, fSCP, fRotControl, fLogUploadStatus;
fBigSquareStat, fSCP, fRotControl, fLogUploadStatus, fRbnMonitor;
procedure TQSLTabThread.Execute;
var
@ -1210,6 +1213,9 @@ begin
if cqrini.ReadBool('Window','CWType',False) then
acCWType.Execute;
if cqrini.ReadBool('Window','RBNMonitor',False) then
acRBNMonitor.Execute;
if cqrini.ReadBool('Program','CheckDXCCTabs',True) then
begin
Tab := TDXCCTabThread.Create(True);
@ -1351,6 +1357,14 @@ begin
else
cqrini.WriteBool('Window','CWType',False);
if frmRBNMonitor.Showing then
begin
cqrini.WriteBool('Window','RBNMonitor',True);
frmRBNMonitor.Close
end
else
cqrini.WriteBool('Window','CWType',False);
cqrini.DeleteKey('TMPQSO','OFF');
cqrini.DeleteKey('TMPQSO','FREQ');
cqrini.DeleteKey('TMPQSO','Mode');
@ -3103,6 +3117,11 @@ begin
frmMain.Show
end;
procedure TfrmNewQSO.acRBNMonitorExecute(Sender: TObject);
begin
frmRBNMonitor.Show
end;
procedure TfrmNewQSO.acRefreshTimeExecute(Sender: TObject);
begin
FillDateTimeFields
@ -4917,7 +4936,7 @@ begin
Handled := True
end;
procedure TfrmNewQSO.NewQSOFromSpot(call,freq,mode : String);
procedure TfrmNewQSO.NewQSOFromSpot(call,freq,mode : String;FromRbn : Boolean = False);
var
etmp : Extended;
begin
@ -4938,7 +4957,8 @@ begin
if chkAutoMode.Checked then
cmbMode.Text := mode;
freq := FloatToStr(etmp);
mode := dmUtils.GetModeFromFreq(freq);
if not FromRbn then
mode := dmUtils.GetModeFromFreq(freq);
etmp := etmp*1000;
freq := FloatToStr(etmp);
frmTRXControl.SetModeFreq(mode,freq);

366
src/fRbnFilter.lfm Normal file
View File

@ -0,0 +1,366 @@
object frmRbnFilter: TfrmRbnFilter
Left = 445
Height = 608
Top = 191
Width = 684
BorderStyle = bsDialog
Caption = 'RBN filter criteria'
ClientHeight = 608
ClientWidth = 684
OnShow = FormShow
Position = poOwnerFormCenter
LCLVersion = '1.2.4.0'
object GroupBox3: TGroupBox
Left = 8
Height = 520
Top = 80
Width = 664
Caption = 'DX station '
ClientHeight = 501
ClientWidth = 660
TabOrder = 1
object GroupBox5: TGroupBox
Left = 8
Height = 137
Top = 96
Width = 638
Caption = ' Callsign '
ClientHeight = 118
ClientWidth = 634
TabOrder = 5
object rbAllDx: TRadioButton
Left = 16
Height = 24
Top = 16
Width = 44
Caption = 'All'
Checked = True
TabOrder = 0
TabStop = True
end
object rbOnlyCall: TRadioButton
Left = 16
Height = 24
Top = 48
Width = 160
Caption = 'Only these callsigns:'
TabOrder = 1
end
object rbOnlyCallReg: TRadioButton
Left = 16
Height = 24
Top = 80
Width = 199
Caption = 'Only these by expression: '
TabOrder = 3
end
object edtDXOnlyCall: TEdit
Left = 240
Height = 27
Top = 48
Width = 272
CharCase = ecUppercase
TabOrder = 2
Text = 'EDTDXONLYCALL'
end
object edtDXOnlyExpres: TEdit
Left = 240
Height = 27
Top = 80
Width = 272
CharCase = ecUppercase
TabOrder = 4
Text = 'EDTDXONLYEXPRES'
end
object Label9: TLabel
Left = 528
Height = 17
Top = 56
Width = 89
Caption = 'K1B, K1N etc.'
ParentColor = False
end
object Label10: TLabel
Left = 528
Height = 17
Top = 87
Width = 67
Caption = 'K[0..9]A?Z'
ParentColor = False
end
end
object Label4: TLabel
Left = 8
Height = 17
Top = 252
Width = 70
Caption = 'Continent:'
ParentColor = False
end
object edtDXCont: TEdit
Left = 96
Height = 27
Top = 248
Width = 280
CharCase = ecUppercase
TabOrder = 6
Text = 'EDTDXCONT'
end
object edtDXBand: TEdit
Left = 96
Height = 27
Top = 280
Width = 416
CharCase = ecUppercase
TabOrder = 7
Text = 'EDTDXBAND'
end
object Label5: TLabel
Left = 8
Height = 17
Top = 285
Width = 45
Caption = 'Bands:'
ParentColor = False
end
object Label6: TLabel
Left = 523
Height = 17
Top = 284
Width = 101
Caption = '160M, 80M etc.'
ParentColor = False
end
object Label7: TLabel
Left = 8
Height = 17
Top = 317
Width = 50
Caption = 'Modes:'
ParentColor = False
end
object edtDXMode: TEdit
Left = 96
Height = 27
Top = 312
Width = 344
CharCase = ecUppercase
TabOrder = 8
Text = 'EDTDXMODE'
end
object Label8: TLabel
Left = 456
Height = 17
Top = 317
Width = 94
Caption = 'CW, RTTY etc.'
ParentColor = False
end
object rbIgnWkdHour: TRadioButton
Left = 8
Height = 24
Top = 17
Width = 169
Caption = 'Ignore worked in last '
Checked = True
TabOrder = 0
TabStop = True
end
object Bevel1: TBevel
Left = 8
Height = 2
Top = 456
Width = 638
end
object edtLastHours: TEdit
Left = 192
Height = 27
Top = 16
Width = 41
TabOrder = 1
Text = '48'
end
object Label1: TLabel
Left = 244
Height = 17
Top = 21
Width = 229
Caption = 'hours on the same band and mode'
ParentColor = False
end
object rbIgnWkdDate: TRadioButton
Left = 8
Height = 24
Top = 52
Width = 163
Caption = 'Ignore worked after '
TabOrder = 2
end
object edtDate: TEdit
Left = 192
Height = 27
Top = 51
Width = 96
TabOrder = 3
Text = '2000-10-10'
end
object edtTime: TEdit
Left = 300
Height = 27
Top = 51
Width = 48
TabOrder = 4
Text = '12:12'
end
object Label2: TLabel
Left = 384
Height = 17
Top = 56
Width = 159
Caption = '(YYYY-MM-DD, HH:MM)'
ParentColor = False
end
object Bevel2: TBevel
Left = 8
Height = 2
Top = 380
Width = 638
end
object chkOnlyeQSL: TCheckBox
Left = 8
Height = 24
Top = 424
Width = 170
Caption = 'Show only eQSL users'
TabOrder = 14
end
object chkOnlyLoTW: TCheckBox
Left = 8
Height = 24
Top = 392
Width = 174
Caption = 'Show only LoTW users'
TabOrder = 13
end
object chkNewDXConly: TCheckBox
Left = 8
Height = 24
Top = 465
Width = 441
Caption = 'Show only spots that are "New one"/"New band"/"New mode" '
TabOrder = 15
end
object edtDXCnty: TEdit
Left = 96
Height = 27
Top = 344
Width = 184
CharCase = ecUppercase
TabOrder = 9
Text = 'EDTDXCNTY'
end
object Label11: TLabel
Left = 8
Height = 17
Top = 349
Width = 69
Caption = 'Countries:'
ParentColor = False
end
object Label12: TLabel
Left = 320
Height = 17
Top = 349
Width = 51
Caption = 'or NOT '
ParentColor = False
end
object edtDXCNotCnty: TEdit
Left = 392
Height = 27
Top = 344
Width = 175
CharCase = ecUppercase
TabOrder = 11
Text = 'EDTDXCNOTCNTY'
end
object btnDXCCnty: TButton
Left = 280
Height = 25
Top = 345
Width = 30
Caption = '...'
TabOrder = 10
end
object btnDXCNotCnty: TButton
Left = 567
Height = 25
Top = 345
Width = 30
Caption = '...'
TabOrder = 12
end
object Label14: TLabel
Left = 387
Height = 17
Top = 252
Width = 94
Caption = 'AF, AN, AS etc'
ParentColor = False
end
end
object GroupBox4: TGroupBox
Left = 8
Height = 65
Top = 8
Width = 513
Caption = ' Source data from '
ClientHeight = 46
ClientWidth = 509
TabOrder = 0
object Label3: TLabel
Left = 8
Height = 17
Top = 12
Width = 70
Caption = 'Continent:'
ParentColor = False
end
object edtSrcCont: TEdit
Left = 96
Height = 27
Top = 8
Width = 280
CharCase = ecUppercase
TabOrder = 0
Text = 'EDTSRCCONT'
end
object Label13: TLabel
Left = 387
Height = 17
Top = 12
Width = 94
Caption = 'AF, AN, AS etc'
ParentColor = False
end
end
object btnOK: TButton
Left = 597
Height = 25
Top = 8
Width = 75
Caption = 'OK'
OnClick = btnOKClick
TabOrder = 2
end
object btnCancel: TButton
Left = 597
Height = 25
Top = 40
Width = 75
Cancel = True
Caption = 'Cancel'
ModalResult = 2
TabOrder = 3
end
end

192
src/fRbnFilter.pas Normal file
View File

@ -0,0 +1,192 @@
unit fRbnFilter;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, Buttons, lclType;
type
{ TfrmRbnFilter }
TfrmRbnFilter = class(TForm)
Bevel1: TBevel;
Bevel2: TBevel;
btnOK: TButton;
btnCancel: TButton;
btnDXCCnty: TButton;
btnDXCNotCnty: TButton;
chkNewDXConly: TCheckBox;
chkOnlyeQSL: TCheckBox;
chkOnlyLoTW: TCheckBox;
edtDXCnty: TEdit;
edtDXCNotCnty: TEdit;
edtDate: TEdit;
edtDXOnlyCall: TEdit;
edtDXOnlyExpres: TEdit;
edtDXBand: TEdit;
edtDXMode: TEdit;
edtDXCont: TEdit;
edtLastHours: TEdit;
edtSrcCont: TEdit;
edtTime: TEdit;
GroupBox3: TGroupBox;
GroupBox4: TGroupBox;
GroupBox5: TGroupBox;
Label1: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
rbAllDx: TRadioButton;
rbOnlyCall: TRadioButton;
rbOnlyCallReg: TRadioButton;
rbIgnWkdDate: TRadioButton;
rbIgnWkdHour: TRadioButton;
procedure btnOKClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
frmRbnFilter: TfrmRbnFilter;
implementation
uses uMyIni, dUtils;
{$R *.lfm}
{ TfrmRbnFilter }
procedure TfrmRbnFilter.FormShow(Sender: TObject);
begin
dmUtils.LoadFontSettings(self);
edtSrcCont.Text := cqrini.ReadString('RBNFilter','SrcCont',C_RBN_CONT);
rbIgnWkdHour.Checked := cqrini.ReadBool('RBNFilter','IgnHour',True);
edtLastHours.Text := IntToStr(cqrini.ReadInteger('RBNFilter','IgnHourValue',48));
rbIgnWkdDate.Checked := cqrini.ReadBool('RBNFilter','IgnDate',False);
edtDate.Text := cqrini.ReadString('RBNFilter','IgnDateValue','');
edtTime.Text := cqrini.ReadString('RBNFilter','IgnTimeValue','');
rbAllDx.Checked := cqrini.ReadBool('RBNFilter','AllowAllCall',True);
rbOnlyCall.Checked := cqrini.ReadBool('RBNFilter','AllowOnlyCall',False);
edtDXOnlyCall.Text := cqrini.ReadString('RBNFilter','AllowOnlyCallValue','');
rbOnlyCallReg.Checked := cqrini.ReadBool('RBNFilter','AllowOnlyCallReg',False);
edtDXOnlyExpres.Text := cqrini.ReadString('RBNFilter','AllowOnlyCallRegValue','');
edtDXCont.Text := cqrini.ReadString('RBNFilter','AllowCont',C_RBN_CONT);
edtDXBand.Text := cqrini.ReadString('RBNFilter','AllowBands',C_RBN_BANDS);
edtDXMode.Text := cqrini.ReadString('RBNFilter','AllowModes',C_RBN_MODES);
edtDXCnty.Text := cqrini.ReadString('RBNFilter','AllowCnty','');
edtDXCNotCnty.Text := cqrini.ReadString('RBNFilter','NotCnty','');
chkOnlyLoTW.Checked := cqrini.ReadBool('RBNFilter','LoTWOnly',False);
chkOnlyeQSL.Checked := cqrini.ReadBool('RBNFilter','eQSLOnly',False);
chkNewDXConly.Checked := cqrini.ReadBool('RBNFilter','NewDXCOnly',False)
end;
procedure TfrmRbnFilter.btnOKClick(Sender: TObject);
function RmSp(what : String) : String;
begin
Result := StringReplace(what,' ','',[rfReplaceAll, rfIgnoreCase])
end;
var
i : Integer;
begin
if not TryStrToInt(edtLastHours.Text,i) then
begin
if rbIgnWkdHour.Checked then
begin
Application.MessageBox('Please enter correct number of hours, please','Error...',mb_OK+mb_IconError);
edtLastHours.SetFocus;
exit
end
else
edtLastHours.Text := '48'
end;
if not dmUtils.IsDateOK(edtDate.Text) then
begin
if rbIgnWkdDate.Checked then
begin
Application.MessageBox('Enter date in correct format, please','Error...',mb_Ok+mb_IconError);
edtDate.SetFocus;
exit
end
else
edtDate.Text := ''
end;
if not (dmUtils.IsTimeOK(edtTime.Text)) then
begin
if rbIgnWkdDate.Checked then
begin
Application.MessageBox('Enter time in correct format, please','Error...',mb_Ok+mb_IconError);
edtTime.SetFocus;
exit
end
else
edtTime.Text := ''
end;
if (edtSrcCont.Text='') then
edtSrcCont.Text := C_RBN_CONT;
if (edtDXCont.Text='') then
edtDXCont.Text := C_RBN_CONT;
if (edtDXBand.Text='') then
edtDXBand.Text := C_RBN_BANDS;
if (edtDXMode.Text='') then
edtDXMode.Text := C_RBN_MODES;
cqrini.WriteString('RBNFilter','SrcCont',RmSp(edtSrcCont.Text));
cqrini.WriteBool('RBNFilter','IgnHour',rbIgnWkdHour.Checked);
cqrini.WriteInteger('RBNFilter','IgnHourValue',StrToint(edtLastHours.Text));
cqrini.WriteBool('RBNFilter','IgnDate',rbIgnWkdDate.Checked);
cqrini.WriteString('RBNFilter','IgnDateValue',edtDate.Text);
cqrini.WriteString('RBNFilter','IgnTimeValue',edtTime.Text);
cqrini.WriteBool('RBNFilter','AllowAllCall',rbAllDx.Checked);
cqrini.WriteBool('RBNFilter','AllowOnlyCall',rbOnlyCall.Checked);
cqrini.WriteString('RBNFilter','AllowOnlyCallValue',RmSp(edtDXOnlyCall.Text));
cqrini.WriteBool('RBNFilter','AllowOnlyCallReg',rbOnlyCallReg.Checked);
cqrini.WriteString('RBNFilter','AllowOnlyCallRegValue',edtDXOnlyExpres.Text);
cqrini.WriteString('RBNFilter','AllowCont',RmSp(edtDXCont.Text));
cqrini.WriteString('RBNFilter','AllowBands',RmSp(edtDXBand.Text));
cqrini.WriteString('RBNFilter','AllowModes',RmSp(edtDXMode.Text));
cqrini.WriteString('RBNFilter','AllowCnty',RmSp(edtDXCnty.Text));
cqrini.WriteString('RBNFilter','NotCnty',RmSp(edtDXCNotCnty.Text));
cqrini.WriteBool('RBNFilter','LoTWOnly',chkOnlyLoTW.Checked);
cqrini.WriteBool('RBNFilter','eQSLOnly',chkOnlyeQSL.Checked);
cqrini.WriteBool('RBNFilter','NewDXCOnly',chkNewDXConly.Checked);
ModalResult := mrOK
end;
{ TfrmRbnFilter }
end.

461
src/fRbnMonitor.lfm Normal file
View File

@ -0,0 +1,461 @@
object frmRbnMonitor: TfrmRbnMonitor
Left = 488
Height = 602
Top = 232
Width = 665
ActiveControl = btnEatFocus
Caption = 'RBN Monitor'
ClientHeight = 602
ClientWidth = 665
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
LCLVersion = '1.2.4.0'
object ToolBar1: TToolBar
Left = 0
Height = 25
Top = 0
Width = 665
Caption = 'ToolBar1'
Images = imgRbnMonitor
ParentShowHint = False
ShowHint = True
TabOrder = 0
object tbtnConnect: TToolButton
Left = 1
Top = 2
Action = acConnect
AutoSize = True
end
object ToolButton2: TToolButton
Left = 24
Top = 2
Width = 10
Caption = 'ToolButton2'
Style = tbsSeparator
end
object ToolButton3: TToolButton
Left = 34
Top = 2
Action = acRbnServer
end
object ToolButton4: TToolButton
Left = 57
Top = 2
Width = 10
Caption = 'ToolButton4'
Style = tbsSeparator
end
object ToolButton5: TToolButton
Left = 67
Top = 2
Action = acFilter
end
object ToolButton6: TToolButton
Left = 100
Top = 2
Action = acFontSettings
end
object ToolButton7: TToolButton
Left = 90
Top = 2
Width = 10
Caption = 'ToolButton7'
Style = tbsSeparator
end
object ToolButton1: TToolButton
Left = 123
Top = 2
Width = 5
Caption = 'ToolButton1'
Style = tbsDivider
end
object ToolButton8: TToolButton
Left = 128
Top = 2
Action = acScrollDown
end
object ToolButton9: TToolButton
Left = 151
Top = 2
Width = 10
Caption = 'ToolButton9'
Style = tbsSeparator
end
object ToolButton10: TToolButton
Left = 161
Top = 2
Action = acHelp
end
object btnEatFocus: TButton
Left = 184
Height = 22
Top = 2
Width = 2
Caption = 'btnEatFocus'
TabOrder = 0
end
end
object sbRbn: TStatusBar
Left = 0
Height = 21
Top = 581
Width = 665
Panels = <
item
Width = 50
end>
SimplePanel = False
end
object sgRbn: TStringGrid
Left = 0
Height = 556
Top = 25
Width = 665
Align = alClient
ColCount = 7
FixedCols = 0
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goColSizing, goSmoothScroll, goScrollKeepVisible]
TabOrder = 2
OnDblClick = sgRbnDblClick
OnDrawCell = sgRbnDrawCell
OnHeaderSized = sgRbnHeaderSized
ColWidths = (
64
64
64
45
22
24
20
)
Cells = (
14
0
0
'Source'
0
1
'OK2CQR'
1
0
'Freq'
1
1
'14025.3'
2
0
'DX'
2
1
'WL7E'
3
0
'Mode'
3
1
'CW'
4
0
'Q'
4
1
'LE'
5
0
'dB'
5
1
'40'
6
0
'D'
6
1
'N'
)
end
object acRbnMonitor: TActionList
Images = imgRbnMonitor
left = 344
top = 72
object acConnect: TAction
Caption = 'Connect'
Hint = 'Connect to RBN server'
ImageIndex = 0
OnExecute = acConnectExecute
end
object acDisconnect: TAction
Caption = 'Disconnect'
Hint = 'Disconnect from RBN server'
ImageIndex = 1
OnExecute = acDisconnectExecute
end
object acFontSettings: TAction
Caption = 'Font settings'
Hint = 'Font settings'
ImageIndex = 3
OnExecute = acFontSettingsExecute
end
object acFilter: TAction
Caption = 'Filter'
Hint = 'Filter criteria'
ImageIndex = 2
OnExecute = acFilterExecute
end
object acRbnServer: TAction
Caption = 'Change RBN server address'
Hint = 'Change RBN server address'
ImageIndex = 4
OnExecute = acRbnServerExecute
end
object acScrollDown: TAction
Caption = 'Sroll down'
ImageIndex = 5
OnExecute = acScrollDownExecute
end
object acHelp: TAction
Caption = 'Help'
ImageIndex = 6
OnExecute = acHelpExecute
end
end
object imgRbnMonitor: TImageList
left = 344
top = 128
Bitmap = {
4C69070000001000000010000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000D0F0F120D0F0F4D000000FF0000
00FF0D0F0F22000000FF000000FF000000000000000000000000000000000000
000000000000000000000D0F0F0B0000006C000000DD000000FF899398FF747D
80FF000000FFBAC2C6FF747D80FF000000000000000000000000000000000000
000000000000000000000D0F0F6C2D3334FFAAB3B7FFBDC2C4FFE3E8EAFF747D
80FF000000FFE3E8EAFF747D80FF000000000000000000000000000000000000
0000000000000D0F0F12000000FFDDE1E2FFECEFF0FFA0A7AAFFE3E8EAFF747D
80FF000000FFEBEEF0FF747D80FF000000FF000000FF000000FF000000FF0000
00FF000000FF000000FF747D80FFDDE1E2FFECEFF0FFA0A7AAFFE3E8EAFF747D
80FF000000FFEBEEF0FF747D80FFE3E8EAFFE3E8EAFFE3E8EAFFE3E8EAFFE3E8
EAFFE3E8EAFFE3E8EAFFE3E8EAFFEDF0F2FFE6EAEBFF7B858AFFE8EBECFF747D
80FF000000FFEAECEEFF747D80FF747D80FF747D80FF747D80FF747D80FF747D
80FF747D80FF6B7578FF6B7578FFB5BBBEFFAAB1B3FF6E787DFFDBDFE1FF6B75
78FF000000FFCCD0D1FF747D80FF000000FF000000FF000000FF000000FF0000
00FF000000FF010101FF6B7578FF81898CFF9BA2A6FF636D72FFC3CACEFF6B75
78FF000000FF9EA4A7FF747D80FF000000000000000000000000000000000000
0000000000000D0F0F330D0F0FFF81898CFF9BA2A6FF636D72FFC3CACEFF6B75
78FF000000FF9EA4A7FF747D80FF000000000000000000000000000000000000
000000000000000000000D0F0F9033393CFF7E878BFF626C70FFA4ADB1FF5E68
6CFF000000FF8A9397FF747D80FF000000000000000000000000000000000000
000000000000000000000D0F0F090000005E0D0F0FC00D0F0FFF899398FF5660
64FF000000FF7D878BFF747D80FF000000000000000000000000000000000000
0000000000000000000000000000000000000D0F0F1B0D0F0F330D0F0FFF0D0F
0FFF0D0F0F320D0F0FFF000000FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000D0F0F4D000000FF000000FF0D0F0F220000
00000D0F0F000D0F0F000D0F0F0000000000000000000D0F0F00000000000000
000000000038000000FF000000FF000000FF899398FF747D80FF000000FF747D
800000000000000000000000000089939800747D800000000000BAC2C600747D
8000000000FFBAC2C6FF747D80FFBDC2C4FFE3E8EAFF747D80FF000000FF0000
00FF000000FF000000FF00000038000000000000000000000000E3E8EA00747D
8000000000FFE3E8EAFF747D80FFA0A7AAFFE3E8EAFF747D80FF000000FFC8D2
C5FFC8D2C5FFEAEEE9FF000000FFEAEEE9000000000000000000EBEEF000747D
8000000000FFEBEEF0FF747D80FFA0A7AAFFE3E8EAFF747D80FF000000FF0000
00FF000000FF000000FF00000038000000000000000000000000EBEEF000747D
8000000000FFEBEEF0FF747D80FF7B858AFFE8EBECFF747D80FF000000FF747D
800000000000E6EAEB007B858A00E8EBEC00747D800000000000EAECEE00747D
8000000000FFEAECEEFF747D80FF6E787DFFDBDFE1FF6B7578FF000000FF6B75
780000000000AAB1B3006E787D00DBDFE1006B75780000000000CCD0D100747D
8000000000FFCCD0D1FF747D80FF636D72FFC3CACEFF6B7578FF000000FF0000
00FF000000FF000000FF000000380000000000000000000000009EA4A700747D
8000000000FF9EA4A7FF747D80FF636D72FFC3CACEFF6B7578FF000000FFC8D2
C5FFC8D2C5FFF1F3F0FF000000FFF1F3F00000000000000000009EA4A700747D
8000000000FF9EA4A7FF747D80FF626C70FFA4ADB1FF5E686CFF000000FF0000
00FF000000FF000000FF000000380000000000000000000000008A939700747D
8000000000FF8A9397FF747D80FF0D0F0FFF899398FF566064FF000000FF5660
6400000000000D0F0F000D0F0F008993980056606400000000007D878B00747D
8000000000FF7D878BFF747D80FF0D0F0F330D0F0FFF0D0F0FFF0D0F0F320D0F
0F000D0F0F000D0F0F000D0F0F000D0F0F000D0F0F000D0F0F000D0F0F000000
0000000000380D0F0FFF000000FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000FF000000FF0000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
FFFF0000000000000000000000FF000000FF0000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
FFFF0000FFFF00000000000000FF000000FF0000000000000000000000000000
00000000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000
FFFF0000FFFF0000FFFF000000FF000000FF0000000000000000000000000000
00000000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF0000
FFFF0000FFFF0000FFFF000000FF000000FF0000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
FFFF0000FFFF00000000000000FF000000FF0000000000000000000000000000
0000FF0000FF0000000000000000000000000000000000000000000000000000
FFFF0000000000000000000000FF000000FF0000000000000000000000000000
0000FF0000FFFF0000FF00000000FF0000FFFF0000FFFF0000FFFF0000FFFF00
00FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
00FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
00FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
00FFFF0000FFFF0000FFFF0000FF000000000000000000000000000000000000
00000000000000000000000000FF000000FF0000000000000000000000000000
0000FF0000FFFF0000FF000000000000000000000000000000000000000000C4
00FF0000000000000000000000FF000000FF0000000000000000000000000000
0000FF0000FF00000000000000000000000000000000000000000000000000C4
00FF00C400FF00000000000000FF000000FF0000000000000000000000000000
000000000000000000000000000000C400FF00C400FF00C400FF00C400FF00C4
00FF00C400FF00C400FF000000FF000000FF0000000000000000000000000000
000000000000000000000000000000C400FF00C400FF00C400FF00C400FF00C4
00FF00C400FF00C400FF000000FF000000FF0000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000C4
00FF00C400FF00000000000000FF000000FF0000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000C4
00FF0000000000000000000000FF000000FF0000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000A364
3310A46635FBA36433FFA36433FFA36433FFA36433FFA46635FBA36433100000
000000000000000000000000000000000000000000000000000000000000A365
3475C9A282FDF6EEE7FFF7EFE8FFF7EFE8FFF6EEE7FFC69E7DFDA36534750000
0000000000000000000000000000000000000000000000000000A2633202A466
36F9EDDDD0FFE1C3A8FFC09067FDC09067FDDCBEA1FFDDC6B3FFA46636F9A263
32020000000000000000000000000000000000000000000000009F603043B887
62FCF1E5DAFFD6B08CFFA16434FDA16434FDD5AD88FFDBC1ACFFAC754BFC9F60
30440000000000000000000000000000000000000000000000009F6335D4D9C0
AAFFDFC5ACFFC3956EFF9F6234E19F6234E0C08D64FFD3AB89FFC0936FFF9F61
33D400000000000000000000000000000000000000009A5B2D1DA0663AFDE0CF
BFFFD8B18DFFA66B3FFC9A5B2D519A5B2D51A5693CFCCF9C71FFCB9B75FF9B5D
2FFD9A5B2D1D00000000000000000000000000000000995C2F95BE9677FED7B8
9DFFCB9A72FF995B2DFC97592B0697592B06985B2DFCC58B5CFFCB9060FFAD6F
40FE995A2C970000000000000000000000009456290796582CFCCFAF94FFD1A4
7EFFBF895EFF945629FF945629FF945629FF945629FFBA7C4CFFC98856FFC07D
4AFF95572AFC9456290700000000000000009154275AA6714AFCD0A785FFD09A
6EFFD29F75FFD9AD89FFDEB99BFFE5C7B0FFECD6C5FFECD6C6FFC6804BFFC67F
49FF9E5E2FFC9154275A0000000000000000925529EEBC8B65FFCD976CFFCD92
63FFCB8E5EFFCA8B59FFC98754FFC7834FFFC6804AFFC67F49FFC67F49FFC67F
49FFB5713EFF925327EE000000008C4F232D91562BFCCA9266FFCB8E5DFF9D60
32FC8C4F23FF8C4F23FF8C4F23FF8C4F23FF8C4F23FF8C4F23FF9C5C2DFCC67F
49FFC57E48FF915326FC8C4F232D8C4F24B7AC6E41FFCA8A58FFBE7D4BFF8B4D
22FC894C210600000000000000000000000000000000894C21068B4D22FCBD77
43FFC67F49FFA96736FF8C4E23B78A4D22E9874A20FF874A20FF874A20FF894C
21830000000000000000000000000000000000000000000000008A4C2285874A
20FF874A20FF874A20FF8A4C22E9000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000005E5E5E7D5E5E5EFF5E5E5EFF5E5E
5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E5E7D00000000000000000000
00000000000000000000000000005E5E5E7D979797FFEDEDEDFFEDEDEDFFEDED
EDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFA6A6A6FF5E5E5E7D000000000000
00000000000000000000000000005E5E5EFFEDEDEDFFD8D8D8FF7B7B7BFF7B7B
7BFF7B7B7BFF7B7B7BFF7B7B7BFFA4A4A4FFE6E6E6FF5E5E5EFF000000000000
00000000000000000000000000005E5E5EFFF3F3F3FF7B7B7BFFF6F5F5FFF6F5
F5FFF6F5F5FF9A9A9AFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E
5EFF5E5E5EFF5E5E5E5C000000005E5E5EFFF0F0F0FF7B7B7BFFCF9F72FFCF9F
72FF7F7778FFBABABAFFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0
F0FFF0F0F0FFBABABAFF5E5E5E7D5E5E5EFFEEEEEEFF7B7B7BFFCF9F72FFCF9F
72FF5E5E5EFFF0F0F0FFD8D8D8FF7B7B7BFF7B7B7BFF7B7B7BFF7B7B7BFF7B7B
7BFFA4A4A4FFF0F0F0FF5E5E5EFF5E5E5EFFEDEDEDFF7B7B7BFFCF9F72FFCF9F
72FF5E5E5EFFF0F0F0FF7B7B7BFFF6F5F5FFF6F5F5FFC5C0C0FFC5C0C0FFF4F3
F3FF7B7B7BFFF0F0F0FF5E5E5EFF5E5E5EFFF3F3F3FFD3D3D3FF7B7B7BFF7B7B
7BFF5E5E5EFFF0F0F0FF7B7B7BFFCF9F72FFCF9F72FFF6F5F5FFF5F5F5FFCF9F
72FF7B7B7BFFF0F0F0FF5E5E5EFF5E5E5EDDEDEDEDFFEDEDEDFFEDEDEDFFEDED
EDFF5E5E5EFFF0F0F0FF7B7B7BFFCF9F72FFCF9F72FFEBEAEAFFEBEAEAFFCF9F
72FF7B7B7BFFF0F0F0FF5E5E5EFF5E5E5E7D5E5E5EFF5E5E5EFF5E5E5EFF5E5E
5EFF5E5E5EFFF0F0F0FF7B7B7BFFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F
72FF7B7B7BFFF0F0F0FF5E5E5EFF5E5E5EFFF3F3F3FFF0F0F0FFD1D1D1FFEBEB
EBFF5E5E5EFFF0F0F0FFD3D3D3FF7B7B7BFF7B7B7BFF7B7B7BFF7B7B7BFF7B7B
7BFFC0C0C0FFF0F0F0FF5E5E5EFF5E5E5EFFD9D9D9FFC1C1C1FFB7B7B7FFBCBC
BCFF585858FFBABABAFFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0
F0FFF0F0F0FFBABABAFF5E5E5EFF1415159F5E5E5EFF5E5E5EFF5E5E5EFF5E5E
5EFF5E5E5E975E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E
5EFF5E5E5EFF5E5E5EFF5E5E5E97000000000000000000000000000000000000
00005E5E5EFFF3F3F3FFF0F0F0FFD1D1D1FFEBEBEBFFEBEBEBFFC8C8C8FFC5C5
C5FFC5C5C5FFE8E8E8FF5E5E5EFF000000000000000000000000000000000000
00005E5E5EFFD9D9D9FFC1C1C1FFB7B7B7FFBCBCBCFFBCBCBCFFB6B6B6FFD1D1
D1FFD5D5D5FFC4C4C4FF5E5E5EFF000000000000000000000000000000000000
00005E5E5E975E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E5EFF5E5E
5EFF5E5E5EFF5E5E5EFF5E5E5E97FFFFFF00FFFFFF00FFFFFF00FFFFFF000474
3AE804733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04743AE8FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473
3AFFAEDEC6FFAADCC2FFA4DABEFF9FD8BBFF9AD6B7FF93D3B2FF04733AFFFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473
3AFFB0DFC7FF5DBD8CFF54B985FF49B57DFF3EB076FF8FD1AFFF04733AFFFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473
3AFFB1DFC7FF5EBE8DFF55BA86FF4AB57EFF3FB176FF8ACFACFF04733AFFFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473
3AFFB0DFC7FF5EBE8DFF54B985FF49B57DFF3EB076FF85CDA9FF04733AFFFFFF
FF00FFFFFF00FFFFFF00FFFFFF0004753BC504733AFF04733AFF04733AFF0476
3BF7AFDEC6FF5BBC8BFF52B884FF47B47CFF35AD70FF7FCBA4FF04763BF70473
3AFF04733AFF04733AFF04753BC504733A65278956F6ACDCC4FFB2DFC8FFB0DE
C7FFACDDC4FF58BD89FF4EBB84FF43B87CFF0FA458FF7FCEA5FF7ECDA4FF7ECC
A4FF78C79FFF18824BF504733A65FFFFFF0004743BAC4DA478F89ED7BAFF61C0
90FF5BC18DFF55C18AFF3AB978FF11AD5EFF0BAB59FF0AAA59FF0CA958FF68C7
97FF349A65F804743BABFFFFFF00FFFFFF0004733A0C04743AE173BF98FE87D2
ACFF56C38CFF30BA74FF0CB15DFF0DB45FFF0DB45FFF0DB35EFF4EC589FF55B7
84FE04753BE104733A0CFFFFFF00FFFFFF00FFFFFF0004733A2D0B773EF68FD3
B0FF5BC891FF0DB45FFF0FB962FF0FBC65FF10BD65FF32C57BFF71CE9FFF0A78
3FF604733A2DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A65238A
56F578D2A5FF1CBD6BFF11C067FF12C56AFF1FC973FF78DBA8FF1E8952F50473
3A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000475
3BAC3DA36FF969D59EFF12C469FF14CB6EFF6CE0A5FF3FA872F904763CABFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473
3A0C04763BE15DBF8DFE4CD18DFF4ED590FF5FC592FE04763CE104733A0CFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF0004733A2D0E7A42F674D1A2FF75D3A3FF0E7B42F604733A2DFFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFF04733AFF04733AFF0473
3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473
3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473
3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473
3AFF04733AFF04733AFF04733AFFFFFFFF00FFFFFF00E2A289A4D0927FD7D490
78DAD39079DAD5927BDAD7947CDAD8947DDADB967FDADB9880DADC9A81DAE19F
86DBD4937CAEFFFFFF00FFFFFF00FFFFFF00FFFFFF00B67A6CF5D79B88FFE5A0
88FFE5A288FFE6A086FFE79F84FFE8A185FFEAA488FFEEAA8EFFF0AE93FFF4B2
97FFCE8C76E7FFFFFF00FFFFFF00FFFFFF00FFFFFF00B27667F5D29784FFDE9B
82FFDD9981FFEFCABBFFFBF1EEFFFBEFEBFFF9E9E3FFEDB6A2FFEAA589FFEFAC
91FFCE8B75E7FFFFFF00FFFFFF00FFFFFF00FFFFFF00DDB6AFFACB8E7BFFD58B
73FFFBF4F1FFFFFFFFFFF9F5F3FFF9EAE5FFFFFFFFFFFFFFFFFFE8B8A4FFEAA4
8AFFCE8A74E7FFFFFF00FFFFFF00FFFFFF00FFFFFF00B07465F5C88C7AFFDFAC
9CFFFFFFFFFFF8F2F0FFD28970FFD6896DFFEBC2B6FFFFFFFFFFEED8D1FFE19B
82FFCE8B76E2FFFFFF00FFFFFF00FFFFFF00FFFFFF00B2796AF5C58A7BFFCC86
6FFFE0B8ABFFC8856FFFCF876FFFE3B7A8FFFEFBFAFFFFFFFFFFD19A89FFDE9A
81FFCB8772E2FFFFFF00FFFFFF00FFFFFF00FFFFFF00B27769F5C08676FFCA87
73FFC88470FFCA846EFFE7C7BCFFFFFFFFFFFBF8F7FFCF9888FFD69178FFD896
7FFFC6846FE2FFFFFF00FFFFFF00FFFFFF00FFFFFF00B17668F5BC8373FFC382
6FFFC5836FFFC27A64FFFDFBFAFFFFFFFFFFC07B68FFCF8B73FFD18F79FFD391
7BFFC37F6CE2FFFFFF00FFFFFF00FFFFFF00FFFFFF00AD7062F5B87D70FFBE7D
69FFC07E6BFFBF7A66FFDFBCB1FFD9B5ACFFC67F68FFCA8873FFCC8A75FFCE8C
76FFBF7D69E2FFFFFF00FFFFFF00FFFFFF00FFFFFF00DAB2AAFAAF7668FFB978
65FFBB7967FFB76F5AFFFDFAFAFFFFFFFFFFC48573FFC3826EFFC68470FFC886
72FFBD7966E1FFFFFF00FFFFFF00FFFFFF00FFFFFF00B4776AF5AE7568FFB373
62FFB57462FFB4705DFFDDBEB4FFE7D1CCFFBB7966FFBF7D69FFC17F6CFFC381
6DFFBA7664F7FFFFFF00FFFFFF00FFFFFF00FFFFFF00AF7467F5AD7568FFB070
5EFFB27160FFB47462FFB36E5CFFB56F5DFFBB7866FFBD7B68FFBF7D6BFFC17F
6BFFB87563F7FFFFFF00FFFFFF00FFFFFF00FFFFFF0096574BF589463BFF8A44
37FF8B4437FF8C4538FF8D4639FF8E4739FF8F483AFF90493BFF914A3CFF924B
3DFF9A5547F0FFFFFF00FFFFFF00FFFFFF00FFFFFF00784641F5DBDCDCFFD4DC
DCFFD4DCDCFFD4DCDCFFD3DCDCFFD3DCDCFFD3DCDCFFD3DCDCFFD3DCDCFFD6DC
DCFFB0928B8BFFFFFF00FFFFFF00FFFFFF00FFFFFF0095564AFB89463BFF8A44
37FF8B4437FF8C4538FF8D4639FF8E4739FF8F483AFF90493BFF914A3CFF924B
3DFF985346F8FFFFFF00FFFFFF00FFFFFF00BB6A346BBA6530BCBB6631EDBA66
30F7BA6630F7BA6630F7BA6530F7BA652FF7B9652EF7B9652EF7B9642EF7B964
2EEFB7622CBDB7622E63FFFFFF00
}
end
object dlgFont: TFontDialog
MinFontSize = 0
MaxFontSize = 0
left = 122
top = 215
end
end

328
src/fRbnMonitor.lrs Normal file
View File

@ -0,0 +1,328 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TfrmRbnMonitor','FORMDATA',[
'TPF0'#14'TfrmRbnMonitor'#13'frmRbnMonitor'#4'Left'#3#232#1#6'Height'#3'Z'#2#3
+'Top'#3#232#0#5'Width'#3#153#2#13'ActiveControl'#7#11'btnEatFocus'#7'Caption'
+#6#11'RBN Monitor'#12'ClientHeight'#3'Z'#2#11'ClientWidth'#3#153#2#7'OnClose'
+#7#9'FormClose'#8'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#6
+'OnShow'#7#8'FormShow'#10'LCLVersion'#6#7'1.2.4.0'#0#8'TToolBar'#8'ToolBar1'
+#4'Left'#2#0#6'Height'#2#25#3'Top'#2#0#5'Width'#3#153#2#7'Caption'#6#8'ToolB'
+'ar1'#6'Images'#7#13'imgRbnMonitor'#14'ParentShowHint'#8#8'ShowHint'#9#8'Tab'
+'Order'#2#0#0#11'TToolButton'#11'tbtnConnect'#4'Left'#2#1#3'Top'#2#2#6'Actio'
+'n'#7#9'acConnect'#8'AutoSize'#9#0#0#11'TToolButton'#11'ToolButton2'#4'Left'
+#2#24#3'Top'#2#2#5'Width'#2#10#7'Caption'#6#11'ToolButton2'#5'Style'#7#12'tb'
+'sSeparator'#0#0#11'TToolButton'#11'ToolButton3'#4'Left'#2'"'#3'Top'#2#2#6'A'
+'ction'#7#11'acRbnServer'#0#0#11'TToolButton'#11'ToolButton4'#4'Left'#2'9'#3
+'Top'#2#2#5'Width'#2#10#7'Caption'#6#11'ToolButton4'#5'Style'#7#12'tbsSepara'
+'tor'#0#0#11'TToolButton'#11'ToolButton5'#4'Left'#2'C'#3'Top'#2#2#6'Action'#7
+#8'acFilter'#0#0#11'TToolButton'#11'ToolButton6'#4'Left'#2'd'#3'Top'#2#2#6'A'
+'ction'#7#14'acFontSettings'#0#0#11'TToolButton'#11'ToolButton7'#4'Left'#2'Z'
+#3'Top'#2#2#5'Width'#2#10#7'Caption'#6#11'ToolButton7'#5'Style'#7#12'tbsSepa'
+'rator'#0#0#11'TToolButton'#11'ToolButton1'#4'Left'#2'{'#3'Top'#2#2#5'Width'
+#2#5#7'Caption'#6#11'ToolButton1'#5'Style'#7#10'tbsDivider'#0#0#11'TToolButt'
+'on'#11'ToolButton8'#4'Left'#3#128#0#3'Top'#2#2#6'Action'#7#12'acScrollDown'
+#0#0#11'TToolButton'#11'ToolButton9'#4'Left'#3#151#0#3'Top'#2#2#5'Width'#2#10
+#7'Caption'#6#11'ToolButton9'#5'Style'#7#12'tbsSeparator'#0#0#11'TToolButton'
+#12'ToolButton10'#4'Left'#3#161#0#3'Top'#2#2#6'Action'#7#6'acHelp'#0#0#7'TBu'
+'tton'#11'btnEatFocus'#4'Left'#3#184#0#6'Height'#2#22#3'Top'#2#2#5'Width'#2#2
+#7'Caption'#6#11'btnEatFocus'#8'TabOrder'#2#0#0#0#0#10'TStatusBar'#5'sbRbn'#4
+'Left'#2#0#6'Height'#2#21#3'Top'#3'E'#2#5'Width'#3#153#2#6'Panels'#14#1#5'Wi'
+'dth'#2'2'#0#0#11'SimplePanel'#8#0#0#11'TStringGrid'#5'sgRbn'#4'Left'#2#0#6
+'Height'#3','#2#3'Top'#2#25#5'Width'#3#153#2#5'Align'#7#8'alClient'#8'ColCou'
+'nt'#2#7#9'FixedCols'#2#0#7'Options'#11#15'goFixedVertLine'#15'goFixedHorzLi'
+'ne'#10'goVertLine'#10'goHorzLine'#11'goColSizing'#14'goSmoothScroll'#19'goS'
+'crollKeepVisible'#0#8'TabOrder'#2#2#10'OnDblClick'#7#13'sgRbnDblClick'#10'O'
+'nDrawCell'#7#13'sgRbnDrawCell'#13'OnHeaderSized'#7#16'sgRbnHeaderSized'#9'C'
+'olWidths'#1#2'@'#2'@'#2'@'#2'-'#2#22#2#24#2#20#0#5'Cells'#1#2#14#2#0#2#0#6#6
+'Source'#2#0#2#1#6#6'OK2CQR'#2#1#2#0#6#4'Freq'#2#1#2#1#6#7'14025.3'#2#2#2#0#6
+#2'DX'#2#2#2#1#6#4'WL7E'#2#3#2#0#6#4'Mode'#2#3#2#1#6#2'CW'#2#4#2#0#6#1'Q'#2#4
+#2#1#6#2'LE'#2#5#2#0#6#2'dB'#2#5#2#1#6#2'40'#2#6#2#0#6#1'D'#2#6#2#1#6#1'N'#0
+#0#0#11'TActionList'#12'acRbnMonitor'#6'Images'#7#13'imgRbnMonitor'#4'left'#3
+'X'#1#3'top'#2'H'#0#7'TAction'#9'acConnect'#7'Caption'#6#7'Connect'#4'Hint'#6
+#21'Connect to RBN server'#10'ImageIndex'#2#0#9'OnExecute'#7#16'acConnectExe'
+'cute'#0#0#7'TAction'#12'acDisconnect'#7'Caption'#6#10'Disconnect'#4'Hint'#6
+#26'Disconnect from RBN server'#10'ImageIndex'#2#1#9'OnExecute'#7#19'acDisco'
+'nnectExecute'#0#0#7'TAction'#14'acFontSettings'#7'Caption'#6#13'Font settin'
+'gs'#4'Hint'#6#13'Font settings'#10'ImageIndex'#2#3#9'OnExecute'#7#21'acFont'
+'SettingsExecute'#0#0#7'TAction'#8'acFilter'#7'Caption'#6#6'Filter'#4'Hint'#6
+#15'Filter criteria'#10'ImageIndex'#2#2#9'OnExecute'#7#15'acFilterExecute'#0
+#0#7'TAction'#11'acRbnServer'#7'Caption'#6#25'Change RBN server address'#4'H'
+'int'#6#25'Change RBN server address'#10'ImageIndex'#2#4#9'OnExecute'#7#18'a'
+'cRbnServerExecute'#0#0#7'TAction'#12'acScrollDown'#7'Caption'#6#10'Sroll do'
+'wn'#10'ImageIndex'#2#5#9'OnExecute'#7#19'acScrollDownExecute'#0#0#7'TAction'
+#6'acHelp'#7'Caption'#6#4'Help'#10'ImageIndex'#2#6#9'OnExecute'#7#13'acHelpE'
+'xecute'#0#0#0#10'TImageList'#13'imgRbnMonitor'#4'left'#3'X'#1#3'top'#3#128#0
+#6'Bitmap'#10#14#28#0#0'Li'#7#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#13#15#15#18#13#15#15'M'#0#0#0#255#0#0#0#255#13#15#15'"'#0#0#0#255#0#0#0#255
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#15#15#11#0#0#0'l'
+#0#0#0#221#0#0#0#255#137#147#152#255't}'#128#255#0#0#0#255#186#194#198#255't'
+'}'#128#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#15#15
+'l-34'#255#170#179#183#255#189#194#196#255#227#232#234#255't}'#128#255#0#0#0
+#255#227#232#234#255't}'#128#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#13#15#15#18#0#0#0#255#221#225#226#255#236#239#240#255#160#167#170#255
+#227#232#234#255't}'#128#255#0#0#0#255#235#238#240#255't}'#128#255#0#0#0#255
,#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255't}'#128#255#221
+#225#226#255#236#239#240#255#160#167#170#255#227#232#234#255't}'#128#255#0#0
+#0#255#235#238#240#255't}'#128#255#227#232#234#255#227#232#234#255#227#232
+#234#255#227#232#234#255#227#232#234#255#227#232#234#255#227#232#234#255#227
+#232#234#255#237#240#242#255#230#234#235#255'{'#133#138#255#232#235#236#255
+'t}'#128#255#0#0#0#255#234#236#238#255't}'#128#255't}'#128#255't}'#128#255't'
+'}'#128#255't}'#128#255't}'#128#255't}'#128#255'kux'#255'kux'#255#181#187#190
+#255#170#177#179#255'nx}'#255#219#223#225#255'kux'#255#0#0#0#255#204#208#209
+#255't}'#128#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+#1#1#1#255'kux'#255#129#137#140#255#155#162#166#255'cmr'#255#195#202#206#255
+'kux'#255#0#0#0#255#158#164#167#255't}'#128#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#13#15#15'3'#13#15#15#255#129#137#140#255#155#162#166#255
+'cmr'#255#195#202#206#255'kux'#255#0#0#0#255#158#164#167#255't}'#128#255#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#15#15#144'39<'#255'~'
+#135#139#255'blp'#255#164#173#177#255'^hl'#255#0#0#0#255#138#147#151#255't}'
+#128#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#15#15#9#0
+#0#0'^'#13#15#15#192#13#15#15#255#137#147#152#255'V`d'#255#0#0#0#255'}'#135
+#139#255't}'#128#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#13#15#15#27#13#15#15'3'#13#15#15#255#13#15#15#255#13#15#15
+'2'#13#15#15#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#13#15#15'M'#0#0#0#255#0#0#0#255#13#15#15'"'#0#0#0#0#13#15#15#0#13#15
+#15#0#13#15#15#0#0#0#0#0#0#0#0#0#13#15#15#0#0#0#0#0#0#0#0#0#0#0#0'8'#0#0#0
+#255#0#0#0#255#0#0#0#255#137#147#152#255't}'#128#255#0#0#0#255't}'#128#0#0#0
+#0#0#0#0#0#0#0#0#0#0#137#147#152#0't}'#128#0#0#0#0#0#186#194#198#0't}'#128#0
+#0#0#0#255#186#194#198#255't}'#128#255#189#194#196#255#227#232#234#255't}'
+#128#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0'8'#0#0#0#0#0#0#0#0#0#0
+#0#0#227#232#234#0't}'#128#0#0#0#0#255#227#232#234#255't}'#128#255#160#167
+#170#255#227#232#234#255't}'#128#255#0#0#0#255#200#210#197#255#200#210#197
+#255#234#238#233#255#0#0#0#255#234#238#233#0#0#0#0#0#0#0#0#0#235#238#240#0't'
+'}'#128#0#0#0#0#255#235#238#240#255't}'#128#255#160#167#170#255#227#232#234
+#255't}'#128#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0'8'#0#0#0#0#0#0
+#0#0#0#0#0#0#235#238#240#0't}'#128#0#0#0#0#255#235#238#240#255't}'#128#255'{'
+#133#138#255#232#235#236#255't}'#128#255#0#0#0#255't}'#128#0#0#0#0#0#230#234
+#235#0'{'#133#138#0#232#235#236#0't}'#128#0#0#0#0#0#234#236#238#0't}'#128#0#0
+#0#0#255#234#236#238#255't}'#128#255'nx}'#255#219#223#225#255'kux'#255#0#0#0
+#255'kux'#0#0#0#0#0#170#177#179#0'nx}'#0#219#223#225#0'kux'#0#0#0#0#0#204#208
+#209#0't}'#128#0#0#0#0#255#204#208#209#255't}'#128#255'cmr'#255#195#202#206
+#255'kux'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0'8'#0#0#0#0#0#0#0
+#0#0#0#0#0#158#164#167#0't}'#128#0#0#0#0#255#158#164#167#255't}'#128#255'cmr'
+#255#195#202#206#255'kux'#255#0#0#0#255#200#210#197#255#200#210#197#255#241
+#243#240#255#0#0#0#255#241#243#240#0#0#0#0#0#0#0#0#0#158#164#167#0't}'#128#0
+#0#0#0#255#158#164#167#255't}'#128#255'blp'#255#164#173#177#255'^hl'#255#0#0
+#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0'8'#0#0#0#0#0#0#0#0#0#0#0#0#138#147
+#151#0't}'#128#0#0#0#0#255#138#147#151#255't}'#128#255#13#15#15#255#137#147
+#152#255'V`d'#255#0#0#0#255'V`d'#0#0#0#0#0#13#15#15#0#13#15#15#0#137#147#152
+#0'V`d'#0#0#0#0#0'}'#135#139#0't}'#128#0#0#0#0#255'}'#135#139#255't}'#128#255
+#13#15#15'3'#13#15#15#255#13#15#15#255#13#15#15'2'#13#15#15#0#13#15#15#0#13
+#15#15#0#13#15#15#0#13#15#15#0#13#15#15#0#13#15#15#0#13#15#15#0#0#0#0#0#0#0#0
+'8'#13#15#15#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255
+#255#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0#255#255
+#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255
,#255#0#0#255#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255
+#0#0#255#255#0#0#255#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0#255
+#255#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#255
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0#0#0#0#0#0#0
+#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#255#255#0#0#255
+#0#0#0#0#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0
+#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255
+#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255
+#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0
+#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255
+#255#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#255#255#0#0#255#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#196#0#255#0#0#0#0#0#0#0#0#0#0#0#255#0#0
+#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#196#0#255#0#196#0#255#0#0#0#0#0#0#0#255#0#0#0#255#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#196#0#255#0#196#0
+#255#0#196#0#255#0#196#0#255#0#196#0#255#0#196#0#255#0#196#0#255#0#0#0#255#0
+#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#196#0#255
+#0#196#0#255#0#196#0#255#0#196#0#255#0#196#0#255#0#196#0#255#0#196#0#255#0#0
+#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#196#0#255#0#196#0#255#0#0#0#0#0#0#0#255#0#0#0
+#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#196#0#255#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#163'd3'#16#164'f5'#251
+#163'd3'#255#163'd3'#255#163'd3'#255#163'd3'#255#164'f5'#251#163'd3'#16#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#163'e4u'#201#162
+#130#253#246#238#231#255#247#239#232#255#247#239#232#255#246#238#231#255#198
+#158'}'#253#163'e4u'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#162'c2'#2#164'f6'#249#237#221#208#255#225#195#168#255#192#144'g'#253#192#144
+'g'#253#220#190#161#255#221#198#179#255#164'f6'#249#162'c2'#2#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#159'`0C'#184#135'b'#252#241#229#218#255#214
+#176#140#255#161'd4'#253#161'd4'#253#213#173#136#255#219#193#172#255#172'uK'
+#252#159'`0D'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#159'c5'#212#217
+#192#170#255#223#197#172#255#195#149'n'#255#159'b4'#225#159'b4'#224#192#141
+'d'#255#211#171#137#255#192#147'o'#255#159'a3'#212#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#154'[-'#29#160'f:'#253#224#207#191#255#216#177#141#255#166'k?'
+#252#154'[-Q'#154'[-Q'#165'i<'#252#207#156'q'#255#203#155'u'#255#155']/'#253
+#154'[-'#29#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#153'\/'#149#190#150'w'#254#215
+#184#157#255#203#154'r'#255#153'[-'#252#151'Y+'#6#151'Y+'#6#152'[-'#252#197
+#139'\'#255#203#144'`'#255#173'o@'#254#153'Z,'#151#0#0#0#0#0#0#0#0#0#0#0#0
+#148'V)'#7#150'X,'#252#207#175#148#255#209#164'~'#255#191#137'^'#255#148'V)'
+#255#148'V)'#255#148'V)'#255#148'V)'#255#186'|L'#255#201#136'V'#255#192'}J'
+#255#149'W*'#252#148'V)'#7#0#0#0#0#0#0#0#0#145'T''Z'#166'qJ'#252#208#167#133
+#255#208#154'n'#255#210#159'u'#255#217#173#137#255#222#185#155#255#229#199
+#176#255#236#214#197#255#236#214#198#255#198#128'K'#255#198#127'I'#255#158'^'
+'/'#252#145'T''Z'#0#0#0#0#0#0#0#0#146'U)'#238#188#139'e'#255#205#151'l'#255
+#205#146'c'#255#203#142'^'#255#202#139'Y'#255#201#135'T'#255#199#131'O'#255
+#198#128'J'#255#198#127'I'#255#198#127'I'#255#198#127'I'#255#181'q>'#255#146
+'S'''#238#0#0#0#0#140'O#-'#145'V+'#252#202#146'f'#255#203#142']'#255#157'`2'
+#252#140'O#'#255#140'O#'#255#140'O#'#255#140'O#'#255#140'O#'#255#140'O#'#255
+#156'\-'#252#198#127'I'#255#197'~H'#255#145'S&'#252#140'O#-'#140'O$'#183#172
+'nA'#255#202#138'X'#255#190'}K'#255#139'M"'#252#137'L!'#6#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#137'L!'#6#139'M"'#252#189'wC'#255#198#127'I'#255#169'g6'#255#140
+'N#'#183#138'M"'#233#135'J '#255#135'J '#255#135'J '#255#137'L!'#131#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#138'L"'#133#135'J '#255#135'J '#255
+#135'J '#255#138'L"'#233#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'^^^}^^^'#255'^^'
+'^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^}'#0#0#0#0#0#0#0#0#0
,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'^^^}'#151#151#151#255#237#237#237#255#237#237
+#237#255#237#237#237#255#237#237#237#255#237#237#237#255#237#237#237#255#237
+#237#237#255#166#166#166#255'^^^}'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'^'
+'^^'#255#237#237#237#255#216#216#216#255'{{{'#255'{{{'#255'{{{'#255'{{{'#255
+'{{{'#255#164#164#164#255#230#230#230#255'^^^'#255#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0'^^^'#255#243#243#243#255'{{{'#255#246#245#245#255#246#245#245
+#255#246#245#245#255#154#154#154#255'^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'
+#255'^^^'#255'^^^'#255'^^^\'#0#0#0#0'^^^'#255#240#240#240#255'{{{'#255#207
+#159'r'#255#207#159'r'#255#127'wx'#255#186#186#186#255#240#240#240#255#240
+#240#240#255#240#240#240#255#240#240#240#255#240#240#240#255#240#240#240#255
+#240#240#240#255#186#186#186#255'^^^}^^^'#255#238#238#238#255'{{{'#255#207
+#159'r'#255#207#159'r'#255'^^^'#255#240#240#240#255#216#216#216#255'{{{'#255
+'{{{'#255'{{{'#255'{{{'#255'{{{'#255#164#164#164#255#240#240#240#255'^^^'#255
+'^^^'#255#237#237#237#255'{{{'#255#207#159'r'#255#207#159'r'#255'^^^'#255#240
+#240#240#255'{{{'#255#246#245#245#255#246#245#245#255#197#192#192#255#197#192
+#192#255#244#243#243#255'{{{'#255#240#240#240#255'^^^'#255'^^^'#255#243#243
+#243#255#211#211#211#255'{{{'#255'{{{'#255'^^^'#255#240#240#240#255'{{{'#255
+#207#159'r'#255#207#159'r'#255#246#245#245#255#245#245#245#255#207#159'r'#255
+'{{{'#255#240#240#240#255'^^^'#255'^^^'#221#237#237#237#255#237#237#237#255
+#237#237#237#255#237#237#237#255'^^^'#255#240#240#240#255'{{{'#255#207#159'r'
+#255#207#159'r'#255#235#234#234#255#235#234#234#255#207#159'r'#255'{{{'#255
+#240#240#240#255'^^^'#255'^^^}^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'#255
+#240#240#240#255'{{{'#255#207#159'r'#255#207#159'r'#255#207#159'r'#255#207
+#159'r'#255#207#159'r'#255'{{{'#255#240#240#240#255'^^^'#255'^^^'#255#243#243
+#243#255#240#240#240#255#209#209#209#255#235#235#235#255'^^^'#255#240#240#240
+#255#211#211#211#255'{{{'#255'{{{'#255'{{{'#255'{{{'#255'{{{'#255#192#192#192
+#255#240#240#240#255'^^^'#255'^^^'#255#217#217#217#255#193#193#193#255#183
+#183#183#255#188#188#188#255'XXX'#255#186#186#186#255#240#240#240#255#240#240
+#240#255#240#240#240#255#240#240#240#255#240#240#240#255#240#240#240#255#240
+#240#240#255#186#186#186#255'^^^'#255#20#21#21#159'^^^'#255'^^^'#255'^^^'#255
+'^^^'#255'^^^'#151'^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'
+#255'^^^'#255'^^^'#255'^^^'#151#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'^^^'
+#255#243#243#243#255#240#240#240#255#209#209#209#255#235#235#235#255#235#235
+#235#255#200#200#200#255#197#197#197#255#197#197#197#255#232#232#232#255'^^^'
+#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'^^^'#255#217#217#217#255#193#193
+#193#255#183#183#183#255#188#188#188#255#188#188#188#255#182#182#182#255#209
+#209#209#255#213#213#213#255#196#196#196#255'^^^'#255#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0'^^^'#151'^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'#255'^^^'
+#255'^^^'#255'^^^'#255'^^^'#255'^^^'#151#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#4't:'#232#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'
+#255#4's:'#255#4't:'#232#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#4's:'#255#174
+#222#198#255#170#220#194#255#164#218#190#255#159#216#187#255#154#214#183#255
+#147#211#178#255#4's:'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#4's:'#255#176
+#223#199#255']'#189#140#255'T'#185#133#255'I'#181'}'#255'>'#176'v'#255#143
+#209#175#255#4's:'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#4's:'#255#177#223
+#199#255'^'#190#141#255'U'#186#134#255'J'#181'~'#255'?'#177'v'#255#138#207
+#172#255#4's:'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#4's:'#255#176#223
+#199#255'^'#190#141#255'T'#185#133#255'I'#181'}'#255'>'#176'v'#255#133#205
+#169#255#4's:'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#4
+'u;'#197#4's:'#255#4's:'#255#4's:'#255#4'v;'#247#175#222#198#255'['#188#139
+#255'R'#184#132#255'G'#180'|'#255'5'#173'p'#255#127#203#164#255#4'v;'#247#4
+'s:'#255#4's:'#255#4's:'#255#4'u;'#197#4's:e'''#137'V'#246#172#220#196#255
+#178#223#200#255#176#222#199#255#172#221#196#255'X'#189#137#255'N'#187#132
+#255'C'#184'|'#255#15#164'X'#255#127#206#165#255'~'#205#164#255'~'#204#164
+#255'x'#199#159#255#24#130'K'#245#4's:e'#255#255#255#0#4't;'#172'M'#164'x'
+#248#158#215#186#255'a'#192#144#255'['#193#141#255'U'#193#138#255':'#185'x'
+#255#17#173'^'#255#11#171'Y'#255#10#170'Y'#255#12#169'X'#255'h'#199#151#255
+'4'#154'e'#248#4't;'#171#255#255#255#0#255#255#255#0#4's:'#12#4't:'#225's'
+#191#152#254#135#210#172#255'V'#195#140#255'0'#186't'#255#12#177']'#255#13
+#180'_'#255#13#180'_'#255#13#179'^'#255'N'#197#137#255'U'#183#132#254#4'u;'
,#225#4's:'#12#255#255#255#0#255#255#255#0#255#255#255#0#4's:-'#11'w>'#246#143
+#211#176#255'['#200#145#255#13#180'_'#255#15#185'b'#255#15#188'e'#255#16#189
+'e'#255'2'#197'{'#255'q'#206#159#255#10'x?'#246#4's:-'#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#4's:e#'#138'V'#245'x'#210
+#165#255#28#189'k'#255#17#192'g'#255#18#197'j'#255#31#201's'#255'x'#219#168
+#255#30#137'R'#245#4's:e'#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#4'u;'#172'='#163'o'#249'i'
+#213#158#255#18#196'i'#255#20#203'n'#255'l'#224#165#255'?'#168'r'#249#4'v<'
+#171#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#4's:'#12#4'v;'#225']'#191#141#254
+'L'#209#141#255'N'#213#144#255'_'#197#146#254#4'v<'#225#4's:'#12#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#4's:-'#14'zB'#246't'#209#162#255'u'
+#211#163#255#14'{B'#246#4's:-'#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4
+'s:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'
+#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4
+'s:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#4's:'
+#255#4's:'#255#4's:'#255#4's:'#255#4's:'#255#255#255#255#0#255#255#255#0#226
+#162#137#164#208#146#127#215#212#144'x'#218#211#144'y'#218#213#146'{'#218#215
+#148'|'#218#216#148'}'#218#219#150#127#218#219#152#128#218#220#154#129#218
+#225#159#134#219#212#147'|'#174#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#182'zl'#245#215#155#136#255#229#160#136#255#229#162#136#255#230
+#160#134#255#231#159#132#255#232#161#133#255#234#164#136#255#238#170#142#255
+#240#174#147#255#244#178#151#255#206#140'v'#231#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#178'vg'#245#210#151#132#255#222#155#130#255#221
+#153#129#255#239#202#187#255#251#241#238#255#251#239#235#255#249#233#227#255
+#237#182#162#255#234#165#137#255#239#172#145#255#206#139'u'#231#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#221#182#175#250#203#142'{'#255#213
+#139's'#255#251#244#241#255#255#255#255#255#249#245#243#255#249#234#229#255
+#255#255#255#255#255#255#255#255#232#184#164#255#234#164#138#255#206#138't'
+#231#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#176'te'#245#200
+#140'z'#255#223#172#156#255#255#255#255#255#248#242#240#255#210#137'p'#255
+#214#137'm'#255#235#194#182#255#255#255#255#255#238#216#209#255#225#155#130
+#255#206#139'v'#226#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#178'yj'#245#197#138'{'#255#204#134'o'#255#224#184#171#255#200#133'o'#255#207
+#135'o'#255#227#183#168#255#254#251#250#255#255#255#255#255#209#154#137#255
+#222#154#129#255#203#135'r'#226#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#178'wi'#245#192#134'v'#255#202#135's'#255#200#132'p'#255#202#132
+'n'#255#231#199#188#255#255#255#255#255#251#248#247#255#207#152#136#255#214
+#145'x'#255#216#150#127#255#198#132'o'#226#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#177'vh'#245#188#131's'#255#195#130'o'#255#197#131'o'
+#255#194'zd'#255#253#251#250#255#255#255#255#255#192'{h'#255#207#139's'#255
+#209#143'y'#255#211#145'{'#255#195#127'l'#226#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#173'pb'#245#184'}p'#255#190'}i'#255#192'~k'#255#191
+'zf'#255#223#188#177#255#217#181#172#255#198#127'h'#255#202#136's'#255#204
+#138'u'#255#206#140'v'#255#191'}i'#226#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#218#178#170#250#175'vh'#255#185'xe'#255#187'yg'#255#183
+'oZ'#255#253#250#250#255#255#255#255#255#196#133's'#255#195#130'n'#255#198
+#132'p'#255#200#134'r'#255#189'yf'#225#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#180'wj'#245#174'uh'#255#179'sb'#255#181'tb'#255#180'p]'
+#255#221#190#180#255#231#209#204#255#187'yf'#255#191'}i'#255#193#127'l'#255
+#195#129'm'#255#186'vd'#247#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#175'tg'#245#173'uh'#255#176'p^'#255#178'q`'#255#180'tb'#255#179'n\'
+#255#181'o]'#255#187'xf'#255#189'{h'#255#191'}k'#255#193#127'k'#255#184'uc'
+#247#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#150'WK'#245#137
+'F;'#255#138'D7'#255#139'D7'#255#140'E8'#255#141'F9'#255#142'G9'#255#143'H:'
+#255#144'I;'#255#145'J<'#255#146'K='#255#154'UG'#240#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0'xFA'#245#219#220#220#255#212#220#220#255
+#212#220#220#255#212#220#220#255#211#220#220#255#211#220#220#255#211#220#220
+#255#211#220#220#255#211#220#220#255#214#220#220#255#176#146#139#139#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#149'VJ'#251#137'F;'#255#138
+'D7'#255#139'D7'#255#140'E8'#255#141'F9'#255#142'G9'#255#143'H:'#255#144'I;'
+#255#145'J<'#255#146'K='#255#152'SF'#248#255#255#255#0#255#255#255#0#255#255
,#255#0#187'j4k'#186'e0'#188#187'f1'#237#186'f0'#247#186'f0'#247#186'f0'#247
+#186'e0'#247#186'e/'#247#185'e.'#247#185'e.'#247#185'd.'#247#185'd.'#239#183
+'b,'#189#183'b.c'#255#255#255#0#0#0#11'TFontDialog'#7'dlgFont'#11'MinFontSiz'
+'e'#2#0#11'MaxFontSize'#2#0#4'left'#2'z'#3'top'#3#215#0#0#0#0
]);

688
src/fRbnMonitor.pas Normal file
View File

@ -0,0 +1,688 @@
unit fRbnMonitor;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
ComCtrls, ActnList, StdCtrls, Grids, lNetComponents, lNet, lclType, RegExpr;
const
C_MAX_ROWS = 1000; //max lines in the list of RBN spots
type
TRbnSpot = record
spotter : String[20];
dxstn : String[20];
freq : String[20];
mode : String[10];
qsl : String[2];
dxinfo : String[1];
signal : String[3];
end;
type
TOnShowSpotEvent = procedure(RbnSpot : TRbnSpot) of Object;
type
TRbnThread = class(TThread)
private
cs : TRTLCriticalSection;
reg : TRegExpr;
fRbnSpot : TRbnSpot;
FOnShowSpot : TOnShowSpotEvent;
function AllowedSpot(spotter, dxstn, freq, mode, LoTW, eQSL : String; var dxinfo : String) : Boolean;
procedure ShowSpot;
protected
procedure Execute; override;
public
DxccWithLoTW : Boolean;
fil_SrcCont : String;
fil_IgnWkdHour : Boolean;
fil_IgnHourValue : Integer;
fil_IgnDate : Boolean;
fil_IgnDateValue : String;
fil_IgnTimeValue : String;
fil_AllowAllCall : Boolean;
fil_AllowOnlyCall : Boolean;
fil_AllowOnlyCallValue : String;
fil_AllowOnlyCallReg : Boolean;
fil_AllowOnlyCallRegValue : String;
fil_AllowCont : String;
fil_AllowBands : String;
fil_AllowModes : String;
fil_AllowCnty : String;
fil_NotCnty : String;
fil_LoTWOnly : Boolean;
fil_eQSLOnly : Boolean;
fil_NewDXCOnly : Boolean;
property OnShowSpot : TOnShowSpotEvent read FOnShowSpot write FOnShowSpot;
end;
type
TfrmRbnMonitor = class(TForm)
acRbnMonitor: TActionList;
acConnect: TAction;
acDisconnect: TAction;
acFontSettings: TAction;
acFilter: TAction;
acRbnServer: TAction;
acScrollDown : TAction;
acHelp : TAction;
btnEatFocus : TButton;
dlgFont: TFontDialog;
imgRbnMonitor: TImageList;
sbRbn: TStatusBar;
sgRbn: TStringGrid;
ToolBar1: TToolBar;
tbtnConnect: TToolButton;
ToolButton1 : TToolButton;
ToolButton10 : TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8 : TToolButton;
ToolButton9 : TToolButton;
procedure acConnectExecute(Sender: TObject);
procedure acDisconnectExecute(Sender: TObject);
procedure acFilterExecute(Sender: TObject);
procedure acFontSettingsExecute(Sender: TObject);
procedure acHelpExecute(Sender : TObject);
procedure acRbnServerExecute(Sender: TObject);
procedure acScrollDownExecute(Sender : TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure sgRbnDblClick(Sender: TObject);
procedure sgRbnDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect;
aState: TGridDrawState);
procedure sgRbnHeaderSized(Sender: TObject; IsColumn: Boolean;
Index: Integer);
private
RbnMonThread : TRbnThread;
lTelnet : TLTelnetClientComponent;
aRbnArchive : Array of TRbnSpot;
procedure lConnect(aSocket: TLSocket);
procedure lDisconnect(aSocket: TLSocket);
procedure lReceive(aSocket: TLSocket);
procedure AddSpotToThread(spot : String);
public
csRbnMonitor : TRTLCriticalSection;
slRbnSpots : TStringList;
DeleteCount : Integer;
procedure SynRbnMonitor(RbnSpot : TRbnSpot);
procedure LoadConfigToThread;
end;
var
frmRbnMonitor: TfrmRbnMonitor;
implementation
uses dUtils, uMyIni, dData, fRbnServer, dDXCluster, fRbnFilter, fNewQSO;
{ TfrmRbnMonitor }
procedure TRBNThread.ShowSpot;
begin
if Assigned(OnShowSpot) then
begin
FOnShowSpot(fRbnSpot)
end;
end;
function TRBNThread.AllowedSpot(spotter, dxstn, freq, mode, LoTW, eQSL : String; var dxinfo : String) : Boolean;
var
SrcCont : String;
DestCont : String;
Country : String;
waz,itu : String;
pfx : String;
LastDate : String;
LastTime : String;
Band : String;
adif : Word;
index : Integer;
f : Double;
begin
Result := False;
dmDXCluster.id_country(spotter,now,pfx,Country,waz,itu,SrcCont);
if (Pos(SrcCont+',',fil_SrcCont+',') = 0) and (fil_SrcCont<>'') then
begin
Writeln('RBNMonitor: ','Wrong source continent - ',SrcCont);
exit
end;
if fil_IgnWkdHour then
begin
LastDate := FormatDateTime('YYY-MM-DD',now - (fil_IgnHourValue/57));
LastTime := FormatDateTime('HH:NN',now - (fil_IgnHourValue/24))
end
else begin
LastDate := fil_IgnDateValue;
LastTime := fil_IgnTimeValue
end;
Band := dmDXCluster.GetBandFromFreq(freq,True);
if (Band='') then
begin
Writeln('RBNMonitor: ','Wrong band - ',Band);
exit
end;
if dmData.RbnCallExistsInLog(dxstn,Band,mode,LastDate,LastTime) then
begin
Writeln('RBNMonitor: ','Station already exist in the log - ',dxstn);
exit
end;
if fil_AllowOnlyCall then
begin
if Pos(dxstn+',',fil_AllowOnlyCallValue+',') = 0 then
begin
Writeln('RBNMonitor: ','Station is not between allowed callsigns - ',dxstn);
exit
end
end;
if fil_AllowOnlyCallReg then
begin
reg.Expression := fil_AllowOnlyCallRegValue;
reg.InputString := dxstn;
if not reg.Exec(1) then
begin
Writeln('RBNMonitor: ','Station is not between allowed callsigns - ',dxstn);
exit
end
end;
if (Pos(band+',',fil_AllowBands+',')=0) and (fil_AllowBands<>'') then
begin
Writeln('RBNMonitor: ','This band is NOT allowed - ',band);
exit
end;
if (Pos(mode+',',fil_AllowModes+',')=0) and (fil_AllowModes<>'') then
begin
Writeln('RBNMonitor: ','This mode is NOT allowed - ',mode);
exit
end;
adif := dmDXCluster.id_country(dxstn,now,Pfx,Country,waz,itu,DestCont);
if (Pos(DestCont+',',fil_AllowCont+',') = 0) and (fil_AllowCont<>'') then
begin
Writeln('RBNMonitor: ','Wrong continent - ',DestCont);
exit
end;
if ((fil_NotCnty<>'') and (Pos(pfx+',',fil_NotCnty+',')>0)) then
begin
Writeln('RBNMonitor: ','This country is not allowed - ',pfx);
exit
end;
if ((fil_AllowCnty<>'') and (Pos(pfx+',',fil_AllowCnty+',')=0)) then
begin
Writeln('RBNMonitor: ','This country is not allowed - ',pfx);
exit
end;
if fil_LoTWOnly and (LoTW<>'L') then
begin
Writeln('RBNMonitor: ','This station is not LoTW user - ',dxstn);
exit
end;
if fil_eQSLOnly and (eQSL<>'E') then
begin
Writeln('RBNMonitor: ','This station is not eQSL user - ',dxstn);
exit
end;
dmData.RbnMonDXCCInfo(adif,band,mode,DxccWithLoTW,index);
case index of
1 : dxinfo := 'N';
2 : dxinfo := 'B';
3 : dxinfo := 'M';
else
dxinfo := ''
end; //case
if fil_NewDXCOnly then
begin
if (index>0) and (index<4) then
begin
Writeln('RBNMonitor: ','Not new one, band or mode - ',dxstn);
exit
end
end;
Result := True
end;
procedure TRBNThread.Execute;
var
spot : String;
spotter : String;
freq : String;
stren : String;
mode : String;
dxstn : String;
LoTW : String;
eQSL : String;
dxinfo : String;
RbnSpot : TRbnSpot;
index : Integer;
begin
reg := TRegExpr.Create;
try try
while not Terminated do
begin
EnterCriticalsection(frmRbnMonitor.csRbnMonitor);
try
if frmRbnMonitor.slRbnSpots.Count>0 then
begin
spot := frmRbnMonitor.slRbnSpots.Strings[0];
frmRbnMonitor.slRbnSpots.Delete(0)
end
else
spot := ''
finally
LeaveCriticalsection(frmRbnMonitor.csRbnMonitor)
end;
if (spot='') then
begin
sleep(200);
Continue
end;
spotter := trim(copy(spot,7,Pos('-',spot)-7));
freq := trim(copy(spot,18,9));
stren := trim(copy(spot,Pos('dB',spot)-4,4));
mode := trim(copy(spot,41,6));
dxstn := copy(spot,Pos('.',spot)+3,Length(spot)-Pos('.',spot)-1);
dxstn := trim(dxstn);
dxstn := trim(copy(dxstn,1,Pos(' ',dxstn)));
Writeln('Spotter:',spotter);
Writeln('Freq:',freq);
Writeln('Stren:',stren);
Writeln('Mode:',mode);
Writeln('Dxstn:',dxstn);
Writeln('Before UsesLoTW');
if dmDXCluster.UsesLotw(dxstn) then
LoTW := 'L'
else
LoTW := '';
Writeln('Before UseseQSL');
if dmDXCluster.UseseQSL(dxstn) then
eQSL := 'E'
else
eQSL := '';
if AllowedSpot(spotter,dxstn,freq,mode,LoTW,eQSL,dxinfo) then
begin
fRbnSpot.spotter := spotter;
fRbnSpot.dxstn := dxstn;
fRbnSpot.freq := freq;
fRbnSpot.mode := mode;
fRbnSpot.qsl := LoTW+eQSL;
fRbnSpot.dxinfo := dxinfo;
fRbnSpot.signal := stren;
Synchronize(@ShowSpot)
end;
Sleep(100)
end
except
on E: Exception do
Writeln('*********',E.Message)
end
finally
FreeAndNil(reg)
end
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TfrmRbnMonitor.AddSpotToThread(spot : String);
begin
EnterCriticalsection(csRbnMonitor);
try
slRbnSpots.Add(spot)
finally
LeaveCriticalsection(csRbnMonitor)
end
end;
procedure TfrmRbnMonitor.lConnect(aSocket: TLSocket);
begin
tbtnConnect.Action := acDisconnect;
sbRbn.Panels[0].Text := 'Connected to RBN'
end;
procedure TfrmRbnMonitor.lDisconnect(aSocket: TLSocket);
begin
tbtnConnect.Action := acConnect;
sbRbn.Panels[0].Text := 'Disconected'
end;
procedure TfrmRbnMonitor.lReceive(aSocket: TLSocket);
const
CR = #13;
LF = #10;
var
sStart, sStop: Integer;
tmp : String;
buffer : String;
UserName : String;
begin
if lTelnet.GetMessage(buffer) = 0 then
exit;
sStart := 1;
sStop := Pos(CR, Buffer);
if sStop = 0 then
sStop := Length(Buffer) + 1;
while sStart <= Length(Buffer) do
begin
tmp := Copy(Buffer, sStart, sStop - sStart);
tmp := trim(tmp);
if dmData.DebugLevel >=1 then Writeln(tmp);
if (Pos('DX DE',UpperCase(tmp))>0) then
begin
writeln(tmp);
AddSpotToThread(tmp)
end
else begin
UserName := cqrini.ReadString('RBNMonitor','UserName',cqrini.ReadString('Station', 'Call', ''));
if (Pos('LOGIN',UpperCase(tmp)) > 0) and (UserName <> '') then
lTelnet.SendMessage(UserName+#13+#10);
if (Pos('please enter your call',LowerCase(tmp)) > 0) and (UserName <> '') then
lTelnet.SendMessage(UserName+#13+#10)
end;
sStart := sStop + 1;
if sStart > Length(Buffer) then
Break;
if Buffer[sStart] = LF then
sStart := sStart + 1;
sStop := sStart;
while (Buffer[sStop] <> CR) and (sStop <= Length(Buffer)) do
sStop := sStop + 1
end;
lTelnet.CallAction
end;
procedure TfrmRbnMonitor.acConnectExecute(Sender: TObject);
var
port : Integer;
server : String;
user : String;
begin
RbnMonThread := TRBNThread.Create(True);
RbnMonThread.FreeOnTerminate := True;
RbnMonThread.OnShowSpot := @SynRbnMonitor;
RbnMonThread.Start;
LoadConfigToThread;
server := cqrini.ReadString('RBNMonitor','ServerName','telnet.reversebeacon.net:7000');
user := cqrini.ReadString('RBNMonitor','UserName',cqrini.ReadString('Station', 'Call', ''));
if (user='') then
begin
Application.MessageBox('User name is not defined!','Warning...',mb_ok+mb_IconWarning);
acRbnServer.Execute;
exit
end;
lTelnet.Host := Copy(server,1,Pos(':',server)-1);
if not TryStrToInt(Copy(server,Pos(':',server)+1,6),port) then
port := 7000;
lTelnet.Port := port;
Writeln(server,' ',port);
lTelnet.Connect;
btnEatFocus.SetFocus
end;
procedure TfrmRbnMonitor.acDisconnectExecute(Sender: TObject);
begin
lTelnet.Disconnect();
RbnMonThread.Terminate;
tbtnConnect.Action := acConnect
end;
procedure TfrmRbnMonitor.acFilterExecute(Sender: TObject);
begin
with TfrmRbnFilter.Create(frmRbnMonitor) do
try
if ShowModal = mrOK then
LoadConfigToThread
finally
Free
end;
btnEatFocus.SetFocus
end;
procedure TfrmRbnMonitor.acFontSettingsExecute(Sender: TObject);
begin
dlgFont.Font := sgRbn.Font;
if dlgFont.Execute then
begin
cqrini.WriteString('RBNMonitor','Font',dlgFont.Font.Name);
cqrini.WriteInteger('RBNMonitor','FontSize',dlgFont.Font.Size);
sgRbn.Font := dlgFont.Font
end;
btnEatFocus.SetFocus
end;
procedure TfrmRbnMonitor.acHelpExecute(Sender : TObject);
begin
ShowMessage('Not implemented, yet')
end;
procedure TfrmRbnMonitor.acRbnServerExecute(Sender: TObject);
begin
with TfrmRbnServer.Create(frmRbnMonitor) do
try
edtServerName.Text := cqrini.ReadString('RBNMonitor','ServerName','telnet.reversebeacon.net:7000');
edtUserName.Text := cqrini.ReadString('RBNMonitor','UserName',cqrini.ReadString('Station', 'Call', ''));
if ShowModal = mrOK then
begin
cqrini.WriteString('RBNMonitor','ServerName',edtServerName.Text);
cqrini.WriteString('RBNMonitor','UserName',edtUserName.Text)
end
finally
Free
end;
btnEatFocus.SetFocus
end;
procedure TfrmRbnMonitor.acScrollDownExecute(Sender : TObject);
begin
sgRbn.Row := sgRbn.RowCount;
btnEatFocus.SetFocus
end;
procedure TfrmRbnMonitor.FormClose(Sender: TObject;
var CloseAction: TCloseAction);
var
i : Integer;
begin
for i:=0 to sgRbn.ColCount-1 do
cqrini.WriteInteger('WindowSize','RbnCol'+IntToStr(i),sgRbn.ColWidths[i]);
dmUtils.SaveWindowPos(self)
end;
procedure TfrmRbnMonitor.FormCreate(Sender: TObject);
begin
InitCriticalSection(csRbnMonitor);
DeleteCount := 0;
sgRbn.RowCount := 1;
slRbnSpots := TStringList.Create;
lTelnet := TLTelnetClientComponent.Create(nil);
lTelnet.OnConnect := @lConnect;
lTelnet.OnDisconnect := @lDisconnect;
lTelnet.OnReceive := @lReceive
end;
procedure TfrmRbnMonitor.FormDestroy(Sender: TObject);
begin
FreeAndNil(lTelnet);
DoneCriticalsection(csRbnMonitor);
FreeAndNil(slRbnSpots)
end;
procedure TfrmRbnMonitor.FormShow(Sender: TObject);
var
i : Integer;
begin
for i:=0 to sgRbn.ColCount-1 do
sgRbn.ColWidths[i] := cqrini.ReadInteger('WindowSize','RbnCol'+IntToStr(i),70);
dmUtils.LoadWindowPos(self);
sgRbn.Options := sgRbn.Options + [goColSizing] - [goRowSelect, goRangeSelect];
sgRbn.Font.Name := cqrini.ReadString('RBNMonitor','Font','DejaVu Sans Mono');
sgRbn.Font.Size := cqrini.ReadInteger('RBNMonitor','FontSize',10);
sgRbn.Cells[0,0] := 'Source';
sgRbn.Cells[1,0] := 'Freq';
sgRbn.Cells[2,0] := 'DX';
sgRbn.Cells[3,0] := 'Mode';
sgRbn.Cells[4,0] := 'dB';
sgRbn.Cells[5,0] := 'Q';
sgRbn.Cells[6,0] := 'D'
end;
procedure TfrmRbnMonitor.sgRbnDblClick(Sender: TObject);
begin
frmNewQSO.NewQSOFromSpot(sgRbn.Cells[2,sgRbn.Row],sgRbn.Cells[1,sgRbn.Row],sgRbn.Cells[3,sgRbn.Row],True)
end;
procedure TfrmRbnMonitor.sgRbnDrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
begin
{
if (aRow>0) then
begin
if (Arow mod 2 > 0) then
sgRbn.Canvas.Brush.Color:= clwhite
else
sgRbn.Canvas.Brush.Color:= $00E7FFEB;
sgRbn.Canvas.FillRect(aRect);
sgRbn.Canvas.TextOut(aRect.Left, aRect.top + 4, sgRbn.Cells[ACol, ARow])
end }
end;
procedure TfrmRbnMonitor.sgRbnHeaderSized(Sender: TObject; IsColumn: Boolean;
Index: Integer);
begin
btnEatFocus.SetFocus
end;
procedure TfrmRbnMonitor.LoadConfigToThread;
begin
if Assigned(RbnMonThread) then
begin
RbnMonThread.fil_SrcCont := cqrini.ReadString('RBNFilter','SrcCont',C_RBN_CONT);
RbnMonThread.fil_IgnWkdHour := cqrini.ReadBool('RBNFilter','IgnHour',True);
RbnMonThread.fil_IgnHourValue := cqrini.ReadInteger('RBNFilter','IgnHourValue',48);
RbnMonThread.fil_IgnDate := cqrini.ReadBool('RBNFilter','IgnDate',False);
RbnMonThread.fil_IgnDateValue := cqrini.ReadString('RBNFilter','IgnDateValue','');
RbnMonThread.fil_IgnTimeValue := cqrini.ReadString('RBNFilter','IgnTimeValue','');
RbnMonThread.fil_AllowAllCall := cqrini.ReadBool('RBNFilter','AllowAllCall',True);
RbnMonThread.fil_AllowOnlyCall := cqrini.ReadBool('RBNFilter','AllowOnlyCall',False);
RbnMonThread.fil_AllowOnlyCallValue := cqrini.ReadString('RBNFilter','AllowOnlyCallValue','');
RbnMonThread.fil_AllowOnlyCallReg := cqrini.ReadBool('RBNFilter','AllowOnlyCallReg',False);
RbnMonThread.fil_AllowOnlyCallRegValue := cqrini.ReadString('RBNFilter','AllowOnlyCallRegValue','');
RbnMonThread.fil_AllowCont := cqrini.ReadString('RBNFilter','AllowCont',C_RBN_CONT);
RbnMonThread.fil_AllowBands := cqrini.ReadString('RBNFilter','AllowBands',C_RBN_BANDS);
RbnMonThread.fil_AllowModes := cqrini.ReadString('RBNFilter','AllowModes',C_RBN_MODES);
RbnMonThread.fil_AllowCnty := cqrini.ReadString('RBNFilter','AllowCnty','');
RbnMonThread.fil_NotCnty := cqrini.ReadString('RBNFilter','NotCnty','');
RbnMonThread.fil_LoTWOnly := cqrini.ReadBool('RBNFilter','LoTWOnly',False);
RbnMonThread.fil_eQSLOnly := cqrini.ReadBool('RBNFilter','eQSLOnly',False);
RbnMonThread.fil_NewDXCOnly := cqrini.ReadBool('RBNFilter','NewDXCOnly',False)
end
end;
procedure TfrmRbnMonitor.SynRbnMonitor(RbnSpot : TRbnSpot);
var
i : Integer;
procedure AddRow;
begin
i := sgRbn.RowCount+1;
sgRbn.RowCount := i;
dec(i);
sgRbn.Cells[0,i] := RbnSpot.spotter;
sgRbn.Cells[1,i] := RbnSpot.freq;
sgRbn.Cells[2,i] := RbnSpot.dxstn;
sgRbn.Cells[3,i] := RbnSpot.mode;
sgRbn.Cells[4,i] := RbnSpot.signal;
sgRbn.Cells[5,i] := RbnSpot.qsl;
sgRbn.Cells[6,i] := RbnSpot.dxinfo
end;
begin
if sgRbn.Focused then
begin
inc(DeleteCount);
AddRow
end
else begin
AddRow;
if DeleteCount>0 then
begin
if (sgRbn.RowCount > C_MAX_ROWS) then
begin
for i:=1 to DeleteCount do
sgRbn.DeleteRow(0)
end;
DeleteCount := 0
end
else begin
if sgRbn.RowCount>C_MAX_ROWS then
sgRbn.DeleteRow(0)
end;
sgRbn.Row := sgRbn.RowCount
end
end;
initialization
{$I fRbnMonitor.lrs}
end.

63
src/fRbnServer.lfm Normal file
View File

@ -0,0 +1,63 @@
object frmRbnServer: TfrmRbnServer
Left = 435
Height = 132
Top = 330
Width = 428
ActiveControl = edtServerName
BorderStyle = bsDialog
Caption = 'Change RBN server address'
ClientHeight = 132
ClientWidth = 428
Position = poOwnerFormCenter
LCLVersion = '1.2.4.0'
object Label1: TLabel
Left = 8
Height = 17
Top = 9
Width = 77
Caption = 'Server:port'
ParentColor = False
end
object edtServerName: TEdit
Left = 8
Height = 27
Top = 32
Width = 328
TabOrder = 0
Text = 'edtServerName'
end
object Button1: TButton
Left = 346
Height = 25
Top = 5
Width = 75
Caption = 'OK'
OnClick = Button1Click
TabOrder = 2
end
object Button2: TButton
Left = 346
Height = 25
Top = 34
Width = 75
Cancel = True
Caption = 'Cancel'
TabOrder = 3
end
object Label2: TLabel
Left = 8
Height = 17
Top = 70
Width = 75
Caption = 'User name:'
ParentColor = False
end
object edtUserName: TEdit
Left = 8
Height = 27
Top = 95
Width = 179
TabOrder = 1
Text = 'edtUserName'
end
end

19
src/fRbnServer.lrs Normal file
View File

@ -0,0 +1,19 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TfrmRbnServer','FORMDATA',[
'TPF0'#13'TfrmRbnServer'#12'frmRbnServer'#4'Left'#3#179#1#6'Height'#3#132#0#3
+'Top'#3'J'#1#5'Width'#3#172#1#13'ActiveControl'#7#13'edtServerName'#11'Borde'
+'rStyle'#7#8'bsDialog'#7'Caption'#6#25'Change RBN server address'#12'ClientH'
+'eight'#3#132#0#11'ClientWidth'#3#172#1#8'Position'#7#17'poOwnerFormCenter'
+#10'LCLVersion'#6#7'1.2.4.0'#0#6'TLabel'#6'Label1'#4'Left'#2#8#6'Height'#2#17
+#3'Top'#2#9#5'Width'#2'M'#7'Caption'#6#11'Server:port'#11'ParentColor'#8#0#0
+#5'TEdit'#13'edtServerName'#4'Left'#2#8#6'Height'#2#27#3'Top'#2' '#5'Width'#3
+'H'#1#8'TabOrder'#2#0#4'Text'#6#13'edtServerName'#0#0#7'TButton'#7'Button1'#4
+'Left'#3'Z'#1#6'Height'#2#25#3'Top'#2#5#5'Width'#2'K'#7'Caption'#6#2'OK'#7'O'
+'nClick'#7#12'Button1Click'#8'TabOrder'#2#2#0#0#7'TButton'#7'Button2'#4'Left'
+#3'Z'#1#6'Height'#2#25#3'Top'#2'"'#5'Width'#2'K'#6'Cancel'#9#7'Caption'#6#6
+'Cancel'#8'TabOrder'#2#3#0#0#6'TLabel'#6'Label2'#4'Left'#2#8#6'Height'#2#17#3
+'Top'#2'F'#5'Width'#2'K'#7'Caption'#6#10'User name:'#11'ParentColor'#8#0#0#5
+'TEdit'#11'edtUserName'#4'Left'#2#8#6'Height'#2#27#3'Top'#2'_'#5'Width'#3#179
+#0#8'TabOrder'#2#1#4'Text'#6#11'edtUserName'#0#0#0
]);

58
src/fRbnServer.pas Normal file
View File

@ -0,0 +1,58 @@
unit fRbnServer;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, lclType;
type
{ TfrmRbnServer }
TfrmRbnServer = class(TForm)
Button1: TButton;
Button2: TButton;
edtUserName: TEdit;
edtServerName: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
frmRbnServer: TfrmRbnServer;
implementation
{ TfrmRbnServer }
procedure TfrmRbnServer.Button1Click(Sender: TObject);
begin
if (edtServerName.Text='') then
begin
Application.MessageBox('Enter address to RBN server, please','Warning...', mb_ok+mb_IconWarning);
edtServerName.SetFocus;
exit
end;
if (Pos(':',edtServerName.Text)=0) then
begin
Application.MessageBox('Address does not have PORT specified. The correct value is servername:port','Warning...', mb_ok+mb_IconWarning);
edtServerName.SetFocus;
exit
end;
ModalResult := mrOK
end;
initialization
{$I fRbnServer.lrs}
end.