3
.gitignore
vendored
3
.gitignore
vendored
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
Reference in New Issue
Block a user