summaryrefslogtreecommitdiffstats
path: root/bcm4751_gpsd.c
diff options
context:
space:
mode:
authorPaul Kocialkowski <contact@paulk.fr>2012-11-18 11:48:26 +0100
committerPaul Kocialkowski <contact@paulk.fr>2012-11-18 11:48:26 +0100
commit916793f77a5e3ab37e3f62a850e0baea3b224900 (patch)
tree4f4e59d7dff7fe00adc4f94403ed36f6413d2f3b /bcm4751_gpsd.c
parenteaa760baae4895826b7e0729296092f746b91f44 (diff)
downloadbcm4751-916793f77a5e3ab37e3f62a850e0baea3b224900.tar.gz
bcm4751-916793f77a5e3ab37e3f62a850e0baea3b224900.tar.bz2
bcm4751-916793f77a5e3ab37e3f62a850e0baea3b224900.zip
bcm4751_serial_write: Use select before writeHEADmaster
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
Diffstat (limited to 'bcm4751_gpsd.c')
-rw-r--r--bcm4751_gpsd.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/bcm4751_gpsd.c b/bcm4751_gpsd.c
index 690433a..d14667c 100644
--- a/bcm4751_gpsd.c
+++ b/bcm4751_gpsd.c
@@ -203,9 +203,20 @@ int bcm4751_serial_read(int fd, void *data, int length, struct timeval *timeout)
return rc;
}
-int bcm4751_serial_write(int fd, void *data, int length)
+int bcm4751_serial_write(int fd, void *data, int length, struct timeval *timeout)
{
- return write(fd, data, length);
+ fd_set fds;
+ int rc = -1;
+
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+
+ rc = select(fd + 1, NULL, &fds, NULL, timeout);
+ if(rc > 0 && length > 0) {
+ rc = write(fd, data, length);
+ }
+
+ return rc;
}
int bcm4751_autobaud(int fd)
@@ -223,7 +234,7 @@ int bcm4751_autobaud(int fd)
timeout.tv_usec = 0;
while(!ready) {
- bcm4751_serial_write(fd, autobaud, sizeof(autobaud));
+ bcm4751_serial_write(fd, autobaud, sizeof(autobaud), NULL);
rc = bcm4751_serial_read(fd, NULL, 0, &timeout);
if(rc > 0)
@@ -262,9 +273,9 @@ void bcm4751_switch_protocol(int fd)
sleep(1);
printf("Sending unknown bytes!\n");
- bcm4751_serial_write(fd, data1, sizeof(data1));
- bcm4751_serial_write(fd, data2, sizeof(data2));
- bcm4751_serial_write(fd, data3, sizeof(data3));
+ bcm4751_serial_write(fd, data1, sizeof(data1), NULL);
+ bcm4751_serial_write(fd, data2, sizeof(data2), NULL);
+ bcm4751_serial_write(fd, data3, sizeof(data3), NULL);
bcm4751_read_dump(fd);
}