moved readFromBus to BusHandler, fix for polling ChainedMessages, increased log level for loaded files and written messages, added error message for failed writes, derive all scan messages and store them, added all message counts to info result

This commit is contained in:
john30
2016-10-29 21:03:24 +02:00
parent d8f98d0658
commit 66817b3423
4 changed files with 73 additions and 55 deletions
+43 -8
View File
@@ -63,7 +63,7 @@ const char* getStateCode(BusState state) {
result_t PollRequest::prepare(unsigned char ownMasterAddress) result_t PollRequest::prepare(unsigned char ownMasterAddress)
{ {
istringstream input; istringstream input;
result_t result = m_message->prepareMaster(ownMasterAddress, m_master, input, m_index); result_t result = m_message->prepareMaster(ownMasterAddress, m_master, input, UI_FIELD_SEPARATOR, SYN, m_index);
if (result == RESULT_OK) if (result == RESULT_OK)
logInfo(lf_bus, "poll cmd: %s", m_master.getDataStr().c_str()); logInfo(lf_bus, "poll cmd: %s", m_master.getDataStr().c_str());
return result; return result;
@@ -75,9 +75,12 @@ bool PollRequest::notify(result_t result, SymbolString& slave)
result = m_message->storeLastData(pt_slaveData, slave, m_index); result = m_message->storeLastData(pt_slaveData, slave, m_index);
if (result>=RESULT_OK && m_index+1 < m_message->getCount()) { if (result>=RESULT_OK && m_index+1 < m_message->getCount()) {
m_index++; m_index++;
result = prepare(m_master[0]);
if (result >= RESULT_OK) {
return true; return true;
} }
} }
}
ostringstream output; ostringstream output;
if (result==RESULT_OK) if (result==RESULT_OK)
result = m_message->decodeLastData(output); // decode data result = m_message->decodeLastData(output); // decode data
@@ -115,6 +118,10 @@ bool ScanRequest::notify(result_t result, SymbolString& slave)
m_message = message; m_message = message;
m_message->storeLastData(pt_masterData, m_master, m_index); // expected to work since this is a clone m_message->storeLastData(pt_masterData, 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
} }
result = m_message->storeLastData(pt_slaveData, slave, m_index); result = m_message->storeLastData(pt_slaveData, slave, m_index);
if (result>=RESULT_OK && m_index+1 < m_message->getCount()) { if (result>=RESULT_OK && m_index+1 < m_message->getCount()) {
@@ -212,6 +219,33 @@ result_t BusHandler::sendAndWait(SymbolString& master, SymbolString& slave)
return result; return result;
} }
result_t BusHandler::readFromBus(Message* message, string inputStr, const unsigned char dstAddress)
{
result_t ret = RESULT_EMPTY;
SymbolString master(true);
SymbolString slave(false);
for (unsigned char index=0; index<message->getCount(); index++) {
istringstream input(inputStr);
ret = message->prepareMaster(m_ownMasterAddress, master, input, UI_FIELD_SEPARATOR, dstAddress, index);
if (ret != RESULT_OK) {
logError(lf_bus, "prepare message part %d: %s", index, getResultCode(ret));
break;
}
// send message
ret = sendAndWait(master, slave);
if (ret != RESULT_OK) {
logError(lf_bus, "send message part %d: %s", index, getResultCode(ret));
break;
}
ret = message->storeLastData(pt_slaveData, slave, index);
if (ret < RESULT_OK) {
logError(lf_bus, "store message part %d: %s", index, getResultCode(ret));
break;
}
}
return ret;
}
void BusHandler::run() void BusHandler::run()
{ {
unsigned int symCount = 0; unsigned int symCount = 0;
@@ -269,9 +303,9 @@ result_t BusHandler::handleSymbol()
break; break;
case bs_ready: case bs_ready:
if (m_currentRequest != NULL) if (m_currentRequest != NULL) {
setState(bs_ready, RESULT_ERR_TIMEOUT); // just to be sure an old BusRequest is cleaned up setState(bs_ready, RESULT_ERR_TIMEOUT); // just to be sure an old BusRequest is cleaned up
if (m_remainLockCount == 0 && m_currentRequest == NULL) { } else if (m_remainLockCount == 0) {
startRequest = m_nextRequests.peek(); startRequest = m_nextRequests.peek();
if (startRequest == NULL && m_pollInterval > 0) { // check for poll/scan if (startRequest == NULL && m_pollInterval > 0) { // check for poll/scan
time_t now; time_t now;
@@ -632,7 +666,7 @@ result_t BusHandler::handleSymbol()
} }
if (message == NULL || message->isWrite()) if (message == NULL || message->isWrite())
return setState(bs_skip, RESULT_ERR_INVALID_ARG); // don't know this request or definition has wrong direction, deny return setState(bs_skip, RESULT_ERR_INVALID_ARG); // don't know this request or definition has wrong direction, deny
if (message == m_messages->getScanMessage()) { if (message == m_messages->getScanMessage(m_ownSlaveAddress)) {
input.str(SCAN_ANSWER); input.str(SCAN_ANSWER);
} }
@@ -858,7 +892,7 @@ void BusHandler::receiveCompleted()
result_t BusHandler::startScan(bool full) result_t BusHandler::startScan(bool full)
{ {
deque<Message*> messages = m_messages->findAll("scan", ""); deque<Message*> messages = m_messages->findAll("scan", "", true);
for (deque<Message*>::iterator it = messages.begin(); it < messages.end(); it++) { for (deque<Message*>::iterator it = messages.begin(); it < messages.end(); it++) {
Message* message = *it; Message* message = *it;
if (message->getPrimaryCommand() == 0x07 && message->getSecondaryCommand() == 0x04) if (message->getPrimaryCommand() == 0x07 && message->getSecondaryCommand() == 0x04)
@@ -976,13 +1010,14 @@ void BusHandler::formatSeenInfo(ostringstream& output)
if (message!=NULL && message->getLastUpdateTime()>0) { if (message!=NULL && 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(output, OF_NAMES|OF_UNITS|OF_COMMENTS); result_t result = message->decodeLastData(output, OF_NAMES);
if (result!=RESULT_OK) if (result!=RESULT_OK) {
output << "\" error: " << getResultCode(result); output << "\" error: " << getResultCode(result);
else } else {
output << "\""; output << "\"";
} }
} }
}
string loadedFiles = m_messages->getLoadedFiles(address); string loadedFiles = m_messages->getLoadedFiles(address);
if (!loadedFiles.empty()) if (!loadedFiles.empty())
output << ", loaded " << loadedFiles; output << ", loaded " << loadedFiles;
+9
View File
@@ -351,6 +351,15 @@ public:
*/ */
result_t sendAndWait(SymbolString& master, SymbolString& slave); result_t sendAndWait(SymbolString& master, SymbolString& slave);
/**
* Prepare the master part for the @a Message, send it to the bus and wait for the answer.
* @param message the @a Message instance.
* @param inputStr the input @a string from which to read master values (if any).
* @param dstAddress the destination address to set, or @a SYN to keep the address defined during construction.
* @return the result code.
*/
result_t readFromBus(Message* message, string inputStr, const unsigned char dstAddress=SYN);
/** /**
* Main thread entry. * Main thread entry.
*/ */
+14 -37
View File
@@ -166,7 +166,7 @@ void MainLoop::run()
string file; string file;
result_t result = loadScanConfigFile(m_messages, lastScanAddress, slave, file); result_t result = loadScanConfigFile(m_messages, lastScanAddress, slave, file);
if (result==RESULT_OK) { if (result==RESULT_OK) {
logInfo(lf_main, "scan config %2.2x: file %s loaded", lastScanAddress, file.c_str()); logNotice(lf_main, "scan config %2.2x: file %s loaded", lastScanAddress, file.c_str());
m_busHandler->setScanConfigLoaded(lastScanAddress, file); m_busHandler->setScanConfigLoaded(lastScanAddress, file);
} else { } else {
m_busHandler->setScanConfigLoaded(lastScanAddress, ""); m_busHandler->setScanConfigLoaded(lastScanAddress, "");
@@ -337,33 +337,6 @@ result_t MainLoop::parseHexMaster(vector<string> &args, size_t argPos, SymbolStr
return ret; return ret;
} }
result_t MainLoop::readFromBus(Message* message, string inputStr, const unsigned char dstAddress)
{
result_t ret = RESULT_EMPTY;
SymbolString master(true);
SymbolString slave(false);
for (unsigned char index=0; index<message->getCount(); index++) {
istringstream input(inputStr);
ret = message->prepareMaster(m_address, master, input, UI_FIELD_SEPARATOR, dstAddress, index);
if (ret != RESULT_OK) {
logError(lf_main, "prepare message part %d: %s", index, getResultCode(ret));
break;
}
// send message
ret = m_busHandler->sendAndWait(master, slave);
if (ret != RESULT_OK) {
logError(lf_main, "send message part %d: %s", index, getResultCode(ret));
break;
}
ret = message->storeLastData(pt_slaveData, slave, index);
if (ret < RESULT_OK) {
logError(lf_main, "store message part %d: %s", index, getResultCode(ret));
break;
}
}
return ret;
}
string MainLoop::executeRead(vector<string> &args) string MainLoop::executeRead(vector<string> &args)
{ {
size_t argPos = 1; size_t argPos = 1;
@@ -576,7 +549,7 @@ string MainLoop::executeRead(vector<string> &args)
return getResultCode(RESULT_ERR_INVALID_ADDR); return getResultCode(RESULT_ERR_INVALID_ADDR);
// read directly from bus // read directly from bus
result_t ret = readFromBus(message, params, dstAddress); result_t ret = m_busHandler->readFromBus(message, params, dstAddress);
if (ret != RESULT_OK) if (ret != RESULT_OK)
return getResultCode(ret); return getResultCode(ret);
@@ -698,14 +671,15 @@ string MainLoop::executeWrite(vector<string> &args)
if (message->getDstAddress()==SYN && dstAddress==SYN) if (message->getDstAddress()==SYN && dstAddress==SYN)
return getResultCode(RESULT_ERR_INVALID_ADDR); return getResultCode(RESULT_ERR_INVALID_ADDR);
result_t ret = readFromBus(message, args.size() == argPos + 1 ? "" : args[argPos + 1], dstAddress); // allow missing values result_t ret = m_busHandler->readFromBus(message, args.size() == argPos + 1 ? "" : args[argPos + 1], dstAddress); // allow missing values
if (ret != RESULT_OK) if (ret != RESULT_OK) {
logError(lf_main, "write %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(), getResultCode(ret));
return getResultCode(ret); return getResultCode(ret);
}
dstAddress = message->getLastMasterData()[1]; dstAddress = message->getLastMasterData()[1];
ostringstream result; ostringstream result;
if (dstAddress == BROADCAST || isMaster(dstAddress)) { if (dstAddress == BROADCAST || isMaster(dstAddress)) {
logInfo(lf_main, "write %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(), getResultCode(ret)); logNotice(lf_main, "write %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(), getResultCode(ret));
if (dstAddress == BROADCAST) if (dstAddress == BROADCAST)
return "done broadcast"; return "done broadcast";
return getResultCode(RESULT_OK); return getResultCode(RESULT_OK);
@@ -713,7 +687,7 @@ string MainLoop::executeWrite(vector<string> &args)
ret = message->decodeLastData(pt_slaveData, result); // decode data ret = message->decodeLastData(pt_slaveData, result); // decode data
if (ret >= RESULT_OK && result.str().empty()) { if (ret >= RESULT_OK && result.str().empty()) {
logInfo(lf_main, "write %s %s: decode %s", message->getCircuit().c_str(), message->getName().c_str(), getResultCode(ret)); logNotice(lf_main, "write %s %s: decode %s", message->getCircuit().c_str(), message->getName().c_str(), getResultCode(ret));
return getResultCode(RESULT_OK); return getResultCode(RESULT_OK);
} }
if (ret != RESULT_OK) { if (ret != RESULT_OK) {
@@ -722,7 +696,7 @@ string MainLoop::executeWrite(vector<string> &args)
result << getResultCode(ret) << " in decode"; result << getResultCode(ret) << " in decode";
return result.str(); return result.str();
} }
logInfo(lf_main, "write %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(), result.str().c_str()); logNotice(lf_main, "write %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(), result.str().c_str());
return result.str(); return result.str();
} }
@@ -1162,7 +1136,10 @@ string MainLoop::executeInfo(vector<string> &args)
result << "signal: no signal\n"; result << "signal: no signal\n";
} }
result << "masters: " << static_cast<unsigned>(m_busHandler->getMasterCount()) << "\n"; result << "masters: " << static_cast<unsigned>(m_busHandler->getMasterCount()) << "\n";
result << "messages: " << static_cast<unsigned>(m_messages->size()); result << "messages: " << static_cast<unsigned>(m_messages->size()) << "\n";
result << "conditional: " << static_cast<unsigned>(m_messages->sizeConditional()) << "\n";
result << "poll: " << static_cast<unsigned>(m_messages->sizePoll()) << "\n";
result << "update: " << static_cast<unsigned>(m_messages->sizePassive()) << "\n";
m_busHandler->formatSeenInfo(result); m_busHandler->formatSeenInfo(result);
return result.str(); return result.str();
} }
@@ -1280,7 +1257,7 @@ string MainLoop::executeGet(vector<string> &args, bool& connected)
// read directly from bus // read directly from bus
if (message->isPassive()) if (message->isPassive())
continue; // not possible to actively read this message continue; // not possible to actively read this message
if (readFromBus(message, "") != RESULT_OK) if (m_busHandler->readFromBus(message, "") != RESULT_OK)
continue; continue;
lastup = message->getLastUpdateTime(); lastup = message->getLastUpdateTime();
} else { } else {
+6 -9
View File
@@ -47,6 +47,12 @@ public:
*/ */
~MainLoop(); ~MainLoop();
/**
* Get the @a BusHandler instance.
* @return the created @a BusHandler instance.
*/
BusHandler* getBusHandler() { return m_busHandler; }
/** /**
* Run the main loop. * Run the main loop.
*/ */
@@ -110,15 +116,6 @@ private:
*/ */
result_t parseHexMaster(vector<string> &args, size_t argPos, SymbolString& master); result_t parseHexMaster(vector<string> &args, size_t argPos, SymbolString& master);
/**
* Prepare the master part for the @a Message, send it to the bus and wait for the answer.
* @param message the @a Message instance.
* @param inputStr the input @a string from which to read master values (if any).
* @param dstAddress the destination address to set, or @a SYN to keep the address defined during construction.
* @return the result code.
*/
result_t readFromBus(Message* message, string inputStr, const unsigned char dstAddress=SYN);
/** /**
* Execute the read command. * Execute the read command.
* @param args the arguments passed to the command (starting with the command itself), or empty for help. * @param args the arguments passed to the command (starting with the command itself), or empty for help.