Controlling WiNRADiO 1500 series receivers using the DDE interface.

Under Windows, WiNRADiO can be controlled from another program, including a word processor or a spreadsheet, using WiNRADiO's DDE (Dynamic Data Exchange) interface.

DDE Execute commands:

SetFrequency(freq) freq is the receiving frequency in Hz.
SetMode(mode) mode can be: `SSB', `AM', `FMN' or `FMW'.
SetVolume(volume) volume is in between 0 and 31 (quietest to loudest)
SetBFOOffset(offset) offset is the BFO offset between -3000 and +3000 in Hz.
SetSquelch(squelch) squelch is between 0 and 100
AttenOn select local
AttenOff select DX
PowerOn switch power on
PowerOff switch power off
MuteOn switch mute on
MuteOff switch mute off

DDE Request commands:

GetFrequency returns frequency in Hz
GetMode returns the mode: `SSB', `AM', `FMN' or `FMW'.
GetSignalStrength returns between 0 and 100
GetVolume returns between 0 and 31
GetBFOOffset returns between -3000 and 3000
GetSquelch returns between 0 and 100
GetAtten returns either `DX' or `L' (local)
GetPower returns either `on' or `off'
GetMute returns either `on' or `off'

Each command must be enclosed in square brackets, and multiple commands may be sent at the one time.

The following example shows how to control WiNRADiO using Word for Windows' macro language. Suppose we wish to tune to a broadcast FM station on 101.5 MHz, with medium volume, sensitivity set to 'Local', and have the signal strength inserted into the current document:

Sub MAIN
	channel = DDEInitiate("WinRadio", "WinRadio")
	DDEExecute channel, "[PowerOn][SetFrequency(101500000)]"
	DDEExecute channel, "[SetMode(FMW)][SetVolume(10)]"
	DDEExecute channel, "[AttenOn]"
	ss$ = DDERequest$(channel, "GetSignalStrength")
	Insert ss$
	DDETerminate channel
End Sub
The above example works well for MS Word version 6. For version 7, use the following instead:
Sub MAIN
	channel = DDEInitiate("WinRadio", "WinRadio")
	DDEExecute channel, "[PowerOn][SetFrequency(101500000)]"
	DDEExecute channel, "[SetMode(FMW)][SetVolume(10)]"
	DDEExecute channel, "[AttenOn]"
	ss$ = DDERequest(channel, "GetSignalStrength")
	Selection.Text=ss$
	DDETerminate channel
End Sub

Using the DDE interface, you can also write WiNRADiO-based programs in high-level languages such as C, C++, Delphi, Visual Basic and any other language that supports Windows programming.

The following example is part of a small Delphi program (supplied with the WiNRADiO software) that controls WiNRADiO through DDE:

unit WRDDEEx;	{ WiNRADiO DDE example for Delphi }

interface

...

implementation

...

procedure TWinRadioDDEForm.FreqEditChange(Sender: TObject);
var
  s: array [0..31] of Char;
begin
  DDEClient.SetLink('WinRadio', 'WinRadio');
  if DDEClient.OpenLink then
  begin
    StrPCopy(s, '[SetFrequency(' + 
      IntToStr(FreqEdit.Value * 1000) + ')]');
    DDEClient.ExecuteMacro(s, False); 
    DDEClient.CloseLink;
  end;
end;

...

procedure TWinRadioDDEForm.FormCreate(Sender: TObject);
var
  s: String;
  fr, vo, bf, sq, mo, at, pr, mu, po: PChar;
begin
  DDEClient.SetLink('WinRadio', 'WinRadio');
  if DDEClient.OpenLink then
  begin
    fr := DDEClient.RequestData('GetFrequency');
    vo := DDEClient.RequestData('GetVolume');
    bf := DDEClient.RequestData('GetBFOOffset');
    sq := DDEClient.RequestData('GetSquelch');
    mo := DDEClient.RequestData('GetMode');
    at := DDEClient.RequestData('GetAtten');
    mu := DDEClient.RequestData('GetMute');
    po := DDEClient.RequestData('GetPower');
    DDEClient.CloseLink;
    ...
    ...
  end;
