home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / windows / basic / lclb42 / modem_io.bas < prev    next >
Encoding:
BASIC Source File  |  1994-08-16  |  3.8 KB  |  174 lines

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