Private
Public Access
2
0

firmata: add timeout for firmata_pull failing

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Brendan Le Foll
2016-03-21 11:46:13 +00:00
parent df2e131d26
commit ec267c3482
3 changed files with 20 additions and 1 deletions

View File

@@ -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);

View File

@@ -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)
{

View File

@@ -24,6 +24,7 @@
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#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";