- Initialize maximum retry counter to 3 for serial and tcp connections

- Retransmit request frame (just for mbus_sendrecv_request) in case of
timeout or invalid response
This commit is contained in:
Stefan Wahren 2012-07-14 16:22:25 +02:00
parent 97f2ac34ba
commit 08a4c55443

View File

@ -1330,6 +1330,7 @@ mbus_context_serial(const char *device)
return NULL;
}
handle->max_retry = 3;
handle->is_serial = 1;
handle->auxdata = serial_data;
handle->open = mbus_serial_connect;
@ -1371,6 +1372,7 @@ mbus_context_tcp(const char *host, int port)
return NULL;
}
handle->max_retry = 3;
handle->is_serial = 0;
handle->auxdata = tcp_data;
handle->open = mbus_tcp_connect;
@ -1616,10 +1618,10 @@ mbus_send_request_frame(mbus_handle * handle, int address)
int
mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int max_frames)
{
int retval = 0, more_frames = 1;
int retval = 0, more_frames = 1, retry = 0;
mbus_frame_data reply_data;
mbus_frame *frame, *next_frame;
int frame_count = 0;
int frame_count = 0, result;
frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT);
@ -1635,16 +1637,6 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m
MBUS_CONTROL_MASK_FCB;
frame->address = address;
if (debug)
printf("%s: debug: sending request frame\n", __PRETTY_FUNCTION__);
if (mbus_send_frame(handle, frame) == -1)
{
MBUS_ERROR("%s: failed to send mbus frame.\n", __PRETTY_FUNCTION__);
mbus_frame_free(frame);
return -1;
}
//
// continue to read until no more records are available (usually only one
@ -1656,18 +1648,54 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m
while (more_frames)
{
frame_count++;
if (retry > handle->max_retry)
{
// Give up
retval = 1;
break;
}
if (debug)
printf("%s: debug: sending request frame\n", __PRETTY_FUNCTION__);
if (mbus_send_frame(handle, frame) == -1)
{
MBUS_ERROR("%s: failed to send mbus frame.\n", __PRETTY_FUNCTION__);
retval = -1;
break;
}
if (debug)
printf("%s: debug: receiving response frame #%d\n", __PRETTY_FUNCTION__, frame_count);
if (mbus_recv_frame(handle, next_frame) != MBUS_RECV_RESULT_OK)
result = mbus_recv_frame(handle, next_frame);
if (result == MBUS_RECV_RESULT_OK)
{
mbus_purge_frames(handle);
}
else if (result == MBUS_RECV_RESULT_TIMEOUT)
{
MBUS_ERROR("%s: No M-Bus response frame received.\n", __PRETTY_FUNCTION__);
retry++;
continue;
}
else if (result == MBUS_RECV_RESULT_INVALID)
{
MBUS_ERROR("%s: Received invalid M-Bus response frame.\n", __PRETTY_FUNCTION__);
retry++;
mbus_purge_frames(handle);
continue;
}
else
{
MBUS_ERROR("%s: Failed to receive M-Bus response frame.\n", __PRETTY_FUNCTION__);
retval = 1;
break;
}
frame_count++;
//
// We need to parse the data in the received frame to be able to tell
// if more records are available or not.
@ -1713,20 +1741,9 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m
}
next_frame = next_frame->next;
// need to send a new request and receive another reply
if (debug)
printf("%s: debug: resending request frame\n", __PRETTY_FUNCTION__);
// toogle FCB bit before
// toogle FCB bit
frame->control ^= MBUS_CONTROL_MASK_FCB;
if (mbus_send_frame(handle, frame) == -1)
{
MBUS_ERROR("%s: failed to send mbus frame.\n", __PRETTY_FUNCTION__);
retval = -1;
more_frames = 0;
}
}
else
{