firmata: add timeout for firmata_pull failing
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
@@ -111,3 +111,4 @@ int firmata_analogRead(t_firmata* firmata, int pin);
|
|||||||
int firmata_pull(t_firmata* firmata);
|
int firmata_pull(t_firmata* firmata);
|
||||||
void firmata_parse(t_firmata* firmata, const uint8_t* buf, int len);
|
void firmata_parse(t_firmata* firmata, const uint8_t* buf, int len);
|
||||||
void firmata_endParse(t_firmata* firmata);
|
void firmata_endParse(t_firmata* firmata);
|
||||||
|
void firmata_close(t_firmata* firmata);
|
||||||
|
|||||||
@@ -59,6 +59,13 @@ firmata_new(const char* name)
|
|||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
firmata_close(t_firmata* firmata)
|
||||||
|
{
|
||||||
|
mraa_uart_stop(firmata->uart);
|
||||||
|
free(firmata);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
firmata_pull(t_firmata* firmata)
|
firmata_pull(t_firmata* firmata)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
|
||||||
#include "firmata.h"
|
#include "firmata.h"
|
||||||
#include "mraa_internal.h"
|
#include "mraa_internal.h"
|
||||||
@@ -486,15 +487,25 @@ mraa_firmata_plat_init(const char* uart_dev)
|
|||||||
|
|
||||||
firmata_dev = firmata_new(uart_dev);
|
firmata_dev = firmata_new(uart_dev);
|
||||||
if (firmata_dev == NULL) {
|
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);
|
free(b);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if this isn't working then we have an issue with our uart
|
// 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);
|
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);
|
pthread_create(&thread_id, NULL, mraa_firmata_pull_handler, NULL);
|
||||||
|
|
||||||
b->platform_name = "firmata";
|
b->platform_name = "firmata";
|
||||||
|
|||||||
Reference in New Issue
Block a user