(* Release 3.10 *) (*-------------------------------------------------------------------------* * * * COMSETUP.MOD - COMMS Toolkit setup * * * * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. * * All Rights Reserved * * * *--------------------------------------------------------------------------*) IMPLEMENTATION MODULE ComSetup; IMPORT CommUtil,FIO,IO,Lib,MenuLib,MPRINTF,RS232,SPRINTF,Str,Window; FROM CommUtil IMPORT FuncKeys; FROM RS232 IMPORT ParityCodes,FlowControls; TYPE String30 = ARRAY[0..30] OF CHAR; String10 = ARRAY[0..10] OF CHAR; String3 = ARRAY[0..3] OF CHAR; AsciiStd = ARRAY[0..32] OF String3; CONST Template = Window.WinDef(0,0,0,0,Window.Yellow,Window.Black,TRUE,FALSE,FALSE,TRUE,Window.SingleFrame,Window.LightGray,Window.Black); Code = AsciiStd('NUL','SOH','STX','ETX','EOT','ENQ','ACK','BEL','BS', 'HT','LF','VT','FF','CR','SO','SI','DLE','DC1','DC2', 'DC3','DC4','NAK','SYN','ETB','CAN','EM','SUB','ESC', 'FS','GS','RS','US','SP'); VAR OldEmulation : Term.Emulations; BoolStr : ARRAY BOOLEAN OF String3; SMenu : MenuLib.MenuRec; (*........................................*) PROCEDURE AsciiCode(c:CHAR):String3; VAR s : String3; BEGIN IF c<=' ' THEN s:=Code[ORD(c)]; ELSE s:=' '; s[0]:=c; END; RETURN s; END AsciiCode; (*........................................*) PROCEDURE GetDefaultSetup; VAR i : CARDINAL; BEGIN WITH Setup DO WITH Serial DO Port:=1; Baud:=1200; DataBits:=8; StopBits:=1; Parity:=None; FlowControl:=RtsCts; END; WITH General DO MaskBit7:=TRUE; CRInTranslation:=CR; CROutTranslation:=CR; ScriptDir:=''; DownloadDir:=''; END; WITH Kermit DO Sync:=1C; MaxPacketSize:=90; PadChar:=0C; NumPadChars:=0; CtlQuote:='#'; ReptPrefix:='~'; EightBitQuote:='&'; ImageMode:=TRUE; IBMMode:=FALSE; EolChar:=CHR(13); END; WITH ASCII DO CharDelayMS:=20; LineDelayMS:=40; END; Emulation:=Term.EmVT100; FOR i:=0 TO 9 DO Macros[i]:=''; END; END; END GetDefaultSetup; (*........................................*) PROCEDURE InitSetup; VAR f : FIO.File; BEGIN FIO.IOcheck := FALSE; f := FIO.Open('TERM.CFG'); IF FIO.IOresult()=0 THEN IF NOT (FIO.RdBin(f,Setup,SIZE(SetupRec))=SIZE(SetupRec)) THEN GetDefaultSetup; END; FIO.Close(f); ELSE GetDefaultSetup; END; END InitSetup; (*................................................*) PROCEDURE Value(VAR s:ARRAY OF CHAR; VAR Result:CARDINAL); VAR c : CHAR; x,i : CARDINAL; BEGIN IF s[0]<>0C THEN x:=0; i:=0; FOR i:=0 TO HIGH(s) DO c := CAP(s[i]); IF c=0C THEN Result:=x; RETURN; ELSIF (c>='0') AND (c<='9') THEN x := x*10 + ORD(c)-48 ELSE RETURN; END; END; Result := x; END; END Value; (*........................................*) PROCEDURE ReadNum(x,y:CARDINAL; Prompt:ARRAY OF CHAR; Min,Max:CARDINAL;VAR Result:CARDINAL); VAR Ok : BOOLEAN; Num,Lnth : CARDINAL; NumStr : ARRAY[0..3] OF CHAR; Def : Window.WinDef; Win : Window.WinType; BEGIN Def := Template; WITH Def DO X1:=x; Y1:=y; X2:=X1+39; Y2:=Y1+2; Foreground := CommUtil.Colors.PromptFore; Background := CommUtil.Colors.PromptBack; FrameFore := CommUtil.Colors.PromptFrFore; FrameBack := CommUtil.Colors.PromptFrBack; END; Win := Window.Open(Def); Window.TextColor(CommUtil.Colors.PromptFore); Window.GotoXY(1,1); IO.WrStr(Prompt); Window.TextColor(CommUtil.Colors.PromptHigh); Str.CardToStr(LONGCARD(Result),NumStr,10,Ok); CommUtil.ReadLine(NumStr,4); Num := Result; Value(NumStr,Num); IF (Num>=Min) AND (Num<=Max) THEN Result:=Num; END; Window.Close(Win); END ReadNum; (*........................................*) PROCEDURE ReadChar(x,y:CARDINAL; Prompt:ARRAY OF CHAR; VAR Ch:CHAR); VAR c : CHAR; Lnth : CARDINAL; Def : Window.WinDef; Win : Window.WinType; BEGIN Lnth := Str.Length(Prompt)+20; Def := Template; WITH Def DO X1:=x; Y1:=y; X2:=X1+39; Y2:=Y1+2; Foreground := CommUtil.Colors.PromptFore; Background := CommUtil.Colors.PromptBack; FrameFore := CommUtil.Colors.PromptFrFore; FrameBack := CommUtil.Colors.PromptFrBack; END; Win := Window.Open(Def); Window.TextColor(CommUtil.Colors.PromptFore); Window.GotoXY(1,1); IO.WrStr(Prompt); Window.TextColor(CommUtil.Colors.PromptHigh); IO.WrStr(AsciiCode(Ch)); Window.GotoXY(Str.Length(Prompt)+1,1); CommUtil.Read(c); IF c<>CHR(27) THEN Ch:=c; END; Window.Close(Win); END ReadChar; (*........................................*) PROCEDURE ModemSetup(MenuX,MenuY:CARDINAL); VAR i,Count : CARDINAL; Serial : MenuLib.MenuRec; (*. . . . . . . . . . . . . . . . . . . . .*) PROCEDURE ParStr(Parity:ParityCodes):String10; BEGIN CASE Parity OF Odd : RETURN ' ODD'; | Even : RETURN ' EVEN'; | Mark : RETURN ' MARK'; | Space : RETURN 'SPACE'; | None : RETURN ' NONE'; | END; END ParStr; (*. . . . . . . . . . . . . . . . . . . . .*) PROCEDURE FlowStr(Ctrl:FlowControls):String10; BEGIN CASE Ctrl OF NoFlowControl: RETURN ' NONE'; | RtsCts : RETURN ' RTS/CTS'; | XonXoff : RETURN 'XON/XOFF'; | END; END FlowStr; (*. . . . . . . . . . . . . . . . . . . . .*) PROCEDURE MsChangeMenu; BEGIN WITH Setup.Serial DO WITH Serial DO SPRINTF.SPrintF1(' Comm Port: %5u ',Port,Option[0].Name); SPRINTF.SPrintF1(' Baud Rate: %5u ',Baud,Option[1].Name); SPRINTF.SPrintF1(' Data Bits: %5u ',DataBits,Option[2].Name); SPRINTF.SPrintF1(' Parity: %s ',ParStr(Parity),Option[3].Name); SPRINTF.SPrintF1(' Stop bits: %5u ',StopBits,Option[4].Name); SPRINTF.SPrintF1(' Flow Ctrl: %s ',FlowStr(FlowControl),Option[5].Name); END; (*WITH*) END; (*WITH*) END MsChangeMenu; (*. . . . . . . . . . . . . . . . . . . . .*) BEGIN (* ModemSetup *) MenuLib.InitMenu(Serial,'',MenuX,MenuY,22); Serial.EscapeOK := TRUE; Serial.ExitOnChar := TRUE; FOR i:=0 TO 5 DO MenuLib.AddOption(Serial,' Comm Port: '); END; MsChangeMenu; MenuLib.DispMenu(Serial); LOOP WITH Setup.Serial DO CASE MenuLib.MenuDrive(Serial) OF -1 : EXIT; | 0 : Port := (Port MOD 4)+1; | 1 : Baud := Baud*2; IF Baud>19200 THEN Baud := 75; END; | 2 : DataBits := 7+ORD(DataBits=7); | 3 : CASE Parity OF None : Parity:=Even; | Even : Parity:=Odd; | Odd : Parity:=Mark; | Mark : Parity:=Space; | Space: Parity:=None; | END; | 4 : StopBits := 1+ORD(StopBits=1); | 5 : IF FlowControl=NoFlowControl THEN FlowControl:=RtsCts ELSIF FlowControl=RtsCts THEN FlowControl:=XonXoff ELSE FlowControl:=NoFlowControl END; | END; END; MsChangeMenu; END; MenuLib.KillMenu(Serial); RS232.UnInstall; WITH Setup.Serial DO RS232.SelectPort(Port); RS232.InitPort(Baud,DataBits,StopBits,Parity); RS232.Install; RS232.SetFlowControl(FlowControl); END; END ModemSetup; (*........................................*) PROCEDURE GeneralSetup(MenuX,MenuY:CARDINAL); VAR i : CARDINAL; GMenu : MenuLib.MenuRec; Selection : INTEGER; CRText : ARRAY CrTypes OF String10; (*. . . . . . . . . . . . . . . . . . . . .*) PROCEDURE GsChangeMenu; BEGIN WITH Setup.General DO WITH GMenu DO SPRINTF.SPrintF1(' Strip Parity Bit: %3s ',BoolStr[MaskBit7],Option[0].Name); SPRINTF.SPrintF1(' CR-in Translation: %4s ',CRText[CRInTranslation],Option[1].Name); SPRINTF.SPrintF1(' CR-out Translation: %4s ',CRText[CROutTranslation],Option[2].Name); END; END; END GsChangeMenu; (*. . . . . . . . . . . . . . . . . . . . .*) BEGIN (* GeneralSetup *) CRText[CR]:='CR'; CRText[CRLF]:='CRLF'; MenuLib.InitMenu(GMenu,'',MenuX,MenuY,26); GMenu.EscapeOK := TRUE; FOR i:=0 TO 2 DO MenuLib.AddOption(GMenu,' X '); END; MenuLib.AddOption(GMenu,' Directory for Scripts '); MenuLib.AddOption(GMenu,' Directory for Downloads '); GsChangeMenu; MenuLib.DispMenu(GMenu); LOOP Selection := MenuLib.MenuDrive(GMenu); WITH Setup.General DO CASE Selection OF -1 : EXIT; | 0 : MaskBit7 := (NOT MaskBit7); | 1 : IF CRInTranslation=CR THEN CRInTranslation:=CRLF ELSE CRInTranslation:=CR END; | 2 : IF CROutTranslation=CR THEN CROutTranslation:=CRLF ELSE CROutTranslation:=CR END; | 3 : CommUtil.ReadString(MenuX+1,MenuY+5,'','',ScriptDir);| 4 : CommUtil.ReadString(MenuX+1,MenuY+6,'','',DownloadDir);| END; END; IF (Selection>=0) AND (Selection<=2) THEN GsChangeMenu; END; END; MenuLib.KillMenu(GMenu); END GeneralSetup; (*........................................*) PROCEDURE KermitSetup(MenuX,MenuY:CARDINAL); VAR i : CARDINAL; KMenu : MenuLib.MenuRec; ModeStr : ARRAY BOOLEAN OF String10; (*. . . . . . . . . . . . . . . . . . . .*) PROCEDURE KsChangeMenu; BEGIN WITH Setup.Kermit DO WITH KMenu DO SPRINTF.SPrintF1(' Sync Char: %3s ',AsciiCode(Sync),Option[0].Name); SPRINTF.SPrintF1(' Packet Size: %4u ',MaxPacketSize,Option[1].Name); SPRINTF.SPrintF1(' Pad Char: %3s ',AsciiCode(PadChar),Option[2].Name); SPRINTF.SPrintF1(' No. Pad Chars: %4u ',NumPadChars,Option[3].Name); SPRINTF.SPrintF1(' Control Quote: %c ',CtlQuote,Option[4].Name); SPRINTF.SPrintF1(' Repeat Prefix: %c ',ReptPrefix,Option[5].Name); SPRINTF.SPrintF1(' 8th bit Quote: %c ',EightBitQuote,Option[6].Name); SPRINTF.SPrintF1(' Transfer Mode: %4s ',ModeStr[ImageMode],Option[7].Name); SPRINTF.SPrintF1(' IBM Mode: %3s ',BoolStr[IBMMode],Option[8].Name); SPRINTF.SPrintF1(' EOL Char: %3s ',AsciiCode(EolChar),Option[9].Name); END; END; END KsChangeMenu; (*. . . . . . . . . . . . . . . . . . . .*) BEGIN (* KermitSetup *) ModeStr[TRUE] := '8Bit'; ModeStr[FALSE] := '7Bit'; MenuLib.InitMenu(KMenu,'',MenuX,MenuY,21); KMenu.EscapeOK := TRUE; FOR i:=0 TO 9 DO MenuLib.AddOption(KMenu,' x '); END; KsChangeMenu; MenuLib.DispMenu(KMenu); LOOP WITH Setup.Kermit DO CASE MenuLib.MenuDrive(KMenu) OF -1 : EXIT; | 0 : ReadChar(MenuX+1,MenuY+2,' Sync Char? ',Sync); | 1 : ReadNum(MenuX+1,MenuY+3,' Packet Size? ',30,90,MaxPacketSize);| 2 : ReadChar(MenuX+1,MenuY+4,' Pad Char? ',PadChar);| 3 : ReadNum(MenuX+1,MenuY+5,' No. Pad Chars? ',0,256,NumPadChars);| 4 : ReadChar(MenuX+1,MenuY+6,' Ctl Quote Char? ',CtlQuote);| 5 : ReadChar(MenuX+1,MenuY+7,' Repeat Prefix? ',ReptPrefix);| 6 : ReadChar(MenuX+1,MenuY+8,' 8th Bit Quote? ',EightBitQuote);| 7 : ImageMode := NOT ImageMode; | 8 : IBMMode := NOT IBMMode; | 9 : ReadChar(MenuX+1,MenuY+11,' EOL Char? ',EolChar);| END; END; KsChangeMenu; END; MenuLib.KillMenu(KMenu); END KermitSetup; (*........................................*) PROCEDURE AsciiSetup(MenuX,MenuY:CARDINAL); VAR i : CARDINAL; AMenu : MenuLib.MenuRec; (*. . . . . . . . . . . . . . . . . . . .*) PROCEDURE AsChangeMenu; BEGIN WITH Setup.ASCII DO WITH AMenu.Option[0] DO SPRINTF.SPrintF1(' Character Delay (ms): %4u ',CharDelayMS,Name); END; WITH AMenu.Option[1] DO SPRINTF.SPrintF1(' Line Delay (ms): %4u ',LineDelayMS,Name); END; END; END AsChangeMenu; (*. . . . . . . . . . . . . . . . . . . .*) BEGIN (* AsciiSetup *) MenuLib.InitMenu(AMenu,'',MenuX,MenuY,28); AMenu.EscapeOK := TRUE; AMenu.ExitOnChar := TRUE; FOR i:=0 TO 1 DO MenuLib.AddOption(AMenu,' x '); END; AsChangeMenu; MenuLib.DispMenu(AMenu); LOOP WITH Setup.ASCII DO CASE MenuLib.MenuDrive(AMenu) OF -1 : EXIT; | 0 : ReadNum(MenuX+1,MenuY+2,' Char Delay? ',0,9999,CharDelayMS); | 1 : ReadNum(MenuX+1,MenuY+3,' Line Delay? ',0,9999,LineDelayMS); | END; END; AsChangeMenu; END; MenuLib.KillMenu(AMenu); END AsciiSetup; (*........................................*) PROCEDURE ChangeMacro(MenuX,MenuY:CARDINAL); VAR i : CARDINAL; Def : Window.WinDef; Win : Window.WinType; (*. . . . . . . . . . . . . . . . . . . . .*) PROCEDURE Highlight(MacroNo:CARDINAL; On:BOOLEAN); BEGIN Window.GotoXY(1,MacroNo+1); Window.TextBackground(CommUtil.Colors.MacroBack); Window.TextColor(CommUtil.Colors.MacroFore); MPRINTF.PrintF1(' %u ',MacroNo); IF On THEN Window.TextBackground(CommUtil.Colors.MacroHighBack); Window.TextColor(CommUtil.Colors.MacroHighFore); ELSE Window.TextBackground(CommUtil.Colors.MacroLowBack); Window.TextColor(CommUtil.Colors.MacroLowFore); END; MPRINTF.PrintF1('%-70s\r',Setup.Macros[MacroNo]); Window.GotoXY(4,MacroNo+1); END Highlight; (*. . . . . . . . . . . . . . . . . . . . .*) PROCEDURE EditMacros; VAR Ch : CHAR; MacroNo, NextMacroNo : CARDINAL; ch : ARRAY[0..1] OF CHAR; BEGIN ch:=' '; MacroNo:=0; LOOP Highlight(MacroNo,TRUE); NextMacroNo := MacroNo; CommUtil.Read(Ch); CASE CommUtil.FuncKeyTyped OF Cup : IF MacroNo>0 THEN NextMacroNo:=MacroNo-1; END; | Cdown : IF MacroNo<9 THEN NextMacroNo:=MacroNo+1; END; | Escape : EXIT; | EndKey,Del, Cright : IF Setup.Macros[MacroNo,0]<>0C THEN CommUtil.PushBack(Ch); CommUtil.SpacesOK:=TRUE; CommUtil.ReadLine(Setup.Macros[MacroNo],70); IF MacroNo<9 THEN NextMacroNo:=MacroNo+1; END; END; | NotRecognised:CommUtil.PushBack(Ch); CommUtil.SpacesOK:=TRUE; CommUtil.ReadLine(Setup.Macros[MacroNo],70); IF MacroNo<9 THEN NextMacroNo:=MacroNo+1; END; | END; Highlight(MacroNo,FALSE); MacroNo := NextMacroNo; END; END EditMacros; (*. . . . . . . . . . . . . . . . . . . . .*) BEGIN (* ChangeMacro *) Def := Template; WITH Def DO X1:=3; Y1:=6; X2:=74; Y2:=17; Foreground := CommUtil.Colors.MacroFore; Background := CommUtil.Colors.MacroBack; FrameFore := CommUtil.Colors.MacroFrFore; FrameBack := CommUtil.Colors.MacroFrBack; END; Win := Window.Open(Def); Window.SetTitle(Win,'Macros',Window.LeftUpperTitle); FOR i:=0 TO 9 DO Highlight(i,FALSE); END; EditMacros; Window.Close(Win); END ChangeMacro; (*........................................*) PROCEDURE ChangeEmulation(MenuX,MenuY:CARDINAL); BEGIN WITH Setup DO CASE Emulation OF Term.EmVT100 : Emulation := Term.EmVT52; SMenu.Option[5].Name := ' E - Emulating VT52 '; | Term.EmVT52 : Emulation := Term.EmANSI; SMenu.Option[5].Name := ' E - Emulating ANSI '; | Term.EmANSI : Emulation := Term.EmVT100; SMenu.Option[5].Name := ' E - Emulating VT100 '; | END; END; END ChangeEmulation; (*........................................*) PROCEDURE SaveSetup; VAR f : FIO.File; BEGIN f := FIO.Create('TERM.CFG'); FIO.WrBin(f,Setup,SIZE(SetupRec)); FIO.Close(f); END SaveSetup; (*........................................*) PROCEDURE ChangeSetup; VAR Result : INTEGER; BEGIN OldEmulation := Setup.Emulation; MenuLib.InitMenu(SMenu,'Setup',1,1,21); SMenu.ExitOnChar := TRUE; SMenu.EscapeOK := TRUE; MenuLib.AddOption(SMenu,' C - Comms Setup '); MenuLib.AddOption(SMenu,' G - General Setup '); MenuLib.AddOption(SMenu,' K - Kermit Setup '); MenuLib.AddOption(SMenu,' A - ASCII Setup '); MenuLib.AddOption(SMenu,' M - Edit Macros '); CASE Setup.Emulation OF Term.EmVT100 : MenuLib.AddOption(SMenu,' E - Emulating VT100 '); | Term.EmVT52 : MenuLib.AddOption(SMenu,' E - Emulating VT52 '); | Term.EmANSI : MenuLib.AddOption(SMenu,' E - Emulating ANSI '); | END; MenuLib.AddOption(SMenu,' S - Save Setup '); MenuLib.DispMenu(SMenu); LOOP Result := MenuLib.MenuDrive(SMenu); CASE Result OF -1 : EXIT; | 0 : ModemSetup(2,3); | 1 : GeneralSetup(2,4); | 2 : KermitSetup(2,5); | 3 : AsciiSetup(2,6); | 4 : ChangeMacro(2,7); | 5 : ChangeEmulation(2,8); | 6 : SaveSetup; | END; END; MenuLib.KillMenu(SMenu); IF Setup.Emulation<>OldEmulation THEN CASE Setup.Emulation OF Term.EmVT100 : Term.EmulateVT100; | Term.EmVT52 : Term.EmulateVT52; | Term.EmANSI : Term.EmulateANSI; | END; END; END ChangeSetup; (*........................................*) BEGIN BoolStr[TRUE] := 'YES'; BoolStr[FALSE] := 'NO'; END ComSetup.