home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 3 Comm / 03-Comm.zip / ASYNCH.ZIP / ASYNCHDV.CLS next >
Text File  |  1990-10-29  |  18KB  |  583 lines

  1.  
  2. Object subclass: #AsynchDevice
  3.   instanceVariableNames: 
  4.     'device handle lineControl dcbInfo '
  5.   classVariableNames: ''
  6.   poolDictionaries: 
  7.     'PMConstants '   !
  8.  
  9.  
  10. !AsynchDevice class methods !
  11.  
  12. open: anInteger
  13.         "Answer a AsynchDevice opened on the device specified by
  14.         anInteger (1 or 2 or higher if supported)."
  15.     ^super new
  16.         open: anInteger.! !
  17.  
  18.  
  19.  
  20. !AsynchDevice methods !
  21.   
  22. baudRate
  23.         "Answer the baud rate of the device."
  24.     | baud answer |
  25.     baud := PMLong new.
  26.     (answer := DosLibrary devIOCtl: baud asParameter
  27.         parms: nil
  28.         function: 16r61
  29.         category: 1
  30.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  31.     ^baud asInteger!
  32.    
  33. breakOff
  34.         "Turn off the break character."
  35.     | err answer |
  36.     err := PMLong new.
  37.     (answer := DosLibrary devIOCtl: err asParameter
  38.         parms: nil
  39.         function: 16r45
  40.         category: 1
  41.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  42.     self readLineControl.
  43.     ^err asInteger!
  44.   
  45. breakOn
  46.         "Turn on the break character."
  47.     | err answer |
  48.     err := PMLong new.
  49.     (answer := DosLibrary devIOCtl: err asParameter
  50.         parms: nil
  51.         function: 16r4B
  52.         category: 1
  53.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  54.     self readLineControl.
  55.     ^err asInteger!
  56.  
  57. breakReplacementChar
  58.         "Answer the character used for break replacement."
  59.     ^dcbInfo breakReplacementChar!
  60.  
  61. close
  62.         "Close the asynch device"
  63.     handle close.
  64.     handle := nil.
  65.     device := nil!
  66.  
  67. ctsOn
  68.         "Answer a boolean indicating whether clear-to-send signal
  69.         is on."
  70.     ^(self readModemInput bitAnd: 16r10) ~= 0!
  71.    
  72. dataBits
  73.         "Answer the current setting for data bits for the device."
  74.     ^lineControl dataBits!
  75.  
  76. dcdOn
  77.         "Answer a boolean indicating whether data-carrier-detect signal
  78.         is on."
  79.     ^(self readModemInput bitAnd: 16r80) ~= 0!
  80.  
  81. device
  82.         "Answer the communications device number."
  83.     ^device!
  84.  
  85. dsrOn
  86.         "Answer a boolean indicating whether data-set-ready signal is on."
  87.     ^(self readModemInput bitAnd: 16r20) ~= 0!
  88.    
  89. dtrOn
  90.         "Answer a boolean indicating whether data-terminal-ready
  91.         signal is on."
  92.     ^(self readModemOutput bitAnd: 16r1) ~= 0!
  93.  
  94. errorReplacementChar
  95.         "Answer the character used for error replacement."
  96.     ^dcbInfo errorReplacementChar!
  97.  
  98. inqueCount
  99.         "Answer the number of characters in the receive queue."
  100.     | count answer |
  101.     count := PMLong new.
  102.     (answer := DosLibrary devIOCtl: count asParameter
  103.         parms: nil
  104.         function: 16r68
  105.         category: 1
  106.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  107.     ^count asInteger!
  108.    
  109. modeAutoReceive
  110.         "Answer automatic receive flow control (xon/xoff) on or off."
  111.     ^dcbInfo modeAutoReceive!
  112.    
  113. modeAutoTransmit
  114.         "Answer automatic transmit flow control (xon/xoff) on or off."
  115.     ^dcbInfo modeAutoTransmit!
  116.  
  117. modeBreakChar
  118.         "Answer break replacement character on or off."
  119.     ^dcbInfo modeBreakChar!
  120.  
  121. modeCtsHandshake
  122.         "Answer output handshaking using the clear-to-send signal
  123.         on or off."
  124.     ^dcbInfo modeCtsHandshake!
  125.  
  126. modeDcdHandshake
  127.         "Answer output handshaking using the data-carrier-detect
  128.         signal on or off."
  129.     ^dcbInfo modeDcdHandshake!
  130.   
  131. modeDsrHandshake
  132.         "Answer output handshaking using the data-set-ready signal on
  133.         or off."
  134.     ^dcbInfo modeDsrHandshake!
  135.    
  136. modeDsrSensitivity
  137.         "Answer input sensitivity using the data-set-ready signal on
  138.         or off."
  139.     ^dcbInfo modeDsrSensitivity!
  140.  
  141. modeDtrControl
  142.         "Answer data-terminal-ready control mode on or off."
  143.     ^dcbInfo modeDtrControl!
  144.   
  145. modeDtrHandshake
  146.         "Answer data-terminal-ready input handshaking mode on or
  147.         off."
  148.     ^dcbInfo modeDtrHandshake!
  149.    
  150. modeErrorChar
  151.         "Answer error replacement character on or off."
  152.     ^dcbInfo modeErrorChar!
  153.  
  154. modeNowaitReadTimeout
  155.         "Answer no-wait read timeout processing on or off."
  156.     ^dcbInfo modeNowaitReadTimeout!
  157.  
  158. modeNoWriteTimeout
  159.         "Answer write infinite timeout processing on or off."
  160.     ^dcbInfo modeNoWriteTimeout!
  161.  
  162. modeNullStripping
  163.         "Answer removal of null bytes on or off."
  164.     ^dcbInfo modeNullStripping!
  165.    
  166. modeReadTimeout
  167.         "Answer normal read timeout processing on or off."
  168.     ^dcbInfo modeReadTimeout!
  169.   
  170. modeRtsControl
  171.         "Answer the request-to-send control mode on or off."
  172.     ^dcbInfo modeRtsControl!
  173.   
  174. modeTransmitToggle
  175.         "Answer toggling on transmit mode on or off."
  176.     ^dcbInfo modeTransmitToggle!
  177.  
  178. modeWaitReadTimeout
  179.         "Answer wait-for-something read timeout processing on
  180.         or off."
  181.     ^dcbInfo modeWaitReadTimeout!
  182.  
  183. open: anInteger
  184.         "Open the specified asynch device"
  185.     device := anInteger.
  186.     handle := FileHandle openAsynchDevice: device.
  187.     self
  188.         readLineControl;
  189.         readDcbInfo;
  190.         setModeDtrControl: true dtrHandshake: false
  191.             ctsHandshake: false dsrHandshake: false
  192.             dcdHandshake: false dsrSensitivity: false;
  193.         setModeAutoTransmit: false autoReceive: false
  194.             errorChar: false nullStripping: false breakChar: false
  195.             rtsControl: true rtsHandshake: false;
  196.         setModeNoWriteTimeout: false readTimeout: true
  197.             waitReadTimeout: false!
  198.  
  199. outqueCount
  200.         "Answer the number of characters in the transmit queue."
  201.     | count answer |
  202.     count := PMLong new.
  203.     (answer := DosLibrary devIOCtl: count asParameter
  204.         parms: nil
  205.         function: 16r69
  206.         category: 1
  207.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  208.     ^count asInteger!
  209.  
  210. parity
  211.         "Answer the current setting for parity for the device."
  212.     ^lineControl parity!
  213.    
  214. readCommError
  215.         "Answer the communications error word and clear it out."
  216.     | err answer |
  217.     err := PMLong new.
  218.     (answer := DosLibrary devIOCtl: err asParameter
  219.         parms: nil
  220.         function: 16r6D
  221.         category: 1
  222.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  223.     ^err asInteger!
  224.    
  225. readCommEvent
  226.         "Answer the communications event flags and clear them out."
  227.     | flags answer |
  228.     flags := PMLong new.
  229.     (answer := DosLibrary devIOCtl: flags asParameter
  230.         parms: nil
  231.         function: 16r72
  232.         category: 1
  233.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  234.     ^flags asInteger!
  235.  
  236. readCommStatus
  237.         "Answer the communication status of the device."
  238.     | flags answer |
  239.     flags := PMLong new.
  240.     (answer := DosLibrary devIOCtl: flags asParameter
  241.         parms: nil
  242.         function: 16r64
  243.         category: 1
  244.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  245.     ^flags asInteger!
  246.   
  247. readDcbInfo
  248.         "Get the device control block information."
  249.     | answer |
  250.     dcbInfo isNil
  251.         ifTrue: [dcbInfo := PMDcbInfo new].
  252.     (answer := DosLibrary devIOCtl: dcbInfo asParameter
  253.         parms: nil
  254.         function: 16r73
  255.         category: 1
  256.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer]!
  257.    
  258. readLineControl
  259.         "Get the line charcteristics of the device."
  260.     | answer |
  261.     lineControl isNil
  262.         ifTrue: [lineControl := PMLineControl new].
  263.     (answer := DosLibrary devIOCtl: lineControl asParameter
  264.         parms: nil
  265.         function: 16r62
  266.         category: 1
  267.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer]!
  268.   
  269. readLineStatus
  270.         "Answer the data transmission status."
  271.     | status answer |
  272.     status := PMLong new.
  273.     (answer := DosLibrary devIOCtl: status asParameter
  274.         parms: nil
  275.         function: 16r65
  276.         category: 1
  277.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  278.     ^status asInteger!
  279.  
  280. readModemInput
  281.         "Answer the modem control input signals of the device."
  282.     | control answer |
  283.     control := PMLong new.
  284.     (answer := DosLibrary devIOCtl: control asParameter
  285.         parms: nil
  286.         function: 16r67
  287.         category: 1
  288.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  289.     ^control asInteger!
  290.    
  291. readModemOutput
  292.         "Answer the modem control output signals of the device."
  293.     | control answer |
  294.     control := PMLong new.
  295.     (answer := DosLibrary devIOCtl: control asParameter
  296.         parms: nil
  297.         function: 16r66
  298.         category: 1
  299.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer].
  300.     ^control asInteger!
  301.  
  302. readTimeout
  303.         "Answer the read timeout in hundredths of a second."
  304.     ^dcbInfo readTimeout!
  305.  
  306. riOn
  307.         "Answer a boolean indicating whether ring indicator signal is on."
  308.     ^(self readModemInput bitAnd: 16r40) ~= 0!
  309.  
  310. rtsOn
  311.         "Answer a boolean indicating whether request-to-send
  312.         signal is on."
  313.     ^(self readModemOutput bitAnd: 16r2) ~= 0!
  314.  
  315. setBaudRate: anInteger
  316.         "Set the baud rate of the device."
  317.     | baud answer |
  318.     baud := PMLong fromInteger: anInteger.
  319.     (answer := DosLibrary devIOCtl: nil
  320.         parms: baud asParameter
  321.         function: 16r41
  322.         category: 1
  323.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer]!
  324.    
  325. setBreakReplacementChar: aCharacter
  326.         "Set the character used for break replacement."
  327.     dcbInfo setBreakReplacementChar: aCharacter.
  328.     self writeDcbInfo!
  329.   
  330. setDataBits: anInteger
  331.         "Set the data bits of the device.
  332.         Data bits is in anInteger and can range from 5 to 8."
  333.     lineControl setDataBits: anInteger.
  334.     self writeLineControl!
  335.    
  336. setDataBits: anInteger parity: aCharacter stopBits: aNumber
  337.         "Set the data bits, parity, and stop bits of the device.
  338.         Data bits is in anInteger and can range from 5 to 8.
  339.         Parity can take the following values:
  340.             n - none, o - odd, e - even, m - mark, s - space.
  341.         Stop bits can take the values 1, 1.5, or 2."
  342.     lineControl
  343.         setDataBits: anInteger;
  344.         setParity: aCharacter;
  345.         setStopBits: aNumber.
  346.     self writeLineControl!
  347.  
  348. setErrorReplacementChar: aCharacter
  349.         "Set the character used for error replacement."
  350.     dcbInfo setErrorReplacementChar: aCharacter.
  351.     self writeDcbInfo!
  352.   
  353. setModeAutoReceive: aBoolean
  354.         "Set automatic receive flow control (xon/xoff) on or off."
  355.     dcbInfo setModeAutoReceive: aBoolean.
  356.     self writeDcbInfo!
  357.  
  358. setModeAutoTransmit: aBoolean
  359.         "Set automatic transmit flow control (xon/xoff) on or off."
  360.     dcbInfo setModeAutoTransmit: aBoolean.
  361.     self writeDcbInfo!
  362.   
  363. setModeAutoTransmit: aBool1 autoReceive: aBool2 errorChar: aBool3
  364.     nullStripping: aBool4 breakChar: aBool5 rtsControl: aBool6
  365.     rtsHandshake: aBool7
  366.         "Set control and handshaking modes on or off."
  367.     dcbInfo
  368.         setModeAutoTransmit: aBool1;
  369.         setModeAutoReceive: aBool2;
  370.         setModeErrorChar: aBool3;
  371.         setModeNullStripping: aBool4;
  372.         setModeBreakChar: aBool5;
  373.         setModeRtsControl: aBool6;
  374.         setModeRtsHandshake: aBool7.
  375.     self writeDcbInfo!
  376.   
  377. setModeBreakChar: aBoolean
  378.         "Set break replacement character on or off."
  379.     dcbInfo setModeBreakChar: aBoolean.
  380.     self writeDcbInfo!
  381.    
  382. setModeCtsHandshake: aBoolean
  383.         "Set output handshaking using the clear-to-send signal
  384.         on or off."
  385.     dcbInfo setModeCtsHandshake: aBoolean.
  386.     self writeDcbInfo!
  387.   
  388. setModeDcdHandshake: aBoolean
  389.         "Set output handshaking using the data-carrier-detect
  390.         signal on or off."
  391.     dcbInfo setModeDcdHandshake: aBoolean.
  392.     self writeDcbInfo!
  393.  
  394. setModeDsrHandshake: aBoolean
  395.         "Set output handshaking using the data-set-ready signal on
  396.         or off."
  397.     dcbInfo setModeDsrHandshake: aBoolean.
  398.     self writeDcbInfo!
  399.  
  400. setModeDsrSensitivity: aBoolean
  401.         "Set input sensitivity using the data-set-ready signal on
  402.         or off."
  403.     dcbInfo setModeDsrSensitivity: aBoolean.
  404.     self writeDcbInfo!
  405.   
  406. setModeDtrControl: aBoolean
  407.         "Set data-terminal-ready control mode on or off."
  408.     dcbInfo setModeDtrControl: aBoolean.
  409.     self writeDcbInfo!
  410.  
  411. setModeDtrControl: aBool1 dtrHandshake: aBool2 ctsHandshake: aBool3
  412.     dsrHandshake: aBool4 dcdHandshake: aBool5 dsrSensitivity: aBool6
  413.         "Set control and handshaking modes on or off."
  414.     dcbInfo
  415.         setModeDtrControl: aBool1;
  416.         setModeDtrHandshake: aBool2;
  417.         setModeCtsHandshake: aBool3;
  418.         setModeDsrHandshake: aBool4;
  419.         setModeDcdHandshake: aBool5;
  420.         setModeDsrSensitivity: aBool6.
  421.     self writeDcbInfo!
  422.   
  423. setModeDtrHandshake: aBoolean
  424.         "Set data-terminal-ready input handshaking mode on or
  425.         off."
  426.     dcbInfo setModeDtrHandshake: aBoolean.
  427.     self writeDcbInfo!
  428.  
  429. setModeErrorChar: aBoolean
  430.         "Set error replacement character on or off."
  431.     dcbInfo setModeErrorChar: aBoolean.
  432.     self writeDcbInfo!
  433.    
  434. setModeNowaitReadTimeout: aBoolean
  435.         "Set no-wait read timeout processing on or off."
  436.     dcbInfo setModeNowaitReadTimeout: aBoolean.
  437.     self writeDcbInfo!
  438.    
  439. setModeNoWriteTimeout: aBoolean
  440.         "Set write infinite timeout processing on or off."
  441.     dcbInfo setModeNoWriteTimeout: aBoolean.
  442.     self writeDcbInfo!
  443.    
  444. setModeNoWriteTimeout: aBool1 readTimeout: aBool2
  445.     waitReadTimeout: aBool3
  446.         "Set the time out processing flags on or off."
  447.     dcbInfo
  448.         setModeNoWriteTimeout: aBool1;
  449.         setModeReadTimeout: aBool2;
  450.         setModeWaitReadTimeout: aBool3.
  451.     self writeDcbInfo!
  452.    
  453. setModeNullStripping: aBoolean
  454.         "Set removal of null bytes on or off."
  455.     dcbInfo setModeNullStripping: aBoolean.
  456.     self writeDcbInfo!
  457.  
  458. setModeReadTimeout: aBoolean
  459.         "Set normal read timeout processing on or off."
  460.     dcbInfo setModeReadTimeout: aBoolean.
  461.     self writeDcbInfo!
  462.  
  463. setModeRtsControl: aBoolean
  464.         "Set the request-to-send control mode on or off."
  465.     dcbInfo setModeRtsControl: aBoolean.
  466.     self writeDcbInfo!
  467.  
  468. setModeTransmitToggle: aBoolean
  469.         "Set toggling on transmit mode on or off."
  470.     dcbInfo setModeTransmitToggle: aBoolean.
  471.     self writeDcbInfo!
  472.    
  473. setModeWaitReadTimeout: aBoolean
  474.         "Set wait-for-something read timeout processing on
  475.         or off."
  476.     dcbInfo setModeWaitReadTimeout: aBoolean.
  477.     self writeDcbInfo!
  478.    
  479. setParity: aCharacter
  480.         "Set the parity of the device.
  481.         Parity can take the following values:
  482.             n - none, o - odd, e - even, m - mark, s - space."
  483.     lineControl setParity: aCharacter.
  484.     self writeLineControl!
  485.  
  486. setReadTimeout: anInteger
  487.         "Set the read timeout in hundredths of a second."
  488.     dcbInfo setReadTimeout: anInteger.
  489.     self writeDcbInfo!
  490.  
  491. setStopBits: aNumber
  492.         "Set the stop bits of the device.
  493.         Stop bits can take the values 1, 1.5, or 2."
  494.     lineControl setStopBits: aNumber.
  495.     self writeLineControl!
  496.  
  497. setWriteTimeout: anInteger
  498.         "Set the write timeout in hundredths of a second."
  499.     dcbInfo setWriteTimeout: anInteger.
  500.     self writeDcbInfo!
  501.  
  502. setXOffChar: aCharacter
  503.         "Set the character used for xoff."
  504.     dcbInfo setXOffChar: aCharacter.
  505.     self writeDcbInfo!
  506.    
  507. setXOnChar: aCharacter
  508.         "Set the character used for xon."
  509.     dcbInfo setXOnChar: aCharacter.
  510.     self writeDcbInfo!
  511.   
  512. startTransmit
  513.         "Allow data transmission to be resumed."
  514.     | answer |
  515.     (answer := DosLibrary devIOCtl: nil
  516.         parms: nil
  517.         function: 16r48
  518.         category: 1
  519.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer]!
  520.  
  521. stopBits
  522.         "Answer the current setting for stop bits for the device."
  523.     ^lineControl stopBits!
  524.  
  525. stopTransmit
  526.         "Halt data transmission."
  527.     | answer |
  528.     (answer := DosLibrary devIOCtl: nil
  529.         parms: nil
  530.         function: 16r47
  531.         category: 1
  532.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer]!
  533.  
  534. transmitImm: aCharacter
  535.         "Transmit the character immediately."
  536.     | answer ch |
  537.     ch := PMLong new.
  538.     ch byteAtOffset: 0 put: aCharacter asciiValue.
  539.     (answer := DosLibrary devIOCtl: nil
  540.         parms: ch asParameter
  541.         function: 16r44
  542.         category: 1
  543.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer]!
  544.  
  545. transmittingBreak
  546.         "Answer a boolean indicating whether a break character is
  547.         being sent."
  548.     ^lineControl transmittingBreak!
  549.  
  550. write: aString
  551.         "Write a string to the asynch device"
  552.     ^handle deviceWrite: aString!
  553.  
  554. writeDcbInfo
  555.     "Put the device control block info to the device."
  556.     | answer |
  557.     (answer := DosLibrary devIOCtl: nil
  558.         parms: dcbInfo asParameter
  559.         function: 16r53
  560.         category: 1
  561.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer]!
  562.    
  563. writeLineControl
  564.     "Put the line control structure to the device."
  565.     | answer |
  566.     (answer := DosLibrary devIOCtl: nil
  567.         parms: lineControl asParameter
  568.         function: 16r42
  569.         category: 1
  570.         device: handle) ~= 0 ifTrue: [^DosDLL OS2Error: answer]!
  571.   
  572. writeTimeout
  573.         "Answer the write timeout in hundredths of a second."
  574.     ^dcbInfo writeTimeout!
  575.  
  576. xOffChar
  577.         "Answer the character used for xoff."
  578.     ^dcbInfo xOffChar!
  579.  
  580. xOnChar
  581.         "Answer the character used for xon."
  582.     ^dcbInfo xOnChar! !
  583.