From 8f48d75fb057401fd45288a93e92760c152b323a Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Sun, 13 May 2012 23:57:24 +0200 Subject: [PATCH 1/3] Added 2 event callbacks to handle send and receive events outside the library (now it is possible to trigger a led from an application if m-bus data is received) --- mbus/mbus-protocol.c | 24 ++++++++++++++++++++++++ mbus/mbus-protocol.h | 17 +++++++++++++++++ mbus/mbus-serial.c | 22 ++++++++++++++++++++-- mbus/mbus-tcp.c | 22 ++++++++++++++++++++-- 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index 0e97e30..0fef9c0 100644 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -25,6 +25,30 @@ static char error_str[512]; //------------------------------------------------------------------------------ static mbus_slave_data slave_data[MBUS_MAX_PRIMARY_SLAVES]; +// +// init event callback +// +void (*_mbus_recv_event)(u_char src_type) = NULL; +void (*_mbus_send_event)(u_char src_type) = NULL; + +//------------------------------------------------------------------------------ +/// Register a function for receive events. +//------------------------------------------------------------------------------ +void +mbus_register_recv_event(void (*event)(u_char src_type)) +{ + _mbus_recv_event = event; +} + +//------------------------------------------------------------------------------ +/// Register a function for send events. +//------------------------------------------------------------------------------ +void +mbus_register_send_event(void (*event)(u_char src_type)) +{ + _mbus_send_event = event; +} + //------------------------------------------------------------------------------ /// Return a string that contains an the latest error message. //------------------------------------------------------------------------------ diff --git a/mbus/mbus-protocol.h b/mbus/mbus-protocol.h index cb5cbd1..2c9cc50 100644 --- a/mbus/mbus-protocol.h +++ b/mbus/mbus-protocol.h @@ -99,6 +99,12 @@ typedef struct _mbus_slave_data { #define NITEMS(x) (sizeof(x)/sizeof(x[0])) +// +// Supported handle types +// +#define MBUS_HANDLE_TYPE_TCP 0 +#define MBUS_HANDLE_TYPE_SERIAL 1 + //------------------------------------------------------------------------------ // MBUS FRAME DATA FORMATS // @@ -453,6 +459,17 @@ typedef struct _mbus_data_secondary_address { #define MBUS_VARIABLE_DATA_MEDIUM_PRESSURE 0x18 #define MBUS_VARIABLE_DATA_MEDIUM_ADC 0x19 +// +// Event callback functions +// +extern void (*_mbus_recv_event)(u_char src_type); +extern void (*_mbus_send_event)(u_char src_type); + +// +// Event register functions +// +void mbus_register_recv_event(void (*event)(u_char src_type)); +void mbus_register_send_event(void (*event)(u_char src_type)); // // variable length records diff --git a/mbus/mbus-serial.c b/mbus/mbus-serial.c index 8534bb5..22c5d8c 100644 --- a/mbus/mbus-serial.c +++ b/mbus/mbus-serial.c @@ -167,7 +167,15 @@ mbus_serial_send_frame(mbus_serial_handle *handle, mbus_frame *frame) return -1; } - if ((ret = write(handle->fd, buff, len)) != len) + if ((ret = write(handle->fd, buff, len)) == len) + { + // + // call the send event function, if the callback function is registered + // + if (_mbus_send_event) + _mbus_send_event(MBUS_HANDLE_TYPE_SERIAL); + } + else { fprintf(stderr, "%s: Failed to write frame to socket (ret = %d: %s)\n", __PRETTY_FUNCTION__, ret, strerror(errno)); return -1; @@ -196,7 +204,17 @@ mbus_serial_recv_frame(mbus_serial_handle *handle, mbus_frame *frame) do { //printf("%s: Attempt to read %d bytes [len = %d]\n", __PRETTY_FUNCTION__, remaining, len); - if ((nread = read(handle->fd, &buff[len], remaining)) == -1) + nread = read(handle->fd, &buff[len], remaining); + + if (nread > 0) + { + // + // call the receive event function, if the callback function is registered + // + if (_mbus_recv_event) + _mbus_recv_event(MBUS_HANDLE_TYPE_SERIAL); + } + else if (nread == -1) { // fprintf(stderr, "%s: aborting recv frame (remaining = %d, len = %d, nread = %d)\n", // __PRETTY_FUNCTION__, remaining, len, nread); diff --git a/mbus/mbus-tcp.c b/mbus/mbus-tcp.c index 33ad5f7..62d21e2 100644 --- a/mbus/mbus-tcp.c +++ b/mbus/mbus-tcp.c @@ -138,7 +138,15 @@ mbus_tcp_send_frame(mbus_tcp_handle *handle, mbus_frame *frame) return -1; } - if ((ret = write(handle->sock, buff, len)) != len) + if ((ret = write(handle->sock, buff, len)) == len) + { + // + // call the send event function, if the callback function is registered + // + if (_mbus_send_event) + _mbus_send_event(MBUS_HANDLE_TYPE_TCP); + } + else { char error_str[128]; snprintf(error_str, sizeof(error_str), "%s: Failed to write frame to socket (ret = %d)\n", __PRETTY_FUNCTION__, ret); @@ -167,8 +175,18 @@ mbus_tcp_recv_frame(mbus_tcp_handle *handle, mbus_frame *frame) len = 0; do { + + nread = read(handle->sock, &buff[len], remaining); - if ((nread = read(handle->sock, &buff[len], remaining)) == -1) + if (nread > 0) + { + // + // call the receive event function, if the callback function is registered + // + if (_mbus_recv_event) + _mbus_recv_event(MBUS_HANDLE_TYPE_TCP); + } + else if (nread == -1) { mbus_error_str_set("M-Bus tcp transport layer failed to read data."); return -1; From 4178ffceb11e025f9243d79a67f6afa55f3c15fd Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Mon, 14 May 2012 00:26:41 +0200 Subject: [PATCH 2/3] Added access to DRH in xml output function for data records --- mbus/mbus-protocol.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index a188356..e5296f3 100644 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -3045,7 +3045,7 @@ mbus_data_variable_header_xml(mbus_data_variable_header *header) /// Generate XML for a single variable-length data record //------------------------------------------------------------------------------ char * -mbus_data_variable_record_xml(mbus_data_record *record, int record_cnt, int frame_cnt) +mbus_data_variable_record_xml(mbus_data_record *record, int record_cnt, int frame_cnt, mbus_data_variable_header *header) { static char buff[8192]; char str_encoded[768]; @@ -3119,7 +3119,7 @@ mbus_data_variable_xml(mbus_data_variable *data) for (record = data->record, i = 0; record; record = record->next, i++) { len += snprintf(&buff[len], sizeof(buff) - len, "%s", - mbus_data_variable_record_xml(record, i, -1)); + mbus_data_variable_record_xml(record, i, -1, &(data->header))); } len += snprintf(&buff[len], sizeof(buff) - len, "\n"); @@ -3309,7 +3309,7 @@ mbus_frame_xml(mbus_frame *frame) for (record = frame_data.data_var.record; record; record = record->next, record_cnt++) { len += snprintf(&buff[len], sizeof(buff) - len, "%s", - mbus_data_variable_record_xml(record, record_cnt, frame_cnt)); + mbus_data_variable_record_xml(record, record_cnt, frame_cnt, &(frame_data.data_var.header))); } // free all records in the list @@ -3333,7 +3333,7 @@ mbus_frame_xml(mbus_frame *frame) for (record = frame_data.data_var.record; record; record = record->next, record_cnt++) { len += snprintf(&buff[len], sizeof(buff) - len, "%s", - mbus_data_variable_record_xml(record, record_cnt, frame_cnt)); + mbus_data_variable_record_xml(record, record_cnt, frame_cnt, &(frame_data.data_var.header))); } // free all records in the list From 61893a1b3d81bf72ffebba6c977ae274a3f43f65 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Mon, 14 May 2012 00:30:15 +0200 Subject: [PATCH 3/3] Fixed gcc warnings --- mbus/mbus-protocol.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index e5296f3..5abed3a 100644 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -316,11 +316,11 @@ mbus_frame_verify(mbus_frame *frame) return -1; } - if ((frame->control != MBUS_CONTROL_MASK_SND_NKE) && - (frame->control != MBUS_CONTROL_MASK_REQ_UD1) && - (frame->control != MBUS_CONTROL_MASK_REQ_UD1 | MBUS_CONTROL_MASK_FCB) && - (frame->control != MBUS_CONTROL_MASK_REQ_UD2) && - (frame->control != MBUS_CONTROL_MASK_REQ_UD2 | MBUS_CONTROL_MASK_FCB)) + if ((frame->control != MBUS_CONTROL_MASK_SND_NKE) && + (frame->control != MBUS_CONTROL_MASK_REQ_UD1) && + (frame->control != (MBUS_CONTROL_MASK_REQ_UD1 | MBUS_CONTROL_MASK_FCB)) && + (frame->control != MBUS_CONTROL_MASK_REQ_UD2) && + (frame->control != (MBUS_CONTROL_MASK_REQ_UD2 | MBUS_CONTROL_MASK_FCB))) { snprintf(error_str, sizeof(error_str), "Unknown Control Code 0x%.2x", frame->control); @@ -339,12 +339,12 @@ mbus_frame_verify(mbus_frame *frame) return -1; } - if ((frame->control != MBUS_CONTROL_MASK_SND_UD) && - (frame->control != MBUS_CONTROL_MASK_SND_UD | MBUS_CONTROL_MASK_FCB) && - (frame->control != MBUS_CONTROL_MASK_RSP_UD) && - (frame->control != MBUS_CONTROL_MASK_RSP_UD | MBUS_CONTROL_MASK_DFC) && - (frame->control != MBUS_CONTROL_MASK_RSP_UD | MBUS_CONTROL_MASK_ACD) && - (frame->control != MBUS_CONTROL_MASK_RSP_UD | MBUS_CONTROL_MASK_DFC | MBUS_CONTROL_MASK_ACD)) + if ((frame->control != MBUS_CONTROL_MASK_SND_UD) && + (frame->control != (MBUS_CONTROL_MASK_SND_UD | MBUS_CONTROL_MASK_FCB)) && + (frame->control != MBUS_CONTROL_MASK_RSP_UD) && + (frame->control != (MBUS_CONTROL_MASK_RSP_UD | MBUS_CONTROL_MASK_DFC)) && + (frame->control != (MBUS_CONTROL_MASK_RSP_UD | MBUS_CONTROL_MASK_ACD)) && + (frame->control != (MBUS_CONTROL_MASK_RSP_UD | MBUS_CONTROL_MASK_DFC | MBUS_CONTROL_MASK_ACD))) { snprintf(error_str, sizeof(error_str), "Unknown Control Code 0x%.2x", frame->control);