(*======================================================== == JPI-TopSpeed Modula-2 V2 == == demo program: == == == == Simple RS232 Demo showing rs module == == == ========================================================*) MODULE RsDemo; (*======*) IMPORT Window,rs,IO,Str,Lib; TYPE ConnectType = RECORD ConnectStr : ARRAY [0..15] OF CHAR; NoCon1Str : ARRAY [0..15] OF CHAR; NoCon2Str : ARRAY [0..15] OF CHAR; NoCon3Str : ARRAY [0..15] OF CHAR; NoCon4Str : ARRAY [0..15] OF CHAR; NoCon5Str : ARRAY [0..15] OF CHAR; END; CONST PortNr = 1; BaudRate = 1200; WT = Window.WinDef ( 0,0, Window.ScreenWidth-1,23, Window.White,Window.Black,TRUE,TRUE,FALSE,TRUE, Window.SingleFrame,Window.White,Window.Black ); WT2 = Window.WinDef ( 0,0, 50,2, Window.White,Window.Black,TRUE,TRUE,FALSE,TRUE, Window.SingleFrame,Window.White,Window.Black ); HangupStr = '~~~~+++~~~AT H0!'; InitString= 'AT E1 S7=60 S0=0 V1 X1 !~~AT D '; Connect = ConnectType('CONNECT','NO CARRIER','BUSY','NO DIAL TONE', 'NO ANSWER',''); VAR W,W2 : Window.WinType; PROCEDURE SendModemContr( str : ARRAY OF CHAR ); VAR i : CARDINAL; BEGIN FOR i := 0 TO Str.Length(str)-1 DO IF str[i]='~' THEN Lib.Delay(500); ELSIF str[i]='!' THEN rs.Send( CHR(13),1 ); ELSIF str[i]='`' THEN rs.Break( 500 ); ELSE rs.Send( str[i],1 ); Lib.Delay(100); END; END; END SendModemContr; PROCEDURE HangUp; BEGIN IO.WrLn; IO.WrStr('Hanging up please wait'); IO.WrLn; SendModemContr( HangupStr ); IO.WrStr('ok'); END HangUp; PROCEDURE DoConnect(ns:ARRAY OF CHAR):BOOLEAN; VAR str : ARRAY[0..100] OF CHAR; p : CARDINAL; c : CHAR; BEGIN IO.WrStr('Dialing'); SendModemContr( InitString ); SendModemContr( ns ); SendModemContr( '!' ); p :=0; LOOP IF rs.RxCount()#0 THEN rs.Receive(str[p],1); IF str[p]=CHR(13) THEN str[p] := 0C; p := 0; IO.WrLn; IO.WrStr(str); IF Str.Pos(str,Connect.ConnectStr)#MAX(CARDINAL) THEN RETURN TRUE; ELSIF (Str.Pos(str,Connect.NoCon1Str)#MAX(CARDINAL)) AND (Connect.NoCon1Str[0]#0C) OR (Str.Pos(str,Connect.NoCon2Str)#MAX(CARDINAL)) AND (Connect.NoCon2Str[0]#0C) OR (Str.Pos(str,Connect.NoCon3Str)#MAX(CARDINAL)) AND (Connect.NoCon3Str[0]#0C) OR (Str.Pos(str,Connect.NoCon4Str)#MAX(CARDINAL)) AND (Connect.NoCon4Str[0]#0C) OR (Str.Pos(str,Connect.NoCon5Str)#MAX(CARDINAL)) AND (Connect.NoCon5Str[0]#0C) THEN Lib.Delay(1000); RETURN FALSE; END; ELSE p := p+1; END; END; END; END DoConnect; VAR c : CHAR; ns : ARRAY[0..29] OF CHAR; BEGIN rs.Install(PortNr); rs.Init( BaudRate,8,rs.None,TRUE,FALSE ); W2 := Window.Open(WT2); IO.WrStr('Number to dial: '); ns := ''; Window.InputStr(ns); IO.WrLn; IF NOT DoConnect(ns) THEN IO.WrStr('No connection'); HangUp; HALT; END; Window.Close(W2); Window.GotoXY(1,25);IO.WrStr('Press F2 To Hang-up and exit program'); W := Window.Open(WT); LOOP IF IO.KeyPressed() THEN c := IO.RdKey(); (*Exit on F2*) IF (c=0C) AND (CHR(60)=IO.RdKey()) THEN HangUp; EXIT END; WHILE rs.TxFree()=0 DO END; rs.Send( c,1 ); END; IF rs.RxCount()#0 THEN rs.Receive(c,1); IF c>=CHR(80H) THEN DEC(c,80H) END; (* strip top bit *) IO.WrChar(c); END; END; END RsDemo.