Added serial CW keyer commanding menu item

Suddenly noticed that my winkeyer and IC7300 have different
        order of CW paddle plug's pin order.
        It was ok with IC7300, reverse with winkey.
        Fastest way to fix this is to set/reset winkeyer moderegister bit4
        This could not be done with Cqrlog as it sends only text to winkeyer.

        Added menuitem: NewQSO/File/Send hex bytes to keyer (W or K)

        Item is visible with winkeyer or K3NG keyer and allows non text
	hex bytes to be sent to serial line.
        Tested with Winkeyer.
	I do not have K3NG to test but assume it possible can be useful
	also with it in some cases.
	The serial sending protocol is same with both keyers.

	Help files fixed.
This commit is contained in:
OH1KH 2022-11-10 06:56:46 +02:00
parent 98a8ba5d0d
commit 2a04c27459
6 changed files with 151 additions and 4 deletions

View File

@ -75,7 +75,14 @@
</tr>
</tbody>
</table>
</p><a name=mk1><br></a> <img src="img/misc8.png" name="8" width="500" height="85">
</p>
<p>
<img src=img/h96a.png><br>
<strong>Send hex bytes to keyer</strong>. Will send hex bytes to Winkeyer or K3NG allowing non charcter bytes to be sent from Cqrlog in case there sudden need to change some of keyer's settings.
<br>Consult your keyer's manual to find needed commands.
</p>
<a name=mk1><br></a> <img src="img/misc8.png" name="8" width="500" height="85">
</img>
<p><strong>Memory keys</strong> form has buttons PgUp and PgDn that are not configurable. They alter CW speed in same way as keyboard keys PgUp and PgDn that some, specially laptop computers, may not even have.
<br>When using <strong>Memory keys</strong>-form with mouse, or keyboard, you are able to lauch memories by mouse click or by <strong>F</strong>-key press from keyboard keys. Same with PgUp and PgDn, both are working, keys and mouse click.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 38 KiB

BIN
help/img/h96a.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -5041,6 +5041,10 @@ object frmNewQSO: TfrmNewQSO
object MenuItem39: TMenuItem
Action = acReloadCW
end
object MenuItem45: TMenuItem
Caption = 'Send hex bytes to keyer (W or K)'
OnClick = MenuItem45Click
end
object MenuItem51: TMenuItem
Caption = '-'
end

View File

@ -133,6 +133,7 @@ type
MenuItem40: TMenuItem;
MenuItem41: TMenuItem;
MenuItem43: TMenuItem;
MenuItem45: TMenuItem;
MenuItem51: TMenuItem;
MenuItem52: TMenuItem;
MenuItem53: TMenuItem;
@ -451,6 +452,7 @@ type
procedure MenuItem11Click(Sender: TObject);
procedure MenuItem12Click(Sender: TObject);
procedure MenuItem17Click(Sender: TObject);
procedure MenuItem45Click(Sender: TObject);
procedure mnuQrzClick(Sender: TObject);
procedure mnuIK3QARClick(Sender: TObject);
procedure mnuHamQthClick(Sender : TObject);
@ -5010,6 +5012,16 @@ begin
ShowHelp
end;
procedure TfrmNewQSO.MenuItem45Click(Sender: TObject);
var
S: string;
begin
//message box here for commands
if not assigned(CWint) then exit;
if InputQuery('Send hex commands to Win/K3NG keyer','Type in comma separated hex bytes 00-ff (can be: 0xff, xff or ff)',False,S) then
CWint.SendHex(Uppercase(s));
end;
procedure TfrmNewQSO.mnuQrzClick(Sender: TObject);
begin
dmUtils.ShowQRZInBrowser(dmData.qQSOBefore.Fields[4].AsString)
@ -7176,6 +7188,7 @@ begin
if ((dmData.DebugLevel>=1 ) or ((abs(dmData.DebugLevel) and 8) = 8 )) then Writeln('Radio'+n+' CW settings:');
KeyerType := cqrini.ReadInteger('CW','Type'+n,0);
if ((dmData.DebugLevel>=1 ) or ((abs(dmData.DebugLevel) and 8) = 8 )) then Writeln('CW init keyer type:',KeyerType);
Menuitem45.Visible:=False; //send hex commands to win/k3ng keyer
case KeyerType of
1 : begin
CWint := TCWWinKeyerUSB.Create;
@ -7186,6 +7199,7 @@ begin
CWint.Device := cqrini.ReadString('CW','wk_port'+n,'');
CWint.PortSpeed := 1200;
UseSpeed := cqrini.ReadInteger('CW','wk_speed',30);
Menuitem45.Visible:=True;
end;
2 : begin
CWint := TCWDaemon.Create;
@ -7206,6 +7220,7 @@ begin
CWint.Device := cqrini.ReadString('CW','K3NGPort'+n,'');
CWint.PortSpeed := cqrini.ReadInteger('CW','K3NGSerSpeed',115200);
UseSpeed := cqrini.ReadInteger('CW','K3NGSpeed',30);
Menuitem45.Visible:=True;
end;
4 : begin
CWint := TCWHamLib.Create;

View File

