From ec267c34822f18420bc6219b978ead7f531615c2 Mon Sep 17 00:00:00 2001 From: Brendan Le Foll Date: Mon, 21 Mar 2016 11:46:13 +0000 Subject: [PATCH] firmata: add timeout for firmata_pull failing Signed-off-by: Brendan Le Foll --- include/firmata/firmata.h | 1 + src/firmata/firmata.c | 7 +++++++ src/firmata/firmata_mraa.c | 13 ++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/firmata/firmata.h b/include/firmata/firmata.h index 062a8f4..72961cb 100644 --- a/include/firmata/firmata.h +++ b/include/firmata/firmata.h @@ -111,3 +111,4 @@ int firmata_analogRead(t_firmata* firmata, int pin); int firmata_pull(t_firmata* firmata); void firmata_parse(t_firmata* firmata, const uint8_t* buf, int len); void firmata_endParse(t_firmata* firmata); +void firmata_close(t_firmata* firmata); diff --git a/src/firmata/firmata.c b/src/firmata/firmata.c index 3dedae5..cdcc7a9 100644 --- a/src/firmata/firmata.c +++ b/src/firmata/firmata.c @@ -59,6 +59,13 @@ firmata_new(const char* name) return (res); } +void +firmata_close(t_firmata* firmata) +{ + mraa_uart_stop(firmata->uart); + free(firmata); +} + int firmata_pull(t_firmata* firmata) { diff --git a/src/firmata/firmata_mraa.c b/src/firmata/firmata_mraa.c index efe9fd3..a9b5c44 100644 --- a/src/firmata/firmata_mraa.c +++ b/src/firmata/firmata_mraa.c @@ -24,6 +24,7 @@ #include #include +#include #include "firmata.h" #include "mraa_internal.h" @@ -486,15 +487,25 @@ mraa_firmata_plat_init(const char* uart_dev) firmata_dev = firmata_new(uart_dev); if (firmata_dev == NULL) { + syslog(LOG_WARNING, "firmata: Failed to open uart to Firmata dev on %s", uart_dev); + fprintf(stderr, "Mraa expected to find a Firmata device on %s, is the port in use?\n", uart_dev); free(b); return NULL; } // if this isn't working then we have an issue with our uart - while (!firmata_dev->isReady) { + int retry = 20; + while (!firmata_dev->isReady && retry--) { firmata_pull(firmata_dev); } + if (!retry) { + syslog(LOG_ERR, "firmata: Failed to find a valid Firmata board on %s", uart_dev); + firmata_close(firmata_dev); + free(b); + return NULL; + } + pthread_create(&thread_id, NULL, mraa_firmata_pull_handler, NULL); b->platform_name = "firmata";