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)
This commit is contained in:
Stefan Wahren 2012-05-13 23:57:24 +02:00
parent d617accea5
commit 8f48d75fb0
4 changed files with 81 additions and 4 deletions

View File

@ -25,6 +25,30 @@ static char error_str[512];
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
static mbus_slave_data slave_data[MBUS_MAX_PRIMARY_SLAVES]; 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. /// Return a string that contains an the latest error message.
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View File

@ -99,6 +99,12 @@ typedef struct _mbus_slave_data {
#define NITEMS(x) (sizeof(x)/sizeof(x[0])) #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 // 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_PRESSURE 0x18
#define MBUS_VARIABLE_DATA_MEDIUM_ADC 0x19 #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 // variable length records

View File

@ -167,7 +167,15 @@ mbus_serial_send_frame(mbus_serial_handle *handle, mbus_frame *frame)
return -1; 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)); fprintf(stderr, "%s: Failed to write frame to socket (ret = %d: %s)\n", __PRETTY_FUNCTION__, ret, strerror(errno));
return -1; return -1;
@ -196,7 +204,17 @@ mbus_serial_recv_frame(mbus_serial_handle *handle, mbus_frame *frame)
do { do {
//printf("%s: Attempt to read %d bytes [len = %d]\n", __PRETTY_FUNCTION__, remaining, len); //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", // fprintf(stderr, "%s: aborting recv frame (remaining = %d, len = %d, nread = %d)\n",
// __PRETTY_FUNCTION__, remaining, len, nread); // __PRETTY_FUNCTION__, remaining, len, nread);

View File

@ -138,7 +138,15 @@ mbus_tcp_send_frame(mbus_tcp_handle *handle, mbus_frame *frame)
return -1; 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]; char error_str[128];
snprintf(error_str, sizeof(error_str), "%s: Failed to write frame to socket (ret = %d)\n", __PRETTY_FUNCTION__, ret); snprintf(error_str, sizeof(error_str), "%s: Failed to write frame to socket (ret = %d)\n", __PRETTY_FUNCTION__, ret);
@ -168,7 +176,17 @@ mbus_tcp_recv_frame(mbus_tcp_handle *handle, mbus_frame *frame)
do { do {
if ((nread = read(handle->sock, &buff[len], remaining)) == -1) nread = read(handle->sock, &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_TCP);
}
else if (nread == -1)
{ {
mbus_error_str_set("M-Bus tcp transport layer failed to read data."); mbus_error_str_set("M-Bus tcp transport layer failed to read data.");
return -1; return -1;