@ -5,7 +5,7 @@ unit uCWKeying;
interface
uses
Classes, SysUtils, synaser, synautil, lNet, lNetComponents, Forms;
Classes, SysUtils, synaser, synautil, lNet, lNetComponents, Forms, Dialogs, StrUtils;
type TKeyType = (ktCWdaemon, ktWinKeyer);
type TKeyStatus = (ksReady, ksBusy);
@ -40,6 +40,7 @@ type
procedure Close; virtual; abstract;
procedure SetSpeed(speed : Word); virtual; abstract;
procedure SendText(text : String); virtual; abstract;
procedure SendHex(text:String); virtual; abstract;
procedure StopSending; virtual; abstract;
procedure DelLastChar; virtual; abstract;
procedure SetMixManSpeed(min,max : Word); virtual; abstract;
@ -64,6 +65,7 @@ type
procedure Close; override;
procedure SetSpeed(speed : Word); override;
procedure SendText(text : String); override;
procedure SendHex(text:String); override;
procedure StopSending; override;
procedure DelLastChar; override;
procedure SetMixManSpeed(min,max : Word); override;
@ -87,6 +89,7 @@ type
procedure Close; override;
procedure SetSpeed(speed : Word); override;
procedure SendText(text : String); override;
procedure SendHex(text:String); override;
procedure StopSending; override;
procedure DelLastChar; override;
procedure SetMixManSpeed(min,max : Word); override;
@ -110,6 +113,7 @@ type
procedure Close; override;
procedure SetSpeed(speed : Word); override;
procedure SendText(text : String); override;
procedure SendHex(text:String); override;
procedure StopSending; override;
procedure DelLastChar; override;
procedure SetMixManSpeed(min,max : Word); override;
@ -142,6 +146,7 @@ type
procedure WaitMorse;
procedure SetSpeed(speed : Word); override;
procedure SendText(text : String); override;
procedure SendHex(text:String); override;
procedure StopSending; override;
procedure DelLastChar; override;
procedure SetMixManSpeed(min,max : Word); override;
@ -363,7 +368,7 @@ begin
ser.SendString('A');
ser.SendString('C');
end;
{ 'ß' : begin
{ 'ß' : begin
ser.SendByte($1B);
ser.SendString('S');
ser.SendString('Z');
@ -394,6 +399,61 @@ begin
ser.SendString(text)
end;
procedure TCWWinKeyerUSB.SendHex(text : String);
var
H : String;
p : integer;
index :integer;
paramList :TStringList;
function send(ok:boolean):boolean;
Begin
Result:=true;
try
index:=0;
paramList := TStringList.Create;
paramList.Delimiter := ',';
paramList.DelimitedText := text;
while index < paramList.Count do
begin
try
if Pos('X', paramList[index])>0 then
H:=copy(paramList[index],Pos('X', paramList[index])+1,2)
else
H:= paramList[index];
p:=Hex2Dec(H);
except
on E: Exception do
Begin
ShowMessage( ' Hex error: '+paramList[index]+' '+ E.ClassName + #13#10 + E.Message );
Result:=false;
exit;
end;
end;
if p>255 then
Begin
ShowMessage( ' Hex error: '+paramList[index]+' Value too big' );
Result:=false;
exit;
end;
if fDebugMode and ok then Writeln('Sending value: ',paramList[index],'=',p);
if ok then ser.SendByte(p);
inc(index);
end;
paramList.Free;
finally
//Done all
end;
end;
begin
//test hex conversion
if not send(false) then exit;
//if passed do real send
send(true);
end;
procedure TCWWinKeyerUSB.Close;
begin
ser.SendByte(0);
@ -518,6 +578,10 @@ begin
else
udp.SendMessage(text)
end;
procedure TCWDaemon.SendHex(text : String);
Begin
//not implemented
end;
procedure TCWDaemon.Close;
begin
@ -667,6 +731,60 @@ begin
else
ser.SendString(text)
end;
procedure TCWK3NG.SendHex(text : String);
var
H : String;
p : integer;
index :integer;
paramList :TStringList;
function send(ok:boolean):boolean;
Begin
Result:=true;
try
index:=0;
paramList := TStringList.Create;
paramList.Delimiter := ',';
paramList.DelimitedText := text;
while index < paramList.Count do
begin
try
if Pos('X', paramList[index])>0 then
H:=copy(paramList[index],Pos('X', paramList[index])+1,2)
else
H:= paramList[index];
p:=Hex2Dec(H);
except
on E: Exception do
Begin
ShowMessage( ' Hex error: '+paramList[index]+' '+ E.ClassName + #13#10 + E.Message );
Result:=false;
exit;
end;
end;
if p>255 then
Begin
ShowMessage( ' Hex error: '+paramList[index]+' Value too big' );
Result:=false;
exit;
end;
if fDebugMode and ok then Writeln('Sending value: ',paramList[index],'=',p);
if ok then ser.SendByte(p);
inc(index);
end;
paramList.Free;
finally
//Done all
end;
end;
begin
//test hex conversion
if not send(false) then exit;
//if passed do real send
send(true);
end;
procedure TCWK3NG.Close;
begin
@ -909,7 +1027,10 @@ begin
end
else if fDebugMode then Writeln('Empty message!');
end;
procedure TCWHamLib.SendHex(text : String);
Begin
//not implemented
end;
procedure TCWHamLib.Close;
begin
if tcp.Connected then