home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 3 Comm
/
03-Comm.zip
/
PMCOMMST.ZIP
/
PMCOMM.MOD
< prev
next >
Wrap
Text File
|
1990-10-25
|
19KB
|
624 lines
MODULE PMComm;
(* ////////////////////////////////////////////////////////////// *)
(* / This is a Presentation Manager program used to set the / *)
(* / comm ports. / *)
(* / / *)
(* / There is two ways to operate the PMComm program. Loading / *)
(* / PMComm directly without command line parameters, allows / *)
(* / interactively set and save the comm port paramters. If / *)
(* / the /S command line directive is added then when PMComm / *)
(* / is called, it sets the comm port then emmeadiatly ends. / *)
(* / / *)
(* / Example: / *)
(* / [C:\] PMCOMM ; Loads in interactive mode / *)
(* / [C:\] PMCOMM /S ; Sets comm port then ends / *)
(* / / *)
(* ////////////////////////////////////////////////////////////// *)
IMPORT Win,Gpi,Dos,Err; (* mod *)
FROM OS2DEF IMPORT
HAB, (* type *)
HPS, (* type *)
HWND, (* type *)
HBITMAP,
POINTL, (* type *)
RECTL, (* type *)
LSET, (* type *)
BOOL, (* var *)
NULL; (* var *)
FROM SYSTEM IMPORT
Seg; (* proc *)
FROM Strings IMPORT
Pos,
Assign,
Concat,
Delete,
Copy,
Length;
FROM Str IMPORT
StrToCard,
CardToStr,
Caps;
FROM FIO IMPORT
MkDir,
Erase,
Create,
Open,
Close,
File,
EOF,
IOcheck,
IOresult,
Exists,
RdBin,
RdChar,
RdStr,
WrBin,
WrStr,
WrLn,
WrChar;
FROM Lib IMPORT
Exec,
ParamCount,
ParamStr;
(*
FROM PMPlotFile IMPORT
FileName,
IDD_OPEN,
OpenDlgProc;
FROM PMPlotHelp IMPORT
HelpDlgProc;
*)
FROM PMPlotGlobal IMPORT
WorkPath;
CONST
WindowId = 255;
ID_ICON = 255;
ID_BITMAP = 25;
IDM_HELP = 2;
IDM_EXIT = 4;
IDM_CONFIG = 9;
IDD_CONFIG = 275;
IDD_HELP = 257;
IDD_COM1 = 284;
IDD_COM2 = 285;
IDD_9600 = 287;
IDD_4800 = 288;
IDD_2400 = 289;
IDD_NONE = 291;
IDD_ODD = 292;
IDD_EVEN = 293;
IDD_DB7 = 296;
IDD_DB8 = 295;
IDD_SB1 = 298;
IDD_SB2 = 299;
IDD_XON = 301;
IDD_DSR = 302;
IDD_WRKPATH = 313;
TYPE
QueueInfoType = RECORD
CharsInQueue : CARDINAL;
QueueSize : CARDINAL;
END;
Func41Type = RECORD
BaudRate : CARDINAL;
END;
LineControlType = RECORD
DataBits : BYTE;
Parity : BYTE;
StopBits : BYTE;
TransBreak : BYTE;
END;
DCBType = RECORD
WriteTimeout : CARDINAL;
ReadTimeout : CARDINAL;
CtlHndShake : BYTE;
FlowReplace : BYTE;
Timeout : BYTE;
ErrorReplacementChar : BYTE;
BreakReplacementChar : BYTE;
XONChar : BYTE;
XOFFChar : BYTE;
END;
CommPortType = RECORD
Name : ARRAY[0..14] OF CHAR;
BaudRate : CARDINAL;
Parity : BYTE;
DataBits : BYTE;
StopBits : BYTE;
XonXoff : BOOLEAN;
Speed : CARDINAL;
END;
VAR
ActivePort,
result : CARDINAL;
mresult : Win.MRESULT;
Func41 : Func41Type;
LineControl : LineControlType;
DCB : DCBType;
Hab : HAB;
Hps : HPS;
hwndFrame,
frame : HWND;
hmq : Win.HMQ;
qmsg : Win.QMSG;
hwndWndw,
client : HWND;
hbmAbleIcon : HBITMAP;
createfl : LSET;
SetThenExit,
ok : BOOLEAN;
cxChar,
cyChar,
cxClient,
cyClient : LONGINT;
DriveStr : ARRAY[0..5] OF CHAR;
OldCommPort,
CommPort : ARRAY[1..3] OF CommPortType;
PROCEDURE ReadConfiguration();
(* /////////////////////////////////////////////////// *)
(* / This routine reads the configuration file and / *)
(* / sets the program's variables. / *)
(* /////////////////////////////////////////////////// *)
VAR
CfgFile : File;
CfgName,
Str : ARRAY[0..79] OF CHAR;
i,j : CARDINAL;
ok : BOOLEAN;
BEGIN
CfgName := 'PMCOMM.CFG';
IF Length(WorkPath) > 0 THEN
IF WorkPath[Length(WorkPath)] # '\' THEN
Concat('\',CfgName,CfgName);
END;
Concat(WorkPath,CfgName,CfgName);
END;
IF Exists(CfgName) THEN
CfgFile := Open(CfgName);
FOR i := 1 TO 2 DO
FOR j := 1 TO 6 DO
RdStr(CfgFile,Str);
CASE j OF
1 : CommPort[i].BaudRate := CARDINAL(StrToCard(Str,10,ok));|
2 : CommPort[i].Parity := BYTE(StrToCard(Str,10,ok));|
3 : CommPort[i].DataBits := BYTE(StrToCard(Str,10,ok));|
4 : CommPort[i].StopBits := BYTE(StrToCard(Str,10,ok));|
5 : CommPort[i].XonXoff := BOOLEAN(StrToCard(Str,10,ok));|
6 : CommPort[i].Speed := CARDINAL(StrToCard(Str,10,ok));
END;
END;
END;
RdStr(CfgFile,Str);
Assign(Str,WorkPath);
Close(CfgFile);
ELSE
WorkPath := '';
FOR i := 1 TO 2 DO
CommPort[i].BaudRate := 9600;
CommPort[i].DataBits := 8;
CommPort[i].StopBits := 1;
CommPort[i].Parity := 0;
CommPort[i].XonXoff := FALSE;
END;
END;
END ReadConfiguration;
PROCEDURE WriteConfiguration();
(* //////////////////////////////////////////////////////////// *)
(* / This routine writes the PMPLOT program's configuration / *)
(* / to the PMPLOT.CFG file. / *)
(* //////////////////////////////////////////////////////////// *)
VAR
CfgFile : File;
CfgName,
Str : ARRAY[0..79] OF CHAR;
i,j : CARDINAL;
ok : BOOLEAN;
BEGIN
CfgName := 'PMCOMM.CFG';
IF Length(WorkPath) > 0 THEN
IF WorkPath[Length(WorkPath)] # '\' THEN
Concat('\',CfgName,CfgName);
END;
Concat(WorkPath,CfgName,CfgName);
END;
CfgFile := Create(CfgName);
FOR i := 1 TO 2 DO
FOR j := 1 TO 6 DO
CASE j OF
1 : CardToStr(LONGCARD(CommPort[i].BaudRate),Str,10,ok);|
2 : CardToStr(LONGCARD(CommPort[i].Parity),Str,10,ok);|
3 : CardToStr(LONGCARD(CommPort[i].DataBits),Str,10,ok);|
4 : CardToStr(LONGCARD(CommPort[i].StopBits),Str,10,ok);|
5 : CardToStr(LONGCARD(CommPort[i].XonXoff),Str,10,ok);|
6 : CardToStr(LONGCARD(CommPort[i].Speed),Str,10,ok);
END;
WrStr(CfgFile,Str);
WrLn(CfgFile);
END;
END;
WrStr(CfgFile,WorkPath);
WrLn(CfgFile);
Close(CfgFile);
END WriteConfiguration;
PROCEDURE SetCfgPortStatus(hwnd : HWND; ActivePort : CARDINAL);
(* //////////////////////////////////////////////////////// *)
(* / This routine sets the radio buttons to the current / *)
(* / status for the active port. / *)
(* //////////////////////////////////////////////////////// *)
BEGIN
CASE CommPort[ActivePort].BaudRate OF
9600 : Win.SendDlgItemMsg(hwnd,IDD_9600,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
4800 : Win.SendDlgItemMsg(hwnd,IDD_4800,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
2400 : Win.SendDlgItemMsg(hwnd,IDD_2400,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
END;
CASE CARDINAL(CommPort[ActivePort].Parity) OF
0 : Win.SendDlgItemMsg(hwnd,IDD_NONE,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
1 : Win.SendDlgItemMsg(hwnd,IDD_ODD,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
2 : Win.SendDlgItemMsg(hwnd,IDD_EVEN,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
END;
CASE CARDINAL(CommPort[ActivePort].DataBits) OF
7 : Win.SendDlgItemMsg(hwnd,IDD_DB7,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
8 : Win.SendDlgItemMsg(hwnd,IDD_DB8,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
END;
CASE CARDINAL(CommPort[ActivePort].StopBits) OF
0 : Win.SendDlgItemMsg(hwnd,IDD_SB1,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
2 : Win.SendDlgItemMsg(hwnd,IDD_SB2,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);|
END;
IF CommPort[ActivePort].XonXoff THEN
Win.SendDlgItemMsg(hwnd,IDD_XON,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);
ELSE
Win.SendDlgItemMsg(hwnd,IDD_DSR,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);
END;
END SetCfgPortStatus;
(*# save, call(near_call=>off, reg_param=>(), reg_saved=>(di,si,ds,st1,st2)) *)
PROCEDURE ConfigureDlgProc(hwnd : HWND;
msg : CARDINAL;
mp1,
mp2 : Win.MPARAM) : Win.MRESULT;
(* ///////////////////////////////////////////// *)
(* / Configure Dialog Box Control Procedure. / *)
(* ///////////////////////////////////////////// *)
VAR
ok : BOOLEAN;
i,
id,
result : CARDINAL;
mresult : Win.MRESULT;
Param : Win.MPARAM;
Command : Win.COMMANDMSG;
hps : HPS;
pt : POINTL;
iresult : LONGINT;
Com : File;
BEGIN
CASE msg OF
Win.WM_INITDLG:
Win.SendDlgItemMsg(hwnd,IDD_COM1,Win.BM_SETCHECK,Win.MPARAM(LONGCARD(TRUE)),0);
ActivePort := 1;
Win.SetDlgItemText(hwnd,IDD_WRKPATH,WorkPath);
SetCfgPortStatus(hwnd,ActivePort);
OldCommPort[1] := CommPort[1];
OldCommPort[2] := CommPort[2];
RETURN 0;|
Win.WM_CONTROL:
id := CARDINAL(mp1 MOD 65536);
IF id = IDD_COM1 THEN
ActivePort := 1;
SetCfgPortStatus(hwnd,ActivePort);
ELSIF id = IDD_COM2 THEN
ActivePort := 2;
SetCfgPortStatus(hwnd,ActivePort);
ELSE
CASE id OF
IDD_DB7 : CommPort[ActivePort].DataBits := 7;|
IDD_DB8 : CommPort[ActivePort].DataBits := 8;|
IDD_SB1 : CommPort[ActivePort].StopBits := 0;|
IDD_SB2 : CommPort[ActivePort].StopBits := 2;|
IDD_9600 : CommPort[ActivePort].BaudRate := 9600;|
IDD_4800 : CommPort[ActivePort].BaudRate := 4800;|
IDD_2400 : CommPort[ActivePort].BaudRate := 2400;|
IDD_NONE : CommPort[ActivePort].Parity := 0;|
IDD_ODD : CommPort[ActivePort].Parity := 1;|
IDD_EVEN : CommPort[ActivePort].Parity := 2;|
IDD_XON : CommPort[ActivePort].XonXoff := TRUE;|
IDD_DSR : CommPort[ActivePort].XonXoff := FALSE;|
IDD_WRKPATH : Win.QueryDlgItemText(hwnd,IDD_WRKPATH,SIZE(WorkPath),WorkPath);|
END;
END;
RETURN 0;|
Win.WM_COMMAND:
Command := Win.COMMANDMSG(mp2);
CASE Command.cmd OF
Win.DID_OK:
WriteConfiguration();
FOR i := 1 TO 2 DO
IF i = 1 THEN
Com := Open('COM1');
ELSE
Com := Open('COM2');
END;
Func41.BaudRate := CommPort[i].BaudRate;
WITH LineControl DO
DataBits := CommPort[i].DataBits;
Parity := CommPort[i].Parity;
StopBits := CommPort[i].StopBits;
END;
Dos.DevIOCtl(NIL,ADR(LineControl),42H,1,Com);
Dos.DevIOCtl(NIL,ADR(Func41),41H,1,Com);
Dos.DevIOCtl(ADR(DCB),NIL,73H,1,Com);
IF CommPort[i].XonXoff THEN
WITH DCB DO
CtlHndShake := 0;
FlowReplace := 3;
END;
ELSE
WITH DCB DO
CtlHndShake := 89;
FlowReplace := 64;
END;
END;
Dos.DevIOCtl(NIL,ADR(DCB),53H,1,Com);
Close(Com);
END;
Win.DismissDlg(hwnd, CARDINAL(TRUE));
RETURN 0;|
Win.DID_CANCEL:
CommPort[1] := OldCommPort[1];
CommPort[2] := OldCommPort[2];
Win.DismissDlg(hwnd, CARDINAL(FALSE));
RETURN 0;
END;
ELSE
RETURN Win.DefDlgProc(hwnd, msg, mp1, mp2);
END;
RETURN 0;
END ConfigureDlgProc;
PROCEDURE WindowProc(hwnd : HWND (* in *);
msg : CARDINAL (* in *);
mp1, (* in *)
mp2 : Win.MPARAM (* in *)) : Win.MRESULT (* out *);
(* ////////////////////////////// *)
(* / Window control procedure / *)
(* ////////////////////////////// *)
VAR
hps : HPS;
rect : RECTL;
swp : Win.SWP;
Command : Win.COMMANDMSG;
fm : Gpi.FONTMETRICS;
cresult : CARDINAL;
id : CARDINAL;
pt : POINTL;
result : POINTER TO CARDINAL;
ok : BOOLEAN;
Str : ARRAY[0..39] OF CHAR;
Msg : POINTER TO ARRAY[0..39] OF CHAR;
BEGIN
CASE msg OF
Win.WM_CREATE :
hwndFrame := Win.QueryWindow(hwnd,Win.QW_PARENT,B_FALSE);
hps := Win.GetPS(hwnd);
hbmAbleIcon := Gpi.LoadBitmap(hps,NULL,ID_BITMAP,0,0);
Gpi.QueryFontMetrics(hps,SIZE(fm),fm);
cxChar := fm.AveCharWidth;
cyChar := fm.MaxBaselineExt;
Win.ReleasePS(hps);
hwndWndw := hwnd;|
Win.WM_SIZE :
Win.QueryWindowRect(hwnd, rect);
Win.MapWindowPoints(hwnd, Win.HWND_DESKTOP, POINTL(rect), 2);
WITH rect DO
xRight := xLeft + 38 * cxChar;
yTop := yBottom + 12 * cyChar;
END;
Win.CalcFrameRect(hwndFrame, rect, B_FALSE);
Win.SetWindowPos(hwndFrame, Win.HWND_TOP,
INTEGER(rect.xLeft),
INTEGER(rect.yBottom),
INTEGER(rect.xRight - rect.xLeft),
INTEGER(rect.yTop - rect.yBottom),
Win.SWP_SIZE + Win.SWP_MOVE);|
Win.WM_PAINT :
hps := Win.BeginPaint(hwnd, HPS(NULL), rect);
Win.FillRect(hps, rect, Gpi.CLR_WHITE);
pt.x := 5 * cxChar;
pt.y := 10 * cyChar;
Gpi.CharStringAt(hps,pt,24,'AEC-Able Engineering Co.');
pt.x := 8 * cxChar;
pt.y := 7 * cyChar;
Gpi.CharStringAt(hps,pt,17,'COMM SET UTILITY');
pt.x := 2 * cxChar;
pt.y := 2 * cyChar;
Gpi.CharStringAt(hps,pt,13,'Jim Billmeyer');
pt.x := 2 * cxChar;
pt.y := 1 * cyChar;
Gpi.CharStringAt(hps,pt,8,'Ver 1.00');
pt.x := 26 * cxChar;
pt.y := 1 * cyChar DIV 2;
rect.xLeft := 0;
rect.xRight := 64;
rect.yBottom := 0;
rect.yTop := 64;
Win.DrawBitmap(hps,hbmAbleIcon,rect,pt,Gpi.CLR_BLACK,Gpi.CLR_BLUE,Win.DBM_NORMAL);
Win.EndPaint(hps);|
Win.WM_HELP :
;|
Win.WM_COMMAND :
Command := Win.COMMANDMSG(mp2);
CASE Command.cmd OF
IDM_CONFIG :
Win.DlgBox(Win.HWND_DESKTOP,hwnd,ConfigureDlgProc,NULL,IDD_CONFIG,NIL);|
IDM_EXIT :
Win.SendMsg(hwnd,Win.WM_CLOSE,0,0);|
END;|
ELSE
RETURN Win.DefWindowProc(hwnd, msg, mp1, mp2);
END;
RETURN Win.MPARAM(FALSE);
END WindowProc;
(*# restore *)
VAR
Com : File;
i : CARDINAL;
Str : ARRAY[0..128] OF CHAR;
WinResult : Win.MPARAM;
BEGIN
ReadConfiguration();
IF ParamCount() > 0 THEN
FOR i := 1 TO 2 DO
IF i = 1 THEN
Com := Open('COM1');
ELSE
Com := Open('COM2');
END;
Func41.BaudRate := CommPort[i].BaudRate;
WITH LineControl DO
DataBits := CommPort[i].DataBits;
Parity := CommPort[i].Parity;
StopBits := CommPort[i].StopBits;
END;
Dos.DevIOCtl(NIL,ADR(LineControl),42H,1,Com);
Dos.DevIOCtl(NIL,ADR(Func41),41H,1,Com);
Dos.DevIOCtl(ADR(DCB),NIL,73H,1,Com);
IF CommPort[i].XonXoff THEN
WITH DCB DO
CtlHndShake := 0;
FlowReplace := 3;
END;
ELSE
WITH DCB DO
CtlHndShake := 89;
FlowReplace := 64;
END;
END;
Dos.DevIOCtl(NIL,ADR(DCB),53H,1,Com);
Close(Com);
END;
ELSE
Hab := Win.Initialize(NULL);
hmq := Win.CreateMsgQueue(Hab,0);
Win.RegisterClass(Hab,"PMComm",WindowProc,Win.CS_SIZEREDRAW,0);
createfl := Win.FCF_TITLEBAR +
Win.FCF_SYSMENU +
Win.FCF_DLGBORDER +
Win.FCF_MINBUTTON +
Win.FCF_MENU +
Win.FCF_SHELLPOSITION +
Win.FCF_ICON;
frame := Win.CreateStdWindow(Win.HWND_DESKTOP, (* Desktop window is parent *)
Win.WS_VISIBLE, (* Class Style *)
createfl, (* Frame control flag *)
"PMComm", (* Client window class name *)
"Comm Set", (* Title *)
0, (* No special class style *)
NULL, (* Resource is in .EXE file *)
WindowId, (* Frame window identifier *)
client); (* Client window handle *)
WHILE (Win.GetMsg(Hab, qmsg, HWND(NULL), 0, 0)) DO
Win.DispatchMsg(Hab, qmsg);
END;
Win.DestroyWindow(frame);
Win.DestroyMsgQueue(hmq);
Win.Terminate(Hab);
END;
END PMComm.