end;

end.

The following Delphi code was provided courtesy James Brown (W6KYP, www.seti.net), whose application of WiNRADiO receivers for SETI (Search for Extraterrestrial Intelligence) research is one of the most interesting we have seen:

unit SETIWiNRADiO;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, DdeMan, ShellAPI, FMXUtils;

type
  TfrmWiNRADiO = class(TForm)
    DdeClientItem: TDdeClientItem;
    DdeClientConv: TDdeClientConv;
    btnSetFreq: TButton;
    btnGetFreq: TButton;
    btnStartRadio: TButton;
    edFreq: TEdit;
    btnClose: TButton;
    btnPowerOff: TButton;
    btnPowerOn: TButton;
    procedure btnSetFreqClick(Sender: TObject);
    procedure btnGetFreqClick(Sender: TObject);
    procedure btnStartRadioClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure btnPowerOffClick(Sender: TObject);
    procedure btnPowerOnClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmWiNRADiO: TfrmWiNRADiO;

implementation

{$R *.DFM}

procedure TfrmWiNRADiO.btnSetFreqClick(Sender: TObject);
var
  strFreq: string;
  PCHARFreq: array[0..31] of Char;
begin
  if DDEClientConv.SetLink('WinRadio', 'WinRadio') then
    begin
      DDEClientConv.ExecuteMacro('[PowerOn]', False);
      DDEClientConv.ExecuteMacro('[SetMode(LSB)]', False);
      strFreq := '[SetFrequency(' + edFreq.Text + ')]';
      StrPCopy(PCHARFreq, strFreq);
      DDEClientConv.ExecuteMacro(PCHARFreq, False);
      DDEClientConv.closeLink;
    end
  else
    ShowMessage('Error connecting to radio');
end;

procedure TfrmWiNRADiO.btnGetFreqClick(Sender: TObject);
var
  fr: PChar;
begin
  if DDEClientConv.SetLink('WinRadio', 'WinRadio') then
    begin
      ShowMessage('Connected.');
      fr := DDEClientConv.RequestData('GetFrequency');
      ShowMessage('fr is:' + fr);
      DDEClientConv.closeLink;
    end
  else
    ShowMessage('Error')
end;

procedure TfrmWiNRADiO.btnStartRadioClick(Sender: TObject);
var
  results: integer;

begin
  results := ShellExecute(Handle, 'open',
    'c:\Program Files\WiNRADiO\WINRADIO.EXE', nil, 'c:\Program
Files\WiNRADiO', SW_SHOWNORMAL);
  ShowMessage('results are: ' + inttostr(results));

  if DDEClientConv.SetLink('WinRadio', 'WinRadio') then
    begin
      DDEClientConv.ExecuteMacro('[AttenOff]', False); // Select DX position
of attenuator
      DDEClientConv.ExecuteMacro('[SetMode(LSB)]', False);
      DDEClientConv.closeLink;
    end
  else
    ShowMessage('Error connecting to radio');
end;

procedure TfrmWiNRADiO.btnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmWiNRADiO.btnPowerOffClick(Sender: TObject);
begin
  if DDEClientConv.SetLink('WinRadio', 'WinRadio') then
    begin
      DDEClientConv.ExecuteMacro('[PowerOff]', False);

      DDEClientConv.closeLink;
    end
  else
    ShowMessage('Error connecting to radio');
end;

procedure TfrmWiNRADiO.btnPowerOnClick(Sender: TObject);
begin
  if DDEClientConv.SetLink('WinRadio', 'WinRadio') then
    begin
      DDEClientConv.ExecuteMacro('[PowerOn]', False);

      DDEClientConv.closeLink;
    end
  else
    ShowMessage('Error connecting to radio');
end;
end.

===================================================

James Brown
[email protected]
Argus Station DM12jw
W6KYP
www.seti.net




DDE commands are © 1996-2003 WiNRADiO Communications