Added two functions:

dio_modemget(resource fd) - returns the control line status of a serial port
dio_read_waiting(resource fd) - returns the number of bytes waiting in the input buffer


(note: i have submitted a patch for dio_modemget before, but since current CVS doesn't have it, I'm sending it again)

Modified dio_tcsetattr() so the array accepts two more parameters:

'hwflow' - set to zero to turn hardware flow control (CRTSCTS) off (defaults to on)
'swflow' - set to non-zero to turn software flow control (XON/XOFF) on (defaults to off)


Note that the defaults maintain the old behaviour. This change to dio_tcsetattr() is also attached seperately as dio_tcsetattr.patch.txt, but it is also included in dio_changes.patch.txt.

dio_modemget() was written to get the status of a UPS. Flow control changes were made to be able to communicate with a serial device that required flow control off (and that was a fun problem to track down..). dio_read_waiting() was also written to communicate with the serial device, as I was having problems using non-blocking, and with blocking read() would sometimes wait forever.

fyi, the device is a "weatherduck" http://www.itwatchdogs.com/duckdetails.shtml

ttyl, greg
--
Greg MacLellan


Index: php-src/ext/dio/dio.c
===================================================================
RCS file: /repository/php-src/ext/dio/dio.c,v
retrieving revision 1.21.2.3
diff -u -r1.21.2.3 dio.c
--- php-src/ext/dio/dio.c       7 Mar 2003 13:42:11 -0000       1.21.2.3
+++ php-src/ext/dio/dio.c       29 Oct 2003 15:57:07 -0000
@@ -27,6 +27,7 @@
 
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/ioctl.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <termios.h>
@@ -44,6 +45,8 @@
        PHP_FE(dio_write,     NULL)
        PHP_FE(dio_close,     NULL)
         PHP_FE(dio_tcsetattr,     NULL)
+       PHP_FE(dio_modemget,      NULL)
+       PHP_FE(dio_read_waiting, NULL)
        {NULL, NULL, NULL}
 };
 
@@ -54,7 +57,7 @@
        dio_functions,
        PHP_MINIT(dio),
        NULL,
-       NULL,   
+       NULL,
        NULL,
        PHP_MINFO(dio),
        "0.1",
@@ -422,8 +425,8 @@
        zval     *arg = NULL;
        php_fd_t *f;
        struct termios newtio;
-       int Baud_Rate, Data_Bits=8, Stop_Bits=1, Parity=0;
-       long BAUD,DATABITS,STOPBITS,PARITYON,PARITY;
+       int Baud_Rate, Data_Bits=8, Stop_Bits=1, Parity=0, Swflow=0, Hwflow=1;
+       long BAUD,DATABITS,STOPBITS,PARITYON,PARITY,SWFLOW,HWFLOW;
        HashTable      *fh;
        zval          **element;
         
@@ -464,6 +467,18 @@
                Parity = Z_LVAL_PP(element);
        } 
 
+       if (zend_hash_find(fh, "hwflow", sizeof("hwflow"), (void **) &element) == 
FAILURE) {
+               Hwflow = 0;
+       } else {
+               Hwflow = Z_LVAL_PP(element);
+       }
+
+       if (zend_hash_find(fh, "swflow", sizeof("swflow"), (void **) &element) == 
FAILURE) {
+               Swflow = 0;
+       } else {
+               Swflow = Z_LVAL_PP(element);
+       }
+
     /* assign to correct values... */
     switch (Baud_Rate)  {
                case 38400:            
@@ -561,9 +576,14 @@
                        zend_error(E_WARNING, "invalid parity %d", Parity);
                        RETURN_FALSE;
        }   
-        
-       newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | 
CLOCAL | CREAD;
-       newtio.c_iflag = IGNPAR;
+
+       HWFLOW = (Hwflow == 0) ? 0 : CRTSCTS;
+
+       SWFLOW = (Swflow == 0) ? 0 : (IXON | IXOFF | IXANY);
+       
+       
+       newtio.c_cflag = BAUD | HWFLOW | DATABITS | STOPBITS | PARITYON | PARITY | 
CLOCAL | CREAD;
+       newtio.c_iflag = IGNPAR | SWFLOW;
        newtio.c_oflag = 0;
        newtio.c_lflag = 0;       /* ICANON; */
        newtio.c_cc[VMIN]=1;
@@ -592,6 +612,60 @@
        zend_list_delete(Z_LVAL_P(r_fd));
 }
 /* }}} */
