Asynchronous block scanning

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;



type

  TForm1 = class(TForm)

    ListBox1: TListBox;

    BlockScanButton: TButton;

    procedure FormCreate(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure BlockScanButtonClick(Sender: TObject);

  private

  procedure WMUser(var Msg: TMessage); message WM_USER;

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;

  Dll: HMODULE;

  hRadio: Integer;

  curFreq: DWORD;

  Freqs: array[0..1000] of DWORD;   // buffer for scan data



  OpenRadioDevice: function(iDeviceNum: Integer): Integer; stdcall;

  CloseRadioDevice: function(hRadio: Integer): Bool; stdcall;

  SetAtten: function(hRadio: Integer; fAtten: Bool): Bool; stdcall;

  SetPower: function(hRadio: Integer; fPower: Bool): Bool; stdcall;

  SetAGC: function(hRadio: Integer; iAGC: Integer): Bool; stdcall;

  BlockScan: function(hRadio: Integer; Freqs: PDWORD; Count: Integer; StopSquelchRaw: Integer; FeedbackTime: DWORD; WinHandle: HWND; Msg: DWORD): Bool; stdcall;

  StopBlockScan: function(hRadio: Integer): Bool; stdcall;



implementation



{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);

begin

Dll:=LoadLibrary('wrg303api.dll');

hRadio:=0;



if (Dll=0) then ShowMessage('WRG303API.DLL not found !')

else begin

     OpenRadioDevice:=GetProcAddress(dll,'OpenRadioDevice');

     CloseRadioDevice:=GetProcAddress(dll,'CloseRadioDevice');

     SetAtten:=GetProcAddress(dll,'SetAtten');

     SetPower:=GetProcAddress(dll,'SetPower');

     SetAGC:=GetProcAddress(dll,'SetAGC');

     BlockScan:=GetProcAddress(dll,'BlockScan');

     StopBlockScan:=GetProcAddress(dll,'StopBlockScan');



     hRadio:=OpenRadioDevice(0);

     end;

end;



procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if (hRadio <> 0) then begin

   StopBlockScan(hRadio);    // just to be sure

   CloseRadioDevice(hRadio);

   end;

if (Dll <> 0) then FreeLibrary(Dll);

end;



procedure TForm1.BlockScanButtonClick(Sender: TObject);

var i: Integer;

begin

if (hRadio <> 0) then begin    // if a radio is opened

   // set the properties

   SetPower(hRadio,TRUE);

   SetAtten(hRadio,FALSE);

   SetAGC(hRadio,3);      // FAST AGC



   for i:=0 to 1000 do Freqs[i]:=600000+200*i;   // frequencies from 600 to 800 kHz

   curFreq:=600000;    // variable used to display scanned data

   if (not BlockScan(hRadio,@Freqs,1001,256,500,Handle,WM_USER)) then

      ShowMessage('Block scan failed to start');

   end;

end;



procedure TForm1.WMUser(var Msg: TMessage);

var i: Integer;

    pi: PDWORD;

begin

if (Msg.WParam=0) then ListBox1.Items.Add('Block scan ended')

else begin

     pi:=PDWORD(Msg.WParam);

     for i:=1 to Msg.LParam do begin

         ListBox1.Items.Add('Freq: '+IntToStr(curFreq)+' RAW: '+IntToStr(pi^));

         inc(pi); inc(curFreq,200);   // next frequency to display

         end;

     end;

end;



end.