ðÅSyntax10.Scn.FntµSyntax10i.Scn.FntYSyntax10b.Scn.Fnta™Ú\?Í @’d MODULE Line; (* Oberon for Windows MH 8.2.95 / based on original Line tool by NW *) (* Connect / Disconnect due to ww *) IMPORT V24, Texts, Oberon, Log; CONST T0 = 1200; (*timeout*) PerSec = LONG(1000); VAR W: Texts.Writer; handler: Oberon.Task; connectTime: LONGINT; PROCEDURE SendString(s: ARRAY OF CHAR); VAR i: INTEGER; ch: CHAR; BEGIN i := 0; ch := s[0]; WHILE ch # 0X DO V24.Send(ch); INC(i); ch := s[i] END END SendString; PROCEDURE GetNumber (VAR num: ARRAY OF CHAR); VAR i: INTEGER; ch: CHAR; text: Texts.Text; beg, end, time: LONGINT; r: Texts.Reader; BEGIN Texts.OpenReader(r, Oberon.Par.text, Oberon.Par.pos); REPEAT Texts.Read(r, ch) UNTIL r.eot OR (ch > " ") OR (ch = 0DX); IF ~r.eot & (ch = "^") THEN Oberon.GetSelection(text, beg, end, time); IF time >= 0 THEN Texts.OpenReader(r, text, beg); REPEAT Texts.Read(r, ch) UNTIL r.eot OR (ch > " ") OR (ch = 0DX) END END ; i := 0; WHILE ~r.eot & ((ch = " ") OR (ch = "*") OR (ch = "#") OR ((ch >= "0") & (ch <= "9"))) DO IF ch # " " THEN num[i] := ch; INC(i) END ; Texts.Read(r, ch) END ; num[i] := 0X END GetNumber; PROCEDURE Wait (msec: LONGINT); VAR t: LONGINT; BEGIN t := Oberon.Time() + msec * PerSec DIV 1000; REPEAT UNTIL t < Oberon.Time() END Wait; PROCEDURE Config*; VAR S: Texts.Scanner; done: BOOLEAN; BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S); IF S.class = Texts.Int THEN V24.Start(2, S.i, 0, 8, 0, done); IF done THEN Log.Str(" COM2 started at "); Log.Int(S.i); Log.Str(", N, 8, 1"); Log.Ln; ELSE Log.Str(V24.Error); Log.Ln; END END END Config; PROCEDURE Start*; VAR S: Texts.Scanner; done: BOOLEAN; BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S); IF S.class = Texts.Int THEN V24.Start(2, S.i, 0, 8, 0, done); IF done THEN Oberon.Remove(handler); Oberon.Install(handler); Log.Str(" COM2 started at "); Log.Int(S.i); Log.Str(", N, 8, 1"); Log.Ln; ELSE Log.Str(V24.Error); Log.Ln; END END END Start; PROCEDURE SendMsg*; VAR S: Texts.Scanner; BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S); IF S.class IN {Texts.String, Texts.Name} THEN SendString(S.s) END ; V24.Send(0DX) END SendMsg; PROCEDURE Stop*; BEGIN Oberon.Remove(handler); Log.Str(" Line stopped"); Log.Ln; END Stop; PROCEDURE Escape*; BEGIN V24.Send(3X); V24.Send(0DX) END Escape; PROCEDURE Connect*; VAR num: ARRAY 64 OF CHAR; BEGIN GetNumber(num); connectTime := Oberon.Time(); IF num[0] # 0X THEN SendString("at m0 l0 s11=55 dt "); SendString(num); V24.Send(0DX) END END Connect; PROCEDURE Disconnect*; VAR t: LONGINT; BEGIN SendString("+++"); Wait(1050); SendString("ath"); V24.Send(0DX); t := Oberon.Time(); Log.Str("Disconnected after"); Log.Int((t - connectTime) DIV (PerSec * 60)); Log.Str(" min"); Log.Int(((t - connectTime) DIV PerSec) MOD 60); Log.Str(" sec."); Log.Ln; END Disconnect; PROCEDURE Serve; VAR n: INTEGER; ch: CHAR; BEGIN n := V24.Available(); IF n > 0 THEN REPEAT V24.Receive(ch); Texts.Write(W, ch); DEC(n) UNTIL n = 0; Texts.Append(Oberon.Log, W.buf) END ; handler.time := Oberon.Time() + 500 * PerSec DIV 1000; (* .5 seconds interval *) END Serve; BEGIN Texts.OpenWriter(W); NEW(handler); handler.safe := FALSE; handler.time := Oberon.Time(); handler.handle := Serve END Line.