home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / bas / pcl4b42 / modem_io.bas < prev    next >
BASIC Source File  |  1994-09-08  |  4KB  |  166 lines

  1. '
  2. '  MODEM_IO.BAS
  3. '
  4.  
  5. '$INCLUDE: 'MODEM_IO.BI'
  6. '$INCLUDE: 'PCL4B.BI'
  7.  
  8. CONST FALSE = 0
  9. CONST TRUE = NOT FALSE
  10.  
  11. ' echos incoming to screen
  12.  
  13. ' send string to modem & get echo
  14.  
  15. ' wait for Text$
  16.  
  17. ' enter command state
  18. ' NOTE: assumes escape char = '+' & guard time = 1 sec
  19.  
  20. ' hangup phone (in command state)
  21.  
  22. ' wait for continuous quiet (no incoming serial data)
  23.  
  24.  FUNCTION BreakTest()
  25.  ' User BREAK ?
  26.  IF SioBrkKey() OR SioKeyPress() THEN
  27.    PRINT "User BREAK"
  28.    BreakTest = TRUE
  29.    EXIT FUNCTION
  30.  END IF
  31.  BreakTest = FALSE
  32.  END FUNCTION
  33.  
  34.  FUNCTION ModemCmdState(BYVAL Port)
  35.  ' delay a bit over 1 second
  36.  rc = SioDelay(25)
  37.  ' send Escape Code exactly 3 times
  38.  FOR I = 1 TO 3
  39.    rc = SioPutc(Port, ASC("+"))
  40.    rc = SioDelay(5)
  41.  NEXT I
  42.  ' delay again
  43.  rc = SioDelay(25)
  44.  END FUNCTION
  45.  
  46.  FUNCTION ModemEcho(BYVAL Port, BYVAL Echo)
  47.  Time& = SioTimer&()
  48.  DO WHILE SioTimer&() < Time& + Echo
  49.    rc = SioGetc(Port, 1)
  50.    IF rc >= 0 THEN rc = SioCrtWrite(rc)
  51.  LOOP
  52.  END FUNCTION
  53.  
  54.  FUNCTION ModemHangup(BYVAL Port)
  55.  ' enter command state
  56.  rc = ModemCmdState(Port)
  57.  ' hangup !
  58.  rc = ModemSendTo(Port, 4, "!AT!")
  59.  rc = ModemEcho(Port, 10)
  60.  rc = ModemSendTo(Port, 4, "ATH0!")
  61.  END FUNCTION
  62.  
  63. FUNCTION ModemQuiet(BYVAL Port, BYVAL Tics)
  64.  ' set up
  65.  CharTime& = SioTimer&()
  66.  DO
  67.    ' User BREAK ?
  68.    IF BreakTest() THEN
  69.       ModemQuiet = FALSE
  70.       EXIT FUNCTION
  71.    END IF
  72.    ' wait for next character
  73.    Code = SioGetc(Port, 1)
  74.    IF Code < -1 THEN
  75.       ModemQuiet = FALSE
  76.       EXIT FUNCTION
  77.    END IF
  78.    IF Code >= 0 THEN
  79.       CharTime& = SioTimer&()
  80.       rc = SioCrtWrite(Code)
  81.    ELSE
  82.       ' =-1, timed out
  83.       IF SioTimer&() >= CharTime& + Tics THEN
  84.          ModemQuiet = TRUE
  85.          EXIT FUNCTION
  86.       END IF
  87.    END IF
  88.  LOOP
  89.  END FUNCTION
  90.  
  91.  FUNCTION ModemSendTo(BYVAL Port, BYVAL Pace, Text$)
  92.  FOR I = 1 TO LEN(Text$)
  93.    ' User BREAK ?
  94.    IF BreakTest() THEN
  95.      ModemSendTo = FALSE
  96.      EXIT FUNCTION
  97.    END IF
  98.    ' delay <Pace> tics
  99.    IF Pace > 0 THEN rc = ModemEcho(Port, Pace)
  100.    ' fetch character
  101.    c$ = MID$(Text$, I, 1)
  102.    SELECT CASE c$
  103.      CASE "!"
  104.        ' replace ! with carriage return
  105.        c$ = CHR$(13)
  106.      CASE "~"
  107.        ' delay 1/2 second
  108.        rc = SioDelay(10)
  109.        c$ = " "
  110.      CASE " "
  111.        ' delay 1/4 second
  112.        rc = SioDelay(5)
  113.        c$ = " "
  114.    END SELECT
  115.    ' transmit
  116.    rc = SioPutc(Port, ASC(c$))
  117.  NEXT I
  118.  ModemSendTo = TRUE
  119.  END FUNCTION
  120.  
  121.  FUNCTION ModemWaitFor(BYVAL Port, BYVAL Tics, BYVAL CaseFlag, Text$)
  122.  Length = LEN(Text$)
  123.  ' wait for string
  124.  Time& = SioTimer&()
  125.  First = 1
  126.  DO WHILE SioTimer&() < Time& + Tics
  127.    ' User BREAK ?
  128.    IF BreakTest() THEN
  129.      ModemWaitFor = FALSE
  130.      EXIT FUNCTION
  131.    END IF
  132.    ' wait for next character
  133.    Code = SioGetc(Port, 1)
  134.    IF Code < -1 THEN
  135.      ModemWaitFor = FALSE
  136.      EXIT FUNCTION
  137.    END IF
  138.    IF Code >= 0 THEN
  139.      ' echo char
  140.      rc = SioCrtWrite(Code)
  141.      ' prepare chars
  142.      c1$ = MID$(Text$, First, 1)
  143.      First = First + 1
  144.      c2$ = CHR$(Code)
  145.      ' case sensitive ?
  146.      IF NOT CaseFlag THEN
  147.        c1$ = UCASE$(c1$)
  148.        c2$ = UCASE$(c2$)
  149.      END IF
  150.      ' does char match ?
  151.      '''PRINT "[";c1$;"|";c2$;"]"
  152.      IF c1$ = c2$ THEN
  153.        IF First > Length THEN
  154.          ModemWaitFor = TRUE
  155.          EXIT FUNCTION
  156.        END IF
  157.      ELSE
  158.        'start over again
  159.        First = 1
  160.      END IF
  161.    END IF
  162.  LOOP
  163.  ModemWaitFor = FALSE
  164.  END FUNCTION
  165.  
  166.