unify decodeLastData usage, add raw logging to read cmd
This commit is contained in:
@@ -101,7 +101,7 @@ bool ScanRequest::notify(result_t result, const SlaveSymbolString& slave) {
|
|||||||
}
|
}
|
||||||
if (result == RESULT_OK) {
|
if (result == RESULT_OK) {
|
||||||
ostringstream output;
|
ostringstream output;
|
||||||
result = m_message->decodeLastData(true, nullptr, -1, OF_NONE, &output); // decode data
|
result = m_message->decodeLastData(pt_any, true, nullptr, -1, OF_NONE, &output); // decode data
|
||||||
string str = output.str();
|
string str = output.str();
|
||||||
m_busHandler->setScanResult(dstAddress, m_notifyIndex+m_index, str);
|
m_busHandler->setScanResult(dstAddress, m_notifyIndex+m_index, str);
|
||||||
}
|
}
|
||||||
@@ -403,7 +403,7 @@ void BusHandler::notifyProtocolMessage(MessageDirection direction, const MasterS
|
|||||||
result = message->storeLastData(0, idData);
|
result = message->storeLastData(0, idData);
|
||||||
if (result == RESULT_OK) {
|
if (result == RESULT_OK) {
|
||||||
ostringstream output;
|
ostringstream output;
|
||||||
result = message->decodeLastData(true, nullptr, -1, OF_NONE, &output);
|
result = message->decodeLastData(pt_any, true, nullptr, -1, OF_NONE, &output);
|
||||||
if (result == RESULT_OK) {
|
if (result == RESULT_OK) {
|
||||||
string str = output.str();
|
string str = output.str();
|
||||||
setScanResult(slaveAddress, 0, str);
|
setScanResult(slaveAddress, 0, str);
|
||||||
@@ -420,7 +420,7 @@ void BusHandler::notifyProtocolMessage(MessageDirection direction, const MasterS
|
|||||||
result_t result = message->storeLastData(command, response);
|
result_t result = message->storeLastData(command, response);
|
||||||
if (result == RESULT_OK) {
|
if (result == RESULT_OK) {
|
||||||
ostringstream output;
|
ostringstream output;
|
||||||
result = message->decodeLastData(true, nullptr, -1, OF_NONE, &output);
|
result = message->decodeLastData(pt_any, true, nullptr, -1, OF_NONE, &output);
|
||||||
if (result == RESULT_OK) {
|
if (result == RESULT_OK) {
|
||||||
string str = output.str();
|
string str = output.str();
|
||||||
setScanResult(dstAddress, 0, str);
|
setScanResult(dstAddress, 0, str);
|
||||||
@@ -475,7 +475,7 @@ void BusHandler::notifyProtocolMessage(MessageDirection direction, const MasterS
|
|||||||
result_t result = message->storeLastData(command, response);
|
result_t result = message->storeLastData(command, response);
|
||||||
ostringstream output;
|
ostringstream output;
|
||||||
if (result == RESULT_OK) {
|
if (result == RESULT_OK) {
|
||||||
result = message->decodeLastData(false, nullptr, -1, OF_NONE, &output);
|
result = message->decodeLastData(pt_any, false, nullptr, -1, OF_NONE, &output);
|
||||||
}
|
}
|
||||||
if (result < RESULT_OK) {
|
if (result < RESULT_OK) {
|
||||||
logError(lf_update, "unable to parse %s %s %s from %s / %s: %s", mode, circuit.c_str(), name.c_str(),
|
logError(lf_update, "unable to parse %s %s %s from %s / %s: %s", mode, circuit.c_str(), name.c_str(),
|
||||||
@@ -639,7 +639,7 @@ void BusHandler::formatScanResult(ostringstream* output) const {
|
|||||||
*output << endl;
|
*output << endl;
|
||||||
}
|
}
|
||||||
*output << hex << setw(2) << setfill('0') << static_cast<unsigned>(slave);
|
*output << hex << setw(2) << setfill('0') << static_cast<unsigned>(slave);
|
||||||
message->decodeLastData(true, nullptr, -1, OF_NONE, output);
|
message->decodeLastData(pt_any, true, nullptr, -1, OF_NONE, output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -680,7 +680,7 @@ void BusHandler::formatSeenInfo(ostringstream* output) const {
|
|||||||
if (message != nullptr && message->getLastUpdateTime() > 0) {
|
if (message != nullptr && message->getLastUpdateTime() > 0) {
|
||||||
// add detailed scan info: Manufacturer ID SW HW
|
// add detailed scan info: Manufacturer ID SW HW
|
||||||
*output << " \"";
|
*output << " \"";
|
||||||
result_t result = message->decodeLastData(false, nullptr, -1, OF_NAMES, output);
|
result_t result = message->decodeLastData(pt_any, false, nullptr, -1, OF_NAMES, output);
|
||||||
if (result != RESULT_OK) {
|
if (result != RESULT_OK) {
|
||||||
*output << "\" error: " << getResultCode(result);
|
*output << "\" error: " << getResultCode(result);
|
||||||
} else {
|
} else {
|
||||||
@@ -759,7 +759,7 @@ void BusHandler::formatUpdateInfo(ostringstream* output) const {
|
|||||||
Message* message = m_messages->getScanMessage(address);
|
Message* message = m_messages->getScanMessage(address);
|
||||||
if (message != nullptr && message->getLastUpdateTime() > 0) {
|
if (message != nullptr && message->getLastUpdateTime() > 0) {
|
||||||
// add detailed scan info: Manufacturer ID SW HW
|
// add detailed scan info: Manufacturer ID SW HW
|
||||||
message->decodeLastData(true, nullptr, -1, OF_NAMES|OF_NUMERIC|OF_JSON|OF_SHORT, output);
|
message->decodeLastData(pt_any, true, nullptr, -1, OF_NAMES|OF_NUMERIC|OF_JSON|OF_SHORT, output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const vector<string>& loadedFiles = m_messages->getLoadedFiles(address);
|
const vector<string>& loadedFiles = m_messages->getLoadedFiles(address);
|
||||||
|
|||||||
+21
-12
@@ -402,7 +402,7 @@ void MainLoop::run() {
|
|||||||
m_messages->findAll("", "", levels, false, true, true, true, true, true, since, now, true, &messages);
|
m_messages->findAll("", "", levels, false, true, true, true, true, true, since, now, true, &messages);
|
||||||
for (const auto message : messages) {
|
for (const auto message : messages) {
|
||||||
ostream << message->getCircuit() << " " << message->getName() << " = " << dec;
|
ostream << message->getCircuit() << " " << message->getName() << " = " << dec;
|
||||||
message->decodeLastData(false, nullptr, -1, reqMode.format, &ostream);
|
message->decodeLastData(pt_any, false, nullptr, -1, reqMode.format, &ostream);
|
||||||
ostream << endl;
|
ostream << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -648,8 +648,15 @@ result_t MainLoop::executeRead(const vector<string>& args, const string& levels,
|
|||||||
}
|
}
|
||||||
} else if (args[argPos] == "-vv") {
|
} else if (args[argPos] == "-vv") {
|
||||||
verbosity |= VERBOSITY_2;
|
verbosity |= VERBOSITY_2;
|
||||||
} else if (args[argPos] == "-vvv" || args[argPos] == "-V") {
|
} else if (args[argPos] == "-vvv") {
|
||||||
verbosity |= VERBOSITY_3;
|
verbosity |= VERBOSITY_3;
|
||||||
|
} else if (args[argPos] == "-V") {
|
||||||
|
if ((verbosity & VERBOSITY_4) == VERBOSITY_4) {
|
||||||
|
verbosity |= OF_RAWDATA;
|
||||||
|
}
|
||||||
|
verbosity |= VERBOSITY_4;
|
||||||
|
} else if (args[argPos] == "-VV") {
|
||||||
|
verbosity |= VERBOSITY_4 | OF_RAWDATA;
|
||||||
} else if (args[argPos] == "-n") {
|
} else if (args[argPos] == "-n") {
|
||||||
verbosity = (verbosity & ~OF_VALUENAME) | OF_NUMERIC;
|
verbosity = (verbosity & ~OF_VALUENAME) | OF_NUMERIC;
|
||||||
} else if (args[argPos] == "-N") {
|
} else if (args[argPos] == "-N") {
|
||||||
@@ -723,7 +730,7 @@ result_t MainLoop::executeRead(const vector<string>& args, const string& levels,
|
|||||||
" -d ZZ override destination address ZZ\n"
|
" -d ZZ override destination address ZZ\n"
|
||||||
" -p PRIO set the message poll priority (1-9)\n"
|
" -p PRIO set the message poll priority (1-9)\n"
|
||||||
" -v increase verbosity (include names/units/comments)\n"
|
" -v increase verbosity (include names/units/comments)\n"
|
||||||
" -V be very verbose (include names, units, and comments)\n"
|
" -V be very verbose (all attributes, plus raw data if given more than once)\n"
|
||||||
" -n use numeric value of value=name pairs\n"
|
" -n use numeric value of value=name pairs\n"
|
||||||
" -N use numeric and named value of value=name pairs\n"
|
" -N use numeric and named value of value=name pairs\n"
|
||||||
" -i VALUE read additional message parameters from VALUE\n"
|
" -i VALUE read additional message parameters from VALUE\n"
|
||||||
@@ -785,7 +792,7 @@ result_t MainLoop::executeRead(const vector<string>& args, const string& levels,
|
|||||||
ret = message->storeLastData(master, slave);
|
ret = message->storeLastData(master, slave);
|
||||||
ostringstream result;
|
ostringstream result;
|
||||||
if (ret == RESULT_OK) {
|
if (ret == RESULT_OK) {
|
||||||
ret = message->decodeLastData(false, nullptr, -1, OF_NONE, &result);
|
ret = message->decodeLastData(pt_any, false, nullptr, -1, OF_NONE, &result);
|
||||||
}
|
}
|
||||||
if (ret >= RESULT_OK) {
|
if (ret >= RESULT_OK) {
|
||||||
logInfo(lf_main, "read hex %s %s cache update: %s", message->getCircuit().c_str(), message->getName().c_str(),
|
logInfo(lf_main, "read hex %s %s cache update: %s", message->getCircuit().c_str(), message->getName().c_str(),
|
||||||
@@ -855,7 +862,7 @@ result_t MainLoop::executeRead(const vector<string>& args, const string& levels,
|
|||||||
if (verbosity & OF_NAMES) {
|
if (verbosity & OF_NAMES) {
|
||||||
*ostream << cacheMessage->getCircuit() << " " << cacheMessage->getName() << " ";
|
*ostream << cacheMessage->getCircuit() << " " << cacheMessage->getName() << " ";
|
||||||
}
|
}
|
||||||
ret = cacheMessage->decodeLastData(false, fieldIndex == -2 ? nullptr : fieldName.c_str(), fieldIndex, verbosity,
|
ret = cacheMessage->decodeLastData(pt_any, false, fieldIndex == -2 ? nullptr : fieldName.c_str(), fieldIndex, verbosity,
|
||||||
ostream);
|
ostream);
|
||||||
if (ret != RESULT_OK) {
|
if (ret != RESULT_OK) {
|
||||||
if (ret < RESULT_OK) {
|
if (ret < RESULT_OK) {
|
||||||
@@ -888,7 +895,7 @@ result_t MainLoop::executeRead(const vector<string>& args, const string& levels,
|
|||||||
if (verbosity & OF_NAMES) {
|
if (verbosity & OF_NAMES) {
|
||||||
*ostream << message->getCircuit() << " " << message->getName() << " ";
|
*ostream << message->getCircuit() << " " << message->getName() << " ";
|
||||||
}
|
}
|
||||||
ret = message->decodeLastData(false, false, fieldIndex == -2 ? nullptr : fieldName.c_str(), fieldIndex, verbosity,
|
ret = message->decodeLastData(pt_any, false, fieldIndex == -2 ? nullptr : fieldName.c_str(), fieldIndex, verbosity,
|
||||||
ostream);
|
ostream);
|
||||||
if (ret < RESULT_OK) {
|
if (ret < RESULT_OK) {
|
||||||
logError(lf_main, "read %s %s: decode %s", message->getCircuit().c_str(), message->getName().c_str(),
|
logError(lf_main, "read %s %s: decode %s", message->getCircuit().c_str(), message->getName().c_str(),
|
||||||
@@ -1009,7 +1016,7 @@ result_t MainLoop::executeWrite(const vector<string>& args, const string levels,
|
|||||||
ret = message->storeLastData(master, slave);
|
ret = message->storeLastData(master, slave);
|
||||||
ostringstream result;
|
ostringstream result;
|
||||||
if (ret == RESULT_OK) {
|
if (ret == RESULT_OK) {
|
||||||
ret = message->decodeLastData(false, nullptr, -1, OF_NONE, &result);
|
ret = message->decodeLastData(pt_any, false, nullptr, -1, OF_NONE, &result);
|
||||||
}
|
}
|
||||||
if (ret >= RESULT_OK) {
|
if (ret >= RESULT_OK) {
|
||||||
logInfo(lf_main, "write hex %s %s cache update: %s", message->getCircuit().c_str(),
|
logInfo(lf_main, "write hex %s %s cache update: %s", message->getCircuit().c_str(),
|
||||||
@@ -1080,7 +1087,7 @@ result_t MainLoop::executeWrite(const vector<string>& args, const string levels,
|
|||||||
return RESULT_OK;
|
return RESULT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = message->decodeLastData(false, false, nullptr, -1, OF_NONE, ostream); // decode data
|
ret = message->decodeLastData(pt_any, false, nullptr, -1, OF_NONE, ostream); // decode data
|
||||||
if (ret >= RESULT_OK && ostream->str().empty()) {
|
if (ret >= RESULT_OK && ostream->str().empty()) {
|
||||||
logNotice(lf_main, "write %s %s: decode %s", message->getCircuit().c_str(), message->getName().c_str(),
|
logNotice(lf_main, "write %s %s: decode %s", message->getCircuit().c_str(), message->getName().c_str(),
|
||||||
getResultCode(ret));
|
getResultCode(ret));
|
||||||
@@ -1487,7 +1494,7 @@ result_t MainLoop::executeFind(const vector<string>& args, const string& levels,
|
|||||||
} else if (hexFormat) {
|
} else if (hexFormat) {
|
||||||
*ostream << message->getLastMasterData().getStr() << " / " << message->getLastSlaveData().getStr();
|
*ostream << message->getLastMasterData().getStr() << " / " << message->getLastSlaveData().getStr();
|
||||||
} else {
|
} else {
|
||||||
result_t ret = message->decodeLastData(false, nullptr, -1, verbosity, ostream);
|
result_t ret = message->decodeLastData(pt_any, false, nullptr, -1, verbosity, ostream);
|
||||||
if (ret != RESULT_OK) {
|
if (ret != RESULT_OK) {
|
||||||
*ostream << " (" << getResultCode(ret)
|
*ostream << " (" << getResultCode(ret)
|
||||||
<< " for " << message->getLastMasterData().getStr()
|
<< " for " << message->getLastMasterData().getStr()
|
||||||
@@ -2045,7 +2052,7 @@ result_t MainLoop::executeGet(const vector<string>& args, bool* connected, ostri
|
|||||||
circuit = uri.substr(6, pos - 6);
|
circuit = uri.substr(6, pos - 6);
|
||||||
name = uri.substr(pos + 1);
|
name = uri.substr(pos + 1);
|
||||||
}
|
}
|
||||||
bool required = false, full = false, withWrite = false, raw = false;
|
bool required = false, full = false, withWrite = false;
|
||||||
bool withDefinition = false;
|
bool withDefinition = false;
|
||||||
string newDefinition;
|
string newDefinition;
|
||||||
OutputFormat verbosity = OF_NAMES;
|
OutputFormat verbosity = OF_NAMES;
|
||||||
@@ -2099,7 +2106,9 @@ result_t MainLoop::executeGet(const vector<string>& args, bool* connected, ostri
|
|||||||
} else if (qname == "write") {
|
} else if (qname == "write") {
|
||||||
withWrite = parseBoolQuery(value);
|
withWrite = parseBoolQuery(value);
|
||||||
} else if (qname == "raw") {
|
} else if (qname == "raw") {
|
||||||
raw = parseBoolQuery(value);
|
if (parseBoolQuery(value)) {
|
||||||
|
verbosity |= OF_RAWDATA;
|
||||||
|
}
|
||||||
} else if (qname == "def") {
|
} else if (qname == "def") {
|
||||||
withDefinition = parseBoolQuery(value);
|
withDefinition = parseBoolQuery(value);
|
||||||
} else if (qname == "define") {
|
} else if (qname == "define") {
|
||||||
@@ -2191,7 +2200,7 @@ result_t MainLoop::executeGet(const vector<string>& args, bool* connected, ostri
|
|||||||
Message* next = *(it+1);
|
Message* next = *(it+1);
|
||||||
same = next->getCircuit() == lastCircuit && next->getName() == name;
|
same = next->getCircuit() == lastCircuit && next->getName() == name;
|
||||||
}
|
}
|
||||||
message->decodeJson(!first, same, true, raw, verbosity, ostream);
|
message->decodeJson(!first, same, true, verbosity, ostream);
|
||||||
lastName = name;
|
lastName = name;
|
||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1178,7 +1178,7 @@ void MqttHandler::publishMessage(const Message* message, ostringstream* updates,
|
|||||||
} else if (m_staticTopic) {
|
} else if (m_staticTopic) {
|
||||||
*updates << message->getCircuit() << UI_FIELD_SEPARATOR << message->getName() << UI_FIELD_SEPARATOR;
|
*updates << message->getCircuit() << UI_FIELD_SEPARATOR << message->getName() << UI_FIELD_SEPARATOR;
|
||||||
}
|
}
|
||||||
result_t result = message->decodeLastData(false, nullptr, -1, outputFormat, updates);
|
result_t result = message->decodeLastData(pt_any, false, nullptr, -1, outputFormat, updates);
|
||||||
if (result == RESULT_EMPTY) {
|
if (result == RESULT_EMPTY) {
|
||||||
publishEmptyTopic(getTopic(message)); // alternatively: , json ? "null" : "");
|
publishEmptyTopic(getTopic(message)); // alternatively: , json ? "null" : "");
|
||||||
return;
|
return;
|
||||||
@@ -1206,7 +1206,7 @@ void MqttHandler::publishMessage(const Message* message, ostringstream* updates,
|
|||||||
publishEmptyTopic(getTopic(message, "", name)); // alternatively: , json ? "null" : "");
|
publishEmptyTopic(getTopic(message, "", name)); // alternatively: , json ? "null" : "");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
result_t result = message->decodeLastData(false, nullptr, index, outputFormat, updates);
|
result_t result = message->decodeLastData(pt_any, false, nullptr, index, outputFormat, updates);
|
||||||
if (result != RESULT_OK) {
|
if (result != RESULT_OK) {
|
||||||
logOtherError("mqtt", "decode %s %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(),
|
logOtherError("mqtt", "decode %s %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(),
|
||||||
name.c_str(), getResultCode(result));
|
name.c_str(), getResultCode(result));
|
||||||
|
|||||||
+34
-2
@@ -412,6 +412,31 @@ const char* DataField::getDayName(int day) {
|
|||||||
return dayNames[day];
|
return dayNames[day];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DataField::addRaw(size_t offset, size_t length, const SymbolString& input, bool isJson, ostream* output) {
|
||||||
|
size_t size = input.getDataSize();
|
||||||
|
if (offset >= size) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (isJson) {
|
||||||
|
*output << ", \"raw\": [";
|
||||||
|
for (size_t pos = 0; pos < length && offset+pos < size; pos++) {
|
||||||
|
if (pos > 0) {
|
||||||
|
*output << ", ";
|
||||||
|
}
|
||||||
|
*output << dec << static_cast<unsigned>(input.dataAt(offset+pos));
|
||||||
|
}
|
||||||
|
*output << "]";
|
||||||
|
} else {
|
||||||
|
*output << "[";
|
||||||
|
for (size_t pos = 0; pos < length && offset+pos < size; pos++) {
|
||||||
|
*output << setw(2) << hex
|
||||||
|
<< setfill('0') << static_cast<unsigned>(input.dataAt(offset+pos));
|
||||||
|
}
|
||||||
|
*output << "]";
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
result_t SingleDataField::create(const string& name, const map<string, string>& attributes, const DataType* dataType,
|
result_t SingleDataField::create(const string& name, const map<string, string>& attributes, const DataType* dataType,
|
||||||
PartType partType, size_t length, int divisor, const string& constantValue,
|
PartType partType, size_t length, int divisor, const string& constantValue,
|
||||||
@@ -547,7 +572,8 @@ result_t SingleDataField::read(const SymbolString& data, size_t offset,
|
|||||||
return RESULT_EMPTY;
|
return RESULT_EMPTY;
|
||||||
}
|
}
|
||||||
bool shortFormat = outputFormat & OF_SHORT;
|
bool shortFormat = outputFormat & OF_SHORT;
|
||||||
if (outputFormat & OF_JSON) {
|
bool isJson = outputFormat & OF_JSON;
|
||||||
|
if (isJson) {
|
||||||
if (leadingSeparator) {
|
if (leadingSeparator) {
|
||||||
*output << ",";
|
*output << ",";
|
||||||
}
|
}
|
||||||
@@ -578,6 +604,9 @@ result_t SingleDataField::read(const SymbolString& data, size_t offset,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!shortFormat && (outputFormat & OF_RAWDATA) && !isJson) {
|
||||||
|
addRaw(offset, m_length, data, isJson, output);
|
||||||
|
}
|
||||||
result_t result = readSymbols(data, offset, outputFormat, output);
|
result_t result = readSymbols(data, offset, outputFormat, output);
|
||||||
if (result != RESULT_OK) {
|
if (result != RESULT_OK) {
|
||||||
return result;
|
return result;
|
||||||
@@ -585,7 +614,10 @@ result_t SingleDataField::read(const SymbolString& data, size_t offset,
|
|||||||
if (!shortFormat) {
|
if (!shortFormat) {
|
||||||
appendAttributes(outputFormat, output);
|
appendAttributes(outputFormat, output);
|
||||||
}
|
}
|
||||||
if (!shortFormat && (outputFormat & OF_JSON)) {
|
if (!shortFormat && isJson) {
|
||||||
|
if (outputFormat & OF_RAWDATA) {
|
||||||
|
addRaw(offset, m_length, data, isJson, output);
|
||||||
|
}
|
||||||
*output << "}";
|
*output << "}";
|
||||||
}
|
}
|
||||||
return RESULT_OK;
|
return RESULT_OK;
|
||||||
|
|||||||
@@ -239,6 +239,17 @@ class DataField : public AttributedItem {
|
|||||||
*/
|
*/
|
||||||
static const char* getDayName(int day);
|
static const char* getDayName(int day);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add raw data to the output (excluding the length field).
|
||||||
|
* @param offset the offset in the data part of the @a SymbolString.
|
||||||
|
* @param length the maximum number of symbols to dump.
|
||||||
|
* @param input the @a SymbolString to dump from.
|
||||||
|
* @param isJson true for JSON format, false for text.
|
||||||
|
* @param output the ostream to append the raw data to.
|
||||||
|
* @return true when something was added to the output.
|
||||||
|
*/
|
||||||
|
static bool addRaw(size_t offset, size_t length, const SymbolString& input, bool isJson, ostream* output);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the length of this field (or contained fields) in bytes.
|
* Returns the length of this field (or contained fields) in bytes.
|
||||||
* @param partType the message part of the contained fields to limit the length calculation to.
|
* @param partType the message part of the contained fields to limit the length calculation to.
|
||||||
|
|||||||
@@ -110,6 +110,9 @@ enum OutputFormat : OutputFormatBaseType {
|
|||||||
|
|
||||||
/** bit flag for @a OutputFormat: include message/field definition. */
|
/** bit flag for @a OutputFormat: include message/field definition. */
|
||||||
OF_DEFINITION = 1 << 8,
|
OF_DEFINITION = 1 << 8,
|
||||||
|
|
||||||
|
/** bit flag for @a OutputFormat: include raw data. */
|
||||||
|
OF_RAWDATA = 1 << 9,
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr inline enum OutputFormat operator| (enum OutputFormat self, enum OutputFormat other) {
|
constexpr inline enum OutputFormat operator| (enum OutputFormat self, enum OutputFormat other) {
|
||||||
|
|||||||
+21
-32
@@ -769,36 +769,25 @@ result_t Message::storeLastData(size_t index, const SlaveSymbolString& data) {
|
|||||||
return RESULT_OK;
|
return RESULT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
result_t Message::decodeLastData(bool master, bool leadingSeparator, const char* fieldName,
|
result_t Message::decodeLastData(PartType part, bool leadingSeparator, const char* fieldName,
|
||||||
ssize_t fieldIndex, OutputFormat outputFormat, ostream* output) const {
|
ssize_t fieldIndex, const OutputFormat outputFormat, ostream* output) const {
|
||||||
result_t result;
|
if ((outputFormat & OF_RAWDATA) && !(outputFormat & OF_JSON)) {
|
||||||
if (master) {
|
*output << "[" << m_lastMasterData.getStr(2, 0, false)
|
||||||
|
<< "/" << m_lastSlaveData.getStr(0, 0, false)
|
||||||
|
<< "] ";
|
||||||
|
}
|
||||||
|
ostream::pos_type startPos = output->tellp();
|
||||||
|
result_t result = RESULT_EMPTY;
|
||||||
|
bool skipSlaveData = part == pt_masterData;
|
||||||
|
if (part == pt_any || skipSlaveData) {
|
||||||
result = m_data->read(m_lastMasterData, getIdLength(), leadingSeparator, fieldName, fieldIndex,
|
result = m_data->read(m_lastMasterData, getIdLength(), leadingSeparator, fieldName, fieldIndex,
|
||||||
outputFormat, -1, output);
|
outputFormat, -1, output);
|
||||||
} else {
|
if (result < RESULT_OK) {
|
||||||
result = m_data->read(m_lastSlaveData, 0, leadingSeparator, fieldName, fieldIndex,
|
return result;
|
||||||
outputFormat, -1, output);
|
}
|
||||||
}
|
|
||||||
if (result < RESULT_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
if (result == RESULT_EMPTY && (fieldName != nullptr || fieldIndex >= 0)) {
|
|
||||||
return RESULT_ERR_NOTFOUND;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
result_t Message::decodeLastData(bool leadingSeparator, const char* fieldName,
|
|
||||||
ssize_t fieldIndex, const OutputFormat outputFormat, ostream* output) const {
|
|
||||||
ostream::pos_type startPos = output->tellp();
|
|
||||||
result_t result = m_data->read(m_lastMasterData, getIdLength(), leadingSeparator, fieldName, fieldIndex,
|
|
||||||
outputFormat, -1, output);
|
|
||||||
if (result < RESULT_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
bool empty = result == RESULT_EMPTY;
|
bool empty = result == RESULT_EMPTY;
|
||||||
bool skipSlaveData = false;
|
if (!skipSlaveData && fieldIndex >= 0) {
|
||||||
if (fieldIndex >= 0) {
|
|
||||||
fieldIndex -= m_data->getCount(pt_masterData, fieldName);
|
fieldIndex -= m_data->getCount(pt_masterData, fieldName);
|
||||||
if (fieldIndex < 0) {
|
if (fieldIndex < 0) {
|
||||||
skipSlaveData = true;
|
skipSlaveData = true;
|
||||||
@@ -953,7 +942,7 @@ void Message::dumpField(const string& fieldName, bool withConditions, OutputForm
|
|||||||
dumpAttribute(false, outputFormat, fieldName, output);
|
dumpAttribute(false, outputFormat, fieldName, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Message::decodeJson(bool leadingSeparator, bool appendDirectionCondition, bool withData, bool addRaw,
|
void Message::decodeJson(bool leadingSeparator, bool appendDirectionCondition, bool withData,
|
||||||
OutputFormat outputFormat, ostringstream* output) const {
|
OutputFormat outputFormat, ostringstream* output) const {
|
||||||
outputFormat |= OF_JSON;
|
outputFormat |= OF_JSON;
|
||||||
if (leadingSeparator) {
|
if (leadingSeparator) {
|
||||||
@@ -1003,14 +992,14 @@ void Message::decodeJson(bool leadingSeparator, bool appendDirectionCondition, b
|
|||||||
}
|
}
|
||||||
appendAttributes(outputFormat, output);
|
appendAttributes(outputFormat, output);
|
||||||
if (hasData) {
|
if (hasData) {
|
||||||
if (addRaw) {
|
if (outputFormat & OF_RAWDATA) {
|
||||||
m_lastMasterData.dumpJson(true, output);
|
m_lastMasterData.dumpJson(true, output);
|
||||||
m_lastSlaveData.dumpJson(true, output);
|
m_lastSlaveData.dumpJson(true, output);
|
||||||
*output << dec;
|
*output << dec;
|
||||||
}
|
}
|
||||||
size_t pos = (size_t)output->tellp();
|
size_t pos = (size_t)output->tellp();
|
||||||
*output << ",\n \"fields\": {";
|
*output << ",\n \"fields\": {";
|
||||||
result_t dret = decodeLastData(false, nullptr, -1, outputFormat, output);
|
result_t dret = decodeLastData(pt_any, false, nullptr, -1, outputFormat, output);
|
||||||
if (dret == RESULT_OK) {
|
if (dret == RESULT_OK) {
|
||||||
*output << "\n }";
|
*output << "\n }";
|
||||||
} else {
|
} else {
|
||||||
@@ -1694,7 +1683,7 @@ void SimpleNumericCondition::dumpValuesJson(ostream* output) const {
|
|||||||
|
|
||||||
bool SimpleStringCondition::checkValue(const Message* message, const string& field) {
|
bool SimpleStringCondition::checkValue(const Message* message, const string& field) {
|
||||||
ostringstream output;
|
ostringstream output;
|
||||||
result_t result = message->decodeLastData(false, field.length() == 0 ? nullptr : field.c_str(), -1, OF_NONE, &output);
|
result_t result = message->decodeLastData(pt_any, false, field.length() == 0 ? nullptr : field.c_str(), -1, OF_NONE, &output);
|
||||||
if (result == RESULT_OK) {
|
if (result == RESULT_OK) {
|
||||||
string value = output.str();
|
string value = output.str();
|
||||||
for (size_t i = 0; i < m_values.size(); i++) {
|
for (size_t i = 0; i < m_values.size(); i++) {
|
||||||
@@ -2931,7 +2920,7 @@ void MessageMap::dump(bool withConditions, OutputFormat outputFormat, ostream* o
|
|||||||
}
|
}
|
||||||
if (isJson) {
|
if (isJson) {
|
||||||
ostringstream str;
|
ostringstream str;
|
||||||
message->decodeJson(false, false, false, false, outputFormat, &str);
|
message->decodeJson(false, false, false, outputFormat, &str);
|
||||||
string add = str.str();
|
string add = str.str();
|
||||||
size_t pos = add.find('{');
|
size_t pos = add.find('{');
|
||||||
*output << " {\n \"circuit\": \"" << message->getCircuit() << "\", " << add.substr(pos+1);
|
*output << " {\n \"circuit\": \"" << message->getCircuit() << "\", " << add.substr(pos+1);
|
||||||
@@ -2952,7 +2941,7 @@ void MessageMap::dump(bool withConditions, OutputFormat outputFormat, ostream* o
|
|||||||
}
|
}
|
||||||
if (isJson) {
|
if (isJson) {
|
||||||
ostringstream str;
|
ostringstream str;
|
||||||
message->decodeJson(!wasFirst, true, false, false, outputFormat, &str);
|
message->decodeJson(!wasFirst, true, false, outputFormat, &str);
|
||||||
*output << str.str();
|
*output << str.str();
|
||||||
} else {
|
} else {
|
||||||
message->dump(nullptr, withConditions, outputFormat, output);
|
message->dump(nullptr, withConditions, outputFormat, output);
|
||||||
|
|||||||
+5
-18
@@ -478,8 +478,8 @@ class Message : public AttributedItem {
|
|||||||
virtual result_t storeLastData(size_t index, const SlaveSymbolString& data);
|
virtual result_t storeLastData(size_t index, const SlaveSymbolString& data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode the value from the last stored master or slave data.
|
* Decode value(s) from the last stored data.
|
||||||
* @param master true for decoding the master data, false for slave.
|
* @param part the part to decode.
|
||||||
* @param leadingSeparator whether to prepend a separator before the formatted value.
|
* @param leadingSeparator whether to prepend a separator before the formatted value.
|
||||||
* @param fieldName the optional name of a field to limit the output to.
|
* @param fieldName the optional name of a field to limit the output to.
|
||||||
* @param fieldIndex the optional index of the field to limit the output to (either named or overall), or -1.
|
* @param fieldIndex the optional index of the field to limit the output to (either named or overall), or -1.
|
||||||
@@ -487,20 +487,8 @@ class Message : public AttributedItem {
|
|||||||
* @param output the @a ostream to append the formatted value to.
|
* @param output the @a ostream to append the formatted value to.
|
||||||
* @return @a RESULT_OK on success, or an error code.
|
* @return @a RESULT_OK on success, or an error code.
|
||||||
*/
|
*/
|
||||||
virtual result_t decodeLastData(bool master, bool leadingSeparator, const char* fieldName,
|
virtual result_t decodeLastData(PartType part, bool leadingSeparator, const char* fieldName,
|
||||||
ssize_t fieldIndex, OutputFormat outputFormat, ostream* output) const;
|
ssize_t fieldIndex, const OutputFormat outputFormat, ostream* output) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode the value from the last stored master and slave data.
|
|
||||||
* @param leadingSeparator whether to prepend a separator before the formatted value.
|
|
||||||
* @param fieldName the optional name of a field to limit the output to.
|
|
||||||
* @param fieldIndex the optional index of the field to limit the output to (either named or overall), or -1.
|
|
||||||
* @param outputFormat the @a OutputFormat options to use.
|
|
||||||
* @param output the @a ostream to append the formatted value to.
|
|
||||||
* @return @a RESULT_OK on success, or an error code.
|
|
||||||
*/
|
|
||||||
virtual result_t decodeLastData(bool leadingSeparator, const char* fieldName,
|
|
||||||
ssize_t fieldIndex, OutputFormat outputFormat, ostream* output) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode a particular numeric field value from the last stored data.
|
* Decode a particular numeric field value from the last stored data.
|
||||||
@@ -599,11 +587,10 @@ class Message : public AttributedItem {
|
|||||||
* @param leadingSeparator whether to prepend a separator before the first value.
|
* @param leadingSeparator whether to prepend a separator before the first value.
|
||||||
* @param appendDirectionCondition whether to append the direction and condition to the name key.
|
* @param appendDirectionCondition whether to append the direction and condition to the name key.
|
||||||
* @param withData whether to add the last data as well.
|
* @param withData whether to add the last data as well.
|
||||||
* @param addRaw whether to add the raw symbols as well.
|
|
||||||
* @param outputFormat the @a OutputFormat options to use.
|
* @param outputFormat the @a OutputFormat options to use.
|
||||||
* @param output the @a ostringstream to append the decoded value(s) to.
|
* @param output the @a ostringstream to append the decoded value(s) to.
|
||||||
*/
|
*/
|
||||||
virtual void decodeJson(bool leadingSeparator, bool appendDirectionCondition, bool withData, bool addRaw,
|
virtual void decodeJson(bool leadingSeparator, bool appendDirectionCondition, bool withData,
|
||||||
OutputFormat outputFormat, ostringstream* output) const;
|
OutputFormat outputFormat, ostringstream* output) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -184,6 +184,7 @@ int main() {
|
|||||||
{"", "19:00", "3110b51503000272", "00", "kd"},
|
{"", "19:00", "3110b51503000272", "00", "kd"},
|
||||||
{"*r,cir*cuit#level,na*me,com*ment,ff,75,b509,0d", "", "", "", ""},
|
{"*r,cir*cuit#level,na*me,com*ment,ff,75,b509,0d", "", "", "", ""},
|
||||||
{"r,CIRCUIT,NAME,COMMENT,,,,0100,field,,UCH", "r,cirCIRCUITcuit,naNAMEme,comCOMMENTment,ff,75,b509,0d0100,field,s,UCH,,,: field=42", "ff75b509030d0100", "012a", "DN"},
|
{"r,CIRCUIT,NAME,COMMENT,,,,0100,field,,UCH", "r,cirCIRCUITcuit,naNAMEme,comCOMMENTment,ff,75,b509,0d0100,field,s,UCH,,,: field=42", "ff75b509030d0100", "012a", "DN"},
|
||||||
|
{"r,CIRCUIT,NAME,COMMENT,,,,0100,field,,UCH", "r,cirCIRCUITcuit,naNAMEme,comCOMMENTment,ff,75,b509,0d0100,field,s,UCH,,,: [b5090d0100/2a] field=[2a]42", "ff75b509030d0100", "012a", "DNr"},
|
||||||
{"r,CIRCUIT,NAME,COMMENT,,,,0100,field,,UCH",
|
{"r,CIRCUIT,NAME,COMMENT,,,,0100,field,,UCH",
|
||||||
" \"naNAMEme\": {\n"
|
" \"naNAMEme\": {\n"
|
||||||
" \"name\": \"naNAMEme\",\n"
|
" \"name\": \"naNAMEme\",\n"
|
||||||
@@ -194,13 +195,32 @@ int main() {
|
|||||||
" \"zz\": 117,\n"
|
" \"zz\": 117,\n"
|
||||||
" \"id\": [181, 9, 13, 1, 0],\n"
|
" \"id\": [181, 9, 13, 1, 0],\n"
|
||||||
" \"fields\": {\n"
|
" \"fields\": {\n"
|
||||||
" \"0\": {\"name\": \"field\", \"value\": 42}\n"
|
" \"field\": {\"value\": 42}\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
" \"fielddefs\": [\n"
|
" \"fielddefs\": [\n"
|
||||||
" { \"name\": \"field\", \"slave\": true, \"type\": \"UCH\", \"isbits\": false, \"length\": 1, \"unit\": \"\", \"comment\": \"\"}\n"
|
" { \"name\": \"field\", \"slave\": true, \"type\": \"UCH\", \"isbits\": false, \"length\": 1, \"unit\": \"\", \"comment\": \"\"}\n"
|
||||||
" ]\n"
|
" ]\n"
|
||||||
" }: \n"
|
" }: \n"
|
||||||
" \"field\": {\"value\": 42}", "ff75b509030d0100", "012a", "jN"},
|
" \"field\": {\"value\": 42}", "ff75b509030d0100", "012a", "jN"},
|
||||||
|
{"r,CIRCUIT,NAME,COMMENT,,,,0100,field,,UCH",
|
||||||
|
" \"naNAMEme\": {\n"
|
||||||
|
" \"name\": \"naNAMEme\",\n"
|
||||||
|
" \"passive\": false,\n"
|
||||||
|
" \"write\": false,\n"
|
||||||
|
" \"lastup\": *,\n"
|
||||||
|
" \"qq\": 255,\n"
|
||||||
|
" \"zz\": 117,\n"
|
||||||
|
" \"id\": [181, 9, 13, 1, 0],\n"
|
||||||
|
" \"master\": [255, 117, 181, 9, 3, 13, 1, 0],\n"
|
||||||
|
" \"slave\": [1, 42],\n"
|
||||||
|
" \"fields\": {\n"
|
||||||
|
" \"field\": {\"value\": 42, \"raw\": [42]}\n"
|
||||||
|
" },\n"
|
||||||
|
" \"fielddefs\": [\n"
|
||||||
|
" { \"name\": \"field\", \"slave\": true, \"type\": \"UCH\", \"isbits\": false, \"length\": 1, \"unit\": \"\", \"comment\": \"\"}\n"
|
||||||
|
" ]\n"
|
||||||
|
" }: \n"
|
||||||
|
" \"field\": {\"value\": 42, \"raw\": [42]}", "ff75b509030d0100", "012a", "jNr"},
|
||||||
};
|
};
|
||||||
templates = new DataFieldTemplates();
|
templates = new DataFieldTemplates();
|
||||||
unsigned int lineNo = 0;
|
unsigned int lineNo = 0;
|
||||||
@@ -235,6 +255,10 @@ int main() {
|
|||||||
bool decodeVerbose = flags.find('D') != string::npos || flags.find('J') != string::npos;
|
bool decodeVerbose = flags.find('D') != string::npos || flags.find('J') != string::npos;
|
||||||
bool withMessageDump = flags.find('N') != string::npos;
|
bool withMessageDump = flags.find('N') != string::npos;
|
||||||
bool decode = decodeJson || decodeVerbose || (flags.find('d') != string::npos);
|
bool decode = decodeJson || decodeVerbose || (flags.find('d') != string::npos);
|
||||||
|
OutputFormat verbosity = (decodeVerbose?OF_NAMES|OF_UNITS|OF_COMMENTS:OF_NONE)|(decodeJson?OF_NAMES|OF_JSON:OF_NONE);
|
||||||
|
if (flags.find('r') != string::npos) {
|
||||||
|
verbosity |= OF_RAWDATA;
|
||||||
|
}
|
||||||
bool failedPrepare = flags.find('p') != string::npos;
|
bool failedPrepare = flags.find('p') != string::npos;
|
||||||
bool failedPrepareMatch = flags.find('P') != string::npos;
|
bool failedPrepareMatch = flags.find('P') != string::npos;
|
||||||
bool multi = flags.find('*') != string::npos;
|
bool multi = flags.find('*') != string::npos;
|
||||||
@@ -408,7 +432,7 @@ int main() {
|
|||||||
ostringstream output;
|
ostringstream output;
|
||||||
if (withMessageDump) {
|
if (withMessageDump) {
|
||||||
if (decodeJson) {
|
if (decodeJson) {
|
||||||
message->decodeJson(false, false, true, false, OF_JSON|OF_DEFINITION, &output);
|
message->decodeJson(false, false, true, verbosity|OF_DEFINITION, &output);
|
||||||
string str = output.str();
|
string str = output.str();
|
||||||
size_t start = str.find("\"lastup\": ");
|
size_t start = str.find("\"lastup\": ");
|
||||||
if (start != string::npos) {
|
if (start != string::npos) {
|
||||||
@@ -425,8 +449,7 @@ int main() {
|
|||||||
}
|
}
|
||||||
output << ": ";
|
output << ": ";
|
||||||
}
|
}
|
||||||
result = message->decodeLastData(false, nullptr, -1,
|
result = message->decodeLastData(pt_any, false, nullptr, -1, verbosity, &output);
|
||||||
(decodeVerbose?OF_NAMES|OF_UNITS|OF_COMMENTS:OF_NONE)|(decodeJson?OF_NAMES|OF_JSON:OF_NONE), &output);
|
|
||||||
if (result != RESULT_OK) {
|
if (result != RESULT_OK) {
|
||||||
cout << " \"" << check[2] << "\" / \"" << check[3] << "\": decode error " << (message->isWrite() ? "write: " : "read: ")
|
cout << " \"" << check[2] << "\" / \"" << check[3] << "\": decode error " << (message->isWrite() ? "write: " : "read: ")
|
||||||
<< getResultCode(result) << endl;
|
<< getResultCode(result) << endl;
|
||||||
|
|||||||
Reference in New Issue
Block a user