Merge pull request #59 from lategoodbye/master
Remove trailing whitespace
This commit is contained in:
commit
3e24215e51
@ -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; c<argc-2; c++)
|
||||
{
|
||||
if (strcmp(argv[c], "-d") == 0)
|
||||
if (strcmp(argv[c], "-d") == 0)
|
||||
{
|
||||
debug = 1;
|
||||
}
|
||||
}
|
||||
else if (strcmp(argv[c], "-b") == 0)
|
||||
{
|
||||
c++;
|
||||
baudrate = atol(argv[c]);
|
||||
}
|
||||
}
|
||||
else if (strcmp(argv[c], "-f") == 0)
|
||||
{
|
||||
c++;
|
||||
maxframes = atoi(argv[c]);
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_abort(argv);
|
||||
}
|
||||
@ -100,16 +100,16 @@ main(int argc, char **argv)
|
||||
{
|
||||
parse_abort(argv);
|
||||
}
|
||||
device = argv[c];
|
||||
device = argv[c];
|
||||
addr_str = argv[c+1];
|
||||
|
||||
|
||||
|
||||
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, "Could not initialize M-Bus context: %s\n", mbus_error_str());
|
||||
@ -130,7 +130,7 @@ main(int argc, char **argv)
|
||||
mbus_context_free(handle);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if (init_slaves(handle) == 0)
|
||||
{
|
||||
mbus_disconnect(handle);
|
||||
@ -165,19 +165,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)
|
||||
{
|
||||
@ -207,14 +207,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;
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
// Copyright (C) 2011, Robert Johansson, Raditex AB
|
||||
// All rights reserved.
|
||||
//
|
||||
// rSCADA
|
||||
// rSCADA
|
||||
// http://www.rSCADA.se
|
||||
// info@rscada.se
|
||||
//
|
||||
@ -28,48 +28,48 @@ main(int argc, char **argv)
|
||||
char *device, *addr_str, *xml_result;
|
||||
int address;
|
||||
long baudrate = 9600;
|
||||
|
||||
|
||||
memset((void *)&reply, 0, sizeof(mbus_frame));
|
||||
memset((void *)&reply_data, 0, sizeof(mbus_frame_data));
|
||||
|
||||
if (argc == 3)
|
||||
{
|
||||
device = argv[1];
|
||||
device = argv[1];
|
||||
addr_str = argv[2];
|
||||
}
|
||||
else if (argc == 4 && strcmp(argv[1], "-d") == 0)
|
||||
{
|
||||
device = argv[2];
|
||||
device = argv[2];
|
||||
addr_str = argv[3];
|
||||
debug = 1;
|
||||
}
|
||||
else if (argc == 5 && strcmp(argv[1], "-b") == 0)
|
||||
{
|
||||
baudrate = atol(argv[2]);
|
||||
device = argv[3];
|
||||
device = argv[3];
|
||||
addr_str = argv[4];
|
||||
}
|
||||
else if (argc == 6 && strcmp(argv[1], "-d") == 0 && strcmp(argv[2], "-b") == 0)
|
||||
{
|
||||
baudrate = atol(argv[3]);
|
||||
device = argv[4];
|
||||
device = argv[4];
|
||||
addr_str = argv[5];
|
||||
debug = 1;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "usage: %s [-d] [-b BAUDRATE] device mbus-address\n", argv[0]);
|
||||
fprintf(stderr, " optional flag -d for debug printout\n");
|
||||
fprintf(stderr, " optional flag -b for selecting baudrate\n");
|
||||
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, "Could not initialize M-Bus context: %s\n", mbus_error_str());
|
||||
@ -110,7 +110,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
|
||||
|
||||
@ -119,7 +119,7 @@ main(int argc, char **argv)
|
||||
fprintf(stderr, "Failed to send M-Bus request frame.\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// primary addressing
|
||||
@ -130,13 +130,13 @@ 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)
|
||||
{
|
||||
fprintf(stderr, "Failed to receive M-Bus response frame.\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// parse data and print in XML format
|
||||
@ -151,13 +151,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);
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
// Copyright (C) 2011, Robert Johansson, Raditex AB
|
||||
// All rights reserved.
|
||||
//
|
||||
// rSCADA
|
||||
// rSCADA
|
||||
// http://www.rSCADA.se
|
||||
// info@rscada.se
|
||||
//
|
||||
@ -20,10 +20,10 @@ static int debug = 0;
|
||||
//
|
||||
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;
|
||||
@ -35,7 +35,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_BROADCAST_NOREPLY, 1) == -1)
|
||||
{
|
||||
return 0;
|
||||
@ -55,58 +55,58 @@ main(int argc, char **argv)
|
||||
long baudrate = 9600;
|
||||
mbus_handle *handle = NULL;
|
||||
mbus_frame *frame = NULL, reply;
|
||||
|
||||
|
||||
memset((void *)&reply, 0, sizeof(mbus_frame));
|
||||
|
||||
if (argc == 2)
|
||||
{
|
||||
device = argv[1];
|
||||
device = argv[1];
|
||||
addr_mask = strdup("FFFFFFFFFFFFFFFF");
|
||||
}
|
||||
else if (argc == 3 && strcmp(argv[1], "-d") == 0)
|
||||
{
|
||||
device = argv[2];
|
||||
device = argv[2];
|
||||
addr_mask = strdup("FFFFFFFFFFFFFFFF");
|
||||
debug = 1;
|
||||
}
|
||||
else if (argc == 3)
|
||||
{
|
||||
device = argv[1];
|
||||
device = argv[1];
|
||||
addr_mask = strdup(argv[2]);
|
||||
}
|
||||
else if (argc == 4 && strcmp(argv[1], "-d") == 0)
|
||||
{
|
||||
device = argv[2];
|
||||
device = argv[2];
|
||||
addr_mask = strdup(argv[3]);
|
||||
debug = 1;
|
||||
}
|
||||
else if (argc == 4 && strcmp(argv[1], "-b") == 0)
|
||||
{
|
||||
baudrate = atol(argv[2]);
|
||||
device = argv[3];
|
||||
device = argv[3];
|
||||
addr_mask = strdup("FFFFFFFFFFFFFFFF");
|
||||
}
|
||||
else if (argc == 5 && strcmp(argv[1], "-d") == 0 && strcmp(argv[2], "-b") == 0)
|
||||
{
|
||||
baudrate = atol(argv[3]);
|
||||
device = argv[4];
|
||||
device = argv[4];
|
||||
addr_mask = strdup("FFFFFFFFFFFFFFFF");
|
||||
debug = 1;
|
||||
}
|
||||
else if (argc == 5 && strcmp(argv[1], "-b") == 0)
|
||||
{
|
||||
baudrate = atol(argv[2]);
|
||||
device = argv[3];
|
||||
device = argv[3];
|
||||
addr_mask = strdup(argv[4]);
|
||||
}
|
||||
else if (argc == 6 && strcmp(argv[1], "-d") == 0)
|
||||
{
|
||||
baudrate = atol(argv[3]);
|
||||
device = argv[4];
|
||||
device = argv[4];
|
||||
addr_mask = strdup(argv[5]);
|
||||
debug = 1;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "usage: %s [-d] [-b BAUDRATE] device [address-mask]\n", argv[0]);
|
||||
fprintf(stderr, "\toptional flag -d for debug printout\n");
|
||||
@ -115,19 +115,19 @@ main(int argc, char **argv)
|
||||
fprintf(stderr, "\t'FFFFFFFFFFFFFFFF' where F is a wildcard character\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (debug)
|
||||
{
|
||||
mbus_register_send_event(&mbus_dump_send_event);
|
||||
mbus_register_recv_event(&mbus_dump_recv_event);
|
||||
}
|
||||
|
||||
|
||||
if (addr_mask == NULL)
|
||||
{
|
||||
fprintf(stderr, "Failed to allocate address mask.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if (mbus_is_secondary_address(addr_mask) == 0)
|
||||
{
|
||||
fprintf(stderr, "Misformatted secondary address mask. Must be 16 character HEX number.\n");
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
//
|
||||
|
@ -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<argc-3; c++)
|
||||
{
|
||||
if (strcmp(argv[c], "-d") == 0)
|
||||
if (strcmp(argv[c], "-d") == 0)
|
||||
{
|
||||
debug = 1;
|
||||
}
|
||||
@ -85,8 +85,8 @@ main(int argc, char **argv)
|
||||
{
|
||||
c++;
|
||||
maxframes = atoi(argv[c]);
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_abort(argv);
|
||||
}
|
||||
@ -95,22 +95,22 @@ main(int argc, char **argv)
|
||||
{
|
||||
parse_abort(argv);
|
||||
}
|
||||
host = argv[c];
|
||||
host = argv[c];
|
||||
port = atol(argv[c+1]);
|
||||
addr_str = argv[c+2];
|
||||
|
||||
|
||||
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());
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
1222
mbus/mbus-protocol.c
1222
mbus/mbus-protocol.c
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
*
|
||||
*/
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
*
|
||||
*/
|
||||
|
@ -2,7 +2,7 @@
|
||||
// Copyright (C) 2010, Raditex AB
|
||||
// All rights reserved.
|
||||
//
|
||||
// rSCADA
|
||||
// rSCADA
|
||||
// http://www.rSCADA.se
|
||||
// info@rscada.se
|
||||
//
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user