mbus-serial-scan: Make timeout adjustable
This commit is contained in:
parent
af5a843e6a
commit
d4aa9520f9
@ -55,11 +55,11 @@ main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
mbus_handle *handle;
|
mbus_handle *handle;
|
||||||
char *device;
|
char *device;
|
||||||
int address, retries = 0;
|
int address, retries = 0, timeout = 0;
|
||||||
long baudrate = 9600;
|
long baudrate = 9600;
|
||||||
int opt, ret;
|
int opt, ret;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "db:r:")) != -1)
|
while ((opt = getopt(argc, argv, "db:r:t:")) != -1)
|
||||||
{
|
{
|
||||||
switch (opt)
|
switch (opt)
|
||||||
{
|
{
|
||||||
@ -72,8 +72,11 @@ main(int argc, char **argv)
|
|||||||
case 'r':
|
case 'r':
|
||||||
retries = atoi(optarg);
|
retries = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
timeout = atoi(optarg);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr,"usage: %s [-d] [-b BAUDRATE] [-r RETRIES] device\n",
|
fprintf(stderr,"usage: %s [-d] [-b BAUDRATE] [-r RETRIES] [-t TIMEOUT] device\n",
|
||||||
argv[0]);
|
argv[0]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -81,7 +84,7 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (optind >= argc) {
|
if (optind >= argc) {
|
||||||
fprintf(stderr,"usage: %s [-d] [-b BAUDRATE] [-r RETRIES] device\n",
|
fprintf(stderr,"usage: %s [-d] [-b BAUDRATE] [-r RETRIES] [-t TIMEOUT] device\n",
|
||||||
argv[0]);
|
argv[0]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -113,6 +116,12 @@ main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mbus_context_set_option(handle, MBUS_OPTION_TIMEOUT_OFFSET, timeout) == -1)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Failed to set timeout offset\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (mbus_serial_set_baudrate(handle, baudrate) == -1)
|
if (mbus_serial_set_baudrate(handle, baudrate) == -1)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"Failed to set baud rate.\n");
|
fprintf(stderr,"Failed to set baud rate.\n");
|
||||||
|
@ -1519,6 +1519,7 @@ mbus_context_serial(const char *device)
|
|||||||
|
|
||||||
handle->max_data_retry = 3;
|
handle->max_data_retry = 3;
|
||||||
handle->max_search_retry = 1;
|
handle->max_search_retry = 1;
|
||||||
|
handle->timeout_offset = 0;
|
||||||
handle->is_serial = 1;
|
handle->is_serial = 1;
|
||||||
handle->purge_first_frame = MBUS_FRAME_PURGE_M2S;
|
handle->purge_first_frame = MBUS_FRAME_PURGE_M2S;
|
||||||
handle->auxdata = serial_data;
|
handle->auxdata = serial_data;
|
||||||
@ -1567,6 +1568,7 @@ mbus_context_tcp(const char *host, uint16_t port)
|
|||||||
|
|
||||||
handle->max_data_retry = 3;
|
handle->max_data_retry = 3;
|
||||||
handle->max_search_retry = 1;
|
handle->max_search_retry = 1;
|
||||||
|
handle->timeout_offset = 0;
|
||||||
handle->is_serial = 0;
|
handle->is_serial = 0;
|
||||||
handle->purge_first_frame = MBUS_FRAME_PURGE_M2S;
|
handle->purge_first_frame = MBUS_FRAME_PURGE_M2S;
|
||||||
handle->auxdata = tcp_data;
|
handle->auxdata = tcp_data;
|
||||||
@ -1652,6 +1654,13 @@ mbus_context_set_option(mbus_handle * handle, mbus_context_option option, long v
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MBUS_OPTION_TIMEOUT_OFFSET:
|
||||||
|
if ((value >= 0) && (value <= 100))
|
||||||
|
{
|
||||||
|
handle->timeout_offset = value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case MBUS_OPTION_PURGE_FIRST_FRAME:
|
case MBUS_OPTION_PURGE_FIRST_FRAME:
|
||||||
if ((value == MBUS_FRAME_PURGE_NONE) ||
|
if ((value == MBUS_FRAME_PURGE_NONE) ||
|
||||||
(value == MBUS_FRAME_PURGE_M2S) ||
|
(value == MBUS_FRAME_PURGE_M2S) ||
|
||||||
|
@ -87,6 +87,7 @@ typedef struct _mbus_handle {
|
|||||||
int fd;
|
int fd;
|
||||||
int max_data_retry;
|
int max_data_retry;
|
||||||
int max_search_retry;
|
int max_search_retry;
|
||||||
|
unsigned int timeout_offset;
|
||||||
char purge_first_frame;
|
char purge_first_frame;
|
||||||
char is_serial; /**< _handle type (non zero for serial) */
|
char is_serial; /**< _handle type (non zero for serial) */
|
||||||
int (*open) (struct _mbus_handle *handle);
|
int (*open) (struct _mbus_handle *handle);
|
||||||
@ -154,7 +155,8 @@ typedef struct _mbus_record {
|
|||||||
typedef enum _mbus_context_option {
|
typedef enum _mbus_context_option {
|
||||||
MBUS_OPTION_MAX_DATA_RETRY, /**< option defines the maximum attempts of data request retransmission */
|
MBUS_OPTION_MAX_DATA_RETRY, /**< option defines the maximum attempts of data request retransmission */
|
||||||
MBUS_OPTION_MAX_SEARCH_RETRY, /**< option defines the maximum attempts of search request retransmission */
|
MBUS_OPTION_MAX_SEARCH_RETRY, /**< option defines the maximum attempts of search request retransmission */
|
||||||
MBUS_OPTION_PURGE_FIRST_FRAME /**< option controls the echo cancelation for mbus_recv_frame */
|
MBUS_OPTION_PURGE_FIRST_FRAME, /**< option controls the echo cancelation for mbus_recv_frame */
|
||||||
|
MBUS_OPTION_TIMEOUT_OFFSET, /**< option defines the additional timeout offset */
|
||||||
} mbus_context_option;
|
} mbus_context_option;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,7 +75,7 @@ mbus_serial_connect(mbus_handle *handle)
|
|||||||
// For 2400Bd this means (330 + 11) / 2400 + 0.05 = 188.75 ms (added 11 bit periods to receive first byte).
|
// For 2400Bd this means (330 + 11) / 2400 + 0.05 = 188.75 ms (added 11 bit periods to receive first byte).
|
||||||
// I.e. timeout of 0.2s seems appropriate for 2400Bd.
|
// I.e. timeout of 0.2s seems appropriate for 2400Bd.
|
||||||
|
|
||||||
term->c_cc[VTIME] = (cc_t) 2; // Timeout in 1/10 sec
|
term->c_cc[VTIME] = (cc_t) 2 + handle->timeout_offset; // Timeout in 1/10 sec
|
||||||
|
|
||||||
cfsetispeed(term, B2400);
|
cfsetispeed(term, B2400);
|
||||||
cfsetospeed(term, B2400);
|
cfsetospeed(term, B2400);
|
||||||
@ -155,6 +155,9 @@ mbus_serial_set_baudrate(mbus_handle *handle, long baudrate)
|
|||||||
return -1; // unsupported baudrate
|
return -1; // unsupported baudrate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add timeout offset for additional delay
|
||||||
|
serial_data->t.c_cc[VTIME] += handle->timeout_offset;
|
||||||
|
|
||||||
// Set input baud rate
|
// Set input baud rate
|
||||||
if (cfsetispeed(&(serial_data->t), speed) != 0)
|
if (cfsetispeed(&(serial_data->t), speed) != 0)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user