1
0
Fork 0

#903: generic protocol: fix a rare corner case

ASCII protocols consisting of a single chunk only (one variable per line)
would not work when no "separator" was defined.
Also add error message for protocols with more than one var per line which
are missing a separator...
This commit is contained in:
ThorstenB 2012-11-01 14:35:17 +01:00
parent 5049ecce71
commit 51f16337c2
2 changed files with 39 additions and 10 deletions

View file

@ -340,7 +340,7 @@ bool FGGeneric::parse_message_binary(int length) {
}
bool FGGeneric::parse_message_ascii(int length) {
char *p2, *p1 = buf;
char *p1 = buf;
int i = -1;
int chunks = _in_message.size();
int line_separator_size = line_separator.size();
@ -354,11 +354,17 @@ bool FGGeneric::parse_message_ascii(int length) {
buf[length - line_separator_size] = 0;
}
size_t varsep_len = var_separator.length();
while ((++i < chunks) && p1) {
p2 = strstr(p1, var_separator.c_str());
if (p2) {
*p2 = 0;
p2 += var_separator.length();
char* p2 = NULL;
if (varsep_len > 0)
{
p2 = strstr(p1, var_separator.c_str());
if (p2) {
*p2 = 0;
p2 += varsep_len;
}
}
switch (_in_message[i].type) {
@ -542,13 +548,21 @@ FGGeneric::reinit()
SGPropertyNode *output = root.getNode("generic/output");
if (output) {
_out_message.clear();
read_config(output, _out_message);
if (!read_config(output, _out_message))
{
// bad configuration
return;
}
}
} else if (direction == "in") {
SGPropertyNode *input = root.getNode("generic/input");
if (input) {
_in_message.clear();
read_config(input, _in_message);
if (!read_config(input, _in_message))
{
// bad configuration
return;
}
if (!binary_mode && (line_separator.size() == 0 ||
*line_separator.rbegin() != '\n')) {
@ -563,7 +577,7 @@ FGGeneric::reinit()
}
void
bool
FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg)
{
binary_mode = root->getBoolValue("binary_mode");
@ -663,6 +677,7 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg)
int record_length = 0; // Only used for binary protocols.
vector<SGPropertyNode_ptr> chunks = root->getChildren("chunk");
for (unsigned int i = 0; i < chunks.size(); i++) {
_serial_prot chunk;
@ -705,7 +720,19 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg)
}
if( binary_mode ) {
if( !binary_mode )
{
if ((chunks.size() > 1)&&(var_sep_string.length() == 0))
{
// ASCII protocols really need a separator when there is more than one chunk per line
SG_LOG(SG_IO, SG_ALERT,
"generic protocol: Invalid configuration. "
"'var_separator' must not be empty for protocols which have more than one chunk per line.");
return false;
}
}
else
{
if (binary_record_length == -1) {
binary_record_length = record_length;
} else if (binary_record_length < record_length) {
@ -715,6 +742,8 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg)
binary_record_length = record_length;
}
}
return true;
}
void FGGeneric::updateValue(FGGeneric::_serial_prot& prot, bool val)

View file

@ -101,7 +101,7 @@ private:
bool gen_message_binary();
bool parse_message_ascii(int length);
bool parse_message_binary(int length);
void read_config(SGPropertyNode *root, vector<_serial_prot> &msg);
bool read_config(SGPropertyNode *root, vector<_serial_prot> &msg);
bool exitOnError;
bool initOk;