Merge pull request #25 from lategoodbye/master

simple echo cancelation
This commit is contained in:
Robert Johansson
2012-10-13 04:11:10 -07:00
6 changed files with 78 additions and 5 deletions

3
.gitignore vendored
View File

@ -46,6 +46,7 @@ test/.deps
*.lo *.lo
.libs/ .libs/
bin/libmbus.1 bin/libmbus.1
bin/libmbus.1
bin/mbus-serial-request-data bin/mbus-serial-request-data
bin/mbus-serial-request-data-multi-reply bin/mbus-serial-request-data-multi-reply
bin/mbus-serial-scan bin/mbus-serial-scan
@ -57,3 +58,5 @@ bin/mbus-tcp-request-data-multi-reply
bin/mbus-tcp-scan bin/mbus-tcp-scan
bin/mbus-tcp-scan-secondary bin/mbus-tcp-scan-secondary
bin/mbus-tcp-select-secondary bin/mbus-tcp-select-secondary
!*.c

View File

@ -31,7 +31,7 @@ init_slaves(mbus_handle *handle)
if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1) if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1)
{ {
return 0; return 0;
} }
// //
// resend SND_NKE, maybe the first get lost // resend SND_NKE, maybe the first get lost

View File

@ -1353,6 +1353,7 @@ mbus_context_serial(const char *device)
handle->max_retry = 3; handle->max_retry = 3;
handle->is_serial = 1; handle->is_serial = 1;
handle->purge_first_frame = MBUS_FRAME_PURGE_M2S;
handle->auxdata = serial_data; handle->auxdata = serial_data;
handle->open = mbus_serial_connect; handle->open = mbus_serial_connect;
handle->close = mbus_serial_disconnect; handle->close = mbus_serial_disconnect;
@ -1395,6 +1396,7 @@ mbus_context_tcp(const char *host, int port)
handle->max_retry = 3; handle->max_retry = 3;
handle->is_serial = 0; handle->is_serial = 0;
handle->purge_first_frame = MBUS_FRAME_PURGE_M2S;
handle->auxdata = tcp_data; handle->auxdata = tcp_data;
handle->open = mbus_tcp_connect; handle->open = mbus_tcp_connect;
handle->close = mbus_tcp_disconnect; handle->close = mbus_tcp_disconnect;
@ -1467,6 +1469,18 @@ mbus_recv_frame(mbus_handle * handle, mbus_frame *frame)
} }
result = handle->recv(handle, frame); result = handle->recv(handle, frame);
switch (mbus_frame_direction(frame))
{
case MBUS_CONTROL_MASK_DIR_M2S:
if (handle->purge_first_frame == MBUS_FRAME_PURGE_M2S)
result = handle->recv(handle, frame); // purge echo and retry
break;
case MBUS_CONTROL_MASK_DIR_S2M:
if (handle->purge_first_frame == MBUS_FRAME_PURGE_S2M)
result = handle->recv(handle, frame); // purge echo and retry
break;
}
if (frame != NULL) if (frame != NULL)
{ {

View File

@ -70,12 +70,17 @@
#define MBUS_PROBE_COLLISION 2 #define MBUS_PROBE_COLLISION 2
#define MBUS_PROBE_ERROR -1 #define MBUS_PROBE_ERROR -1
#define MBUS_FRAME_PURGE_S2M 2
#define MBUS_FRAME_PURGE_M2S 1
#define MBUS_FRAME_PURGE_NONE 0
/** /**
* Unified MBus handle type encapsulating either Serial or TCP gateway. * Unified MBus handle type encapsulating either Serial or TCP gateway.
*/ */
struct _mbus_handle { struct _mbus_handle {
int fd; int fd;
int max_retry; int max_retry;
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);
int (*close) (struct _mbus_handle *handle); int (*close) (struct _mbus_handle *handle);

View File

@ -300,6 +300,26 @@ mbus_frame_type(mbus_frame *frame)
return -1; return -1;
} }
//------------------------------------------------------------------------------
/// Return the M-Bus frame direction
//------------------------------------------------------------------------------
int
mbus_frame_direction(mbus_frame *frame)
{
if (frame)
{
if (frame->type == MBUS_FRAME_TYPE_ACK)
{
return MBUS_CONTROL_MASK_DIR_S2M;
}
else
{
return (frame->control & MBUS_CONTROL_MASK_DIR);
}
}
return -1;
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/// Verify that parsed frame is a valid M-bus frame. /// Verify that parsed frame is a valid M-bus frame.
// //
@ -836,6 +856,15 @@ mbus_data_product_name(mbus_data_variable_header *header)
break; break;
} }
} }
else if (manufacturer == MBUS_VARIABLE_DATA_MAN_RKE)
{
switch (header->version)
{
case 0x69:
strcpy(buff,"Ista sensonic II mbus");
break;
}
}
else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SVM) else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SVM)
{ {
switch (header->version) switch (header->version)
@ -2713,7 +2742,23 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data)
int int
mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data) mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data)
{ {
if (frame && data) char direction;
if (frame == NULL)
{
snprintf(error_str, sizeof(error_str), "Got null pointer to frame.");
return -1;
}
if (data == NULL)
{
snprintf(error_str, sizeof(error_str), "Got null pointer to data.");
return -1;
}
direction = (frame->control & MBUS_CONTROL_MASK_DIR);
if (direction == MBUS_CONTROL_MASK_DIR_S2M)
{ {
if (frame->control_information == MBUS_CONTROL_INFO_ERROR_GENERAL) if (frame->control_information == MBUS_CONTROL_INFO_ERROR_GENERAL)
{ {
@ -2761,9 +2806,13 @@ mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data)
return -1; return -1;
} }
} }
else
snprintf(error_str, sizeof(error_str), "Got null pointer to frame or data."); {
snprintf(error_str, sizeof(error_str), "Wrong direction in frame (master to slave)");
return -1;
}
return -1; return -1;
} }

View File

@ -484,6 +484,7 @@ typedef struct _mbus_data_secondary_address {
#define MBUS_VARIABLE_DATA_MAN_NZR 0x3B52 #define MBUS_VARIABLE_DATA_MAN_NZR 0x3B52
#define MBUS_VARIABLE_DATA_MAN_PAD 0x4024 #define MBUS_VARIABLE_DATA_MAN_PAD 0x4024
#define MBUS_VARIABLE_DATA_MAN_QDS 0x4493 #define MBUS_VARIABLE_DATA_MAN_QDS 0x4493
#define MBUS_VARIABLE_DATA_MAN_RKE 0x4965
#define MBUS_VARIABLE_DATA_MAN_SEN 0x4CAE #define MBUS_VARIABLE_DATA_MAN_SEN 0x4CAE
#define MBUS_VARIABLE_DATA_MAN_SLB 0x4D82 #define MBUS_VARIABLE_DATA_MAN_SLB 0x4D82
#define MBUS_VARIABLE_DATA_MAN_SON 0x4DEE #define MBUS_VARIABLE_DATA_MAN_SON 0x4DEE
@ -555,6 +556,7 @@ const char *mbus_data_fixed_function(int status);
// M-Bus frame data struct access/write functions // M-Bus frame data struct access/write functions
// //
int mbus_frame_type(mbus_frame *frame); int mbus_frame_type(mbus_frame *frame);
int mbus_frame_direction(mbus_frame *frame);
// //
// Slave status data register. // Slave status data register.