home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-386-Vol-2of3.iso
/
c
/
caty16.zip
/
CATYINST.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-01-12
|
34KB
|
815 lines
UNIT CATYINST (* CATY Instruction routines D. J. Wilke N3HGQ 01/26/91 *);
INTERFACE
USES CRT, DOS, CATYGLO, CATYUTIL,
CATYDISP, CATYRTC, CATYNUM;
PROCEDURE HGSelect;
PROCEDURE ModeSelect;
PROCEDURE FreqScan(StepSet : STRING);
PROCEDURE ProgStep;
PROCEDURE CTCSSToneSet;
PROCEDURE StatusUpdate(Param : String86);
PROCEDURE CheckStatus(Inst : String5);
PROCEDURE MainFrame;
PROCEDURE MainMenu;
IMPLEMENTATION
USES CATYMVFO, CATYCOMM, CATYTERM;
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE HGSelect (* Select between Ham or General coverage bands *);
VAR
HGS,CovSel : CHAR;
BEGIN (* HgSelect *)
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
WINDOW(1,1,80,5);
PrMessage(' - Ham/General Coverage Screen - ',4);
WINDOW(2,6,79,23);
CLRSCR;
PromptLine('S'); (* Put up select message *)
PrBandLimits; (* Display band limits table *)
(* Display headings & draw `Band Mode' box *)
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(56,1); WRITE (' Band Mode ');
PrBox; (* Draw `H/G Select' box *)
(* Prompt for Ham or General coverage *)
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(11,1); WRITE('H');
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
WRITE(' = Ham Bands, ');
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
WRITE('G');
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
WRITE(' = General Coverage');
GOTOXY(11,3); WRITE('Enter H or G.');
GOTOXY(25,3); WRITE(CHR(198));
FOR Index := 1 TO 29 DO
WRITE(CHR(205));
WRITE(CHR(16));
IF SetSel THEN BEGIN
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(58,3); WRITE (' ? ');
GOTOXY(65,3);
REPEAT
CovSel := UPCASE(ReadKey);
UNTIL (CovSel = 'H') OR (CovSel = 'G');
PromptLine('W'); (* Put up wait message *)
GOTOXY(58,3);
IF CovSel = 'H' THEN BEGIN
HGS := CHR(32);
WRITE(' Ham Bands ');
END (* IF Covsel *)
ELSE BEGIN
HGS := CHR(33);
WRITE(' Gen Coverage ');
END; (* ELSE *)
END; (* IF SetSel *)
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
TurnCatOn;
CatSend(Nul3String+HGS+CHR($A),26);
TurnCatOff;
MainMenu;
END; (* HgSelect *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE ModeSelect (* Select operating Mode *);
VAR
ModeSel : CHAR;
Mode : STRING;
BEGIN (* ModeSelect *)
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
WINDOW(1,1,80,5);
PrMessage(' - Select Mode Screen - ',4);
WINDOW(2,6,79,23);
CLRSCR;
PromptLine('S'); (* Put up select message *)
(* Display headings & draw `Mode' box *)
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(58,1); WRITE('Selected Memory');
GOTOXY(56,1); WRITE(' Mode ');
PrBox; (* Draw `Mode Select' box *)
(* Prompt for VFO A, VFO B or Memory *)
GOTOXY(11,1); WRITE('L=LSB, U=USB, C=CW, A=AM, F=FM, K=FSK');
GOTOXY(11,3); WRITE('Enter L, U, C, A, F, or K.');
GOTOXY(38,3); WRITE(CHR(198));
FOR Index := 1 to 16 DO
WRITE(CHR(205));
WRITE(CHR(16));
IF SetSel THEN BEGIN
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(60,3); WRITE (' ? ');
GOTOXY(65,3);
REPEAT
ModeSel := UPCASE(ReadKey);
CASE ModeSel OF
'L' : BEGIN
Mode := CHR($10);
GOTOXY(60,3); WRITE(' Lower SB ');
END;
'U' : BEGIN
Mode := CHR($11);
GOTOXY(60,3); WRITE(' Upper SB ');
END;
'C' : BEGIN
Mode := CHR($12);
GOTOXY(60,3); WRITE(' CW ');
END;
'A' : BEGIN
Mode := CHR($13);
GOTOXY(60,3); WRITE(' AM ');
END;
'F' : BEGIN
Mode := CHR($14);
GOTOXY(60,3); WRITE(' FM ');
END;
'K' : BEGIN
Mode := CHR($15);
GOTOXY(60,3); WRITE(' FSK ');
END;
END; (* Case *)
UNTIL (ModeSel = 'L') OR (ModeSel = 'U') OR (ModeSel = 'C') OR
(ModeSel = 'A') OR (ModeSel = 'F') OR (ModeSel = 'K');
PromptLine('W'); (* Put up wait message *)
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
TurnCatOn;
CatSend(Nul3String+Mode+CHR($A),8); (* Set the Mode *)
TurnCatOff;
MainMenu;
END; (* IF SetSel *)
END; (* ModeSelect *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE FreqScan(StepSet : STRING);
(* Scan frequency by program step size Up or Down *)
VAR
KeyChar : CHAR;
BEGIN
REPEAT (* Scan `til key hit *)
TurnCatOn;
IF DownFlag THEN (* Flag determines direct *)
CatSend(CHR(0)+CHR(0)+StepSet+CHR(5),5) (* Pgm step DN *)
ELSE
CatSend(CHR(0)+CHR(0)+StepSet+CHR(4),5); (* Pgm step UP *)
TurnCatOff; (* Return to panel oper *)
QuickStat; (* Show progress *)
WINDOW(2,19,79,23); CLRSCR; (* Clean off last readout *)
WINDOW(2,6,79,23);
BigNumerals(1,14); (* Put up big ones *)
PEEP(4000); DELAY(600); (* About 1 sec per scan *)
UNTIL KeyPressed; (* Stop scanning *)
END; (* FreqScan *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE ProgStep;
(* Set step size for Programmed frequency Step Up/Down *)
VAR
StepSet, StepFreq : STRING[6];
LSDStep : STRING[6];
StepInt : STRING[4];
StepChr : STRING;
Result,BCDin,DotPos,
XNum,YNum : INTEGER;
TuneStep : REAL;
Choice : CHAR;
BEGIN (* ProgStep *)
LSDStep := '';StepFreq := '';StepInt := '';StepSet := '';
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
WINDOW(1,1,80,5);
PrMessage(' - Programmable Tuning Steps Screen - ',4);
WINDOW(2,6,79,23);
CLRSCR;
PromptLine('S'); (* Put up select message *)
(* Display headings & draw `Programmed Step Size' box *)
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(56,1); WRITE('Programmed Step Size');
PrBox; (* Draw `Step Size' box *)
GOTOXY(11,3); WRITE('Enter desired Step Size.');
GOTOXY(36,3); WRITE(CHR(198));
FOR Index := 1 TO 18 DO
WRITE(CHR(205));
WRITE(CHR(16));
GOTOXY(67,3); WRITE('KHz.');
IF SetSel THEN BEGIN
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(61,3); WRITE(' ');
GOTOXY(61,3); READLN(StepFreq);
END (* SetSel *)
ELSE StepFreq := '12.34';
VAL(StepFreq,TuneStep,Result);
PromptLine('W'); (* Put up wait message *)
WINDOW(2,6,79,23);
IF (TuneStep < 0) OR (TuneStep > 99) THEN BEGIN
ErrorAlarm(FreqErr,0,7);
Warble(3000,2400);
DELAY(1000);
EXIT;
END; (* IF TuneStep <0) *)
(* Display Step in `Programmed Step Size' box *)
GOTOXY(61,3); WRITE(TuneStep:4:2);
DotPos := Pos('.',StepFreq);
DELETE(StepFreq,DotPos,1); (* Remove decimal *)
IF DotPos = 0 THEN
DotPos := LENGTH(StepFreq) +1;
(* Create StepInt with appropriate leading zeros *)
CASE DotPos OF
1 : StepInt := '00' + StepFreq;
2 : StepInt := '0' + StepFreq;
3 : StepInt := StepFreq;
END; (* CASE *)
(* Pad StepInt with appropriate Trailing zeros *)
CASE LENGTH(StepInt) OF
1 : StepInt := StepInt + '000';
2 : StepInt := StepInt + '00';
3 : StepInt := StepInt + '0';
END; (* CASE *)
(* Construct 4 byte LSDStep string (LSD -> MSD) *)
Index := 4;
WHILE Index <> 0 DO BEGIN
LSDStep := LSDStep + COPY(StepInt,Index - 1,2);
Index := Index - 2;
END;
(* Convert LSDStep to 2 hex bytes *)
Index := 1;
WHILE Index < 4 DO BEGIN
StepChr := COPY(LSDStep,Index,2);
VAL(StepChr,BCDin,Result);
Index := Index + 2;
StepSet := StepSet + Translate(BCDin); (* StepSet now ready *)
END; (* WHILE Index *)
IF SetSel = FALSE THEN BEGIN (* For testing only *)
GOTOXY(13,12); WRITE(LENGTH(StepFreq),' Positions.');
GOTOXY(10,13); WRITE(TuneStep:4:2,' KHz.');
GOTOXY(10,14); WRITE(StepInt,' Normal BCD');
GOTOXY(10,15); WRITE(LSDStep,' Inverted BCD');
GOTOXY(11,16); WRITE(COPY(StepSet,1,1));
GOTOXY(13,16); WRITE(COPY(StepSet,2,1));
GOTOXY(16,16); WRITE('StepSet binary string.');
Promptline('M');
END; (* IF SetSel *)
GOTOXY(11, 3); WRITE(' ');
GOTOXY(24, 4); WRITE(' Key Function');
PrLines('H',2,79,10,10,SBA,DBG,196); (* Divider line *)
GOTOXY(24, 6);WRITE('<'+CHR(24)+'> Programmed step UP');
GOTOXY(24, 7);WRITE('<'+CHR(25)+'> Programmed step DOWN');
GOTOXY(24, 8);WRITE('<'+CHR(26)+'> Start Frequency scan UP');
GOTOXY(24, 9);WRITE('<'+CHR(27)+'> Start Frequency scan DOWN');
GOTOXY(24,11);WRITE('<Spacebar> Stop scanning');
GOTOXY(24,12);WRITE('<End> Quit to Main Menu');
PrLines('H',2,79,18,18,SBA,DBG,196); (* Divider line *)
PromptLine('S'); (* Put up select message *)
BigNumerals(1,14); (* Put up big ones *)
TurnCatOn;
CatSend(Nul3String+CHR(0)+CHR(9),5); (* 1st turn off Mem mode *)
TurnCatOff;
REPEAT
InKey(Fk,Choice); (* Get command *)
CASE Choice OF
#72 : BEGIN (* <Cursor Up> key *)
TurnCatOn; (* Pgm'd step UP *)
CatSend(CHR(0)+CHR(0)+StepSet+CHR(4),5);
TurnCatOff;
QuickStat; (* Show new freq *)
WINDOW(2,19,79,23); CLRSCR;(* Clean off last readout *)
WINDOW(2,6,79,23);
BigNumerals(1,14); (* Put up big ones *)
END;
#75 : BEGIN (* <Cursor Left> key *)
DownFlag := TRUE; (* Freq scan DOWN *)
FreqScan(StepSet); (* Do the scan *)
END;
#77 : BEGIN (* <Cursor Right> key *)
DownFlag := FALSE; (* Freq scan UP *)
FreqScan(StepSet); (* Do the scan *)
END;
#80 : BEGIN (* <Cursor Down> key *)
TurnCatOn; (* Pgm'd step DOWN *)
CatSend(CHR(0)+CHR(0)+StepSet+CHR(5),5);
TurnCatOff;
QuickStat; (* Show new freq *)
WINDOW(2,19,79,23); CLRSCR;(* Clean off last readout *)
WINDOW(2,6,79,23);
BigNumerals(1,14); (* Put up big ones *)
END;
END; (* CASE *)
UNTIL Choice = #79; (* <End> key quits *)
MainMenu;
END; (* ProgStep *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE CTCSSToneSet; (* Set the tone for given mode *)
VAR
ToneSet,ToneFreq : STRING[8];
LSDTone : STRING[6];
ToneStr : STRING[4];
ToneNum : STRING[2];
ToneChr,ToneQ,HiQ : STRING;
Tone : REAL;
Result,BCDin,DotPos : INTEGER;
BEGIN (* CTCSSToneSet *)
ToneSet := ''; ToneFreq := ''; (* Init collection strings *)
ToneStr := ''; ToneChr := '';
LSDTone := ''; ToneQ := CHR($00); HiQ := CHR($00);
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
WINDOW(1,1,80,5);
PrMessage(' - CTCSS Tones Screen - ',4);
WINDOW(2,6,79,23);
CLRSCR;
PromptLine('S'); (* Put up select message *)
IF ToneEnc THEN BEGIN
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(56,1); WRITE('CTCSS Tone Frequency'); (* Display headings *)
PrBox; (* Draw `CTCSS Tone' box *)
(* Display CTCSS valid frequencies table *)
GOTOXY(14,6);
WRITE('01. = 67.0 12. = 118.8 23. = 173.8 34. = C67.0');
GOTOXY(14,7);
WRITE('02. = 71.9 13. = 123.0 24. = 179.9 35. = C71.9');
GOTOXY(14,8);
WRITE('03. = 77.0 14. = 127.3 25. = 186.2 36. = C74.7');
GOTOXY(14,9);
WRITE('04. = 82.5 15. = 131.8 26. = 192.8 37. = C77.0');
GOTOXY(14,10);
WRITE('05. = 88.5 16. = 136.5 27. = 203.5 38. = C79.7');
GOTOXY(14,11);
WRITE('06. = 94.8 17. = 141.3 28. = 210.7 39. = C82.5');
GOTOXY(14,12);
WRITE('07. = 100.0 18. = 146.2 29. = 218.1 40. = C85.4');
GOTOXY(14,13);
WRITE('08. = 103.5 19. = 151.4 30. = 225.7 41. = C88.5');
GOTOXY(14,14);
WRITE('09. = 107.2 20. = 156.7 31. = 233.6 42. = C91.5');
GOTOXY(14,15);
WRITE('10. = 110.9 21. = 162.2 32. = 241.8');
GOTOXY(14,16);
WRITE('11. = 114.8 22. = 167.9 33. = 250.3');
GOTOXY(14,17);
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
GOTOXY(17,18);
WRITE('Tones prefixed with `C'' have a high Q. (Q=80)');
(* Prompt for desired tone frequency *)
GOTOXY(7,3); WRITE('Enter CTCSS Tone number from table:');
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(43,3); READLN(ToneNum); (* Get the tone number *)
IF ToneNum = '01' THEN ToneFreq := '67.0';
IF ToneNum = '02' THEN ToneFreq := '71.9';
IF ToneNum = '03' THEN ToneFreq := '77.0';
IF ToneNum = '04' THEN ToneFreq := '82.5';
IF ToneNum = '05' THEN ToneFreq := '88.5';
IF ToneNum = '06' THEN ToneFreq := '94.8';
IF ToneNum = '07' THEN ToneFreq := '100.0';
IF ToneNum = '08' THEN ToneFreq := '103.5';
IF ToneNum = '09' THEN ToneFreq := '107.2';
IF ToneNum = '10' THEN ToneFreq := '110.9';
IF ToneNum = '11' THEN ToneFreq := '114.8';
IF ToneNum = '12' THEN ToneFreq := '118.8';
IF ToneNum = '13' THEN ToneFreq := '123.0';
IF ToneNum = '14' THEN ToneFreq := '127.3';
IF ToneNum = '15' THEN ToneFreq := '131.8';
IF ToneNum = '16' THEN ToneFreq := '136.5';
IF ToneNum = '17' THEN ToneFreq := '141.3';
IF ToneNum = '18' THEN ToneFreq := '146.2';
IF ToneNum = '19' THEN ToneFreq := '151.4';
IF ToneNum = '20' THEN ToneFreq := '156.7';
IF ToneNum = '21' THEN ToneFreq := '162.2';
IF ToneNum = '22' THEN ToneFreq := '167.9';
IF ToneNum = '23' THEN ToneFreq := '173.8';
IF ToneNum = '24' THEN ToneFreq := '179.9';
IF ToneNum = '25' THEN ToneFreq := '186.2';
IF ToneNum = '26' THEN ToneFreq := '192.8';
IF ToneNum = '27' THEN ToneFreq := '203.5';
IF ToneNum = '28' THEN ToneFreq := '210.7';
IF ToneNum = '29' THEN ToneFreq := '218.1';
IF ToneNum = '30' THEN ToneFreq := '225.7';
IF ToneNum = '31' THEN ToneFreq := '233.6';
IF ToneNum = '32' THEN ToneFreq := '241.8';
IF ToneNum = '33' THEN ToneFreq := '250.3';
IF ToneNum = '34' THEN BEGIN
ToneFreq := '67.0'; HiQ := 'C';
END; (* IF ToneNum = '34' *)
IF ToneNum = '35' THEN BEGIN
ToneFreq := '71.9'; HiQ := 'C';
END; (* IF ToneNum = '35' *)
IF ToneNum = '36' THEN BEGIN
ToneFreq := '74.7'; HiQ := 'C';
END; (* IF ToneNum = '36' *)
IF ToneNum = '37' THEN BEGIN
ToneFreq := '77.0'; HiQ := 'C';
END; (* IF ToneNum = '37' *)
IF ToneNum = '38' THEN BEGIN
ToneFreq := '79.7'; HiQ := 'C';
END; (* IF ToneNum = '38' *)
IF ToneNum = '39' THEN BEGIN
ToneFreq := '82.5'; HiQ := 'C';
END; (* IF ToneNum = '39' *)
IF ToneNum = '40' THEN BEGIN
ToneFreq := '85.4'; HiQ := 'C';
END; (* IF ToneNum = '40' *)
IF ToneNum = '41' THEN BEGIN
ToneFreq := '88.5'; HiQ := 'C';
END; (* IF ToneNum = '41' *)
IF ToneNum = '42' THEN BEGIN
ToneFreq := '91.5'; HiQ := 'C';
END; (* IF ToneNum = '42' *)
GOTOXY(36,3); WRITE(CHR(198));
FOR Index := 1 TO 18 DO
WRITE(CHR(205));
WRITE(CHR(16));
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
GOTOXY(69,3); WRITE ('Hz.');
GOTOXY(7,3);
WRITE('CTCSS Tone has been set in radio: ');
IF SetSel THEN BEGIN
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(61,3); WRITE(' ');
IF (HiQ = 'c') OR (HiQ = 'C') THEN BEGIN
GOTOXY(58,3); WRITE(' ');
GOTOXY(58,3); WRITE('Hi-Q'); (* Show 'Q' *)
ToneQ := CHR($01); (* Set up to tell CAT *)
END; (* IF COPY *)
END (* IF SetSel *)
ELSE ToneFreq := ('131.8'); (* Default value for test *)
VAL(ToneFreq,Tone,Result);
(* Error trapping for correct tone freqs *)
IF (Tone < 67) OR (Tone > 250.3) THEN BEGIN
ErrorAlarm(FreqErr,0,7);
Warble(3000,2400);
DELAY(1000);
EXIT;
END; (* IF (Tone < 67) *)
(* Display Tone Frequency in `CTCSS Tone Frequency' box *)
GOTOXY(63,3); WRITE(Tone:3:1); (* Show tone freq *)
(* Set up to send instruction to 767 *)
DotPos := Pos('.',ToneFreq);
DELETE(ToneFreq,DotPos,1); (* Remove decimal *)
IF DotPos = 0 THEN
DotPos := LENGTH(ToneFreq) +1;
(* Create ToneStr with appropriate leading zeros *)
CASE DotPos OF
3 : ToneStr := '0' + ToneFreq;
4 : ToneStr := ToneFreq;
END; (* CASE *)
(* Pad ToneStr with appropriate Trailing zeros *)
CASE LENGTH(ToneStr) OF
3 : ToneStr := ToneStr + '0';
4 : ToneStr := ToneStr;
END; (* CASE *)
(* Construct 4 byte LSDTone string (LSD -> MSD) *)
Index := 4;
WHILE Index <> 0 DO BEGIN
LSDTone := LSDTone + COPY(ToneStr,Index - 1,2);
Index := Index - 2;
END; (* WHILE Index *)
(* Convert LSDTone to 2 hex bytes *)
Index := 1;
WHILE Index < 4 DO BEGIN
ToneChr := COPY(LSDTone,Index,2);
VAL(ToneChr,BCDin,Result);
Index := Index + 2;
ToneSet := ToneSet + Translate(BCDin); (* Now ready for CAT *)
END; (* WHILE Index *)
TurnCatOn;
CatSend(CHR(0)+ToneQ+ToneSet+CHR($0C),26); (* Set the tone freq *)
TurnCatOff;
IF SetSel = FALSE THEN BEGIN (* For testing only *)
GOTOXY(56,14); WRITE(ToneStr,' Normal BCD');
GOTOXY(56,15); WRITE(LSDTone,' Inverted BCD');
GOTOXY(57,16); WRITE(COPY(ToneSet,1,1));
GOTOXY(59,16); WRITE(COPY(ToneSet,2,1));
GOTOXY(62,16); WRITE('ToneSet bin str.');
GOTOXY(56,17); WRITE('Inst:');
GOTOXY(56,18); WRITE('Echo:');
WhatWasThat(Inst,62,17);
WhatWasThat(Echo,62,18);
Promptline('M');
END; (* IF SetSel *)
DELAY(1000);
END (* IF ToneEnc *)
ELSE BEGIN
ErrorAlarm(CTCSSErr,0,7);
Warble(3000,2400);
DELAY(1000);
END;
MainMenu;
END; (* CTCSSToneSet *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE StatusUpdate(Param : String86);
(* Display all radio params *)
BEGIN
PrFrame(1,80,1,24); (* Draw main frame *)
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
WINDOW(1,1,80,5);
PrMessage(' - Status Update Screen - ',4);
GOTOXY(3,2); WRITE('LSD MSD ');
WhatWasThat(Inst,3,3); (* Display Instr as sent *)
WhatWasThat(Echo,3,4); (* Display Echo as received *)
WINDOW(2,6,79,23);
CLRSCR;
PrRule; (* Draw inside ruling lines for status screen *)
ScreenWrite(CHR(209),18,1,SBA); (* Dbl/sing tee, top *)
PrLines('V',18,0,2,4,SBA,DBG,179); (* Sing V left side *)
ScreenWrite(CHR(207),18,5,SBA); (* Dbl/sing tee, bot *)
ScreenWrite(CHR(209),63,1,SBA); (* Dbl/sing tee, top *)
PrLines('V',63,0,2,4,SBA,DBG,179); (* Sing V right side *)
ScreenWrite(CHR(207),63,5,SBA); (* Dbl/sing tee, bot *)
PrLines('H',3,50,7,0,SBA,DBG,196); (* Sing H line, mid top *)
PrLines('H',3,50,9,0,SBA,DBG,196); (* Sing H line, mid top *)
PrLines('H',3,50,11,0,SBA,DBG,196); (* Sing H line, mid top *)
ScreenWrite(CHR(199),1,13,SBA); (* Dbl/sing tee, left *)
PrLines('H',2,79,13,0,SBA,DBG,196); (* Sing H line, midscreen *)
ScreenWrite(CHR(182),80,13,SBA); (* Dbl/sing tee, right *)
ScreenWrite(CHR(209),52,5,SBA); (* Dbl/sing tee, top *)
PrLines('V',52,0,6,12,SBA,DBG,179); (* Sing V midscreen, top *)
ScreenWrite(CHR(197),52,13,SBA); (* Sing cross *)
PrLines('V',52,0,14,23,SBA,DBG,179); (* Sing V midscreen, bot *)
ScreenWrite(CHR(207),52,24,SBA); (* Dbl/sing tee, bot *)
PrLines('H',54,78,15,0,SBA,DBG,196); (* Sing H line, mid bot *)
(* UPPER LEFT QUADRANT *)
TEXTCOLOR(DFG); (* Display headings *)
TEXTBACKGROUND(DBG); (* Default screen colors *)
GOTOXY(3,1); WRITE ('Function');
GOTOXY(16,1); WRITE ('Frequency');
GOTOXY(31,1); WRITE ('Mode');
GOTOXY(42,1); WRITE ('Tone');
TEXTCOLOR(PFG); TEXTBACKGROUND(DBG); (* Param screen colors *)
GOTOXY(2,7); WRITE ('Clarifier');
GOTOXY(4,3); WRITE ('VFO A');
GOTOXY(4,5); WRITE ('VFO B');
(* Display returned status for VFO A, VFO B, Clarifier *)
IF LENGTH(Update) >= 26 THEN BEGIN
PrFreq(Param,15,13,3); (* VFO A *)
PrCTCSS(Param,19,39,3);
PrMode(Param,20,31,3);
PrFreq(Param,21,13,5); (* VFO B *)
PrCTCSS(Param,25,39,5);
PrMode(Param,26,31,5);
PrFreq(Param,9,13,7); (* Clarifier *)
PrCTCSS(Param,13,39,7);
PrMode(Param,14,31,7);
END; (* IF LENGTH *)
(* UPPER RIGHT QUADRANT *)
TEXTCOLOR(PFG); TEXTBACKGROUND(DBG); (* Param screen colors *)
GOTOXY(56,1); WRITE('Operating Frequency');
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
PrBox; (* Draw `Op Freq' box *)
GOTOXY(53,5);
FOR Index := 1 to 7 DO
WRITE(CHR(205));
WRITE(' Selected ');
FOR Index := 1 to 8 DO
WRITE(CHR(205));
TEXTCOLOR(PFG); TEXTBACKGROUND(DBG); (* Param screen colors *)
GOTOXY(54,6); WRITE('Mode');
GOTOXY(63,6); WRITE('Tone');
GOTOXY(71,6); WRITE('Memory');
(* Display returned status for Op Freq, selected mode, tone, memory *)
PrFreq(Param,2,59,3); (* Op Freq *)
IF LENGTH(Update) >= 8 THEN BEGIN
PrCTCSS(Param,6,60,7); (* Tone *)
PrMode(Param,7,55,7); (* Mode *)
TEXTCOLOR(SFG); TEXTBACKGROUND(DBG); (* Returned status colors *)
GOTOXY(73,7); WRITE('0'); (* Memory *)
WRITE(Bin2BCDHex(ORD(Param[8])));
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default screen colors *)
END; (* IF LENGTH *)
(* LOWER LEFT QUADRANT *)
TEXTCOLOR(PFG); TEXTBACKGROUND(DBG); (* Param screen colors *)
FOR Index := 0 TO 9 DO BEGIN
GOTOXY(2,Index + 9); WRITE('Memory 0');
WRITE(Index); (* Display memory number *)
END; (* FOR Index *)
(* Display returned status for all memories *)
IF LENGTH(Update) = 86 THEN BEGIN
PrFreq(Param,27,13,9);
PrCTCSS(Param,31,39,9);
PrMode(Param,32,31,9);
PrFreq(Param,33,13,10);
PrCTCSS(Param,37,39,10);
PrMode(Param,38,31,10);
PrFreq(Param,39,13,11);
PrCTCSS(Param,43,39,11);
PrMode(Param,44,31,11);
PrFreq(Param,45,13,12);
PrCTCSS(Param,49,39,12);
PrMode(Param,50,31,12);
PrFreq(Param,51,13,13);
PrCTCSS(Param,55,39,13);
PrMode(Param,56,31,13);
PrFreq(Param,57,13,14);
PrCTCSS(Param,61,39,14);
PrMode(Param,62,31,14);
PrFreq(Param,63,13,15);
PrCTCSS(Param,67,39,15);
PrMode(Param,68,31,15);
PrFreq(Param,69,13,16);
PrCTCSS(Param,73,39,16);
PrMode(Param,74,31,16);
PrFreq(Param,75,13,17);
PrCTCSS(Param,79,39,17);
PrMode(Param,80,31,17);
PrFreq(Param,81,13,18);
PrCTCSS(Param,85,39,18);
PrMode(Param,86,31,18);
END; (* IF LENGTH *)
(* LOWER RIGHT QUADRANT *)
GOTOXY(54,9); WRITE('Status Byte Information');
TEXTCOLOR(PFG); TEXTBACKGROUND(DBG); (* Param screen colors *)
GOTOXY(53,11); WRITE('PTT: ');
GOTOXY(53,12); WRITE('Ham/Gen: ');
GOTOXY(53,13); WRITE('Transmit: ');
GOTOXY(53,14); WRITE('Split: ');
GOTOXY(53,15); WRITE('VFO: ');
GOTOXY(53,16); WRITE('Mem Recall: ');
GOTOXY(53,17); WRITE('Clarifier: ');
GOTOXY(53,18); WRITE('Cat System: ');
PrStatusByte; (* Disp decoded status byte *)
END; (* StatusUpdate *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE CheckStatus(Inst : String5);
(* No change to radio, just request current status *)
BEGIN (* CheckStatus *)
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(Inst,86); (* Request an update *)
TurnCatOff;
StatusUpdate(Update); (* Display all params *)
PromptLine('M'); (* Put up Main Menu message *)
WINDOW(1,5,80,25);
CLRSCR;
MainFrame; (* Clean up screen *)
END; (* CheckStatus *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE MainFrame (* Put up Main Frame for all screens *);
BEGIN (* MainFrame *)
CLRSCR;
PrFrame(1,80,1,24); (* Draw main frame *)
PromptLine('F'); (* Put up FK line *)
PrMessage(Title,2); (* Display headings *)
PrMessage(Version + Rig + Credit,3);
PrRule; (* Draw inside ruling lines *)
ScreenWrite(CHR(209),18,1,SBA); (* Dbl/sing tee, top *)
PrLines('V',18,0,2,4,SBA,DBG,179); (* Sing V left side *)
ScreenWrite(CHR(207),18,5,SBA); (* Dbl/sing tee, bot *)
ScreenWrite(CHR(209),63,1,SBA); (* Dbl/sing tee, top *)
PrLines('V',63,0,2,4,SBA,DBG,179); (* Sing V right side *)
ScreenWrite(CHR(207),63,5,SBA); (* Dbl/sing tee, bot *)
END; (* MainFrame *)
(*═══════════════════════════════════════════════════════════════════════*)
PROCEDURE MainMenu (* Put up Main Menu for selections *);
VAR
Fk : BOOLEAN;
Choice : CHAR;
BEGIN (* MainMenu *)
Main := TRUE;
WINDOW(1,1,80,5);
PrMessage(' - Main Menu - ',4);
QuickStat; (* Update quick status box *)
WINDOW(2,6,79,23);
CLRSCR;
PromptLine('F'); (* Put up FK line *)
(* Display Menu selections *)
TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
GOTOXY(26,2); WRITE('Set Operating frequency');
GOTOXY(26,3); WRITE('Set Programmed tuning step / Scan');
GOTOXY(26,4); WRITE('Select VFO<A> / VFO<B> / Memory');
GOTOXY(26,5); WRITE('Select Memory channel');
GOTOXY(26,6); WRITE('Set Operating Mode');
GOTOXY(26,7); WRITE('Set CTCSS Tone frequencies');
GOTOXY(26,8); WRITE('Load Memories from selected disk datafile');
GOTOXY(26,9); WRITE('Load VFO<A> from selected disk datafile');
GOTOXY(26,10); WRITE('Repeater split frequency operation');
GOTOXY(26,11); WRITE('Terminal Node Controller operation');
GOTOXY(26,12); WRITE('Step UP 10 Hertz in frequency');
GOTOXY(26,13); WRITE('Step DN 10 Hertz in frequency');
GOTOXY(26,15); WRITE('Display radio status screen');
GOTOXY(21,17); WRITE(CHR(16) + (' ') + CHR(17) + ' Choice');
TEXTCOLOR(DFG); TEXTBACKGROUND(DBG); (* Default colors *)
FOR Index := 2 TO 13 DO BEGIN
GOTOXY(21,Index);
WRITE('<');
IF (Index > 1) AND (Index < 11) THEN WRITE(Index-1);
IF Index = 11 THEN WRITE('0');
IF Index = 12 THEN WRITE('+');
IF Index = 13 THEN WRITE('-');
WRITE('>');
END; (* FOR Index *)
GOTOXY(14,15); WRITE('<Spacebar>');
GOTOXY(22,17); WRITE('?'); GOTOXY(22,17);
REPEAT
InKey(Fk,Choice); (* Get Choice from Menu *)
UNTIL Choice IN [#32..#68];
CASE Choice OF
#32 : CheckStatus(Check); (* Spacebar *)
#43 : BEGIN
TurnCatOn;
CatSend(Up10Hz,5); (* Numeric + *)
TurnCatOff;
END;
#45 : BEGIN
TurnCatOn;
CatSend(Dn10Hz,5); (* Numeric - *)
TurnCatOff;
END;
#48 : DumbTerm; (* Numeric 0 *)
#49 : SetFreq; (* Numeric 1 *)
#50 : ProgStep; (* Numeric 2 *)
#51 : VFOMRSelect; (* Numeric 3 *)
#52 : MemSelect; (* Numeric 4 *)
#53 : ModeSelect; (* Numeric 5 *)
#54 : CTCSSToneSet; (* Numeric 6 *)
#55 : SelectMemFile; (* Numeric 7 *)
#56 : SelectVFOFile; (* Numeric 8 *)
#57 : BEGIN (* Numeric 9 *)
Repeater := TRUE;
MemSelect;
END;
#59 : HGSelect; (* Fk 1 *)
#60 : BEGIN (* Fk 2 *)
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(Aclr,26);
TurnCatOff;
PromptLine('F'); (* Put up FK line *)
END;
#61 : BEGIN
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(MultString(4,Nul) + CHR(9),5);
CatSend(BandDn,5); (* Fk 3 *)
TurnCatOff;
PromptLine('F'); (* Put up FK line *)
END;
#62 : BEGIN
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(MultString(4,Nul) + CHR(9),5);
CatSend(BandUp,5); (* Fk 4 *)
TurnCatOff;
PromptLine('F'); (* Put up FK line *)
END;
#63 : BEGIN
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(MultString(4,Nul) + CHR(9),5);
CatSend(SplitTog,26); (* Fk 5 *)
TurnCatOff;
PromptLine('F'); (* Put up FK line *)
END;
#64 : BEGIN
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(ClarTog,26); (* Fk 6 *)
TurnCatOff;
PromptLine('F'); (* Put up FK line *)
END;
#65 : BEGIN
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(MToV,26); (* Fk 7 *)
CatSend(MultString(4,Nul) + CHR(9),5);
TurnCatOff;
PromptLine('F'); (* Put up FK line *)
END;
#66 : BEGIN
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(VToM,86); (* Fk 8 *)
CatSend(MultString(3,Nul) + CHR(2) + CHR(9),5);
TurnCatOff;
PromptLine('F'); (* Put up FK line *)
END;
#67 : BEGIN
PromptLine('W'); (* Put up wait message *)
TurnCatOn;
CatSend(Swap,86); (* Fk 9 *)
TurnCatOff;
PromptLine('F'); (* Put up FK line *)
END;
#68 : QuitFlag := TRUE; (* Fk 10 quits program *)
END; (* CASE *)
Main := FALSE;
END; (* MainMenu *)
END. (* of UNIT CATYINST *)