paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [4815] Add serial_port_open_raw and serial_port_flus


From: Allen Ibara
Subject: [paparazzi-commits] [4815] Add serial_port_open_raw and serial_port_flush_output functions to fms_serial_port
Date: Tue, 20 Apr 2010 00:47:42 +0000

Revision: 4815
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4815
Author:   aibara
Date:     2010-04-20 00:47:42 +0000 (Tue, 20 Apr 2010)
Log Message:
-----------
Add serial_port_open_raw and serial_port_flush_output functions to 
fms_serial_port

Modified Paths:
--------------
    paparazzi3/trunk/sw/airborne/fms/fms_serial_port.c
    paparazzi3/trunk/sw/airborne/fms/fms_serial_port.h

Modified: paparazzi3/trunk/sw/airborne/fms/fms_serial_port.c
===================================================================
--- paparazzi3/trunk/sw/airborne/fms/fms_serial_port.c  2010-04-20 00:47:11 UTC 
(rev 4814)
+++ paparazzi3/trunk/sw/airborne/fms/fms_serial_port.c  2010-04-20 00:47:42 UTC 
(rev 4815)
@@ -33,7 +33,51 @@
   }
 }
 
+void serial_port_flush_output(struct FmsSerialPort* me) {
+  /*
+   * flush any input that might be on the port so we start fresh.
+   */
+  if (tcflush(me->fd, TCOFLUSH)) {
+    TRACE(TRACE_ERROR,"%s, set term attr failed: %s (%d)\n", device, 
strerror(errno), errno);
+    fprintf(stderr, "flush (%d) failed: %s (%d)\n", me->fd, strerror(errno), 
errno);
+  }
+}
 
+int  serial_port_open_raw(struct FmsSerialPort* me, const char* device, 
speed_t speed) {
+  if ((me->fd = open(device, O_RDWR | O_NONBLOCK | O_NOCTTY)) < 0) {
+    TRACE(TRACE_ERROR,"%s, open failed: %s (%d)\n", device, strerror(errno), 
errno);
+    return -1;
+  }
+  if (tcgetattr(me->fd, &me->orig_termios) < 0) {
+    TRACE(TRACE_ERROR,"%s, get term settings failed: %s (%d)\n", device, 
strerror(errno), errno);
+    close(me->fd);
+    return -1;
+  }   
+  me->cur_termios = me->orig_termios;
+  /* input modes  */
+  me->cur_termios.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|INPCK|ISTRIP|INLCR|IGNCR
+                 |ICRNL |IUCLC|IXON|IXANY|IXOFF|IMAXBEL);
+  me->cur_termios.c_iflag |= IGNPAR;
+  /* control modes*/
+  me->cur_termios.c_cflag &= ~(CSIZE|PARENB|CRTSCTS|PARODD|HUPCL|CSTOPB);
+  me->cur_termios.c_cflag |= CREAD|CS8|CLOCAL;
+  /* local modes  */
+  me->cur_termios.c_lflag &= ~(ISIG|ICANON|IEXTEN|ECHO|FLUSHO|PENDIN);
+  me->cur_termios.c_lflag |= NOFLSH;
+  if (cfsetispeed(&me->cur_termios, speed)) {
+    TRACE(TRACE_ERROR,"%s, set term speed failed: %s (%d)\n", device, 
strerror(errno), errno);
+    close(me->fd);
+    return -1;
+  }
+  if (tcsetattr(me->fd, TCSADRAIN, &me->cur_termios)) {
+    TRACE(TRACE_ERROR,"%s, set term attr failed: %s (%d)\n", device, 
strerror(errno), errno);
+    close(me->fd);
+    return -1;
+  }
+  serial_port_flush(me);
+  return 0;
+}
+
 int  serial_port_open(struct FmsSerialPort* me, const char* device,
                      void(*term_conf_callback)(struct termios*, speed_t*)) {
   

Modified: paparazzi3/trunk/sw/airborne/fms/fms_serial_port.h
===================================================================
--- paparazzi3/trunk/sw/airborne/fms/fms_serial_port.h  2010-04-20 00:47:11 UTC 
(rev 4814)
+++ paparazzi3/trunk/sw/airborne/fms/fms_serial_port.h  2010-04-20 00:47:42 UTC 
(rev 4815)
@@ -12,6 +12,8 @@
 extern struct FmsSerialPort* serial_port_new(void);
 extern void serial_port_free(struct FmsSerialPort* me);
 extern void serial_port_flush(struct FmsSerialPort* me);
+extern void serial_port_flush_output(struct FmsSerialPort* me);
+int  serial_port_open_raw(struct FmsSerialPort* me, const char* device, 
speed_t speed);
 extern int  serial_port_open(struct FmsSerialPort* me, const char* device, 
                             void(*term_conf_callback)(struct termios*, 
speed_t*));
 extern void serial_port_close(struct FmsSerialPort* me);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]