diff --git a/bin/mbus-serial-request-data-multi-reply.c b/bin/mbus-serial-request-data-multi-reply.c index a9e396c..3821e4d 100755 --- a/bin/mbus-serial-request-data-multi-reply.c +++ b/bin/mbus-serial-request-data-multi-reply.c @@ -20,7 +20,7 @@ static int debug = 0; // // init slave to get really the beginning of the records // -int +static int init_slaves(mbus_handle *handle) { if (debug) @@ -49,7 +49,7 @@ init_slaves(mbus_handle *handle) //------------------------------------------------------------------------------ // Wrapper for argument parsing errors //------------------------------------------------------------------------------ -int +static void parse_abort(char **argv) { fprintf(stderr, "usage: %s [-d] [-b BAUDRATE] [-f FRAMES] device mbus-address\n", argv[0]); @@ -65,8 +65,7 @@ parse_abort(char **argv) int main(int argc, char **argv) { - mbus_frame *frame, reply; - mbus_frame_data reply_data; + mbus_frame reply; mbus_handle *handle = NULL; char *device, *addr_str, *xml_result; @@ -75,7 +74,6 @@ main(int argc, char **argv) int maxframes = MAXFRAMES; memset((void *)&reply, 0, sizeof(mbus_frame)); - memset((void *)&reply_data, 0, sizeof(mbus_frame_data)); int c; for (c=1; c argc-3) { - host = argv[2]; - port = atol(argv[3]); - addr_str = argv[4]; - debug = 1; - } - else - { - fprintf(stderr, "usage: %s [-d] host port mbus-address\n", argv[0]); - fprintf(stderr, " optional flag -d for debug printout\n"); - return 0; + parse_abort(argv); } + host = argv[c]; + port = atol(argv[c+1]); + addr_str = argv[c+2]; if ((port < 0) || (port > 0xFFFF)) { @@ -73,18 +119,15 @@ main(int argc, char **argv) if (mbus_connect(handle) == -1) { - fprintf(stderr, "Failed to setup connection to M-bus gateway\n"); + fprintf(stderr,"Failed to setup connection to M-bus gateway\n"); + mbus_context_free(handle); return 1; } - // - // init slave to get really the beginning of the records - // - if (debug) - printf("%s: debug: sending init frame\n", __PRETTY_FUNCTION__); - - if (mbus_send_ping_frame(handle, MBUS_ADDRESS_BROADCAST_NOREPLY, 1) == -1) + if (init_slaves(handle) == 0) { + mbus_disconnect(handle); + mbus_context_free(handle); return 1; } @@ -99,20 +142,26 @@ main(int argc, char **argv) if (ret == MBUS_PROBE_COLLISION) { fprintf(stderr, "%s: Error: The address mask [%s] matches more than one device.\n", __PRETTY_FUNCTION__, addr_str); + mbus_disconnect(handle); + mbus_context_free(handle); return 1; } else if (ret == MBUS_PROBE_NOTHING) { fprintf(stderr, "%s: Error: The selected secondary address does not match any device [%s].\n", __PRETTY_FUNCTION__, addr_str); + mbus_disconnect(handle); + mbus_context_free(handle); return 1; } else if (ret == MBUS_PROBE_ERROR) { fprintf(stderr, "%s: Error: Failed to select secondary address [%s].\n", __PRETTY_FUNCTION__, addr_str); + mbus_disconnect(handle); + mbus_context_free(handle); return 1; } // else MBUS_PROBE_SINGLE - + address = MBUS_ADDRESS_NETWORK_LAYER; } else @@ -123,9 +172,12 @@ main(int argc, char **argv) // instead of the send and recv, use this sendrecv function that // takes care of the possibility of multi-telegram replies (limit = 16 frames) - if (mbus_sendrecv_request(handle, address, &reply, 16) != 0) + if (mbus_sendrecv_request(handle, address, &reply, maxframes) != 0) { fprintf(stderr, "Failed to send/receive M-Bus request.\n"); + mbus_disconnect(handle); + mbus_context_free(handle); + mbus_frame_free(reply.next); return 1; } @@ -143,6 +195,9 @@ main(int argc, char **argv) if ((xml_result = mbus_frame_xml(&reply)) == NULL) { fprintf(stderr, "Failed to generate XML representation of MBUS frames: %s\n", mbus_error_str()); + mbus_disconnect(handle); + mbus_context_free(handle); + mbus_frame_free(reply.next); return 1; } @@ -151,6 +206,8 @@ main(int argc, char **argv) mbus_disconnect(handle); mbus_context_free(handle); + mbus_frame_free(reply.next); + return 0; }