diff --git a/bin/mbus-serial-request-data-multi-reply.c b/bin/mbus-serial-request-data-multi-reply.c index 3821e4d..bb9e793 100755 --- a/bin/mbus-serial-request-data-multi-reply.c +++ b/bin/mbus-serial-request-data-multi-reply.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -22,14 +22,14 @@ static int debug = 0; // static int init_slaves(mbus_handle *handle) -{ +{ if (debug) printf("%s: debug: sending init frame #1\n", __PRETTY_FUNCTION__); - + if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1) { return 0; - } + } // // resend SND_NKE, maybe the first get lost @@ -37,7 +37,7 @@ init_slaves(mbus_handle *handle) if (debug) printf("%s: debug: sending init frame #2\n", __PRETTY_FUNCTION__); - + if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1) { return 0; @@ -77,21 +77,21 @@ main(int argc, char **argv) int c; for (c=1; cmax_retry; i++) @@ -28,21 +28,21 @@ int ping_address(mbus_handle *handle, mbus_frame *reply, int address) printf("%d ", address); fflush(stdout); } - + if (mbus_send_ping_frame(handle, address, 0) == -1) { fprintf(stderr,"Scan failed. Could not send ping frame: %s\n", mbus_error_str()); return MBUS_RECV_RESULT_ERROR; - } - + } + ret = mbus_recv_frame(handle, reply); - + if (ret != MBUS_RECV_RESULT_TIMEOUT) { return ret; } } - + return ret; } @@ -69,35 +69,35 @@ main(int argc, char **argv) } else if (argc == 4 && strcmp(argv[1], "-b") == 0) { - baudrate = atol(argv[2]); + baudrate = atol(argv[2]); device = argv[3]; } else if (argc == 4 && strcmp(argv[1], "-r") == 0) { - retries = atoi(argv[2]); + retries = atoi(argv[2]); device = argv[3]; } else if (argc == 5 && strcmp(argv[1], "-d") == 0 && strcmp(argv[2], "-b") == 0) { - debug = 1; - baudrate = atol(argv[3]); + debug = 1; + baudrate = atol(argv[3]); device = argv[4]; } else if (argc == 5 && strcmp(argv[1], "-d") == 0 && strcmp(argv[2], "-r") == 0) { - debug = 1; - retries = atoi(argv[3]); + debug = 1; + retries = atoi(argv[3]); device = argv[4]; } else if (argc == 6 && strcmp(argv[1], "-b") == 0 && strcmp(argv[3], "-r") == 0) - { + { baudrate = atol(argv[2]); retries = atoi(argv[4]); device = argv[5]; } else if (argc == 7 && strcmp(argv[1], "-d") == 0 && strcmp(argv[2], "-b") == 0 && strcmp(argv[4], "-r") == 0) { - debug = 1; + debug = 1; baudrate = atol(argv[3]); retries = atoi(argv[5]); device = argv[6]; @@ -107,13 +107,13 @@ main(int argc, char **argv) fprintf(stderr,"usage: %s [-d] [-b BAUDRATE] [-r RETRIES] device\n", argv[0]); return 0; } - + if (debug) { mbus_register_send_event(&mbus_dump_send_event); mbus_register_recv_event(&mbus_dump_recv_event); } - + if ((handle = mbus_context_serial(device)) == NULL) { fprintf(stderr,"Scan failed: Could not initialize M-Bus context: %s\n", mbus_error_str()); @@ -125,7 +125,7 @@ main(int argc, char **argv) fprintf(stderr,"Scan failed: Could not setup connection to M-bus gateway: %s\n", mbus_error_str()); return 1; } - + if (mbus_context_set_option(handle, MBUS_OPTION_MAX_RETRY, retries) == -1) { fprintf(stderr,"Failed to set retry count\n"); @@ -146,19 +146,19 @@ main(int argc, char **argv) mbus_frame reply; ret = ping_address(handle, &reply, address); - + if (ret == MBUS_RECV_RESULT_TIMEOUT) { continue; } - + if (ret == MBUS_RECV_RESULT_INVALID) { /* check for more data (collision) */ mbus_purge_frames(handle); printf("Collision at address %d\n", address); continue; - } + } if (mbus_frame_type(&reply) == MBUS_FRAME_TYPE_ACK) { diff --git a/bin/mbus-serial-select-secondary.c b/bin/mbus-serial-select-secondary.c index a4885e2..8595b12 100755 --- a/bin/mbus-serial-select-secondary.c +++ b/bin/mbus-serial-select-secondary.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -28,13 +28,13 @@ main(int argc, char **argv) if (argc == 3) { - device = argv[1]; + device = argv[1]; addr = strdup(argv[2]); - } + } else if (argc == 5 && strcmp(argv[1], "-b") == 0) { baudrate = atol(argv[2]); - device = argv[3]; + device = argv[3]; addr = strdup(argv[4]); } else @@ -43,13 +43,13 @@ main(int argc, char **argv) fprintf(stderr, " optional flag -b for selecting baudrate\n"); return 0; } - + if (addr == NULL) { fprintf(stderr, "Failed to allocate address.\n"); return 1; } - + if (mbus_is_secondary_address(addr) == 0) { fprintf(stderr,"Misformatted secondary address. Must be 16 character HEX number.\n"); @@ -77,7 +77,7 @@ main(int argc, char **argv) if (mbus_send_select_frame(handle, addr) == -1) { fprintf(stderr,"Failed to send selection frame: %s\n", mbus_error_str()); - return 1; + return 1; } ret = mbus_recv_frame(handle, &reply); @@ -86,7 +86,7 @@ main(int argc, char **argv) { fprintf(stderr,"No reply from device with secondary address %s: %s\n", argv[2], mbus_error_str()); return 1; - } + } if (ret == MBUS_RECV_RESULT_INVALID) { @@ -119,7 +119,7 @@ main(int argc, char **argv) fprintf(stderr,"Unknown reply:\n"); mbus_frame_print(&reply); } - + free(addr); mbus_disconnect(handle); mbus_context_free(handle); diff --git a/bin/mbus-serial-switch-baudrate.c b/bin/mbus-serial-switch-baudrate.c index b51dab5..7e1a75e 100755 --- a/bin/mbus-serial-switch-baudrate.c +++ b/bin/mbus-serial-switch-baudrate.c @@ -2,7 +2,7 @@ // Copyright (C) 2010-2012, Robert Johansson and contributors, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -59,7 +59,7 @@ main(int argc, char **argv) fprintf(stderr,"Failed to setup connection to M-bus gateway\n"); return 1; } - + if (mbus_serial_set_baudrate(handle, source_baudrate) == -1) { fprintf(stderr,"Failed to set baud rate.\n"); @@ -69,11 +69,11 @@ main(int argc, char **argv) if (mbus_send_switch_baudrate_frame(handle, address, target_baudrate) == -1) { fprintf(stderr,"Failed to send switch baudrate frame: %s\n", mbus_error_str()); - return 1; + return 1; } - ret = mbus_recv_frame(handle, &reply); - + ret = mbus_recv_frame(handle, &reply); + if (ret == MBUS_RECV_RESULT_TIMEOUT) { fprintf(stderr,"No reply from device\n"); @@ -88,7 +88,7 @@ main(int argc, char **argv) { printf("Switched baud rate of device to %lu\n", target_baudrate); } - + mbus_disconnect(handle); mbus_context_free(handle); return 0; diff --git a/bin/mbus-tcp-application-reset.c b/bin/mbus-tcp-application-reset.c index 7fd8c61..106efab 100755 --- a/bin/mbus-tcp-application-reset.c +++ b/bin/mbus-tcp-application-reset.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -27,24 +27,24 @@ main(int argc, char **argv) int ret; long port; int address, subcode = -1; - + if (argc == 4) { host = argv[1]; - port = atol(argv[2]); + port = atol(argv[2]); addr = argv[3]; } else if (argc == 5 && strcmp(argv[1], "-d") == 0) { debug = 1; host = argv[2]; - port = atol(argv[3]); + port = atol(argv[3]); addr = argv[4]; } else if (argc == 5) { host = argv[1]; - port = atol(argv[2]); + port = atol(argv[2]); addr = argv[3]; subcode = atoi(argv[4]); } @@ -52,7 +52,7 @@ main(int argc, char **argv) { debug = 1; host = argv[2]; - port = atol(argv[3]); + port = atol(argv[3]); addr = argv[4]; subcode = atoi(argv[5]); } @@ -61,13 +61,13 @@ main(int argc, char **argv) fprintf(stderr, "usage: %s [-d] host port mbus-address [subcode]\n", argv[0]); return 0; } - + if ((port < 0) || (port > 0xFFFF)) { fprintf(stderr, "Invalid port: %ld\n", port); return 1; } - + if (debug) { mbus_register_send_event(&mbus_dump_send_event); @@ -86,7 +86,7 @@ main(int argc, char **argv) mbus_context_free(handle); return 1; } - + if (mbus_is_secondary_address(addr)) { // secondary addressing @@ -114,17 +114,17 @@ main(int argc, char **argv) fprintf(stderr, "Failed to select secondary address [%s].\n", addr); mbus_disconnect(handle); mbus_context_free(handle); - return 1; + return 1; } // else MBUS_PROBE_SINGLE - + address = MBUS_ADDRESS_NETWORK_LAYER; - } + } else { // primary addressing - address = atoi(addr); + address = atoi(addr); } if (mbus_send_application_reset_frame(handle, address, subcode) == -1) @@ -132,11 +132,11 @@ main(int argc, char **argv) fprintf(stderr,"Failed to send reset frame: %s\n", mbus_error_str()); mbus_disconnect(handle); mbus_context_free(handle); - return 1; + return 1; } ret = mbus_recv_frame(handle, &reply); - + if (ret == MBUS_RECV_RESULT_TIMEOUT) { fprintf(stderr,"No reply from device\n"); @@ -160,7 +160,7 @@ main(int argc, char **argv) printf("Successful reset device\n"); } } - + mbus_disconnect(handle); mbus_context_free(handle); return 0; diff --git a/bin/mbus-tcp-raw-send.c b/bin/mbus-tcp-raw-send.c index 224a2d9..fc9ad65 100644 --- a/bin/mbus-tcp-raw-send.c +++ b/bin/mbus-tcp-raw-send.c @@ -2,7 +2,7 @@ // Copyright (C) 2012, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -31,35 +31,35 @@ main(int argc, char **argv) FILE *fp = NULL; size_t buff_len, len; unsigned char raw_buff[4096], buff[4096]; - + memset((void *)&reply, 0, sizeof(mbus_frame)); memset((void *)&reply_data, 0, sizeof(mbus_frame_data)); - + if (argc == 4) { - host = argv[1]; + host = argv[1]; port = atol(argv[2]); addr_str = argv[3]; debug = 0; } else if (argc == 5 && strcmp(argv[1], "-d") == 0) { - host = argv[2]; + host = argv[2]; port = atol(argv[3]); addr_str = argv[4]; debug = 1; } else if (argc == 5) { - host = argv[1]; + host = argv[1]; port = atol(argv[2]); addr_str = argv[3]; file = argv[4]; debug = 0; - } + } else if (argc == 6 && strcmp(argv[1], "-d") == 0) { - host = argv[2]; + host = argv[2]; port = atol(argv[3]); addr_str = argv[4]; file = argv[5]; @@ -72,19 +72,19 @@ main(int argc, char **argv) fprintf(stderr, " optional argument file for file. if omitted read from stdin\n"); return 0; } - + if ((port < 0) || (port > 0xFFFF)) { fprintf(stderr, "Invalid port: %ld\n", port); return 1; } - + if (debug) { mbus_register_send_event(&mbus_dump_send_event); mbus_register_recv_event(&mbus_dump_recv_event); } - + if ((handle = mbus_context_tcp(host, port)) == NULL) { fprintf(stderr, "Could not initialize M-Bus context: %s\n", mbus_error_str()); @@ -117,16 +117,16 @@ main(int argc, char **argv) else if (ret == MBUS_PROBE_ERROR) { fprintf(stderr, "%s: Error: Failed to select secondary address [%s].\n", __PRETTY_FUNCTION__, addr_str); - return 1; + return 1; } address = MBUS_ADDRESS_NETWORK_LAYER; - } + } else { // primary addressing address = atoi(addr_str); - } - + } + // // read hex data from file or stdin // @@ -150,14 +150,14 @@ main(int argc, char **argv) { fclose(fp); } - + buff_len = mbus_hex2bin(buff,sizeof(buff),raw_buff,sizeof(raw_buff)); - + // // attempt to parse the input data // result = mbus_parse(&request, buff, buff_len); - + if (result < 0) { fprintf(stderr, "mbus_parse: %s\n", mbus_error_str()); @@ -167,8 +167,8 @@ main(int argc, char **argv) { fprintf(stderr, "mbus_parse: need %d more bytes\n", result); return 1; - } - + } + // // send the request // @@ -176,8 +176,8 @@ main(int argc, char **argv) { fprintf(stderr, "Failed to send mbus frame: %s\n", mbus_error_str()); return 1; - } - + } + // // this should be option: // diff --git a/bin/mbus-tcp-request-data-multi-reply.c b/bin/mbus-tcp-request-data-multi-reply.c index c4a65fb..fa38a35 100755 --- a/bin/mbus-tcp-request-data-multi-reply.c +++ b/bin/mbus-tcp-request-data-multi-reply.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -22,14 +22,14 @@ static int debug = 0; // static int init_slaves(mbus_handle *handle) -{ +{ if (debug) printf("%s: debug: sending init frame #1\n", __PRETTY_FUNCTION__); - + if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1) { return 0; - } + } // // resend SND_NKE, maybe the first get lost @@ -37,7 +37,7 @@ init_slaves(mbus_handle *handle) if (debug) printf("%s: debug: sending init frame #2\n", __PRETTY_FUNCTION__); - + if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1) { return 0; @@ -74,10 +74,10 @@ main(int argc, char **argv) int c = 0; memset((void *)&reply, 0, sizeof(mbus_frame)); - + for (c=1; c 0xFFFF)) { fprintf(stderr, "Invalid port: %ld\n", port); return 1; } - + if (debug) { mbus_register_send_event(&mbus_dump_send_event); mbus_register_recv_event(&mbus_dump_recv_event); } - + if ((handle = mbus_context_tcp(host, port)) == NULL) { fprintf(stderr, "Could not initialize M-Bus context: %s\n", mbus_error_str()); @@ -123,7 +123,7 @@ main(int argc, char **argv) mbus_context_free(handle); return 1; } - + if (init_slaves(handle) == 0) { mbus_disconnect(handle); @@ -158,19 +158,19 @@ main(int argc, char **argv) fprintf(stderr, "%s: Error: Failed to select secondary address [%s].\n", __PRETTY_FUNCTION__, addr_str); mbus_disconnect(handle); mbus_context_free(handle); - return 1; + return 1; } // else MBUS_PROBE_SINGLE address = MBUS_ADDRESS_NETWORK_LAYER; - } + } else { // primary addressing address = atoi(addr_str); - } - - // instead of the send and recv, use this sendrecv function that + } + + // 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, maxframes) != 0) { @@ -200,14 +200,14 @@ main(int argc, char **argv) mbus_frame_free(reply.next); return 1; } - + printf("%s", xml_result); free(xml_result); mbus_disconnect(handle); mbus_context_free(handle); mbus_frame_free(reply.next); - + return 0; } diff --git a/bin/mbus-tcp-request-data.c b/bin/mbus-tcp-request-data.c index 71956b5..c0093f8 100755 --- a/bin/mbus-tcp-request-data.c +++ b/bin/mbus-tcp-request-data.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -28,20 +28,20 @@ main(int argc, char **argv) char *host, *addr_str, matching_addr[16], *xml_result; int address; long port; - + memset((void *)&reply, 0, sizeof(mbus_frame)); memset((void *)&reply_data, 0, sizeof(mbus_frame_data)); - + if (argc == 4) { - host = argv[1]; + host = argv[1]; port = atol(argv[2]); addr_str = argv[3]; debug = 0; } else if (argc == 5 && strcmp(argv[1], "-d") == 0) { - host = argv[2]; + host = argv[2]; port = atol(argv[3]); addr_str = argv[4]; debug = 1; @@ -52,19 +52,19 @@ main(int argc, char **argv) fprintf(stderr, " optional flag -d for debug printout\n"); return 0; } - + if ((port < 0) || (port > 0xFFFF)) { fprintf(stderr, "Invalid port: %ld\n", port); return 1; } - + if (debug) { mbus_register_send_event(&mbus_dump_send_event); mbus_register_recv_event(&mbus_dump_recv_event); } - + if ((handle = mbus_context_tcp(host, port)) == NULL) { fprintf(stderr, "Could not initialize M-Bus context: %s\n", mbus_error_str()); @@ -98,7 +98,7 @@ main(int argc, char **argv) else if (ret == MBUS_PROBE_ERROR) { fprintf(stderr, "%s: Error: Failed to select secondary address [%s].\n", __PRETTY_FUNCTION__, addr_str); - return 1; + return 1; } // else MBUS_PROBE_SINGLE @@ -107,7 +107,7 @@ main(int argc, char **argv) fprintf(stderr, "Failed to send M-Bus request frame.\n"); return 1; } - } + } else { // primary addressing @@ -118,7 +118,7 @@ main(int argc, char **argv) fprintf(stderr, "Failed to send M-Bus request frame.\n"); return 1; } - } + } if (mbus_recv_frame(handle, &reply) != MBUS_RECV_RESULT_OK) { @@ -139,13 +139,13 @@ main(int argc, char **argv) fprintf(stderr, "M-bus data parse error: %s\n", mbus_error_str()); return 1; } - + if ((xml_result = mbus_frame_data_xml(&reply_data)) == NULL) { fprintf(stderr, "Failed to generate XML representation of MBUS frame: %s\n", mbus_error_str()); return 1; } - + printf("%s", xml_result); free(xml_result); diff --git a/bin/mbus-tcp-scan-secondary.c b/bin/mbus-tcp-scan-secondary.c index 0696e5d..dd6131a 100755 --- a/bin/mbus-tcp-scan-secondary.c +++ b/bin/mbus-tcp-scan-secondary.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -25,7 +25,7 @@ main(int argc, char **argv) long port; mbus_handle *handle = NULL; mbus_frame *frame = NULL, reply; - + memset((void *)&reply, 0, sizeof(mbus_frame)); if (argc != 4 && argc != 3) @@ -35,8 +35,8 @@ main(int argc, char **argv) fprintf(stderr, "\t'FFFFFFFFFFFFFFFF' where F is a wildcard character\n"); return 0; } - - host = argv[1]; + + host = argv[1]; port = atol(argv[2]); if (argc == 4) { @@ -46,13 +46,13 @@ main(int argc, char **argv) { addr_mask = strdup("FFFFFFFFFFFFFFFF"); } - + if (addr_mask == NULL) { fprintf(stderr, "Failed to allocate address mask.\n"); return 1; } - + if ((port < 0) || (port > 0xFFFF)) { fprintf(stderr, "Invalid port: %ld\n", port); @@ -82,7 +82,7 @@ main(int argc, char **argv) // if (debug) printf("%s: debug: sending init frame #1\n", __PRETTY_FUNCTION__); - + if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1) { free(addr_mask); @@ -94,7 +94,7 @@ main(int argc, char **argv) // if (debug) printf("%s: debug: sending init frame #2\n", __PRETTY_FUNCTION__); - + if (mbus_send_ping_frame(handle, MBUS_ADDRESS_BROADCAST_NOREPLY, 1) == -1) { free(addr_mask); diff --git a/bin/mbus-tcp-scan.c b/bin/mbus-tcp-scan.c index d1316d5..a7ea01e 100755 --- a/bin/mbus-tcp-scan.c +++ b/bin/mbus-tcp-scan.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -18,7 +18,7 @@ static int debug = 0; int ping_address(mbus_handle *handle, mbus_frame *reply, int address) { int i, ret = MBUS_RECV_RESULT_ERROR; - + memset((void *)reply, 0, sizeof(mbus_frame)); for (i = 0; i <= handle->max_retry; i++) @@ -28,21 +28,21 @@ int ping_address(mbus_handle *handle, mbus_frame *reply, int address) printf("%d ", address); fflush(stdout); } - + if (mbus_send_ping_frame(handle, address, 0) == -1) { fprintf(stderr,"Scan failed. Could not send ping frame: %s\n", mbus_error_str()); return MBUS_RECV_RESULT_ERROR; - } - + } + ret = mbus_recv_frame(handle, reply); - + if (ret != MBUS_RECV_RESULT_TIMEOUT) { return ret; } } - + return ret; } @@ -60,26 +60,26 @@ main(int argc, char **argv) if (argc == 3) { - host = argv[1]; + host = argv[1]; port = atol(argv[2]); } else if (argc == 4 && strcmp(argv[1], "-d") == 0) { debug = 1; - host = argv[2]; + host = argv[2]; port = atol(argv[3]); } else if (argc == 5 && strcmp(argv[1], "-r") == 0) { - retries = atoi(argv[2]); - host = argv[3]; + retries = atoi(argv[2]); + host = argv[3]; port = atol(argv[4]); } else if (argc == 6 && strcmp(argv[1], "-d") == 0 && strcmp(argv[2], "-r") == 0) { debug = 1; - retries = atoi(argv[3]); - host = argv[4]; + retries = atoi(argv[3]); + host = argv[4]; port = atol(argv[5]); } else @@ -87,19 +87,19 @@ main(int argc, char **argv) fprintf(stderr,"usage: %s [-d] [-r RETRIES] host port\n", argv[0]); return 0; } - + if ((port < 0) || (port > 0xFFFF)) { fprintf(stderr, "Invalid port: %ld\n", port); return 1; } - + if (debug) { mbus_register_send_event(&mbus_dump_send_event); mbus_register_recv_event(&mbus_dump_recv_event); } - + if ((handle = mbus_context_tcp(host, port)) == NULL) { fprintf(stderr,"Scan failed: Could not initialize M-Bus context: %s\n", mbus_error_str()); @@ -111,7 +111,7 @@ main(int argc, char **argv) fprintf(stderr,"Scan failed: Could not setup connection to M-bus gateway: %s\n", mbus_error_str()); return 1; } - + if (mbus_context_set_option(handle, MBUS_OPTION_MAX_RETRY, retries) == -1) { fprintf(stderr,"Failed to set retry count\n"); @@ -126,19 +126,19 @@ main(int argc, char **argv) mbus_frame reply; ret = ping_address(handle, &reply, address); - + if (ret == MBUS_RECV_RESULT_TIMEOUT) { continue; } - + if (ret == MBUS_RECV_RESULT_INVALID) { /* check for more data (collision) */ mbus_purge_frames(handle); printf("Collision at address %d\n", address); continue; - } + } if (mbus_frame_type(&reply) == MBUS_FRAME_TYPE_ACK) { diff --git a/bin/mbus-tcp-select-secondary.c b/bin/mbus-tcp-select-secondary.c index 8204374..9901fb3 100755 --- a/bin/mbus-tcp-select-secondary.c +++ b/bin/mbus-tcp-select-secondary.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -31,16 +31,16 @@ main(int argc, char **argv) fprintf(stderr,"usage: %s host port secondary-mbus-address\n", argv[0]); return 0; } - - host = argv[1]; + + host = argv[1]; port = atol(argv[2]); - + if ((port < 0) || (port > 0xFFFF)) { fprintf(stderr, "Invalid port: %ld\n", port); return 1; } - + if ((addr = strdup(argv[3])) == NULL) { fprintf(stderr, "Failed to allocate address.\n"); @@ -68,7 +68,7 @@ main(int argc, char **argv) if (mbus_send_select_frame(handle, addr) == -1) { fprintf(stderr,"Failed to send selection frame: %s\n", mbus_error_str()); - return 1; + return 1; } ret = mbus_recv_frame(handle, &reply); @@ -77,7 +77,7 @@ main(int argc, char **argv) { fprintf(stderr,"No reply from device with secondary address %s: %s\n", argv[3], mbus_error_str()); return 1; - } + } if (ret == MBUS_RECV_RESULT_INVALID) { @@ -110,7 +110,7 @@ main(int argc, char **argv) fprintf(stderr,"Unknown reply:\n"); mbus_frame_print(&reply); } - + free(addr); mbus_disconnect(handle); mbus_context_free(handle); diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index ca3246a..6f96d87 100755 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -2,7 +2,7 @@ // Copyright (C) 2010-2011, Robert Johansson and contributors, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -20,7 +20,7 @@ #include #include -/*@ignore@*/ +/*@ignore@*/ #define MBUS_ERROR(...) fprintf (stderr, __VA_ARGS__) #ifdef _DEBUG_ @@ -240,7 +240,7 @@ mbus_variable_vif vif_table[] = { /* E000 1001 Medium (as in fixed header) */ { 0x109, 1.0e0, "", "Device type" }, - + /* E000 1010 Manufacturer (as in fixed header) */ { 0x10A, 1.0e0, "", "Manufacturer" }, @@ -274,7 +274,7 @@ mbus_variable_vif vif_table[] = { /* E001 0100 Access Code System Operator */ { 0x114, 1.0e0, "", "Access Code System Operator" }, - + /* E001 0101 Access Code Developer */ { 0x115, 1.0e0, "", "Access Code Developer" }, @@ -371,7 +371,7 @@ mbus_variable_vif vif_table[] = { { 0x13D, 1.0e0, "Reserved", "Reserved" }, { 0x13E, 1.0e0, "Reserved", "Reserved" }, { 0x13F, 1.0e0, "Reserved", "Reserved" }, - + /* E100 nnnn Volts electrical units */ { 0x140, 1.0e-9, "V", "Voltage" }, { 0x141, 1.0e-8, "V", "Voltage" }, @@ -623,7 +623,7 @@ mbus_variable_vif vif_table[] = { { 0x25D, 1.0e2, "W", "Cumul count max power" }, { 0x25E, 1.0e3, "W", "Cumul count max power" }, { 0x25F, 1.0e4, "W", "Cumul count max power" }, - + /* End of array */ { 0xFFFF, 0.0, "", "" }, }; @@ -733,7 +733,7 @@ int mbus_fixed_normalize(int medium_unit, long medium_value, char **unit_out, do double exponent = 0.0; int i; medium_unit = medium_unit & 0x3F; - + if (unit_out == NULL || value_out == NULL || quantity_out == NULL) { MBUS_ERROR("%s: Invalid parameter.\n", __PRETTY_FUNCTION__); @@ -742,14 +742,14 @@ int mbus_fixed_normalize(int medium_unit, long medium_value, char **unit_out, do switch (medium_unit) { - case 0x00: + case 0x00: *unit_out = strdup("h,m,s"); /* todo convert to unix time... */ *quantity_out = strdup("Time"); - break; - case 0x01: + break; + case 0x01: *unit_out = strdup("D,M,Y"); /* todo convert to unix time... */ *quantity_out = strdup("Time"); - break; + break; default: for(i=0; fixed_table[i].vif < 0xfff; ++i) @@ -769,7 +769,7 @@ int mbus_fixed_normalize(int medium_unit, long medium_value, char **unit_out, do *value_out = 0.0; return -1; } - + return -2; } @@ -786,9 +786,9 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real, if (record) { MBUS_DEBUG("coding = 0x%02X \n", record->drh.dib.dif); - + // ignore extension bit - vif = (record->drh.vib.vif & MBUS_DIB_VIF_WITHOUT_EXTENSION); + vif = (record->drh.vib.vif & MBUS_DIB_VIF_WITHOUT_EXTENSION); vife = (record->drh.vib.vife[0] & MBUS_DIB_VIF_WITHOUT_EXTENSION); switch (record->drh.dib.dif & 0x0F) @@ -801,16 +801,16 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real, } *value_out_str_size = 0; result = 0; - break; + break; case 0x01: /* 1 byte integer (8 bit) */ *value_out_real = mbus_data_int_decode(record->data, 1); result = 0; - break; + break; case 0x02: /* 2 byte integer (16 bit) */ // E110 1100 Time Point (date) - if (vif == 0x6C) + if (vif == 0x6C) { mbus_data_tm_decode(&time, record->data, 2); if ((*value_out_str = (char*) malloc(11)) == NULL) @@ -818,31 +818,31 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real, MBUS_ERROR("Unable to allocate memory"); return -1; } - *value_out_str_size = snprintf(*value_out_str, 11, "%04d-%02d-%02d", - (time.tm_year + 2000), - (time.tm_mon + 1), + *value_out_str_size = snprintf(*value_out_str, 11, "%04d-%02d-%02d", + (time.tm_year + 2000), + (time.tm_mon + 1), time.tm_mday); } else // normal integer { *value_out_real = mbus_data_int_decode(record->data, 2); } - + result = 0; - break; + break; case 0x03: /* 3 byte integer (24 bit) */ *value_out_real = mbus_data_int_decode(record->data, 3); result = 0; - break; - + break; + case 0x04: /* 4 byte integer (32 bit) */ // E110 1101 Time Point (date/time) // E011 0000 Start (date/time) of tariff // E111 0000 Date and time of battery change - if ( (vif == 0x6D) || - ((record->drh.vib.vif == 0xFD) && (vife == 0x30)) || - ((record->drh.vib.vif == 0xFD) && (vife == 0x70))) + if ( (vif == 0x6D) || + ((record->drh.vib.vif == 0xFD) && (vife == 0x30)) || + ((record->drh.vib.vif == 0xFD) && (vife == 0x70))) { mbus_data_tm_decode(&time, record->data, 4); if ((*value_out_str = (char*) malloc(20)) == NULL) @@ -850,9 +850,9 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real, MBUS_ERROR("Unable to allocate memory"); return -1; } - *value_out_str_size = snprintf(*value_out_str, 20, "%04d-%02d-%02dT%02d:%02d:%02d", - (time.tm_year + 2000), - (time.tm_mon + 1), + *value_out_str_size = snprintf(*value_out_str, 20, "%04d-%02d-%02dT%02d:%02d:%02d", + (time.tm_year + 2000), + (time.tm_mon + 1), time.tm_mday, time.tm_hour, time.tm_min, @@ -863,7 +863,7 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real, *value_out_real = mbus_data_int_decode(record->data, 4); } result = 0; - break; + break; case 0x05: /* 32b real */ *value_out_real = mbus_data_float_decode(record->data); @@ -873,33 +873,33 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real, case 0x06: /* 6 byte integer (48 bit) */ *value_out_real = mbus_data_long_long_decode(record->data, 6); result = 0; - break; + break; case 0x07: /* 8 byte integer (64 bit) */ *value_out_real = mbus_data_long_long_decode(record->data, 8); result = 0; - break; + break; case 0x09: /* 2 digit BCD (8 bit) */ - *value_out_real = mbus_data_bcd_decode(record->data, 1); + *value_out_real = mbus_data_bcd_decode(record->data, 1); result = 0; break; - + case 0x0A: /* 4 digit BCD (16 bit) */ - *value_out_real = mbus_data_bcd_decode(record->data, 2); + *value_out_real = mbus_data_bcd_decode(record->data, 2); result = 0; break; case 0x0B: /* 6 digit BCD (24 bit) */ - *value_out_real = mbus_data_bcd_decode(record->data, 3); + *value_out_real = mbus_data_bcd_decode(record->data, 3); result = 0; break; - + case 0x0C: /* 8 digit BCD (32 bit) */ - *value_out_real = mbus_data_bcd_decode(record->data, 4); + *value_out_real = mbus_data_bcd_decode(record->data, 4); result = 0; break; - + case 0x0D: /* variable length */ { if (record->data_len <= 0xBF) { @@ -945,7 +945,7 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real, MBUS_ERROR("record is null"); result = -3; } - + return result; } @@ -955,15 +955,15 @@ mbus_vif_unit_normalize(int vif, double value, char **unit_out, double *value_ou int i; double exponent = 1.0; unsigned newVif = vif & 0xF7F; /* clear extension bit */ - + MBUS_DEBUG("vif_unit_normalize = 0x%03X \n", vif); - + if (unit_out == NULL || value_out == NULL || quantity_out == NULL) { MBUS_ERROR("%s: Invalid parameter.\n", __PRETTY_FUNCTION__); return -1; } - + for(i=0; vif_table[i].vif < 0xfff; ++i) { if (vif_table[i].vif == newVif) @@ -986,7 +986,7 @@ mbus_vif_unit_normalize(int vif, double value, char **unit_out, double *value_ou int mbus_vib_unit_normalize(mbus_value_information_block *vib, double value, char **unit_out, double *value_out, char **quantity_out) -{ +{ int code; if (vib == NULL || unit_out == NULL || value_out == NULL || quantity_out == NULL) @@ -994,9 +994,9 @@ mbus_vib_unit_normalize(mbus_value_information_block *vib, double value, char ** MBUS_ERROR("%s: Invalid parameter.\n", __PRETTY_FUNCTION__); return -1; } - + MBUS_DEBUG("%s: vib_unit_normalize - VIF=0x%02X\n", __PRETTY_FUNCTION__, vib->vif); - + if (vib->vif == 0xFD) /* first type of VIF extention: see table 8.4.4 a */ { if (vib->nvife == 0) @@ -1019,14 +1019,14 @@ mbus_vib_unit_normalize(mbus_value_information_block *vib, double value, char ** MBUS_ERROR("%s: Missing VIF extension\n", __PRETTY_FUNCTION__); return -1; } - + code = ((vib->vife[0]) & MBUS_DIB_VIF_WITHOUT_EXTENSION) | 0x200; if (0 != mbus_vif_unit_normalize(code, value, unit_out, value_out, quantity_out)) { MBUS_ERROR("%s: Error mbus_vif_unit_normalize\n", __PRETTY_FUNCTION__); return -1; } - } + } else if ((vib->vif == 0x7C) || (vib->vif == 0xFC)) { @@ -1045,8 +1045,8 @@ mbus_vib_unit_normalize(mbus_value_information_block *vib, double value, char ** } } } - - if ((vib->vif & MBUS_DIB_VIF_EXTENSION_BIT) && + + if ((vib->vif & MBUS_DIB_VIF_EXTENSION_BIT) && (vib->vif != 0xFD) && (vib->vif != 0xFB)) /* codes for VIF extention: see table 8.4.5 */ { @@ -1063,14 +1063,14 @@ mbus_vib_unit_normalize(mbus_value_information_block *vib, double value, char ** case 0x77: /* Multiplicative correction factor: 10^nnn-6 */ *value_out *= pow(10.0, (vib->vife[0] & 0x07) - 6); break; - + case 0x78: case 0x79: case 0x7A: case 0x7B: /* Additive correction constant: 10^nn-3 unit of VIF (offset) */ *value_out += pow(10.0, (vib->vife[0] & 0x03) - 3); break; - + case 0x7D: /* Multiplicative correction factor: 10^3 */ *value_out *= 1000.0; break; @@ -1111,19 +1111,19 @@ mbus_record_free(mbus_record * rec) free((rec->value).str_val.value); (rec->value).str_val.value = NULL; } - + if (rec->unit) { free(rec->unit); rec->unit = NULL; } - + if (rec->function_medium) { free(rec->function_medium); rec->function_medium = NULL; } - + if (rec->quantity) { free(rec->quantity); @@ -1148,7 +1148,7 @@ mbus_parse_fixed_record(char status_byte, char medium_unit, unsigned char *data) /* shared/static memory - get own copy */ record->function_medium = strdup(mbus_data_fixed_function((int)status_byte)); /* stored / actual */ - + if (record->function_medium == NULL) { MBUS_ERROR("%s: memory allocation error\n", __PRETTY_FUNCTION__); @@ -1186,7 +1186,7 @@ mbus_parse_variable_record(mbus_data_record *data) char * value_out_str = NULL; int value_out_str_size = 0; double real_val = 0.0; /**< normalized value */ - + if (data == NULL) { MBUS_ERROR("%s: Invalid record.\n", __PRETTY_FUNCTION__); @@ -1198,8 +1198,8 @@ mbus_parse_variable_record(mbus_data_record *data) MBUS_ERROR("%s: memory allocation error\n", __PRETTY_FUNCTION__); return NULL; } - - if ((data->drh.dib.dif == MBUS_DIB_DIF_MANUFACTURER_SPECIFIC) || + + if ((data->drh.dib.dif == MBUS_DIB_DIF_MANUFACTURER_SPECIFIC) || (data->drh.dib.dif == MBUS_DIB_DIF_MORE_RECORDS_FOLLOW)) /* MBUS_DIB_DIF_VENDOR_SPECIFIC */ { if (data->drh.dib.dif == MBUS_DIB_DIF_MORE_RECORDS_FOLLOW) @@ -1210,24 +1210,24 @@ mbus_parse_variable_record(mbus_data_record *data) { record->function_medium = strdup("Manufacturer specific"); } - + if (record->function_medium == NULL) { MBUS_ERROR("%s: memory allocation error\n", __PRETTY_FUNCTION__); mbus_record_free(record); return NULL; } - + /* parsing of data not implemented yet manufacturer specific data structures to end of user data */ - + if (mbus_variable_value_decode(data, &value_out_real, &value_out_str, &value_out_str_size) != 0) { MBUS_ERROR("%s: problem with mbus_variable_value_decode\n", __PRETTY_FUNCTION__); mbus_record_free(record); return NULL; } - + if (value_out_str != NULL) { record->is_numeric = 0; @@ -1243,15 +1243,15 @@ mbus_parse_variable_record(mbus_data_record *data) else { record->function_medium = strdup(mbus_data_record_function(data)); - + if (record->function_medium == NULL) { MBUS_ERROR("%s: memory allocation error\n", __PRETTY_FUNCTION__); mbus_record_free(record); return NULL; } - - MBUS_DEBUG("record->function_medium = %s \n", record->function_medium); + + MBUS_DEBUG("record->function_medium = %s \n", record->function_medium); if (mbus_variable_value_decode(data, &value_out_real, &value_out_str, &value_out_str_size) != 0) { @@ -1283,12 +1283,12 @@ mbus_parse_variable_record(mbus_data_record *data) (record->value).real_val = real_val; } } - + return record; } //------------------------------------------------------------------------------ -/// Generate XML for variable-length data +/// Generate XML for variable-length data //------------------------------------------------------------------------------ char * mbus_data_variable_xml_normalized(mbus_data_variable *data) @@ -1299,52 +1299,52 @@ mbus_data_variable_xml_normalized(mbus_data_variable *data) char str_encoded[768]; size_t len = 0, buff_size = 8192; size_t i; - + if (data) { buff = (char*) malloc(buff_size); - + if (buff == NULL) return NULL; - + len += snprintf(&buff[len], buff_size - len, "\n\n"); - + len += snprintf(&buff[len], buff_size - len, "%s", mbus_data_variable_header_xml(&(data->header))); - + for (record = data->record, i = 0; record; record = record->next, i++) { norm_record = mbus_parse_variable_record(record); - + if ((buff_size - len) < 1024) { buff_size *= 2; new_buff = (char*) realloc(buff,buff_size); - + if (new_buff == NULL) { mbus_record_free(norm_record); free(buff); return NULL; } - + buff = new_buff; } - + len += snprintf(&buff[len], buff_size - len, " \n", i); - + if (norm_record != NULL) - { + { mbus_str_xml_encode(str_encoded, norm_record->function_medium, sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); - + mbus_str_xml_encode(str_encoded, norm_record->unit, sizeof(str_encoded)); - + len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); - + mbus_str_xml_encode(str_encoded, norm_record->quantity, sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); - - + + if (norm_record->is_numeric) { len += snprintf(&buff[len], buff_size - len, " %f\n", norm_record->value.real_val); @@ -1354,21 +1354,21 @@ mbus_data_variable_xml_normalized(mbus_data_variable *data) mbus_str_xml_encode(str_encoded, norm_record->value.str_val.value, sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); } - + mbus_record_free(norm_record); } else { } - + len += snprintf(&buff[len], buff_size - len, " \n\n"); } - + len += snprintf(&buff[len], buff_size - len, "\n"); return buff; } - + return NULL; } @@ -1384,13 +1384,13 @@ mbus_frame_data_xml_normalized(mbus_frame_data *data) { return mbus_data_fixed_xml(&(data->data_fix)); } - + if (data->type == MBUS_DATA_TYPE_VARIABLE) { return mbus_data_variable_xml_normalized(&(data->data_var)); } } - + return NULL; } @@ -1523,7 +1523,7 @@ mbus_context_set_option(mbus_handle * handle, mbus_context_option option, long v MBUS_ERROR("%s: Invalid M-Bus handle to set option.\n", __PRETTY_FUNCTION__); return -1; } - + switch (option) { case MBUS_OPTION_MAX_RETRY: @@ -1543,7 +1543,7 @@ mbus_context_set_option(mbus_handle * handle, mbus_context_option option, long v } break; } - + return -1; // unable to set option } @@ -1565,16 +1565,16 @@ mbus_recv_frame(mbus_handle * handle, mbus_frame *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 + 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 + result = handle->recv(handle, frame); // purge echo and retry break; } @@ -1583,7 +1583,7 @@ mbus_recv_frame(mbus_handle * handle, mbus_frame *frame) /* set timestamp to receive time */ time(&(frame->timestamp)); } - + return result; } @@ -1591,14 +1591,14 @@ int mbus_purge_frames(mbus_handle *handle) { int err, received; mbus_frame reply; - + memset((void *)&reply, 0, sizeof(mbus_frame)); received = 0; while (1) { err = mbus_recv_frame(handle, &reply); - if (err != MBUS_RECV_RESULT_OK && + if (err != MBUS_RECV_RESULT_OK && err != MBUS_RECV_RESULT_INVALID) break; @@ -1629,7 +1629,7 @@ int mbus_send_select_frame(mbus_handle * handle, const char *secondary_addr_str) { mbus_frame *frame; - + frame = mbus_frame_new(MBUS_FRAME_TYPE_LONG); if (mbus_frame_select_secondary_pack(frame, (char*) secondary_addr_str) == -1) @@ -1637,15 +1637,15 @@ mbus_send_select_frame(mbus_handle * handle, const char *secondary_addr_str) MBUS_ERROR("%s: Failed to pack selection mbus frame.\n", __PRETTY_FUNCTION__); mbus_frame_free(frame); return -1; - } + } if (mbus_send_frame(handle, frame) == -1) { MBUS_ERROR("%s: Failed to send mbus frame.\n", __PRETTY_FUNCTION__); mbus_frame_free(frame); return -1; - } - + } + mbus_frame_free(frame); return 0; } @@ -1660,13 +1660,13 @@ mbus_send_switch_baudrate_frame(mbus_handle * handle, int address, long baudrate int retval = 0; int control_information = 0; mbus_frame *frame; - + if (mbus_is_primary_address(address) == 0) { MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); return -1; } - + switch (baudrate) { case 300: @@ -1697,16 +1697,16 @@ mbus_send_switch_baudrate_frame(mbus_handle * handle, int address, long baudrate MBUS_ERROR("%s: invalid baudrate %lu\n", __PRETTY_FUNCTION__, baudrate); return -1; } - + frame = mbus_frame_new(MBUS_FRAME_TYPE_CONTROL); - + if (frame == NULL) { MBUS_ERROR("%s: failed to allocate mbus frame.\n", __PRETTY_FUNCTION__); return -1; } - - frame->control = MBUS_CONTROL_MASK_SND_UD | MBUS_CONTROL_MASK_DIR_M2S; + + frame->control = MBUS_CONTROL_MASK_SND_UD | MBUS_CONTROL_MASK_DIR_M2S; frame->address = address; frame->control_information = control_information; @@ -1729,31 +1729,31 @@ mbus_send_application_reset_frame(mbus_handle * handle, int address, int subcode { int retval = 0; mbus_frame *frame; - + if (mbus_is_primary_address(address) == 0) { MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); return -1; } - + if (subcode > 0xFF) { MBUS_ERROR("%s: invalid subcode %d\n", __PRETTY_FUNCTION__, subcode); return -1; } - + frame = mbus_frame_new(MBUS_FRAME_TYPE_LONG); - + if (frame == NULL) { MBUS_ERROR("%s: failed to allocate mbus frame.\n", __PRETTY_FUNCTION__); return -1; } - + frame->control = MBUS_CONTROL_MASK_SND_UD | MBUS_CONTROL_MASK_DIR_M2S; frame->address = address; frame->control_information = MBUS_CONTROL_INFO_APPLICATION_RESET; - + if (subcode >= 0) { frame->data_size = 1; @@ -1783,7 +1783,7 @@ mbus_send_request_frame(mbus_handle * handle, int address) { int retval = 0; mbus_frame *frame; - + if (mbus_is_primary_address(address) == 0) { MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); @@ -1791,14 +1791,14 @@ mbus_send_request_frame(mbus_handle * handle, int address) } frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT); - + if (frame == NULL) { MBUS_ERROR("%s: failed to allocate mbus frame.\n", __PRETTY_FUNCTION__); return -1; } - - frame->control = MBUS_CONTROL_MASK_REQ_UD2 | MBUS_CONTROL_MASK_DIR_M2S; + + frame->control = MBUS_CONTROL_MASK_REQ_UD2 | MBUS_CONTROL_MASK_DIR_M2S; frame->address = address; if (mbus_send_frame(handle, frame) == -1) @@ -1822,13 +1822,13 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m mbus_frame_data reply_data; mbus_frame *frame, *next_frame; int frame_count = 0, result; - + if (handle == NULL) { MBUS_ERROR("%s: Invalid M-Bus handle for request.\n", __PRETTY_FUNCTION__); return 1; } - + if (mbus_is_primary_address(address) == 0) { MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); @@ -1836,28 +1836,28 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m } frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT); - + if (frame == NULL) { MBUS_ERROR("%s: failed to allocate mbus frame.\n", __PRETTY_FUNCTION__); return -1; } - - frame->control = MBUS_CONTROL_MASK_REQ_UD2 | - MBUS_CONTROL_MASK_DIR_M2S | - MBUS_CONTROL_MASK_FCV | + + frame->control = MBUS_CONTROL_MASK_REQ_UD2 | + MBUS_CONTROL_MASK_DIR_M2S | + MBUS_CONTROL_MASK_FCV | MBUS_CONTROL_MASK_FCB; - - frame->address = address; - + + frame->address = address; + // // continue to read until no more records are available (usually only one // reply frame, but can be more for so-called multi-telegram replies) // next_frame = reply; - + memset((void *)&reply_data, 0, sizeof(mbus_frame_data)); - + while (more_frames) { if (retry > handle->max_retry) @@ -1866,20 +1866,20 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m retval = 1; break; } - + if (debug) printf("%s: debug: sending request frame\n", __PRETTY_FUNCTION__); - + if (mbus_send_frame(handle, frame) == -1) { MBUS_ERROR("%s: failed to send mbus frame.\n", __PRETTY_FUNCTION__); retval = -1; break; } - + if (debug) printf("%s: debug: receiving response frame #%d\n", __PRETTY_FUNCTION__, frame_count); - + result = mbus_recv_frame(handle, next_frame); if (result == MBUS_RECV_RESULT_OK) @@ -1906,26 +1906,26 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m retval = 1; break; } - + frame_count++; - + // // We need to parse the data in the received frame to be able to tell // if more records are available or not. - // + // if (mbus_frame_data_parse(next_frame, &reply_data) == -1) { MBUS_ERROR("%s: M-bus data parse error.\n", __PRETTY_FUNCTION__); retval = 1; break; } - + // // Continue a cycle of sending requests and reading replies until the - // reply do not have DIF=0x1F in the last record (which signals that + // reply do not have DIF=0x1F in the last record (which signals that // more records are available. // - + if (reply_data.type != MBUS_DATA_TYPE_VARIABLE) { // only single frame replies for FIXED type frames @@ -1934,27 +1934,27 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m else { more_frames = 0; - - if (reply_data.data_var.more_records_follow && + + if (reply_data.data_var.more_records_follow && ((max_frames > 0) && (frame_count < max_frames))) // only readout max_frames { if (debug) printf("%s: debug: expecting more frames\n", __PRETTY_FUNCTION__); - + more_frames = 1; - + // allocate new frame and increment next_frame pointer next_frame->next = mbus_frame_new(MBUS_FRAME_TYPE_ANY); - + if (next_frame->next == NULL) { MBUS_ERROR("%s: failed to allocate mbus frame.\n", __PRETTY_FUNCTION__); retval = -1; more_frames = 0; } - + next_frame = next_frame->next; - + // toogle FCB bit frame->control ^= MBUS_CONTROL_MASK_FCB; } @@ -1964,12 +1964,12 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m printf("%s: debug: no more frames\n", __PRETTY_FUNCTION__); } } - + if (reply_data.data_var.record) { // free's up the whole list - mbus_data_record_free(reply_data.data_var.record); - } + mbus_data_record_free(reply_data.data_var.record); + } } mbus_frame_free(frame); @@ -1985,36 +1985,36 @@ mbus_send_ping_frame(mbus_handle *handle, int address, char purge_response) { int retval = 0; mbus_frame *frame; - + if (mbus_is_primary_address(address) == 0) { MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); return 1; } - + frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT); - + if (frame == NULL) { MBUS_ERROR("%s: failed to allocate mbus frame.\n", __PRETTY_FUNCTION__); return -1; } - + frame->control = MBUS_CONTROL_MASK_SND_NKE | MBUS_CONTROL_MASK_DIR_M2S; - frame->address = address; - + frame->address = address; + if (mbus_send_frame(handle, frame) == -1) { MBUS_ERROR("%s: failed to send mbus frame.\n", __PRETTY_FUNCTION__); mbus_frame_free(frame); return -1; } - + if (purge_response) { mbus_purge_frames(handle); } - + mbus_frame_free(frame); return retval; } @@ -2042,14 +2042,14 @@ mbus_select_secondary_address(mbus_handle * handle, const char *mask) mbus_error_str()); return MBUS_PROBE_ERROR; } - + memset((void *)&reply, 0, sizeof(mbus_frame)); ret = mbus_recv_frame(handle, &reply); if (ret == MBUS_RECV_RESULT_TIMEOUT) { return MBUS_PROBE_NOTHING; - } + } if (ret == MBUS_RECV_RESULT_INVALID) { @@ -2065,20 +2065,20 @@ mbus_select_secondary_address(mbus_handle * handle, const char *mask) { return MBUS_PROBE_COLLISION; } - + return MBUS_PROBE_SINGLE; } - + MBUS_ERROR("%s: Unexpected reply for address [%s].\n", __PRETTY_FUNCTION__, mask); return MBUS_PROBE_NOTHING; } //------------------------------------------------------------------------------ -// Probe for the presence of a device(s) using the supplied secondary address +// Probe for the presence of a device(s) using the supplied secondary address // (mask). //------------------------------------------------------------------------------ -int +int mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matching_addr) { int ret; @@ -2089,9 +2089,9 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi MBUS_ERROR("%s: Invalid address masks.\n", __PRETTY_FUNCTION__); return MBUS_PROBE_ERROR; } - + ret = mbus_select_secondary_address(handle, mask); - + if (ret == MBUS_PROBE_SINGLE) { /* send a data request command to find out the full address */ @@ -2103,7 +2103,7 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi mbus_error_str()); return MBUS_PROBE_ERROR; } - + memset((void *)&reply, 0, sizeof(mbus_frame)); ret = mbus_recv_frame(handle, &reply); @@ -2118,7 +2118,7 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi mbus_purge_frames(handle); return MBUS_PROBE_COLLISION; } - + /* check for more data (collision) */ if (mbus_purge_frames(handle)) { @@ -2135,7 +2135,7 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi MBUS_ERROR("Failed to generate secondary address from M-Bus reply frame: %s\n", mbus_error_str()); return MBUS_PROBE_NOTHING; } - + snprintf(matching_addr, 17, "%s", addr); if (_mbus_found_event) @@ -2152,7 +2152,7 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi return MBUS_PROBE_NOTHING; } } - + return ret; } @@ -2208,7 +2208,7 @@ int mbus_read_slave(mbus_handle * handle, mbus_address *address, mbus_frame * re MBUS_ERROR("%s: Failed to probe secondary address [%s].\n", __PRETTY_FUNCTION__, address->secondary); - return -1; + return -1; } /* else MBUS_PROBE_SINGLE */ @@ -2218,14 +2218,14 @@ int mbus_read_slave(mbus_handle * handle, mbus_address *address, mbus_frame * re __PRETTY_FUNCTION__); return -1; } - } + } if (mbus_recv_frame(handle, reply) != 0) { MBUS_ERROR("%s: Failed to receive M-Bus response frame.\n", __PRETTY_FUNCTION__); return -1; - } + } return 0; } @@ -2238,7 +2238,7 @@ mbus_scan_2nd_address_range(mbus_handle * handle, int pos, char *addr_mask) { int i, i_start, i_end, probe_ret; char *mask, matching_mask[17]; - + if (handle == NULL || addr_mask == NULL) { MBUS_ERROR("%s: Invalid handle or address mask.\n", __PRETTY_FUNCTION__); @@ -2261,7 +2261,7 @@ mbus_scan_2nd_address_range(mbus_handle * handle, int pos, char *addr_mask) MBUS_ERROR("%s: Failed to allocate local copy of the address mask.\n", __PRETTY_FUNCTION__); return -1; } - + if (mask[pos] == 'f' || mask[pos] == 'F') { i_start = 0; @@ -2286,7 +2286,7 @@ mbus_scan_2nd_address_range(mbus_handle * handle, int pos, char *addr_mask) if (_mbus_scan_progress) _mbus_scan_progress(handle,mask); - + probe_ret = mbus_probe_secondary_address(handle, mask, matching_mask); if (probe_ret == MBUS_PROBE_SINGLE) @@ -2308,7 +2308,7 @@ mbus_scan_2nd_address_range(mbus_handle * handle, int pos, char *addr_mask) else // MBUS_PROBE_ERROR { MBUS_ERROR("%s: Failed to probe secondary address [%s].\n", __PRETTY_FUNCTION__, mask); - return -1; + return -1; } } @@ -2327,38 +2327,38 @@ mbus_hex2bin(unsigned char * dst, size_t dst_len, const unsigned char * src, siz size_t i, result = 0; unsigned long val; unsigned char *ptr, *end, buf[3]; - + if (!src || !dst) { return 0; } - + memset(buf, 0, sizeof(buf)); memset(dst, 0, dst_len); - + for (i = 0; i+1 < src_len; i++) { // ignore whitespace if (isspace(src[i])) continue; - + buf[0] = src[i]; buf[1] = src[++i]; - + end = buf; ptr = end; val = strtoul(ptr, (char **)&end, 16); - - // abort at non hex value + + // abort at non hex value if (ptr == end) break; - + // abort at end of buffer if (result >= dst_len) break; - + dst[result++] = (unsigned char) val; } - + return result; } diff --git a/mbus/mbus-protocol-aux.h b/mbus/mbus-protocol-aux.h index 2596c1d..c2a255a 100755 --- a/mbus/mbus-protocol-aux.h +++ b/mbus/mbus-protocol-aux.h @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson and contributors, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -13,9 +13,9 @@ /** * @file mbus-protocol-aux.h - * + * * @brief Auxiliary functions to the Freescada libmbus library - * + * * The idea is to simplify the basic task of querying MBus slaves and * the data processing. * Typical use might be (in oversimplified "pseudocode"): @@ -160,26 +160,26 @@ extern void (*_mbus_found_event)(mbus_handle * handle, mbus_frame *frame); void mbus_register_scan_progress(void (*event)(mbus_handle * handle, const char *mask)); void mbus_register_found_event(void (*event)(mbus_handle * handle, mbus_frame *frame)); -/** +/** * Allocate and initialize M-Bus serial context. - * + * * @param device Serial device (like /dev/ttyUSB0 or /dev/ttyS0) - * + * * @return Initialized "unified" handler when successful, NULL otherwise; */ mbus_handle * mbus_context_serial(const char *device); -/** +/** * Allocate and initialize M-Bus TCP context. - * + * * @param host Gateway host * @param port Gateway port - * + * * @return Initialized "unified" handler when successful, NULL otherwise; */ mbus_handle * mbus_context_tcp(const char *host, uint16_t port); -/** +/** * Deallocate memory used by M-Bus context. * * @param handle Initialized handle @@ -198,9 +198,9 @@ int mbus_connect(mbus_handle * handle); /** * Disconnects the "unified" handle. - * + * * @param handle Initialized handle - * + * * @return Zero when successful. */ int mbus_disconnect(mbus_handle * handle); @@ -216,17 +216,17 @@ int mbus_disconnect(mbus_handle * handle); */ int mbus_context_set_option(mbus_handle * handle, mbus_context_option option, long value); -/** +/** * Receives a frame using "unified" handle - * + * * @param handle Initialized handle * @param frame Received frame - * + * * @return Zero when successful. */ int mbus_recv_frame(mbus_handle * handle, mbus_frame *frame); -/** +/** * Used for handling collisions. Blocks as long as receiving frames or corrupted data. * * @param handle Initialized handle @@ -237,232 +237,232 @@ int mbus_purge_frames(mbus_handle * handle); /** * Sends frame using "unified" handle - * + * * @param handle Initialized handle * @param frame Frame to send - * + * * @return Zero when successful. */ int mbus_send_frame(mbus_handle * handle, mbus_frame *frame); -/** +/** * Sends secondary address selection frame using "unified" handle - * + * * @param handle Initialized handle * @param secondary_addr_str Secondary address - * + * * @return Zero when successful. */ int mbus_send_select_frame(mbus_handle * handle, const char *secondary_addr_str); -/** +/** * Sends application reset to given slave using "unified" handle - * + * * @param handle Initialized handle * @param address Address (0-255) * @param subcode Subcode (0-255) or no subcode (-1) - * + * * @return Zero when successful. */ int mbus_send_application_reset_frame(mbus_handle * handle, int address, int subcode); -/** +/** * Sends switch baudrate frame using "unified" handle - * + * * @param handle Initialized handle * @param address Address (0-255) * @param baudrate Baudrate (300,600,1200,2400,4800,9600,19200,38400) - * + * * @return Zero when successful. */ int mbus_send_switch_baudrate_frame(mbus_handle * handle, int address, long baudrate); -/** +/** * Sends request frame (REQ_UD2) to given slave using "unified" handle - * + * * @param handle Initialized handle * @param address Address (0-255) - * + * * @return Zero when successful. */ int mbus_send_request_frame(mbus_handle * handle, int address); -/** +/** * Sends a request and read replies until no more records available * or limit is reached. - * + * * @param handle Initialized handle * @param address Address (0-255) * @param reply pointer to an mbus frame for the reply * @param max_frames limit of frames to readout (0 = no limit) - * + * * @return Zero when successful. */ int mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int max_frames); -/** +/** * Sends ping frame to given slave using "unified" handle - * + * * @param handle Initialized handle * @param address Address (0-255) * @param purge_response Response flag (=0 don't receive response, >0 purge response) - * + * * @return Zero when successful. */ int mbus_send_ping_frame(mbus_handle *handle, int address, char purge_response); -/** +/** * Select slave by secondary address using "unified" handle - * + * * @param handle Initialized handle * @param mask Address/mask to select - * + * * @return See MBUS_PROBE_* constants */ int mbus_select_secondary_address(mbus_handle * handle, const char *mask); -/** +/** * Probe/address slave by secondary address using "unified" handle - * + * * @param handle Initialized handle * @param mask Address/mask to probe * @param matching_addr Matched address (the buffer has tobe at least 16 bytes) - * + * * @return See MBUS_PROBE_* constants */ int mbus_probe_secondary_address(mbus_handle * handle, const char *mask, char *matching_addr); -/** +/** * Read data from given slave using "unified" handle and address types - * + * * @param handle Initialized handle * @param address Address of the slave * @param reply Reply from the slave - * + * * @return Zero when successful. */ int mbus_read_slave(mbus_handle *handle, mbus_address *address, mbus_frame *reply); -/** +/** * Allocate new data record. Use #mbus_record_free when finished. - * + * * @return pointer to the new record, NULL when failed */ mbus_record * mbus_record_new(); -/** +/** * Destructor for mbus_record - * + * * @param rec record to be freed */ void mbus_record_free(mbus_record *rec); -/** +/** * Create/parse single counter from the fixed data structure - * + * * @param statusByte status byte * @param medium_unit_byte medium/unit byte * @param data pointer to the data counter (4 bytes) - * + * * @return Newly allocated record if succesful, NULL otherwise. Later on need to use #mbus_record_free */ mbus_record *mbus_parse_fixed_record(char statusByte, char medium_unit_byte, unsigned char *data); -/** +/** * Create/parse single counter from the variable data structure record - * + * * @param record record data to be parsed - * + * * @return Newly allocated record if succesful, NULL otherwise. Later on need to use #mbus_record_free */ mbus_record * mbus_parse_variable_record(mbus_data_record *record); -/** +/** * Get normalized counter value for a fixed counter * * Get "normalized" value and unit of the counter - * + * * @param medium_unit_byte medium/unit byte of the fixed counter * @param medium_value raw counter value * @param unit_out units of the counter - use free when done * @param value_out resulting counter value * @param quantity_out parsed quantity, when done use "free" - * + * * @return zero when OK */ int mbus_data_fixed_normalize(int medium_unit_byte, long medium_value, char **unit_out, double *value_out, char **quantity_out); -/** +/** * Decode value of a variable data structure - * + * * @param record record to be decoded * @param value_out_real numerical counter value output (when numerical) * @param value_out_str string counter value output (when string, NULL otherwise), when finished use "free *value_out_str" * @param value_out_str_size string counter value size - * + * * @return zero when OK */ int mbus_data_variable_value_decode(mbus_record *record, double *value_out_real, char **value_out_str, int *value_out_str_size); -/** +/** * Decode units and normalize value using VIF/VIFE (used internally by mbus_vib_unit_normalize) - * + * * @param vif VIF (including standard extensions) * @param value already parsed "raw" numerical value * @param unit_out parsed unit, when done use "free" * @param value_out normalized value * @param quantity_out parsed quantity, when done use "free" - * + * * @return zero when OK */ int mbus_vif_unit_normalize(int vif, double value, char **unit_out, double *value_out, char **quantity_out); -/** +/** * Decode units and normalize value from VIB - * + * * @param vib mbus value information block of the variable record * @param value already parsed "raw" numerical value * @param unit_out parsed unit, when done use "free" * @param value_out normalized value * @param quantity_out parsed quantity, when done use "free" - * + * * @return zero when OK */ int mbus_vib_unit_normalize(mbus_value_information_block *vib, double value, char **unit_out, double *value_out, char ** quantity_out); -/** +/** * Generate XML for normalized variable-length data - * + * * @param data variable-length data - * + * * @return string with XML */ char * mbus_data_variable_xml_normalized(mbus_data_variable *data); -/** +/** * Return a string containing an XML representation of the normalized M-BUS frame data. - * + * * @param data M-Bus frame data - * + * * @return string with XML */ char * mbus_frame_data_xml_normalized(mbus_frame_data *data); -/** +/** * Iterate over secondary addresses, send a probe package to all addresses matching * the given addresses mask. - * + * * @param handle Initialized handle * @param pos current address - * @param addr_mask address mask to - * + * @param addr_mask address mask to + * * @return zero when OK */ int mbus_scan_2nd_address_range(mbus_handle * handle, int pos, char *addr_mask); diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index 7c7daee..ab85a0f 100755 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -2,7 +2,7 @@ // Copyright (C) 2010-2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -90,7 +90,7 @@ mbus_error_reset() } //------------------------------------------------------------------------------ -/// Return a pointer to the slave_data register. This register can be used for +/// Return a pointer to the slave_data register. This register can be used for /// storing current slave status. //------------------------------------------------------------------------------ mbus_slave_data * @@ -100,7 +100,7 @@ mbus_slave_data_get(size_t i) { return &slave_data[i]; } - + return NULL; } @@ -118,24 +118,24 @@ mbus_frame * mbus_frame_new(int frame_type) { mbus_frame *frame = NULL; - + if ((frame = malloc(sizeof(mbus_frame))) != NULL) { memset((void *)frame, 0, sizeof(mbus_frame)); - + frame->type = frame_type; switch (frame->type) { case MBUS_FRAME_TYPE_ACK: - + frame->start1 = MBUS_FRAME_ACK_START; - + break; case MBUS_FRAME_TYPE_SHORT: - + frame->start1 = MBUS_FRAME_SHORT_START; - frame->stop = MBUS_FRAME_STOP; + frame->stop = MBUS_FRAME_STOP; break; @@ -145,18 +145,18 @@ mbus_frame_new(int frame_type) frame->start2 = MBUS_FRAME_CONTROL_START; frame->length1 = 3; frame->length2 = 3; - frame->stop = MBUS_FRAME_STOP; - + frame->stop = MBUS_FRAME_STOP; + break; case MBUS_FRAME_TYPE_LONG: frame->start1 = MBUS_FRAME_LONG_START; frame->start2 = MBUS_FRAME_LONG_START; - frame->stop = MBUS_FRAME_STOP; + frame->stop = MBUS_FRAME_STOP; break; - } + } } return frame; @@ -172,7 +172,7 @@ mbus_frame_free(mbus_frame *frame) { if (frame->next != NULL) mbus_frame_free(frame->next); - + free(frame); return 0; } @@ -187,7 +187,7 @@ calc_checksum(mbus_frame *frame) { size_t i; unsigned char cksum; - + assert(frame != NULL); switch(frame->type) { @@ -244,14 +244,14 @@ mbus_frame_calc_checksum(mbus_frame *frame) case MBUS_FRAME_TYPE_CONTROL: case MBUS_FRAME_TYPE_LONG: frame->checksum = calc_checksum(frame); - + break; - + default: return -1; - } + } } - + return 0; } @@ -301,7 +301,7 @@ mbus_frame_type(mbus_frame *frame) } //------------------------------------------------------------------------------ -/// Return the M-Bus frame direction +/// Return the M-Bus frame direction //------------------------------------------------------------------------------ int mbus_frame_direction(mbus_frame *frame) @@ -310,7 +310,7 @@ mbus_frame_direction(mbus_frame *frame) { if (frame->type == MBUS_FRAME_TYPE_ACK) { - return MBUS_CONTROL_MASK_DIR_S2M; + return MBUS_CONTROL_MASK_DIR_S2M; } else { @@ -321,7 +321,7 @@ mbus_frame_direction(mbus_frame *frame) } //------------------------------------------------------------------------------ -/// Verify that parsed frame is a valid M-bus frame. +/// Verify that parsed frame is a valid M-bus frame. // // Possible checks: // @@ -348,10 +348,10 @@ mbus_frame_verify(mbus_frame *frame) if(frame->start1 != MBUS_FRAME_SHORT_START) { snprintf(error_str, sizeof(error_str), "No frame start"); - + 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)) && @@ -359,7 +359,7 @@ mbus_frame_verify(mbus_frame *frame) (frame->control != (MBUS_CONTROL_MASK_REQ_UD2 | MBUS_CONTROL_MASK_FCB))) { snprintf(error_str, sizeof(error_str), "Unknown Control Code 0x%.2x", frame->control); - + return -1; } @@ -371,10 +371,10 @@ mbus_frame_verify(mbus_frame *frame) frame->start2 != MBUS_FRAME_CONTROL_START) { snprintf(error_str, sizeof(error_str), "No frame start"); - + 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) && @@ -383,21 +383,21 @@ mbus_frame_verify(mbus_frame *frame) (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); - + return -1; } - + if (frame->length1 != frame->length2) { snprintf(error_str, sizeof(error_str), "Frame length 1 != 2"); - + return -1; } - + if (frame->length1 != calc_length(frame)) { snprintf(error_str, sizeof(error_str), "Frame length 1 != calc length"); - + return -1; } @@ -405,29 +405,29 @@ mbus_frame_verify(mbus_frame *frame) default: snprintf(error_str, sizeof(error_str), "Unknown frame type 0x%.2x", frame->type); - + return -1; } if(frame->stop != MBUS_FRAME_STOP) { snprintf(error_str, sizeof(error_str), "No frame stop"); - + return -1; } - + checksum = calc_checksum(frame); - + if(frame->checksum != checksum) { snprintf(error_str, sizeof(error_str), "Invalid checksum (0x%.2x != 0x%.2x)", frame->checksum, checksum); - + return -1; } return 0; } - + snprintf(error_str, sizeof(error_str), "Got null pointer to frame."); return -1; @@ -447,14 +447,14 @@ mbus_frame_verify(mbus_frame *frame) //------------------------------------------------------------------------------ int mbus_data_bcd_encode(unsigned char *bcd_data, size_t bcd_data_size, int value) -{ +{ int v0, v1, v2, x1, x2; size_t i; if (bcd_data && bcd_data_size && (value >= 0)) { v2 = value; - + for (i = 0; i < bcd_data_size; i++) { v0 = v2; @@ -467,9 +467,9 @@ mbus_data_bcd_encode(unsigned char *bcd_data, size_t bcd_data_size, int value) bcd_data[bcd_data_size-1-i] = (x2 << 4) | x1; } - return 0; + return 0; } - + return -1; } @@ -480,10 +480,10 @@ mbus_data_bcd_encode(unsigned char *bcd_data, size_t bcd_data_size, int value) //------------------------------------------------------------------------------ long long mbus_data_bcd_decode(unsigned char *bcd_data, size_t bcd_data_size) -{ +{ long long val = 0; size_t i; - + if (bcd_data) { for (i = bcd_data_size; i > 0; i--) @@ -492,9 +492,9 @@ mbus_data_bcd_decode(unsigned char *bcd_data, size_t bcd_data_size) val = (val * 10) + ( bcd_data[i-1] & 0xF); } - return val; + return val; } - + return -1; } @@ -508,7 +508,7 @@ mbus_data_int_decode(unsigned char *int_data, size_t int_data_size) { int val = 0; size_t i; - + if (int_data) { for (i = int_data_size; i > 0; i--) @@ -516,7 +516,7 @@ mbus_data_int_decode(unsigned char *int_data, size_t int_data_size) val = (val << 8) + int_data[i-1]; } - return val; + return val; } return -1; @@ -527,7 +527,7 @@ mbus_data_long_decode(unsigned char *int_data, size_t int_data_size) { long val = 0; size_t i; - + if (int_data) { for (i = int_data_size; i > 0; i--) @@ -535,7 +535,7 @@ mbus_data_long_decode(unsigned char *int_data, size_t int_data_size) val = (val << 8) + int_data[i-1]; } - return val; + return val; } return -1; @@ -546,7 +546,7 @@ mbus_data_long_long_decode(unsigned char *int_data, size_t int_data_size) { long long val = 0; size_t i; - + if (int_data) { for (i = int_data_size; i > 0; i--) @@ -554,7 +554,7 @@ mbus_data_long_long_decode(unsigned char *int_data, size_t int_data_size) val = (val << 8) + int_data[i-1]; } - return val; + return val; } return -1; @@ -569,7 +569,7 @@ int mbus_data_int_encode(unsigned char *int_data, size_t int_data_size, int value) { int i; - + if (int_data) { for (i = 0; i < int_data_size; i++) @@ -585,7 +585,7 @@ mbus_data_int_encode(unsigned char *int_data, size_t int_data_size, int value) //------------------------------------------------------------------------------ /// -/// Decode float data +/// Decode float data /// /// see also http://en.wikipedia.org/wiki/Single-precision_floating-point_format /// @@ -597,34 +597,34 @@ mbus_data_float_decode(unsigned char *float_data) long temp = 0, fraction; int sign,exponent; size_t i; - + if (float_data) { for (i = 4; i > 0; i--) { temp = (temp << 8) + float_data[i-1]; } - + // first bit = sign bit sign = (temp >> 31) ? -1 : 1; - + // decode 8 bit exponent exponent = ((temp & 0x7F800000) >> 23) - 127; - + // decode explicit 23 bit fraction fraction = temp & 0x007FFFFF; - + if ((exponent != -127) && (exponent != 128)) { - // normalized value, add bit 24 + // normalized value, add bit 24 fraction |= 0x800000; } - + // calculate float value val = (float) sign * fraction * pow(2.0f, -23.0f + exponent); - return val; + return val; } return -1.0; @@ -641,7 +641,7 @@ mbus_data_str_decode(unsigned char *dst, const unsigned char *src, size_t len) size_t i; i = 0; - + if (src && dst) { dst[len] = '\0'; @@ -660,23 +660,23 @@ void mbus_data_bin_decode(unsigned char *dst, const unsigned char *src, size_t len, size_t max_len) { size_t i, pos; - + i = 0; pos = 0; - + if (src && dst) { while((i < len) && ((pos+3) < max_len)) { pos += snprintf(&dst[pos], max_len - pos, "%.2X ", src[i]); i++; } - + if (pos > 0) { // remove last space pos--; } - + dst[pos] = '\0'; } } @@ -693,38 +693,38 @@ mbus_data_tm_decode(struct tm *t, unsigned char *t_data, size_t t_data_size) { return; } - + t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_mday = 0; t->tm_mon = 0; - t->tm_year = 0; + t->tm_year = 0; t->tm_wday = 0; t->tm_yday = 0; t->tm_isdst = 0; - + if (t_data) { if (t_data_size == 4) // Type F = Compound CP32: Date and Time - { + { if ((t_data[0] & 0x80) == 0) // Time valid ? { t->tm_min = t_data[0] & 0x3F; t->tm_hour = t_data[1] & 0x1F; t->tm_mday = t_data[2] & 0x1F; t->tm_mon = (t_data[3] & 0x0F) - 1; - t->tm_year = ((t_data[2] & 0xE0) >> 5) | - ((t_data[3] & 0xF0) >> 1); + t->tm_year = ((t_data[2] & 0xE0) >> 5) | + ((t_data[3] & 0xF0) >> 1); t->tm_isdst = (t_data[1] & 0x80) ? 1 : 0; // day saving time } } else if (t_data_size == 2) // Type G: Compound CP16: Date { t->tm_mday = t_data[0] & 0x1F; - t->tm_mon = (t_data[1] & 0x0F) - 1; - t->tm_year = ((t_data[0] & 0xE0) >> 5) | - ((t_data[1] & 0xF0) >> 1); + t->tm_mon = (t_data[1] & 0x0F) - 1; + t->tm_year = ((t_data[0] & 0xE0) >> 5) | + ((t_data[1] & 0xF0) >> 1); } } } @@ -742,12 +742,12 @@ mbus_data_manufacturer_encode(unsigned char *m_data, unsigned char *m_code) if (m_data == NULL || m_code == NULL) return -1; - m_val = ((((int)m_code[0] - 64) & 0x001F) << 10) + + m_val = ((((int)m_code[0] - 64) & 0x001F) << 10) + ((((int)m_code[1] - 64) & 0x001F) << 5) + ((((int)m_code[2] - 64) & 0x001F)); mbus_data_int_encode(m_data, 2, m_val); - + return 0; } @@ -760,14 +760,14 @@ const char * mbus_decode_manufacturer(unsigned char byte1, unsigned char byte2) { static char m_str[4]; - + int m_id; - + m_str[0] = byte1; m_str[1] = byte2; - + m_id = mbus_data_int_decode(m_str, 2); - + m_str[0] = (char)(((m_id>>10) & 0x001F) + 64); m_str[1] = (char)(((m_id>>5) & 0x001F) + 64); m_str[2] = (char)(((m_id) & 0x001F) + 64); @@ -788,7 +788,7 @@ mbus_data_product_name(mbus_data_variable_header *header) { manufacturer = (header->manufacturer[1] << 8) + header->manufacturer[0]; - if (manufacturer == MBUS_VARIABLE_DATA_MAN_ACW) + if (manufacturer == MBUS_VARIABLE_DATA_MAN_ACW) { switch (header->version) { @@ -854,7 +854,7 @@ mbus_data_product_name(mbus_data_variable_header *header) break; } } - else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SLB) + else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SLB) { switch (header->version) { @@ -866,7 +866,7 @@ mbus_data_product_name(mbus_data_variable_header *header) break; } } - else if (manufacturer == MBUS_VARIABLE_DATA_MAN_HYD) + else if (manufacturer == MBUS_VARIABLE_DATA_MAN_HYD) { switch (header->version) { @@ -875,7 +875,7 @@ mbus_data_product_name(mbus_data_variable_header *header) break; } } - else if (manufacturer == MBUS_VARIABLE_DATA_MAN_LUG) + else if (manufacturer == MBUS_VARIABLE_DATA_MAN_LUG) { switch (header->version) { @@ -902,7 +902,7 @@ mbus_data_product_name(mbus_data_variable_header *header) break; } } - else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SVM) + else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SVM) { switch (header->version) { @@ -914,7 +914,7 @@ mbus_data_product_name(mbus_data_variable_header *header) break; } } - else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SON) + else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SON) { switch (header->version) { @@ -941,7 +941,7 @@ mbus_data_product_name(mbus_data_variable_header *header) break; } } - else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SPX) + else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SPX) { switch (header->version) { @@ -1056,37 +1056,37 @@ mbus_data_fixed_medium(mbus_data_fixed *data) { switch ( (data->cnt1_type&0xC0)>>6 | (data->cnt2_type&0xC0)>>4 ) { - case 0x00: + case 0x00: snprintf(buff, sizeof(buff), "Other"); - break; - case 0x01: + break; + case 0x01: snprintf(buff, sizeof(buff), "Oil"); - break; - case 0x02: + break; + case 0x02: snprintf(buff, sizeof(buff), "Electricity"); - break; - case 0x03: + break; + case 0x03: snprintf(buff, sizeof(buff), "Gas"); - break; - case 0x04: + break; + case 0x04: snprintf(buff, sizeof(buff), "Heat"); - break; - case 0x05: + break; + case 0x05: snprintf(buff, sizeof(buff), "Steam"); - break; - case 0x06: + break; + case 0x06: snprintf(buff, sizeof(buff), "Hot Water"); - break; - case 0x07: + break; + case 0x07: snprintf(buff, sizeof(buff), "Water"); - break; - case 0x08: + break; + case 0x08: snprintf(buff, sizeof(buff), "H.C.A."); - break; - case 0x09: + break; + case 0x09: snprintf(buff, sizeof(buff), "Reserved"); - break; - case 0x0A: + break; + case 0x0A: snprintf(buff, sizeof(buff), "Gas Mode 2"); break; case 0x0B: @@ -1100,15 +1100,15 @@ mbus_data_fixed_medium(mbus_data_fixed *data) break; case 0x0E: snprintf(buff, sizeof(buff), "H.C.A. Mode 2"); - break; + break; case 0x0F: snprintf(buff, sizeof(buff), "Reserved"); - break; + break; default: snprintf(buff, sizeof(buff), "unknown"); - break; + break; } - + return buff; } @@ -1141,8 +1141,8 @@ mbus_data_fixed_medium(mbus_data_fixed *data) // GJ 010001 11 ml/h * 100 110001 31 // GJ * 10 010010 12 l/h 110010 32 // GJ * 100 010011 13 l/h * 10 110011 33 -// W 010100 14 l/h * 100 110100 34 -// W * 10 010101 15 m3/h 110101 35 +// W 010100 14 l/h * 100 110100 34 +// W * 10 010101 15 m3/h 110101 35 // W * 100 010110 16 m3/h * 10 110110 36 // kW 010111 17 m3/h * 100 110111 37 // kW * 10 011000 18 °C* 10-3 111000 38 @@ -1162,100 +1162,100 @@ const char * mbus_data_fixed_unit(int medium_unit_byte) { static char buff[256]; - + switch (medium_unit_byte & 0x3F) { - case 0x00: + case 0x00: snprintf(buff, sizeof(buff), "h,m,s"); - break; - case 0x01: + break; + case 0x01: snprintf(buff, sizeof(buff), "D,M,Y"); - break; - - case 0x02: + break; + + case 0x02: snprintf(buff, sizeof(buff), "Wh"); - break; - case 0x03: + break; + case 0x03: snprintf(buff, sizeof(buff), "10 Wh"); - break; - case 0x04: + break; + case 0x04: snprintf(buff, sizeof(buff), "100 Wh"); - break; - case 0x05: + break; + case 0x05: snprintf(buff, sizeof(buff), "kWh"); - break; - case 0x06: + break; + case 0x06: snprintf(buff, sizeof(buff), "10 kWh"); - break; - case 0x07: + break; + case 0x07: snprintf(buff, sizeof(buff), "100 kWh"); - break; - case 0x08: + break; + case 0x08: snprintf(buff, sizeof(buff), "MWh"); - break; - case 0x09: + break; + case 0x09: snprintf(buff, sizeof(buff), "10 MWh"); - break; - case 0x0A: + break; + case 0x0A: snprintf(buff, sizeof(buff), "100 MWh"); - break; - - case 0x0B: + break; + + case 0x0B: snprintf(buff, sizeof(buff), "kJ"); - break; - case 0x0C: + break; + case 0x0C: snprintf(buff, sizeof(buff), "10 kJ"); - break; - case 0x0E: + break; + case 0x0E: snprintf(buff, sizeof(buff), "100 kJ"); - break; - case 0x0D: + break; + case 0x0D: snprintf(buff, sizeof(buff), "MJ"); - break; - case 0x0F: + break; + case 0x0F: snprintf(buff, sizeof(buff), "10 MJ"); - break; - case 0x10: + break; + case 0x10: snprintf(buff, sizeof(buff), "100 MJ"); break; - case 0x11: + case 0x11: snprintf(buff, sizeof(buff), "GJ"); - break; - case 0x12: + break; + case 0x12: snprintf(buff, sizeof(buff), "10 GJ"); - break; - case 0x13: + break; + case 0x13: snprintf(buff, sizeof(buff), "100 GJ"); break; - case 0x14: + case 0x14: snprintf(buff, sizeof(buff), "W"); - break; - case 0x15: + break; + case 0x15: snprintf(buff, sizeof(buff), "10 W"); - break; - case 0x16: + break; + case 0x16: snprintf(buff, sizeof(buff), "100 W"); - break; - case 0x17: + break; + case 0x17: snprintf(buff, sizeof(buff), "kW"); - break; - case 0x18: + break; + case 0x18: snprintf(buff, sizeof(buff), "10 kW"); - break; - case 0x19: + break; + case 0x19: snprintf(buff, sizeof(buff), "100 kW"); break; - case 0x1A: + case 0x1A: snprintf(buff, sizeof(buff), "MW"); - break; - case 0x1B: + break; + case 0x1B: snprintf(buff, sizeof(buff), "10 MW"); - break; - case 0x1C: + break; + case 0x1C: snprintf(buff, sizeof(buff), "100 MW"); break; - + case 0x1D: snprintf(buff, sizeof(buff), "kJ/h"); break; @@ -1283,7 +1283,7 @@ mbus_data_fixed_unit(int medium_unit_byte) case 0x25: snprintf(buff, sizeof(buff), "100 GJ/h"); break; - + case 0x26: snprintf(buff, sizeof(buff), "ml"); break; @@ -1293,15 +1293,15 @@ mbus_data_fixed_unit(int medium_unit_byte) case 0x28: snprintf(buff, sizeof(buff), "100 ml"); break; - case 0x29: + case 0x29: snprintf(buff, sizeof(buff), "l"); break; - case 0x2A: + case 0x2A: snprintf(buff, sizeof(buff), "10 l"); break; - case 0x2B: + case 0x2B: snprintf(buff, sizeof(buff), "100 l"); - break; + break; case 0x2C: snprintf(buff, sizeof(buff), "m^3"); break; @@ -1311,7 +1311,7 @@ mbus_data_fixed_unit(int medium_unit_byte) case 0x2E: snprintf(buff, sizeof(buff), "m^3"); break; - + case 0x2F: snprintf(buff, sizeof(buff), "ml/h"); break; @@ -1339,20 +1339,20 @@ mbus_data_fixed_unit(int medium_unit_byte) case 0x37: snprintf(buff, sizeof(buff), "100 m^3/h"); break; - + case 0x38: snprintf(buff, sizeof(buff), "1e-3 °C"); break; case 0x39: snprintf(buff, sizeof(buff), "units for HCA"); - break; + break; case 0x3A: case 0x3B: case 0x3C: case 0x3D: snprintf(buff, sizeof(buff), "reserved"); break; - case 0x3E: + case 0x3E: snprintf(buff, sizeof(buff), "reserved but historic"); break; case 0x3F: @@ -1360,7 +1360,7 @@ mbus_data_fixed_unit(int medium_unit_byte) break; default: snprintf(buff, sizeof(buff), "unknown"); - break; + break; } return buff; @@ -1412,19 +1412,19 @@ mbus_data_variable_medium_lookup(unsigned char medium) case MBUS_VARIABLE_DATA_MEDIUM_OTHER: snprintf(buff, sizeof(buff), "Other"); break; - + case MBUS_VARIABLE_DATA_MEDIUM_OIL: snprintf(buff, sizeof(buff), "Oil"); break; - + case MBUS_VARIABLE_DATA_MEDIUM_ELECTRICITY: snprintf(buff, sizeof(buff), "Electricity"); break; - + case MBUS_VARIABLE_DATA_MEDIUM_GAS: snprintf(buff, sizeof(buff), "Gas"); break; - + case MBUS_VARIABLE_DATA_MEDIUM_HEAT_OUT: snprintf(buff, sizeof(buff), "Heat: Outlet"); break; @@ -1432,7 +1432,7 @@ mbus_data_variable_medium_lookup(unsigned char medium) case MBUS_VARIABLE_DATA_MEDIUM_STEAM: snprintf(buff, sizeof(buff), "Steam"); break; - + case MBUS_VARIABLE_DATA_MEDIUM_HOT_WATER: snprintf(buff, sizeof(buff), "Hot water"); break; @@ -1456,11 +1456,11 @@ mbus_data_variable_medium_lookup(unsigned char medium) case MBUS_VARIABLE_DATA_MEDIUM_COOL_IN: snprintf(buff, sizeof(buff), "Cooling load meter: Inlet"); break; - + case MBUS_VARIABLE_DATA_MEDIUM_HEAT_IN: snprintf(buff, sizeof(buff), "Heat: Inlet"); break; - + case MBUS_VARIABLE_DATA_MEDIUM_HEAT_COOL: snprintf(buff, sizeof(buff), "Heat / Cooling load meter"); break; @@ -1468,7 +1468,7 @@ mbus_data_variable_medium_lookup(unsigned char medium) case MBUS_VARIABLE_DATA_MEDIUM_BUS: snprintf(buff, sizeof(buff), "Bus/System"); break; - + case MBUS_VARIABLE_DATA_MEDIUM_UNKNOWN: snprintf(buff, sizeof(buff), "Unknown Medium"); break; @@ -1494,14 +1494,14 @@ mbus_data_variable_medium_lookup(unsigned char medium) snprintf(buff, sizeof(buff), "Reserved"); break; - + // add more ... default: snprintf(buff, sizeof(buff), "Unknown medium (0x%.2x)", medium); - break; + break; } - return buff; + return buff; } //------------------------------------------------------------------------------ @@ -1513,7 +1513,7 @@ const char * mbus_unit_prefix(int exp) { static char buff[256]; - + switch (exp) { case 0: @@ -1523,7 +1523,7 @@ mbus_unit_prefix(int exp) case -3: snprintf(buff, sizeof(buff), "m"); break; - + case -6: snprintf(buff, sizeof(buff), "my"); break; @@ -1539,33 +1539,33 @@ mbus_unit_prefix(int exp) case 3: snprintf(buff, sizeof(buff), "k"); break; - + case 4: snprintf(buff, sizeof(buff), "10 k"); - break; + break; case 5: snprintf(buff, sizeof(buff), "100 k"); - break; + break; case 6: snprintf(buff, sizeof(buff), "M"); break; - + case 9: snprintf(buff, sizeof(buff), "T"); break; - + default: snprintf(buff, sizeof(buff), "1e%d ", exp); } - + return buff; } //------------------------------------------------------------------------------ /// Look up the data lenght from a VIF field in the data record. -/// +/// /// See the table on page 41 the M-BUS specification. //------------------------------------------------------------------------------ unsigned char @@ -1600,8 +1600,8 @@ mbus_dif_datalength_lookup(unsigned char dif) return 3; case 0xC: return 4; - case 0xD: - // variable data length, + case 0xD: + // variable data length, // data length stored in data field return 0; case 0xE: @@ -1617,7 +1617,7 @@ mbus_dif_datalength_lookup(unsigned char dif) //------------------------------------------------------------------------------ /// Look up the unit from a VIF field in the data record. -/// +/// /// See section 8.4.3 Codes for Value Information Field (VIF) in the M-BUS spec //------------------------------------------------------------------------------ const char * @@ -1638,7 +1638,7 @@ mbus_vif_unit_lookup(unsigned char vif) case 0x00+6: case 0x00+7: n = (vif & 0x07) - 3; - snprintf(buff, sizeof(buff), "Energy (%sWh)", mbus_unit_prefix(n)); + snprintf(buff, sizeof(buff), "Energy (%sWh)", mbus_unit_prefix(n)); break; // 0000 1nnn Energy 10(nnn)J (0.001kJ to 10000kJ) @@ -1650,11 +1650,11 @@ mbus_vif_unit_lookup(unsigned char vif) case 0x08+5: case 0x08+6: case 0x08+7: - + n = (vif & 0x07); snprintf(buff, sizeof(buff), "Energy (%sJ)", mbus_unit_prefix(n)); - - break; + + break; // E001 1nnn Mass 10(nnn-3) kg 0.001kg to 10000kg case 0x18: @@ -1665,11 +1665,11 @@ mbus_vif_unit_lookup(unsigned char vif) case 0x18+5: case 0x18+6: case 0x18+7: - + n = (vif & 0x07); snprintf(buff, sizeof(buff), "Mass (%skg)", mbus_unit_prefix(n-3)); - - break; + + break; // E010 1nnn Power 10(nnn-3) W 0.001W to 10000W case 0x28: @@ -1684,9 +1684,9 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x07); snprintf(buff, sizeof(buff), "Power (%sW)", mbus_unit_prefix(n-3)); //snprintf(buff, sizeof(buff), "Power (10^%d W)", n-3); - + break; - + // E011 0nnn Power 10(nnn) J/h 0.001kJ/h to 10000kJ/h case 0x30: case 0x30+1: @@ -1699,8 +1699,8 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x07); snprintf(buff, sizeof(buff), "Power (%sJ/h)", mbus_unit_prefix(n)); - - break; + + break; // E001 0nnn Volume 10(nnn-6) m3 0.001l to 10000l case 0x10: @@ -1714,9 +1714,9 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x07); snprintf(buff, sizeof(buff), "Volume (%s m^3)", mbus_unit_prefix(n-6)); - + break; - + // E011 1nnn Volume Flow 10(nnn-6) m3/h 0.001l/h to 10000l/ case 0x38: case 0x38+1: @@ -1729,8 +1729,8 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x07); snprintf(buff, sizeof(buff), "Volume flow (%s m^3/h)", mbus_unit_prefix(n-6)); - - break; + + break; // E100 0nnn Volume Flow ext. 10(nnn-7) m3/min 0.0001l/min to 1000l/min case 0x40: @@ -1744,8 +1744,8 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x07); snprintf(buff, sizeof(buff), "Volume flow (%s m^3/min)", mbus_unit_prefix(n-7)); - - break; + + break; // E100 1nnn Volume Flow ext. 10(nnn-9) m3/s 0.001ml/s to 10000ml/ case 0x48: @@ -1759,8 +1759,8 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x07); snprintf(buff, sizeof(buff), "Volume flow (%s m^3/s)", mbus_unit_prefix(n-9)); - - break; + + break; // E101 0nnn Mass flow 10(nnn-3) kg/h 0.001kg/h to 10000kg/ case 0x50: @@ -1774,8 +1774,8 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x07); snprintf(buff, sizeof(buff), "Mass flow (%s kg/h)", mbus_unit_prefix(n-3)); - - break; + + break; // E101 10nn Flow Temperature 10(nn-3) °C 0.001°C to 1°C case 0x58: @@ -1785,7 +1785,7 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x03); snprintf(buff, sizeof(buff), "Flow temperature (%sdeg C)", mbus_unit_prefix(n-3)); - + break; // E101 11nn Return Temperature 10(nn-3) °C 0.001°C to 1°C @@ -1796,7 +1796,7 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x03); snprintf(buff, sizeof(buff), "Return temperature (%sdeg C)", mbus_unit_prefix(n-3)); - + break; // E110 10nn Pressure 10(nn-3) bar 1mbar to 1000mbar @@ -1807,7 +1807,7 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x03); snprintf(buff, sizeof(buff), "Pressure (%s bar)", mbus_unit_prefix(n-3)); - + break; // E010 00nn On Time @@ -1816,7 +1816,7 @@ mbus_vif_unit_lookup(unsigned char vif) // nn = 10 hours // nn = 11 days // E010 01nn Operating Time coded like OnTime - // E111 00nn Averaging Duration coded like OnTime + // E111 00nn Averaging Duration coded like OnTime // E111 01nn Actuality Duration coded like OnTime case 0x20: case 0x20+1: @@ -1839,13 +1839,13 @@ mbus_vif_unit_lookup(unsigned char vif) if ((vif & 0x7C) == 0x20) offset = snprintf(buff, sizeof(buff), "On time "); - else if ((vif & 0x7C) == 0x24) + else if ((vif & 0x7C) == 0x24) offset = snprintf(buff, sizeof(buff), "Operating time "); else if ((vif & 0x7C) == 0x70) offset = snprintf(buff, sizeof(buff), "Averaging Duration "); else offset = snprintf(buff, sizeof(buff), "Actuality Duration "); - + switch (vif & 0x03) { case 0x00: @@ -1862,7 +1862,7 @@ mbus_vif_unit_lookup(unsigned char vif) break; } } - break; + break; // E110 110n Time Point // n = 0 date @@ -1876,9 +1876,9 @@ mbus_vif_unit_lookup(unsigned char vif) snprintf(buff, sizeof(buff), "Time Point (time & date)"); else snprintf(buff, sizeof(buff), "Time Point (date)"); - + break; - + // E110 00nn Temperature Difference 10(nn-3)K (mK to K) case 0x60: case 0x60+1: @@ -1886,9 +1886,9 @@ mbus_vif_unit_lookup(unsigned char vif) case 0x60+3: n = (vif & 0x03); - + snprintf(buff, sizeof(buff), "Temperature Difference (%s deg C)", mbus_unit_prefix(n-3)); - + break; // E110 01nn External Temperature 10(nn-3) °C 0.001°C to 1°C @@ -1899,35 +1899,35 @@ mbus_vif_unit_lookup(unsigned char vif) n = (vif & 0x03); snprintf(buff, sizeof(buff), "External temperature (%s deg C)", mbus_unit_prefix(n-3)); - + break; // E110 1110 Units for H.C.A. dimensionless case 0x6E: snprintf(buff, sizeof(buff), "Units for H.C.A."); - break; + break; // E110 1111 Reserved case 0x6F: snprintf(buff, sizeof(buff), "Reserved"); - break; + break; // Custom VIF in the following string: never reached... case 0x7C: snprintf(buff, sizeof(buff), "Custom VIF"); - break; + break; // Fabrication No case 0x78: snprintf(buff, sizeof(buff), "Fabrication number"); break; - + // Bus Address case 0x7A: snprintf(buff, sizeof(buff), "Bus Address"); break; - // Manufacturer specific: 7Fh / FF + // Manufacturer specific: 7Fh / FF case 0x7F: case 0xFF: snprintf(buff, sizeof(buff), "Manufacturer specific"); @@ -1937,7 +1937,7 @@ mbus_vif_unit_lookup(unsigned char vif) snprintf(buff, sizeof(buff), "Unknown (VIF=0x%.2X)", vif); break; } - + return buff; } @@ -1952,54 +1952,54 @@ const char * mbus_data_error_lookup(int error) { static char buff[256]; - + switch (error) { case MBUS_ERROR_DATA_UNSPECIFIED: snprintf(buff, sizeof(buff), "Unspecified error"); break; - + case MBUS_ERROR_DATA_UNIMPLEMENTED_CI: snprintf(buff, sizeof(buff), "Unimplemented CI-Field"); break; - + case MBUS_ERROR_DATA_BUFFER_TOO_LONG: snprintf(buff, sizeof(buff), "Buffer too long, truncated"); break; - + case MBUS_ERROR_DATA_TOO_MANY_RECORDS: snprintf(buff, sizeof(buff), "Too many records"); break; - + case MBUS_ERROR_DATA_PREMATURE_END: snprintf(buff, sizeof(buff), "Premature end of record"); break; - + case MBUS_ERROR_DATA_TOO_MANY_DIFES: snprintf(buff, sizeof(buff), "More than 10 DIFE´s"); break; - + case MBUS_ERROR_DATA_TOO_MANY_VIFES: snprintf(buff, sizeof(buff), "More than 10 VIFE´s"); break; - + case MBUS_ERROR_DATA_RESERVED: snprintf(buff, sizeof(buff), "Reserved"); break; - + case MBUS_ERROR_DATA_APPLICATION_BUSY: snprintf(buff, sizeof(buff), "Application busy"); break; - + case MBUS_ERROR_DATA_TOO_MANY_READOUTS: snprintf(buff, sizeof(buff), "Too many readouts"); break; - + default: snprintf(buff, sizeof(buff), "Unknown error (0x%.2X)", error); break; } - + return buff; } @@ -2008,25 +2008,25 @@ mbus_data_error_lookup(int error) /// Lookup the unit from the VIB (VIF or VIFE) // // Enhanced Identification -// E000 1000 Access Number (transmission count) -// E000 1001 Medium (as in fixed header) -// E000 1010 Manufacturer (as in fixed header) -// E000 1011 Parameter set identification -// E000 1100 Model / Version -// E000 1101 Hardware version # -// E000 1110 Firmware version # -// E000 1111 Software version # +// E000 1000 Access Number (transmission count) +// E000 1001 Medium (as in fixed header) +// E000 1010 Manufacturer (as in fixed header) +// E000 1011 Parameter set identification +// E000 1100 Model / Version +// E000 1101 Hardware version # +// E000 1110 Firmware version # +// E000 1111 Software version # //------------------------------------------------------------------------------ const char * mbus_vib_unit_lookup(mbus_value_information_block *vib) -{ +{ static char buff[256]; int n; - + if (vib == NULL) return ""; - if (vib->vif == 0xFD || vib->vif == 0xFB) // first type of VIF extention: see table 8.4.4 + if (vib->vif == 0xFD || vib->vif == 0xFB) // first type of VIF extention: see table 8.4.4 { if (vib->nvife == 0) { @@ -2034,7 +2034,7 @@ mbus_vib_unit_lookup(mbus_value_information_block *vib) } else if (vib->vife[0] == 0x08 || vib->vife[0] == 0x88) { - // E000 1000 + // E000 1000 snprintf(buff, sizeof(buff), "Access Number (transmission count)"); } else if (vib->vife[0] == 0x09|| vib->vife[0] == 0x89) @@ -2146,7 +2146,7 @@ mbus_vib_unit_lookup(mbus_value_information_block *vib) // Decode data and write to string // // Data format (for record->data data array) -// +// // Length in Bit Code Meaning Code Meaning // 0 0000 No data 1000 Selection for Readout // 8 0001 8 Bit Integer 1001 2 digit BCD @@ -2170,47 +2170,47 @@ mbus_data_record_decode(mbus_data_record *record) { static char buff[768]; unsigned char vif, vife; - + if (record) { int val; float val3; long long val4; struct tm time; - + // ignore extension bit - vif = (record->drh.vib.vif & MBUS_DIB_VIF_WITHOUT_EXTENSION); + vif = (record->drh.vib.vif & MBUS_DIB_VIF_WITHOUT_EXTENSION); vife = (record->drh.vib.vife[0] & MBUS_DIB_VIF_WITHOUT_EXTENSION); - + switch (record->drh.dib.dif & 0x0F) { case 0x00: // no data - + buff[0] = 0; - - break; + + break; case 0x01: // 1 byte integer (8 bit) - + val = mbus_data_int_decode(record->data, 1); - + snprintf(buff, sizeof(buff), "%d", val); if (debug) printf("%s: DIF 0x%.2x was decoded using 1 byte integer\n", __PRETTY_FUNCTION__, record->drh.dib.dif); - break; + break; case 0x02: // 2 byte (16 bit) - + // E110 1100 Time Point (date) - if (vif == 0x6C) + if (vif == 0x6C) { mbus_data_tm_decode(&time, record->data, 2); - snprintf(buff, sizeof(buff), "%04d-%02d-%02d", - (time.tm_year + 2000), - (time.tm_mon + 1), + snprintf(buff, sizeof(buff), "%04d-%02d-%02d", + (time.tm_year + 2000), + (time.tm_mon + 1), time.tm_mday); } else // 2 byte integer @@ -2221,33 +2221,33 @@ mbus_data_record_decode(mbus_data_record *record) printf("%s: DIF 0x%.2x was decoded using 2 byte integer\n", __PRETTY_FUNCTION__, record->drh.dib.dif); } - - break; + + break; case 0x03: // 3 byte integer (24 bit) val = mbus_data_int_decode(record->data, 3); - + snprintf(buff, sizeof(buff), "%d", val); if (debug) printf("%s: DIF 0x%.2x was decoded using 3 byte integer\n", __PRETTY_FUNCTION__, record->drh.dib.dif); - break; - + break; + case 0x04: // 4 byte (32 bit) - + // E110 1101 Time Point (date/time) // E011 0000 Start (date/time) of tariff // E111 0000 Date and time of battery change - if ( (vif == 0x6D) || - ((record->drh.vib.vif == 0xFD) && (vife == 0x30)) || - ((record->drh.vib.vif == 0xFD) && (vife == 0x70))) + if ( (vif == 0x6D) || + ((record->drh.vib.vif == 0xFD) && (vife == 0x30)) || + ((record->drh.vib.vif == 0xFD) && (vife == 0x70))) { mbus_data_tm_decode(&time, record->data, 4); - snprintf(buff, sizeof(buff), "%04d-%02d-%02dT%02d:%02d:%02d", - (time.tm_year + 2000), - (time.tm_mon + 1), + snprintf(buff, sizeof(buff), "%04d-%02d-%02dT%02d:%02d:%02d", + (time.tm_year + 2000), + (time.tm_mon + 1), time.tm_mday, time.tm_hour, time.tm_min, @@ -2262,57 +2262,57 @@ mbus_data_record_decode(mbus_data_record *record) if (debug) printf("%s: DIF 0x%.2x was decoded using 4 byte integer\n", __PRETTY_FUNCTION__, record->drh.dib.dif); - break; + break; case 0x05: // 4 Byte Real (32 bit) - + val3 = mbus_data_float_decode(record->data); - + snprintf(buff, sizeof(buff), "%f", val3); - + if (debug) - printf("%s: DIF 0x%.2x was decoded using 4 byte Real\n", __PRETTY_FUNCTION__, record->drh.dib.dif); - + printf("%s: DIF 0x%.2x was decoded using 4 byte Real\n", __PRETTY_FUNCTION__, record->drh.dib.dif); + break; case 0x06: // 6 byte integer (48 bit) val4 = mbus_data_long_long_decode(record->data, 6); - + snprintf(buff, sizeof(buff), "%lld", val4); if (debug) printf("%s: DIF 0x%.2x was decoded using 6 byte integer\n", __PRETTY_FUNCTION__, record->drh.dib.dif); - break; + break; case 0x07: // 8 byte integer (64 bit) val4 = mbus_data_long_long_decode(record->data, 8); - + snprintf(buff, sizeof(buff), "%lld", val4); if (debug) printf("%s: DIF 0x%.2x was decoded using 8 byte integer\n", __PRETTY_FUNCTION__, record->drh.dib.dif); - break; + break; - //case 0x08: + //case 0x08: case 0x09: // 2 digit BCD (8 bit) - - val = (int)mbus_data_bcd_decode(record->data, 1); - snprintf(buff, sizeof(buff), "%d", val); - + + val = (int)mbus_data_bcd_decode(record->data, 1); + snprintf(buff, sizeof(buff), "%d", val); + if (debug) printf("%s: DIF 0x%.2x was decoded using 2 digit BCD\n", __PRETTY_FUNCTION__, record->drh.dib.dif); break; - + case 0x0A: // 4 digit BCD (16 bit) - - val = (int)mbus_data_bcd_decode(record->data, 2); - snprintf(buff, sizeof(buff), "%d", val); + + val = (int)mbus_data_bcd_decode(record->data, 2); + snprintf(buff, sizeof(buff), "%d", val); if (debug) printf("%s: DIF 0x%.2x was decoded using 4 digit BCD\n", __PRETTY_FUNCTION__, record->drh.dib.dif); @@ -2321,27 +2321,27 @@ mbus_data_record_decode(mbus_data_record *record) case 0x0B: // 6 digit BCD (24 bit) - val = (int)mbus_data_bcd_decode(record->data, 3); - snprintf(buff, sizeof(buff), "%d", val); + val = (int)mbus_data_bcd_decode(record->data, 3); + snprintf(buff, sizeof(buff), "%d", val); if (debug) printf("%s: DIF 0x%.2x was decoded using 6 digit BCD\n", __PRETTY_FUNCTION__, record->drh.dib.dif); break; - + case 0x0C: // 8 digit BCD (32 bit) - val = (int)mbus_data_bcd_decode(record->data, 4); + val = (int)mbus_data_bcd_decode(record->data, 4); snprintf(buff, sizeof(buff), "%d", val); if (debug) printf("%s: DIF 0x%.2x was decoded using 8 digit BCD\n", __PRETTY_FUNCTION__, record->drh.dib.dif); break; - + case 0x0E: // 12 digit BCD (48 bit) - val4 = mbus_data_bcd_decode(record->data, 6); + val4 = mbus_data_bcd_decode(record->data, 6); snprintf(buff, sizeof(buff), "%lld", val4); if (debug) @@ -2350,7 +2350,7 @@ mbus_data_record_decode(mbus_data_record *record) break; case 0x0F: // special functions - + mbus_data_bin_decode(buff, record->data, record->data_len, sizeof(buff)); break; @@ -2363,12 +2363,12 @@ mbus_data_record_decode(mbus_data_record *record) /*@fallthrough@*/ default: - + snprintf(buff, sizeof(buff), "Unknown DIF (0x%.2x)", record->drh.dib.dif); break; } - return buff; + return buff; } return NULL; @@ -2380,14 +2380,14 @@ const char * mbus_data_record_unit(mbus_data_record *record) { static char buff[128]; - + if (record) { snprintf(buff, sizeof(buff), "%s", mbus_vib_unit_lookup(&(record->drh.vib))); - - return buff; + + return buff; } - + return NULL; } @@ -2398,14 +2398,14 @@ const char * mbus_data_record_value(mbus_data_record *record) { static char buff[768]; - + if (record) { snprintf(buff, sizeof(buff), "%s", mbus_data_record_decode(record)); - - return buff; + + return buff; } - + return NULL; } @@ -2416,13 +2416,13 @@ const char * mbus_data_record_function(mbus_data_record *record) { static char buff[128]; - + if (record) { switch (record->drh.dib.dif & MBUS_DATA_RECORD_DIF_MASK_FUNCTION) { case 0x00: - snprintf(buff, sizeof(buff), "Instantaneous value"); + snprintf(buff, sizeof(buff), "Instantaneous value"); break; case 0x10: @@ -2434,16 +2434,16 @@ mbus_data_record_function(mbus_data_record *record) break; case 0x30: - snprintf(buff, sizeof(buff), "Value during error state"); + snprintf(buff, sizeof(buff), "Value during error state"); break; - + default: - snprintf(buff, sizeof(buff), "unknown"); + snprintf(buff, sizeof(buff), "unknown"); } - return buff; + return buff; } - + return NULL; } @@ -2457,9 +2457,9 @@ mbus_data_fixed_function(int status) static char buff[128]; snprintf(buff, sizeof(buff), "%s", - (status & MBUS_DATA_FIXED_STATUS_DATE_MASK) == MBUS_DATA_FIXED_STATUS_DATE_STORED ? + (status & MBUS_DATA_FIXED_STATUS_DATE_MASK) == MBUS_DATA_FIXED_STATUS_DATE_STORED ? "Stored value" : "Actual value" ); - + return buff; } @@ -2476,15 +2476,15 @@ int mbus_parse(mbus_frame *frame, unsigned char *data, size_t data_size) { size_t i, len; - + if (frame && data && data_size > 0) { frame->next = NULL; - - if (parse_debug) + + if (parse_debug) printf("%s: Attempting to parse binary data [size = %zu]\n", __PRETTY_FUNCTION__, data_size); - if (parse_debug) + if (parse_debug) printf("%s: ", __PRETTY_FUNCTION__); for (i = 0; i < data_size && parse_debug; i++) @@ -2494,40 +2494,40 @@ mbus_parse(mbus_frame *frame, unsigned char *data, size_t data_size) if (parse_debug) printf("\n%s: done.\n", __PRETTY_FUNCTION__); - + switch (data[0]) { case MBUS_FRAME_ACK_START: - - // OK, got a valid ack frame, require no more data + + // OK, got a valid ack frame, require no more data frame->start1 = data[0]; frame->type = MBUS_FRAME_TYPE_ACK; return 0; //return MBUS_FRAME_BASE_SIZE_ACK - 1; // == 0 - + case MBUS_FRAME_SHORT_START: - + if (data_size < MBUS_FRAME_BASE_SIZE_SHORT) { // OK, got a valid short packet start, but we need more data return MBUS_FRAME_BASE_SIZE_SHORT - data_size; } - + if (data_size != MBUS_FRAME_BASE_SIZE_SHORT) { snprintf(error_str, sizeof(error_str), "Too much data in frame."); - + // too much data... ? return -2; } - + // init frame data structure frame->start1 = data[0]; frame->control = data[1]; frame->address = data[2]; frame->checksum = data[3]; frame->stop = data[4]; - + frame->type = MBUS_FRAME_TYPE_SHORT; // verify the frame @@ -2540,74 +2540,74 @@ mbus_parse(mbus_frame *frame, unsigned char *data, size_t data_size) return 0; case MBUS_FRAME_LONG_START: // (also CONTROL) - + if (data_size < 3) { // OK, got a valid long/control packet start, but we need // more data to determine the length return 3 - data_size; } - + // init frame data structure frame->start1 = data[0]; frame->length1 = data[1]; frame->length2 = data[2]; - + if (frame->length1 < 3) { snprintf(error_str, sizeof(error_str), "Invalid M-Bus frame length."); - + // not a valid M-bus frame return -2; } - + if (frame->length1 != frame->length2) { snprintf(error_str, sizeof(error_str), "Invalid M-Bus frame length."); - + // not a valid M-bus frame return -2; } - + // check length of packet: len = frame->length1; - + if (data_size < (size_t)(MBUS_FRAME_FIXED_SIZE_LONG + len)) { // OK, but we need more data - return MBUS_FRAME_FIXED_SIZE_LONG + len - data_size; + return MBUS_FRAME_FIXED_SIZE_LONG + len - data_size; } - + if (data_size > (size_t)(MBUS_FRAME_FIXED_SIZE_LONG + len)) { snprintf(error_str, sizeof(error_str), "Too much data in frame."); - + // too much data... ? return -2; } - + // we got the whole packet, continue parsing frame->start2 = data[3]; frame->control = data[4]; frame->address = data[5]; frame->control_information = data[6]; - + frame->data_size = len - 3; for (i = 0; i < frame->data_size; i++) { frame->data[i] = data[7 + i]; - } - + } + frame->checksum = data[data_size-2]; // data[6 + frame->data_size + 1] - frame->stop = data[data_size-1]; // data[6 + frame->data_size + 2] - + frame->stop = data[data_size-1]; // data[6 + frame->data_size + 2] + if (frame->data_size == 0) { frame->type = MBUS_FRAME_TYPE_CONTROL; } else { - frame->type = MBUS_FRAME_TYPE_LONG; + frame->type = MBUS_FRAME_TYPE_LONG; } // verify the frame @@ -2617,16 +2617,16 @@ mbus_parse(mbus_frame *frame, unsigned char *data, size_t data_size) } // successfully parsed data - return 0; + return 0; default: snprintf(error_str, sizeof(error_str), "Invalid M-Bus frame start."); - + // not a valid M-Bus frame header (start byte) return -4; - } - + } + } - + snprintf(error_str, sizeof(error_str), "Got null pointer to frame, data or zero data_size."); return -1; @@ -2646,7 +2646,7 @@ mbus_data_fixed_parse(mbus_frame *frame, mbus_data_fixed *data) snprintf(error_str, sizeof(error_str), "Invalid length for fixed data."); return -1; } - + // copy the fixed-length data structure bytewise data->id_bcd[0] = frame->data[0]; data->id_bcd[1] = frame->data[1]; @@ -2666,7 +2666,7 @@ mbus_data_fixed_parse(mbus_frame *frame, mbus_data_fixed *data) data->cnt2_val[3] = frame->data[15]; return 0; - } + } return -1; } @@ -2680,14 +2680,14 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) { mbus_data_record *record = NULL; size_t i, j; - + if (frame && data) { // parse header data->nrecords = 0; data->more_records_follow = 0; i = MBUS_DATA_VARIABLE_HEADER_LENGTH; - + if(frame->data_size < i) { snprintf(error_str, sizeof(error_str), "Variable header too short."); @@ -2707,7 +2707,7 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) data->header.status = frame->data[9]; data->header.signature[0] = frame->data[10]; data->header.signature[1] = frame->data[11]; - + data->record = NULL; while (i < frame->data_size) @@ -2724,23 +2724,23 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) // clean up... return (-2); } - + // copy timestamp memcpy((void *)&(record->timestamp), (void *)&(frame->timestamp), sizeof(time_t)); // read and parse DIB (= DIF + DIFE) - + // DIF record->drh.dib.dif = frame->data[i]; - if ((record->drh.dib.dif == MBUS_DIB_DIF_MANUFACTURER_SPECIFIC) || + if ((record->drh.dib.dif == MBUS_DIB_DIF_MANUFACTURER_SPECIFIC) || (record->drh.dib.dif == MBUS_DIB_DIF_MORE_RECORDS_FOLLOW)) { if ((record->drh.dib.dif & 0xFF) == MBUS_DIB_DIF_MORE_RECORDS_FOLLOW) { data->more_records_follow = 1; } - + i++; // just copy the remaining data as it is vendor specific record->data_len = frame->data_size - i; @@ -2754,9 +2754,9 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) data->nrecords++; continue; } - - // calculate length of data record - record->data_len = mbus_dif_datalength_lookup(record->drh.dib.dif); + + // calculate length of data record + record->data_len = mbus_dif_datalength_lookup(record->drh.dib.dif); // read DIF extensions record->drh.dib.ndife = 0; @@ -2764,14 +2764,14 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) (frame->data[i] & MBUS_DIB_DIF_EXTENSION_BIT)) { unsigned char dife; - + if (record->drh.dib.ndife >= NITEMS(record->drh.dib.dife)) { mbus_data_record_free(record); snprintf(error_str, sizeof(error_str), "Too many DIFE."); return -1; } - + dife = frame->data[i+1]; record->drh.dib.dife[record->drh.dib.ndife] = dife; @@ -2779,7 +2779,7 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) i++; } i++; - + if (i > frame->data_size) { mbus_data_record_free(record); @@ -2791,7 +2791,7 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) // VIF record->drh.vib.vif = frame->data[i++]; - + if ((record->drh.vib.vif & MBUS_DIB_VIF_WITHOUT_EXTENSION) == 0x7C) { // variable length VIF in ASCII format @@ -2803,7 +2803,7 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) snprintf(error_str, sizeof(error_str), "Too long variable length VIF."); return -1; } - + if (i + var_vif_len > frame->data_size) { mbus_data_record_free(record); @@ -2813,43 +2813,43 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) mbus_data_str_decode(record->drh.vib.custom_vif, &(frame->data[i]), var_vif_len); i += var_vif_len; } - + // VIFE record->drh.vib.nvife = 0; - + if (record->drh.vib.vif & MBUS_DIB_VIF_EXTENSION_BIT) { record->drh.vib.vife[0] = frame->data[i]; record->drh.vib.nvife++; - + while ((i < frame->data_size) && (frame->data[i] & MBUS_DIB_VIF_EXTENSION_BIT)) { unsigned char vife; - + if (record->drh.vib.nvife >= NITEMS(record->drh.vib.vife)) { mbus_data_record_free(record); snprintf(error_str, sizeof(error_str), "Too many VIFE."); return -1; } - + vife = frame->data[i+1]; record->drh.vib.vife[record->drh.vib.nvife] = vife; - + record->drh.vib.nvife++; i++; } i++; } - + if (i > frame->data_size) { mbus_data_record_free(record); snprintf(error_str, sizeof(error_str), "Premature end of record at VIF."); return -1; } - + // re-calculate data length, if of variable length type if ((record->drh.dib.dif & 0x0F) == 0x0D) // flag for variable length data { @@ -2864,28 +2864,28 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) else if(frame->data[i] >= 0xF0 && frame->data[i] <= 0xFA) record->data_len = frame->data[i++] - 0xF0; } - + if (i + record->data_len > frame->data_size) { mbus_data_record_free(record); snprintf(error_str, sizeof(error_str), "Premature end of record at data."); return -1; - } + } // copy data for (j = 0; j < record->data_len; j++) { - record->data[j] = frame->data[i++]; + record->data[j] = frame->data[i++]; } // append the record and move on to next one mbus_data_record_append(data, record); data->nrecords++; } - + return 0; - } - + } + return -1; } @@ -2903,21 +2903,21 @@ mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data) 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) { data->type = MBUS_DATA_TYPE_ERROR; - + if (frame->data_size > 0) { data->error = (int) frame->data[0]; @@ -2926,7 +2926,7 @@ mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data) { data->error = 0; } - + return 0; } else if (frame->control_information == MBUS_CONTROL_INFO_RESP_FIXED) @@ -2934,10 +2934,10 @@ mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data) if (frame->data_size == 0) { snprintf(error_str, sizeof(error_str), "Got zero data_size."); - + return -1; } - + data->type = MBUS_DATA_TYPE_FIXED; return mbus_data_fixed_parse(frame, &(data->data_fix)); } @@ -2946,28 +2946,28 @@ mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data) if (frame->data_size == 0) { snprintf(error_str, sizeof(error_str), "Got zero data_size."); - + return -1; } - + data->type = MBUS_DATA_TYPE_VARIABLE; return mbus_data_variable_parse(frame, &(data->data_var)); } else { snprintf(error_str, sizeof(error_str), "Unknown control information 0x%.2x", frame->control_information); - + return -1; } } - + snprintf(error_str, sizeof(error_str), "Wrong direction in frame (master to slave)"); - + return -1; } //------------------------------------------------------------------------------ -/// Pack the M-bus frame into a binary string representation that can be sent +/// Pack the M-bus frame into a binary string representation that can be sent /// on the bus. The binary packet format is different for the different types /// of M-bus frames. //------------------------------------------------------------------------------ @@ -2975,9 +2975,9 @@ int mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) { size_t i, offset = 0; - + if (frame && data) - { + { if (mbus_frame_calc_length(frame) == -1) { return -2; @@ -2987,19 +2987,19 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) { return -3; } - + switch (frame->type) { case MBUS_FRAME_TYPE_ACK: - + if (data_size < MBUS_FRAME_ACK_BASE_SIZE) { return -4; } - - data[offset++] = frame->start1; - - return offset; + + data[offset++] = frame->start1; + + return offset; case MBUS_FRAME_TYPE_SHORT: @@ -3007,22 +3007,22 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) { return -4; } - + data[offset++] = frame->start1; data[offset++] = frame->control; data[offset++] = frame->address; data[offset++] = frame->checksum; data[offset++] = frame->stop; - - return offset; + + return offset; case MBUS_FRAME_TYPE_CONTROL: - + if (data_size < MBUS_FRAME_CONTROL_BASE_SIZE) { return -4; } - + data[offset++] = frame->start1; data[offset++] = frame->length1; data[offset++] = frame->length2; @@ -3033,9 +3033,9 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) data[offset++] = frame->control_information; data[offset++] = frame->checksum; - data[offset++] = frame->stop; - - return offset; + data[offset++] = frame->stop; + + return offset; case MBUS_FRAME_TYPE_LONG: @@ -3057,15 +3057,15 @@ mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size) { data[offset++] = frame->data[i]; } - + data[offset++] = frame->checksum; - data[offset++] = frame->stop; - - return offset; - + data[offset++] = frame->stop; + + return offset; + default: return -5; - } + } } return -1; @@ -3089,11 +3089,11 @@ mbus_frame_internal_pack(mbus_frame *frame, mbus_frame_data *frame_data) switch (frame_data->type) { case MBUS_DATA_TYPE_ERROR: - + frame->data[frame->data_size++] = (char) frame_data->error; - + break; - + case MBUS_DATA_TYPE_FIXED: // @@ -3160,14 +3160,14 @@ mbus_frame_internal_pack(mbus_frame *frame, mbus_frame_data *frame_data) } // pack data - if (parse_debug) + if (parse_debug) printf("%s: packing data [%zu : %zu]", __PRETTY_FUNCTION__, frame->data_size, record->data_len); for (j = 0; j < record->data_len; j++) { frame->data[frame->data_size++] = record->data[j]; } - } - + } + break; default: @@ -3184,7 +3184,7 @@ mbus_frame_internal_pack(mbus_frame *frame, mbus_frame_data *frame_data) //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -/// Switch parse debugging +/// Switch parse debugging //------------------------------------------------------------------------------ void mbus_parse_set_debug(int debug) @@ -3235,20 +3235,20 @@ mbus_frame_data_print(mbus_frame_data *data) { if (data->type == MBUS_DATA_TYPE_ERROR) { - return mbus_data_error_print(data->error); + return mbus_data_error_print(data->error); } - + if (data->type == MBUS_DATA_TYPE_FIXED) { return mbus_data_fixed_print(&(data->data_fix)); } - + if (data->type == MBUS_DATA_TYPE_VARIABLE) { return mbus_data_variable_print(&(data->data_var)); } } - + return -1; } @@ -3260,14 +3260,14 @@ mbus_data_variable_header_print(mbus_data_variable_header *header) { if (header) { - printf("%s: ID = %lld\n", __PRETTY_FUNCTION__, + printf("%s: ID = %lld\n", __PRETTY_FUNCTION__, mbus_data_bcd_decode(header->id_bcd, 4)); printf("%s: Manufacturer = 0x%.2X%.2X\n", __PRETTY_FUNCTION__, header->manufacturer[1], header->manufacturer[0]); - + printf("%s: Manufacturer = %s\n", __PRETTY_FUNCTION__, - mbus_decode_manufacturer(header->manufacturer[0], header->manufacturer[1])); + mbus_decode_manufacturer(header->manufacturer[0], header->manufacturer[1])); printf("%s: Version = 0x%.2X\n", __PRETTY_FUNCTION__, header->version); printf("%s: Medium = %s (0x%.2X)\n", __PRETTY_FUNCTION__, mbus_data_variable_medium_lookup(header->medium), header->medium); @@ -3277,7 +3277,7 @@ mbus_data_variable_header_print(mbus_data_variable_header *header) header->signature[1], header->signature[0]); } - + return -1; } @@ -3286,11 +3286,11 @@ mbus_data_variable_print(mbus_data_variable *data) { mbus_data_record *record; size_t j; - + if (data) - { + { mbus_data_variable_header_print(&(data->header)); - + for (record = data->record; record; record = record->next) { // DIF @@ -3300,23 +3300,23 @@ mbus_data_variable_print(mbus_data_variable *data) printf("DIF.Data = %.2X\n", record->drh.dib.dif & 0x0F); // VENDOR SPECIFIC - if ((record->drh.dib.dif == MBUS_DIB_DIF_MANUFACTURER_SPECIFIC) || + if ((record->drh.dib.dif == MBUS_DIB_DIF_MANUFACTURER_SPECIFIC) || (record->drh.dib.dif == MBUS_DIB_DIF_MORE_RECORDS_FOLLOW)) //MBUS_DIB_DIF_VENDOR_SPECIFIC { printf("%s: VENDOR DATA [size=%zd] = ", __PRETTY_FUNCTION__, record->data_len); for (j = 0; j < record->data_len; j++) { - printf("%.2X ", record->data[j]); + printf("%.2X ", record->data[j]); } printf("\n"); - + if (record->drh.dib.dif == MBUS_DIB_DIF_MORE_RECORDS_FOLLOW) { printf("%s: More records follow in next telegram\n", __PRETTY_FUNCTION__); } continue; } - + // calculate length of data record printf("DATA LENGTH = %zd\n", record->data_len); @@ -3324,32 +3324,32 @@ mbus_data_variable_print(mbus_data_variable *data) for (j = 0; j < record->drh.dib.ndife; j++) { unsigned char dife = record->drh.dib.dife[j]; - + printf("DIFE[%zd] = %.2X\n", j, dife); - printf("DIFE[%zd].Extension = %s\n", j, (dife & MBUS_DIB_DIF_EXTENSION_BIT) ? "Yes" : "No"); + printf("DIFE[%zd].Extension = %s\n", j, (dife & MBUS_DIB_DIF_EXTENSION_BIT) ? "Yes" : "No"); printf("DIFE[%zd].Function = %s\n", j, (dife & 0x30) ? "Minimum value" : "Instantaneous value" ); - printf("DIFE[%zd].Data = %.2X\n", j, dife & 0x0F); + printf("DIFE[%zd].Data = %.2X\n", j, dife & 0x0F); } - + // VIF printf("VIF = %.2X\n", record->drh.vib.vif); printf("VIF.Extension = %s\n", (record->drh.vib.vif & MBUS_DIB_VIF_EXTENSION_BIT) ? "Yes":"No"); printf("VIF.Value = %.2X\n", record->drh.vib.vif & MBUS_DIB_VIF_WITHOUT_EXTENSION); - + // VIFE for (j = 0; j < record->drh.vib.nvife; j++) { unsigned char vife = record->drh.vib.vife[j]; - + printf("VIFE[%zd] = %.2X\n", j, vife); printf("VIFE[%zd].Extension = %s\n", j, (vife & MBUS_DIB_VIF_EXTENSION_BIT) ? "Yes" : "No"); - printf("VIFE[%zd].Value = %.2X\n", j, vife & MBUS_DIB_VIF_WITHOUT_EXTENSION); + printf("VIFE[%zd].Value = %.2X\n", j, vife & MBUS_DIB_VIF_WITHOUT_EXTENSION); } - + printf("\n"); } } - + return -1; } @@ -3357,12 +3357,12 @@ int mbus_data_fixed_print(mbus_data_fixed *data) { if (data) - { + { printf("%s: ID = %d\n", __PRETTY_FUNCTION__, (int)mbus_data_bcd_decode(data->id_bcd, 4)); printf("%s: Access # = 0x%.2X\n", __PRETTY_FUNCTION__, data->tx_cnt); printf("%s: Status = 0x%.2X\n", __PRETTY_FUNCTION__, data->status); printf("%s: Function = %s\n", __PRETTY_FUNCTION__, mbus_data_fixed_function(data->status)); - + printf("%s: Medium1 = %s\n", __PRETTY_FUNCTION__, mbus_data_fixed_medium(data)); printf("%s: Unit1 = %s\n", __PRETTY_FUNCTION__, mbus_data_fixed_unit(data->cnt1_type)); if ((data->status & MBUS_DATA_FIXED_STATUS_FORMAT_MASK) == MBUS_DATA_FIXED_STATUS_FORMAT_BCD) @@ -3382,10 +3382,10 @@ mbus_data_fixed_print(mbus_data_fixed *data) } else { - printf("%s: Counter2 = %d\n", __PRETTY_FUNCTION__, mbus_data_int_decode(data->cnt2_val, 4)); - } + printf("%s: Counter2 = %d\n", __PRETTY_FUNCTION__, mbus_data_int_decode(data->cnt2_val, 4)); + } } - + return -1; } @@ -3396,29 +3396,29 @@ mbus_hex_dump(const char *label, const char *buff, size_t len) struct tm * timeinfo; char timestamp[21]; size_t i; - + if (label == NULL || buff == NULL) return; - + time ( &rawtime ); timeinfo = gmtime ( &rawtime ); - + strftime(timestamp,20,"%Y-%m-%d %H:%M:%S",timeinfo); fprintf(stderr, "[%s] %s (%03zu):", timestamp, label, len); - + for (i = 0; i < len; i++) { fprintf(stderr, " %02X", (unsigned char) buff[i]); } - + fprintf(stderr, "\n"); } int mbus_data_error_print(int error) -{ +{ printf("%s: Error = %d\n", __PRETTY_FUNCTION__, error); - + return -1; } @@ -3437,22 +3437,22 @@ void mbus_str_xml_encode(unsigned char *dst, const unsigned char *src, size_t max_len) { size_t i, len; - + i = 0; len = 0; - + if (dst == NULL) return; - + if (src != NULL) { - while((len+6) < max_len) + while((len+6) < max_len) { if (src[i] == '\0') { break; } - + if (iscntrl(src[i])) { // convert all control chars into spaces @@ -3479,11 +3479,11 @@ mbus_str_xml_encode(unsigned char *dst, const unsigned char *src, size_t max_len break; } } - + i++; } } - + dst[len] = '\0'; } @@ -3497,24 +3497,24 @@ mbus_data_variable_header_xml(mbus_data_variable_header *header) char str_encoded[768]; size_t len = 0; int val; - + if (header) { len += snprintf(&buff[len], sizeof(buff) - len, " \n"); val = (int)mbus_data_bcd_decode(header->id_bcd, 4); - + len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", val); len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", - mbus_decode_manufacturer(header->manufacturer[0], header->manufacturer[1])); + mbus_decode_manufacturer(header->manufacturer[0], header->manufacturer[1])); len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", header->version); - + mbus_str_xml_encode(str_encoded, mbus_data_product_name(header), sizeof(str_encoded)); - + len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); - - mbus_str_xml_encode(str_encoded, mbus_data_variable_medium_lookup(header->medium), sizeof(str_encoded)); - + + mbus_str_xml_encode(str_encoded, mbus_data_variable_medium_lookup(header->medium), sizeof(str_encoded)); + len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", header->access_no); len += snprintf(&buff[len], sizeof(buff) - len, " %.2X\n", header->status); @@ -3524,8 +3524,8 @@ mbus_data_variable_header_xml(mbus_data_variable_header *header) return buff; } - - return ""; + + return ""; } //------------------------------------------------------------------------------ @@ -3539,63 +3539,63 @@ mbus_data_variable_record_xml(mbus_data_record *record, int record_cnt, int fram size_t len = 0; struct tm * timeinfo; char timestamp[21]; - + if (record) { if (frame_cnt >= 0) { - len += snprintf(&buff[len], sizeof(buff) - len, + len += snprintf(&buff[len], sizeof(buff) - len, " \n", record_cnt, frame_cnt); } else { - len += snprintf(&buff[len], sizeof(buff) - len, + len += snprintf(&buff[len], sizeof(buff) - len, " \n", record_cnt); } - + if (record->drh.dib.dif == MBUS_DIB_DIF_MANUFACTURER_SPECIFIC) // MBUS_DIB_DIF_VENDOR_SPECIFIC { - len += snprintf(&buff[len], sizeof(buff) - len, - " Manufacturer specific\n"); + len += snprintf(&buff[len], sizeof(buff) - len, + " Manufacturer specific\n"); } else if (record->drh.dib.dif == MBUS_DIB_DIF_MORE_RECORDS_FOLLOW) { - len += snprintf(&buff[len], sizeof(buff) - len, + len += snprintf(&buff[len], sizeof(buff) - len, " More records follow\n"); } else - { - mbus_str_xml_encode(str_encoded, mbus_data_record_function(record), sizeof(str_encoded)); - len += snprintf(&buff[len], sizeof(buff) - len, + { + mbus_str_xml_encode(str_encoded, mbus_data_record_function(record), sizeof(str_encoded)); + len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); - + mbus_str_xml_encode(str_encoded, mbus_data_record_unit(record), sizeof(str_encoded)); - len += snprintf(&buff[len], sizeof(buff) - len, + len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); } - + mbus_str_xml_encode(str_encoded, mbus_data_record_value(record), sizeof(str_encoded)); len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded); if (record->timestamp > 0) - { + { timeinfo = gmtime (&(record->timestamp)); strftime(timestamp,20,"%Y-%m-%dT%H:%M:%S",timeinfo); len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", timestamp); } - + len += snprintf(&buff[len], sizeof(buff) - len, " \n\n"); - + return buff; } - - return ""; + + return ""; } //------------------------------------------------------------------------------ -/// Generate XML for variable-length data +/// Generate XML for variable-length data //------------------------------------------------------------------------------ char * mbus_data_variable_xml(mbus_data_variable *data) @@ -3604,43 +3604,43 @@ mbus_data_variable_xml(mbus_data_variable *data) char *buff = NULL, *new_buff; size_t len = 0, buff_size = 8192; int i; - + if (data) { buff = (char*) malloc(buff_size); - + if (buff == NULL) return NULL; - + len += snprintf(&buff[len], buff_size - len, "\n\n"); - - len += snprintf(&buff[len], buff_size - len, "%s", + + len += snprintf(&buff[len], buff_size - len, "%s", mbus_data_variable_header_xml(&(data->header))); - + for (record = data->record, i = 0; record; record = record->next, i++) { if ((buff_size - len) < 1024) { buff_size *= 2; new_buff = (char*) realloc(buff,buff_size); - + if (new_buff == NULL) { free(buff); return NULL; } - + buff = new_buff; } - - len += snprintf(&buff[len], buff_size - len, "%s", - mbus_data_variable_record_xml(record, i, -1, &(data->header))); - } + + len += snprintf(&buff[len], buff_size - len, "%s", + mbus_data_variable_record_xml(record, i, -1, &(data->header))); + } len += snprintf(&buff[len], buff_size - len, "\n"); return buff; } - + return NULL; } @@ -3657,27 +3657,27 @@ mbus_data_fixed_xml(mbus_data_fixed *data) if (data) { buff = (char*) malloc(buff_size); - + if (buff == NULL) return NULL; - + len += snprintf(&buff[len], buff_size - len, "\n\n"); - + len += snprintf(&buff[len], buff_size - len, " \n"); len += snprintf(&buff[len], buff_size - len, " %d\n", (int)mbus_data_bcd_decode(data->id_bcd, 4)); - - mbus_str_xml_encode(str_encoded, mbus_data_fixed_medium(data), sizeof(str_encoded)); + + mbus_str_xml_encode(str_encoded, mbus_data_fixed_medium(data), sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); - + len += snprintf(&buff[len], buff_size - len, " %d\n", data->tx_cnt); len += snprintf(&buff[len], buff_size - len, " %.2X\n", data->status); len += snprintf(&buff[len], buff_size - len, " \n\n"); - + len += snprintf(&buff[len], buff_size - len, " \n"); - + mbus_str_xml_encode(str_encoded, mbus_data_fixed_function(data->status), sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); - + mbus_str_xml_encode(str_encoded, mbus_data_fixed_unit(data->cnt1_type), sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); if ((data->status & MBUS_DATA_FIXED_STATUS_FORMAT_MASK) == MBUS_DATA_FIXED_STATUS_FORMAT_BCD) @@ -3688,13 +3688,13 @@ mbus_data_fixed_xml(mbus_data_fixed *data) { len += snprintf(&buff[len], buff_size - len, " %d\n", mbus_data_int_decode(data->cnt1_val, 4)); } - len += snprintf(&buff[len], buff_size - len, " \n\n"); + len += snprintf(&buff[len], buff_size - len, " \n\n"); len += snprintf(&buff[len], buff_size - len, " \n"); - + mbus_str_xml_encode(str_encoded, mbus_data_fixed_function(data->status), sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); - + mbus_str_xml_encode(str_encoded, mbus_data_fixed_unit(data->cnt2_type), sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); if ((data->status & MBUS_DATA_FIXED_STATUS_FORMAT_MASK) == MBUS_DATA_FIXED_STATUS_FORMAT_BCD) @@ -3705,13 +3705,13 @@ mbus_data_fixed_xml(mbus_data_fixed *data) { len += snprintf(&buff[len], buff_size - len, " %d\n", mbus_data_int_decode(data->cnt2_val, 4)); } - len += snprintf(&buff[len], buff_size - len, " \n\n"); + len += snprintf(&buff[len], buff_size - len, " \n\n"); len += snprintf(&buff[len], buff_size - len, "\n"); return buff; } - + return NULL; } @@ -3724,23 +3724,23 @@ mbus_data_error_xml(int error) char *buff = NULL; char str_encoded[256]; size_t len = 0, buff_size = 8192; - + buff = (char*) malloc(buff_size); - + if (buff == NULL) return NULL; len += snprintf(&buff[len], buff_size - len, "\n\n"); - + len += snprintf(&buff[len], buff_size - len, " \n"); - mbus_str_xml_encode(str_encoded, mbus_data_error_lookup(error), sizeof(str_encoded)); + mbus_str_xml_encode(str_encoded, mbus_data_error_lookup(error), sizeof(str_encoded)); len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded); - + len += snprintf(&buff[len], buff_size - len, " \n\n"); - + len += snprintf(&buff[len], buff_size - len, "\n"); - + return buff; } @@ -3756,18 +3756,18 @@ mbus_frame_data_xml(mbus_frame_data *data) { return mbus_data_error_xml(data->error); } - + if (data->type == MBUS_DATA_TYPE_FIXED) { return mbus_data_fixed_xml(&(data->data_fix)); } - + if (data->type == MBUS_DATA_TYPE_VARIABLE) { return mbus_data_variable_xml(&(data->data_var)); } } - + return NULL; } @@ -3780,7 +3780,7 @@ mbus_frame_xml(mbus_frame *frame) { mbus_frame_data frame_data; mbus_frame *iter; - + mbus_data_record *record; char *buff = NULL, *new_buff; @@ -3790,13 +3790,13 @@ mbus_frame_xml(mbus_frame *frame) if (frame) { memset((void *)&frame_data, 0, sizeof(mbus_frame_data)); - + if (mbus_frame_data_parse(frame, &frame_data) == -1) { mbus_error_str_set("M-bus data parse error."); return NULL; } - + if (frame_data.type == MBUS_DATA_TYPE_ERROR) { // @@ -3804,41 +3804,41 @@ mbus_frame_xml(mbus_frame *frame) // return mbus_data_error_xml(frame_data.error); } - + if (frame_data.type == MBUS_DATA_TYPE_FIXED) { // - // generate XML for fixed data + // generate XML for fixed data // return mbus_data_fixed_xml(&(frame_data.data_fix)); } - + if (frame_data.type == MBUS_DATA_TYPE_VARIABLE) { // // generate XML for a sequence of variable data frames // - + buff = (char*) malloc(buff_size); - + if (buff == NULL) { mbus_data_record_free(frame_data.data_var.record); return NULL; - } + } // include frame counter in XML output if more than one frame - // is available (frame_cnt = -1 => not included in output) + // is available (frame_cnt = -1 => not included in output) frame_cnt = (frame->next == NULL) ? -1 : 0; len += snprintf(&buff[len], buff_size - len, "\n\n"); - - // only print the header info for the first frame (should be - // the same for each frame in a sequence of a multi-telegram + + // only print the header info for the first frame (should be + // the same for each frame in a sequence of a multi-telegram // transfer. - len += snprintf(&buff[len], buff_size - len, "%s", + len += snprintf(&buff[len], buff_size - len, "%s", mbus_data_variable_header_xml(&(frame_data.data_var.header))); - + // loop through all records in the current frame, using a global // record count as record ID in the XML output for (record = frame_data.data_var.record; record; record = record->next, record_cnt++) @@ -3847,29 +3847,29 @@ mbus_frame_xml(mbus_frame *frame) { buff_size *= 2; new_buff = (char*) realloc(buff,buff_size); - + if (new_buff == NULL) { free(buff); mbus_data_record_free(frame_data.data_var.record); return NULL; } - + buff = new_buff; } - - len += snprintf(&buff[len], buff_size - len, "%s", - mbus_data_variable_record_xml(record, record_cnt, frame_cnt, &(frame_data.data_var.header))); - } + + len += snprintf(&buff[len], buff_size - len, "%s", + mbus_data_variable_record_xml(record, record_cnt, frame_cnt, &(frame_data.data_var.header))); + } // free all records in the list if (frame_data.data_var.record) { - mbus_data_record_free(frame_data.data_var.record); + mbus_data_record_free(frame_data.data_var.record); } - + frame_cnt++; - + for (iter = frame->next; iter; iter = iter->next, frame_cnt++) { if (mbus_frame_data_parse(iter, &frame_data) == -1) @@ -3877,7 +3877,7 @@ mbus_frame_xml(mbus_frame *frame) mbus_error_str_set("M-bus variable data parse error."); return NULL; } - + // loop through all records in the current frame, using a global // record count as record ID in the XML output for (record = frame_data.data_var.record; record; record = record->next, record_cnt++) @@ -3886,36 +3886,36 @@ mbus_frame_xml(mbus_frame *frame) { buff_size *= 2; new_buff = (char*) realloc(buff,buff_size); - + if (new_buff == NULL) { free(buff); mbus_data_record_free(frame_data.data_var.record); return NULL; } - + buff = new_buff; } - - len += snprintf(&buff[len], buff_size - len, "%s", - mbus_data_variable_record_xml(record, record_cnt, frame_cnt, &(frame_data.data_var.header))); - } + + len += snprintf(&buff[len], buff_size - len, "%s", + mbus_data_variable_record_xml(record, record_cnt, frame_cnt, &(frame_data.data_var.header))); + } // free all records in the list if (frame_data.data_var.record) { - mbus_data_record_free(frame_data.data_var.record); + mbus_data_record_free(frame_data.data_var.record); } - } - + } + len += snprintf(&buff[len], buff_size - len, "\n"); - + return buff; } } - + return NULL; -} +} //------------------------------------------------------------------------------ @@ -3930,9 +3930,9 @@ mbus_frame_data_new() { return NULL; } - + memset(data, 0, sizeof(mbus_frame_data)); - + data->data_var.data = NULL; data->data_var.record = NULL; @@ -3975,7 +3975,7 @@ mbus_data_record_new() memset(record, 0, sizeof(mbus_data_record)); record->next = NULL; - return record; + return record; } //------------------------------------------------------------------------------ @@ -4061,10 +4061,10 @@ mbus_frame_get_secondary_address(mbus_frame *frame) data->data_var.header.manufacturer[1], data->data_var.header.version, data->data_var.header.medium); - + // free data mbus_frame_data_free(data); - + return addr; } @@ -4082,7 +4082,7 @@ mbus_frame_select_secondary_pack(mbus_frame *frame, char *address) snprintf(error_str, sizeof(error_str), "%s: frame or address arguments are NULL.", __PRETTY_FUNCTION__); return -1; } - + if (mbus_is_secondary_address(address) == 0) { snprintf(error_str, sizeof(error_str), "%s: address is invalid.", __PRETTY_FUNCTION__); @@ -4090,13 +4090,13 @@ mbus_frame_select_secondary_pack(mbus_frame *frame, char *address) } frame->control = MBUS_CONTROL_MASK_SND_UD | MBUS_CONTROL_MASK_DIR_M2S | MBUS_CONTROL_MASK_FCB; - frame->address = MBUS_ADDRESS_NETWORK_LAYER; // for addressing secondary slaves + frame->address = MBUS_ADDRESS_NETWORK_LAYER; // for addressing secondary slaves frame->control_information = MBUS_CONTROL_INFO_SELECT_SLAVE; // mode 1 - + frame->data_size = 8; // parse secondary_addr_str and populate frame->data[0-7] - // ex: secondary_addr_str = "14491001 1057 01 06" + // ex: secondary_addr_str = "14491001 1057 01 06" // (excluding the blank spaces) strncpy(tmp, &address[14], 2); tmp[2] = 0; @@ -4154,18 +4154,18 @@ int mbus_is_secondary_address(const char * value) { int i; - + if (value == NULL) return 0; - + if (strlen(value) != 16) return 0; - + for (i = 0; i < 16; i++) { if (!isxdigit(value[i])) return 0; } - + return 1; } diff --git a/mbus/mbus-protocol.h b/mbus/mbus-protocol.h index a4657dd..cbc5c7b 100755 --- a/mbus/mbus-protocol.h +++ b/mbus/mbus-protocol.h @@ -2,7 +2,7 @@ // Copyright (C) 2010-2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -10,7 +10,7 @@ /** * @file mbus-protocol.h - * + * * @brief Functions and data structures for M-Bus protocol parsing. * */ @@ -82,13 +82,13 @@ typedef struct _mbus_frame { // variable data field unsigned char checksum; unsigned char stop; - - unsigned char data[252]; + + unsigned char data[252]; size_t data_size; - + int type; time_t timestamp; - + //mbus_frame_data frame_data; void *next; // pointer to next mbus_frame for multi-telegram replies @@ -99,7 +99,7 @@ typedef struct _mbus_slave_data { int state_fcb; int state_acd; - + } mbus_slave_data; #define NITEMS(x) (sizeof(x)/sizeof(x[0])) @@ -134,7 +134,7 @@ typedef struct _mbus_slave_data { typedef struct _mbus_data_information_block { - + unsigned char dif; unsigned char dife[10]; size_t ndife; @@ -142,7 +142,7 @@ typedef struct _mbus_data_information_block { } mbus_data_information_block; typedef struct _mbus_value_information_block { - + unsigned char vif; unsigned char vife[10]; size_t nvife; @@ -152,18 +152,18 @@ typedef struct _mbus_value_information_block { } mbus_value_information_block; typedef struct _mbus_data_record_header { - + mbus_data_information_block dib; - mbus_value_information_block vib; + mbus_value_information_block vib; } mbus_data_record_header; typedef struct _mbus_data_record { - + mbus_data_record_header drh; unsigned char data[234]; - size_t data_len; + size_t data_len; time_t timestamp; @@ -171,25 +171,25 @@ typedef struct _mbus_data_record { } mbus_data_record; -// +// // HEADER FOR VARIABLE LENGTH DATA FORMAT -// +// typedef struct _mbus_data_variable_header { - + //Ident.Nr. Manufr. Version Medium Access No. Status Signature //4 Byte 2 Byte 1 Byte 1 Byte 1 Byte 1 Byte 2 Byte - + // ex // 88 63 80 09 82 4D 02 04 15 00 00 00 - + unsigned char id_bcd[4]; // 88 63 80 09 - unsigned char manufacturer[2]; // 82 4D + unsigned char manufacturer[2]; // 82 4D unsigned char version; // 02 unsigned char medium; // 04 unsigned char access_no; // 15 unsigned char status; // 00 unsigned char signature[2]; // 00 00 - + } mbus_data_variable_header; #define MBUS_DATA_VARIABLE_HEADER_LENGTH 12 @@ -198,22 +198,22 @@ typedef struct _mbus_data_variable_header { // VARIABLE LENGTH DATA FORMAT // typedef struct _mbus_data_variable { - + mbus_data_variable_header header; - - mbus_data_record *record; + + mbus_data_record *record; size_t nrecords; - + unsigned char *data; size_t data_len; - + unsigned char more_records_follow; - + // are these needed/used? unsigned char mdh; unsigned char *mfg_data; - size_t mfg_data_len; - + size_t mfg_data_len; + } mbus_data_variable; // @@ -262,22 +262,22 @@ typedef struct _mbus_frame_data { } mbus_frame_data; -// +// // HEADER FOR SECONDARY ADDRESSING -// +// typedef struct _mbus_data_secondary_address { - - //Ident.Nr. Manufr. Version Medium - //4 Byte 2 Byte 1 Byte 1 Byte - + + //Ident.Nr. Manufr. Version Medium + //4 Byte 2 Byte 1 Byte 1 Byte + // ex // 14 49 10 01 10 57 01 06 - + unsigned char id_bcd[4]; // 14 49 10 01 unsigned char manufacturer[2]; // 10 57 unsigned char version; // 01 unsigned char medium; // 06 - + } mbus_data_secondary_address; @@ -309,7 +309,7 @@ typedef struct _mbus_data_secondary_address { #define MBUS_FRAME_FIXED_SIZE_ACK 1 #define MBUS_FRAME_FIXED_SIZE_SHORT 5 -#define MBUS_FRAME_FIXED_SIZE_CONTROL 6 +#define MBUS_FRAME_FIXED_SIZE_CONTROL 6 #define MBUS_FRAME_FIXED_SIZE_LONG 6 // @@ -463,7 +463,7 @@ typedef struct _mbus_data_secondary_address { // // VARIABLE DATA FLAGS -// +// #define MBUS_VARIABLE_DATA_MEDIUM_OTHER 0x00 #define MBUS_VARIABLE_DATA_MEDIUM_OIL 0x01 #define MBUS_VARIABLE_DATA_MEDIUM_ELECTRICITY 0x02 @@ -554,7 +554,7 @@ int mbus_data_fixed_parse (mbus_frame *frame, mbus_data_fixed *data); int mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data); int mbus_frame_data_parse (mbus_frame *frame, mbus_frame_data *data); - + int mbus_frame_pack(mbus_frame *frame, unsigned char *data, size_t data_size); int mbus_frame_verify(mbus_frame *frame); @@ -615,7 +615,7 @@ void mbus_hex_dump(const char *label, const char *buff, size_t len); int mbus_data_manufacturer_encode(unsigned char *m_data, unsigned char *m_code); const char *mbus_decode_manufacturer(unsigned char byte1, unsigned char byte2); const char *mbus_data_product_name(mbus_data_variable_header *header); - + int mbus_data_bcd_encode(unsigned char *bcd_data, size_t bcd_data_size, int value); int mbus_data_int_encode(unsigned char *int_data, size_t int_data_size, int value); diff --git a/mbus/mbus-serial.c b/mbus/mbus-serial.c index ccd8ce4..d120f8b 100755 --- a/mbus/mbus-serial.c +++ b/mbus/mbus-serial.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -105,7 +105,7 @@ mbus_serial_set_baudrate(mbus_handle *handle, long baudrate) return -1; serial_data = (mbus_serial_data *) handle->auxdata; - + if (serial_data == NULL) return -1; @@ -201,12 +201,12 @@ mbus_serial_data_free(mbus_handle *handle) if (handle) { serial_data = (mbus_serial_data *) handle->auxdata; - + if (serial_data == NULL) { return; } - + free(serial_data->device); free(serial_data); handle->auxdata = NULL; @@ -226,7 +226,7 @@ mbus_serial_send_frame(mbus_handle *handle, mbus_frame *frame) { return -1; } - + // Make sure serial connection is open if (isatty(handle->fd) == 0) { @@ -238,7 +238,7 @@ mbus_serial_send_frame(mbus_handle *handle, mbus_frame *frame) fprintf(stderr, "%s: mbus_frame_pack failed\n", __PRETTY_FUNCTION__); return -1; } - + #ifdef MBUS_SERIAL_DEBUG // if debug, dump in HEX form to stdout what we write to the serial port printf("%s: Dumping M-Bus frame [%d bytes]: ", __PRETTY_FUNCTION__, len); @@ -254,16 +254,16 @@ mbus_serial_send_frame(mbus_handle *handle, mbus_frame *frame) { // // call the send event function, if the callback function is registered - // + // if (_mbus_send_event) _mbus_send_event(MBUS_HANDLE_TYPE_SERIAL, buff, len); } else - { + { fprintf(stderr, "%s: Failed to write frame to socket (ret = %d: %s)\n", __PRETTY_FUNCTION__, ret, strerror(errno)); return -1; } - + // // wait until complete frame has been transmitted // @@ -281,13 +281,13 @@ mbus_serial_recv_frame(mbus_handle *handle, mbus_frame *frame) char buff[PACKET_BUFF_SIZE]; int remaining, timeouts; ssize_t len, nread; - + if (handle == NULL || frame == NULL) { fprintf(stderr, "%s: Invalid parameter.\n", __PRETTY_FUNCTION__); return MBUS_RECV_RESULT_ERROR; } - + // Make sure serial connection is open if (isatty(handle->fd) == 0) { @@ -310,7 +310,7 @@ mbus_serial_recv_frame(mbus_handle *handle, mbus_frame *frame) // avoid out of bounds access return MBUS_RECV_RESULT_ERROR; } - + //printf("%s: Attempt to read %d bytes [len = %d]\n", __PRETTY_FUNCTION__, remaining, len); if ((nread = read(handle->fd, &buff[len], remaining)) == -1) @@ -321,11 +321,11 @@ mbus_serial_recv_frame(mbus_handle *handle, mbus_frame *frame) } // printf("%s: Got %d byte [remaining %d, len %d]\n", __PRETTY_FUNCTION__, nread, remaining, len); - + if (nread == 0) { timeouts++; - + if (timeouts >= 3) { // abort to avoid endless loop @@ -333,7 +333,7 @@ mbus_serial_recv_frame(mbus_handle *handle, mbus_frame *frame) break; } } - + if (len > (SSIZE_MAX-nread)) { // avoid overflow @@ -349,13 +349,13 @@ mbus_serial_recv_frame(mbus_handle *handle, mbus_frame *frame) // No data received return MBUS_RECV_RESULT_TIMEOUT; } - + // // call the receive event function, if the callback function is registered - // + // if (_mbus_recv_event) _mbus_recv_event(MBUS_HANDLE_TYPE_SERIAL, buff, len); - + if (remaining != 0) { // Would be OK when e.g. scanning the bus, otherwise it is a failure. @@ -368,7 +368,7 @@ mbus_serial_recv_frame(mbus_handle *handle, mbus_frame *frame) fprintf(stderr, "%s: M-Bus layer failed to parse data.\n", __PRETTY_FUNCTION__); return MBUS_RECV_RESULT_ERROR; } - + return MBUS_RECV_RESULT_OK; } diff --git a/mbus/mbus-serial.h b/mbus/mbus-serial.h index edb1bb5..30fdebc 100755 --- a/mbus/mbus-serial.h +++ b/mbus/mbus-serial.h @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -10,7 +10,7 @@ /** * @file mbus-serial.h - * + * * @brief Functions and data structures for sending M-Bus data via RS232. * */ diff --git a/mbus/mbus-tcp.c b/mbus/mbus-tcp.c index c77b658..ebf0c65 100755 --- a/mbus/mbus-tcp.c +++ b/mbus/mbus-tcp.c @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -104,12 +104,12 @@ mbus_tcp_data_free(mbus_handle *handle) if (handle) { tcp_data = (mbus_tcp_data *) handle->auxdata; - + if (tcp_data == NULL) { return; } - + free(tcp_data->host); free(tcp_data); handle->auxdata = NULL; @@ -158,12 +158,12 @@ mbus_tcp_send_frame(mbus_handle *handle, mbus_frame *frame) { // // call the send event function, if the callback function is registered - // + // if (_mbus_send_event) _mbus_send_event(MBUS_HANDLE_TYPE_TCP, buff, len); } else - { + { snprintf(error_str, sizeof(error_str), "%s: Failed to write frame to socket (ret = %d)\n", __PRETTY_FUNCTION__, ret); mbus_error_str_set(error_str); return -1; @@ -224,7 +224,7 @@ retry: // avoid overflow return MBUS_RECV_RESULT_ERROR; } - + len += nread; } } while ((remaining = mbus_parse(frame, buff, len)) > 0); @@ -244,7 +244,7 @@ retry: } //------------------------------------------------------------------------------ -/// The the timeout in seconds that will be used as the amount of time the +/// The the timeout in seconds that will be used as the amount of time the /// a read operation will wait before giving up. Note: This configuration has /// to be made before calling mbus_tcp_connect. //------------------------------------------------------------------------------ @@ -256,7 +256,7 @@ mbus_tcp_set_timeout_set(double seconds) mbus_error_str_set("Invalid timeout (must be positive)."); return -1; } - + tcp_timeout_sec = (int)seconds; tcp_timeout_usec = (seconds - tcp_timeout_sec) * 1000000; diff --git a/mbus/mbus-tcp.h b/mbus/mbus-tcp.h index 03662f4..0d4e6b7 100755 --- a/mbus/mbus-tcp.h +++ b/mbus/mbus-tcp.h @@ -2,7 +2,7 @@ // Copyright (C) 2011, Robert Johansson, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -10,7 +10,7 @@ /** * @file mbus-tcp.h - * + * * @brief Functions and data structures for sending M-Bus data via TCP. * */ diff --git a/mbus/mbus.c b/mbus/mbus.c index aaced76..d2575c7 100644 --- a/mbus/mbus.c +++ b/mbus/mbus.c @@ -2,7 +2,7 @@ // Copyright (C) 2010, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // diff --git a/mbus/mbus.h b/mbus/mbus.h index dfa82cb..264c8e0 100644 --- a/mbus/mbus.h +++ b/mbus/mbus.h @@ -2,7 +2,7 @@ // Copyright (C) 2010, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -10,7 +10,7 @@ /** * @file mbus.h - * + * * @brief Main include file for the Freescada libmbus library. * * Include this file to access the libmbus API: @@ -20,7 +20,7 @@ * */ -/*! \mainpage libmbus +/*! \mainpage libmbus * * These pages contain automatically generated documentation for the libmbus * API. For examples on how to use the libmbus library, see the applications diff --git a/test/mbus_parse.c b/test/mbus_parse.c index 1659ca0..cf19c07 100644 --- a/test/mbus_parse.c +++ b/test/mbus_parse.c @@ -2,7 +2,7 @@ // Copyright (C) 2010, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -49,13 +49,13 @@ main(int argc, char *argv[]) memset(buf, 0, sizeof(buf)); len = fread(buf, 1, sizeof(buf), fp); - + if (ferror(fp) != 0) { fprintf(stderr, "%s: failed to read '%s'\n", argv[0], file); return 1; } - + fclose(fp); memset(&reply, 0, sizeof(reply)); @@ -63,9 +63,9 @@ main(int argc, char *argv[]) mbus_parse(&reply, buf, len); mbus_frame_data_parse(&reply, &frame_data); mbus_frame_print(&reply); - + xml_result = normalized ? mbus_frame_data_xml_normalized(&frame_data) : mbus_frame_data_xml(&frame_data); - + if (xml_result == NULL) { fprintf(stderr, "Failed to generate XML representation of MBUS frame: %s\n", mbus_error_str()); @@ -73,7 +73,7 @@ main(int argc, char *argv[]) } printf("%s", xml_result); free(xml_result); - + return 0; } diff --git a/test/mbus_parse_hex.c b/test/mbus_parse_hex.c index e1eb04b..1d3cd8a 100644 --- a/test/mbus_parse_hex.c +++ b/test/mbus_parse_hex.c @@ -2,7 +2,7 @@ // Copyright (C) 2010, Raditex AB // All rights reserved. // -// rSCADA +// rSCADA // http://www.rSCADA.se // info@rscada.se // @@ -24,7 +24,7 @@ main(int argc, char *argv[]) mbus_frame reply; mbus_frame_data frame_data; char *xml_result = NULL, *file = NULL; - + if (argc == 3 && strcmp(argv[1], "-n") == 0) { file = argv[2]; @@ -46,25 +46,25 @@ main(int argc, char *argv[]) fprintf(stderr, "%s: failed to open '%s'\n", argv[0], file); return 1; } - + memset(raw_buff, 0, sizeof(raw_buff)); len = fread(raw_buff, 1, sizeof(raw_buff), fp); - + if (ferror(fp) != 0) { fprintf(stderr, "%s: failed to read '%s'\n", argv[0], file); return 1; } - + fclose(fp); - + buff_len = mbus_hex2bin(buff,sizeof(buff),raw_buff,sizeof(raw_buff)); memset(&reply, 0, sizeof(reply)); memset(&frame_data, 0, sizeof(frame_data)); - + //mbus_parse_set_debug(1); - + result = mbus_parse(&reply, buff, buff_len); if (result < 0) @@ -77,21 +77,21 @@ main(int argc, char *argv[]) fprintf(stderr, "mbus_parse: need %d more bytes\n", result); return 1; } - + result = mbus_frame_data_parse(&reply, &frame_data); - + if (result != 0) { mbus_frame_print(&reply); fprintf(stderr, "mbus_frame_data_parse: %s\n", mbus_error_str()); return 1; } - + //mbus_frame_print(&reply); //mbus_frame_data_print(&frame_data); - + xml_result = normalized ? mbus_frame_data_xml_normalized(&frame_data) : mbus_frame_data_xml(&frame_data); - + if (xml_result == NULL) { fprintf(stderr, "Failed to generate XML representation of MBUS frame: %s\n", mbus_error_str()); @@ -100,7 +100,7 @@ main(int argc, char *argv[]) printf("%s", xml_result); free(xml_result); mbus_data_record_free(frame_data.data_var.record); - + return 0; }