Skip to content
Snippets Groups Projects

remote-station: Add Makefile to create self installation script

Merged Jonas Höppner requested to merge tr8mp-emc-test-fixes into kirkstone
+ 117
115
@@ -105,7 +105,7 @@ int use_rs485 = TRUE; /* Use RS485 mode */
int use_rtscts = FALSE; /* Use RTSCTS flowcontrol (not available in RS485 mode) */
int echo_mode = FALSE; /* Start in echo mode */
int tx_only_mode = FALSE; /* Start in tx only mode, */
int echo_package_mode = FALSE; /* Add package header to returned packages */
enum state state; /* Current echo mode state */
int verbose = FALSE; /* Enable more debug messages */
@@ -334,100 +334,6 @@ setup()
return;
}
/******************************************************************************/
/* */
/* */
/******************************************************************************/
int receive_and_decode_package(int fd, char * buffer, int receive_sleep )
{
enum state state = IDLE;
int byte_count = 0;
char received_byte;
int received_state_bytes = 0; // Number of bytes received in current state
int data_length = 0;
while(TRUE)
{
// Read serial port
byte_count = read(fd, &received_byte, 1);
if (byte_count < 1)
continue;
// Detect header byte regardless of current state
if (received_byte == HEADER[0])
{
if (verbose) {
tst_resm(TINFO, "Start of message detected");
}
if(receive_sleep){ // Sleep X seconds to make the flow control hit in
sleep(receive_sleep);
}
received_state_bytes = 1;
state = RECEIVE_HEADER;
if (buffer)
{
free(buffer);
buffer = NULL;
}
}
else switch(state)
{
case IDLE:
// Just waiting for header byte
break;
case RECEIVE_HEADER:
if (received_byte == HEADER[received_state_bytes])
{
received_state_bytes++;
if (received_state_bytes == sizeof(HEADER))
{
// Received complete header, move on to next state
received_state_bytes = 0;
data_length = 0;
state = RECEIVE_DATA_LENGTH;
if (verbose) {
tst_resm(TINFO, "Reading data length");
}
}
}
else
{
if (verbose) {
tst_resm(TINFO, "Invalid header");
}
// Received wrong header byte, back to idle
received_state_bytes = 0;
state = IDLE;
}
break;
case RECEIVE_DATA_LENGTH:
data_length = data_length | (received_byte << (received_state_bytes * 8));
received_state_bytes++;
if (received_state_bytes == sizeof(data_length))
{
received_state_bytes = 0;
// Allocate space for received string
buffer = malloc(data_length + 1);
buffer[data_length] = 0;
state = RECEIVE_DATA;
if (verbose) {
tst_resm(TINFO, "Reading %d data bytes", data_length);
}
}
break;
case RECEIVE_DATA:
buffer[received_state_bytes] = received_byte;
received_state_bytes++;
if (received_state_bytes == data_length)
return data_length;
break;
}
}
}
/******************************************************************************/
/* */
@@ -450,6 +356,7 @@ void help()
printf(" -c Enable rtscts flowcontrol, not to be used in RS485 mode\n");
printf(" -d s Select serial port specified by device name s (default: /dev/ttymxc2)\n");
printf(" -e Echo mode, wait for data and echo it back\n");
printf(" -f Number 'fake' bytes in the random string to send, instead of real random data N bytes at the end of the package are replaces with 0xFF.\n");
printf(" -n Do not use RS485 mode\n");
printf(" -o x Set receive timeout to x milliseconds (default: 1000)\n");
printf(" -r x Repeat send and receive x times (default: 1), use 0 for forever.\n");
@@ -458,8 +365,6 @@ void help()
printf(" -v Verbose\n");
printf(" -x x Set delay time between receive and next send in us (default: 300)\n");
printf(" -z Use tx_only mode, do not wait for reponses, just keep sending\n");
printf(" -p Use package mode for echo returned packages\n");
}
@@ -490,6 +395,10 @@ main(int argc, /* number of command line parameters */
int byte_count = 0;
int send_delay = 300;
int receive_sleep = 0;
int fake_data_len = 0;
char received_byte;
int received_state_bytes = 0; // Number of bytes received in current state
int data_length = 0;
struct timeval start, now;
int elapsed_us;
int timeout_happened = FALSE;
@@ -499,15 +408,16 @@ main(int argc, /* number of command line parameters */
int opt_device_name = 0, opt_repetitions = 0, opt_bytes = 0,
opt_timeout = 0, opt_baudrate = 0, opt_nors485 = 0, opt_pingpong = 0,
opt_delaytime = 0, opt_verbose = 0, opt_rtscts = 0, opt_receive_sleep = 0,
opt_tx_only = 0, opt_package_mode = 0;
opt_tx_only = 0, opt_fake_data_len = 0;
char *str_device_name, *str_repetitions, *str_bytes, *str_timeout,
*str_baudrate, *str_delaytime, *str_receive_sleep;
*str_baudrate, *str_delaytime, *str_receive_sleep, *str_fake_data_len;
option_t options[] = {
{"b:", &opt_bytes, &str_bytes},
{"c", &opt_rtscts, NULL},
{"d:", &opt_device_name, &str_device_name},
{"e", &opt_pingpong, NULL},
{"f:", &opt_fake_data_len, &str_fake_data_len},
{"n", &opt_nors485, NULL},
{"o:", &opt_timeout, &str_timeout},
{"r:", &opt_repetitions, &str_repetitions},
@@ -516,7 +426,6 @@ main(int argc, /* number of command line parameters */
{"v", &opt_verbose, NULL},
{"x:", &opt_delaytime, &str_delaytime},
{"z", &opt_tx_only, NULL},
{"p", &opt_package_mode, NULL},
{NULL, NULL, NULL}
};
@@ -581,8 +490,11 @@ main(int argc, /* number of command line parameters */
exit(1);
}
}
if (opt_package_mode){
echo_package_mode = TRUE;
if (opt_fake_data_len){
tst_resm(TINFO, "Fake %d bytes of the 'random' data", fake_data_len);
fake_data_len = atoi(str_fake_data_len);
tst_resm(TINFO, "Fake %d bytes of the 'random' data", fake_data_len);
}
if (opt_verbose){
@@ -592,14 +504,13 @@ main(int argc, /* number of command line parameters */
// Perform global test setup
setup();
if ( fake_data_len > message->length)
fake_data_len = message->length;
tst_resm(TINFO, "Starting RS485 echo test%s", echo_mode?" in echo mode.":".");
if (!echo_mode)
{
//===========================================
// Normal mode
//===========================================
tst_resm(TINFO, "Sending %d bytes to %s (%d,8N1) and waiting for echo.",
bytes, device_name, baudrate);
tst_resm(TINFO, "(repetitions: %d, timeout: %d seconds)", repetitions, timeout_ms);
@@ -613,6 +524,10 @@ main(int argc, /* number of command line parameters */
// Generate random string for message
random_string(message->data, message->length);
// Replace part of the random string with dummy data
for(int i = 0; i < fake_data_len; i ++)
message->data[message->length-1-i] = 0xFF;
tst_resm(TINFO, "Cycle %d data (first 1000 bytes): %.1000s%s",
cycle_count+1, message->data, message->length > 1000 ? "[...]" : "");
@@ -696,19 +611,106 @@ main(int argc, /* number of command line parameters */
}
else
{
//===========================================
// Echo mode
//===========================================
state = IDLE;
timeout_happened = FALSE;
byte_count = 0;
tst_resm(TINFO, "Waiting for messages on %s (%d,8N1)", device_name, baudrate);
byte_count = receive_and_decode_package(fd, received_data, receive_sleep);
while(TRUE)
{
// Read serial port
byte_count = read(fd, &received_byte, 1);
if (byte_count < 1)
continue;
// Received complete data, echo it back
usleep(send_delay);
tst_resm(TINFO, "Received data: %.1000s%s", received_data,
byte_count > 1000 ? "[...]" : "");
write(fd, received_data, byte_count);
tst_resm(TINFO, "Echoed data back to sender");
// Detect header byte regardless of current state
if (received_byte == HEADER[0])
{
if (verbose) {
tst_resm(TINFO, "Start of message detected");
}
if(receive_sleep){ // Sleep X seconds to make the flow control hit in
sleep(receive_sleep);
}
received_state_bytes = 1;
state = RECEIVE_HEADER;
if (received_data)
{
free(received_data);
received_data = NULL;
}
}
else switch(state)
{
case IDLE:
// Just waiting for header byte
break;
case RECEIVE_HEADER:
if (received_byte == HEADER[received_state_bytes])
{
received_state_bytes++;
if (received_state_bytes == sizeof(HEADER))
{
// Received complete header, move on to next state
received_state_bytes = 0;
data_length = 0;
state = RECEIVE_DATA_LENGTH;
if (verbose) {
tst_resm(TINFO, "Reading data length");
}
}
}
else
{
if (verbose) {
tst_resm(TINFO, "Invalid header");
}
// Received wrong header byte, back to idle
received_state_bytes = 0;
state = IDLE;
}
break;
case RECEIVE_DATA_LENGTH:
data_length = data_length | (received_byte << (received_state_bytes * 8));
received_state_bytes++;
if (received_state_bytes == sizeof(data_length))
{
received_state_bytes = 0;
// Allocate space for received string
received_data = malloc(data_length + 1);
received_data[data_length] = 0;
state = RECEIVE_DATA;
if (verbose) {
tst_resm(TINFO, "Reading %d data bytes", data_length);
}
}
break;
case RECEIVE_DATA:
received_data[received_state_bytes] = received_byte;
received_state_bytes++;
if (received_state_bytes == data_length)
{
// Received complete data, echo it back
usleep(send_delay);
tst_resm(TINFO, "Received data: %.1000s%s", received_data,
data_length > 1000 ? "[...]" : "");
write(fd, received_data, data_length);
tst_resm(TINFO, "Echoed data back to sender");
free(received_data);
received_data = NULL;
received_state_bytes = 0;
state = IDLE;
}
break;
}
}
}
cleanup();
Loading