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.