+
+
+/* {{{ proto array dio_modemget(resource fd)
+   Get modem bit status for the file descriptor fd */
+PHP_FUNCTION(dio_modemget)
+{
+       zval        *r_fd;
+       php_fd_t    *f;
+       int status;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &r_fd) == FAILURE) {
+               return;
+       }
+       ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
+
+       if (ioctl(f->fd, TIOCMGET, &status) == -1) {
+               php_error(E_WARNING, "%s(): cannot ioctl(TIOCMGET) %d: %s",
+                                 get_active_function_name(TSRMLS_C), f->fd, 
strerror(errno));
+               RETURN_FALSE;
+       }
+
+       array_init(return_value);
+       ADD_FIELD("dsr", (TIOCM_DSR & status) == TIOCM_DSR);
+       ADD_FIELD("cts", (TIOCM_CTS & status) == TIOCM_CTS);
+       ADD_FIELD("dcd", (TIOCM_CAR & status) == TIOCM_CAR);
+       ADD_FIELD("ri",  (TIOCM_RNG & status) == TIOCM_RNG);
+       ADD_FIELD("rts", (TIOCM_RTS & status) == TIOCM_RTS);
+       ADD_FIELD("dtr", (TIOCM_DTR & status) == TIOCM_DTR);
+}
+/* }}} */
+
+
+/* {{{ proto array dio_read_waiting(resource fd)
+ *    Get number of bytes waiting to be read from file descriptor fd */
+PHP_FUNCTION(dio_read_waiting)
+{
+       zval        *r_fd;
+       php_fd_t    *f;
+       int bytes;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &r_fd) == FAILURE) {
+               return;
+       }
+       ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
+       
+       if (ioctl(f->fd, TIOCINQ, &bytes) != 0) {
+               php_error(E_WARNING, "%s(): cannot ioctl(TIOCINQ) %d: %s",
+                                 get_active_function_name(TSRMLS_C), f->fd, 
strerror(errno));
+               RETURN_FALSE;
+       }
+
+       RETURN_LONG(bytes);
+}
+/* }}} */                                              
 
 /*
  * Local variables:
Index: php-src/ext/dio/php_dio.h
===================================================================
RCS file: /repository/php-src/ext/dio/php_dio.h,v
retrieving revision 1.4.4.1
diff -u -r1.4.4.1 php_dio.h
--- php-src/ext/dio/php_dio.h   31 Dec 2002 16:34:25 -0000      1.4.4.1
+++ php-src/ext/dio/php_dio.h   29 Oct 2003 15:57:07 -0000
@@ -45,6 +45,8 @@
 PHP_FUNCTION(dio_fcntl);
 PHP_FUNCTION(dio_close);
 PHP_FUNCTION(dio_tcsetattr);
+PHP_FUNCTION(dio_modemget);
+PHP_FUNCTION(dio_read_waiting);
 
 typedef struct {
        int fd;
Index: php-src/ext/dio/dio.c
===================================================================
RCS file: /repository/php-src/ext/dio/dio.c,v
retrieving revision 1.21.2.3
diff -u -r1.21.2.3 dio.c
--- php-src/ext/dio/dio.c       7 Mar 2003 13:42:11 -0000       1.21.2.3
+++ php-src/ext/dio/dio.c       29 Oct 2003 16:06:58 -0000
@@ -27,6 +27,7 @@
 
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/ioctl.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <termios.h>
@@ -54,7 +55,7 @@
        dio_functions,
        PHP_MINIT(dio),
        NULL,
-       NULL,   
+       NULL,
        NULL,
        PHP_MINFO(dio),
        "0.1",
@@ -422,8 +423,8 @@
        zval     *arg = NULL;
        php_fd_t *f;
        struct termios newtio;
-       int Baud_Rate, Data_Bits=8, Stop_Bits=1, Parity=0;
-       long BAUD,DATABITS,STOPBITS,PARITYON,PARITY;
+       int Baud_Rate, Data_Bits=8, Stop_Bits=1, Parity=0, Swflow=0, Hwflow=1;
+       long BAUD,DATABITS,STOPBITS,PARITYON,PARITY,SWFLOW,HWFLOW;
        HashTable      *fh;
        zval          **element;
         
@@ -464,6 +465,18 @@
                Parity = Z_LVAL_PP(element);
        } 
 
+       if (zend_hash_find(fh, "hwflow", sizeof("hwflow"), (void **) &element) == 
FAILURE) {
+               Hwflow = 0;
+       } else {
+               Hwflow = Z_LVAL_PP(element);
+       }
+
+       if (zend_hash_find(fh, "swflow", sizeof("swflow"), (void **) &element) == 
FAILURE) {
+               Swflow = 0;
+       } else {
+               Swflow = Z_LVAL_PP(element);
+       }
+
     /* assign to correct values... */
     switch (Baud_Rate)  {
                case 38400:            
@@ -561,9 +574,14 @@
                        zend_error(E_WARNING, "invalid parity %d", Parity);
                        RETURN_FALSE;
        }   
-        
-       newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | 
CLOCAL | CREAD;
-       newtio.c_iflag = IGNPAR;
+
+       HWFLOW = (Hwflow == 0) ? 0 : CRTSCTS;
+
+       SWFLOW = (Swflow == 0) ? 0 : (IXON | IXOFF | IXANY);
+       
+       
+       newtio.c_cflag = BAUD | HWFLOW | DATABITS | STOPBITS | PARITYON | PARITY | 
CLOCAL | CREAD;
+       newtio.c_iflag = IGNPAR | SWFLOW;
        newtio.c_oflag = 0;
        newtio.c_lflag = 0;       /* ICANON; */
        newtio.c_cc[VMIN]=1;
@@ -592,6 +610,8 @@
        zend_list_delete(Z_LVAL_P(r_fd));
 }
 /* }}} */
+
+
 
 /*
  * Local variables:

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to