From cc59b32f0d0b19dd15dd5e0d9f35c19099024573 Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 26 Feb 2017 17:34:22 +0100 Subject: [PATCH] clearly separate master/slave symbolstrings --- src/ebusd/bushandler.cpp | 49 ++++---- src/ebusd/bushandler.h | 68 +++++------ src/ebusd/main.cpp | 8 +- src/ebusd/main.h | 4 +- src/ebusd/mainloop.cpp | 26 ++-- src/ebusd/mainloop.h | 5 +- src/lib/ebus/contrib/test/test_tem.cpp | 8 +- src/lib/ebus/message.cpp | 161 ++++++++++++++----------- src/lib/ebus/message.h | 107 ++++++++++------ src/lib/ebus/symbol.h | 27 ++++- src/lib/ebus/test/test_data.cpp | 8 +- src/lib/ebus/test/test_message.cpp | 18 +-- src/lib/ebus/test/test_symbol.cpp | 26 ++-- 13 files changed, 297 insertions(+), 218 deletions(-) diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index 1366ba90..55362fbb 100644 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -71,9 +71,9 @@ result_t PollRequest::prepare(unsigned char ownMasterAddress) { return result; } -bool PollRequest::notify(result_t result, SymbolString& slave) { +bool PollRequest::notify(result_t result, SlaveSymbolString& slave) { if (result == RESULT_OK) { - result = m_message->storeLastData(pt_slaveData, slave, m_index); + result = m_message->storeLastData(slave, m_index); if (result >= RESULT_OK && m_index+1 < m_message->getCount()) { m_index++; result = prepare(m_master[0]); @@ -114,21 +114,21 @@ result_t ScanRequest::prepare(unsigned char ownMasterAddress) { return result; } -bool ScanRequest::notify(result_t result, SymbolString& slave) { +bool ScanRequest::notify(result_t result, SlaveSymbolString& slave) { unsigned char dstAddress = m_master[1]; if (result == RESULT_OK) { if (m_message == m_messageMap->getScanMessage()) { Message* message = m_messageMap->getScanMessage(dstAddress); if (message != NULL) { m_message = message; - m_message->storeLastData(pt_masterData, m_master, m_index); // expected to work since this is a clone + m_message->storeLastData(m_master, m_index); // expected to work since this is a clone } } else if (m_message->getDstAddress() == SYN) { m_message = m_message->derive(dstAddress, true); m_messageMap->add(m_message); - m_message->storeLastData(pt_masterData, m_master, m_index); // expected to work since this is a clone + m_message->storeLastData(m_master, m_index); // expected to work since this is a clone } - result = m_message->storeLastData(pt_slaveData, slave, m_index); + result = m_message->storeLastData(slave, m_index); if (result >= RESULT_OK && m_index+1 < m_message->getCount()) { m_index++; result = prepare(m_master[0]); @@ -180,7 +180,7 @@ bool ScanRequest::notify(result_t result, SymbolString& slave) { } -bool ActiveBusRequest::notify(result_t result, SymbolString& slave) { +bool ActiveBusRequest::notify(result_t result, SlaveSymbolString& slave) { if (result == RESULT_OK) { logDebug(lf_bus, "read res: %s", slave.getDataStr().c_str()); } @@ -189,10 +189,8 @@ bool ActiveBusRequest::notify(result_t result, SymbolString& slave) { return false; } -void GrabbedMessage::setLastData(SymbolString& master, SymbolString& slave) { - m_lastMaster.clear(); +void GrabbedMessage::setLastData(MasterSymbolString& master, SlaveSymbolString& slave) { m_lastMaster = master; - m_lastSlave.clear(); m_lastSlave = slave; m_count++; } @@ -277,7 +275,12 @@ bool GrabbedMessage::dump(const bool unknown, MessageMap* messages, bool first, return true; } bool master = isMaster(dstAddress) || dstAddress == BROADCAST || m_lastSlave.size() <= 1 || m_lastSlave[0] == 0; - SymbolString *input = master ? &m_lastMaster : &m_lastSlave; + SymbolString *input; + if (master) { + input = &m_lastMaster; + } else { + input = &m_lastSlave; + } unsigned char baseOffset = master ? 5 : 1; unsigned char remain = input->size(); if (remain <= baseOffset) { @@ -324,7 +327,7 @@ void BusHandler::clear() { m_scanResults.clear(); } -result_t BusHandler::sendAndWait(SymbolString& master, SymbolString& slave) { +result_t BusHandler::sendAndWait(MasterSymbolString& master, SlaveSymbolString& slave) { result_t result = RESULT_ERR_NO_SIGNAL; slave.clear(); ActiveBusRequest request(master, slave); @@ -355,8 +358,8 @@ result_t BusHandler::readFromBus(Message* message, string inputStr, const unsign const unsigned char srcAddress) { unsigned char masterAddress = srcAddress == SYN ? m_ownMasterAddress : srcAddress; result_t ret = RESULT_EMPTY; - SymbolString master(true); - SymbolString slave; + MasterSymbolString master; + SlaveSymbolString slave; for (unsigned char index = 0; index < message->getCount(); index++) { istringstream input(inputStr); ret = message->prepareMaster(masterAddress, master, input, UI_FIELD_SEPARATOR, dstAddress, index); @@ -370,7 +373,7 @@ result_t BusHandler::readFromBus(Message* message, string inputStr, const unsign logError(lf_bus, "send message part %d: %s", index, getResultCode(ret)); break; } - ret = message->storeLastData(pt_slaveData, slave, index); + ret = message->storeLastData(slave, index); if (ret < RESULT_OK) { logError(lf_bus, "store message part %d: %s", index, getResultCode(ret)); break; @@ -1038,16 +1041,16 @@ void BusHandler::receiveCompleted() { if (message && (message->getLastUpdateTime() == 0 || message->getLastSlaveData().size() < 10)) { // e.g. 10fe07040a b5564149303001248901 m_seenAddresses[slaveAddress] |= SCAN_INIT; - SymbolString idData; + MasterSymbolString dummyMaster; istringstream input; - result_t result = message->prepareMaster(m_ownMasterAddress, idData, input); + result_t result = message->prepareMaster(m_ownMasterAddress, dummyMaster, input); if (result == RESULT_OK) { - idData.clear(); + SlaveSymbolString idData; idData.push_back(9); for (size_t i = 5; i <= 5+9; i++) { idData.push_back(m_command[i]); } - result = message->storeLastData(pt_slaveData, idData, 0); + result = message->storeLastData(idData, 0); } if (result == RESULT_OK) { m_seenAddresses[slaveAddress] |= SCAN_DONE; @@ -1253,7 +1256,7 @@ void BusHandler::formatSeenInfo(ostringstream& output) { } } -result_t BusHandler::scanAndWait(unsigned char dstAddress, SymbolString& slave) { +result_t BusHandler::scanAndWait(unsigned char dstAddress, SlaveSymbolString& slave) { if (!isValidAddress(dstAddress) || isMaster(dstAddress)) { return RESULT_ERR_INVALID_ADDR; } @@ -1263,7 +1266,7 @@ result_t BusHandler::scanAndWait(unsigned char dstAddress, SymbolString& slave) return RESULT_ERR_NOTFOUND; } istringstream input; - SymbolString master(true); + MasterSymbolString master; result_t result = scanMessage->prepareMaster(m_ownMasterAddress, master, input, UI_FIELD_SEPARATOR, dstAddress); if (result == RESULT_OK) { result = sendAndWait(master, slave); @@ -1272,7 +1275,7 @@ result_t BusHandler::scanAndWait(unsigned char dstAddress, SymbolString& slave) if (message != NULL && message != scanMessage) { scanMessage = message; // update the cache, expected to work since this is a clone - scanMessage->storeLastData(pt_masterData, master, 0); + scanMessage->storeLastData(master, 0); } } if (result != RESULT_ERR_NO_SIGNAL) { @@ -1282,7 +1285,7 @@ result_t BusHandler::scanAndWait(unsigned char dstAddress, SymbolString& slave) if (result != RESULT_OK || slave.size() == 0) { // avoid "invalid position" during decode return result; } - return scanMessage->storeLastData(pt_slaveData, slave, 0); // update the cache + return scanMessage->storeLastData(slave, 0); // update the cache } bool BusHandler::enableGrab(bool enable) { diff --git a/src/ebusd/bushandler.h b/src/ebusd/bushandler.h index 58d91c01..58c5fc1d 100644 --- a/src/ebusd/bushandler.h +++ b/src/ebusd/bushandler.h @@ -106,10 +106,10 @@ class BusRequest { public: /** * Constructor. - * @param master the master data @a SymbolString to send. + * @param master the master data @a MasterSymbolString to send. * @param deleteOnFinish whether to automatically delete this @a BusRequest when finished. */ - BusRequest(SymbolString& master, const bool deleteOnFinish) + BusRequest(MasterSymbolString& master, const bool deleteOnFinish) : m_master(master), m_busLostRetries(0), m_deleteOnFinish(deleteOnFinish) {} @@ -121,15 +121,15 @@ class BusRequest { /** * Notify the request of the specified result. * @param result the result of the request. - * @param slave the slave data @a SymbolString received. + * @param slave the @a SlaveSymbolString received. * @return true if the request needs to be restarted. */ - virtual bool notify(result_t result, SymbolString& slave) = 0; + virtual bool notify(result_t result, SlaveSymbolString& slave) = 0; protected: - /** the master data @a SymbolString to send. */ - SymbolString& m_master; + /** the master data @a MasterSymbolString to send. */ + MasterSymbolString& m_master; /** the number of times a send is repeated due to lost arbitration. */ unsigned int m_busLostRetries; @@ -166,12 +166,12 @@ class PollRequest : public BusRequest { result_t prepare(unsigned char masterAddress); // @copydoc - virtual bool notify(result_t result, SymbolString& slave); + virtual bool notify(result_t result, SlaveSymbolString& slave); private: - /** the master data @a SymbolString. */ - SymbolString m_master{true}; + /** the master data @a MasterSymbolString. */ + MasterSymbolString m_master; /** the associated @a Message. */ Message* m_message; @@ -215,15 +215,15 @@ class ScanRequest : public BusRequest { result_t prepare(unsigned char masterAddress); // @copydoc - virtual bool notify(result_t result, SymbolString& slave); + virtual bool notify(result_t result, SlaveSymbolString& slave); private: /** the @a MessageMap instance. */ MessageMap* m_messageMap; - /** the master data @a SymbolString. */ - SymbolString m_master{true}; + /** the master data @a MasterSymbolString. */ + MasterSymbolString m_master; /** the currently queried @a Message. */ Message* m_message; @@ -257,10 +257,10 @@ class ActiveBusRequest : public BusRequest { public: /** * Constructor. - * @param master the master data @a SymbolString to send. - * @param slave reference to @a SymbolString for filling in the received slave data. + * @param master the master data @a MasterSymbolString to send. + * @param slave reference to @a SlaveSymbolString for filling in the received slave data. */ - ActiveBusRequest(SymbolString& master, SymbolString& slave) + ActiveBusRequest(MasterSymbolString& master, SlaveSymbolString& slave) : BusRequest(master, false), m_result(RESULT_ERR_NO_SIGNAL), m_slave(slave) {} /** @@ -269,15 +269,15 @@ class ActiveBusRequest : public BusRequest { virtual ~ActiveBusRequest() {} // @copydoc - virtual bool notify(result_t result, SymbolString& slave); + virtual bool notify(result_t result, SlaveSymbolString& slave); private: /** the result of handling the request. */ result_t m_result; - /** reference to @a SymbolString for filling in the received slave data. */ - SymbolString& m_slave; + /** reference to @a SlaveSymbolString for filling in the received slave data. */ + SlaveSymbolString& m_slave; }; @@ -302,10 +302,10 @@ class GrabbedMessage { /** * Set the last received data. - * @param master the last master @a SymbolString. - * @param slave the last slave @a SymbolString. + * @param master the last @a MasterSymbolString. + * @param slave the last @a SymbolString. */ - void setLastData(SymbolString& master, SymbolString& slave); + void setLastData(MasterSymbolString& master, SlaveSymbolString& slave); /** * Dump the last received data and message count to the output. @@ -320,11 +320,11 @@ class GrabbedMessage { private: - /** the last master @a SymbolString. */ - SymbolString m_lastMaster; + /** the last @a MasterSymbolString. */ + MasterSymbolString m_lastMaster; - /** the last slave @a SymbolString. */ - SymbolString m_lastSlave; + /** the last @a SlaveSymbolString. */ + SlaveSymbolString m_lastSlave; /** the number of times this message was seen. */ unsigned int m_count; @@ -401,11 +401,11 @@ class BusHandler : public WaitThread { /** * Send a message on the bus and wait for the answer. - * @param master the @a SymbolString with the master data to send. - * @param slave the @a SymbolString that will be filled with retrieved slave data. + * @param master the @a MasterSymbolString with the master data to send. + * @param slave the @a SlaveSymbolString that will be filled with retrieved slave data. * @return the result code. */ - result_t sendAndWait(SymbolString& master, SymbolString& slave); + result_t sendAndWait(MasterSymbolString& master, SlaveSymbolString& slave); /** * Prepare the master part for the @a Message, send it to the bus and wait for the answer. @@ -458,10 +458,10 @@ class BusHandler : public WaitThread { /** * Send a scan message on the bus and wait for the answer. * @param dstAddress the destination slave address to send to. - * @param slave the @a SymbolString that will be filled with retrieved slave data. + * @param slave the @a SlaveSymbolString that will be filled with retrieved slave data. * @return the result code. */ - result_t scanAndWait(unsigned char dstAddress, SymbolString& slave); + result_t scanAndWait(unsigned char dstAddress, SlaveSymbolString& slave); /** * Start or stop grabbing unknown messages. @@ -647,11 +647,11 @@ class BusHandler : public WaitThread { /** whether the current message part is being repeated. */ bool m_repeat; - /** the received command. */ - SymbolString m_command{true}; + /** the received command @a MasterSymbolString. */ + MasterSymbolString m_command; - /** the received response or response to send. */ - SymbolString m_response; + /** the received response @a SlaveSymbolString or response to send. */ + SlaveSymbolString m_response; /** the participating bus addresses seen so far (0 if not seen yet, or combination of @a SEEN bits). */ unsigned char m_seenAddresses[256]; diff --git a/src/ebusd/main.cpp b/src/ebusd/main.cpp index 783b24b6..e332f843 100644 --- a/src/ebusd/main.cpp +++ b/src/ebusd/main.cpp @@ -875,7 +875,7 @@ result_t loadConfigFiles(MessageMap* messages, bool verbose, bool denyRecursive) return RESULT_OK; } -result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SymbolString& data, string& relativeFile, +result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SlaveSymbolString& data, string& relativeFile, bool verbose) { PartType partType; if (isMaster(address)) { @@ -1053,6 +1053,9 @@ result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SymbolS * @return the exit code. */ int main(int argc, char* argv[]) { + /* if (argc >= 2 && strcmp(argv[1], "config") == 0) { + return config_main(argc, argv); + }*/ struct argp aargp = { argpoptions, parse_opt, NULL, argpdoc, datahandler_getargs(), NULL, NULL }; int arg_index = -1; setenv("ARGP_HELP_FMT", "no-dup-args-note", 0); @@ -1081,7 +1084,8 @@ int main(int argc, char* argv[]) { logError(lf_main, "invalid scan message %s: missing \"/\"", arg.c_str()); continue; } - SymbolString master(false), slave(false); + MasterSymbolString master; + SlaveSymbolString slave; result_t res = master.parseHex(arg.substr(0, pos)); if (res == RESULT_OK) { res = slave.parseHex(arg.substr(pos+1)); diff --git a/src/ebusd/main.h b/src/ebusd/main.h index a8d519aa..b07489d9 100644 --- a/src/ebusd/main.h +++ b/src/ebusd/main.h @@ -103,12 +103,12 @@ result_t loadConfigFiles(MessageMap* messages, bool verbose = false, bool denyRe * @param messages the @a MessageMap to load the messages into. * @param address the address of the scan participant * (either master for broadcast master data or slave for read slave data). - * @param data the scan @a SymbolString for which to load the configuration file. + * @param data the scan @a SlaveSymbolString for which to load the configuration file. * @param relativeFile the string in which the name of the configuration file is stored on success. * @param verbose whether to verbosely log problems. * @return the result code. */ -result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SymbolString& data, string& relativeFile, +result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SlaveSymbolString& data, string& relativeFile, bool verbose = false); } // namespace ebusd diff --git a/src/ebusd/mainloop.cpp b/src/ebusd/mainloop.cpp index a4a02c51..5db93998 100644 --- a/src/ebusd/mainloop.cpp +++ b/src/ebusd/mainloop.cpp @@ -233,7 +233,7 @@ void MainLoop::run() { result = m_busHandler->startScan(true, "*"); } else { logNotice(lf_main, "starting initial scan for %2.2x", m_initialScan); - SymbolString slave; + SlaveSymbolString slave; result = m_busHandler->scanAndWait(m_initialScan, slave); Message* message = m_messages->getScanMessage(m_initialScan); if (result == RESULT_OK && message != NULL) { @@ -257,7 +257,7 @@ void MainLoop::run() { taskDelay = 5; lastScanAddress = 0; } else { - SymbolString slave; + SlaveSymbolString slave; if (scanned) { Message* message = m_messages->getScanMessage(lastScanAddress); slave = message->getLastSlaveData(); @@ -472,7 +472,7 @@ string MainLoop::decodeMessage(const string& data, const bool isHttp, bool& conn return "ERR: command not found"; } -result_t MainLoop::parseHexMaster(vector &args, size_t argPos, SymbolString& master, +result_t MainLoop::parseHexMaster(vector &args, size_t argPos, MasterSymbolString& master, unsigned char srcAddress) { ostringstream msg; while (argPos < args.size()) { @@ -614,7 +614,7 @@ string MainLoop::executeRead(vector &args, const string levels) { time(&now); if (hex && argPos > 0) { - SymbolString master(true); + MasterSymbolString master; result_t ret = parseHexMaster(args, argPos, master, srcAddress); if (ret != RESULT_OK) { return getResultCode(ret); @@ -642,13 +642,13 @@ string MainLoop::executeRead(vector &args, const string levels) { if (srcAddress == SYN && (message->getLastUpdateTime() + maxAge > now || (message->isPassive() && message->getLastUpdateTime() != 0))) { - SymbolString& slave = message->getLastSlaveData(); + SlaveSymbolString& slave = message->getLastSlaveData(); logNotice(lf_main, "hex read %s %s from cache", message->getCircuit().c_str(), message->getName().c_str()); return slave.getDataStr(); } // send message - SymbolString slave; + SlaveSymbolString slave; ret = m_busHandler->sendAndWait(master, slave); if (ret == RESULT_OK) { @@ -761,7 +761,7 @@ string MainLoop::executeRead(vector &args, const string levels) { if (verbosity & OF_NAMES) { result << message->getCircuit() << " " << message->getName() << " "; } - ret = message->decodeLastData(pt_slaveData, result, verbosity|(numeric?OF_NUMERIC:0), false, + ret = message->decodeLastSlaveData(result, verbosity|(numeric?OF_NUMERIC:0), false, fieldIndex == -2 ? NULL : fieldName.c_str(), fieldIndex); if (ret < RESULT_OK) { logError(lf_main, "read %s %s: decode %s", message->getCircuit().c_str(), message->getName().c_str(), @@ -821,7 +821,7 @@ string MainLoop::executeWrite(vector &args, const string levels) { } if (hex && argPos > 0) { - SymbolString master(true); + MasterSymbolString master; result_t ret = parseHexMaster(args, argPos, master, srcAddress); if (ret != RESULT_OK) { return getResultCode(ret); @@ -844,7 +844,7 @@ string MainLoop::executeWrite(vector &args, const string levels) { return getResultCode(RESULT_ERR_INVALID_ARG); // non-matching circuit } // send message - SymbolString slave; + SlaveSymbolString slave; ret = m_busHandler->sendAndWait(master, slave); if (ret == RESULT_OK) { @@ -916,7 +916,7 @@ string MainLoop::executeWrite(vector &args, const string levels) { return getResultCode(RESULT_OK); } - ret = message->decodeLastData(pt_slaveData, result); // decode data + ret = message->decodeLastSlaveData(result); // decode data if (ret >= RESULT_OK && result.str().empty()) { logNotice(lf_main, "write %s %s: decode %s", message->getCircuit().c_str(), message->getName().c_str(), getResultCode(ret)); @@ -956,7 +956,7 @@ string MainLoop::executeHex(vector &args) { } if (argPos > 0) { - SymbolString master(true); + MasterSymbolString master; result_t ret = parseHexMaster(args, argPos, master, srcAddress); if (ret != RESULT_OK) { return getResultCode(ret); @@ -964,7 +964,7 @@ string MainLoop::executeHex(vector &args) { logNotice(lf_main, "hex cmd: %s", master.getDataStr().c_str()); // send message - SymbolString slave; + SlaveSymbolString slave; ret = m_busHandler->sendAndWait(master, slave); if (ret == RESULT_OK) { @@ -1305,7 +1305,7 @@ string MainLoop::executeScan(vector &args, string levels) { if (result != RESULT_OK) { return getResultCode(result); } - SymbolString slave; + SlaveSymbolString slave; result = m_busHandler->scanAndWait(dstAddress, slave); if (result != RESULT_OK) { return getResultCode(result); diff --git a/src/ebusd/mainloop.h b/src/ebusd/mainloop.h index af7d897f..c2b6784d 100644 --- a/src/ebusd/mainloop.h +++ b/src/ebusd/mainloop.h @@ -145,11 +145,12 @@ class MainLoop : public Thread, DeviceListener { * Parse the hex master message from the remaining arguments. * @param args the arguments passed to the command. * @param argPos the index of the first argument to parse. - * @param master the master @a SymbolString to write the data to. + * @param master the @a MasterSymbolString to write the data to. * @param srcAddress the source address to set, or @a SYN for the own master address. * @return the result from parsing the arguments. */ - result_t parseHexMaster(vector &args, size_t argPos, SymbolString& master, unsigned char srcAddress = SYN); + result_t parseHexMaster(vector &args, size_t argPos, MasterSymbolString& master, + unsigned char srcAddress = SYN); /** * Get the access levels associated with the specified user name. diff --git a/src/lib/ebus/contrib/test/test_tem.cpp b/src/lib/ebus/contrib/test/test_tem.cpp index 94031b88..47b28c50 100644 --- a/src/lib/ebus/contrib/test/test_tem.cpp +++ b/src/lib/ebus/contrib/test/test_tem.cpp @@ -77,14 +77,14 @@ int main() { string check[5] = checks[i]; istringstream isstr(check[0]); string expectStr = check[1]; - SymbolString mstr(true); + MasterSymbolString mstr; result_t result = mstr.parseHex(check[2]); if (result != RESULT_OK) { cout << "\"" << check[0] << "\": parse \"" << check[2] << "\" error: " << getResultCode(result) << endl; error = true; continue; } - SymbolString sstr; + SlaveSymbolString sstr; result = sstr.parseHex(check[3]); if (result != RESULT_OK) { cout << "\"" << check[0] << "\": parse \"" << check[3] << "\" error: " << getResultCode(result) << endl; @@ -130,14 +130,14 @@ int main() { cout << "\": create OK" << endl; ostringstream output; - SymbolString writeMstr(true); + MasterSymbolString writeMstr; result = writeMstr.parseHex(mstr.getDataStr().substr(0, 10)); if (result != RESULT_OK) { cout << " parse \"" << mstr.getDataStr().substr(0, 10) << "\" error: " << getResultCode(result) << endl; error = true; } - SymbolString writeSstr; + SlaveSymbolString writeSstr; result = writeSstr.parseHex(sstr.getDataStr().substr(0, 2)); if (result != RESULT_OK) { cout << " parse \"" << sstr.getDataStr().substr(0, 2) << "\" error: " << getResultCode(result) diff --git a/src/lib/ebus/message.cpp b/src/lib/ebus/message.cpp index 12103252..44c4f10b 100644 --- a/src/lib/ebus/message.cpp +++ b/src/lib/ebus/message.cpp @@ -155,7 +155,7 @@ uint64_t Message::createKey(const vector id, return key; } -uint64_t Message::createKey(SymbolString& master, unsigned char maxIdLength, bool anyDestination) { +uint64_t Message::createKey(MasterSymbolString& master, unsigned char maxIdLength, bool anyDestination) { if (master.size() < 5) { return INVALID_KEY; } @@ -532,7 +532,7 @@ bool Message::checkIdPrefix(vector& id) { return true; } -bool Message::checkId(SymbolString& master, unsigned char* index) { +bool Message::checkId(MasterSymbolString& master, unsigned char* index) { unsigned char idLen = getIdLength(); if (master.size() < 5+idLen) { // QQ, ZZ, PB, SB, NN return false; @@ -590,7 +590,7 @@ bool Message::hasField(const char* fieldName, bool numeric) { return m_data->hasField(fieldName, numeric); } -result_t Message::prepareMaster(const unsigned char srcAddress, SymbolString& master, +result_t Message::prepareMaster(const unsigned char srcAddress, MasterSymbolString& master, istringstream& input, char separator, const unsigned char dstAddress, unsigned char index) { if (m_isPassive) { @@ -612,14 +612,15 @@ result_t Message::prepareMaster(const unsigned char srcAddress, SymbolString& ma if (result != RESULT_OK) { return result; } - result = storeLastData(pt_masterData, master, index); + result = storeLastData(master, index); if (result < RESULT_OK) { return result; } return RESULT_OK; } -result_t Message::prepareMasterPart(SymbolString& master, istringstream& input, char separator, unsigned char index) { +result_t Message::prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator, + unsigned char index) { if (index != 0) { return RESULT_ERR_NOTFOUND; } @@ -636,7 +637,7 @@ result_t Message::prepareMasterPart(SymbolString& master, istringstream& input, return result; } -result_t Message::prepareSlave(istringstream& input, SymbolString& slave) { +result_t Message::prepareSlave(istringstream& input, SlaveSymbolString& slave) { if (m_isWrite) { return RESULT_ERR_INVALID_ARG; // prepare not possible } @@ -655,49 +656,59 @@ result_t Message::prepareSlave(istringstream& input, SymbolString& slave) { return result; } -result_t Message::storeLastData(SymbolString& master, SymbolString& slave) { - result_t result = storeLastData(pt_masterData, master, 0); +result_t Message::storeLastData(MasterSymbolString& master, SlaveSymbolString& slave) { + result_t result = storeLastData(master, 0); if (result >= RESULT_OK) { - result = storeLastData(pt_slaveData, slave, 0); + result = storeLastData(slave, 0); } return result; } -result_t Message::storeLastData(const PartType partType, SymbolString& data, unsigned char index) { +result_t Message::storeLastData(MasterSymbolString& data, unsigned char index) { if (data.size() > 0 - && (m_isWrite || this->m_dstAddress == BROADCAST || partType == pt_slaveData - || (partType == pt_masterData && isMaster(this->m_dstAddress)))) { + && (m_isWrite || this->m_dstAddress == BROADCAST || isMaster(this->m_dstAddress))) { time(&m_lastUpdateTime); } - if (partType == pt_masterData) { - switch (data.compareTo(m_lastMasterData)) { - case 1: // completely different - m_lastChangeTime = m_lastUpdateTime; - m_lastMasterData = data; - break; - case 2: // only master address is different - m_lastMasterData = data; - break; - } - } else if (partType == pt_slaveData) { - if (data != m_lastSlaveData) { - m_lastChangeTime = m_lastUpdateTime; - m_lastSlaveData = data; - } + switch (data.compareTo(m_lastMasterData)) { + case 1: // completely different + m_lastChangeTime = m_lastUpdateTime; + m_lastMasterData = data; + break; + case 2: // only master address is different + m_lastMasterData = data; + break; } return RESULT_OK; } -result_t Message::decodeLastData(const PartType partType, - ostringstream& output, OutputFormat outputFormat, - bool leadingSeparator, const char* fieldName, signed char fieldIndex) { - unsigned char offset; - if (partType == pt_masterData) { - offset = (unsigned char)(m_id.size() - 2); - } else { - offset = 0; +result_t Message::storeLastData(SlaveSymbolString& data, unsigned char index) { + if (data.size() > 0) { + time(&m_lastUpdateTime); } - result_t result = m_data->read(partType, partType == pt_masterData ? m_lastMasterData : m_lastSlaveData, offset, + if (data != m_lastSlaveData) { + m_lastChangeTime = m_lastUpdateTime; + m_lastSlaveData = data; + } + return RESULT_OK; +} + +result_t Message::decodeLastMasterData(ostringstream& output, OutputFormat outputFormat, + bool leadingSeparator, const char* fieldName, signed char fieldIndex) { + unsigned char offset = (unsigned char)(m_id.size() - 2); + result_t result = m_data->read(pt_masterData, m_lastMasterData, offset, + output, outputFormat, -1, leadingSeparator, fieldName, fieldIndex); + if (result < RESULT_OK) { + return result; + } + if (result == RESULT_EMPTY && fieldName != NULL) { + return RESULT_ERR_NOTFOUND; + } + return result; +} + +result_t Message::decodeLastSlaveData(ostringstream& output, OutputFormat outputFormat, + bool leadingSeparator, const char* fieldName, signed char fieldIndex) { + result_t result = m_data->read(pt_slaveData, m_lastSlaveData, 0, output, outputFormat, -1, leadingSeparator, fieldName, fieldIndex); if (result < RESULT_OK) { return result; @@ -873,13 +884,13 @@ ChainedMessage::ChainedMessage(const string circuit, const string level, const s m_ids(ids), m_lengths(lengths), m_maxTimeDiff(m_ids.size()*15) { // 15 seconds per message size_t cnt = ids.size(); - m_lastMasterDatas = reinterpret_cast(calloc(cnt, sizeof(SymbolString*))); - m_lastSlaveDatas = reinterpret_cast(calloc(cnt, sizeof(SymbolString*))); + m_lastMasterDatas = reinterpret_cast(calloc(cnt, sizeof(MasterSymbolString*))); + m_lastSlaveDatas = reinterpret_cast(calloc(cnt, sizeof(SlaveSymbolString*))); m_lastMasterUpdateTimes = reinterpret_cast(calloc(cnt, sizeof(time_t))); m_lastSlaveUpdateTimes = reinterpret_cast(calloc(cnt, sizeof(time_t))); for (size_t index = 0; index < cnt; index++) { - m_lastMasterDatas[index] = new SymbolString(true); - m_lastSlaveDatas[index] = new SymbolString(); + m_lastMasterDatas[index] = new MasterSymbolString; + m_lastSlaveDatas[index] = new SlaveSymbolString(); } } @@ -908,7 +919,7 @@ Message* ChainedMessage::derive(const unsigned char dstAddress, const unsigned c return result; } -bool ChainedMessage::checkId(SymbolString& master, unsigned char* index) { +bool ChainedMessage::checkId(MasterSymbolString& master, unsigned char* index) { unsigned char idLen = getIdLength(); if (master.size() < 5+idLen) { // QQ, ZZ, PB, SB, NN return false; @@ -969,13 +980,13 @@ bool ChainedMessage::checkId(Message& other) { return false; } -result_t ChainedMessage::prepareMasterPart(SymbolString& master, istringstream& input, char separator, +result_t ChainedMessage::prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator, unsigned char index) { size_t cnt = getCount(); if (index >= cnt) { return RESULT_ERR_NOTFOUND; } - SymbolString allData(true); + MasterSymbolString allData; result_t result = m_data->write(input, pt_masterData, allData, 0, separator); if (result != RESULT_OK) { return result; @@ -1007,42 +1018,50 @@ result_t ChainedMessage::prepareMasterPart(SymbolString& master, istringstream& return result; } -result_t ChainedMessage::storeLastData(SymbolString& master, SymbolString& slave) { +result_t ChainedMessage::storeLastData(MasterSymbolString& master, SlaveSymbolString& slave) { // determine index from master ID unsigned char index = 0; if (checkId(master, &index)) { - result_t result = storeLastData(pt_masterData, master, index); + result_t result = storeLastData(master, index); if (result >= RESULT_OK) { - result = storeLastData(pt_slaveData, slave, index); + result = storeLastData(slave, index); } return result; } return RESULT_ERR_INVALID_ARG; } -result_t ChainedMessage::storeLastData(const PartType partType, SymbolString& data, unsigned char index) { +result_t ChainedMessage::storeLastData(MasterSymbolString& data, unsigned char index) { if (index >= m_ids.size()) { return RESULT_ERR_INVALID_ARG; } - if (partType == pt_masterData) { - switch (data.compareTo(*m_lastMasterDatas[index])) { - case 1: // completely different - *m_lastMasterDatas[index] = data; - break; - case 2: // only master address is different - *m_lastMasterDatas[index] = data; - break; - } - time(&m_lastMasterUpdateTimes[index]); - } else if (partType == pt_slaveData) { - if (data != *m_lastSlaveDatas[index]) { - *m_lastSlaveDatas[index] = data; - } - time(&m_lastSlaveUpdateTimes[index]); + switch (data.compareTo(*m_lastMasterDatas[index])) { + case 1: // completely different + *m_lastMasterDatas[index] = data; + break; + case 2: // only master address is different + *m_lastMasterDatas[index] = data; + break; } + time(&m_lastMasterUpdateTimes[index]); + return combineLastParts(); +} + +result_t ChainedMessage::storeLastData(SlaveSymbolString& data, unsigned char index) { + if (index >= m_ids.size()) { + return RESULT_ERR_INVALID_ARG; + } + if (data != *m_lastSlaveDatas[index]) { + *m_lastSlaveDatas[index] = data; + } + time(&m_lastSlaveUpdateTimes[index]); + return combineLastParts(); +} + +result_t ChainedMessage::combineLastParts() { // check arrival time of all parts time_t minTime = 0, maxTime = 0; - for (index = 0; index < m_ids.size(); index++) { + for (unsigned char index = 0; index < m_ids.size(); index++) { if (index == 0) { minTime = maxTime = m_lastMasterUpdateTimes[index]; } else { @@ -1064,10 +1083,10 @@ result_t ChainedMessage::storeLastData(const PartType partType, SymbolString& da } } // everything was completely retrieved in short time - SymbolString master(true); - SymbolString slave; + MasterSymbolString master; + SlaveSymbolString slave; size_t offset = 5+(m_ids[0].size()-2); // skip QQ, ZZ, PB, SB, NN - for (index = 0; index < m_ids.size(); index++) { + for (unsigned char index = 0; index < m_ids.size(); index++) { SymbolString* add = m_lastMasterDatas[index]; size_t end = 5+(*add)[4]; for (size_t pos = index == 0 ? 0 : offset; pos < end; pos++) { @@ -1085,9 +1104,9 @@ result_t ChainedMessage::storeLastData(const PartType partType, SymbolString& da } master[4] = (unsigned char)(master.size()-5); slave[0] = (unsigned char)(slave.size()-1); - result_t result = Message::storeLastData(pt_masterData, master, 0); + result_t result = Message::storeLastData(master, 0); if (result == RESULT_OK) { - result = Message::storeLastData(pt_slaveData, slave, 0); + result = Message::storeLastData(slave, 0); } return result; } @@ -1116,9 +1135,9 @@ void ChainedMessage::dumpColumn(ostream& output, column_t column, bool withCondi /** * Get the first available @a Message from the list. * @param messages the list of @a Message instances to check. - * @param sameIdExtAs the optional @a Message to check for having the same ID. + * @param sameIdExtAs the optional @a MasterSymbolString to check for having the same ID. */ -Message* getFirstAvailable(vector &messages, SymbolString* sameIdExtAs) { +Message* getFirstAvailable(vector &messages, MasterSymbolString* sameIdExtAs) { for (vector::iterator msgIt = messages.begin(); msgIt != messages.end(); msgIt++) { Message* message = *msgIt; if (sameIdExtAs && !message->checkId(*sameIdExtAs)) { @@ -2034,7 +2053,7 @@ deque MessageMap::findAll(const string& circuit, const string& name, c return ret; } -Message* MessageMap::find(SymbolString& master, bool anyDestination, +Message* MessageMap::find(MasterSymbolString& master, bool anyDestination, const bool withRead, const bool withWrite, const bool withPassive) { if (master.size() >= 5 && master[4] == 0 && anyDestination && master[2] == 0x07 && master[3] == 0x04) { return m_scanMessage; diff --git a/src/lib/ebus/message.h b/src/lib/ebus/message.h index e54817bf..e8184058 100644 --- a/src/lib/ebus/message.h +++ b/src/lib/ebus/message.h @@ -173,13 +173,13 @@ class Message { const unsigned char srcAddress, const unsigned char dstAddress); /** - * Calculate the key for the master @a SymbolString. - * @param master the master @a SymbolString. + * Calculate the key for the @a MasterSymbolString. + * @param master the @a MasterSymbolString. * @param maxIdLength the maximum ID length to use * @param anyDestination @p true to use the special @a SYN as destination address in the key. * @return the key for the ID, or -1LL if the data is invalid. */ - static uint64_t createKey(SymbolString& master, + static uint64_t createKey(MasterSymbolString& master, unsigned char maxIdLength, bool anyDestination = false); /** @@ -349,11 +349,11 @@ class Message { /** * Check the ID against the master @a SymbolString data. - * @param master the master @a SymbolString to check against. + * @param master the @a MasterSymbolString to check against. * @param index the variable in which to store the message part index, or NULL to ignore. * @return true if the ID matches, false otherwise. */ - virtual bool checkId(SymbolString& master, unsigned char* index = NULL); + virtual bool checkId(MasterSymbolString& master, unsigned char* index = NULL); /** * Check the ID against the other @a Message. @@ -421,14 +421,14 @@ class Message { /** * Prepare the master @a SymbolString for sending a query or command to the bus. * @param srcAddress the source address to set. - * @param master the master data @a SymbolString for writing symbols to. + * @param master the @a MasterSymbolString for writing symbols to. * @param input the @a istringstream to parse the formatted value(s) from. * @param separator the separator character between multiple fields. * @param dstAddress the destination address to set, or @a SYN to keep the address defined during construction. * @param index the index of the part to prepare. * @return @a RESULT_OK on success, or an error code. */ - result_t prepareMaster(const unsigned char srcAddress, SymbolString& master, + result_t prepareMaster(const unsigned char srcAddress, MasterSymbolString& master, istringstream& input, char separator = UI_FIELD_SEPARATOR, const unsigned char dstAddress = SYN, unsigned char index = 0); @@ -436,44 +436,51 @@ class Message { protected: /** * Prepare a part of the master data @a SymbolString for sending (everything including NN). - * @param master the master data @a SymbolString for writing symbols to. + * @param master the @a MasterSymbolString for writing symbols to. * @param input the @a istringstream to parse the formatted value(s) from. * @param separator the separator character between multiple fields. * @param index the index of the part to prepare. * @return @a RESULT_OK on success, or an error code. */ - virtual result_t prepareMasterPart(SymbolString& master, istringstream& input, char separator, unsigned char index); + virtual result_t prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator, + unsigned char index); public: /** * Prepare the slave @a SymbolString for sending an answer to the bus. * @param input the @a istringstream to parse the formatted value(s) from. - * @param slave the slave data @a SymbolString for writing symbols to. + * @param slave the @a SlaveSymbolString for writing symbols to. * @return @a RESULT_OK on success, or an error code. */ - virtual result_t prepareSlave(istringstream& input, SymbolString& slave); + virtual result_t prepareSlave(istringstream& input, SlaveSymbolString& slave); /** * Store the last seen master and slave data. - * @param master the last seen master data. - * @param slave the last seen slave data. + * @param master the last seen @a MasterSymbolString. + * @param slave the last seen @a SlaveSymbolString. * @return @a RESULT_OK on success, or an error code. */ - virtual result_t storeLastData(SymbolString& master, SymbolString& slave); + virtual result_t storeLastData(MasterSymbolString& master, SlaveSymbolString& slave); /** - * Store last seen master or slave data. - * @param partType the @a PartType of the data. - * @param data the last seen data. + * Store last seen master data. + * @param data the last @a MasterSymbolString. * @param index the index of the part to store. * @return @a RESULT_OK on success, or an error code. */ - virtual result_t storeLastData(const PartType partType, SymbolString& data, unsigned char index); + virtual result_t storeLastData(MasterSymbolString& data, unsigned char index); /** - * Decode the value from the last stored data. - * @param partType the @a PartType of the data. + * Store last seen slave data. + * @param data the last seen @a SlaveSymbolString. + * @param index the index of the part to store. + * @return @a RESULT_OK on success, or an error code. + */ + virtual result_t storeLastData(SlaveSymbolString& data, unsigned char index); + + /** + * Decode the value from the last stored master data. * @param output the @a ostringstream to append the formatted value to. * @param outputFormat the @a OutputFormat options to use. * @param leadingSeparator whether to prepend a separator before the formatted value. @@ -481,8 +488,19 @@ class Message { * @param fieldIndex the optional index of the named field to limit the output to, or -1. * @return @a RESULT_OK on success, or an error code. */ - virtual result_t decodeLastData(const PartType partType, - ostringstream& output, OutputFormat outputFormat = 0, + virtual result_t decodeLastMasterData(ostringstream& output, OutputFormat outputFormat = 0, + bool leadingSeparator = false, const char* fieldName = NULL, signed char fieldIndex = -1); + + /** + * Decode the value from the last stored slave data. + * @param output the @a ostringstream to append the formatted value to. + * @param outputFormat the @a OutputFormat options to use. + * @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 named field to limit the output to, or -1. + * @return @a RESULT_OK on success, or an error code. + */ + virtual result_t decodeLastSlaveData(ostringstream& output, OutputFormat outputFormat = 0, bool leadingSeparator = false, const char* fieldName = NULL, signed char fieldIndex = -1); /** @@ -508,15 +526,15 @@ class Message { /** * Get the last seen master data. - * @return the last seen master @a SymbolString. + * @return the last seen @a MasterSymbolString. */ - SymbolString& getLastMasterData() { return m_lastMasterData; } + MasterSymbolString& getLastMasterData() { return m_lastMasterData; } /** * Get the last seen slave data. - * @return the last seen slave @a SymbolString. + * @return the last seen @a SlaveSymbolString. */ - SymbolString& getLastSlaveData() { return m_lastSlaveData; } + SlaveSymbolString& getLastSlaveData() { return m_lastSlaveData; } /** * Get the time when this message was last seen with reasonable data. @@ -630,11 +648,11 @@ class Message { /** the @a Condition for this message, or NULL. */ Condition* m_condition; - /** the last seen master data. */ - SymbolString m_lastMasterData{true}; + /** the last seen @a MasterSymbolString. */ + MasterSymbolString m_lastMasterData; - /** the last seen slave data. */ - SymbolString m_lastSlaveData; + /** the last seen @a SlaveSymbolString. */ + SlaveSymbolString m_lastSlaveData; /** the system time when the message was last updated, 0 for never. */ time_t m_lastUpdateTime; @@ -691,7 +709,7 @@ class ChainedMessage : public Message { virtual unsigned char getIdLength() const { return (unsigned char)(m_ids[0].size() - 2); } // @copydoc - virtual bool checkId(SymbolString& master, unsigned char* index = NULL); + virtual bool checkId(MasterSymbolString& master, unsigned char* index = NULL); // @copydoc virtual bool checkId(Message& other); @@ -702,16 +720,25 @@ class ChainedMessage : public Message { protected: // @copydoc - virtual result_t prepareMasterPart(SymbolString& master, istringstream& input, char separator, unsigned char index); + virtual result_t prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator, + unsigned char index); public: // @copydoc - virtual result_t storeLastData(SymbolString& master, SymbolString& slave); + virtual result_t storeLastData(MasterSymbolString& master, SlaveSymbolString& slave); // @copydoc - virtual result_t storeLastData(const PartType partType, SymbolString& data, unsigned char index); + virtual result_t storeLastData(MasterSymbolString& data, unsigned char index); + // @copydoc + virtual result_t storeLastData(SlaveSymbolString& data, unsigned char index); + + /** + * Combine all last stored data. + * @return the result code. + */ + virtual result_t combineLastParts(); protected: // @copydoc @@ -728,11 +755,11 @@ class ChainedMessage : public Message { /** the maximum allowed time difference of any data pair. */ const time_t m_maxTimeDiff; - /** array of the last seen master datas. */ - SymbolString** m_lastMasterDatas; + /** array of the last seen @a MasterSymbolString instances. */ + MasterSymbolString** m_lastMasterDatas; - /** array of the last seen slave datas. */ - SymbolString** m_lastSlaveDatas; + /** array of the last seen @a SlaveSymbolString instances. */ + SlaveSymbolString** m_lastSlaveDatas; /** array of the system times when the corresponding master data was last updated, 0 for never. */ time_t* m_lastMasterUpdateTimes; @@ -1337,7 +1364,7 @@ class MessageMap : public FileReader { /** * Find the @a Message instance for the specified master data. - * @param master the master @a SymbolString for identifying the @a Message. + * @param master the @a MasterSymbolString for identifying the @a Message. * @param anyDestination true to only return messages without a particular destination. * @param withRead true to include read messages (default true). * @param withWrite true to include write messages (default true). @@ -1345,7 +1372,7 @@ class MessageMap : public FileReader { * @return the @a Message instance, or NULL. * Note: the caller may not free the returned instance. */ - Message* find(SymbolString& master, bool anyDestination = false, + Message* find(MasterSymbolString& master, bool anyDestination = false, const bool withRead = true, const bool withWrite = true, const bool withPassive = true); /** diff --git a/src/lib/ebus/symbol.h b/src/lib/ebus/symbol.h index 88436cf7..a27febfa 100644 --- a/src/lib/ebus/symbol.h +++ b/src/lib/ebus/symbol.h @@ -113,13 +113,14 @@ int parseSignedInt(const char* str, int base, const int minValue, const int maxV * A string of unescaped bus symbols. */ class SymbolString { - public: + protected: /** * Creates a new empty instance. * @param isMaster whether this instance if for the master part. */ explicit SymbolString(const bool isMaster = false) { m_isMaster = isMaster; } + public: /** * Update the CRC by adding a value. * @param crc the current CRC to update. @@ -268,6 +269,30 @@ class SymbolString { }; +/** + * A string of unescaped master bus symbols. + */ +class MasterSymbolString : public SymbolString { + public: + /** + * Creates a new empty instance. + */ + MasterSymbolString() : SymbolString(true) {} +}; + + +/** + * A string of unescaped slave bus symbols. + */ +class SlaveSymbolString : public SymbolString { + public: + /** + * Creates a new empty instance. + */ + SlaveSymbolString() : SymbolString(false) {} +}; + + /** * Return whether the address is one of the 25 master addresses. * @param addr the address to check. diff --git a/src/lib/ebus/test/test_data.cpp b/src/lib/ebus/test/test_data.cpp index 361d3e52..e831dc25 100644 --- a/src/lib/ebus/test/test_data.cpp +++ b/src/lib/ebus/test/test_data.cpp @@ -473,14 +473,14 @@ int main() { string check[5] = checks[i]; istringstream isstr(check[0]); string expectStr = check[1]; - SymbolString mstr(true); + MasterSymbolString mstr; result_t result = mstr.parseHex(check[2]); if (result != RESULT_OK) { cout << "\"" << check[0] << "\": parse \"" << check[2] << "\" error: " << getResultCode(result) << endl; error = true; continue; } - SymbolString sstr; + SlaveSymbolString sstr; result = sstr.parseHex(check[3]); if (result != RESULT_OK) { cout << "\"" << check[0] << "\": parse \"" << check[3] << "\" error: " << getResultCode(result) << endl; @@ -563,14 +563,14 @@ int main() { } ostringstream output; - SymbolString writeMstr(true); + MasterSymbolString writeMstr; result = writeMstr.parseHex(mstr.getDataStr().substr(0, 10)); if (result != RESULT_OK) { cout << " parse \"" << mstr.getDataStr().substr(0, 10) << "\" error: " << getResultCode(result) << endl; error = true; } - SymbolString writeSstr; + SlaveSymbolString writeSstr; result = writeSstr.parseHex(sstr.getDataStr().substr(0, 2)); if (result != RESULT_OK) { cout << " parse \"" << sstr.getDataStr().substr(0, 2) << "\" error: " << getResultCode(result) diff --git a/src/lib/ebus/test/test_message.cpp b/src/lib/ebus/test/test_message.cpp index 107a3772..1dede551 100644 --- a/src/lib/ebus/test/test_message.cpp +++ b/src/lib/ebus/test/test_message.cpp @@ -170,8 +170,8 @@ int main() { map &conditions = messages->getConditions(); Message* message = NULL; vector deleteMessages; - vector mstrs; - vector sstrs; + vector mstrs; + vector sstrs; mstrs.resize(1); sstrs.resize(1); for (size_t i = 0; i < sizeof(checks) / sizeof(checks[0]); i++) { @@ -260,7 +260,7 @@ int main() { } else if (mstrs[pos] != NULL) { delete mstrs[pos]; } - mstrs[pos] = new SymbolString(true); + mstrs[pos] = new MasterSymbolString; result = mstrs[pos]->parseHex(token); if (result != RESULT_OK) { cout << "\"" << check[0] << "\": parse \"" << token << "\" error: " << getResultCode(result) << endl; @@ -277,7 +277,7 @@ int main() { } else if (sstrs[pos] != NULL) { delete sstrs[pos]; } - sstrs[pos] = new SymbolString(); + sstrs[pos] = new SlaveSymbolString(); result = sstrs[pos]->parseHex(token); if (result != RESULT_OK) { cout << "\"" << check[0] << "\": parse \"" << token << "\" error: " << getResultCode(result) << endl; @@ -292,7 +292,7 @@ int main() { if (mstrs[0] != NULL) { delete mstrs[0]; } - mstrs[0] = new SymbolString(true); + mstrs[0] = new MasterSymbolString; result = mstrs[0]->parseHex(check[2]); if (result != RESULT_OK) { cout << "\"" << check[0] << "\": parse \"" << check[2] << "\" error: " << getResultCode(result) << endl; @@ -301,7 +301,7 @@ int main() { if (sstrs[0] != NULL) { delete sstrs[0]; } - sstrs[0] = new SymbolString(); + sstrs[0] = new SlaveSymbolString(); result = sstrs[0]->parseHex(check[3]); if (result != RESULT_OK) { cout << "\"" << check[0] << "\": parse \"" << check[3] << "\" error: " << getResultCode(result) << endl; @@ -419,7 +419,7 @@ int main() { } if (!message->isPassive() && (withInput || !decode)) { istringstream input(inputStr); - SymbolString writeMstr(true); + MasterSymbolString writeMstr; result = message->prepareMaster(0xff, writeMstr, input); if (failedPrepare) { if (result == RESULT_OK) { @@ -453,10 +453,10 @@ int main() { delete templates; delete messages; - for (vector::iterator it = mstrs.begin(); it != mstrs.end(); it++) { + for (vector::iterator it = mstrs.begin(); it != mstrs.end(); it++) { delete *it; } - for (vector::iterator it = sstrs.begin(); it != sstrs.end(); it++) { + for (vector::iterator it = sstrs.begin(); it != sstrs.end(); it++) { delete *it; } return 0; diff --git a/src/lib/ebus/test/test_symbol.cpp b/src/lib/ebus/test/test_symbol.cpp index 2ae51aac..58596527 100644 --- a/src/lib/ebus/test/test_symbol.cpp +++ b/src/lib/ebus/test/test_symbol.cpp @@ -47,19 +47,19 @@ void verify(bool expectFailMatch, string type, string input, } int main(int argc, char** argv) { - SymbolString sstr(true); + MasterSymbolString mstr; if (argc > 1) { result_t result; if (argc > 2 && strcmp("escaped", argv[1]) == 0) { - result = sstr.parseHexEscaped(argv[2]); + result = mstr.parseHexEscaped(argv[2]); } else { - result = sstr.parseHex(argv[1]); + result = mstr.parseHex(argv[1]); } if (result != RESULT_OK) { cout << "parse escaped error: " << getResultCode(result) << endl; } else { - unsigned char gotCrc = sstr.calcCrc(); + unsigned char gotCrc = mstr.calcCrc(); cout << "calculated CRC: 0x" << nouppercase << setw(2) << hex << setfill('0') << static_cast(gotCrc) << endl; @@ -68,14 +68,14 @@ int main(int argc, char** argv) { } string gotStr, expectStr; - result_t result = sstr.parseHex("10feb5050427a915aa"); + result_t result = mstr.parseHex("10feb5050427a915aa"); if (result != RESULT_OK) { cout << "parse unescaped error: " << getResultCode(result) << endl; error = true; } else { - gotStr = sstr.getDataStr(), expectStr = "10feb5050427a915aa"; + gotStr = mstr.getDataStr(), expectStr = "10feb5050427a915aa"; verify(false, "parse unescaped", "10feb5050427a915aa", true, expectStr, gotStr); - unsigned char gotCrc = sstr.calcCrc(), expectCrc = 0x77; + unsigned char gotCrc = mstr.calcCrc(), expectCrc = 0x77; ostringstream ostr; ostr << nouppercase << setw(2) << hex << setfill('0') << static_cast(expectCrc); expectStr = ostr.str(); @@ -85,24 +85,24 @@ int main(int argc, char** argv) { verify(false, "CRC", "10feb5050427a915aa", gotCrc == expectCrc, expectStr, gotStr); } - sstr.clear(); - result = sstr.parseHexEscaped("10feb5050427a90015a901"); + mstr.clear(); + result = mstr.parseHexEscaped("10feb5050427a90015a901"); if (result != RESULT_OK) { cout << "parse escaped error: " << getResultCode(result) << endl; error = true; } else { - gotStr = sstr.getDataStr(), expectStr = "10feb5050427a915aa"; + gotStr = mstr.getDataStr(), expectStr = "10feb5050427a915aa"; verify(false, "parse escaped", "10feb5050427a90015a901", true, expectStr, gotStr); ostringstream ostr; ostr << dec << static_cast(4); expectStr = ostr.str(); ostr.str(""); - ostr << dec << static_cast(sstr.getDataSize()); + ostr << dec << static_cast(mstr.getDataSize()); gotStr = ostr.str(); - verify(false, "data size", "10feb5050427a90015a901", sstr.getDataSize() == 4, expectStr, gotStr); + verify(false, "data size", "10feb5050427a90015a901", mstr.getDataSize() == 4, expectStr, gotStr); } - sstr = SymbolString(); // slave + SlaveSymbolString sstr; result = sstr.parseHexEscaped("0427a90015a901"); if (result != RESULT_OK) { cout << "parse escaped error: " << getResultCode(result) << endl;