introduced symbol_t, added SymbolString::dataAt() and ::isMaster(), renamed SymbolString::getDataStr() to getStr(), use size_t/ssize_t where appropriate, simplified by use of new SymbolString methods, corrected broadcast scan conversion, use override declaration

This commit is contained in:
john30
2017-03-04 14:01:20 +01:00
parent dfa0e6e08f
commit 18fc12499b
25 changed files with 806 additions and 862 deletions
+59 -71
View File
@@ -62,11 +62,11 @@ const char* getStateCode(BusState state) {
} }
} }
result_t PollRequest::prepare(unsigned char ownMasterAddress) { result_t PollRequest::prepare(symbol_t ownMasterAddress) {
istringstream input; istringstream input;
result_t result = m_message->prepareMaster(ownMasterAddress, m_master, input, UI_FIELD_SEPARATOR, SYN, 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.getStr().c_str());
} }
return result; return result;
} }
@@ -97,11 +97,11 @@ bool PollRequest::notify(result_t result, SlaveSymbolString& slave) {
} }
result_t ScanRequest::prepare(unsigned char ownMasterAddress) { result_t ScanRequest::prepare(symbol_t ownMasterAddress) {
if (m_slaves.empty()) { if (m_slaves.empty()) {
return RESULT_ERR_EOF; return RESULT_ERR_EOF;
} }
unsigned char dstAddress = m_slaves.front(); symbol_t dstAddress = m_slaves.front();
if (m_index == 0 && m_messages.size() == m_allMessages.size()) { // first message for this address if (m_index == 0 && m_messages.size() == m_allMessages.size()) { // first message for this address
m_busHandler->setScanResult(dstAddress, ""); m_busHandler->setScanResult(dstAddress, "");
} }
@@ -109,13 +109,13 @@ result_t ScanRequest::prepare(unsigned char ownMasterAddress) {
result_t result = m_message->prepareMaster(ownMasterAddress, m_master, input, UI_FIELD_SEPARATOR, dstAddress, result_t result = m_message->prepareMaster(ownMasterAddress, m_master, input, UI_FIELD_SEPARATOR, dstAddress,
m_index); m_index);
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
logInfo(lf_bus, "scan %2.2x cmd: %s", dstAddress, m_master.getDataStr().c_str()); logInfo(lf_bus, "scan %2.2x cmd: %s", dstAddress, m_master.getStr().c_str());
} }
return result; return result;
} }
bool ScanRequest::notify(result_t result, SlaveSymbolString& slave) { bool ScanRequest::notify(result_t result, SlaveSymbolString& slave) {
unsigned char dstAddress = m_master[1]; symbol_t dstAddress = m_master[1];
if (result == RESULT_OK) { if (result == RESULT_OK) {
if (m_message == m_messageMap->getScanMessage()) { if (m_message == m_messageMap->getScanMessage()) {
Message* message = m_messageMap->getScanMessage(dstAddress); Message* message = m_messageMap->getScanMessage(dstAddress);
@@ -182,7 +182,7 @@ bool ScanRequest::notify(result_t result, SlaveSymbolString& slave) {
bool ActiveBusRequest::notify(result_t result, SlaveSymbolString& slave) { bool ActiveBusRequest::notify(result_t result, SlaveSymbolString& slave) {
if (result == RESULT_OK) { if (result == RESULT_OK) {
logDebug(lf_bus, "read res: %s", slave.getDataStr().c_str()); logDebug(lf_bus, "read res: %s", slave.getStr().c_str());
} }
m_result = result; m_result = result;
m_slave = slave; m_slave = slave;
@@ -199,28 +199,25 @@ void GrabbedMessage::setLastData(MasterSymbolString& master, SlaveSymbolString&
* Decode the input @a SymbolString with the specified @a DataType and length. * Decode the input @a SymbolString with the specified @a DataType and length.
* @param type the @a DataType. * @param type the @a DataType.
* @param input the @a SymbolString to read the binary value from. * @param input the @a SymbolString to read the binary value from.
* @param isMaster whether the @a SymbolString is the master part.
* @param baseOffset the base offset in the @a SymbolString.
* @param length the number of symbols to read. * @param length the number of symbols to read.
* @param offsets the last offset to the baseOffset to read. * @param offsets the last offset to the baseOffset to read.
* @param output the ostringstream to append the formatted value to. * @param output the ostringstream to append the formatted value to.
* @param firstOnly whether to read only the first non-erroneous offset. * @param firstOnly whether to read only the first non-erroneous offset.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
bool decodeType(DataType* type, SymbolString *input, bool isMaster, unsigned char baseOffset, unsigned char length, bool decodeType(DataType* type, SymbolString *input, size_t length,
unsigned char offsets, ostringstream& output, bool firstOnly = false) { size_t offsets, ostringstream& output, bool firstOnly = false) {
bool first = true; bool first = true;
string in = input->getDataStr(baseOffset); string in = input->getStr(input->getDataOffset());
for (unsigned char offset = 0; offset <= offsets; offset++) { for (size_t offset = 0; offset <= offsets; offset++) {
ostringstream out; ostringstream out;
result_t result = type->readSymbols(*input, isMaster, (unsigned char)(baseOffset+offset), (unsigned char)length, result_t result = type->readSymbols(*input, offset, length, out, 0);
out, 0);
if (result != RESULT_OK) { if (result != RESULT_OK) {
continue; continue;
} }
if (type->isNumeric() && type->hasFlag(DAY)) { if (type->isNumeric() && type->hasFlag(DAY)) {
unsigned int value = 0; unsigned int value = 0;
if (type->readRawValue(*input, (unsigned char)(baseOffset+offset), (unsigned char)length, value) == RESULT_OK) { if (type->readRawValue(*input, offset, length, value) == RESULT_OK) {
out.str(""); out.str("");
out << DataField::getDayName(reinterpret_cast<NumberDataType*>(type)->getMinValue()+value); out << DataField::getDayName(reinterpret_cast<NumberDataType*>(type)->getMinValue()+value);
} }
@@ -260,10 +257,10 @@ bool GrabbedMessage::dump(const bool unknown, MessageMap* messages, bool first,
if (!first) { if (!first) {
output << endl; output << endl;
} }
unsigned char dstAddress = m_lastMaster[1]; symbol_t dstAddress = m_lastMaster[1];
output << m_lastMaster.getDataStr(); output << m_lastMaster.getStr();
if (dstAddress != BROADCAST && !isMaster(dstAddress)) { if (dstAddress != BROADCAST && !isMaster(dstAddress)) {
output << " / " << m_lastSlave.getDataStr(); output << " / " << m_lastSlave.getStr();
} }
output << " = " << static_cast<unsigned>(m_count); output << " = " << static_cast<unsigned>(m_count);
if (message) { if (message) {
@@ -281,15 +278,7 @@ bool GrabbedMessage::dump(const bool unknown, MessageMap* messages, bool first,
} else { } else {
input = &m_lastSlave; input = &m_lastSlave;
} }
unsigned char baseOffset = master ? 5 : 1; size_t remain = input->getDataSize();
unsigned char remain = input->size();
if (remain <= baseOffset) {
return true;
}
remain = (unsigned char)(remain-baseOffset);
if ((*input)[baseOffset-1] < remain) {
remain = (*input)[baseOffset-1];
}
if (remain == 0) { if (remain == 0) {
return true; return true;
} }
@@ -298,22 +287,22 @@ bool GrabbedMessage::dump(const bool unknown, MessageMap* messages, bool first,
if ((baseType->getBitCount() % 8) != 0 || baseType->isIgnored()) { // skip bit and ignored types if ((baseType->getBitCount() % 8) != 0 || baseType->isIgnored()) { // skip bit and ignored types
continue; continue;
} }
unsigned char maxLength = baseType->getBitCount()/8; size_t maxLength = baseType->getBitCount()/8;
bool firstOnly = maxLength >= 8; bool firstOnly = maxLength >= 8;
if (maxLength > remain) { if (maxLength > remain) {
maxLength = remain; maxLength = remain;
} }
if (baseType->isAdjustableLength()) { if (baseType->isAdjustableLength()) {
for (unsigned char length = maxLength; length >= 1; length--) { for (size_t length = maxLength; length >= 1; length--) {
DataType* type = types->get(baseType->getId(), length); DataType* type = types->get(baseType->getId(), length);
if (decodeType(type, input, master, baseOffset, length, (unsigned char)(remain-length), output, firstOnly)) { if (decodeType(type, input, length, remain-length, output, firstOnly)) {
if (firstOnly) { if (firstOnly) {
break; // only a single offset with maximum length when adjustable maximum size is at least 8 bytes break; // only a single offset with maximum length when adjustable maximum size is at least 8 bytes
} }
} }
} }
} else if (maxLength > 0) { } else if (maxLength > 0) {
decodeType(baseType, input, master, baseOffset, maxLength, (unsigned char)(remain-maxLength), output); decodeType(baseType, input, maxLength, remain-maxLength, output);
} }
} }
} }
@@ -331,7 +320,7 @@ result_t BusHandler::sendAndWait(MasterSymbolString& master, SlaveSymbolString&
result_t result = RESULT_ERR_NO_SIGNAL; result_t result = RESULT_ERR_NO_SIGNAL;
slave.clear(); slave.clear();
ActiveBusRequest request(master, slave); ActiveBusRequest request(master, slave);
logInfo(lf_bus, "send message: %s", master.getDataStr().c_str()); logInfo(lf_bus, "send message: %s", master.getStr().c_str());
for (int sendRetries = m_failedSendRetries + 1; sendRetries >= 0; sendRetries--) { for (int sendRetries = m_failedSendRetries + 1; sendRetries >= 0; sendRetries--) {
m_nextRequests.push(&request); m_nextRequests.push(&request);
@@ -354,13 +343,13 @@ result_t BusHandler::sendAndWait(MasterSymbolString& master, SlaveSymbolString&
return result; return result;
} }
result_t BusHandler::readFromBus(Message* message, string inputStr, const unsigned char dstAddress, result_t BusHandler::readFromBus(Message* message, string inputStr, const symbol_t dstAddress,
const unsigned char srcAddress) { const symbol_t srcAddress) {
unsigned char masterAddress = srcAddress == SYN ? m_ownMasterAddress : srcAddress; symbol_t masterAddress = srcAddress == SYN ? m_ownMasterAddress : srcAddress;
result_t ret = RESULT_EMPTY; result_t ret = RESULT_EMPTY;
MasterSymbolString master; MasterSymbolString master;
SlaveSymbolString slave; SlaveSymbolString slave;
for (unsigned char index = 0; index < message->getCount(); index++) { for (size_t index = 0; index < message->getCount(); index++) {
istringstream input(inputStr); istringstream input(inputStr);
ret = message->prepareMaster(masterAddress, master, input, UI_FIELD_SEPARATOR, dstAddress, index); ret = message->prepareMaster(masterAddress, master, input, UI_FIELD_SEPARATOR, dstAddress, index);
if (ret != RESULT_OK) { if (ret != RESULT_OK) {
@@ -424,7 +413,7 @@ void BusHandler::run() {
result_t BusHandler::handleSymbol() { result_t BusHandler::handleSymbol() {
unsigned int timeout = SYN_TIMEOUT; unsigned int timeout = SYN_TIMEOUT;
unsigned char sendSymbol = ESC; symbol_t sendSymbol = ESC;
bool sending = false; bool sending = false;
BusRequest* startRequest = NULL; BusRequest* startRequest = NULL;
@@ -565,7 +554,7 @@ result_t BusHandler::handleSymbol() {
} }
// receive next symbol (optionally check reception of sent symbol) // receive next symbol (optionally check reception of sent symbol)
unsigned char recvSymbol; symbol_t recvSymbol;
result = m_device->recv(timeout+m_transferLatency, recvSymbol); result = m_device->recv(timeout+m_transferLatency, recvSymbol);
if (!sending && result == RESULT_ERR_TIMEOUT && m_generateSynInterval > 0 if (!sending && result == RESULT_ERR_TIMEOUT && m_generateSynInterval > 0
@@ -701,7 +690,7 @@ result_t BusHandler::handleSymbol() {
return setState(bs_skip, RESULT_ERR_CRC); return setState(bs_skip, RESULT_ERR_CRC);
} }
if (m_answer) { if (m_answer) {
unsigned char dstAddress = m_command[1]; symbol_t dstAddress = m_command[1];
if (dstAddress == m_ownMasterAddress || dstAddress == m_ownSlaveAddress) { if (dstAddress == m_ownMasterAddress || dstAddress == m_ownSlaveAddress) {
if (m_crcValid) { if (m_crcValid) {
addSeenAddress(m_command[0]); addSeenAddress(m_command[0]);
@@ -925,7 +914,7 @@ result_t BusHandler::setState(BusState state, result_t result, bool firstRepetit
m_currentRequest = NULL; m_currentRequest = NULL;
} else if (state == bs_sendSyn || (result != RESULT_OK && !firstRepetition)) { } else if (state == bs_sendSyn || (result != RESULT_OK && !firstRepetition)) {
logDebug(lf_bus, "notify request: %s", getResultCode(result)); logDebug(lf_bus, "notify request: %s", getResultCode(result));
unsigned char dstAddress = m_currentRequest->m_master[1]; symbol_t dstAddress = m_currentRequest->m_master[1];
if (result == RESULT_OK) { if (result == RESULT_OK) {
addSeenAddress(dstAddress); addSeenAddress(dstAddress);
} }
@@ -988,7 +977,7 @@ result_t BusHandler::setState(BusState state, result_t result, bool firstRepetit
return result; return result;
} }
void BusHandler::addSeenAddress(unsigned char address) { void BusHandler::addSeenAddress(symbol_t address) {
if (!isValidAddress(address, false)) { if (!isValidAddress(address, false)) {
return; return;
} }
@@ -1023,7 +1012,7 @@ void BusHandler::addSeenAddress(unsigned char address) {
} }
void BusHandler::receiveCompleted() { void BusHandler::receiveCompleted() {
unsigned char srcAddress = m_command[0], dstAddress = m_command[1]; symbol_t srcAddress = m_command[0], dstAddress = m_command[1];
if (srcAddress == dstAddress) { if (srcAddress == dstAddress) {
logError(lf_bus, "invalid self-addressed message from %2.2x", srcAddress); logError(lf_bus, "invalid self-addressed message from %2.2x", srcAddress);
return; return;
@@ -1033,12 +1022,12 @@ void BusHandler::receiveCompleted() {
bool master = isMaster(dstAddress); bool master = isMaster(dstAddress);
if (dstAddress == BROADCAST) { if (dstAddress == BROADCAST) {
logInfo(lf_update, "update BC cmd: %s", m_command.getDataStr().c_str()); logInfo(lf_update, "update BC cmd: %s", m_command.getStr().c_str());
if (m_command.size() >= 5+9 && m_command[2] == 0x07 && m_command[3] == 0x04) { if (m_command.getDataSize() >= 10 && m_command[2] == 0x07 && m_command[3] == 0x04) {
unsigned char slaveAddress = (unsigned char)((srcAddress+5)&0xff); symbol_t slaveAddress = getSlaveAddress(srcAddress);
addSeenAddress(slaveAddress); addSeenAddress(slaveAddress);
Message* message = m_messages->getScanMessage(slaveAddress); Message* message = m_messages->getScanMessage(slaveAddress);
if (message && (message->getLastUpdateTime() == 0 || message->getLastSlaveData().size() < 10)) { if (message && (message->getLastUpdateTime() == 0 || message->getLastSlaveData().getDataSize() < 10)) {
// e.g. 10fe07040a b5564149303001248901 // e.g. 10fe07040a b5564149303001248901
m_seenAddresses[slaveAddress] |= SCAN_INIT; m_seenAddresses[slaveAddress] |= SCAN_INIT;
MasterSymbolString dummyMaster; MasterSymbolString dummyMaster;
@@ -1046,9 +1035,9 @@ void BusHandler::receiveCompleted() {
result_t result = message->prepareMaster(m_ownMasterAddress, dummyMaster, input); result_t result = message->prepareMaster(m_ownMasterAddress, dummyMaster, input);
if (result == RESULT_OK) { if (result == RESULT_OK) {
SlaveSymbolString idData; SlaveSymbolString idData;
idData.push_back(9); idData.push_back(10);
for (size_t i = 5; i <= 5+9; i++) { for (size_t i = 0; i < 10; i++) {
idData.push_back(m_command[i]); idData.push_back(m_command.dataAt(i));
} }
result = message->storeLastData(idData, 0); result = message->storeLastData(idData, 0);
} }
@@ -1059,9 +1048,9 @@ void BusHandler::receiveCompleted() {
} }
} }
} else if (master) { } else if (master) {
logInfo(lf_update, "update MM cmd: %s", m_command.getDataStr().c_str()); logInfo(lf_update, "update MM cmd: %s", m_command.getStr().c_str());
} else { } else {
logInfo(lf_update, "update MS cmd: %s / %s", m_command.getDataStr().c_str(), m_response.getDataStr().c_str()); logInfo(lf_update, "update MS cmd: %s / %s", m_command.getStr().c_str(), m_response.getStr().c_str());
} }
Message* message = m_messages->find(m_command); Message* message = m_messages->find(m_command);
if (m_grabMessages) { if (m_grabMessages) {
@@ -1075,12 +1064,11 @@ void BusHandler::receiveCompleted() {
} }
if (message == NULL) { if (message == NULL) {
if (dstAddress == BROADCAST) { if (dstAddress == BROADCAST) {
logNotice(lf_update, "unknown BC cmd: %s", m_command.getDataStr().c_str()); logNotice(lf_update, "unknown BC cmd: %s", m_command.getStr().c_str());
} else if (master) { } else if (master) {
logNotice(lf_update, "unknown MM cmd: %s", m_command.getDataStr().c_str()); logNotice(lf_update, "unknown MM cmd: %s", m_command.getStr().c_str());
} else { } else {
logNotice(lf_update, "unknown MS cmd: %s / %s", m_command.getDataStr().c_str(), logNotice(lf_update, "unknown MS cmd: %s / %s", m_command.getStr().c_str(), m_response.getStr().c_str());
m_response.getDataStr().c_str());
} }
} else { } else {
m_messages->invalidateCache(message); m_messages->invalidateCache(message);
@@ -1093,7 +1081,7 @@ void BusHandler::receiveCompleted() {
} }
if (result < RESULT_OK) { if (result < RESULT_OK) {
logError(lf_update, "unable to parse %s %s from %s / %s: %s", circuit.c_str(), name.c_str(), logError(lf_update, "unable to parse %s %s from %s / %s: %s", circuit.c_str(), name.c_str(),
m_command.getDataStr().c_str(), m_response.getDataStr().c_str(), getResultCode(result)); m_command.getStr().c_str(), m_response.getStr().c_str(), getResultCode(result));
} else { } else {
string data = output.str(); string data = output.str();
if (m_answer && dstAddress == (master ? m_ownMasterAddress : m_ownSlaveAddress)) { if (m_answer && dstAddress == (master ? m_ownMasterAddress : m_ownSlaveAddress)) {
@@ -1133,13 +1121,13 @@ result_t BusHandler::startScan(bool full, string levels) {
} }
m_scanResults.clear(); m_scanResults.clear();
deque<unsigned char> slaves; deque<symbol_t> slaves;
for (unsigned char slave = 1; slave != 0; slave++) { // 0 is known to be a master for (symbol_t slave = 1; slave != 0; slave++) { // 0 is known to be a master
if (!isValidAddress(slave, false) || isMaster(slave)) { if (!isValidAddress(slave, false) || isMaster(slave)) {
continue; continue;
} }
if (!full && (m_seenAddresses[slave]&SEEN) == 0) { if (!full && (m_seenAddresses[slave]&SEEN) == 0) {
unsigned char master = getMasterAddress(slave); // check if we saw the corresponding master already symbol_t master = getMasterAddress(slave); // check if we saw the corresponding master already
if (master == SYN || (m_seenAddresses[master]&SEEN) == 0) { if (master == SYN || (m_seenAddresses[master]&SEEN) == 0) {
continue; continue;
} }
@@ -1158,7 +1146,7 @@ result_t BusHandler::startScan(bool full, string levels) {
return RESULT_OK; return RESULT_OK;
} }
void BusHandler::setScanResult(unsigned char dstAddress, string str) { void BusHandler::setScanResult(symbol_t dstAddress, string str) {
m_seenAddresses[dstAddress] |= SCAN_INIT; m_seenAddresses[dstAddress] |= SCAN_INIT;
if (str.length() > 0) { if (str.length() > 0) {
m_seenAddresses[dstAddress] |= SCAN_DONE; m_seenAddresses[dstAddress] |= SCAN_DONE;
@@ -1178,8 +1166,8 @@ void BusHandler::formatScanResult(ostringstream& output) {
output << m_runningScans << " scan(s) still running" << endl; output << m_runningScans << " scan(s) still running" << endl;
} }
bool first = true; bool first = true;
for (unsigned char slave = 1; slave != 0; slave++) { // 0 is known to be a master for (symbol_t slave = 1; slave != 0; slave++) { // 0 is known to be a master
map<unsigned char, string>::iterator it = m_scanResults.find(slave); map<symbol_t, string>::iterator it = m_scanResults.find(slave);
if (it != m_scanResults.end()) { if (it != m_scanResults.end()) {
if (first) { if (first) {
first = false; first = false;
@@ -1191,7 +1179,7 @@ void BusHandler::formatScanResult(ostringstream& output) {
} }
if (first) { if (first) {
// fallback to autoscan results // fallback to autoscan results
for (unsigned char slave = 1; slave != 0; slave++) { // 0 is known to be a master for (symbol_t slave = 1; slave != 0; slave++) { // 0 is known to be a master
if (isValidAddress(slave, false) && !isMaster(slave) && (m_seenAddresses[slave]&SCAN_DONE) != 0) { if (isValidAddress(slave, false) && !isMaster(slave) && (m_seenAddresses[slave]&SCAN_DONE) != 0) {
Message* message = m_messages->getScanMessage(slave); Message* message = m_messages->getScanMessage(slave);
if (message != NULL && message->getLastUpdateTime() > 0) { if (message != NULL && message->getLastUpdateTime() > 0) {
@@ -1209,12 +1197,12 @@ void BusHandler::formatScanResult(ostringstream& output) {
} }
void BusHandler::formatSeenInfo(ostringstream& output) { void BusHandler::formatSeenInfo(ostringstream& output) {
unsigned char address = 0; symbol_t address = 0;
for (int index = 0; index < 256; index++, address++) { for (int index = 0; index < 256; index++, address++) {
if (isValidAddress(address, false) && ((m_seenAddresses[address]&SEEN) != 0 if (isValidAddress(address, false) && ((m_seenAddresses[address]&SEEN) != 0
|| (!m_device->isReadOnly() && (address == m_ownMasterAddress || address == m_ownSlaveAddress)))) { || (!m_device->isReadOnly() && (address == m_ownMasterAddress || address == m_ownSlaveAddress)))) {
output << endl << "address " << setfill('0') << setw(2) << hex << static_cast<unsigned>(address); output << endl << "address " << setfill('0') << setw(2) << hex << static_cast<unsigned>(address);
unsigned char master; symbol_t master;
if (isMaster(address)) { if (isMaster(address)) {
output << ": master"; output << ": master";
master = address; master = address;
@@ -1256,7 +1244,7 @@ void BusHandler::formatSeenInfo(ostringstream& output) {
} }
} }
result_t BusHandler::scanAndWait(unsigned char dstAddress, SlaveSymbolString& slave) { result_t BusHandler::scanAndWait(symbol_t dstAddress, SlaveSymbolString& slave) {
if (!isValidAddress(dstAddress) || isMaster(dstAddress)) { if (!isValidAddress(dstAddress) || isMaster(dstAddress)) {
return RESULT_ERR_INVALID_ADDR; return RESULT_ERR_INVALID_ADDR;
} }
@@ -1282,7 +1270,7 @@ result_t BusHandler::scanAndWait(unsigned char dstAddress, SlaveSymbolString& sl
m_seenAddresses[dstAddress] |= SCAN_DONE; m_seenAddresses[dstAddress] |= SCAN_DONE;
} }
} }
if (result != RESULT_OK || slave.size() == 0) { // avoid "invalid position" during decode if (result != RESULT_OK || slave.getDataSize() == 0) { // avoid "invalid position" during decode
return result; return result;
} }
return scanMessage->storeLastData(slave, 0); // update the cache return scanMessage->storeLastData(slave, 0); // update the cache
@@ -1313,7 +1301,7 @@ void BusHandler::formatGrabResult(const bool unknown, ostringstream& output, con
} }
} }
unsigned char BusHandler::getNextScanAddress(unsigned char lastAddress, bool& scanned) { symbol_t BusHandler::getNextScanAddress(symbol_t lastAddress, bool& scanned) {
if (lastAddress == SYN) { if (lastAddress == SYN) {
return SYN; return SYN;
} }
@@ -1325,7 +1313,7 @@ unsigned char BusHandler::getNextScanAddress(unsigned char lastAddress, bool& sc
scanned = (m_seenAddresses[lastAddress]&SCAN_INIT) != 0; scanned = (m_seenAddresses[lastAddress]&SCAN_INIT) != 0;
return lastAddress; return lastAddress;
} }
unsigned char master = getMasterAddress(lastAddress); symbol_t master = getMasterAddress(lastAddress);
if (master != SYN && (m_seenAddresses[master]&SEEN) != 0 && (m_seenAddresses[lastAddress]&LOAD_INIT) == 0) { if (master != SYN && (m_seenAddresses[master]&SEEN) != 0 && (m_seenAddresses[lastAddress]&LOAD_INIT) == 0) {
scanned = (m_seenAddresses[lastAddress]&SCAN_INIT) != 0; scanned = (m_seenAddresses[lastAddress]&SCAN_INIT) != 0;
return lastAddress; return lastAddress;
@@ -1334,7 +1322,7 @@ unsigned char BusHandler::getNextScanAddress(unsigned char lastAddress, bool& sc
return SYN; return SYN;
} }
void BusHandler::setScanConfigLoaded(unsigned char address, string file) { void BusHandler::setScanConfigLoaded(symbol_t address, string file) {
m_seenAddresses[address] |= LOAD_INIT; m_seenAddresses[address] |= LOAD_INIT;
if (!file.empty()) { if (!file.empty()) {
m_seenAddresses[address] |= LOAD_DONE; m_seenAddresses[address] |= LOAD_DONE;
+25 -25
View File
@@ -163,10 +163,10 @@ class PollRequest : public BusRequest {
* @param masterAddress the master bus address to use. * @param masterAddress the master bus address to use.
* @return the result code. * @return the result code.
*/ */
result_t prepare(unsigned char masterAddress); result_t prepare(symbol_t masterAddress);
// @copydoc // @copydoc
virtual bool notify(result_t result, SlaveSymbolString& slave); virtual bool notify(result_t result, SlaveSymbolString& slave) override;
private: private:
@@ -177,7 +177,7 @@ class PollRequest : public BusRequest {
Message* m_message; Message* m_message;
/** the current part index in @a m_message. */ /** the current part index in @a m_message. */
unsigned char m_index; size_t m_index;
}; };
@@ -195,7 +195,7 @@ class ScanRequest : public BusRequest {
* @param slaves the slave addresses to scan. * @param slaves the slave addresses to scan.
* @param busHandler the @a BusHandler instance to notify of final scan result. * @param busHandler the @a BusHandler instance to notify of final scan result.
*/ */
ScanRequest(MessageMap* messageMap, deque<Message*> messages, deque<unsigned char> slaves, BusHandler* busHandler) ScanRequest(MessageMap* messageMap, deque<Message*> messages, deque<symbol_t> slaves, BusHandler* busHandler)
: BusRequest(m_master, true), m_messageMap(messageMap), m_index(0), m_allMessages(messages), m_messages(messages), : BusRequest(m_master, true), m_messageMap(messageMap), m_index(0), m_allMessages(messages), m_messages(messages),
m_slaves(slaves), m_busHandler(busHandler) { m_slaves(slaves), m_busHandler(busHandler) {
m_message = m_messages.front(); m_message = m_messages.front();
@@ -212,10 +212,10 @@ class ScanRequest : public BusRequest {
* @param masterAddress the master bus address to use. * @param masterAddress the master bus address to use.
* @return the result code. * @return the result code.
*/ */
result_t prepare(unsigned char masterAddress); result_t prepare(symbol_t masterAddress);
// @copydoc // @copydoc
virtual bool notify(result_t result, SlaveSymbolString& slave); virtual bool notify(result_t result, SlaveSymbolString& slave) override;
private: private:
@@ -229,7 +229,7 @@ class ScanRequest : public BusRequest {
Message* m_message; Message* m_message;
/** the current part index in @a m_message. */ /** the current part index in @a m_message. */
unsigned char m_index; size_t m_index;
/** all secondary @a Message instances. */ /** all secondary @a Message instances. */
const deque<Message*> m_allMessages; const deque<Message*> m_allMessages;
@@ -238,7 +238,7 @@ class ScanRequest : public BusRequest {
deque<Message*> m_messages; deque<Message*> m_messages;
/** the slave addresses to scan. */ /** the slave addresses to scan. */
deque<unsigned char> m_slaves; deque<symbol_t> m_slaves;
/** the @a ostringstream for building the scan result of a single slave. */ /** the @a ostringstream for building the scan result of a single slave. */
ostringstream m_scanResult; ostringstream m_scanResult;
@@ -269,7 +269,7 @@ class ActiveBusRequest : public BusRequest {
virtual ~ActiveBusRequest() {} virtual ~ActiveBusRequest() {}
// @copydoc // @copydoc
virtual bool notify(result_t result, SlaveSymbolString& slave); virtual bool notify(result_t result, SlaveSymbolString& slave) override;
private: private:
@@ -352,13 +352,13 @@ class BusHandler : public WaitThread {
* @param pollInterval the interval in seconds in which poll messages are cycled, or 0 if disabled. * @param pollInterval the interval in seconds in which poll messages are cycled, or 0 if disabled.
*/ */
BusHandler(Device* device, MessageMap* messages, BusHandler(Device* device, MessageMap* messages,
const unsigned char ownAddress, const bool answer, const symbol_t ownAddress, const bool answer,
const unsigned int busLostRetries, const unsigned int failedSendRetries, const unsigned int busLostRetries, const unsigned int failedSendRetries,
const unsigned int transferLatency, const unsigned int busAcquireTimeout, const unsigned int slaveRecvTimeout, const unsigned int transferLatency, const unsigned int busAcquireTimeout, const unsigned int slaveRecvTimeout,
const unsigned int lockCount, const bool generateSyn, const unsigned int lockCount, const bool generateSyn,
const unsigned int pollInterval) const unsigned int pollInterval)
: WaitThread(), m_device(device), m_reconnect(false), m_messages(messages), : WaitThread(), m_device(device), m_reconnect(false), m_messages(messages),
m_ownMasterAddress(ownAddress), m_ownSlaveAddress((unsigned char)(ownAddress+5)), m_ownMasterAddress(ownAddress), m_ownSlaveAddress(getSlaveAddress(ownAddress)),
m_answer(answer), m_addressConflict(false), m_answer(answer), m_addressConflict(false),
m_busLostRetries(busLostRetries), m_failedSendRetries(failedSendRetries), m_busLostRetries(busLostRetries), m_failedSendRetries(failedSendRetries),
m_transferLatency(transferLatency), m_busAcquireTimeout(busAcquireTimeout), m_slaveRecvTimeout(slaveRecvTimeout), m_transferLatency(transferLatency), m_busAcquireTimeout(busAcquireTimeout), m_slaveRecvTimeout(slaveRecvTimeout),
@@ -415,8 +415,8 @@ class BusHandler : public WaitThread {
* @param srcAddress the source address to set, or @a SYN for the own master address. * @param srcAddress the source address to set, or @a SYN for the own master address.
* @return the result code. * @return the result code.
*/ */
result_t readFromBus(Message* message, string inputStr, const unsigned char dstAddress = SYN, result_t readFromBus(Message* message, string inputStr, const symbol_t dstAddress = SYN,
const unsigned char srcAddress = SYN); const symbol_t srcAddress = SYN);
/** /**
* Main thread entry. * Main thread entry.
@@ -436,7 +436,7 @@ class BusHandler : public WaitThread {
* @param dstAddress the scanned slave address. * @param dstAddress the scanned slave address.
* @param str the scan result @a string to set, or empty if not a single part of the scan was successful. * @param str the scan result @a string to set, or empty if not a single part of the scan was successful.
*/ */
void setScanResult(unsigned char dstAddress, string str); void setScanResult(symbol_t dstAddress, string str);
/** /**
* Called from @a ScanRequest upon completion. * Called from @a ScanRequest upon completion.
@@ -461,7 +461,7 @@ class BusHandler : public WaitThread {
* @param slave the @a SlaveSymbolString 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. * @return the result code.
*/ */
result_t scanAndWait(unsigned char dstAddress, SlaveSymbolString& slave); result_t scanAndWait(symbol_t dstAddress, SlaveSymbolString& slave);
/** /**
* Start or stop grabbing unknown messages. * Start or stop grabbing unknown messages.
@@ -513,14 +513,14 @@ class BusHandler : public WaitThread {
* @param scanned set to true when the slave is already scanned but not yet loaded, set to false when it still needs to be scanned and loaded. * @param scanned set to true when the slave is already scanned but not yet loaded, set to false when it still needs to be scanned and loaded.
* @return the next slave address that still needs to be scanned or loaded, or @a SYN. * @return the next slave address that still needs to be scanned or loaded, or @a SYN.
*/ */
unsigned char getNextScanAddress(unsigned char lastAddress, bool& scanned); symbol_t getNextScanAddress(symbol_t lastAddress, bool& scanned);
/** /**
* Set the state of the participant to configuration @a LOADED. * Set the state of the participant to configuration @a LOADED.
* @param address the slave address. * @param address the slave address.
* @param file the file from which the configuration was loaded, or empty if loading was not possible. * @param file the file from which the configuration was loaded, or empty if loading was not possible.
*/ */
void setScanConfigLoaded(unsigned char address, string file); void setScanConfigLoaded(symbol_t address, string file);
private: private:
@@ -543,7 +543,7 @@ class BusHandler : public WaitThread {
* Add a seen bus address. * Add a seen bus address.
* @param address the seen bus address. * @param address the seen bus address.
*/ */
void addSeenAddress(unsigned char address); void addSeenAddress(symbol_t address);
/** /**
* Called when a passive reception was successfully completed. * Called when a passive reception was successfully completed.
@@ -560,10 +560,10 @@ class BusHandler : public WaitThread {
MessageMap* m_messages; MessageMap* m_messages;
/** the own master address. */ /** the own master address. */
const unsigned char m_ownMasterAddress; const symbol_t m_ownMasterAddress;
/** the own slave address. */ /** the own slave address. */
const unsigned char m_ownSlaveAddress; const symbol_t m_ownSlaveAddress;
/** whether to answer queries for the own master/slave address. */ /** whether to answer queries for the own master/slave address. */
const bool m_answer; const bool m_answer;
@@ -624,7 +624,7 @@ class BusHandler : public WaitThread {
/** the offset of the next symbol that needs to be sent from the command or response, /** the offset of the next symbol that needs to be sent from the command or response,
* (only relevant if m_request is set and state is @a bs_command or @a bs_response). */ * (only relevant if m_request is set and state is @a bs_command or @a bs_response). */
unsigned char m_nextSendPos; size_t m_nextSendPos;
/** the number of received symbols in the last second. */ /** the number of received symbols in the last second. */
unsigned int m_symPerSec; unsigned int m_symPerSec;
@@ -636,10 +636,10 @@ class BusHandler : public WaitThread {
BusState m_state; BusState m_state;
/** 0 when not escaping/unescaping, or @a ESC when receiving, or the original value when sending. */ /** 0 when not escaping/unescaping, or @a ESC when receiving, or the original value when sending. */
unsigned char m_escape; symbol_t m_escape;
/** the calculated CRC. */ /** the calculated CRC. */
unsigned char m_crc; symbol_t m_crc;
/** whether the CRC matched. */ /** whether the CRC matched. */
bool m_crcValid; bool m_crcValid;
@@ -654,10 +654,10 @@ class BusHandler : public WaitThread {
SlaveSymbolString m_response; SlaveSymbolString m_response;
/** the participating bus addresses seen so far (0 if not seen yet, or combination of @a SEEN bits). */ /** the participating bus addresses seen so far (0 if not seen yet, or combination of @a SEEN bits). */
unsigned char m_seenAddresses[256]; symbol_t m_seenAddresses[256];
/** the scan results by slave address. */ /** the scan results by slave address. */
map<unsigned char, string> m_scanResults; map<symbol_t, string> m_scanResults;
/** whether to grab messages. */ /** whether to grab messages. */
bool m_grabMessages; bool m_grabMessages;
+23 -36
View File
@@ -296,13 +296,13 @@ error_t parse_opt(int key, char *arg, struct argp_state *state) {
} else if (strcmp("full", arg) == 0) { } else if (strcmp("full", arg) == 0) {
opt->initialScan = SYN; opt->initialScan = SYN;
} else { } else {
opt->initialScan = (unsigned char)parseInt(arg, 16, 0x00, 0xff, result); opt->initialScan = (symbol_t)parseInt(arg, 16, 0x00, 0xff, result);
if (!isValidAddress(opt->initialScan)) { if (!isValidAddress(opt->initialScan)) {
argp_error(state, "invalid initial scan address"); argp_error(state, "invalid initial scan address");
return EINVAL; return EINVAL;
} }
if (isMaster(opt->initialScan)) { if (isMaster(opt->initialScan)) {
opt->initialScan = (unsigned char)(opt->initialScan+5); opt->initialScan = getSlaveAddress(opt->initialScan);
} }
} }
} }
@@ -328,7 +328,7 @@ error_t parse_opt(int key, char *arg, struct argp_state *state) {
// eBUS options: // eBUS options:
case 'a': // --address=31 case 'a': // --address=31
opt->address = (unsigned char)parseInt(arg, 16, 0, 0xff, result); opt->address = (symbol_t)parseInt(arg, 16, 0, 0xff, result);
if (result != RESULT_OK || !isMaster(opt->address)) { if (result != RESULT_OK || !isMaster(opt->address)) {
argp_error(state, "invalid address"); argp_error(state, "invalid address");
return EINVAL; return EINVAL;
@@ -875,32 +875,24 @@ result_t loadConfigFiles(MessageMap* messages, bool verbose, bool denyRecursive)
return RESULT_OK; return RESULT_OK;
} }
result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SlaveSymbolString& data, string& relativeFile, result_t loadScanConfigFile(MessageMap* messages, symbol_t address, SlaveSymbolString& data, string& relativeFile,
bool verbose) { bool verbose) {
PartType partType;
if (isMaster(address)) { if (isMaster(address)) {
address = (unsigned char)(data[0]+5); // slave address of sending master address = getSlaveAddress(data[0]); // slave address of sending master
partType = pt_masterData; }
if (data.size() < 5+1+5+2+2) { // skip QQ ZZ PB SB NN if (data.getDataSize() < 1+5+2+2) {
logError(lf_main, "unable to load scan config %2.2x: master part too short", address); logError(lf_main, "unable to load scan config %2.2x: slave part too short", address);
return RESULT_EMPTY; return RESULT_EMPTY;
}
} else {
partType = pt_slaveData;
if (data.size() < 1+1+5+2+2) { // skip NN
logError(lf_main, "unable to load scan config %2.2x: slave part too short", address);
return RESULT_EMPTY;
}
} }
DataFieldSet* identFields = DataFieldSet::getIdentFields(); DataFieldSet* identFields = DataFieldSet::getIdentFields();
string path, prefix, ident; // path: cfgpath/MANUFACTURER, prefix: ZZ., ident: C[C[C[C[C]]]], SW: xxxx, HW: xxxx string path, prefix, ident; // path: cfgpath/MANUFACTURER, prefix: ZZ., ident: C[C[C[C[C]]]], SW: xxxx, HW: xxxx
unsigned int sw = 0, hw = 0; unsigned int sw = 0, hw = 0;
ostringstream out; ostringstream out;
unsigned char offset = 0; size_t offset = 0;
unsigned char field = 0; size_t field = 0;
result_t result = (*identFields)[field]->read(partType, data, offset, out, 0); // manufacturer name result_t result = (*identFields)[field]->read(data, offset, out, 0); // manufacturer name
if (result == RESULT_ERR_NOTFOUND) { if (result == RESULT_ERR_NOTFOUND) {
result = (*identFields)[field]->read(partType, data, offset, out, OF_NUMERIC); // manufacturer name result = (*identFields)[field]->read(data, offset, out, OF_NUMERIC); // manufacturer name
} }
if (result == RESULT_OK) { if (result == RESULT_OK) {
path = out.str(); path = out.str();
@@ -911,26 +903,24 @@ result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SlaveSy
prefix = out.str(); prefix = out.str();
out.str(""); out.str("");
out.clear(); out.clear();
offset = (unsigned char)(offset+(*identFields)[field++]->getLength(partType)); offset += (*identFields)[field++]->getLength(pt_slaveData);
result = (*identFields)[field]->read(partType, data, offset, out, 0); // identification string result = (*identFields)[field]->read(data, offset, out, 0); // identification string
} }
if (result == RESULT_OK) { if (result == RESULT_OK) {
ident = out.str(); ident = out.str();
out.str(""); out.str("");
offset = (unsigned char)(offset+(*identFields)[field++]->getLength(partType)); offset += (*identFields)[field++]->getLength(pt_slaveData);
result = (*identFields)[field]->read(partType, data, offset, sw, 0); // software version number result = (*identFields)[field]->read(data, offset, sw, 0); // software version number
if (result == RESULT_ERR_OUT_OF_RANGE) { if (result == RESULT_ERR_OUT_OF_RANGE) {
sw = (data[(partType == pt_masterData ? 5 : 1)+offset] << 16) sw = (data.dataAt(offset) << 16) | data.dataAt(offset+1); // use hex value instead
| data[(partType == pt_masterData ? 5 : 1)+offset+1];
result = RESULT_OK; result = RESULT_OK;
} }
} }
if (result == RESULT_OK) { if (result == RESULT_OK) {
offset = (unsigned char)(offset+(*identFields)[field++]->getLength(partType)); offset += (*identFields)[field++]->getLength(pt_slaveData);
result = (*identFields)[field]->read(partType, data, offset, hw, 0); // hardware version number result = (*identFields)[field]->read(data, offset, hw, 0); // hardware version number
if (result == RESULT_ERR_OUT_OF_RANGE) { if (result == RESULT_ERR_OUT_OF_RANGE) {
hw = (data[(partType == pt_masterData ? 5 : 1)+offset] << 16) hw = (data.dataAt(offset) << 16) | data.dataAt(offset+1); // use hex value instead
| data[(partType == pt_masterData ? 5 : 1)+offset+1];
result = RESULT_OK; result = RESULT_OK;
} }
} }
@@ -967,7 +957,7 @@ result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SlaveSy
string best; string best;
for (vector<string>::iterator it = files.begin(); it != files.end(); it++) { for (vector<string>::iterator it = files.begin(); it != files.end(); it++) {
string name = *it; string name = *it;
unsigned char checkDest; symbol_t checkDest;
string checkIdent, useCircuit, useSuffix; string checkIdent, useCircuit, useSuffix;
unsigned int checkSw, checkHw; unsigned int checkSw, checkHw;
if (!FileReader::extractDefaultsFromFilename(name.substr(path.length()+1), checkDest, checkIdent, useCircuit, if (!FileReader::extractDefaultsFromFilename(name.substr(path.length()+1), checkDest, checkIdent, useCircuit,
@@ -1053,9 +1043,6 @@ result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SlaveSy
* @return the exit code. * @return the exit code.
*/ */
int main(int argc, char* argv[]) { 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 }; struct argp aargp = { argpoptions, parse_opt, NULL, argpdoc, datahandler_getargs(), NULL, NULL };
int arg_index = -1; int arg_index = -1;
setenv("ARGP_HELP_FMT", "no-dup-args-note", 0); setenv("ARGP_HELP_FMT", "no-dup-args-note", 0);
@@ -1098,7 +1085,7 @@ int main(int argc, char* argv[]) {
logError(lf_main, "invalid scan message %s: master part too short", arg.c_str()); logError(lf_main, "invalid scan message %s: master part too short", arg.c_str());
continue; continue;
} }
unsigned char address = master[1]; symbol_t address = master[1];
Message* message = s_messageMap->getScanMessage(address); Message* message = s_messageMap->getScanMessage(address);
if (!message) { if (!message) {
logError(lf_main, "invalid scan address %2.2x", address); logError(lf_main, "invalid scan address %2.2x", address);
+3 -3
View File
@@ -44,12 +44,12 @@ struct options {
bool scanConfig; //!< pick configuration files matching initial scan bool scanConfig; //!< pick configuration files matching initial scan
/** the initial address to scan for scanconfig /** the initial address to scan for scanconfig
* (@a ESC=none, 0xfe=broadcast ident, @a SYN=full scan, else: single slave address). */ * (@a ESC=none, 0xfe=broadcast ident, @a SYN=full scan, else: single slave address). */
unsigned char initialScan; symbol_t initialScan;
bool checkConfig; //!< check CSV config files, then stop bool checkConfig; //!< check CSV config files, then stop
bool dumpConfig; //!< dump CSV config files, then stop bool dumpConfig; //!< dump CSV config files, then stop
unsigned int pollInterval; //!< poll interval in seconds, 0 to disable [5] unsigned int pollInterval; //!< poll interval in seconds, 0 to disable [5]
unsigned char address; //!< own bus address [31] symbol_t address; //!< own bus address [31]
bool answer; //!< answer to requests from other masters bool answer; //!< answer to requests from other masters
unsigned int acquireTimeout; //!< bus acquisition timeout in us [9400] unsigned int acquireTimeout; //!< bus acquisition timeout in us [9400]
unsigned int acquireRetries; //!< number of retries for bus acquisition [3] unsigned int acquireRetries; //!< number of retries for bus acquisition [3]
@@ -108,7 +108,7 @@ result_t loadConfigFiles(MessageMap* messages, bool verbose = false, bool denyRe
* @param verbose whether to verbosely log problems. * @param verbose whether to verbosely log problems.
* @return the result code. * @return the result code.
*/ */
result_t loadScanConfigFile(MessageMap* messages, unsigned char address, SlaveSymbolString& data, string& relativeFile, result_t loadScanConfigFile(MessageMap* messages, symbol_t address, SlaveSymbolString& data, string& relativeFile,
bool verbose = false); bool verbose = false);
} // namespace ebusd } // namespace ebusd
+33 -33
View File
@@ -193,7 +193,7 @@ void MainLoop::run() {
bool reload = true; bool reload = true;
time_t lastTaskRun, now, lastSignal = 0, since, sinkSince = 1; time_t lastTaskRun, now, lastSignal = 0, since, sinkSince = 1;
int taskDelay = 5; int taskDelay = 5;
unsigned char lastScanAddress = 0; // 0 is known to be a master symbol_t lastScanAddress = 0; // 0 is known to be a master
time(&now); time(&now);
lastTaskRun = now; lastTaskRun = now;
ostringstream updates; ostringstream updates;
@@ -341,17 +341,17 @@ void MainLoop::run() {
} }
} }
void MainLoop::notifyDeviceData(const unsigned char byte, bool received) { void MainLoop::notifyDeviceData(const symbol_t symbol, bool received) {
if (received && m_dumpFile) { if (received && m_dumpFile) {
m_dumpFile->write((unsigned char*)&byte, 1); m_dumpFile->write((unsigned char*)&symbol, 1);
} }
if (m_logRawFile) { if (m_logRawFile) {
m_logRawFile->write((unsigned char*)&byte, 1, received); m_logRawFile->write((unsigned char*)&symbol, 1, received);
} else if (m_logRawEnabled) { } else if (m_logRawEnabled) {
if (received) { if (received) {
logNotice(lf_bus, "<%02x", byte); logNotice(lf_bus, "<%02x", symbol);
} else { } else {
logNotice(lf_bus, ">%02x", byte); logNotice(lf_bus, ">%02x", symbol);
} }
} }
} }
@@ -473,7 +473,7 @@ string MainLoop::decodeMessage(const string& data, const bool isHttp, bool& conn
} }
result_t MainLoop::parseHexMaster(vector<string> &args, size_t argPos, MasterSymbolString& master, result_t MainLoop::parseHexMaster(vector<string> &args, size_t argPos, MasterSymbolString& master,
unsigned char srcAddress) { symbol_t srcAddress) {
ostringstream msg; ostringstream msg;
while (argPos < args.size()) { while (argPos < args.size()) {
if ((args[argPos].length() % 2) != 0) { if ((args[argPos].length() % 2) != 0) {
@@ -520,7 +520,8 @@ string MainLoop::executeRead(vector<string> &args, const string levels) {
OutputFormat verbosity = 0; OutputFormat verbosity = 0;
time_t maxAge = 5*60; time_t maxAge = 5*60;
string circuit, params; string circuit, params;
unsigned char srcAddress = SYN, dstAddress = SYN, pollPriority = 0; symbol_t srcAddress = SYN, dstAddress = SYN;
size_t pollPriority = 0;
while (args.size() > argPos && args[argPos][0] == '-') { while (args.size() > argPos && args[argPos][0] == '-') {
if (args[argPos] == "-h") { if (args[argPos] == "-h") {
hex = true; hex = true;
@@ -572,7 +573,7 @@ string MainLoop::executeRead(vector<string> &args, const string levels) {
} }
bool dest = args[argPos] == "-d"; bool dest = args[argPos] == "-d";
result_t ret; result_t ret;
unsigned char address = (unsigned char)parseInt(args[argPos].c_str(), 16, 0, 0xff, ret); symbol_t address = (symbol_t)parseInt(args[argPos].c_str(), 16, 0, 0xff, ret);
if (ret != RESULT_OK || !isValidAddress(address, dest) || dest == isMaster(address)) { if (ret != RESULT_OK || !isValidAddress(address, dest) || dest == isMaster(address)) {
return getResultCode(RESULT_ERR_INVALID_ADDR); return getResultCode(RESULT_ERR_INVALID_ADDR);
} }
@@ -588,7 +589,7 @@ string MainLoop::executeRead(vector<string> &args, const string levels) {
break; break;
} }
result_t ret; result_t ret;
pollPriority = (unsigned char)parseInt(args[argPos].c_str(), 10, 1, 9, ret); pollPriority = (size_t)parseInt(args[argPos].c_str(), 10, 1, 9, ret);
if (ret != RESULT_OK) { if (ret != RESULT_OK) {
return getResultCode(RESULT_ERR_INVALID_NUM); return getResultCode(RESULT_ERR_INVALID_NUM);
} }
@@ -622,7 +623,7 @@ string MainLoop::executeRead(vector<string> &args, const string levels) {
if (master[1] == BROADCAST || isMaster(master[1])) { if (master[1] == BROADCAST || isMaster(master[1])) {
return getResultCode(RESULT_ERR_INVALID_ARG); return getResultCode(RESULT_ERR_INVALID_ARG);
} }
logNotice(lf_main, "read hex cmd: %s", master.getDataStr().c_str()); logNotice(lf_main, "read hex cmd: %s", master.getStr().c_str());
// find message // find message
Message* message = m_messages->find(master, false, true, false, false); Message* message = m_messages->find(master, false, true, false, false);
@@ -644,7 +645,7 @@ string MainLoop::executeRead(vector<string> &args, const string levels) {
|| (message->isPassive() && message->getLastUpdateTime() != 0))) { || (message->isPassive() && message->getLastUpdateTime() != 0))) {
SlaveSymbolString& slave = message->getLastSlaveData(); SlaveSymbolString& slave = message->getLastSlaveData();
logNotice(lf_main, "hex read %s %s from cache", message->getCircuit().c_str(), message->getName().c_str()); logNotice(lf_main, "hex read %s %s from cache", message->getCircuit().c_str(), message->getName().c_str());
return slave.getDataStr(); return slave.getStr();
} }
// send message // send message
@@ -664,7 +665,7 @@ string MainLoop::executeRead(vector<string> &args, const string levels) {
logError(lf_main, "read hex %s %s cache update: %s", message->getCircuit().c_str(), message->getName().c_str(), logError(lf_main, "read hex %s %s cache update: %s", message->getCircuit().c_str(), message->getName().c_str(),
getResultCode(ret)); getResultCode(ret));
} }
return slave.getDataStr(); return slave.getStr();
} }
logError(lf_main, "read hex %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(), logError(lf_main, "read hex %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(),
getResultCode(ret)); getResultCode(ret));
@@ -695,14 +696,14 @@ string MainLoop::executeRead(vector<string> &args, const string levels) {
" Dx data byte(s) to send"; " Dx data byte(s) to send";
} }
string fieldName; string fieldName;
signed char fieldIndex = -2; ssize_t fieldIndex = -2;
if (args.size() == argPos + 2) { if (args.size() == argPos + 2) {
fieldName = args[argPos + 1]; fieldName = args[argPos + 1];
fieldIndex = -1; fieldIndex = -1;
size_t pos = fieldName.find_last_of('.'); size_t pos = fieldName.find_last_of('.');
if (pos != string::npos) { if (pos != string::npos) {
result_t result = RESULT_OK; result_t result = RESULT_OK;
fieldIndex = static_cast<char>(parseInt(fieldName.substr(pos+1).c_str(), 10, 0, MAX_POS, result)); fieldIndex = static_cast<ssize_t>(parseInt(fieldName.substr(pos+1).c_str(), 10, 0, MAX_POS, result));
if (result == RESULT_OK) { if (result == RESULT_OK) {
fieldName = fieldName.substr(0, pos); fieldName = fieldName.substr(0, pos);
} }
@@ -781,7 +782,7 @@ string MainLoop::executeWrite(vector<string> &args, const string levels) {
size_t argPos = 1; size_t argPos = 1;
bool hex = false; bool hex = false;
string circuit; string circuit;
unsigned char srcAddress = SYN, dstAddress = SYN; symbol_t srcAddress = SYN, dstAddress = SYN;
while (args.size() > argPos && args[argPos][0] == '-') { while (args.size() > argPos && args[argPos][0] == '-') {
if (args[argPos] == "-h") { if (args[argPos] == "-h") {
hex = true; hex = true;
@@ -793,7 +794,7 @@ string MainLoop::executeWrite(vector<string> &args, const string levels) {
} }
bool dest = args[argPos] == "-d"; bool dest = args[argPos] == "-d";
result_t ret; result_t ret;
unsigned char address = (unsigned char)parseInt(args[argPos].c_str(), 16, 0, 0xff, ret); symbol_t address = (symbol_t)parseInt(args[argPos].c_str(), 16, 0, 0xff, ret);
if (ret != RESULT_OK || !isValidAddress(address, dest) || dest == isMaster(address)) { if (ret != RESULT_OK || !isValidAddress(address, dest) || dest == isMaster(address)) {
return getResultCode(RESULT_ERR_INVALID_ADDR); return getResultCode(RESULT_ERR_INVALID_ADDR);
} }
@@ -826,7 +827,7 @@ string MainLoop::executeWrite(vector<string> &args, const string levels) {
if (ret != RESULT_OK) { if (ret != RESULT_OK) {
return getResultCode(ret); return getResultCode(ret);
} }
logNotice(lf_main, "write hex cmd: %s", master.getDataStr().c_str()); logNotice(lf_main, "write hex cmd: %s", master.getStr().c_str());
// find message // find message
Message* message = m_messages->find(master, false, false, true, false); Message* message = m_messages->find(master, false, false, true, false);
@@ -867,7 +868,7 @@ string MainLoop::executeWrite(vector<string> &args, const string levels) {
if (isMaster(master[1])) { if (isMaster(master[1])) {
return getResultCode(RESULT_OK); return getResultCode(RESULT_OK);
} }
return slave.getDataStr(); return slave.getStr();
} }
logError(lf_main, "write hex %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(), logError(lf_main, "write hex %s %s: %s", message->getCircuit().c_str(), message->getName().c_str(),
getResultCode(ret)); getResultCode(ret));
@@ -936,14 +937,14 @@ string MainLoop::executeWrite(vector<string> &args, const string levels) {
string MainLoop::executeHex(vector<string> &args) { string MainLoop::executeHex(vector<string> &args) {
size_t argPos = 1; size_t argPos = 1;
unsigned char srcAddress = SYN; symbol_t srcAddress = SYN;
if (args.size() > argPos && args[argPos] == "-s") { if (args.size() > argPos && args[argPos] == "-s") {
argPos++; argPos++;
if (argPos >= args.size()) { if (argPos >= args.size()) {
argPos = 0; // print usage argPos = 0; // print usage
} else { } else {
result_t ret; result_t ret;
unsigned char address = (unsigned char)parseInt(args[argPos].c_str(), 16, 0, 0xff, ret); symbol_t address = (symbol_t)parseInt(args[argPos].c_str(), 16, 0, 0xff, ret);
if (ret != RESULT_OK || !isValidAddress(address, false) || !isMaster(address)) { if (ret != RESULT_OK || !isValidAddress(address, false) || !isMaster(address)) {
return getResultCode(RESULT_ERR_INVALID_ADDR); return getResultCode(RESULT_ERR_INVALID_ADDR);
} }
@@ -961,7 +962,7 @@ string MainLoop::executeHex(vector<string> &args) {
if (ret != RESULT_OK) { if (ret != RESULT_OK) {
return getResultCode(ret); return getResultCode(ret);
} }
logNotice(lf_main, "hex cmd: %s", master.getDataStr().c_str()); logNotice(lf_main, "hex cmd: %s", master.getStr().c_str());
// send message // send message
SlaveSymbolString slave; SlaveSymbolString slave;
@@ -974,7 +975,7 @@ string MainLoop::executeHex(vector<string> &args) {
if (isMaster(master[1])) { if (isMaster(master[1])) {
return getResultCode(RESULT_OK); return getResultCode(RESULT_OK);
} }
return slave.getDataStr(); return slave.getStr();
} }
logError(lf_main, "hex: %s", getResultCode(ret)); logError(lf_main, "hex: %s", getResultCode(ret));
return getResultCode(ret); return getResultCode(ret);
@@ -996,7 +997,7 @@ string MainLoop::executeFind(vector<string> &args, string levels) {
OutputFormat verbosity = 0; OutputFormat verbosity = 0;
vector<column_t> columns; vector<column_t> columns;
string circuit; string circuit;
vector<unsigned char> id; vector<symbol_t> id;
while (args.size() > argPos && args[argPos][0] == '-') { while (args.size() > argPos && args[argPos][0] == '-') {
if (args[argPos] == "-v") { if (args[argPos] == "-v") {
switch (verbosity) { switch (verbosity) {
@@ -1165,18 +1166,17 @@ string MainLoop::executeFind(vector<string> &args, string levels) {
if (lastup == 0) { if (lastup == 0) {
result << "no data stored"; result << "no data stored";
} else if (hexFormat) { } else if (hexFormat) {
result << message->getLastMasterData().getDataStr() result << message->getLastMasterData().getStr() << " / " << message->getLastSlaveData().getStr();
<< " / " << message->getLastSlaveData().getDataStr();
} else { } else {
result_t ret = message->decodeLastData(result, verbosity); result_t ret = message->decodeLastData(result, verbosity);
if (ret != RESULT_OK) { if (ret != RESULT_OK) {
result << " (" << getResultCode(ret) result << " (" << getResultCode(ret)
<< " for " << message->getLastMasterData().getDataStr() << " for " << message->getLastMasterData().getStr()
<< " / " << message->getLastSlaveData().getDataStr() << ")"; << " / " << message->getLastSlaveData().getStr() << ")";
} }
} }
if (verbosity == (OF_NAMES|OF_UNITS|OF_COMMENTS)) { if (verbosity == (OF_NAMES|OF_UNITS|OF_COMMENTS)) {
unsigned char dstAddress = message->getDstAddress(); symbol_t dstAddress = message->getDstAddress();
if (dstAddress != SYN) { if (dstAddress != SYN) {
snprintf(str, sizeof(str), "%02x", dstAddress); snprintf(str, sizeof(str), "%02x", dstAddress);
} else if (lastup != 0 && message->getLastMasterData().size() > 1) { } else if (lastup != 0 && message->getLastMasterData().size() > 1) {
@@ -1298,7 +1298,7 @@ string MainLoop::executeScan(vector<string> &args, string levels) {
} }
result_t result; result_t result;
unsigned char dstAddress = (unsigned char)parseInt(args[1].c_str(), 16, 0, 0xff, result); symbol_t dstAddress = (symbol_t)parseInt(args[1].c_str(), 16, 0, 0xff, result);
if (result == RESULT_OK && !isValidAddress(dstAddress, false)) { if (result == RESULT_OK && !isValidAddress(dstAddress, false)) {
result = RESULT_ERR_INVALID_ADDR; result = RESULT_ERR_INVALID_ADDR;
} }
@@ -1475,7 +1475,7 @@ string MainLoop::executeGet(vector<string> &args, bool& connected) {
name = uri.substr(pos + 1); name = uri.substr(pos + 1);
} }
time_t since = 0; time_t since = 0;
unsigned char pollPriority = 0; size_t pollPriority = 0;
bool exact = false; bool exact = false;
string user = ""; string user = "";
if (args.size() > argPos) { if (args.size() > argPos) {
@@ -1495,7 +1495,7 @@ string MainLoop::executeGet(vector<string> &args, bool& connected) {
if (qname == "since") { if (qname == "since") {
since = parseInt(value.c_str(), 10, 0, 0xffffffff, ret); since = parseInt(value.c_str(), 10, 0, 0xffffffff, ret);
} else if (qname == "poll") { } else if (qname == "poll") {
pollPriority = (unsigned char)parseInt(value.c_str(), 10, 1, 9, ret); pollPriority = (size_t)parseInt(value.c_str(), 10, 1, 9, ret);
} else if (qname == "exact") { } else if (qname == "exact") {
exact = value.length() == 0 || value == "1"; exact = value.length() == 0 || value == "1";
} else if (qname == "verbose") { } else if (qname == "verbose") {
@@ -1533,7 +1533,7 @@ string MainLoop::executeGet(vector<string> &args, bool& connected) {
bool first = true; bool first = true;
for (deque<Message*>::iterator it = messages.begin(); it != messages.end();) { for (deque<Message*>::iterator it = messages.begin(); it != messages.end();) {
Message* message = *it++; Message* message = *it++;
unsigned char dstAddress = message->getDstAddress(); symbol_t dstAddress = message->getDstAddress();
if (dstAddress == SYN) { if (dstAddress == SYN) {
continue; continue;
} }
+9 -9
View File
@@ -64,20 +64,20 @@ class UserList : public UserInfo, public FileReader {
// @copydoc // @copydoc
virtual result_t addFromFile(vector<string>::iterator& begin, const vector<string>::iterator end, virtual result_t addFromFile(vector<string>::iterator& begin, const vector<string>::iterator end,
vector< vector<string> >* defaults, const string& defaultDest, const string& defaultCircuit, vector< vector<string> >* defaults, const string& defaultDest, const string& defaultCircuit,
const string& defaultSuffix, const string& filename, unsigned int lineNo); const string& defaultSuffix, const string& filename, unsigned int lineNo) override;
// @copydoc // @copydoc
virtual bool hasUser(const string user) { virtual bool hasUser(const string user) override {
return m_userLevels.find(user) != m_userLevels.end(); return m_userLevels.find(user) != m_userLevels.end();
} }
// @copydoc // @copydoc
virtual bool checkSecret(const string user, const string secret) { virtual bool checkSecret(const string user, const string secret) override {
return m_userSecrets.find(user) != m_userSecrets.end() && m_userSecrets[user] == secret; return m_userSecrets.find(user) != m_userSecrets.end() && m_userSecrets[user] == secret;
} }
// @copydoc // @copydoc
virtual string getLevels(const string user) { return m_userLevels[user]; } virtual string getLevels(const string user) override { return m_userLevels[user]; }
private: private:
/** the secret string by user name. */ /** the secret string by user name. */
@@ -119,12 +119,12 @@ class MainLoop : public Thread, DeviceListener {
void addMessage(NetMessage* message) { m_netQueue.push(message); } void addMessage(NetMessage* message) { m_netQueue.push(message); }
// @copydoc // @copydoc
virtual void notifyDeviceData(const unsigned char byte, bool received); virtual void notifyDeviceData(const symbol_t symbol, bool received) override;
protected: protected:
// @copydoc // @copydoc
virtual void run(); virtual void run() override;
private: private:
@@ -150,7 +150,7 @@ class MainLoop : public Thread, DeviceListener {
* @return the result from parsing the arguments. * @return the result from parsing the arguments.
*/ */
result_t parseHexMaster(vector<string> &args, size_t argPos, MasterSymbolString& master, result_t parseHexMaster(vector<string> &args, size_t argPos, MasterSymbolString& master,
unsigned char srcAddress = SYN); symbol_t srcAddress = SYN);
/** /**
* Get the access levels associated with the specified user name. * Get the access levels associated with the specified user name.
@@ -317,14 +317,14 @@ class MainLoop : public Thread, DeviceListener {
MessageMap* m_messages; MessageMap* m_messages;
/** the own master address for sending on the bus. */ /** the own master address for sending on the bus. */
const unsigned char m_address; const symbol_t m_address;
/** whether to pick configuration files matching initial scan. */ /** whether to pick configuration files matching initial scan. */
const bool m_scanConfig; const bool m_scanConfig;
/** the initial address to scan for @a m_scanConfig /** the initial address to scan for @a m_scanConfig
* (@a ESC=none, 0xfe=broadcast ident, @a SYN=full scan, else: single slave address). */ * (@a ESC=none, 0xfe=broadcast ident, @a SYN=full scan, else: single slave address). */
const unsigned char m_initialScan; const symbol_t m_initialScan;
/** whether to enable the hex command. */ /** whether to enable the hex command. */
const bool m_enableHex; const bool m_enableHex;
+7 -7
View File
@@ -39,7 +39,7 @@ void contrib_tem_register() {
DataTypeList::getInstance()->add(new TemParamDataType("TEM_P")); DataTypeList::getInstance()->add(new TemParamDataType("TEM_P"));
} }
result_t TemParamDataType::derive(int divisor, unsigned char bitCount, NumberDataType* &derived) { result_t TemParamDataType::derive(int divisor, size_t bitCount, NumberDataType* &derived) {
if (divisor == 0) { if (divisor == 0) {
divisor = 1; divisor = 1;
} }
@@ -53,8 +53,8 @@ result_t TemParamDataType::derive(int divisor, unsigned char bitCount, NumberDat
return RESULT_ERR_INVALID_ARG; return RESULT_ERR_INVALID_ARG;
} }
result_t TemParamDataType::readSymbols(SymbolString& input, const bool isMaster, result_t TemParamDataType::readSymbols(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat) { ostringstream& output, OutputFormat outputFormat) {
unsigned int value = 0; unsigned int value = 0;
@@ -72,7 +72,7 @@ result_t TemParamDataType::readSymbols(SymbolString& input, const bool isMaster,
return RESULT_OK; return RESULT_OK;
} }
int grp = 0, num = 0; int grp = 0, num = 0;
if (isMaster) { if (input.isMaster()) {
grp = (value & 0x1f); // grp in bits 0...5 grp = (value & 0x1f); // grp in bits 0...5
num = ((value >> 8) & 0x7f); // num in bits 8...13 num = ((value >> 8) & 0x7f); // num in bits 8...13
} else { } else {
@@ -91,8 +91,8 @@ result_t TemParamDataType::readSymbols(SymbolString& input, const bool isMaster,
} }
result_t TemParamDataType::writeSymbols(istringstream& input, result_t TemParamDataType::writeSymbols(istringstream& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength) { SymbolString& output, size_t* usedLength) {
unsigned int value; unsigned int value;
int grp, num; int grp, num;
string token; string token;
@@ -128,7 +128,7 @@ result_t TemParamDataType::writeSymbols(istringstream& input,
if (grp < 0 || grp > 0x1f || num < 0 || num > 0x7f) { if (grp < 0 || grp > 0x1f || num < 0 || num > 0x7f) {
return RESULT_ERR_OUT_OF_RANGE; // value out of range return RESULT_ERR_OUT_OF_RANGE; // value out of range
} }
if (isMaster) { if (output.isMaster()) {
value = grp | (num << 8); // grp in bits 0...5, num in bits 8...13 value = grp | (num << 8); // grp in bits 0...5, num in bits 8...13
} else { } else {
value = (grp << 7) | num; // grp in bits 7...11, num in bits 0...6 value = (grp << 7) | num; // grp in bits 7...11, num in bits 0...6
+6 -6
View File
@@ -50,17 +50,17 @@ class TemParamDataType : public NumberDataType {
: NumberDataType(id, 16, 0, 0xffff, 0, 0xffff, 0) {} : NumberDataType(id, 16, 0, 0xffff, 0, 0xffff, 0) {}
// @copydoc // @copydoc
virtual result_t derive(int divisor, unsigned char bitCount, NumberDataType* &derived); virtual result_t derive(int divisor, size_t bitCount, NumberDataType* &derived) override;
// @copydoc // @copydoc
virtual result_t readSymbols(SymbolString& input, const bool isMaster, virtual result_t readSymbols(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat); ostringstream& output, OutputFormat outputFormat) override;
// @copydoc // @copydoc
virtual result_t writeSymbols(istringstream& input, virtual result_t writeSymbols(istringstream& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength); SymbolString& output, size_t* usedLength) override;
}; };
/** /**
+10 -12
View File
@@ -131,22 +131,20 @@ int main() {
ostringstream output; ostringstream output;
MasterSymbolString writeMstr; MasterSymbolString writeMstr;
result = writeMstr.parseHex(mstr.getDataStr().substr(0, 10)); result = writeMstr.parseHex(mstr.getStr().substr(0, 10));
if (result != RESULT_OK) { if (result != RESULT_OK) {
cout << " parse \"" << mstr.getDataStr().substr(0, 10) << "\" error: " << getResultCode(result) cout << " parse \"" << mstr.getStr().substr(0, 10) << "\" error: " << getResultCode(result) << endl;
<< endl;
error = true; error = true;
} }
SlaveSymbolString writeSstr; SlaveSymbolString writeSstr;
result = writeSstr.parseHex(sstr.getDataStr().substr(0, 2)); result = writeSstr.parseHex(sstr.getStr().substr(0, 2));
if (result != RESULT_OK) { if (result != RESULT_OK) {
cout << " parse \"" << sstr.getDataStr().substr(0, 2) << "\" error: " << getResultCode(result) cout << " parse \"" << sstr.getStr().substr(0, 2) << "\" error: " << getResultCode(result) << endl;
<< endl;
error = true; error = true;
} }
result = fields->read(pt_masterData, mstr, 0, output, 0, -1, false); result = fields->read(mstr, 0, output, 0, -1, false);
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
result = fields->read(pt_slaveData, sstr, 0, output, 0, -1, !output.str().empty()); result = fields->read(sstr, 0, output, 0, -1, !output.str().empty());
} }
if (failedRead) { if (failedRead) {
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
@@ -167,9 +165,9 @@ int main() {
} }
istringstream input(expectStr); istringstream input(expectStr);
result = fields->write(input, pt_masterData, writeMstr, 0); result = fields->write(input, writeMstr, 0);
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
result = fields->write(input, pt_slaveData, writeSstr, 0); result = fields->write(input, writeSstr, 0);
} }
if (failedWrite) { if (failedWrite) {
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
@@ -186,8 +184,8 @@ int main() {
error = true; error = true;
} else { } else {
bool match = mstr == writeMstr && sstr == writeSstr; bool match = mstr == writeMstr && sstr == writeSstr;
verify(failedWriteMatch, "write", expectStr, match, mstr.getDataStr() + " " verify(failedWriteMatch, "write", expectStr, match, mstr.getStr() + " " + sstr.getStr(),
+ sstr.getDataStr(), writeMstr.getDataStr() + " " + writeSstr.getDataStr()); writeMstr.getStr() + " " + writeSstr.getStr());
} }
delete fields; delete fields;
fields = NULL; fields = NULL;
+79 -104
View File
@@ -44,7 +44,7 @@ result_t DataField::create(vector<string>::iterator& it,
DataFieldTemplates* templates, DataField*& returnField, DataFieldTemplates* templates, DataField*& returnField,
const bool isWriteMessage, const bool isWriteMessage,
const bool isTemplate, const bool isBroadcastOrMasterDestination, const bool isTemplate, const bool isBroadcastOrMasterDestination,
const unsigned char maxFieldLength) { const size_t maxFieldLength) {
vector<SingleDataField*> fields; vector<SingleDataField*> fields;
string firstName, firstComment; string firstName, firstComment;
result_t result = RESULT_OK; result_t result = RESULT_OK;
@@ -188,7 +188,7 @@ result_t DataField::create(vector<string>::iterator& it,
templ = templates->get(token.substr(0, pos)); templ = templates->get(token.substr(0, pos));
} }
if (templ == NULL) { // basetype[:len] if (templ == NULL) { // basetype[:len]
unsigned char length; size_t length;
string typeName; string typeName;
if (pos == string::npos) { if (pos == string::npos) {
length = 0; // no length specified length = 0; // no length specified
@@ -197,7 +197,7 @@ result_t DataField::create(vector<string>::iterator& it,
if (pos+2 == token.length() && token[pos+1] == '*') { if (pos+2 == token.length() && token[pos+1] == '*') {
length = REMAIN_LEN; length = REMAIN_LEN;
} else { } else {
length = (unsigned char)parseInt(token.substr(pos+1).c_str(), 10, 1, maxFieldLength, result); length = (size_t)parseInt(token.substr(pos+1).c_str(), 10, 1, (unsigned int)maxFieldLength, result);
if (result != RESULT_OK) { if (result != RESULT_OK) {
break; break;
} }
@@ -271,16 +271,16 @@ string DataField::getDayName(int day) {
return dayNames[day]; return dayNames[day];
} }
result_t SingleDataField::create(const string id, const unsigned char length, result_t SingleDataField::create(const string id, const size_t length,
const string name, const string comment, const string unit, const string name, const string comment, const string unit,
const PartType partType, int divisor, map<unsigned int, string> values, const PartType partType, int divisor, map<unsigned int, string> values,
const string constantValue, const bool verifyValue, SingleDataField* &returnField) { const string constantValue, const bool verifyValue, SingleDataField* &returnField) {
DataType* dataType = DataTypeList::getInstance()->get(id, length == REMAIN_LEN ? (unsigned char)0 : length); DataType* dataType = DataTypeList::getInstance()->get(id, length == REMAIN_LEN ? 0 : length);
if (!dataType) { if (!dataType) {
return RESULT_ERR_NOTFOUND; return RESULT_ERR_NOTFOUND;
} }
unsigned char bitCount = dataType->getBitCount(); size_t bitCount = dataType->getBitCount();
unsigned char byteCount = (unsigned char)((bitCount + 7) / 8); size_t byteCount = (bitCount + 7) / 8;
if (dataType->isAdjustableLength()) { if (dataType->isAdjustableLength()) {
// check length // check length
if ((bitCount % 8) != 0) { if ((bitCount % 8) != 0) {
@@ -291,7 +291,7 @@ result_t SingleDataField::create(const string id, const unsigned char length,
} else { } else {
return RESULT_ERR_OUT_OF_RANGE; // invalid length return RESULT_ERR_OUT_OF_RANGE; // invalid length
} }
byteCount = (unsigned char)((bitCount + 7) / 8); byteCount = (bitCount + 7) / 8;
} else if (length == 0) { } else if (length == 0) {
byteCount = 1; // default byte count: 1 byte byteCount = 1; // default byte count: 1 byte
} else if (length <= byteCount || length == REMAIN_LEN) { } else if (length <= byteCount || length == REMAIN_LEN) {
@@ -348,24 +348,16 @@ void SingleDataField::dump(ostream& output) {
} }
result_t SingleDataField::read(const PartType partType, result_t SingleDataField::read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, unsigned int& output, const char* fieldName, ssize_t fieldIndex) {
unsigned int& output, const char* fieldName, signed char fieldIndex) { if (m_partType == pt_any) {
if (partType != m_partType) {
return RESULT_EMPTY;
}
switch (m_partType) {
case pt_masterData:
offset = (unsigned char)(offset + 5); // skip QQ ZZ PB SB NN
break;
case pt_slaveData:
offset++; // skip NN
break;
default:
return RESULT_ERR_INVALID_PART; return RESULT_ERR_INVALID_PART;
} }
if ((data.isMaster() ? pt_masterData : pt_slaveData) != m_partType) {
return RESULT_EMPTY;
}
bool remainder = m_length == REMAIN_LEN && m_dataType->isAdjustableLength(); bool remainder = m_length == REMAIN_LEN && m_dataType->isAdjustableLength();
if (offset + (remainder?1:m_length) > data.size()) { if (offset + (remainder?1:m_length) > data.getDataSize()) {
return RESULT_ERR_INVALID_POS; return RESULT_ERR_INVALID_POS;
} }
if (isIgnored() || (fieldName != NULL && (m_name != fieldName || fieldIndex > 0))) { if (isIgnored() || (fieldName != NULL && (m_name != fieldName || fieldIndex > 0))) {
@@ -374,25 +366,17 @@ result_t SingleDataField::read(const PartType partType,
return m_dataType->readRawValue(data, offset, m_length, output); return m_dataType->readRawValue(data, offset, m_length, output);
} }
result_t SingleDataField::read(const PartType partType, result_t SingleDataField::read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, ostringstream& output, OutputFormat outputFormat, ssize_t outputIndex,
ostringstream& output, OutputFormat outputFormat, signed char outputIndex, bool leadingSeparator, const char* fieldName, ssize_t fieldIndex) {
bool leadingSeparator, const char* fieldName, signed char fieldIndex) { if (m_partType == pt_any) {
if (partType != m_partType) {
return RESULT_OK;
}
switch (m_partType) {
case pt_masterData:
offset = (unsigned char)(offset + 5); // skip QQ ZZ PB SB NN
break;
case pt_slaveData:
offset++; // skip NN
break;
default:
return RESULT_ERR_INVALID_PART; return RESULT_ERR_INVALID_PART;
} }
if ((data.isMaster() ? pt_masterData : pt_slaveData) != m_partType) {
return RESULT_OK;
}
bool remainder = m_length == REMAIN_LEN && m_dataType->isAdjustableLength(); bool remainder = m_length == REMAIN_LEN && m_dataType->isAdjustableLength();
if (offset + (remainder?1:m_length) > data.size()) { if (offset + (remainder?1:m_length) > data.getDataSize()) {
return RESULT_ERR_INVALID_POS; return RESULT_ERR_INVALID_POS;
} }
if (isIgnored() || (fieldName != NULL && (m_name != fieldName || fieldIndex > 0))) { if (isIgnored() || (fieldName != NULL && (m_name != fieldName || fieldIndex > 0))) {
@@ -418,7 +402,7 @@ result_t SingleDataField::read(const PartType partType,
} }
} }
result_t result = readSymbols(data, m_partType == pt_masterData, offset, output, outputFormat); result_t result = readSymbols(data, offset, output, outputFormat);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -442,35 +426,27 @@ result_t SingleDataField::read(const PartType partType,
return RESULT_OK; return RESULT_OK;
} }
result_t SingleDataField::write(istringstream& input, result_t SingleDataField::write(istringstream& input, SymbolString& data,
const PartType partType, SymbolString& data, size_t offset, char separator, size_t* length) {
unsigned char offset, char separator, unsigned char* length) { if (m_partType == pt_any) {
if (partType != m_partType) {
return RESULT_OK;
}
switch (m_partType) {
case pt_masterData:
offset = (unsigned char)(offset + 5); // skip QQ ZZ PB SB NN
break;
case pt_slaveData:
offset++; // skip NN
break;
default:
return RESULT_ERR_INVALID_PART; return RESULT_ERR_INVALID_PART;
} }
return writeSymbols(input, (const unsigned char)offset, data, m_partType == pt_masterData, length); if ((data.isMaster() ? pt_masterData : pt_slaveData) != m_partType) {
return RESULT_OK;
}
return writeSymbols(input, (const size_t)offset, data, length);
} }
result_t SingleDataField::readSymbols(SymbolString& input, const bool isMaster, result_t SingleDataField::readSymbols(SymbolString& input,
const unsigned char offset, const size_t offset,
ostringstream& output, OutputFormat outputFormat) { ostringstream& output, OutputFormat outputFormat) {
return m_dataType->readSymbols(input, isMaster, offset, m_length, output, outputFormat); return m_dataType->readSymbols(input, offset, m_length, output, outputFormat);
} }
result_t SingleDataField::writeSymbols(istringstream& input, result_t SingleDataField::writeSymbols(istringstream& input,
const unsigned char offset, const size_t offset,
SymbolString& output, const bool isMaster, unsigned char* usedLength) { SymbolString& output, size_t* usedLength) {
return m_dataType->writeSymbols(input, offset, m_length, output, isMaster, usedLength); return m_dataType->writeSymbols(input, offset, m_length, output, usedLength);
} }
SingleDataField* SingleDataField::clone() { SingleDataField* SingleDataField::clone() {
@@ -522,9 +498,9 @@ bool SingleDataField::hasField(const char* fieldName, bool numeric) {
return numeric == numericType && (fieldName == NULL || fieldName == m_name); return numeric == numericType && (fieldName == NULL || fieldName == m_name);
} }
unsigned char SingleDataField::getLength(PartType partType, unsigned char maxLength) { size_t SingleDataField::getLength(PartType partType, size_t maxLength) {
if (partType != m_partType) { if (partType != m_partType) {
return (unsigned char)0; return 0;
} }
bool remainder = m_length == REMAIN_LEN && m_dataType->isAdjustableLength(); bool remainder = m_length == REMAIN_LEN && m_dataType->isAdjustableLength();
return remainder ? maxLength : m_length; return remainder ? maxLength : m_length;
@@ -601,8 +577,8 @@ void ValueListDataField::dump(ostream& output) {
dumpString(output, m_comment); dumpString(output, m_comment);
} }
result_t ValueListDataField::readSymbols(SymbolString& input, const bool isMaster, result_t ValueListDataField::readSymbols(SymbolString& input,
const unsigned char offset, const size_t offset,
ostringstream& output, OutputFormat outputFormat) { ostringstream& output, OutputFormat outputFormat) {
unsigned int value = 0; unsigned int value = 0;
@@ -633,8 +609,8 @@ result_t ValueListDataField::readSymbols(SymbolString& input, const bool isMaste
} }
result_t ValueListDataField::writeSymbols(istringstream& input, result_t ValueListDataField::writeSymbols(istringstream& input,
const unsigned char offset, const size_t offset,
SymbolString& output, const bool isMaster, unsigned char* usedLength) { SymbolString& output, size_t* usedLength) {
NumberDataType* numType = reinterpret_cast<NumberDataType*>(m_dataType); NumberDataType* numType = reinterpret_cast<NumberDataType*>(m_dataType);
if (isIgnored()) { if (isIgnored()) {
// replacement value // replacement value
@@ -711,11 +687,11 @@ void ConstantDataField::dump(ostream& output) {
dumpString(output, m_comment); dumpString(output, m_comment);
} }
result_t ConstantDataField::readSymbols(SymbolString& input, const bool isMaster, result_t ConstantDataField::readSymbols(SymbolString& input,
const unsigned char offset, const size_t offset,
ostringstream& output, OutputFormat outputFormat) { ostringstream& output, OutputFormat outputFormat) {
ostringstream coutput; ostringstream coutput;
result_t result = SingleDataField::readSymbols(input, isMaster, offset, coutput, 0); result_t result = SingleDataField::readSymbols(input, offset, coutput, 0);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -730,10 +706,10 @@ result_t ConstantDataField::readSymbols(SymbolString& input, const bool isMaster
} }
result_t ConstantDataField::writeSymbols(istringstream& input, result_t ConstantDataField::writeSymbols(istringstream& input,
const unsigned char offset, const size_t offset,
SymbolString& output, const bool isMaster, unsigned char* usedLength) { SymbolString& output, size_t* usedLength) {
istringstream cinput(m_value); istringstream cinput(m_value);
return SingleDataField::writeSymbols(cinput, offset, output, isMaster, usedLength); return SingleDataField::writeSymbols(cinput, offset, output, usedLength);
} }
@@ -795,8 +771,8 @@ DataFieldSet* DataFieldSet::clone() {
return new DataFieldSet(m_name, m_comment, fields); return new DataFieldSet(m_name, m_comment, fields);
} }
unsigned char DataFieldSet::getLength(PartType partType, unsigned char maxLength) { size_t DataFieldSet::getLength(PartType partType, size_t maxLength) {
unsigned char length = 0; size_t length = 0;
bool previousFullByteOffset[] = { true, true, true, true }; bool previousFullByteOffset[] = { true, true, true, true };
for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++) { for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++) {
@@ -805,13 +781,13 @@ unsigned char DataFieldSet::getLength(PartType partType, unsigned char maxLength
if (!previousFullByteOffset[partType] && !field->hasFullByteOffset(false)) { if (!previousFullByteOffset[partType] && !field->hasFullByteOffset(false)) {
length--; length--;
} }
unsigned char fieldLength = field->getLength(partType, maxLength); size_t fieldLength = field->getLength(partType, maxLength);
if (fieldLength >= maxLength) { if (fieldLength >= maxLength) {
maxLength = 0; maxLength = 0;
} else { } else {
maxLength = (unsigned char)(maxLength-fieldLength); maxLength = maxLength - fieldLength;
} }
length = (unsigned char)(length + fieldLength); length = length + fieldLength;
previousFullByteOffset[partType] = field->hasFullByteOffset(true); previousFullByteOffset[partType] = field->hasFullByteOffset(true);
} }
@@ -820,11 +796,11 @@ unsigned char DataFieldSet::getLength(PartType partType, unsigned char maxLength
return length; return length;
} }
string DataFieldSet::getName(signed char fieldIndex) { string DataFieldSet::getName(ssize_t fieldIndex) {
if (fieldIndex < 0) { if (fieldIndex < 0) {
return m_name; return m_name;
} }
if ((unsigned char)fieldIndex >= m_fields.size()) { if ((size_t)fieldIndex >= m_fields.size()) {
return ""; return "";
} }
if (m_uniqueNames) { if (m_uniqueNames) {
@@ -876,23 +852,23 @@ void DataFieldSet::dump(ostream& output) {
} }
} }
result_t DataFieldSet::read(const PartType partType, result_t DataFieldSet::read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, unsigned int& output, const char* fieldName, ssize_t fieldIndex) {
unsigned int& output, const char* fieldName, signed char fieldIndex) {
bool previousFullByteOffset = true, found = false, findFieldIndex = fieldName != NULL && fieldIndex >= 0; bool previousFullByteOffset = true, found = false, findFieldIndex = fieldName != NULL && fieldIndex >= 0;
PartType partType = data.isMaster() ? pt_masterData : pt_slaveData;
for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++) { for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++) {
SingleDataField* field = *it; SingleDataField* field = *it;
if (partType != pt_any && field->getPartType() != partType) { if (field->getPartType() != partType) {
continue; continue;
} }
if (!previousFullByteOffset && !field->hasFullByteOffset(false)) { if (!previousFullByteOffset && !field->hasFullByteOffset(false)) {
offset--; offset--;
} }
result_t result = field->read(partType, data, offset, output, fieldName, fieldIndex); result_t result = field->read(data, offset, output, fieldName, fieldIndex);
if (result < RESULT_OK) { if (result < RESULT_OK) {
return result; return result;
} }
offset = (unsigned char)(offset + field->getLength(partType, (unsigned char)(data.size()-offset))); offset += field->getLength(partType, data.getDataSize()-offset);
previousFullByteOffset = field->hasFullByteOffset(true); previousFullByteOffset = field->hasFullByteOffset(true);
if (result != RESULT_EMPTY) { if (result != RESULT_EMPTY) {
found = true; found = true;
@@ -915,17 +891,17 @@ result_t DataFieldSet::read(const PartType partType,
return RESULT_OK; return RESULT_OK;
} }
result_t DataFieldSet::read(const PartType partType, result_t DataFieldSet::read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, ostringstream& output, OutputFormat outputFormat, ssize_t outputIndex,
ostringstream& output, OutputFormat outputFormat, signed char outputIndex, bool leadingSeparator, const char* fieldName, ssize_t fieldIndex) {
bool leadingSeparator, const char* fieldName, signed char fieldIndex) {
bool previousFullByteOffset = true, found = false, findFieldIndex = fieldName != NULL && fieldIndex >= 0; bool previousFullByteOffset = true, found = false, findFieldIndex = fieldName != NULL && fieldIndex >= 0;
if (!m_uniqueNames && outputIndex < 0) { if (!m_uniqueNames && outputIndex < 0) {
outputIndex = 0; outputIndex = 0;
} }
PartType partType = data.isMaster() ? pt_masterData : pt_slaveData;
for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++) { for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++) {
SingleDataField* field = *it; SingleDataField* field = *it;
if (partType != pt_any && field->getPartType() != partType) { if (field->getPartType() != partType) {
if (outputIndex >= 0 && !field->isIgnored()) { if (outputIndex >= 0 && !field->isIgnored()) {
outputIndex++; outputIndex++;
} }
@@ -934,12 +910,12 @@ result_t DataFieldSet::read(const PartType partType,
if (!previousFullByteOffset && !field->hasFullByteOffset(false)) { if (!previousFullByteOffset && !field->hasFullByteOffset(false)) {
offset--; offset--;
} }
result_t result = field->read(partType, data, offset, output, outputFormat, outputIndex, leadingSeparator, result_t result = field->read(data, offset, output, outputFormat, outputIndex, leadingSeparator,
fieldName, fieldIndex); fieldName, fieldIndex);
if (result < RESULT_OK) { if (result < RESULT_OK) {
return result; return result;
} }
offset = (unsigned char)(offset + field->getLength(partType, (unsigned char)(data.size()-offset))); offset += field->getLength(partType, data.getDataSize()-offset);
previousFullByteOffset = field->hasFullByteOffset(true); previousFullByteOffset = field->hasFullByteOffset(true);
if (result != RESULT_EMPTY) { if (result != RESULT_EMPTY) {
found = true; found = true;
@@ -973,23 +949,22 @@ result_t DataFieldSet::read(const PartType partType,
return RESULT_OK; return RESULT_OK;
} }
result_t DataFieldSet::write(istringstream& input, result_t DataFieldSet::write(istringstream& input, SymbolString& data,
const PartType partType, SymbolString& data, size_t offset, char separator, size_t* length) {
unsigned char offset, char separator, unsigned char* length) {
string token; string token;
PartType partType = data.isMaster() ? pt_masterData : pt_slaveData;
bool previousFullByteOffset = true; bool previousFullByteOffset = true;
unsigned char baseOffset = offset; size_t baseOffset = offset;
for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++) { for (vector<SingleDataField*>::iterator it = m_fields.begin(); it < m_fields.end(); it++) {
SingleDataField* field = *it; SingleDataField* field = *it;
if (partType != pt_any && field->getPartType() != partType) { if (field->getPartType() != partType) {
continue; continue;
} }
if (!previousFullByteOffset && !field->hasFullByteOffset(false)) { if (!previousFullByteOffset && !field->hasFullByteOffset(false)) {
offset--; offset--;
} }
result_t result; result_t result;
unsigned char fieldLength; size_t fieldLength;
if (m_fields.size() > 1) { if (m_fields.size() > 1) {
if (field->isIgnored()) { if (field->isIgnored()) {
token.clear(); token.clear();
@@ -997,19 +972,19 @@ result_t DataFieldSet::write(istringstream& input,
token.clear(); token.clear();
} }
istringstream single(token); istringstream single(token);
result = (*it)->write(single, partType, data, offset, separator, &fieldLength); result = (*it)->write(single, data, offset, separator, &fieldLength);
} else { } else {
result = (*it)->write(input, partType, data, offset, separator, &fieldLength); result = (*it)->write(input, data, offset, separator, &fieldLength);
} }
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
offset = (unsigned char)(offset+fieldLength); offset += fieldLength;
previousFullByteOffset = field->hasFullByteOffset(true); previousFullByteOffset = field->hasFullByteOffset(true);
} }
if (length != NULL) { if (length != NULL) {
*length = (unsigned char)(offset-baseOffset); *length = offset-baseOffset;
} }
return RESULT_OK; return RESULT_OK;
} }
+59 -77
View File
@@ -92,7 +92,7 @@ class DataField {
DataFieldTemplates* templates, DataField*& returnField, DataFieldTemplates* templates, DataField*& returnField,
const bool isWriteMessage, const bool isWriteMessage,
const bool isTemplate, const bool isBroadcastOrMasterDestination, const bool isTemplate, const bool isBroadcastOrMasterDestination,
const unsigned char maxFieldLength = MAX_POS); const size_t maxFieldLength = MAX_POS);
/** /**
* Dump the @a string optionally embedded in @a TEXT_SEPARATOR to the output. * Dump the @a string optionally embedded in @a TEXT_SEPARATOR to the output.
@@ -115,7 +115,7 @@ class DataField {
* @param maxLength the maximum length for calculating remainder of input. * @param maxLength the maximum length for calculating remainder of input.
* @return the length of this field (or contained fields) in bytes. * @return the length of this field (or contained fields) in bytes.
*/ */
virtual unsigned char getLength(PartType partType, unsigned char maxLength = MAX_LEN) = 0; virtual size_t getLength(PartType partType, size_t maxLength = MAX_LEN) = 0;
/** /**
* Derive a new @a DataField from this field. * Derive a new @a DataField from this field.
@@ -138,7 +138,7 @@ class DataField {
* @param fieldIndex the index of the field, or -1 for this. * @param fieldIndex the index of the field, or -1 for this.
* @return the field name, or the index as string if not unique or not available. * @return the field name, or the index as string if not unique or not available.
*/ */
virtual string getName(signed char fieldIndex = -1) { return m_name; } virtual string getName(ssize_t fieldIndex = -1) { return m_name; }
/** /**
* Get the field comment. * Get the field comment.
@@ -162,7 +162,6 @@ class DataField {
/** /**
* Reads the numeric value from the @a SymbolString. * Reads the numeric value from the @a SymbolString.
* @param partType the @a PartType of the data.
* @param data the data @a SymbolString for reading binary data. * @param data the data @a SymbolString for reading binary data.
* @param offset the additional offset to add for reading binary data. * @param offset the additional offset to add for reading binary data.
* @param output the variable in which to store the numeric value. * @param output the variable in which to store the numeric value.
@@ -173,13 +172,11 @@ class DataField {
* not match or ignored, or due to @a fieldName or @a fieldIndex), * not match or ignored, or due to @a fieldName or @a fieldIndex),
* or an error code. * or an error code.
*/ */
virtual result_t read(const PartType partType, virtual result_t read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, unsigned int& output, const char* fieldName = NULL, ssize_t fieldIndex = -1) = 0;
unsigned int& output, const char* fieldName = NULL, signed char fieldIndex = -1) = 0;
/** /**
* Reads the value from the @a SymbolString. * Reads the value from the @a SymbolString.
* @param partType the @a PartType of the data.
* @param data the data @a SymbolString for reading binary data. * @param data the data @a SymbolString for reading binary data.
* @param offset the additional offset to add for reading binary data. * @param offset the additional offset to add for reading binary data.
* @param output the @a ostringstream to append the formatted value to. * @param output the @a ostringstream to append the formatted value to.
@@ -192,24 +189,21 @@ class DataField {
* or @a RESULT_EMPTY if the field was skipped (either ignored or due to @a fieldName or @a fieldIndex), * or @a RESULT_EMPTY if the field was skipped (either ignored or due to @a fieldName or @a fieldIndex),
* or an error code. * or an error code.
*/ */
virtual result_t read(const PartType partType, virtual result_t read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, ostringstream& output, OutputFormat outputFormat, ssize_t outputIndex = -1,
ostringstream& output, OutputFormat outputFormat, signed char outputIndex = -1, bool leadingSeparator = false, const char* fieldName = NULL, ssize_t fieldIndex = -1) = 0;
bool leadingSeparator = false, const char* fieldName = NULL, signed char fieldIndex = -1) = 0;
/** /**
* Writes the value to the master or slave @a SymbolString. * Writes the value to the master or slave @a SymbolString.
* @param input the @a istringstream to parse the formatted value from. * @param input the @a istringstream to parse the formatted value from.
* @param partType the @a PartType of the data.
* @param data the unescaped data @a SymbolString for writing binary data. * @param data the unescaped data @a SymbolString for writing binary data.
* @param offset the additional offset to add for writing binary data. * @param offset the additional offset to add for writing binary data.
* @param separator the separator character between multiple fields. * @param separator the separator character between multiple fields.
* @param length the variable in which to store the used length in bytes, or NULL. * @param length the variable in which to store the used length in bytes, or NULL.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t write(istringstream& input, virtual result_t write(istringstream& input, SymbolString& data,
const PartType partType, SymbolString& data, size_t offset, char separator = UI_FIELD_SEPARATOR, size_t* length = NULL) = 0;
unsigned char offset, char separator = UI_FIELD_SEPARATOR, unsigned char* length = NULL) = 0;
protected: protected:
@@ -237,7 +231,7 @@ class SingleDataField : public DataField {
*/ */
SingleDataField(const string name, const string comment, SingleDataField(const string name, const string comment,
const string unit, DataType* dataType, const PartType partType, const string unit, DataType* dataType, const PartType partType,
const unsigned char length) const size_t length)
: DataField(name, comment), : DataField(name, comment),
m_unit(unit), m_dataType(dataType), m_partType(partType), m_unit(unit), m_dataType(dataType), m_partType(partType),
m_length(length) {} m_length(length) {}
@@ -248,7 +242,7 @@ class SingleDataField : public DataField {
virtual ~SingleDataField() {} virtual ~SingleDataField() {}
// @copydoc // @copydoc
virtual SingleDataField* clone(); virtual SingleDataField* clone() override;
/** /**
* Factory method for creating a new @a SingleDataField instance derived from a base type. * Factory method for creating a new @a SingleDataField instance derived from a base type.
@@ -266,7 +260,7 @@ class SingleDataField : public DataField {
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
* Note: the caller needs to free the created instance. * Note: the caller needs to free the created instance.
*/ */
static result_t create(const string id, const unsigned char length, static result_t create(const string id, const size_t length,
const string name, const string comment, const string unit, const string name, const string comment, const string unit,
const PartType partType, int divisor, map<unsigned int, string> values, const PartType partType, int divisor, map<unsigned int, string> values,
const string constantValue, const bool verifyValue, SingleDataField* &returnField); const string constantValue, const bool verifyValue, SingleDataField* &returnField);
@@ -290,13 +284,13 @@ class SingleDataField : public DataField {
PartType getPartType() const { return m_partType; } PartType getPartType() const { return m_partType; }
// @copydoc // @copydoc
virtual unsigned char getLength(PartType partType, unsigned char maxLength = MAX_LEN); virtual size_t getLength(PartType partType, size_t maxLength = MAX_LEN) override;
// @copydoc // @copydoc
virtual result_t derive(string name, string comment, virtual result_t derive(string name, string comment,
string unit, const PartType partType, string unit, const PartType partType,
int divisor, map<unsigned int, string> values, int divisor, map<unsigned int, string> values,
vector<SingleDataField*>& fields); vector<SingleDataField*>& fields) override;
/** /**
* Get whether this field uses a full byte offset. * Get whether this field uses a full byte offset.
@@ -307,40 +301,36 @@ class SingleDataField : public DataField {
bool hasFullByteOffset(bool after); bool hasFullByteOffset(bool after);
// @copydoc // @copydoc
virtual void dump(ostream& output); virtual void dump(ostream& output) override;
// @copydoc // @copydoc
virtual bool hasField(const char* fieldName, bool numeric); virtual bool hasField(const char* fieldName, bool numeric) override;
// @copydoc // @copydoc
virtual result_t read(const PartType partType, virtual result_t read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, unsigned int& output, const char* fieldName = NULL, ssize_t fieldIndex = -1) override;
unsigned int& output, const char* fieldName = NULL, signed char fieldIndex = -1);
// @copydoc // @copydoc
virtual result_t read(const PartType partType, virtual result_t read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, ostringstream& output, OutputFormat outputFormat, ssize_t outputIndex = -1,
ostringstream& output, OutputFormat outputFormat, signed char outputIndex = -1, bool leadingSeparator = false, const char* fieldName = NULL, ssize_t fieldIndex = -1) override;
bool leadingSeparator = false, const char* fieldName = NULL, signed char fieldIndex = -1);
// @copydoc // @copydoc
virtual result_t write(istringstream& input, virtual result_t write(istringstream& input, SymbolString& data,
const PartType partType, SymbolString& data, size_t offset, char separator = UI_FIELD_SEPARATOR, size_t* length = NULL) override;
unsigned char offset, char separator = UI_FIELD_SEPARATOR, unsigned char* length = NULL);
protected: protected:
/** /**
* Internal method for reading the field from a @a SymbolString. * Internal method for reading the field from a @a SymbolString.
* @param input the @a SymbolString to read the binary value from. * @param input the @a SymbolString to read the binary value from.
* @param isMaster whether the @a SymbolString is the master part.
* @param offset the offset in the @a SymbolString. * @param offset the offset in the @a SymbolString.
* @param output the ostringstream to append the formatted value to. * @param output the ostringstream to append the formatted value to.
* @param outputFormat the @a OutputFormat options to use. * @param outputFormat the @a OutputFormat options to use.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t readSymbols(SymbolString& input, const bool isMaster, virtual result_t readSymbols(SymbolString& input,
const unsigned char offset, const size_t offset,
ostringstream& output, OutputFormat outputFormat); ostringstream& output, OutputFormat outputFormat);
/** /**
@@ -348,13 +338,12 @@ class SingleDataField : public DataField {
* @param input the @a istringstream to parse the formatted value from. * @param input the @a istringstream to parse the formatted value from.
* @param offset the offset in the @a SymbolString. * @param offset the offset in the @a SymbolString.
* @param output the @a SymbolString to write the binary value to. * @param output the @a SymbolString to write the binary value to.
* @param isMaster whether the @a SymbolString is the master part.
* @param usedLength the variable in which to store the used length in bytes, or NULL. * @param usedLength the variable in which to store the used length in bytes, or NULL.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t writeSymbols(istringstream& input, virtual result_t writeSymbols(istringstream& input,
const unsigned char offset, const size_t offset,
SymbolString& output, const bool isMaster, unsigned char* usedLength); SymbolString& output, size_t* usedLength);
/** the value unit. */ /** the value unit. */
const string m_unit; const string m_unit;
@@ -366,7 +355,7 @@ class SingleDataField : public DataField {
const PartType m_partType; const PartType m_partType;
/** the number of symbols in the message part in which the field is stored. */ /** the number of symbols in the message part in which the field is stored. */
const unsigned char m_length; const size_t m_length;
}; };
@@ -387,7 +376,7 @@ class ValueListDataField : public SingleDataField {
*/ */
ValueListDataField(const string name, const string comment, ValueListDataField(const string name, const string comment,
const string unit, NumberDataType* dataType, const PartType partType, const string unit, NumberDataType* dataType, const PartType partType,
const unsigned char length, const map<unsigned int, string> values) const size_t length, const map<unsigned int, string> values)
: SingleDataField(name, comment, unit, dataType, partType, length), : SingleDataField(name, comment, unit, dataType, partType, length),
m_values(values) {} m_values(values) {}
@@ -397,28 +386,26 @@ class ValueListDataField : public SingleDataField {
virtual ~ValueListDataField() {} virtual ~ValueListDataField() {}
// @copydoc // @copydoc
virtual ValueListDataField* clone(); virtual ValueListDataField* clone() override;
// @copydoc // @copydoc
virtual result_t derive(string name, string comment, virtual result_t derive(string name, string comment,
string unit, const PartType partType, int divisor, string unit, const PartType partType, int divisor,
map<unsigned int, string> values, map<unsigned int, string> values,
vector<SingleDataField*>& fields); vector<SingleDataField*>& fields) override;
// @copydoc // @copydoc
virtual void dump(ostream& output); virtual void dump(ostream& output) override;
protected: protected:
// @copydoc // @copydoc
virtual result_t readSymbols(SymbolString& input, const bool isMaster, virtual result_t readSymbols(SymbolString& input, const size_t offset,
const unsigned char offset, ostringstream& output, OutputFormat outputFormat) override;
ostringstream& output, OutputFormat outputFormat);
// @copydoc // @copydoc
virtual result_t writeSymbols(istringstream& input, virtual result_t writeSymbols(istringstream& input, const size_t offset,
const unsigned char offset, SymbolString& output, size_t* usedLength) override;
SymbolString& output, const bool isMaster, unsigned char* usedLength);
private: private:
@@ -445,7 +432,7 @@ class ConstantDataField : public SingleDataField {
*/ */
ConstantDataField(const string name, const string comment, ConstantDataField(const string name, const string comment,
const string unit, DataType* dataType, const PartType partType, const string unit, DataType* dataType, const PartType partType,
const unsigned char length, const string value, const bool verify) const size_t length, const string value, const bool verify)
: SingleDataField(name, comment, unit, dataType, partType, length), : SingleDataField(name, comment, unit, dataType, partType, length),
m_value(value), m_verify(verify) {} m_value(value), m_verify(verify) {}
@@ -455,28 +442,26 @@ class ConstantDataField : public SingleDataField {
virtual ~ConstantDataField() {} virtual ~ConstantDataField() {}
// @copydoc // @copydoc
virtual ConstantDataField* clone(); virtual ConstantDataField* clone() override;
// @copydoc // @copydoc
virtual result_t derive(string name, string comment, virtual result_t derive(string name, string comment,
string unit, const PartType partType, int divisor, string unit, const PartType partType, int divisor,
map<unsigned int, string> values, map<unsigned int, string> values,
vector<SingleDataField*>& fields); vector<SingleDataField*>& fields) override;
// @copydoc // @copydoc
virtual void dump(ostream& output); virtual void dump(ostream& output) override;
protected: protected:
// @copydoc // @copydoc
virtual result_t readSymbols(SymbolString& input, const bool isMaster, virtual result_t readSymbols(SymbolString& input, const size_t offset,
const unsigned char offset, ostringstream& output, OutputFormat outputFormat) override;
ostringstream& output, OutputFormat outputFormat);
// @copydoc // @copydoc
virtual result_t writeSymbols(istringstream& input, virtual result_t writeSymbols(istringstream& input, const size_t offset,
const unsigned char offset, SymbolString& output, size_t* usedLength) override;
SymbolString& output, const bool isMaster, unsigned char* usedLength);
private: private:
@@ -538,19 +523,19 @@ class DataFieldSet : public DataField {
virtual ~DataFieldSet(); virtual ~DataFieldSet();
// @copydoc // @copydoc
virtual DataFieldSet* clone(); virtual DataFieldSet* clone() override;
// @copydoc // @copydoc
virtual unsigned char getLength(PartType partType, unsigned char maxLength = MAX_LEN); virtual size_t getLength(PartType partType, size_t maxLength = MAX_LEN) override;
// @copydoc // @copydoc
virtual string getName(signed char fieldIndex = -1); virtual string getName(ssize_t fieldIndex = -1) override;
// @copydoc // @copydoc
virtual result_t derive(string name, string comment, virtual result_t derive(string name, string comment,
string unit, const PartType partType, string unit, const PartType partType,
int divisor, map<unsigned int, string> values, int divisor, map<unsigned int, string> values,
vector<SingleDataField*>& fields); vector<SingleDataField*>& fields) override;
/** /**
* Returns the @a SingleDataField at the specified index. * Returns the @a SingleDataField at the specified index.
@@ -583,26 +568,23 @@ class DataFieldSet : public DataField {
size_t size() const { return m_fields.size(); } size_t size() const { return m_fields.size(); }
// @copydoc // @copydoc
virtual bool hasField(const char* fieldName, bool numeric); virtual bool hasField(const char* fieldName, bool numeric) override;
// @copydoc // @copydoc
virtual void dump(ostream& output); virtual void dump(ostream& output) override;
// @copydoc // @copydoc
virtual result_t read(const PartType partType, virtual result_t read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, unsigned int& output, const char* fieldName = NULL, ssize_t fieldIndex = -1) override;
unsigned int& output, const char* fieldName = NULL, signed char fieldIndex = -1);
// @copydoc // @copydoc
virtual result_t read(const PartType partType, virtual result_t read(SymbolString& data, size_t offset,
SymbolString& data, unsigned char offset, ostringstream& output, OutputFormat outputFormat, ssize_t outputIndex = -1,
ostringstream& output, OutputFormat outputFormat, signed char outputIndex = -1, bool leadingSeparator = false, const char* fieldName = NULL, ssize_t fieldIndex = -1) override;
bool leadingSeparator = false, const char* fieldName = NULL, signed char fieldIndex = -1);
// @copydoc // @copydoc
virtual result_t write(istringstream& input, virtual result_t write(istringstream& input, SymbolString& data,
const PartType partType, SymbolString& data, size_t offset, char separator = UI_FIELD_SEPARATOR, size_t* length = NULL) override;
unsigned char offset, char separator = UI_FIELD_SEPARATOR, unsigned char* length = NULL);
private: private:
@@ -658,7 +640,7 @@ class DataFieldTemplates : public FileReader {
// @copydoc // @copydoc
virtual result_t addFromFile(vector<string>::iterator& begin, const vector<string>::iterator end, virtual result_t addFromFile(vector<string>::iterator& begin, const vector<string>::iterator end,
vector< vector<string> >* defaults, const string& defaultDest, const string& defaultCircuit, vector< vector<string> >* defaults, const string& defaultDest, const string& defaultCircuit,
const string& defaultSuffix, const string& filename, unsigned int lineNo); const string& defaultSuffix, const string& filename, unsigned int lineNo) override;
/** /**
* Gets the template @a DataField instance with the specified name. * Gets the template @a DataField instance with the specified name.
+118 -118
View File
@@ -91,7 +91,7 @@ void printErrorPos(ostream& out, vector<string>::iterator begin, const vector<st
} }
bool DataType::dump(ostream& output, const unsigned char length, const bool appendSeparatorDivisor) const { bool DataType::dump(ostream& output, const size_t length, const bool appendSeparatorDivisor) const {
output << m_id; output << m_id;
if (isAdjustableLength()) { if (isAdjustableLength()) {
if (length == REMAIN_LEN) { if (length == REMAIN_LEN) {
@@ -107,21 +107,21 @@ bool DataType::dump(ostream& output, const unsigned char length, const bool appe
} }
result_t StringDataType::readRawValue(SymbolString& input, const unsigned char offset, result_t StringDataType::readRawValue(SymbolString& input, const size_t offset,
const unsigned char length, unsigned int& value) { const size_t length, unsigned int& value) {
return RESULT_EMPTY; return RESULT_EMPTY;
} }
result_t StringDataType::readSymbols(SymbolString& input, const bool isMaster, result_t StringDataType::readSymbols(SymbolString& input,
const unsigned char baseOffset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat) { ostringstream& output, OutputFormat outputFormat) {
size_t start = 0, count = length; size_t start = 0, count = length;
int incr = 1; int incr = 1;
unsigned char ch; symbol_t symbol;
bool terminated = false; bool terminated = false;
if (count == REMAIN_LEN && input.size() > baseOffset) { if (count == REMAIN_LEN && input.getDataSize() > offset) {
count = input.size()-baseOffset; count = input.getDataSize() - offset;
} else if (baseOffset + count > input.size()) { } else if (offset + count > input.getDataSize()) {
return RESULT_ERR_INVALID_POS; return RESULT_ERR_INVALID_POS;
} }
if (hasFlag(REV)) { // reverted binary representation (most significant byte first) if (hasFlag(REV)) { // reverted binary representation (most significant byte first)
@@ -133,27 +133,27 @@ result_t StringDataType::readSymbols(SymbolString& input, const bool isMaster,
output << '"'; output << '"';
} }
output << setfill('0') << (m_isHex ? hex : dec); output << setfill('0') << (m_isHex ? hex : dec);
for (size_t offset = start, i = 0; i < count; offset += incr, i++) { for (size_t index = start, i = 0; i < count; index += incr, i++) {
ch = input[baseOffset + offset]; symbol = input.dataAt(offset + index);
if (m_isHex) { if (m_isHex) {
if (i > 0) { if (i > 0) {
output << ' '; output << ' ';
} }
output << setw(2) << static_cast<unsigned>(ch); output << setw(2) << static_cast<unsigned>(symbol);
} else { } else {
if (ch == 0x00) { if (symbol == 0x00) {
terminated = true; terminated = true;
} else if (!terminated) { } else if (!terminated) {
if (ch < 0x20) { if (symbol < 0x20) {
ch = (unsigned char)m_replacement; symbol = (symbol_t)m_replacement;
} else if (!isprint(ch)) { } else if (!isprint(symbol)) {
ch = '?'; symbol = '?';
} else if (outputFormat & OF_JSON) { } else if (outputFormat & OF_JSON) {
if (ch == '"' || ch == '\\') { if (symbol == '"' || symbol == '\\') {
output << '\\'; // escape output << '\\'; // escape
} }
} }
output << static_cast<char>(ch); output << static_cast<char>(symbol);
} }
} }
} }
@@ -164,8 +164,8 @@ result_t StringDataType::readSymbols(SymbolString& input, const bool isMaster,
} }
result_t StringDataType::writeSymbols(istringstream& input, result_t StringDataType::writeSymbols(istringstream& input,
unsigned char baseOffset, const unsigned char length, size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength) { SymbolString& output, size_t* usedLength) {
size_t start = 0, count = length; size_t start = 0, count = length;
bool remainder = count == REMAIN_LEN && hasFlag(ADJ); bool remainder = count == REMAIN_LEN && hasFlag(ADJ);
int incr = 1; int incr = 1;
@@ -180,17 +180,17 @@ result_t StringDataType::writeSymbols(istringstream& input,
if (remainder) { if (remainder) {
count = 1; count = 1;
} }
for (size_t offset = start, i = 0; i < count; offset += incr, i++) { for (size_t index = start, i = 0; i < count; index += incr, i++) {
output[baseOffset + offset] = (unsigned char)m_replacement; // fill up with replacement output.dataAt(offset + index) = (symbol_t)m_replacement; // fill up with replacement
} }
if (usedLength != NULL) { if (usedLength != NULL) {
*usedLength = (unsigned char)count; *usedLength = count;
} }
return RESULT_OK; return RESULT_OK;
} }
result_t result; result_t result;
size_t i = 0, offset; size_t i = 0, index;
for (offset = start; i < count; offset += incr, i++) { for (index = start; i < count; index += incr, i++) {
if (m_isHex) { if (m_isHex) {
while (!input.eof() && input.peek() == ' ') { while (!input.eof() && input.peek() == ' ') {
input.get(); input.get();
@@ -199,11 +199,11 @@ result_t StringDataType::writeSymbols(istringstream& input,
value = m_replacement; // fill up with replacement value = m_replacement; // fill up with replacement
} else { } else {
token.clear(); token.clear();
token.push_back((unsigned char)input.get()); token.push_back((symbol_t)input.get());
if (input.eof()) { if (input.eof()) {
return RESULT_ERR_INVALID_NUM; // too short hex value return RESULT_ERR_INVALID_NUM; // too short hex value
} }
token.push_back((unsigned char)input.get()); token.push_back((symbol_t)input.get());
if (input.eof()) { if (input.eof()) {
return RESULT_ERR_INVALID_NUM; // too short hex value return RESULT_ERR_INVALID_NUM; // too short hex value
} }
@@ -224,41 +224,41 @@ result_t StringDataType::writeSymbols(istringstream& input,
} }
if (remainder && input.eof() && i > 0) { if (remainder && input.eof() && i > 0) {
if (value == 0x00 && !m_isHex) { if (value == 0x00 && !m_isHex) {
output[baseOffset + offset] = 0; output.dataAt(offset + index) = 0;
offset += incr; index += incr;
} }
break; break;
} }
if (value > 0xff) { if (value > 0xff) {
return RESULT_ERR_OUT_OF_RANGE; // value out of range return RESULT_ERR_OUT_OF_RANGE; // value out of range
} }
output[baseOffset + offset] = (unsigned char)value; output.dataAt(offset + index) = (symbol_t)value;
} }
if (!remainder && i < count) { if (!remainder && i < count) {
return RESULT_ERR_EOF; // input too short return RESULT_ERR_EOF; // input too short
} }
if (usedLength != NULL) { if (usedLength != NULL) {
*usedLength = (unsigned char)((offset-start)*incr); *usedLength = (index-start)*incr;
} }
return RESULT_OK; return RESULT_OK;
} }
result_t DateTimeDataType::readRawValue(SymbolString& input, const unsigned char offset, result_t DateTimeDataType::readRawValue(SymbolString& input, const size_t offset,
const unsigned char length, unsigned int& value) { const size_t length, unsigned int& value) {
return RESULT_EMPTY; return RESULT_EMPTY;
} }
result_t DateTimeDataType::readSymbols(SymbolString& input, const bool isMaster, result_t DateTimeDataType::readSymbols(SymbolString& input,
const unsigned char baseOffset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat) { ostringstream& output, OutputFormat outputFormat) {
size_t start = 0, count = length; size_t start = 0, count = length;
int incr = 1; int incr = 1;
unsigned char ch, last = 0, hour = 0; symbol_t symbol, last = 0, hour = 0;
if (count == REMAIN_LEN && input.size() > baseOffset) { if (count == REMAIN_LEN && input.getDataSize() > offset) {
count = input.size()-baseOffset; count = input.getDataSize() - offset;
} else if (baseOffset + count > input.size()) { } else if (offset + count > input.getDataSize()) {
return RESULT_ERR_INVALID_POS; return RESULT_ERR_INVALID_POS;
} }
if (hasFlag(REV)) { // reverted binary representation (most significant byte first) if (hasFlag(REV)) { // reverted binary representation (most significant byte first)
@@ -270,20 +270,20 @@ result_t DateTimeDataType::readSymbols(SymbolString& input, const bool isMaster,
output << '"'; output << '"';
} }
int type = (m_hasDate?2:0) | (m_hasTime?1:0); int type = (m_hasDate?2:0) | (m_hasTime?1:0);
for (size_t offset = start, i = 0; i < count; offset += incr, i++) { for (size_t index = start, i = 0; i < count; index += incr, i++) {
if (length == 4 && i == 2 && m_hasDate) { if (length == 4 && i == 2 && m_hasDate) {
continue; // skip weekday in between continue; // skip weekday in between
} }
ch = input[baseOffset + offset]; symbol = input.dataAt(offset + index);
if (hasFlag(BCD) && (hasFlag(REQ) || ch != m_replacement)) { if (hasFlag(BCD) && (hasFlag(REQ) || symbol != m_replacement)) {
if ((ch & 0xf0) > 0x90 || (ch & 0x0f) > 0x09) { if ((symbol & 0xf0) > 0x90 || (symbol & 0x0f) > 0x09) {
return RESULT_ERR_OUT_OF_RANGE; // invalid BCD return RESULT_ERR_OUT_OF_RANGE; // invalid BCD
} }
ch = (unsigned char)((ch >> 4) * 10 + (ch & 0x0f)); symbol = (symbol_t)((symbol >> 4) * 10 + (symbol & 0x0f));
} }
switch (type) { switch (type) {
case 2: // date only case 2: // date only
if (!hasFlag(REQ) && ch == m_replacement) { if (!hasFlag(REQ) && symbol == m_replacement) {
if (i + 1 != length) { if (i + 1 != length) {
output << NULL_VALUE << "."; output << NULL_VALUE << ".";
break; break;
@@ -299,7 +299,7 @@ result_t DateTimeDataType::readSymbols(SymbolString& input, const bool isMaster,
if (i == 0) { if (i == 0) {
break; break;
} }
int mjd = last + ch*256 + 15020; // 01.01.1900 int mjd = last + symbol*256 + 15020; // 01.01.1900
int y = static_cast<int>((mjd-15078.2)/365.25); int y = static_cast<int>((mjd-15078.2)/365.25);
int m = static_cast<int>((mjd-14956.1-static_cast<int>(y*365.25))/30.6001); int m = static_cast<int>((mjd-14956.1-static_cast<int>(y*365.25))/30.6001);
int d = mjd-14956-static_cast<int>(y*365.25)-static_cast<int>(m*30.6001); int d = mjd-14956-static_cast<int>(y*365.25)-static_cast<int>(m*30.6001);
@@ -313,16 +313,16 @@ result_t DateTimeDataType::readSymbols(SymbolString& input, const bool isMaster,
break; break;
} }
if (i + 1 == length) { if (i + 1 == length) {
output << (2000 + ch); output << (2000 + symbol);
} else if (ch < 1 || (i == 0 && ch > 31) || (i == 1 && ch > 12)) { } else if (symbol < 1 || (i == 0 && symbol > 31) || (i == 1 && symbol > 12)) {
return RESULT_ERR_OUT_OF_RANGE; // invalid date return RESULT_ERR_OUT_OF_RANGE; // invalid date
} else { } else {
output << setw(2) << dec << setfill('0') << static_cast<unsigned>(ch) << "."; output << setw(2) << dec << setfill('0') << static_cast<unsigned>(symbol) << ".";
} }
break; break;
case 1: // time only case 1: // time only
if (!hasFlag(REQ) && ch == m_replacement) { if (!hasFlag(REQ) && symbol == m_replacement) {
if (length == 1) { // truncated time if (length == 1) { // truncated time
output << NULL_VALUE << ":" << NULL_VALUE; output << NULL_VALUE << ":" << NULL_VALUE;
break; break;
@@ -335,10 +335,10 @@ result_t DateTimeDataType::readSymbols(SymbolString& input, const bool isMaster,
} }
if (hasFlag(SPE)) { // minutes since midnight if (hasFlag(SPE)) { // minutes since midnight
if (i == 0) { if (i == 0) {
last = ch; last = symbol;
continue; continue;
} }
int minutes = ch*256 + last; int minutes = symbol*256 + last;
if (minutes > 24*60) { if (minutes > 24*60) {
return RESULT_ERR_OUT_OF_RANGE; // invalid value return RESULT_ERR_OUT_OF_RANGE; // invalid value
} }
@@ -347,31 +347,31 @@ result_t DateTimeDataType::readSymbols(SymbolString& input, const bool isMaster,
return RESULT_ERR_OUT_OF_RANGE; // invalid hour return RESULT_ERR_OUT_OF_RANGE; // invalid hour
} }
output << setw(2) << dec << setfill('0') << static_cast<unsigned>(hour); output << setw(2) << dec << setfill('0') << static_cast<unsigned>(hour);
ch = (unsigned char)(minutes % 60); symbol = (symbol_t)(minutes % 60);
} else if (length == 1) { // truncated time } else if (length == 1) { // truncated time
if (i == 0) { if (i == 0) {
ch = (unsigned char)(ch/(60/m_resolution)); // convert to hours symbol = (symbol_t)(symbol/(60/m_resolution)); // convert to hours
offset -= incr; // repeat for minutes index -= incr; // repeat for minutes
count++; count++;
} else { } else {
ch = (unsigned char)((ch % (60/m_resolution)) * m_resolution); // convert to minutes symbol = (symbol_t)((symbol % (60/m_resolution)) * m_resolution); // convert to minutes
} }
} }
if (i == 0) { if (i == 0) {
if (ch > 24) { if (symbol > 24) {
return RESULT_ERR_OUT_OF_RANGE; // invalid hour return RESULT_ERR_OUT_OF_RANGE; // invalid hour
} }
hour = ch; hour = symbol;
} else if (ch > 59 || (hour == 24 && ch > 0)) { } else if (symbol > 59 || (hour == 24 && symbol > 0)) {
return RESULT_ERR_OUT_OF_RANGE; // invalid time return RESULT_ERR_OUT_OF_RANGE; // invalid time
} }
if (i > 0) { if (i > 0) {
output << ":"; output << ":";
} }
output << setw(2) << dec << setfill('0') << static_cast<unsigned>(ch); output << setw(2) << dec << setfill('0') << static_cast<unsigned>(symbol);
break; break;
} }
last = ch; last = symbol;
} }
if (outputFormat & OF_JSON) { if (outputFormat & OF_JSON) {
output << '"'; output << '"';
@@ -380,8 +380,8 @@ result_t DateTimeDataType::readSymbols(SymbolString& input, const bool isMaster,
} }
result_t DateTimeDataType::writeSymbols(istringstream& input, result_t DateTimeDataType::writeSymbols(istringstream& input,
unsigned char baseOffset, const unsigned char length, size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength) { SymbolString& output, size_t* usedLength) {
size_t start = 0, count = length; size_t start = 0, count = length;
bool remainder = count == REMAIN_LEN && hasFlag(ADJ); bool remainder = count == REMAIN_LEN && hasFlag(ADJ);
int incr = 1; int incr = 1;
@@ -396,19 +396,19 @@ result_t DateTimeDataType::writeSymbols(istringstream& input,
if (remainder) { if (remainder) {
count = 1; count = 1;
} }
for (size_t offset = start, i = 0; i < count; offset += incr, i++) { for (size_t index = start, i = 0; i < count; index += incr, i++) {
output[baseOffset + offset] = (unsigned char)m_replacement; // fill up with replacement output.dataAt(offset + index) = (symbol_t)m_replacement; // fill up with replacement
} }
if (usedLength != NULL) { if (usedLength != NULL) {
*usedLength = (unsigned char)count; *usedLength = count;
} }
return RESULT_OK; return RESULT_OK;
} }
result_t result; result_t result;
size_t i = 0, offset; size_t i = 0, index;
int type = (m_hasDate?2:0) | (m_hasTime?1:0); int type = (m_hasDate?2:0) | (m_hasTime?1:0);
bool skip = false; bool skip = false;
for (offset = start; i < count; offset += skip ? 0 : incr, i++) { for (index = start; i < count; index += skip ? 0 : incr, i++) {
skip = false; skip = false;
switch (type) { switch (type) {
case 2: // date only case 2: // date only
@@ -435,9 +435,9 @@ result_t DateTimeDataType::writeSymbols(istringstream& input,
int l = last <= 2 ? 1 : 0; int l = last <= 2 ? 1 : 0;
int mjd = 14956 + lastLast + static_cast<int>((y-l)*365.25) + static_cast<int>((last+1+l*12)*30.6001); int mjd = 14956 + lastLast + static_cast<int>((y-l)*365.25) + static_cast<int>((last+1+l*12)*30.6001);
value = mjd - 15020; // 01.01.1900 value = mjd - 15020; // 01.01.1900
output[baseOffset + offset] = (unsigned char)(value&0xff); output.dataAt(offset + index) = (symbol_t)(value&0xff);
value >>= 8; value >>= 8;
offset += incr; index += incr;
skip = false; skip = false;
break; break;
} }
@@ -450,10 +450,10 @@ result_t DateTimeDataType::writeSymbols(istringstream& input,
int mjd = 14956 + lastLast + static_cast<int>((y-l)*365.25) + static_cast<int>((last+1+l*12)*30.6001); int mjd = 14956 + lastLast + static_cast<int>((y-l)*365.25) + static_cast<int>((last+1+l*12)*30.6001);
int daysSinceSunday = (mjd+3) % 7; // Sun=0 int daysSinceSunday = (mjd+3) % 7; // Sun=0
if (hasFlag(BCD)) { if (hasFlag(BCD)) {
output[baseOffset + offset - incr] = (unsigned char)((6+daysSinceSunday) % 7); // Sun=0x06 output.dataAt(offset + index - incr) = (symbol_t)((6+daysSinceSunday) % 7); // Sun=0x06
} else { } else {
// Sun=0x07 // Sun=0x07
output[baseOffset + offset - incr] = (unsigned char)(daysSinceSunday == 0 ? 7 : daysSinceSunday); output.dataAt(offset + index - incr) = (symbol_t)(daysSinceSunday == 0 ? 7 : daysSinceSunday);
} }
} }
if (value >= 2000) { if (value >= 2000) {
@@ -498,9 +498,9 @@ result_t DateTimeDataType::writeSymbols(istringstream& input,
break; break;
} }
value += last*60; value += last*60;
output[baseOffset + offset] = (unsigned char)(value&0xff); output.dataAt(offset + index) = (symbol_t)(value&0xff);
value >>= 8; value >>= 8;
offset += incr; index += incr;
} else if (length == 1) { // truncated time } else if (length == 1) { // truncated time
if (i == 0) { if (i == 0) {
skip = true; // repeat for minutes skip = true; // repeat for minutes
@@ -526,7 +526,7 @@ result_t DateTimeDataType::writeSymbols(istringstream& input,
if (value > 0xff) { if (value > 0xff) {
return RESULT_ERR_OUT_OF_RANGE; // value out of range return RESULT_ERR_OUT_OF_RANGE; // value out of range
} }
output[baseOffset + offset] = (unsigned char)value; output.dataAt(offset + index) = (symbol_t)value;
} }
} }
@@ -534,14 +534,14 @@ result_t DateTimeDataType::writeSymbols(istringstream& input,
return RESULT_ERR_EOF; // input too short return RESULT_ERR_EOF; // input too short
} }
if (usedLength != NULL) { if (usedLength != NULL) {
*usedLength = (unsigned char)((offset-start)*incr); *usedLength = (index-start)*incr;
} }
return RESULT_OK; return RESULT_OK;
} }
unsigned char NumberDataType::calcPrecision(const int divisor) { size_t NumberDataType::calcPrecision(const int divisor) {
unsigned char precision = 0; size_t precision = 0;
if (divisor > 1) { if (divisor > 1) {
for (unsigned int exp = 1; exp < MAX_DIVISOR; exp *= 10, precision++) { for (unsigned int exp = 1; exp < MAX_DIVISOR; exp *= 10, precision++) {
if (exp >= (unsigned int)divisor) { if (exp >= (unsigned int)divisor) {
@@ -552,7 +552,7 @@ unsigned char NumberDataType::calcPrecision(const int divisor) {
return precision; return precision;
} }
bool NumberDataType::dump(ostream& output, unsigned char length, const bool appendSeparatorDivisor) const { bool NumberDataType::dump(ostream& output, size_t length, const bool appendSeparatorDivisor) const {
if (m_bitCount < 8) { if (m_bitCount < 8) {
DataType::dump(output, m_bitCount, appendSeparatorDivisor); DataType::dump(output, m_bitCount, appendSeparatorDivisor);
} else { } else {
@@ -573,7 +573,7 @@ bool NumberDataType::dump(ostream& output, unsigned char length, const bool appe
return false; return false;
} }
result_t NumberDataType::derive(int divisor, unsigned char bitCount, NumberDataType* &derived) { result_t NumberDataType::derive(int divisor, size_t bitCount, NumberDataType* &derived) {
if (divisor == 0) { if (divisor == 0) {
divisor = 1; divisor = 1;
} }
@@ -627,13 +627,13 @@ result_t NumberDataType::derive(int divisor, unsigned char bitCount, NumberDataT
} }
result_t NumberDataType::readRawValue(SymbolString& input, result_t NumberDataType::readRawValue(SymbolString& input,
unsigned char baseOffset, const unsigned char length, size_t offset, const size_t length,
unsigned int& value) { unsigned int& value) {
size_t start = 0, count = length; size_t start = 0, count = length;
int incr = 1; int incr = 1;
unsigned char ch; symbol_t symbol;
if (baseOffset + length > input.size()) { if (offset + length > input.getDataSize()) {
return RESULT_ERR_INVALID_POS; // not enough data available return RESULT_ERR_INVALID_POS; // not enough data available
} }
if (hasFlag(REV)) { // reverted binary representation (most significant byte first) if (hasFlag(REV)) { // reverted binary representation (most significant byte first)
@@ -643,25 +643,25 @@ result_t NumberDataType::readRawValue(SymbolString& input,
value = 0; value = 0;
unsigned int exp = 1; unsigned int exp = 1;
for (size_t offset = start, i = 0; i < count; offset += incr, i++) { for (size_t index = start, i = 0; i < count; index += incr, i++) {
ch = input[baseOffset + offset]; symbol = input.dataAt(offset + index);
if (hasFlag(BCD)) { if (hasFlag(BCD)) {
if (!hasFlag(REQ) && ch == (m_replacement & 0xff)) { if (!hasFlag(REQ) && symbol == (m_replacement & 0xff)) {
value = m_replacement; value = m_replacement;
return RESULT_OK; return RESULT_OK;
} }
if (!hasFlag(HCD)) { if (!hasFlag(HCD)) {
if ((ch & 0xf0) > 0x90 || (ch & 0x0f) > 0x09) { if ((symbol & 0xf0) > 0x90 || (symbol & 0x0f) > 0x09) {
return RESULT_ERR_OUT_OF_RANGE; // invalid BCD return RESULT_ERR_OUT_OF_RANGE; // invalid BCD
} }
ch = (unsigned char)((ch >> 4) * 10 + (ch & 0x0f)); symbol = (symbol_t)((symbol >> 4) * 10 + (symbol & 0x0f));
} else if (ch > 0x63) { } else if (symbol > 0x63) {
return RESULT_ERR_OUT_OF_RANGE; // invalid HCD return RESULT_ERR_OUT_OF_RANGE; // invalid HCD
} }
value += ch * exp; value += symbol * exp;
exp *= 100; exp *= 100;
} else { } else {
value |= ch * exp; value |= symbol * exp;
exp <<= 8; exp <<= 8;
} }
} }
@@ -675,13 +675,13 @@ result_t NumberDataType::readRawValue(SymbolString& input,
return RESULT_OK; return RESULT_OK;
} }
result_t NumberDataType::readSymbols(SymbolString& input, const bool isMaster, result_t NumberDataType::readSymbols(SymbolString& input,
const unsigned char baseOffset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat) { ostringstream& output, OutputFormat outputFormat) {
unsigned int value = 0; unsigned int value = 0;
int signedValue; int signedValue;
result_t result = readRawValue(input, baseOffset, length, value); result_t result = readRawValue(input, offset, length, value);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -718,7 +718,7 @@ result_t NumberDataType::readSymbols(SymbolString& input, const bool isMaster,
# if HAVE_DIRECT_FLOAT_FORMAT == 2 # if HAVE_DIRECT_FLOAT_FORMAT == 2
value = __builtin_bswap32(value); value = __builtin_bswap32(value);
# endif # endif
unsigned char* pval = (unsigned char*)&value; symbol_t* pval = reinterpret_cast<symbol_t*>(&value);
val = *reinterpret_cast<float*>(pval); val = *reinterpret_cast<float*>(pval);
#else #else
int exp = (value >> 23) & 0xff; // 8 bits, signed int exp = (value >> 23) & 0xff; // 8 bits, signed
@@ -741,7 +741,7 @@ result_t NumberDataType::readSymbols(SymbolString& input, const bool isMaster,
} }
} }
if (m_precision != 0) { if (m_precision != 0) {
output << fixed << setprecision(m_precision+6); output << fixed << setprecision(static_cast<int>(m_precision+6));
} else if (val == 0) { } else if (val == 0) {
output << fixed << setprecision(1); output << fixed << setprecision(1);
} }
@@ -754,7 +754,7 @@ result_t NumberDataType::readSymbols(SymbolString& input, const bool isMaster,
} else if (m_divisor <= 1) { } else if (m_divisor <= 1) {
output << static_cast<unsigned>(value); output << static_cast<unsigned>(value);
} else { } else {
output << setprecision(m_precision) output << setprecision(static_cast<int>(m_precision))
<< fixed << (static_cast<float>(value) / static_cast<float>(m_divisor)); << fixed << (static_cast<float>(value) / static_cast<float>(m_divisor));
} }
return RESULT_OK; return RESULT_OK;
@@ -772,27 +772,27 @@ result_t NumberDataType::readSymbols(SymbolString& input, const bool isMaster,
if (hasFlag(FIX) && hasFlag(BCD)) { if (hasFlag(FIX) && hasFlag(BCD)) {
if (outputFormat & OF_JSON) { if (outputFormat & OF_JSON) {
output << '"'; output << '"';
output << setw(length * 2) << setfill('0'); output << setw(static_cast<int>(length * 2)) << setfill('0');
output << static_cast<signed>(signedValue) << setw(0); output << static_cast<signed>(signedValue) << setw(0);
output << '"'; output << '"';
return RESULT_OK; return RESULT_OK;
} }
output << setw(length * 2) << setfill('0'); output << setw(static_cast<int>(length * 2)) << setfill('0');
} }
output << static_cast<signed>(signedValue) << setw(0); output << static_cast<signed>(signedValue) << setw(0);
} else { } else {
output << setprecision(m_precision) output << setprecision(static_cast<int>(m_precision))
<< fixed << (static_cast<float>(signedValue) / static_cast<float>(m_divisor)); << fixed << (static_cast<float>(signedValue) / static_cast<float>(m_divisor));
} }
return RESULT_OK; return RESULT_OK;
} }
result_t NumberDataType::writeRawValue(unsigned int value, result_t NumberDataType::writeRawValue(unsigned int value,
const unsigned char baseOffset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, unsigned char* usedLength) { SymbolString& output, size_t* usedLength) {
size_t start = 0, count = length; size_t start = 0, count = length;
int incr = 1; int incr = 1;
unsigned char ch; symbol_t symbol;
if (m_bitCount < 8 && (value & ~((1 << m_bitCount) - 1)) != 0) { if (m_bitCount < 8 && (value & ~((1 << m_bitCount) - 1)) != 0) {
return RESULT_ERR_OUT_OF_RANGE; return RESULT_ERR_OUT_OF_RANGE;
@@ -806,25 +806,25 @@ result_t NumberDataType::writeRawValue(unsigned int value,
incr = -1; incr = -1;
} }
for (size_t offset = start, i = 0, exp = 1; i < count; offset += incr, i++) { for (size_t index = start, i = 0, exp = 1; i < count; index += incr, i++) {
if (hasFlag(BCD)) { if (hasFlag(BCD)) {
if (!hasFlag(REQ) && value == m_replacement) { if (!hasFlag(REQ) && value == m_replacement) {
ch = m_replacement & 0xff; symbol = m_replacement & 0xff;
} else { } else {
ch = (unsigned char)((value / exp) % 100); symbol = (symbol_t)((value / exp) % 100);
if (!hasFlag(HCD)) { if (!hasFlag(HCD)) {
ch = (unsigned char)(((ch / 10) << 4) | (ch % 10)); symbol = (symbol_t)(((symbol / 10) << 4) | (symbol % 10));
} }
} }
exp *= 100; exp *= 100;
} else { } else {
ch = (value / exp) & 0xff; symbol = (value / exp) & 0xff;
exp <<= 8; exp <<= 8;
} }
if (offset == start && (m_bitCount % 8) != 0 && baseOffset + offset < output.size()) { if (index == start && (m_bitCount % 8) != 0 && offset + index < output.getDataSize()) {
output[baseOffset + offset] |= ch; output.dataAt(offset + index) |= symbol;
} else { } else {
output[baseOffset + offset] = ch; output.dataAt(offset + index) = symbol;
} }
} }
if (usedLength != NULL) { if (usedLength != NULL) {
@@ -834,8 +834,8 @@ result_t NumberDataType::writeRawValue(unsigned int value,
} }
result_t NumberDataType::writeSymbols(istringstream& input, result_t NumberDataType::writeSymbols(istringstream& input,
const unsigned char baseOffset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength) { SymbolString& output, size_t* usedLength) {
unsigned int value; unsigned int value;
const char* str = input.str().c_str(); const char* str = input.str().c_str();
@@ -856,7 +856,7 @@ result_t NumberDataType::writeSymbols(istringstream& input,
} }
#ifdef HAVE_DIRECT_FLOAT_FORMAT #ifdef HAVE_DIRECT_FLOAT_FORMAT
float val = static_cast<float>(dvalue); float val = static_cast<float>(dvalue);
unsigned char* pval = (unsigned char*)&val; symbol_t* pval = reinterpret_cast<symbol_t*>(&val);
value = *reinterpret_cast<int32_t*>(pval); value = *reinterpret_cast<int32_t*>(pval);
# if HAVE_DIRECT_FLOAT_FORMAT == 2 # if HAVE_DIRECT_FLOAT_FORMAT == 2
value = __builtin_bswap32(value); value = __builtin_bswap32(value);
@@ -938,7 +938,7 @@ result_t NumberDataType::writeSymbols(istringstream& input,
} }
} }
return writeRawValue(value, baseOffset, length, output, usedLength); return writeRawValue(value, offset, length, output, usedLength);
} }
@@ -1067,7 +1067,7 @@ void DataTypeList::clear() {
result_t DataTypeList::add(DataType* dataType) { result_t DataTypeList::add(DataType* dataType) {
if (!dataType->isAdjustableLength()) { if (!dataType->isAdjustableLength()) {
ostringstream str; ostringstream str;
unsigned char bitCount = dataType->getBitCount(); size_t bitCount = dataType->getBitCount();
str << dataType->getId() << LENGTH_SEPARATOR << static_cast<unsigned>(bitCount >= 8?bitCount/8:bitCount); str << dataType->getId() << LENGTH_SEPARATOR << static_cast<unsigned>(bitCount >= 8?bitCount/8:bitCount);
map<string, DataType*>::iterator it = m_typesByIdLength.find(str.str()); map<string, DataType*>::iterator it = m_typesByIdLength.find(str.str());
if (it != m_typesByIdLength.end()) { if (it != m_typesByIdLength.end()) {
@@ -1086,7 +1086,7 @@ result_t DataTypeList::add(DataType* dataType) {
return RESULT_OK; return RESULT_OK;
} }
DataType* DataTypeList::get(const string id, const unsigned char length) { DataType* DataTypeList::get(const string id, const size_t length) {
DataType* dataType = NULL; DataType* dataType = NULL;
if (length > 0) { if (length > 0) {
ostringstream str; ostringstream str;
+43 -45
View File
@@ -170,7 +170,7 @@ class DataType {
* @param replacement the replacement value (fill-up value for @a StringDataType, no replacement if equal to * @param replacement the replacement value (fill-up value for @a StringDataType, no replacement if equal to
* @a NumberDataType#minValue). * @a NumberDataType#minValue).
*/ */
DataType(const string id, const unsigned char bitCount, const uint16_t flags, const unsigned int replacement) DataType(const string id, const size_t bitCount, const uint16_t flags, const unsigned int replacement)
: m_id(id), m_bitCount(bitCount), m_flags(flags), m_replacement(replacement) {} : m_id(id), m_bitCount(bitCount), m_flags(flags), m_replacement(replacement) {}
/** /**
@@ -186,7 +186,7 @@ class DataType {
/** /**
* @return the number of bits (maximum length if #ADJ flag is set). * @return the number of bits (maximum length if #ADJ flag is set).
*/ */
unsigned char getBitCount() const { return m_bitCount; } size_t getBitCount() const { return m_bitCount; }
/** /**
* Check whether a flag is set. * Check whether a flag is set.
@@ -224,7 +224,7 @@ class DataType {
* @param appendSeparatorDivisor whether to append a @a FIELD_SEPARATOR followed by the divisor (if available). * @param appendSeparatorDivisor whether to append a @a FIELD_SEPARATOR followed by the divisor (if available).
* @return true when a non-default divisor was written to the output. * @return true when a non-default divisor was written to the output.
*/ */
virtual bool dump(ostream& output, const unsigned char length, const bool appendSeparatorDivisor = true) const; virtual bool dump(ostream& output, const size_t length, const bool appendSeparatorDivisor = true) const;
/** /**
* Internal method for reading the numeric raw value from a @a SymbolString. * Internal method for reading the numeric raw value from a @a SymbolString.
@@ -235,21 +235,20 @@ class DataType {
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t readRawValue(SymbolString& input, virtual result_t readRawValue(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
unsigned int& value) = 0; unsigned int& value) = 0;
/** /**
* Internal method for reading the field from a @a SymbolString. * Internal method for reading the field from a @a SymbolString.
* @param input the @a SymbolString to read the binary value from. * @param input the @a SymbolString to read the binary value from.
* @param isMaster whether the @a SymbolString is the master part. * @param offset the offset in the data of the @a SymbolString.
* @param offset the offset in the @a SymbolString.
* @param length the number of symbols to read. * @param length the number of symbols to read.
* @param output the ostringstream to append the formatted value to. * @param output the ostringstream to append the formatted value to.
* @param outputFormat the @a OutputFormat options to use. * @param outputFormat the @a OutputFormat options to use.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t readSymbols(SymbolString& input, const bool isMaster, virtual result_t readSymbols(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat) = 0; ostringstream& output, OutputFormat outputFormat) = 0;
/** /**
@@ -258,13 +257,12 @@ class DataType {
* @param offset the offset in the @a SymbolString. * @param offset the offset in the @a SymbolString.
* @param length the number of symbols to write, or @a REMAIN_LEN. * @param length the number of symbols to write, or @a REMAIN_LEN.
* @param output the @a SymbolString to write the binary value to. * @param output the @a SymbolString to write the binary value to.
* @param isMaster whether the @a SymbolString is the master part.
* @param usedLength the variable in which to store the used length in bytes, or NULL. * @param usedLength the variable in which to store the used length in bytes, or NULL.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t writeSymbols(istringstream& input, virtual result_t writeSymbols(istringstream& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength) = 0; SymbolString& output, size_t* usedLength) = 0;
protected: protected:
@@ -272,7 +270,7 @@ class DataType {
const string m_id; const string m_id;
/** the number of bits (maximum length if #ADJ flag is set, must be multiple of 8 with flag #BCD). */ /** the number of bits (maximum length if #ADJ flag is set, must be multiple of 8 with flag #BCD). */
const unsigned char m_bitCount; const size_t m_bitCount;
/** the combination of flags (like #BCD). */ /** the combination of flags (like #BCD). */
const uint16_t m_flags; const uint16_t m_flags;
@@ -296,7 +294,7 @@ class StringDataType : public DataType {
* @param replacement the replacement value (fill-up value). * @param replacement the replacement value (fill-up value).
* @param isHex true for hex digits instead of characters. * @param isHex true for hex digits instead of characters.
*/ */
StringDataType(const string id, const unsigned char bitCount, const uint16_t flags, StringDataType(const string id, const size_t bitCount, const uint16_t flags,
const unsigned int replacement, bool isHex = false) const unsigned int replacement, bool isHex = false)
: DataType(id, bitCount, flags, replacement), m_isHex(isHex) {} : DataType(id, bitCount, flags, replacement), m_isHex(isHex) {}
@@ -307,18 +305,18 @@ class StringDataType : public DataType {
// @copydoc // @copydoc
virtual result_t readRawValue(SymbolString& input, virtual result_t readRawValue(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
unsigned int& value); unsigned int& value) override;
// @copydoc // @copydoc
virtual result_t readSymbols(SymbolString& input, const bool isMaster, virtual result_t readSymbols(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat); ostringstream& output, OutputFormat outputFormat) override;
// @copydoc // @copydoc
virtual result_t writeSymbols(istringstream& input, virtual result_t writeSymbols(istringstream& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength); SymbolString& output, size_t* usedLength) override;
private: private:
@@ -342,7 +340,7 @@ class DateTimeDataType : public DataType {
* @param hasTime true if time part is present. * @param hasTime true if time part is present.
* @param resolution the the resolution in minutes for time types, or 1. * @param resolution the the resolution in minutes for time types, or 1.
*/ */
DateTimeDataType(const string id, const unsigned char bitCount, const uint16_t flags, const unsigned int replacement, DateTimeDataType(const string id, const size_t bitCount, const uint16_t flags, const unsigned int replacement,
const bool hasDate, const bool hasTime, const int16_t resolution) const bool hasDate, const bool hasTime, const int16_t resolution)
: DataType(id, bitCount, flags, replacement), m_hasDate(hasDate), m_hasTime(hasTime), : DataType(id, bitCount, flags, replacement), m_hasDate(hasDate), m_hasTime(hasTime),
m_resolution(resolution == 0 ? 1 : resolution) {} m_resolution(resolution == 0 ? 1 : resolution) {}
@@ -369,18 +367,18 @@ class DateTimeDataType : public DataType {
// @copydoc // @copydoc
virtual result_t readRawValue(SymbolString& input, virtual result_t readRawValue(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
unsigned int& value); unsigned int& value) override;
// @copydoc // @copydoc
virtual result_t readSymbols(SymbolString& input, const bool isMaster, virtual result_t readSymbols(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat); ostringstream& output, OutputFormat outputFormat) override;
// @copydoc // @copydoc
virtual result_t writeSymbols(istringstream& input, virtual result_t writeSymbols(istringstream& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength); SymbolString& output, size_t* usedLength) override;
private: private:
@@ -410,7 +408,7 @@ class NumberDataType : public DataType {
* @param maxValue the maximum raw value. * @param maxValue the maximum raw value.
* @param divisor the divisor (negative for reciprocal). * @param divisor the divisor (negative for reciprocal).
*/ */
NumberDataType(const string id, const unsigned char bitCount, const uint16_t flags, const unsigned int replacement, NumberDataType(const string id, const size_t bitCount, const uint16_t flags, const unsigned int replacement,
const unsigned int minValue, const unsigned int maxValue, const int divisor) const unsigned int minValue, const unsigned int maxValue, const int divisor)
: DataType(id, bitCount, flags|NUM, replacement), m_minValue(minValue), m_maxValue(maxValue), m_divisor(divisor), : DataType(id, bitCount, flags|NUM, replacement), m_minValue(minValue), m_maxValue(maxValue), m_divisor(divisor),
m_precision(calcPrecision(divisor)), m_firstBit(0), m_baseType(NULL) {} m_precision(calcPrecision(divisor)), m_firstBit(0), m_baseType(NULL) {}
@@ -424,7 +422,7 @@ class NumberDataType : public DataType {
* @param firstBit the offset to the first bit. * @param firstBit the offset to the first bit.
* @param divisor the divisor (negative for reciprocal). * @param divisor the divisor (negative for reciprocal).
*/ */
NumberDataType(const string id, const unsigned char bitCount, const uint16_t flags, const unsigned int replacement, NumberDataType(const string id, const size_t bitCount, const uint16_t flags, const unsigned int replacement,
const int16_t firstBit, const int divisor) const int16_t firstBit, const int divisor)
: DataType(id, bitCount, flags|NUM, replacement), m_minValue(0), m_maxValue((1 << bitCount)-1), m_divisor(divisor), : DataType(id, bitCount, flags|NUM, replacement), m_minValue(0), m_maxValue((1 << bitCount)-1), m_divisor(divisor),
m_precision(0), m_firstBit(firstBit), m_baseType(NULL) {} m_precision(0), m_firstBit(firstBit), m_baseType(NULL) {}
@@ -440,10 +438,10 @@ class NumberDataType : public DataType {
* @param divisor the divisor (negative for reciprocal). * @param divisor the divisor (negative for reciprocal).
* @return the precision for formatting the value. * @return the precision for formatting the value.
*/ */
static unsigned char calcPrecision(const int divisor); static size_t calcPrecision(const int divisor);
// @copydoc // @copydoc
virtual bool dump(ostream& output, const unsigned char length, const bool appendSeparatorDivisor = true) const; virtual bool dump(ostream& output, const size_t length, const bool appendSeparatorDivisor = true) const override;
/** /**
* Derive a new @a NumberDataType from this. * Derive a new @a NumberDataType from this.
@@ -455,7 +453,7 @@ class NumberDataType : public DataType {
* not necessary. * not necessary.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t derive(int divisor, unsigned char bitCount, NumberDataType* &derived); virtual result_t derive(int divisor, size_t bitCount, NumberDataType* &derived);
/** /**
* @return the minimum raw value. * @return the minimum raw value.
@@ -475,7 +473,7 @@ class NumberDataType : public DataType {
/** /**
* @return the precision for formatting the value. * @return the precision for formatting the value.
*/ */
unsigned char getPrecision() const { return m_precision; } size_t getPrecision() const { return m_precision; }
/** /**
* @return the offset to the first bit. * @return the offset to the first bit.
@@ -484,13 +482,13 @@ class NumberDataType : public DataType {
// @copydoc // @copydoc
virtual result_t readRawValue(SymbolString& input, virtual result_t readRawValue(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
unsigned int& value); unsigned int& value) override;
// @copydoc // @copydoc
virtual result_t readSymbols(SymbolString& input, const bool isMaster, virtual result_t readSymbols(SymbolString& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
ostringstream& output, OutputFormat outputFormat); ostringstream& output, OutputFormat outputFormat) override;
/** /**
* Internal method for writing the numeric raw value to a @a SymbolString. * Internal method for writing the numeric raw value to a @a SymbolString.
@@ -503,13 +501,13 @@ class NumberDataType : public DataType {
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t writeRawValue(unsigned int value, virtual result_t writeRawValue(unsigned int value,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, unsigned char* usedLength = NULL); SymbolString& output, size_t* usedLength = NULL);
// @copydoc // @copydoc
virtual result_t writeSymbols(istringstream& input, virtual result_t writeSymbols(istringstream& input,
const unsigned char offset, const unsigned char length, const size_t offset, const size_t length,
SymbolString& output, const bool isMaster, unsigned char* usedLength); SymbolString& output, size_t* usedLength) override;
private: private:
@@ -523,7 +521,7 @@ class NumberDataType : public DataType {
const int m_divisor; const int m_divisor;
/** the precision for formatting the value. */ /** the precision for formatting the value. */
const unsigned char m_precision; const size_t m_precision;
/** the offset to the first bit. */ /** the offset to the first bit. */
const int16_t m_firstBit; const int16_t m_firstBit;
@@ -582,7 +580,7 @@ class DataTypeList {
* @return the @a DataType instance, or NULL if not available. * @return the @a DataType instance, or NULL if not available.
* Note: the caller may not free the instance. * Note: the caller may not free the instance.
*/ */
DataType* get(const string id, const unsigned char length = 0); DataType* get(const string id, const size_t length = 0);
/** /**
* Returns an iterator pointing to the first ID/@a DataType pair. * Returns an iterator pointing to the first ID/@a DataType pair.
+9 -9
View File
@@ -98,7 +98,7 @@ bool Device::isValid() {
return m_fd != -1; return m_fd != -1;
} }
result_t Device::send(const unsigned char value) { result_t Device::send(const symbol_t value) {
if (!isValid()) { if (!isValid()) {
return RESULT_ERR_DEVICE; return RESULT_ERR_DEVICE;
} }
@@ -111,7 +111,7 @@ result_t Device::send(const unsigned char value) {
return RESULT_OK; return RESULT_OK;
} }
result_t Device::recv(const unsigned int timeout, unsigned char& value) { result_t Device::recv(const unsigned int timeout, symbol_t& value) {
if (!isValid()) { if (!isValid()) {
return RESULT_ERR_DEVICE; return RESULT_ERR_DEVICE;
} }
@@ -268,13 +268,13 @@ result_t NetworkDevice::open() {
int cnt; int cnt;
if (ioctl(m_fd, FIONREAD, &cnt) >= 0 && cnt > 1) { if (ioctl(m_fd, FIONREAD, &cnt) >= 0 && cnt > 1) {
// skip buffered input // skip buffered input
unsigned char buf[256]; symbol_t buf[256];
while (::read(m_fd, &buf, 256) > 0) { while (::read(m_fd, &buf, 256) > 0) {
} }
} }
if (m_bufSize == 0) { if (m_bufSize == 0) {
m_bufSize = MAX_LEN+1; m_bufSize = MAX_LEN+1;
m_buffer = (unsigned char*)malloc(m_bufSize); m_buffer = reinterpret_cast<symbol_t*>(malloc(m_bufSize));
if (!m_buffer) { if (!m_buffer) {
m_bufSize = 0; m_bufSize = 0;
} }
@@ -287,7 +287,7 @@ result_t NetworkDevice::open() {
} }
void NetworkDevice::checkDevice() { void NetworkDevice::checkDevice() {
unsigned char value; symbol_t value;
ssize_t c = ::recv(m_fd, &value, 1, MSG_PEEK | MSG_DONTWAIT); ssize_t c = ::recv(m_fd, &value, 1, MSG_PEEK | MSG_DONTWAIT);
if (c == 0 || (c < 0 && errno != EAGAIN)) { if (c == 0 || (c < 0 && errno != EAGAIN)) {
m_bufLen = 0; // flush read buffer m_bufLen = 0; // flush read buffer
@@ -299,15 +299,15 @@ bool NetworkDevice::available() {
return m_buffer && m_bufLen > 0; return m_buffer && m_bufLen > 0;
} }
ssize_t NetworkDevice::write(const unsigned char value) { ssize_t NetworkDevice::write(const symbol_t value) {
m_bufLen = 0; // flush read buffer m_bufLen = 0; // flush read buffer
return Device::write(value); return Device::write(value);
} }
ssize_t NetworkDevice::read(unsigned char& value) { ssize_t NetworkDevice::read(symbol_t& value) {
if (available()) { if (available()) {
value = m_buffer[m_bufPos]; value = m_buffer[m_bufPos];
m_bufPos = (unsigned char)((m_bufPos+1)%m_bufSize); m_bufPos = (m_bufPos+1)%m_bufSize;
m_bufLen--; m_bufLen--;
return 1; return 1;
} }
@@ -318,7 +318,7 @@ ssize_t NetworkDevice::read(unsigned char& value) {
} }
value = m_buffer[0]; value = m_buffer[0];
m_bufPos = 1; m_bufPos = 1;
m_bufLen = (unsigned char)(size-1); m_bufLen = size-1;
return size; return size;
} }
return Device::read(value); return Device::read(value);
+21 -20
View File
@@ -26,6 +26,7 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include "lib/ebus/result.h" #include "lib/ebus/result.h"
#include "lib/ebus/symbol.h"
namespace ebusd { namespace ebusd {
@@ -49,11 +50,11 @@ class DeviceListener {
virtual ~DeviceListener() {} virtual ~DeviceListener() {}
/** /**
* Listener method that is called when a data byte was received/sent. * Listener method that is called when a symbol was received/sent.
* @param byte the data byte received/sent. * @param symbol the received/sent symbol.
* @param received @a true on reception, @a false on sending. * @param received @a true on reception, @a false on sending.
*/ */
virtual void notifyDeviceData(const unsigned char byte, bool received) = 0; // abstract virtual void notifyDeviceData(const symbol_t symbol, bool received) = 0; // abstract
}; };
@@ -112,7 +113,7 @@ class Device {
* @param value the byte value to write. * @param value the byte value to write.
* @return the @a result_t code. * @return the @a result_t code.
*/ */
result_t send(const unsigned char value); result_t send(const symbol_t value);
/** /**
* Read a single byte from the device. * Read a single byte from the device.
@@ -120,7 +121,7 @@ class Device {
* @param value the reference in which the received byte value is stored. * @param value the reference in which the received byte value is stored.
* @return the result_t code. * @return the result_t code.
*/ */
result_t recv(const unsigned int timeout, unsigned char& value); result_t recv(const unsigned int timeout, symbol_t& value);
/** /**
* Return the device name. * Return the device name.
@@ -164,14 +165,14 @@ class Device {
* @param value the byte value to write. * @param value the byte value to write.
* @return the number of bytes written, or -1 on error. * @return the number of bytes written, or -1 on error.
*/ */
virtual ssize_t write(const unsigned char value) { return ::write(m_fd, &value, 1); } virtual ssize_t write(const symbol_t value) { return ::write(m_fd, &value, 1); }
/** /**
* Read a single byte. * Read a single byte.
* @param value the reference in which the read byte value is stored. * @param value the reference in which the read byte value is stored.
* @return the number of bytes read, or -1 on error. * @return the number of bytes read, or -1 on error.
*/ */
virtual ssize_t read(unsigned char& value) { return ::read(m_fd, &value, 1); } virtual ssize_t read(symbol_t& value) { return ::read(m_fd, &value, 1); }
/** the device name (e.g. "/dev/ttyUSB0" for serial, "127.0.0.1:1234" for network). */ /** the device name (e.g. "/dev/ttyUSB0" for serial, "127.0.0.1:1234" for network). */
const char* m_name; const char* m_name;
@@ -210,15 +211,15 @@ class SerialDevice : public Device {
: Device(name, checkDevice, readOnly, initialSend) {} : Device(name, checkDevice, readOnly, initialSend) {}
// @copydoc // @copydoc
virtual result_t open(); virtual result_t open() override;
// @copydoc // @copydoc
virtual void close(); virtual void close() override;
protected: protected:
// @copydoc // @copydoc
virtual void checkDevice(); virtual void checkDevice() override;
private: private:
@@ -245,24 +246,24 @@ class NetworkDevice : public Device {
m_buffer(NULL), m_bufSize(0), m_bufLen(0), m_bufPos(0) {} m_buffer(NULL), m_bufSize(0), m_bufLen(0), m_bufPos(0) {}
// @copydoc // @copydoc
virtual unsigned int getLatency() const { return 10000; } virtual unsigned int getLatency() const override { return 10000; }
// @copydoc // @copydoc
virtual result_t open(); virtual result_t open() override;
protected: protected:
// @copydoc // @copydoc
virtual void checkDevice(); virtual void checkDevice() override;
// @copydoc // @copydoc
virtual bool available(); virtual bool available() override;
// @copydoc // @copydoc
virtual ssize_t write(const unsigned char value); virtual ssize_t write(const symbol_t value) override;
// @copydoc // @copydoc
virtual ssize_t read(unsigned char& value); virtual ssize_t read(symbol_t& value) override;
private: private:
@@ -273,16 +274,16 @@ class NetworkDevice : public Device {
const bool m_udp; const bool m_udp;
/** the buffer memory, or NULL. */ /** the buffer memory, or NULL. */
unsigned char* m_buffer; symbol_t* m_buffer;
/** the buffer size. */ /** the buffer size. */
unsigned char m_bufSize; size_t m_bufSize;
/** the buffer fill length. */ /** the buffer fill length. */
unsigned char m_bufLen; size_t m_bufLen;
/** the buffer read position. */ /** the buffer read position. */
unsigned char m_bufPos; size_t m_bufPos;
}; };
} // namespace ebusd } // namespace ebusd
+4 -4
View File
@@ -66,7 +66,7 @@ extern void printErrorPos(ostream& out, vector<string>::iterator begin, const ve
vector<string>::iterator pos, string filename, size_t lineNo, result_t result); vector<string>::iterator pos, string filename, size_t lineNo, result_t result);
extern unsigned int parseInt(const char* str, int base, const unsigned int minValue, const unsigned int maxValue, extern unsigned int parseInt(const char* str, int base, const unsigned int minValue, const unsigned int maxValue,
result_t& result, unsigned int* length); result_t& result, size_t* length);
/** /**
* An abstract class that support reading definitions from a file. * An abstract class that support reading definitions from a file.
@@ -105,7 +105,7 @@ class FileReader {
if (lastSep != string::npos) { // potential destination address, matches "^ZZ." if (lastSep != string::npos) { // potential destination address, matches "^ZZ."
// extract defaultDest, defaultCircuit, defaultSuffix from filename: // extract defaultDest, defaultCircuit, defaultSuffix from filename:
// ZZ.IDENT[.CIRCUIT][.SUFFIX].*csv // ZZ.IDENT[.CIRCUIT][.SUFFIX].*csv
unsigned char checkDest; symbol_t checkDest;
string checkIdent, useCircuit, useSuffix; string checkIdent, useCircuit, useSuffix;
unsigned int checkSw, checkHw; unsigned int checkSw, checkHw;
if (extractDefaultsFromFilename(filename.substr(lastSep+1), checkDest, checkIdent, useCircuit, useSuffix, if (extractDefaultsFromFilename(filename.substr(lastSep+1), checkDest, checkIdent, useCircuit, useSuffix,
@@ -320,7 +320,7 @@ class FileReader {
* @param hardware the hardware version part HWXXXX (BCD digits, set to @a UINT_MAX if not present). * @param hardware the hardware version part HWXXXX (BCD digits, set to @a UINT_MAX if not present).
* @return true if at least the address and the identification part were extracted, false otherwise. * @return true if at least the address and the identification part were extracted, false otherwise.
*/ */
static bool extractDefaultsFromFilename(string name, unsigned char& dest, string& ident, string& circuit, static bool extractDefaultsFromFilename(string name, symbol_t& dest, string& ident, string& circuit,
string& suffix, unsigned int& software, unsigned int& hardware) { string& suffix, unsigned int& software, unsigned int& hardware) {
ident = circuit = suffix = ""; ident = circuit = suffix = "";
software = hardware = UINT_MAX; software = hardware = UINT_MAX;
@@ -332,7 +332,7 @@ class FileReader {
return false; // missing "ZZ." return false; // missing "ZZ."
} }
result_t result = RESULT_OK; result_t result = RESULT_OK;
dest = (unsigned char)parseInt(name.substr(0, pos).c_str(), 16, 0, 0xff, result, NULL); dest = (symbol_t)parseInt(name.substr(0, pos).c_str(), 16, 0, 0xff, result, NULL);
if (result != RESULT_OK || !isValidAddress(dest)) { if (result != RESULT_OK || !isValidAddress(dest)) {
return false; // invalid "ZZ" return false; // invalid "ZZ"
} }
+132 -128
View File
@@ -60,10 +60,10 @@ extern DataFieldTemplates* getTemplates(const string filename);
Message::Message(const string circuit, const string level, const string name, Message::Message(const string circuit, const string level, const string name,
const bool isWrite, const bool isPassive, const string comment, const bool isWrite, const bool isPassive, const string comment,
const unsigned char srcAddress, const unsigned char dstAddress, const symbol_t srcAddress, const symbol_t dstAddress,
const vector<unsigned char> id, const vector<symbol_t> id,
DataField* data, const bool deleteData, DataField* data, const bool deleteData,
const unsigned char pollPriority, const size_t pollPriority,
Condition* condition) Condition* condition)
: m_circuit(circuit), m_level(level), m_name(name), m_isWrite(isWrite), : m_circuit(circuit), m_level(level), m_name(name), m_isWrite(isWrite),
m_isPassive(isPassive), m_comment(comment), m_isPassive(isPassive), m_comment(comment),
@@ -81,7 +81,7 @@ Message::Message(const string circuit, const string level, const string name,
Message::Message(const string circuit, const string level, const string name, Message::Message(const string circuit, const string level, const string name,
const bool isWrite, const bool isPassive, const bool isWrite, const bool isPassive,
const unsigned char pb, const unsigned char sb, const symbol_t pb, const symbol_t sb,
DataField* data, const bool deleteData) DataField* data, const bool deleteData)
: m_circuit(circuit), m_level(level), m_name(name), m_isWrite(isWrite), : m_circuit(circuit), m_level(level), m_name(name), m_isWrite(isWrite),
m_isPassive(isPassive), m_comment(), m_isPassive(isPassive), m_comment(),
@@ -135,9 +135,9 @@ string getDefault(const string value, vector<string>* defaults, size_t pos, bool
return defaultStr.substr(0, insertPos)+value+defaultStr.substr(insertPos+1); return defaultStr.substr(0, insertPos)+value+defaultStr.substr(insertPos+1);
} }
uint64_t Message::createKey(const vector<unsigned char> id, uint64_t Message::createKey(const vector<symbol_t> id,
const bool isWrite, const bool isPassive, const bool isWrite, const bool isPassive,
const unsigned char srcAddress, const unsigned char dstAddress) { const symbol_t srcAddress, const symbol_t dstAddress) {
uint64_t key = (uint64_t)(id.size()-2) << (8 * 7 + 5); uint64_t key = (uint64_t)(id.size()-2) << (8 * 7 + 5);
if (isPassive) { if (isPassive) {
key |= (uint64_t)getMasterNumber(srcAddress) << (8 * 7); // 0..25 key |= (uint64_t)getMasterNumber(srcAddress) << (8 * 7); // 0..25
@@ -146,7 +146,7 @@ uint64_t Message::createKey(const vector<unsigned char> id,
} }
key |= (uint64_t)dstAddress << (8 * 6); key |= (uint64_t)dstAddress << (8 * 6);
int exp = 5; int exp = 5;
for (vector<unsigned char>::const_iterator it = id.begin(); it < id.end(); it++) { for (vector<symbol_t>::const_iterator it = id.begin(); it < id.end(); it++) {
key ^= (uint64_t)*it << (8 * exp--); key ^= (uint64_t)*it << (8 * exp--);
if (exp == 0) { if (exp == 0) {
exp = 3; exp = 3;
@@ -155,15 +155,15 @@ uint64_t Message::createKey(const vector<unsigned char> id,
return key; return key;
} }
uint64_t Message::createKey(MasterSymbolString& master, unsigned char maxIdLength, bool anyDestination) { uint64_t Message::createKey(MasterSymbolString& master, size_t maxIdLength, bool anyDestination) {
if (master.size() < 5) { if (master.size() < 5) {
return INVALID_KEY; return INVALID_KEY;
} }
unsigned char idLength = master[4]; size_t idLength = master.getDataSize();
if (maxIdLength < idLength) { if (maxIdLength < idLength) {
idLength = maxIdLength; idLength = maxIdLength;
} }
if (master.size() < 5+idLength) { if (master.getDataSize() < idLength) {
return INVALID_KEY; return INVALID_KEY;
} }
uint64_t key = (uint64_t)idLength << (8 * 7 + 5); uint64_t key = (uint64_t)idLength << (8 * 7 + 5);
@@ -172,8 +172,8 @@ uint64_t Message::createKey(MasterSymbolString& master, unsigned char maxIdLengt
key |= (uint64_t)master[2] << (8 * 5); // PB key |= (uint64_t)master[2] << (8 * 5); // PB
key |= (uint64_t)master[3] << (8 * 4); // SB key |= (uint64_t)master[3] << (8 * 4); // SB
int exp = 3; int exp = 3;
for (unsigned char i = 0; i < idLength; i++) { for (size_t i = 0; i < idLength; i++) {
key ^= (uint64_t)master[5 + i] << (8 * exp--); key ^= (uint64_t)master.dataAt(i) << (8 * exp--);
if (exp == 0) { if (exp == 0) {
exp = 3; exp = 3;
} }
@@ -181,7 +181,7 @@ uint64_t Message::createKey(MasterSymbolString& master, unsigned char maxIdLengt
return key; return key;
} }
result_t Message::parseId(string input, vector<unsigned char>& id) { result_t Message::parseId(string input, vector<symbol_t>& id) {
istringstream in(input); istringstream in(input);
while (!in.eof()) { while (!in.eof()) {
while (in.peek() == ' ') { while (in.peek() == ' ') {
@@ -198,7 +198,7 @@ result_t Message::parseId(string input, vector<unsigned char>& id) {
input.push_back(static_cast<char>(in.get())); input.push_back(static_cast<char>(in.get()));
result_t result; result_t result;
unsigned char value = (unsigned char)parseInt(input.c_str(), 16, 0, 0xff, result); symbol_t value = (symbol_t)parseInt(input.c_str(), 16, 0, 0xff, result);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; // invalid hex value return result; // invalid hex value
} }
@@ -214,7 +214,7 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
result_t result; result_t result;
bool isWrite = false, isPassive = false; bool isWrite = false, isPassive = false;
string defaultName; string defaultName;
unsigned char pollPriority = 0; size_t pollPriority = 0;
size_t defaultPos = 1; size_t defaultPos = 1;
if (it == end) { if (it == end) {
return RESULT_ERR_EOF; return RESULT_ERR_EOF;
@@ -233,7 +233,7 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
if (type == 'r' || type == 'R') { // active read if (type == 'r' || type == 'R') { // active read
char poll = str[1]; char poll = str[1];
if (poll >= '0' && poll <= '9') { // poll priority (=active read) if (poll >= '0' && poll <= '9') { // poll priority (=active read)
pollPriority = (unsigned char)(poll - '0'); pollPriority = poll - '0';
defaultName.erase(1, 1); // cut off priority digit defaultName.erase(1, 1); // cut off priority digit
} }
} else if (type == 'w' || type == 'W') { // active write } else if (type == 'w' || type == 'W') { // active write
@@ -281,11 +281,11 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
if (it == end) { if (it == end) {
return RESULT_ERR_EOF; return RESULT_ERR_EOF;
} }
unsigned char srcAddress; symbol_t srcAddress;
if (*str == 0) { if (*str == 0) {
srcAddress = SYN; // no specific source srcAddress = SYN; // no specific source
} else { } else {
srcAddress = (unsigned char)parseInt(str, 16, 0, 0xff, result); srcAddress = (symbol_t)parseInt(str, 16, 0, 0xff, result);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -298,7 +298,7 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
if (it == end) { if (it == end) {
return RESULT_ERR_EOF; return RESULT_ERR_EOF;
} }
vector<unsigned char> dstAddresses; vector<symbol_t> dstAddresses;
bool isBroadcastOrMasterDestination = false; bool isBroadcastOrMasterDestination = false;
if (*str == 0) { if (*str == 0) {
dstAddresses.push_back(SYN); // no specific destination dstAddresses.push_back(SYN); // no specific destination
@@ -308,7 +308,7 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
bool first = true; bool first = true;
while (getline(stream, token, VALUE_SEPARATOR)) { while (getline(stream, token, VALUE_SEPARATOR)) {
FileReader::trim(token); FileReader::trim(token);
unsigned char dstAddress = (unsigned char)parseInt(token.c_str(), 16, 0, 0xff, result); symbol_t dstAddress = (symbol_t)parseInt(token.c_str(), 16, 0, 0xff, result);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -326,7 +326,7 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
} }
} }
vector<unsigned char> id; vector<symbol_t> id;
string token = *it++; // [PBSB] string token = *it++; // [PBSB]
bool useDefaults = token.empty(); bool useDefaults = token.empty();
if (useDefaults) { if (useDefaults) {
@@ -350,8 +350,8 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
defaultIdPrefix = getDefault("", defaults, defaultPos); defaultIdPrefix = getDefault("", defaults, defaultPos);
} }
defaultPos++; defaultPos++;
vector< vector<unsigned char> > chainIds; vector< vector<symbol_t> > chainIds;
vector<unsigned char> chainLengths; vector<size_t> chainLengths;
istringstream stream(token); istringstream stream(token);
size_t maxLength = MAX_POS; size_t maxLength = MAX_POS;
size_t chainLength = 16; size_t chainLength = 16;
@@ -369,7 +369,7 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
} }
token.resize(lengthPos); token.resize(lengthPos);
} }
vector<unsigned char> chainId = id; vector<symbol_t> chainId = id;
result = parseId(token, chainId); result = parseId(token, chainId);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
@@ -378,12 +378,12 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
return RESULT_ERR_INVALID_LIST; return RESULT_ERR_INVALID_LIST;
} }
chainIds.push_back(chainId); chainIds.push_back(chainId);
chainLengths.push_back((unsigned char)chainLength); chainLengths.push_back((symbol_t)chainLength);
if (first) { if (first) {
chainPrefixLength = chainId.size(); chainPrefixLength = chainId.size();
maxLength = 0; maxLength = 0;
} else if (chainPrefixLength > 2) { } else if (chainPrefixLength > 2) {
vector<unsigned char>& front = chainIds.front(); vector<symbol_t>& front = chainIds.front();
for (size_t pos = 2; pos < chainPrefixLength; pos++) { for (size_t pos = 2; pos < chainPrefixLength; pos++) {
if (chainId[pos] != front[pos]) { if (chainId[pos] != front[pos]) {
chainPrefixLength = pos; chainPrefixLength = pos;
@@ -439,13 +439,13 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
data = new DataFieldSet("", "", fields); data = new DataFieldSet("", "", fields);
} else { } else {
result = DataField::create(it, realEnd, templates, data, isWrite, false, isBroadcastOrMasterDestination, result = DataField::create(it, realEnd, templates, data, isWrite, false, isBroadcastOrMasterDestination,
(unsigned char)maxLength); maxLength);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
} }
if (id.size() + data->getLength(pt_masterData, (unsigned char)maxLength) > 2 + maxLength if (id.size() + data->getLength(pt_masterData, maxLength) > 2 + maxLength
|| data->getLength(pt_slaveData, (unsigned char)maxLength) > maxLength) { || data->getLength(pt_slaveData, maxLength) > maxLength) {
// max NN exceeded // max NN exceeded
delete data; delete data;
return RESULT_ERR_INVALID_POS; return RESULT_ERR_INVALID_POS;
@@ -453,8 +453,8 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
unsigned int index = 0; unsigned int index = 0;
bool multiple = dstAddresses.size() > 1; bool multiple = dstAddresses.size() > 1;
char num[10]; char num[10];
for (vector<unsigned char>::iterator it = dstAddresses.begin(); it != dstAddresses.end(); it++, index++) { for (vector<symbol_t>::iterator it = dstAddresses.begin(); it != dstAddresses.end(); it++, index++) {
unsigned char dstAddress = *it; symbol_t dstAddress = *it;
string useCircuit = circuit; string useCircuit = circuit;
if (multiple) { if (multiple) {
snprintf(num, sizeof(num), ".%d", index); snprintf(num, sizeof(num), ".%d", index);
@@ -477,7 +477,7 @@ Message* Message::createScanMessage() {
return new Message("scan", "", "", false, false, 0x07, 0x04, DataFieldSet::getIdentFields(), true); return new Message("scan", "", "", false, false, 0x07, 0x04, DataFieldSet::getIdentFields(), true);
} }
Message* Message::derive(const unsigned char dstAddress, const unsigned char srcAddress, const string circuit) { Message* Message::derive(const symbol_t dstAddress, const symbol_t srcAddress, const string circuit) {
Message* result = new Message(circuit.length() == 0 ? m_circuit : circuit, m_level, m_name, Message* result = new Message(circuit.length() == 0 ? m_circuit : circuit, m_level, m_name,
m_isWrite, m_isPassive, m_comment, m_isWrite, m_isPassive, m_comment,
srcAddress == SYN ? m_srcAddress : srcAddress, dstAddress, srcAddress == SYN ? m_srcAddress : srcAddress, dstAddress,
@@ -489,7 +489,7 @@ Message* Message::derive(const unsigned char dstAddress, const unsigned char src
return result; return result;
} }
Message* Message::derive(const unsigned char dstAddress, const bool extendCircuit) { Message* Message::derive(const symbol_t dstAddress, const bool extendCircuit) {
if (extendCircuit) { if (extendCircuit) {
ostringstream out; ostringstream out;
out << m_circuit << '.' << hex << setw(2) << setfill('0') << static_cast<unsigned>(dstAddress); out << m_circuit << '.' << hex << setw(2) << setfill('0') << static_cast<unsigned>(dstAddress);
@@ -520,7 +520,7 @@ bool Message::checkLevel(const string level, const string checkLevels) {
} }
return false; return false;
} }
bool Message::checkIdPrefix(vector<unsigned char>& id) { bool Message::checkIdPrefix(vector<symbol_t>& id) {
if (id.size() > m_id.size()) { if (id.size() > m_id.size()) {
return false; return false;
} }
@@ -532,13 +532,13 @@ bool Message::checkIdPrefix(vector<unsigned char>& id) {
return true; return true;
} }
bool Message::checkId(MasterSymbolString& master, unsigned char* index) { bool Message::checkId(MasterSymbolString& master, size_t* index) {
unsigned char idLen = getIdLength(); size_t idLen = getIdLength();
if (master.size() < 5+idLen) { // QQ, ZZ, PB, SB, NN if (master.getDataSize() < idLen) {
return false; return false;
} }
for (unsigned char pos = 0; pos < idLen; pos++) { for (size_t pos = 0; pos < idLen; pos++) {
if (m_id[2+pos] != master[5+pos]) { if (m_id[2+pos] != master.dataAt(pos)) {
return false; return false;
} }
} }
@@ -549,18 +549,18 @@ bool Message::checkId(MasterSymbolString& master, unsigned char* index) {
} }
bool Message::checkId(Message& other) { bool Message::checkId(Message& other) {
unsigned char idLen = getIdLength(); size_t idLen = getIdLength();
if (idLen != other.getIdLength() || getCount() > 1) { // only equal for non-chained messages if (idLen != other.getIdLength() || getCount() > 1) { // only equal for non-chained messages
return false; return false;
} }
return other.checkIdPrefix(m_id); return other.checkIdPrefix(m_id);
} }
uint64_t Message::getDerivedKey(const unsigned char dstAddress) { uint64_t Message::getDerivedKey(const symbol_t dstAddress) {
return (m_key & ~(0xffLL << (8*6))) | (uint64_t)dstAddress << (8*6); return (m_key & ~(0xffLL << (8*6))) | (uint64_t)dstAddress << (8*6);
} }
bool Message::setPollPriority(unsigned char priority) { bool Message::setPollPriority(size_t priority) {
if (priority == m_pollPriority || m_isPassive || isScanMessage() || m_dstAddress == SYN) { if (priority == m_pollPriority || m_isPassive || isScanMessage() || m_dstAddress == SYN) {
return false; return false;
} }
@@ -590,9 +590,9 @@ bool Message::hasField(const char* fieldName, bool numeric) {
return m_data->hasField(fieldName, numeric); return m_data->hasField(fieldName, numeric);
} }
result_t Message::prepareMaster(const unsigned char srcAddress, MasterSymbolString& master, result_t Message::prepareMaster(const symbol_t srcAddress, MasterSymbolString& master,
istringstream& input, char separator, istringstream& input, char separator,
const unsigned char dstAddress, unsigned char index) { const symbol_t dstAddress, size_t index) {
if (m_isPassive) { if (m_isPassive) {
return RESULT_ERR_INVALID_ARG; // prepare not possible return RESULT_ERR_INVALID_ARG; // prepare not possible
} }
@@ -620,20 +620,20 @@ result_t Message::prepareMaster(const unsigned char srcAddress, MasterSymbolStri
} }
result_t Message::prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator, result_t Message::prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator,
unsigned char index) { size_t index) {
if (index != 0) { if (index != 0) {
return RESULT_ERR_NOTFOUND; return RESULT_ERR_NOTFOUND;
} }
unsigned char pos = master.size(); size_t pos = master.size();
master.push_back(0); // length, will be set later master.push_back(0); // length, will be set later
for (size_t i = 2; i < m_id.size(); i++) { for (size_t i = 2; i < m_id.size(); i++) {
master.push_back(m_id[i]); master.push_back(m_id[i]);
} }
result_t result = m_data->write(input, pt_masterData, master, getIdLength(), separator); result_t result = m_data->write(input, master, getIdLength(), separator);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
master[pos] = (unsigned char)(master.size()-pos-1); master[pos] = (symbol_t)(master.size()-pos-1);
return result; return result;
} }
@@ -643,11 +643,11 @@ result_t Message::prepareSlave(istringstream& input, SlaveSymbolString& slave) {
} }
slave.clear(); slave.clear();
slave.push_back(0); // length, will be set later slave.push_back(0); // length, will be set later
result_t result = m_data->write(input, pt_slaveData, slave, 0); result_t result = m_data->write(input, slave, 0);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
slave[0] = (unsigned char)(slave.size()-1); slave[0] = (symbol_t)(slave.size()-1);
time(&m_lastUpdateTime); time(&m_lastUpdateTime);
if (slave != m_lastSlaveData) { if (slave != m_lastSlaveData) {
m_lastChangeTime = m_lastUpdateTime; m_lastChangeTime = m_lastUpdateTime;
@@ -664,7 +664,7 @@ result_t Message::storeLastData(MasterSymbolString& master, SlaveSymbolString& s
return result; return result;
} }
result_t Message::storeLastData(MasterSymbolString& data, unsigned char index) { result_t Message::storeLastData(MasterSymbolString& data, size_t index) {
if (data.size() > 0 if (data.size() > 0
&& (m_isWrite || this->m_dstAddress == BROADCAST || isMaster(this->m_dstAddress))) { && (m_isWrite || this->m_dstAddress == BROADCAST || isMaster(this->m_dstAddress))) {
time(&m_lastUpdateTime); time(&m_lastUpdateTime);
@@ -681,7 +681,7 @@ result_t Message::storeLastData(MasterSymbolString& data, unsigned char index) {
return RESULT_OK; return RESULT_OK;
} }
result_t Message::storeLastData(SlaveSymbolString& data, unsigned char index) { result_t Message::storeLastData(SlaveSymbolString& data, size_t index) {
if (data.size() > 0) { if (data.size() > 0) {
time(&m_lastUpdateTime); time(&m_lastUpdateTime);
} }
@@ -693,9 +693,9 @@ result_t Message::storeLastData(SlaveSymbolString& data, unsigned char index) {
} }
result_t Message::decodeLastMasterData(ostringstream& output, OutputFormat outputFormat, result_t Message::decodeLastMasterData(ostringstream& output, OutputFormat outputFormat,
bool leadingSeparator, const char* fieldName, signed char fieldIndex) { bool leadingSeparator, const char* fieldName, ssize_t fieldIndex) {
unsigned char offset = (unsigned char)(m_id.size() - 2); size_t offset = m_id.size() - 2;
result_t result = m_data->read(pt_masterData, m_lastMasterData, offset, result_t result = m_data->read(m_lastMasterData, offset,
output, outputFormat, -1, leadingSeparator, fieldName, fieldIndex); output, outputFormat, -1, leadingSeparator, fieldName, fieldIndex);
if (result < RESULT_OK) { if (result < RESULT_OK) {
return result; return result;
@@ -707,8 +707,8 @@ result_t Message::decodeLastMasterData(ostringstream& output, OutputFormat outpu
} }
result_t Message::decodeLastSlaveData(ostringstream& output, OutputFormat outputFormat, result_t Message::decodeLastSlaveData(ostringstream& output, OutputFormat outputFormat,
bool leadingSeparator, const char* fieldName, signed char fieldIndex) { bool leadingSeparator, const char* fieldName, ssize_t fieldIndex) {
result_t result = m_data->read(pt_slaveData, m_lastSlaveData, 0, result_t result = m_data->read(m_lastSlaveData, 0,
output, outputFormat, -1, leadingSeparator, fieldName, fieldIndex); output, outputFormat, -1, leadingSeparator, fieldName, fieldIndex);
if (result < RESULT_OK) { if (result < RESULT_OK) {
return result; return result;
@@ -720,17 +720,16 @@ result_t Message::decodeLastSlaveData(ostringstream& output, OutputFormat output
} }
result_t Message::decodeLastData(ostringstream& output, OutputFormat outputFormat, result_t Message::decodeLastData(ostringstream& output, OutputFormat outputFormat,
bool leadingSeparator, const char* fieldName, signed char fieldIndex) { bool leadingSeparator, const char* fieldName, ssize_t fieldIndex) {
size_t startPos = output.str().length(); size_t startPos = output.str().length();
result_t result = m_data->read(pt_masterData, m_lastMasterData, getIdLength(), output, outputFormat, -1, result_t result = m_data->read(m_lastMasterData, getIdLength(), output, outputFormat, -1,
leadingSeparator, fieldName, fieldIndex); leadingSeparator, fieldName, fieldIndex);
if (result < RESULT_OK) { if (result < RESULT_OK) {
return result; return result;
} }
bool empty = result == RESULT_EMPTY; bool empty = result == RESULT_EMPTY;
leadingSeparator |= output.str().length() > startPos; leadingSeparator |= output.str().length() > startPos;
result = m_data->read(pt_slaveData, m_lastSlaveData, 0, output, outputFormat, -1, leadingSeparator, fieldName, result = m_data->read(m_lastSlaveData, 0, output, outputFormat, -1, leadingSeparator, fieldName, fieldIndex);
fieldIndex);
if (result < RESULT_OK) { if (result < RESULT_OK) {
return result; return result;
} }
@@ -742,13 +741,13 @@ result_t Message::decodeLastData(ostringstream& output, OutputFormat outputForma
return result; return result;
} }
result_t Message::decodeLastDataNumField(unsigned int& output, const char* fieldName, signed char fieldIndex) { result_t Message::decodeLastDataNumField(unsigned int& output, const char* fieldName, ssize_t fieldIndex) {
result_t result = m_data->read(pt_masterData, m_lastMasterData, getIdLength(), output, fieldName, fieldIndex); result_t result = m_data->read(m_lastMasterData, getIdLength(), output, fieldName, fieldIndex);
if (result < RESULT_OK) { if (result < RESULT_OK) {
return result; return result;
} }
if (result == RESULT_EMPTY) { if (result == RESULT_EMPTY) {
result = m_data->read(pt_slaveData, m_lastSlaveData, 0, output, fieldName, fieldIndex); result = m_data->read(m_lastSlaveData, 0, output, fieldName, fieldIndex);
} }
if (result < RESULT_OK) { if (result < RESULT_OK) {
return result; return result;
@@ -760,10 +759,10 @@ result_t Message::decodeLastDataNumField(unsigned int& output, const char* field
} }
bool Message::isLessPollWeight(const Message* other) { bool Message::isLessPollWeight(const Message* other) {
unsigned char tprio = m_pollPriority; size_t tprio = m_pollPriority;
unsigned char oprio = other->m_pollPriority; size_t oprio = other->m_pollPriority;
unsigned int tw = tprio * m_pollCount; size_t tw = tprio * m_pollCount;
unsigned int ow = oprio * other->m_pollCount; size_t ow = oprio * other->m_pollCount;
if (tw > ow) { if (tw > ow) {
return true; return true;
} }
@@ -851,12 +850,12 @@ void Message::dumpColumn(ostream& output, column_t column, bool withConditions)
} }
break; break;
case COLUMN_PBSB: case COLUMN_PBSB:
for (vector<unsigned char>::const_iterator it = m_id.begin(); it < m_id.begin()+2 && it < m_id.end(); it++) { for (vector<symbol_t>::const_iterator it = m_id.begin(); it < m_id.begin()+2 && it < m_id.end(); it++) {
output << hex << setw(2) << setfill('0') << static_cast<unsigned>(*it); output << hex << setw(2) << setfill('0') << static_cast<unsigned>(*it);
} }
break; break;
case COLUMN_ID: case COLUMN_ID:
for (vector<unsigned char>::const_iterator it = m_id.begin()+2; it < m_id.end(); it++) { for (vector<symbol_t>::const_iterator it = m_id.begin()+2; it < m_id.end(); it++) {
output << hex << setw(2) << setfill('0') << static_cast<unsigned>(*it); output << hex << setw(2) << setfill('0') << static_cast<unsigned>(*it);
} }
break; break;
@@ -872,11 +871,11 @@ void Message::dumpColumn(ostream& output, column_t column, bool withConditions)
ChainedMessage::ChainedMessage(const string circuit, const string level, const string name, ChainedMessage::ChainedMessage(const string circuit, const string level, const string name,
const bool isWrite, const string comment, const bool isWrite, const string comment,
const unsigned char srcAddress, const unsigned char dstAddress, const symbol_t srcAddress, const symbol_t dstAddress,
const vector<unsigned char> id, const vector<symbol_t> id,
vector< vector<unsigned char> > ids, vector<unsigned char> lengths, vector< vector<symbol_t> > ids, vector<size_t> lengths,
DataField* data, const bool deleteData, DataField* data, const bool deleteData,
const unsigned char pollPriority, const size_t pollPriority,
Condition* condition) Condition* condition)
: Message(circuit, level, name, isWrite, false, comment, : Message(circuit, level, name, isWrite, false, comment,
srcAddress, dstAddress, id, srcAddress, dstAddress, id,
@@ -895,7 +894,7 @@ ChainedMessage::ChainedMessage(const string circuit, const string level, const s
} }
ChainedMessage::~ChainedMessage() { ChainedMessage::~ChainedMessage() {
for (unsigned char index = 0; index < m_ids.size(); index++) { for (size_t index = 0; index < m_ids.size(); index++) {
delete m_lastMasterDatas[index]; delete m_lastMasterDatas[index];
m_lastMasterDatas[index] = NULL; m_lastMasterDatas[index] = NULL;
delete m_lastSlaveDatas[index]; delete m_lastSlaveDatas[index];
@@ -907,7 +906,7 @@ ChainedMessage::~ChainedMessage() {
free(m_lastSlaveUpdateTimes); free(m_lastSlaveUpdateTimes);
} }
Message* ChainedMessage::derive(const unsigned char dstAddress, const unsigned char srcAddress, const string circuit) { Message* ChainedMessage::derive(const symbol_t dstAddress, const symbol_t srcAddress, const string circuit) {
ChainedMessage* result = new ChainedMessage(circuit.length() == 0 ? m_circuit : circuit, m_level, m_name, ChainedMessage* result = new ChainedMessage(circuit.length() == 0 ? m_circuit : circuit, m_level, m_name,
m_isWrite, m_comment, m_isWrite, m_comment,
srcAddress == SYN ? m_srcAddress : srcAddress, dstAddress, srcAddress == SYN ? m_srcAddress : srcAddress, dstAddress,
@@ -919,22 +918,22 @@ Message* ChainedMessage::derive(const unsigned char dstAddress, const unsigned c
return result; return result;
} }
bool ChainedMessage::checkId(MasterSymbolString& master, unsigned char* index) { bool ChainedMessage::checkId(MasterSymbolString& master, size_t* index) {
unsigned char idLen = getIdLength(); size_t idLen = getIdLength();
if (master.size() < 5+idLen) { // QQ, ZZ, PB, SB, NN if (master.getDataSize() < idLen) {
return false; return false;
} }
unsigned char chainPrefixLength = Message::getIdLength(); size_t chainPrefixLength = Message::getIdLength();
for (unsigned char pos = 0; pos < chainPrefixLength; pos++) { for (size_t pos = 0; pos < chainPrefixLength; pos++) {
if (m_id[2+pos] != master[5+pos]) { if (m_id[2+pos] != master.dataAt(pos)) {
return false; // chain prefix mismatch return false; // chain prefix mismatch
} }
} }
for (unsigned char checkIndex = 0; checkIndex < m_ids.size(); checkIndex++) { // check suffix for each part for (size_t checkIndex = 0; checkIndex < m_ids.size(); checkIndex++) { // check suffix for each part
vector<unsigned char> id = m_ids[checkIndex]; vector<symbol_t> id = m_ids[checkIndex];
bool found = false; bool found = false;
for (unsigned char pos = chainPrefixLength; pos < idLen; pos++) { for (size_t pos = chainPrefixLength; pos < idLen; pos++) {
if (id[2+pos] != master[5+pos]) { if (id[2+pos] != master.dataAt(pos)) {
found = false; found = false;
break; break;
} }
@@ -951,21 +950,21 @@ bool ChainedMessage::checkId(MasterSymbolString& master, unsigned char* index) {
} }
bool ChainedMessage::checkId(Message& other) { bool ChainedMessage::checkId(Message& other) {
unsigned char idLen = getIdLength(); size_t idLen = getIdLength();
if (idLen != other.getIdLength() || other.getCount() == 1) { // only equal for chained messages if (idLen != other.getIdLength() || other.getCount() == 1) { // only equal for chained messages
return false; return false;
} }
if (!other.checkIdPrefix(m_id)) { if (!other.checkIdPrefix(m_id)) {
return false; // chain prefix mismatch return false; // chain prefix mismatch
} }
vector< vector<unsigned char> > otherIds = ((ChainedMessage&)other).m_ids; vector< vector<symbol_t> > otherIds = ((ChainedMessage&)other).m_ids;
unsigned char chainPrefixLength = Message::getIdLength(); size_t chainPrefixLength = Message::getIdLength();
for (unsigned char checkIndex = 0; checkIndex < m_ids.size(); checkIndex++) { // check suffix for each part for (size_t checkIndex = 0; checkIndex < m_ids.size(); checkIndex++) { // check suffix for each part
vector<unsigned char> id = m_ids[checkIndex]; vector<symbol_t> id = m_ids[checkIndex];
for (unsigned char otherIndex = 0; otherIndex < otherIds.size(); otherIndex++) { for (size_t otherIndex = 0; otherIndex < otherIds.size(); otherIndex++) {
vector<unsigned char> otherId = otherIds[otherIndex]; vector<symbol_t> otherId = otherIds[otherIndex];
bool found = false; bool found = false;
for (unsigned char pos = chainPrefixLength; pos < idLen; pos++) { for (size_t pos = chainPrefixLength; pos < idLen; pos++) {
if (id[2+pos] != otherId[2+pos]) { if (id[2+pos] != otherId[2+pos]) {
found = false; found = false;
break; break;
@@ -981,13 +980,13 @@ bool ChainedMessage::checkId(Message& other) {
} }
result_t ChainedMessage::prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator, result_t ChainedMessage::prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator,
unsigned char index) { size_t index) {
size_t cnt = getCount(); size_t cnt = getCount();
if (index >= cnt) { if (index >= cnt) {
return RESULT_ERR_NOTFOUND; return RESULT_ERR_NOTFOUND;
} }
MasterSymbolString allData; MasterSymbolString allData;
result_t result = m_data->write(input, pt_masterData, allData, 0, separator); result_t result = m_data->write(input, allData, 0, separator);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -999,16 +998,16 @@ result_t ChainedMessage::prepareMasterPart(MasterSymbolString& master, istringst
addData = m_lengths[i+1]; addData = m_lengths[i+1];
} }
} }
if (pos+addData > allData.size()) { if (pos+addData > allData.getDataSize()) {
return RESULT_ERR_INVALID_POS; return RESULT_ERR_INVALID_POS;
} }
vector<unsigned char> id = m_ids[index]; vector<symbol_t> id = m_ids[index];
master.push_back((unsigned char)(id.size()-2+addData)); // NN master.push_back((symbol_t)(id.size()-2+addData)); // NN
for (size_t i = 2; i < id.size(); i++) { for (size_t i = 2; i < id.size(); i++) {
master.push_back(id[i]); master.push_back(id[i]);
} }
for (size_t i = 0; i < addData; i++) { for (size_t i = 0; i < addData; i++) {
master.push_back(allData[pos+i]); master.push_back(allData.dataAt(pos+i));
} }
if (index == 0) { if (index == 0) {
for (size_t i = 0; i < cnt; i++) { for (size_t i = 0; i < cnt; i++) {
@@ -1020,7 +1019,7 @@ result_t ChainedMessage::prepareMasterPart(MasterSymbolString& master, istringst
result_t ChainedMessage::storeLastData(MasterSymbolString& master, SlaveSymbolString& slave) { result_t ChainedMessage::storeLastData(MasterSymbolString& master, SlaveSymbolString& slave) {
// determine index from master ID // determine index from master ID
unsigned char index = 0; size_t index = 0;
if (checkId(master, &index)) { if (checkId(master, &index)) {
result_t result = storeLastData(master, index); result_t result = storeLastData(master, index);
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
@@ -1031,7 +1030,7 @@ result_t ChainedMessage::storeLastData(MasterSymbolString& master, SlaveSymbolSt
return RESULT_ERR_INVALID_ARG; return RESULT_ERR_INVALID_ARG;
} }
result_t ChainedMessage::storeLastData(MasterSymbolString& data, unsigned char index) { result_t ChainedMessage::storeLastData(MasterSymbolString& data, size_t index) {
if (index >= m_ids.size()) { if (index >= m_ids.size()) {
return RESULT_ERR_INVALID_ARG; return RESULT_ERR_INVALID_ARG;
} }
@@ -1047,7 +1046,7 @@ result_t ChainedMessage::storeLastData(MasterSymbolString& data, unsigned char i
return combineLastParts(); return combineLastParts();
} }
result_t ChainedMessage::storeLastData(SlaveSymbolString& data, unsigned char index) { result_t ChainedMessage::storeLastData(SlaveSymbolString& data, size_t index) {
if (index >= m_ids.size()) { if (index >= m_ids.size()) {
return RESULT_ERR_INVALID_ARG; return RESULT_ERR_INVALID_ARG;
} }
@@ -1061,7 +1060,7 @@ result_t ChainedMessage::storeLastData(SlaveSymbolString& data, unsigned char in
result_t ChainedMessage::combineLastParts() { result_t ChainedMessage::combineLastParts() {
// check arrival time of all parts // check arrival time of all parts
time_t minTime = 0, maxTime = 0; time_t minTime = 0, maxTime = 0;
for (unsigned char index = 0; index < m_ids.size(); index++) { for (size_t index = 0; index < m_ids.size(); index++) {
if (index == 0) { if (index == 0) {
minTime = maxTime = m_lastMasterUpdateTimes[index]; minTime = maxTime = m_lastMasterUpdateTimes[index];
} else { } else {
@@ -1085,25 +1084,30 @@ result_t ChainedMessage::combineLastParts() {
// everything was completely retrieved in short time // everything was completely retrieved in short time
MasterSymbolString master; MasterSymbolString master;
SlaveSymbolString slave; SlaveSymbolString slave;
size_t offset = 5+(m_ids[0].size()-2); // skip QQ, ZZ, PB, SB, NN size_t offset = m_ids[0].size()-2;
for (unsigned char index = 0; index < m_ids.size(); index++) { SymbolString* add = m_lastMasterDatas[0];
SymbolString* add = m_lastMasterDatas[index]; for (size_t pos = 0; pos < 5+offset; pos++) {
size_t end = 5+(*add)[4]; master.push_back((*add)[pos]); // copy header
for (size_t pos = index == 0 ? 0 : offset; pos < end; pos++) { }
master.push_back((*add)[pos]); slave.push_back(0); // NN, set later
for (size_t index = 0; index < m_ids.size(); index++) {
add = m_lastMasterDatas[index];
size_t end = add->getDataSize();
for (size_t pos = offset; pos < end; pos++) {
master.push_back(add->dataAt(pos));
} }
add = m_lastSlaveDatas[index]; add = m_lastSlaveDatas[index];
end = 1+(*add)[0]; end = add->getDataSize();
for (size_t pos = index == 0 ? 0 : 1; pos < end; pos++) { for (size_t pos = 0; pos < end; pos++) {
slave.push_back((*add)[pos]); slave.push_back(add->dataAt(pos));
} }
} }
// adjust NN // adjust NN
if (master.size()-5 > 255 || slave.size()-1 > 255) { if (master.size()-5 > 255 || slave.size()-1 > 255) {
return RESULT_ERR_INVALID_POS; return RESULT_ERR_INVALID_POS;
} }
master[4] = (unsigned char)(master.size()-5); master[4] = (symbol_t)(master.size()-5);
slave[0] = (unsigned char)(slave.size()-1); slave[0] = (symbol_t)(slave.size()-1);
result_t result = Message::storeLastData(master, 0); result_t result = Message::storeLastData(master, 0);
if (result == RESULT_OK) { if (result == RESULT_OK) {
result = Message::storeLastData(slave, 0); result = Message::storeLastData(slave, 0);
@@ -1118,8 +1122,8 @@ void ChainedMessage::dumpColumn(ostream& output, column_t column, bool withCondi
} }
bool first = true; bool first = true;
for (size_t index = 0; index < m_ids.size(); index++) { for (size_t index = 0; index < m_ids.size(); index++) {
vector<unsigned char> id = m_ids[index]; vector<symbol_t> id = m_ids[index];
for (vector<unsigned char>::const_iterator it = id.begin()+2; it < id.end(); it++) { for (vector<symbol_t>::const_iterator it = id.begin()+2; it < id.end(); it++) {
if (first) { if (first) {
first = false; first = false;
} else { } else {
@@ -1258,13 +1262,13 @@ result_t Condition::create(const string condName, vector<string>::iterator& it,
} }
string field = it == end ? "" : *(it++); // fieldname string field = it == end ? "" : *(it++); // fieldname
string zz = it == end ? "" : *(it++); // ZZ string zz = it == end ? "" : *(it++); // ZZ
unsigned char dstAddress = SYN; symbol_t dstAddress = SYN;
result_t result = RESULT_OK; result_t result = RESULT_OK;
if (zz.length() == 0) { if (zz.length() == 0) {
zz = defaultDest; zz = defaultDest;
} }
if (zz.length() > 0) { if (zz.length() > 0) {
dstAddress = (unsigned char)parseInt(zz.c_str(), 16, 0, 0xff, result); dstAddress = (symbol_t)parseInt(zz.c_str(), 16, 0, 0xff, result);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -1556,7 +1560,7 @@ result_t LoadInstruction::execute(MessageMap* messages, ostringstream& log, Cond
log << (isSingleton() ? "loaded \"" : "included \"") << m_filename << "\" for \"" << getDestination() << "\""; log << (isSingleton() ? "loaded \"" : "included \"") << m_filename << "\" for \"" << getDestination() << "\"";
if (isSingleton() && !m_defaultDest.empty()) { if (isSingleton() && !m_defaultDest.empty()) {
result_t temp; result_t temp;
unsigned char address = (unsigned char)parseInt(m_defaultDest.c_str(), 16, 0, 0xff, temp); symbol_t address = (symbol_t)parseInt(m_defaultDest.c_str(), 16, 0, 0xff, temp);
if (temp == RESULT_OK) { if (temp == RESULT_OK) {
size_t pos = m_filename.find_last_of('/'); size_t pos = m_filename.find_last_of('/');
string filename; string filename;
@@ -1640,7 +1644,7 @@ result_t MessageMap::add(Message* message, bool storeByName) {
} }
addPollMessage(message); addPollMessage(message);
} }
unsigned char idLength = message->getIdLength(); size_t idLength = message->getIdLength();
if (idLength > m_maxIdLength) { if (idLength > m_maxIdLength) {
m_maxIdLength = idLength; m_maxIdLength = idLength;
} }
@@ -1825,7 +1829,7 @@ result_t MessageMap::addFromFile(vector<string>::iterator& begin, const vector<s
return result; return result;
} }
Message* MessageMap::getScanMessage(const unsigned char dstAddress) { Message* MessageMap::getScanMessage(const symbol_t dstAddress) {
if (dstAddress == SYN) { if (dstAddress == SYN) {
return m_scanMessage; return m_scanMessage;
} }
@@ -1931,7 +1935,7 @@ result_t MessageMap::executeInstructions(ostringstream& log, void (*readMessageF
return overallResult; return overallResult;
} }
void MessageMap::addLoadedFile(unsigned char address, string file, string comment) { void MessageMap::addLoadedFile(symbol_t address, string file, string comment) {
if (!file.empty()) { if (!file.empty()) {
string fileComment = "\""+file+"\""; string fileComment = "\""+file+"\"";
if (!comment.empty()) { if (!comment.empty()) {
@@ -1945,7 +1949,7 @@ void MessageMap::addLoadedFile(unsigned char address, string file, string commen
} }
} }
string MessageMap::getLoadedFiles(unsigned char address) { string MessageMap::getLoadedFiles(symbol_t address) {
if (m_loadedFiles.find(address) == m_loadedFiles.end()) { if (m_loadedFiles.find(address) == m_loadedFiles.end()) {
return ""; return "";
} }
@@ -2062,16 +2066,16 @@ Message* MessageMap::find(MasterSymbolString& master, bool anyDestination,
if (baseKey == INVALID_KEY) { if (baseKey == INVALID_KEY) {
return NULL; return NULL;
} }
unsigned char maxIdLength = Message::getKeyLength(baseKey); size_t maxIdLength = Message::getKeyLength(baseKey);
for (unsigned char idLength = maxIdLength; true; idLength--) { for (size_t idLength = maxIdLength; true; idLength--) {
uint64_t key = baseKey; uint64_t key = baseKey;
if (idLength == maxIdLength) { if (idLength == maxIdLength) {
baseKey &= ~ID_LENGTH_AND_IDS_MASK; baseKey &= ~ID_LENGTH_AND_IDS_MASK;
} else { } else {
key |= (uint64_t)idLength << (8 * 7 + 5); key |= (uint64_t)idLength << (8 * 7 + 5);
int exp = 3; int exp = 3;
for (unsigned char i = 0; i < idLength; i++) { for (size_t i = 0; i < idLength; i++) {
key ^= (uint64_t)master[5 + i] << (8 * exp--); key ^= (uint64_t)master.dataAt(i) << (8 * exp--);
if (exp == 0) { if (exp == 0) {
exp = 3; exp = 3;
} }
+77 -77
View File
@@ -125,10 +125,10 @@ class Message {
*/ */
Message(const string circuit, const string level, const string name, Message(const string circuit, const string level, const string name,
const bool isWrite, const bool isPassive, const string comment, const bool isWrite, const bool isPassive, const string comment,
const unsigned char srcAddress, const unsigned char dstAddress, const symbol_t srcAddress, const symbol_t dstAddress,
const vector<unsigned char> id, const vector<symbol_t> id,
DataField* data, const bool deleteData, DataField* data, const bool deleteData,
const unsigned char pollPriority = 0, const size_t pollPriority = 0,
Condition* condition = NULL); Condition* condition = NULL);
@@ -148,7 +148,7 @@ class Message {
*/ */
Message(const string circuit, const string level, const string name, Message(const string circuit, const string level, const string name,
const bool isWrite, const bool isPassive, const bool isWrite, const bool isPassive,
const unsigned char pb, const unsigned char sb, const symbol_t pb, const symbol_t sb,
DataField* data, const bool deleteData); DataField* data, const bool deleteData);
@@ -168,9 +168,9 @@ class Message {
* @param dstAddress the destination address, or @a SYN for any (set later). * @param dstAddress the destination address, or @a SYN for any (set later).
* @return the key for the ID. * @return the key for the ID.
*/ */
static uint64_t createKey(const vector<unsigned char> id, static uint64_t createKey(const vector<symbol_t> id,
const bool isWrite, const bool isPassive, const bool isWrite, const bool isPassive,
const unsigned char srcAddress, const unsigned char dstAddress); const symbol_t srcAddress, const symbol_t dstAddress);
/** /**
* Calculate the key for the @a MasterSymbolString. * Calculate the key for the @a MasterSymbolString.
@@ -180,14 +180,14 @@ class Message {
* @return the key for the ID, or -1LL if the data is invalid. * @return the key for the ID, or -1LL if the data is invalid.
*/ */
static uint64_t createKey(MasterSymbolString& master, static uint64_t createKey(MasterSymbolString& master,
unsigned char maxIdLength, bool anyDestination = false); size_t maxIdLength, bool anyDestination = false);
/** /**
* Get the length field from the key. * Get the length field from the key.
* @param key the key. * @param key the key.
* @return the length field from the key. * @return the length field from the key.
*/ */
static unsigned char getKeyLength(uint64_t key) { return (unsigned char)(key >> (8 * 7 + 5)); } static size_t getKeyLength(uint64_t key) { return key >> (8 * 7 + 5); }
/** /**
* Parse an ID part from the input @a string. * Parse an ID part from the input @a string.
@@ -195,7 +195,7 @@ class Message {
* @param id the vector to which to add the parsed values. * @param id the vector to which to add the parsed values.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
static result_t parseId(string input, vector<unsigned char>& id); static result_t parseId(string input, vector<symbol_t>& id);
/** /**
* Factory method for creating new instances. * Factory method for creating new instances.
@@ -236,7 +236,7 @@ class Message {
* @param circuit the new circuit name, or empty to use the current circuit name. * @param circuit the new circuit name, or empty to use the current circuit name.
* @return the derived @a Message instance. * @return the derived @a Message instance.
*/ */
virtual Message* derive(const unsigned char dstAddress, const unsigned char srcAddress = SYN, virtual Message* derive(const symbol_t dstAddress, const symbol_t srcAddress = SYN,
const string circuit = ""); const string circuit = "");
/** /**
@@ -245,7 +245,7 @@ class Message {
* @param extendCircuit whether to extend the current circuit name with a dot and the new destination address in hex. * @param extendCircuit whether to extend the current circuit name with a dot and the new destination address in hex.
* @return the derived @a ScanMessage instance. * @return the derived @a ScanMessage instance.
*/ */
Message* derive(const unsigned char dstAddress, const bool extendCircuit); Message* derive(const symbol_t dstAddress, const bool extendCircuit);
/** /**
* Get the optional circuit name. * Get the optional circuit name.
@@ -289,7 +289,7 @@ class Message {
* @param fieldIndex the index of the field. * @param fieldIndex the index of the field.
* @return the field name, or the index as string if not unique or not available. * @return the field name, or the index as string if not unique or not available.
*/ */
virtual string getFieldName(signed char fieldIndex) const { return m_data->getName(fieldIndex); } virtual string getFieldName(ssize_t fieldIndex) const { return m_data->getName(fieldIndex); }
/** /**
* Get whether this is a write message. * Get whether this is a write message.
@@ -314,38 +314,38 @@ class Message {
* Get the source address. * Get the source address.
* @return the source address, or @a SYN for any. * @return the source address, or @a SYN for any.
*/ */
unsigned char getSrcAddress() const { return m_srcAddress; } symbol_t getSrcAddress() const { return m_srcAddress; }
/** /**
* Get the destination address. * Get the destination address.
* @return the destination address, or @a SYN for any. * @return the destination address, or @a SYN for any.
*/ */
unsigned char getDstAddress() const { return m_dstAddress; } symbol_t getDstAddress() const { return m_dstAddress; }
/** /**
* Get the primary command byte. * Get the primary command byte.
* @return the primary command byte. * @return the primary command byte.
*/ */
unsigned char getPrimaryCommand() const { return m_id[0]; } symbol_t getPrimaryCommand() const { return m_id[0]; }
/** /**
* Get the secondary command byte. * Get the secondary command byte.
* @return the secondary command byte. * @return the secondary command byte.
*/ */
unsigned char getSecondaryCommand() const { return m_id[1]; } symbol_t getSecondaryCommand() const { return m_id[1]; }
/** /**
* Get the length of the ID bytes (without primary and secondary command bytes). * Get the length of the ID bytes (without primary and secondary command bytes).
* @return the length of the ID bytes (without primary and secondary command bytes). * @return the length of the ID bytes (without primary and secondary command bytes).
*/ */
virtual unsigned char getIdLength() const { return (unsigned char)(m_id.size() - 2); } virtual size_t getIdLength() const { return m_id.size() - 2; }
/** /**
* Check if the full command ID starts with the given value. * Check if the full command ID starts with the given value.
* @param id the ID bytes to check against. * @param id the ID bytes to check against.
* @return true if the full command ID starts with the given value. * @return true if the full command ID starts with the given value.
*/ */
bool checkIdPrefix(vector<unsigned char>& id); bool checkIdPrefix(vector<symbol_t>& id);
/** /**
* Check the ID against the master @a SymbolString data. * Check the ID against the master @a SymbolString data.
@@ -353,7 +353,7 @@ class Message {
* @param index the variable in which to store the message part index, or NULL to ignore. * @param index the variable in which to store the message part index, or NULL to ignore.
* @return true if the ID matches, false otherwise. * @return true if the ID matches, false otherwise.
*/ */
virtual bool checkId(MasterSymbolString& master, unsigned char* index = NULL); virtual bool checkId(MasterSymbolString& master, size_t* index = NULL);
/** /**
* Check the ID against the other @a Message. * Check the ID against the other @a Message.
@@ -373,20 +373,20 @@ class Message {
* @param dstAddress the destination address for the derivation. * @param dstAddress the destination address for the derivation.
* @return the derived key for storing in @a MessageMap. * @return the derived key for storing in @a MessageMap.
*/ */
uint64_t getDerivedKey(const unsigned char dstAddress); uint64_t getDerivedKey(const symbol_t dstAddress);
/** /**
* Get the polling priority, or 0 for no polling at all. * Get the polling priority, or 0 for no polling at all.
* @return the polling priority, or 0 for no polling at all. * @return the polling priority, or 0 for no polling at all.
*/ */
unsigned char getPollPriority() const { return m_pollPriority; } size_t getPollPriority() const { return m_pollPriority; }
/** /**
* Set the polling priority. * Set the polling priority.
* @param priority the polling priority, or 0 for no polling at all. * @param priority the polling priority, or 0 for no polling at all.
* @return true when the priority was changed and polling was not enabled before, false otherwise. * @return true when the priority was changed and polling was not enabled before, false otherwise.
*/ */
bool setPollPriority(unsigned char priority); bool setPollPriority(size_t priority);
/** /**
* Set the poll priority suitable for resolving a @a Condition. * Set the poll priority suitable for resolving a @a Condition.
@@ -416,7 +416,7 @@ class Message {
/** /**
* @return the number of parts this message is composed of. * @return the number of parts this message is composed of.
*/ */
virtual unsigned char getCount() { return 1; } virtual size_t getCount() { return 1; }
/** /**
* Prepare the master @a SymbolString for sending a query or command to the bus. * Prepare the master @a SymbolString for sending a query or command to the bus.
@@ -428,9 +428,9 @@ class Message {
* @param index the index of the part to prepare. * @param index the index of the part to prepare.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
result_t prepareMaster(const unsigned char srcAddress, MasterSymbolString& master, result_t prepareMaster(const symbol_t srcAddress, MasterSymbolString& master,
istringstream& input, char separator = UI_FIELD_SEPARATOR, istringstream& input, char separator = UI_FIELD_SEPARATOR,
const unsigned char dstAddress = SYN, unsigned char index = 0); const symbol_t dstAddress = SYN, size_t index = 0);
protected: protected:
@@ -443,7 +443,7 @@ class Message {
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator, virtual result_t prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator,
unsigned char index); size_t index);
public: public:
@@ -469,7 +469,7 @@ class Message {
* @param index the index of the part to store. * @param index the index of the part to store.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t storeLastData(MasterSymbolString& data, unsigned char index); virtual result_t storeLastData(MasterSymbolString& data, size_t index);
/** /**
* Store last seen slave data. * Store last seen slave data.
@@ -477,7 +477,7 @@ class Message {
* @param index the index of the part to store. * @param index the index of the part to store.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t storeLastData(SlaveSymbolString& data, unsigned char index); virtual result_t storeLastData(SlaveSymbolString& data, size_t index);
/** /**
* Decode the value from the last stored master data. * Decode the value from the last stored master data.
@@ -489,7 +489,7 @@ class Message {
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t decodeLastMasterData(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); bool leadingSeparator = false, const char* fieldName = NULL, ssize_t fieldIndex = -1);
/** /**
* Decode the value from the last stored slave data. * Decode the value from the last stored slave data.
@@ -501,7 +501,7 @@ class Message {
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t decodeLastSlaveData(ostringstream& output, OutputFormat outputFormat = 0, virtual result_t decodeLastSlaveData(ostringstream& output, OutputFormat outputFormat = 0,
bool leadingSeparator = false, const char* fieldName = NULL, signed char fieldIndex = -1); bool leadingSeparator = false, const char* fieldName = NULL, ssize_t fieldIndex = -1);
/** /**
* Decode the value from the last stored data. * Decode the value from the last stored data.
@@ -513,7 +513,7 @@ class Message {
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t decodeLastData(ostringstream& output, OutputFormat outputFormat = 0, virtual result_t decodeLastData(ostringstream& output, OutputFormat outputFormat = 0,
bool leadingSeparator = false, const char* fieldName = NULL, signed char fieldIndex = -1); bool leadingSeparator = false, const char* fieldName = NULL, ssize_t fieldIndex = -1);
/** /**
* Decode a particular numeric field value from the last stored data. * Decode a particular numeric field value from the last stored data.
@@ -522,7 +522,7 @@ class Message {
* @param fieldIndex the optional index of the named field, or -1. * @param fieldIndex the optional index of the named field, or -1.
* @return @a RESULT_OK on success, or an error code. * @return @a RESULT_OK on success, or an error code.
*/ */
virtual result_t decodeLastDataNumField(unsigned int& output, const char* fieldName, signed char fieldIndex = -1); virtual result_t decodeLastDataNumField(unsigned int& output, const char* fieldName, ssize_t fieldIndex = -1);
/** /**
* Get the last seen master data. * Get the last seen master data.
@@ -599,13 +599,13 @@ class Message {
const string m_comment; const string m_comment;
/** the source address, or @a SYN for any (only relevant if passive). */ /** the source address, or @a SYN for any (only relevant if passive). */
const unsigned char m_srcAddress; const symbol_t m_srcAddress;
/** the destination address, or @a SYN for any (only for temporary scan messages). */ /** the destination address, or @a SYN for any (only for temporary scan messages). */
const unsigned char m_dstAddress; const symbol_t m_dstAddress;
/** the primary, secondary, and optionally further command ID bytes. */ /** the primary, secondary, and optionally further command ID bytes. */
vector<unsigned char> m_id; vector<symbol_t> m_id;
/** /**
* the key for storing in @a MessageMap. * the key for storing in @a MessageMap.
@@ -637,7 +637,7 @@ class Message {
const bool m_deleteData; const bool m_deleteData;
/** the priority for polling, or 0 for no polling at all. */ /** the priority for polling, or 0 for no polling at all. */
unsigned char m_pollPriority; size_t m_pollPriority;
/** whether this message is used by a @a Condition. */ /** whether this message is used by a @a Condition. */
bool m_usedByCondition; bool m_usedByCondition;
@@ -692,47 +692,47 @@ class ChainedMessage : public Message {
*/ */
ChainedMessage(const string circuit, const string level, const string name, ChainedMessage(const string circuit, const string level, const string name,
const bool isWrite, const string comment, const bool isWrite, const string comment,
const unsigned char srcAddress, const unsigned char dstAddress, const symbol_t srcAddress, const symbol_t dstAddress,
const vector<unsigned char> id, const vector<symbol_t> id,
vector< vector<unsigned char> > ids, vector<unsigned char> lengths, vector< vector<symbol_t> > ids, vector<size_t> lengths,
DataField* data, const bool deleteData, DataField* data, const bool deleteData,
const unsigned char pollPriority, const size_t pollPriority,
Condition* condition = NULL); Condition* condition = NULL);
virtual ~ChainedMessage(); virtual ~ChainedMessage();
// @copydoc // @copydoc
virtual Message* derive(const unsigned char dstAddress, const unsigned char srcAddress = SYN, virtual Message* derive(const symbol_t dstAddress, const symbol_t srcAddress = SYN,
const string circuit = ""); const string circuit = "") override;
// @copydoc // @copydoc
virtual unsigned char getIdLength() const { return (unsigned char)(m_ids[0].size() - 2); } virtual size_t getIdLength() const override { return m_ids[0].size() - 2; }
// @copydoc // @copydoc
virtual bool checkId(MasterSymbolString& master, unsigned char* index = NULL); virtual bool checkId(MasterSymbolString& master, size_t* index = NULL) override;
// @copydoc // @copydoc
virtual bool checkId(Message& other); virtual bool checkId(Message& other) override;
// @copydoc // @copydoc
virtual unsigned char getCount() { return (unsigned char)m_ids.size(); } virtual size_t getCount() override { return m_ids.size(); }
protected: protected:
// @copydoc // @copydoc
virtual result_t prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator, virtual result_t prepareMasterPart(MasterSymbolString& master, istringstream& input, char separator,
unsigned char index); size_t index) override;
public: public:
// @copydoc // @copydoc
virtual result_t storeLastData(MasterSymbolString& master, SlaveSymbolString& slave); virtual result_t storeLastData(MasterSymbolString& master, SlaveSymbolString& slave) override;
// @copydoc // @copydoc
virtual result_t storeLastData(MasterSymbolString& data, unsigned char index); virtual result_t storeLastData(MasterSymbolString& data, size_t index) override;
// @copydoc // @copydoc
virtual result_t storeLastData(SlaveSymbolString& data, unsigned char index); virtual result_t storeLastData(SlaveSymbolString& data, size_t index) override;
/** /**
* Combine all last stored data. * Combine all last stored data.
@@ -742,15 +742,15 @@ class ChainedMessage : public Message {
protected: protected:
// @copydoc // @copydoc
virtual void dumpColumn(ostream& output, column_t column, bool withConditions = false); virtual void dumpColumn(ostream& output, column_t column, bool withConditions = false) override;
private: private:
/** the primary, secondary, and optional further ID bytes for each part of the chain. */ /** the primary, secondary, and optional further ID bytes for each part of the chain. */
const vector< vector<unsigned char> > m_ids; const vector< vector<symbol_t> > m_ids;
/** the data length for each part of the chain. */ /** the data length for each part of the chain. */
const vector<unsigned char> m_lengths; const vector<size_t> m_lengths;
/** the maximum allowed time difference of any data pair. */ /** the maximum allowed time difference of any data pair. */
const time_t m_maxTimeDiff; const time_t m_maxTimeDiff;
@@ -899,7 +899,7 @@ class SimpleCondition : public Condition {
* @param hasValues whether a value has to be checked against. * @param hasValues whether a value has to be checked against.
*/ */
SimpleCondition(const string condName, const string refName, const string circuit, const string level, SimpleCondition(const string condName, const string refName, const string circuit, const string level,
const string name, const unsigned char dstAddress, const string field, const bool hasValues = false) const string name, const symbol_t dstAddress, const string field, const bool hasValues = false)
: Condition(), : Condition(),
m_condName(condName), m_refName(refName), m_circuit(circuit), m_level(level), m_name(name), m_condName(condName), m_refName(refName), m_circuit(circuit), m_level(level), m_name(name),
m_dstAddress(dstAddress), m_field(field), m_hasValues(hasValues), m_message(NULL) { } m_dstAddress(dstAddress), m_field(field), m_hasValues(hasValues), m_message(NULL) { }
@@ -910,20 +910,20 @@ class SimpleCondition : public Condition {
virtual ~SimpleCondition() {} virtual ~SimpleCondition() {}
// @copydoc // @copydoc
virtual SimpleCondition* derive(string valueList); virtual SimpleCondition* derive(string valueList) override;
// @copydoc // @copydoc
virtual void dump(ostream& output, bool matched = false); virtual void dump(ostream& output, bool matched = false) override;
// @copydoc // @copydoc
virtual CombinedCondition* combineAnd(Condition* other); virtual CombinedCondition* combineAnd(Condition* other) override;
// @copydoc // @copydoc
virtual result_t resolve(MessageMap* messages, ostringstream& errorMessage, virtual result_t resolve(MessageMap* messages, ostringstream& errorMessage,
void (*readMessageFunc)(Message* message) = NULL); void (*readMessageFunc)(Message* message) = NULL) override;
// @copydoc // @copydoc
virtual bool isTrue(); virtual bool isTrue() override;
/** /**
* Return whether the condition is based on a numeric value. * Return whether the condition is based on a numeric value.
@@ -963,7 +963,7 @@ class SimpleCondition : public Condition {
/** the override destination address, or @a SYN (only for @a Message without specific destination as well as scan /** the override destination address, or @a SYN (only for @a Message without specific destination as well as scan
* message). */ * message). */
const unsigned char m_dstAddress; const symbol_t m_dstAddress;
/** the field name, or empty for first field. */ /** the field name, or empty for first field. */
const string m_field; const string m_field;
@@ -993,7 +993,7 @@ class SimpleNumericCondition : public SimpleCondition {
* @param valueRanges the valid value ranges (pairs of from/to inclusive), empty for @a m_message seen check. * @param valueRanges the valid value ranges (pairs of from/to inclusive), empty for @a m_message seen check.
*/ */
SimpleNumericCondition(const string condName, const string refName, const string circuit, const string level, SimpleNumericCondition(const string condName, const string refName, const string circuit, const string level,
const string name, const unsigned char dstAddress, const string field, const vector<unsigned int> valueRanges) const string name, const symbol_t dstAddress, const string field, const vector<unsigned int> valueRanges)
: SimpleCondition(condName, refName, circuit, level, name, dstAddress, field, true), : SimpleCondition(condName, refName, circuit, level, name, dstAddress, field, true),
m_valueRanges(valueRanges) { } m_valueRanges(valueRanges) { }
@@ -1005,7 +1005,7 @@ class SimpleNumericCondition : public SimpleCondition {
protected: protected:
// @copydoc // @copydoc
virtual bool checkValue(Message* message, const string field); virtual bool checkValue(Message* message, const string field) override;
private: private:
@@ -1031,7 +1031,7 @@ class SimpleStringCondition : public SimpleCondition {
* @param values the valid values. * @param values the valid values.
*/ */
SimpleStringCondition(const string condName, const string refName, const string circuit, const string level, SimpleStringCondition(const string condName, const string refName, const string circuit, const string level,
const string name, const unsigned char dstAddress, const string field, const vector<string> values) const string name, const symbol_t dstAddress, const string field, const vector<string> values)
: SimpleCondition(condName, refName, circuit, level, name, dstAddress, field, true), : SimpleCondition(condName, refName, circuit, level, name, dstAddress, field, true),
m_values(values) { } m_values(values) { }
@@ -1041,12 +1041,12 @@ class SimpleStringCondition : public SimpleCondition {
virtual ~SimpleStringCondition() {} virtual ~SimpleStringCondition() {}
// @copydoc // @copydoc
virtual bool isNumeric() { return false; } virtual bool isNumeric() override { return false; }
protected: protected:
// @copydoc // @copydoc
virtual bool checkValue(Message* message, const string field); virtual bool checkValue(Message* message, const string field) override;
private: private:
@@ -1072,17 +1072,17 @@ class CombinedCondition : public Condition {
virtual ~CombinedCondition() {} virtual ~CombinedCondition() {}
// @copydoc // @copydoc
virtual void dump(ostream& output, bool matched = false); virtual void dump(ostream& output, bool matched = false) override;
// @copydoc // @copydoc
virtual CombinedCondition* combineAnd(Condition* other) { m_conditions.push_back(other); return this; } virtual CombinedCondition* combineAnd(Condition* other) override { m_conditions.push_back(other); return this; }
// @copydoc // @copydoc
virtual result_t resolve(MessageMap* messages, ostringstream& errorMessage, virtual result_t resolve(MessageMap* messages, ostringstream& errorMessage,
void (*readMessageFunc)(Message* message) = NULL); void (*readMessageFunc)(Message* message) = NULL) override;
// @copydoc // @copydoc
virtual bool isTrue(); virtual bool isTrue() override;
private: private:
@@ -1209,7 +1209,7 @@ class LoadInstruction : public Instruction {
virtual ~LoadInstruction() { } virtual ~LoadInstruction() { }
// @copydoc // @copydoc
virtual result_t execute(MessageMap* messages, ostringstream& log, Condition* condition); virtual result_t execute(MessageMap* messages, ostringstream& log, Condition* condition) override;
private: private:
@@ -1252,7 +1252,7 @@ class MessageMap : public FileReader {
// @copydoc // @copydoc
virtual result_t addDefaultFromFile(vector< vector<string> >& defaults, vector<string>& row, virtual result_t addDefaultFromFile(vector< vector<string> >& defaults, vector<string>& row,
vector<string>::iterator& begin, string defaultDest, string defaultCircuit, string defaultSuffix, vector<string>::iterator& begin, string defaultDest, string defaultCircuit, string defaultSuffix,
const string& filename, unsigned int lineNo); const string& filename, unsigned int lineNo) override;
/** /**
* Read the @a Condition instance(s) from the types field. * Read the @a Condition instance(s) from the types field.
@@ -1266,14 +1266,14 @@ class MessageMap : public FileReader {
// @copydoc // @copydoc
virtual result_t addFromFile(vector<string>::iterator& begin, const vector<string>::iterator end, virtual result_t addFromFile(vector<string>::iterator& begin, const vector<string>::iterator end,
vector< vector<string> >* defaults, const string& defaultDest, const string& defaultCircuit, vector< vector<string> >* defaults, const string& defaultDest, const string& defaultCircuit,
const string& defaultSuffix, const string& filename, unsigned int lineNo); const string& defaultSuffix, const string& filename, unsigned int lineNo) override;
/** /**
* Get the scan @a Message instance for the specified address. * Get the scan @a Message instance for the specified address.
* @param dstAddress the destination address, or @a SYN for the base scan @a Message. * @param dstAddress the destination address, or @a SYN for the base scan @a Message.
* @return the scan @a Message instance, or NULL if the dstAddress is no slave. * @return the scan @a Message instance, or NULL if the dstAddress is no slave.
*/ */
Message* getScanMessage(const unsigned char dstAddress = SYN); Message* getScanMessage(const symbol_t dstAddress = SYN);
/** /**
* Resolve all @a Condition instances. * Resolve all @a Condition instances.
@@ -1305,7 +1305,7 @@ class MessageMap : public FileReader {
* @param file the name of the file from which a configuration part was loaded for the participant. * @param file the name of the file from which a configuration part was loaded for the participant.
* @param comment an optional comment. * @param comment an optional comment.
*/ */
void addLoadedFile(unsigned char address, string file, string comment); void addLoadedFile(symbol_t address, string file, string comment);
/** /**
* Get the loaded files for a participant. * Get the loaded files for a participant.
@@ -1313,7 +1313,7 @@ class MessageMap : public FileReader {
* @return the name of the file(s) loaded for the participant (separated by comma and enclosed in double quotes), * @return the name of the file(s) loaded for the participant (separated by comma and enclosed in double quotes),
* or empty. * or empty.
*/ */
string getLoadedFiles(unsigned char address); string getLoadedFiles(symbol_t address);
/** /**
* Get the stored @a Message instances for the key. * Get the stored @a Message instances for the key.
@@ -1452,10 +1452,10 @@ class MessageMap : public FileReader {
Message* m_scanMessage; Message* m_scanMessage;
/** the loaded configuration files by slave address. */ /** the loaded configuration files by slave address. */
map<unsigned char, string> m_loadedFiles; map<symbol_t, string> m_loadedFiles;
/** the maximum ID length used by any of the known @a Message instances. */ /** the maximum ID length used by any of the known @a Message instances. */
unsigned char m_maxIdLength; size_t m_maxIdLength;
/** the number of distinct @a Message instances stored in @a m_messagesByName. */ /** the number of distinct @a Message instances stored in @a m_messagesByName. */
size_t m_messageCount; size_t m_messageCount;
+24 -25
View File
@@ -34,7 +34,7 @@ using std::setfill;
/** /**
* CRC8 lookup table for the polynom 0x9b = x^8 + x^7 + x^4 + x^3 + x^1 + 1. * CRC8 lookup table for the polynom 0x9b = x^8 + x^7 + x^4 + x^3 + x^1 + 1.
*/ */
static const unsigned char CRC_LOOKUP_TABLE[] = { static const symbol_t CRC_LOOKUP_TABLE[] = {
0x00, 0x9b, 0xad, 0x36, 0xc1, 0x5a, 0x6c, 0xf7, 0x19, 0x82, 0xb4, 0x2f, 0xd8, 0x43, 0x75, 0xee, 0x00, 0x9b, 0xad, 0x36, 0xc1, 0x5a, 0x6c, 0xf7, 0x19, 0x82, 0xb4, 0x2f, 0xd8, 0x43, 0x75, 0xee,
0x32, 0xa9, 0x9f, 0x04, 0xf3, 0x68, 0x5e, 0xc5, 0x2b, 0xb0, 0x86, 0x1d, 0xea, 0x71, 0x47, 0xdc, 0x32, 0xa9, 0x9f, 0x04, 0xf3, 0x68, 0x5e, 0xc5, 0x2b, 0xb0, 0x86, 0x1d, 0xea, 0x71, 0x47, 0xdc,
0x64, 0xff, 0xc9, 0x52, 0xa5, 0x3e, 0x08, 0x93, 0x7d, 0xe6, 0xd0, 0x4b, 0xbc, 0x27, 0x11, 0x8a, 0x64, 0xff, 0xc9, 0x52, 0xa5, 0x3e, 0x08, 0x93, 0x7d, 0xe6, 0xd0, 0x4b, 0xbc, 0x27, 0x11, 0x8a,
@@ -55,7 +55,7 @@ static const unsigned char CRC_LOOKUP_TABLE[] = {
unsigned int parseInt(const char* str, int base, const unsigned int minValue, const unsigned int maxValue, unsigned int parseInt(const char* str, int base, const unsigned int minValue, const unsigned int maxValue,
result_t& result, unsigned int* length) { result_t& result, size_t* length) {
char* strEnd = NULL; char* strEnd = NULL;
unsigned long ret = strtoul(str, &strEnd, base); unsigned long ret = strtoul(str, &strEnd, base);
@@ -77,7 +77,7 @@ unsigned int parseInt(const char* str, int base, const unsigned int minValue, co
} }
int parseSignedInt(const char* str, int base, const int minValue, const int maxValue, result_t& result, int parseSignedInt(const char* str, int base, const int minValue, const int maxValue, result_t& result,
unsigned int* length) { size_t* length) {
char* strEnd = NULL; char* strEnd = NULL;
long ret = strtol(str, &strEnd, base); long ret = strtol(str, &strEnd, base);
@@ -99,14 +99,14 @@ int parseSignedInt(const char* str, int base, const int minValue, const int maxV
} }
void SymbolString::updateCrc(unsigned char& crc, const unsigned char value) { void SymbolString::updateCrc(symbol_t& crc, const symbol_t value) {
crc = CRC_LOOKUP_TABLE[crc]^value; crc = CRC_LOOKUP_TABLE[crc]^value;
} }
result_t SymbolString::parseHex(const string& str) { result_t SymbolString::parseHex(const string& str) {
result_t result; result_t result;
for (size_t i = 0; i < str.size(); i += 2) { for (size_t i = 0; i < str.size(); i += 2) {
unsigned char value = (unsigned char)parseInt(str.substr(i, 2).c_str(), 16, 0, 0xff, result); symbol_t value = (symbol_t)parseInt(str.substr(i, 2).c_str(), 16, 0, 0xff, result);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -119,7 +119,7 @@ result_t SymbolString::parseHexEscaped(const string& str) {
result_t result; result_t result;
bool inEscape = false; bool inEscape = false;
for (size_t i = 0; i < str.size(); i += 2) { for (size_t i = 0; i < str.size(); i += 2) {
unsigned char value = (unsigned char)parseInt(str.substr(i, 2).c_str(), 16, 0, 0xff, result); symbol_t value = (symbol_t)parseInt(str.substr(i, 2).c_str(), 16, 0, 0xff, result);
if (result != RESULT_OK) { if (result != RESULT_OK) {
return result; return result;
} }
@@ -144,24 +144,23 @@ result_t SymbolString::parseHexEscaped(const string& str) {
return inEscape ? RESULT_ERR_ESC : RESULT_OK; return inEscape ? RESULT_ERR_ESC : RESULT_OK;
} }
const string SymbolString::getDataStr(unsigned char skipFirstSymbols) { const string SymbolString::getStr(size_t skipFirstSymbols) {
ostringstream sstr; ostringstream sstr;
for (size_t i = 0; i < m_data.size(); i++) { for (size_t i = 0; i < m_data.size(); i++) {
if (skipFirstSymbols > 0) { if (skipFirstSymbols > 0) {
skipFirstSymbols--; skipFirstSymbols--;
} else { } else {
unsigned char value = m_data[i];
sstr << nouppercase << setw(2) << hex sstr << nouppercase << setw(2) << hex
<< setfill('0') << static_cast<unsigned>(value); << setfill('0') << static_cast<unsigned>(m_data[i]);
} }
} }
return sstr.str(); return sstr.str();
} }
unsigned char SymbolString::calcCrc() const { symbol_t SymbolString::calcCrc() const {
unsigned char crc = 0; symbol_t crc = 0;
for (size_t i = 0; i < m_data.size(); i++) { for (size_t i = 0; i < m_data.size(); i++) {
unsigned char value = m_data[i]; symbol_t value = m_data[i];
if (value == ESC) { if (value == ESC) {
updateCrc(crc, ESC); updateCrc(crc, ESC);
updateCrc(crc, 0x00); updateCrc(crc, 0x00);
@@ -181,7 +180,7 @@ unsigned char SymbolString::calcCrc() const {
* @param bits the upper or lower 4 bits of the address. * @param bits the upper or lower 4 bits of the address.
* @return the 1-based index of the upper or lower 4 bits of a master address (1 to 5), or 0. * @return the 1-based index of the upper or lower 4 bits of a master address (1 to 5), or 0.
*/ */
unsigned char getMasterPartIndex(unsigned char bits) { unsigned int getMasterPartIndex(symbol_t bits) {
switch (bits) { switch (bits) {
case 0x0: case 0x0:
return 1; return 1;
@@ -198,18 +197,18 @@ unsigned char getMasterPartIndex(unsigned char bits) {
} }
} }
bool isMaster(unsigned char addr) { bool isMaster(symbol_t addr) {
return getMasterPartIndex(addr & 0x0F) > 0 return getMasterPartIndex(addr & 0x0F) > 0
&& getMasterPartIndex((addr & 0xF0)>>4) > 0; && getMasterPartIndex((addr & 0xF0)>>4) > 0;
} }
bool isSlaveMaster(unsigned char addr) { bool isSlaveMaster(symbol_t addr) {
return isMaster((unsigned char)(addr+256-5)); return isMaster((symbol_t)(addr+256-5));
} }
unsigned char getSlaveAddress(unsigned char addr) { symbol_t getSlaveAddress(symbol_t addr) {
if (isMaster(addr)) { if (isMaster(addr)) {
return (unsigned char)(addr+5); return (symbol_t)(addr+5);
} }
if (isValidAddress(addr, false)) { if (isValidAddress(addr, false)) {
return addr; return addr;
@@ -217,30 +216,30 @@ unsigned char getSlaveAddress(unsigned char addr) {
return SYN; return SYN;
} }
unsigned char getMasterAddress(unsigned char addr) { symbol_t getMasterAddress(symbol_t addr) {
if (isMaster(addr)) { if (isMaster(addr)) {
return addr; return addr;
} }
addr = (unsigned char)(addr+256-5); addr = (symbol_t)(addr+256-5);
if (isMaster(addr)) { if (isMaster(addr)) {
return addr; return addr;
} }
return SYN; return SYN;
} }
unsigned char getMasterNumber(unsigned char addr) { unsigned int getMasterNumber(symbol_t addr) {
unsigned char priority = getMasterPartIndex(addr & 0x0F); unsigned int priority = getMasterPartIndex(addr & 0x0F);
if (priority == 0) { if (priority == 0) {
return 0; return 0;
} }
unsigned char index = getMasterPartIndex((addr & 0xF0) >> 4); unsigned int index = getMasterPartIndex((addr & 0xF0) >> 4);
if (index == 0) { if (index == 0) {
return 0; return 0;
} }
return (unsigned char)(5*(priority-1) + index); return 5*(priority-1) + index;
} }
bool isValidAddress(unsigned char addr, bool allowBroadcast) { bool isValidAddress(symbol_t addr, bool allowBroadcast) {
return addr != SYN && addr != ESC && (allowBroadcast || addr != BROADCAST); return addr != SYN && addr != ESC && (allowBroadcast || addr != BROADCAST);
} }
+46 -30
View File
@@ -68,6 +68,9 @@ namespace ebusd {
using std::string; using std::string;
using std::vector; using std::vector;
/** the base type for symbols sent to/from the eBUS. */
typedef unsigned char symbol_t;
/** escape symbol, either followed by 0x00 for the value 0xA9, or 0x01 for the value 0xAA. */ /** escape symbol, either followed by 0x00 for the value 0xA9, or 0x01 for the value 0xAA. */
#define ESC 0xA9 #define ESC 0xA9
@@ -94,7 +97,7 @@ using std::vector;
* @return the parsed value. * @return the parsed value.
*/ */
unsigned int parseInt(const char* str, int base, const unsigned int minValue, const unsigned int maxValue, unsigned int parseInt(const char* str, int base, const unsigned int minValue, const unsigned int maxValue,
result_t& result, unsigned int* length = NULL); result_t& result, size_t* length = NULL);
/** /**
* Parse a signed int value. * Parse a signed int value.
@@ -107,7 +110,7 @@ unsigned int parseInt(const char* str, int base, const unsigned int minValue, co
* @return the parsed value. * @return the parsed value.
*/ */
int parseSignedInt(const char* str, int base, const int minValue, const int maxValue, result_t& result, int parseSignedInt(const char* str, int base, const int minValue, const int maxValue, result_t& result,
unsigned int* length = NULL); size_t* length = NULL);
/** /**
* A string of unescaped bus symbols. * A string of unescaped bus symbols.
@@ -126,7 +129,13 @@ class SymbolString {
* @param crc the current CRC to update. * @param crc the current CRC to update.
* @param value the escaped value to add to the current CRC. * @param value the escaped value to add to the current CRC.
*/ */
static void updateCrc(unsigned char& crc, const unsigned char value); static void updateCrc(symbol_t& crc, const symbol_t value);
/**
* Return whether this instance if for the master part.
* @return whether this instance if for the master part.
*/
bool isMaster() const { return m_isMaster; }
/** /**
* Parse the hex @a string and add all symbols. * Parse the hex @a string and add all symbols.
@@ -147,14 +156,14 @@ class SymbolString {
* @param skipFirstSymbols the number of first symbols to skip. * @param skipFirstSymbols the number of first symbols to skip.
* @return the symbols as hex string. * @return the symbols as hex string.
*/ */
const string getDataStr(unsigned char skipFirstSymbols = 0); const string getStr(size_t skipFirstSymbols = 0);
/** /**
* Return a reference to the symbol at the specified index. * Return a reference to the symbol at the specified index.
* @param index the index of the symbol to return. * @param index the index of the symbol to return.
* @return the reference to the symbol at the specified index. * @return the reference to the symbol at the specified index.
*/ */
unsigned char& operator[](const size_t index) { symbol_t& operator[](const size_t index) {
if (index >= m_data.size()) { if (index >= m_data.size()) {
m_data.resize(index+1, 0); m_data.resize(index+1, 0);
} }
@@ -209,37 +218,44 @@ class SymbolString {
* Append a symbol to the end of the symbol string. * Append a symbol to the end of the symbol string.
* @param value the symbol to append. * @param value the symbol to append.
*/ */
void push_back(const unsigned char value) { m_data.push_back(value); } void push_back(const symbol_t value) { m_data.push_back(value); }
/** /**
* Return the number of symbols in this symbol string. * Return the number of symbols in this symbol string.
* @return the number of available symbols. * @return the number of available symbols.
*/ */
unsigned char size() const { return (unsigned char)m_data.size(); } size_t size() const { return m_data.size(); }
/** /**
* Return the offset to the first data byte DD. * Return the offset to the first data byte DD.
* @return the offset to the first data byte DD. * @return the offset to the first data byte DD.
*/ */
unsigned char getDataOffset() const { return m_isMaster ? 5 : 1; } size_t getDataOffset() const { return m_isMaster ? 5 : 1; }
/** /**
* Return the number of data bytes DD. * Return the number of effectively available data bytes DD.
* @return the number of data bytes DD. * @return the number of effectively available data bytes DD.
*/ */
unsigned char getDataSize() const { return m_data.size() > (m_isMaster ? 4 : 0) ? m_data[m_isMaster ? 4 : 0] : 0; } size_t getDataSize() const {
size_t lengthOffset = (m_isMaster ? 4 : 0);
/** if (m_data.size() <= lengthOffset) {
* Return the data byte at the specified index (within DD). return 0;
* @param index the index of the data byte to return (0 up to NN excluding).
* @return the data byte at the specified index, or @a SYN if not available.
*/
unsigned char getDataAt(const size_t index) {
size_t offset = m_isMaster ? 5 : 1;
if (offset+index >= m_data.size()) {
return SYN;
} }
return m_data[offset+index]; size_t ret = m_data[lengthOffset];
return m_data.size() < lengthOffset + 1 + ret ? m_data.size() - lengthOffset - 1 : ret;
}
/**
* Return a reference to the data byte at the specified index (within DD).
* @param index the index of the data byte (within DD) to return.
* @return the reference to the data byte at the specified index.
*/
symbol_t& dataAt(const size_t index) {
size_t offset = (m_isMaster ? 5 : 1) + index;
if (offset >= m_data.size()) {
m_data.resize(offset+1, 0);
}
return m_data[offset];
} }
/** /**
@@ -258,7 +274,7 @@ class SymbolString {
* Calculate the CRC. * Calculate the CRC.
* @return the calculated CRC. * @return the calculated CRC.
*/ */
unsigned char calcCrc() const; symbol_t calcCrc() const;
/** /**
* Clear the symbols. * Clear the symbols.
@@ -275,7 +291,7 @@ class SymbolString {
: m_data(str.m_data), m_isMaster(str.m_isMaster) {} : m_data(str.m_data), m_isMaster(str.m_isMaster) {}
/** the string of unescaped symbols. */ /** the string of unescaped symbols. */
vector<unsigned char> m_data; vector<symbol_t> m_data;
/** whether this instance if for the master part. */ /** whether this instance if for the master part. */
bool m_isMaster; bool m_isMaster;
@@ -311,14 +327,14 @@ class SlaveSymbolString : public SymbolString {
* @param addr the address to check. * @param addr the address to check.
* @return <code>true</code> if the specified address is a master address. * @return <code>true</code> if the specified address is a master address.
*/ */
bool isMaster(unsigned char addr); bool isMaster(symbol_t addr);
/** /**
* Return whether the address is a slave address of one of the 25 masters. * Return whether the address is a slave address of one of the 25 masters.
* @param addr the address to check. * @param addr the address to check.
* @return <code>true</code> if the specified address is a slave address of a master. * @return <code>true</code> if the specified address is a slave address of a master.
*/ */
bool isSlaveMaster(unsigned char addr); bool isSlaveMaster(symbol_t addr);
/** /**
* Return the slave address associated with the specified address (master or slave). * Return the slave address associated with the specified address (master or slave).
@@ -326,7 +342,7 @@ bool isSlaveMaster(unsigned char addr);
* @return the slave address, or SYN if the specified address is neither a master address nor a slave address of a * @return the slave address, or SYN if the specified address is neither a master address nor a slave address of a
* master. * master.
*/ */
unsigned char getSlaveAddress(unsigned char addr); symbol_t getSlaveAddress(symbol_t addr);
/** /**
* Return the master address associated with the specified address (master or slave). * Return the master address associated with the specified address (master or slave).
@@ -334,14 +350,14 @@ unsigned char getSlaveAddress(unsigned char addr);
* @return the master address, or SYN if the specified address is neither a master address nor a slave address of a * @return the master address, or SYN if the specified address is neither a master address nor a slave address of a
* master. * master.
*/ */
unsigned char getMasterAddress(unsigned char addr); symbol_t getMasterAddress(symbol_t addr);
/** /**
* Return the number of the master if the address is a valid bus address. * Return the number of the master if the address is a valid bus address.
* @param addr the bus address. * @param addr the bus address.
* @return the number of the master if the address is a valid bus address (1 to 25), or 0. * @return the number of the master if the address is a valid bus address (1 to 25), or 0.
*/ */
unsigned char getMasterNumber(unsigned char addr); unsigned int getMasterNumber(symbol_t addr);
/** /**
* Return whether the address is a valid bus address. * Return whether the address is a valid bus address.
@@ -349,7 +365,7 @@ unsigned char getMasterNumber(unsigned char addr);
* @param allowBroadcast whether to also allow @a addr to be the broadcast address (default true). * @param allowBroadcast whether to also allow @a addr to be the broadcast address (default true).
* @return <code>true</code> if the specified address is a valid bus address. * @return <code>true</code> if the specified address is a valid bus address.
*/ */
bool isValidAddress(unsigned char addr, bool allowBroadcast = true); bool isValidAddress(symbol_t addr, bool allowBroadcast = true);
} // namespace ebusd } // namespace ebusd
+10 -13
View File
@@ -564,22 +564,20 @@ int main() {
ostringstream output; ostringstream output;
MasterSymbolString writeMstr; MasterSymbolString writeMstr;
result = writeMstr.parseHex(mstr.getDataStr().substr(0, 10)); result = writeMstr.parseHex(mstr.getStr().substr(0, 10));
if (result != RESULT_OK) { if (result != RESULT_OK) {
cout << " parse \"" << mstr.getDataStr().substr(0, 10) << "\" error: " << getResultCode(result) cout << " parse \"" << mstr.getStr().substr(0, 10) << "\" error: " << getResultCode(result) << endl;
<< endl;
error = true; error = true;
} }
SlaveSymbolString writeSstr; SlaveSymbolString writeSstr;
result = writeSstr.parseHex(sstr.getDataStr().substr(0, 2)); result = writeSstr.parseHex(sstr.getStr().substr(0, 2));
if (result != RESULT_OK) { if (result != RESULT_OK) {
cout << " parse \"" << sstr.getDataStr().substr(0, 2) << "\" error: " << getResultCode(result) cout << " parse \"" << sstr.getStr().substr(0, 2) << "\" error: " << getResultCode(result) << endl;
<< endl;
error = true; error = true;
} }
result = fields->read(pt_masterData, mstr, 0, output, verbosity|(numeric?OF_NUMERIC:0), -1, false); result = fields->read(mstr, 0, output, verbosity|(numeric?OF_NUMERIC:0), -1, false);
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
result = fields->read(pt_slaveData, sstr, 0, output, verbosity|(numeric?OF_NUMERIC:0), -1, result = fields->read(sstr, 0, output, verbosity|(numeric?OF_NUMERIC:0), -1,
!output.str().empty()); !output.str().empty());
} }
if (failedRead) { if (failedRead) {
@@ -602,9 +600,9 @@ int main() {
if (verbosity == 0) { if (verbosity == 0) {
istringstream input(expectStr); istringstream input(expectStr);
result = fields->write(input, pt_masterData, writeMstr, 0); result = fields->write(input, writeMstr, 0);
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
result = fields->write(input, pt_slaveData, writeSstr, 0); result = fields->write(input, writeSstr, 0);
} }
if (failedWrite) { if (failedWrite) {
if (result >= RESULT_OK) { if (result >= RESULT_OK) {
@@ -621,9 +619,8 @@ int main() {
error = true; error = true;
} else { } else {
bool match = mstr == writeMstr && sstr == writeSstr; bool match = mstr == writeMstr && sstr == writeSstr;
verify(failedWriteMatch, "write", expectStr, match, mstr.getDataStr() + " " verify(failedWriteMatch, "write", expectStr, match, mstr.getStr() + " " + sstr.getStr(),
+ sstr.getDataStr(), writeMstr.getDataStr() + " " writeMstr.getStr() + " " + writeSstr.getStr());
+ writeSstr.getDataStr());
} }
} }
delete fields; delete fields;
+1 -1
View File
@@ -39,7 +39,7 @@ int main() {
int count = 0; int count = 0;
while (1) { while (1) {
unsigned char byte = 0; symbol_t byte = 0;
result = device->recv(0, byte); result = device->recv(0, byte);
if (result == RESULT_OK) { if (result == RESULT_OK) {
+2 -3
View File
@@ -399,7 +399,7 @@ int main() {
if (message->isPassive() || decode) { if (message->isPassive() || decode) {
ostringstream output; ostringstream output;
for (unsigned char index = 0; index < message->getCount(); index++) { for (size_t index = 0; index < message->getCount(); index++) {
message->storeLastData(*mstrs[index], *sstrs[index]); message->storeLastData(*mstrs[index], *sstrs[index]);
} }
if (withMessageDump && !decodeJson) { if (withMessageDump && !decodeJson) {
@@ -438,8 +438,7 @@ int main() {
cout << " \"" << inputStr << "\": prepare OK" << endl; cout << " \"" << inputStr << "\": prepare OK" << endl;
bool match = writeMstr == *mstrs[0]; bool match = writeMstr == *mstrs[0];
verify(failedPrepareMatch, "prepare", inputStr, match, mstrs[0]->getDataStr(), verify(failedPrepareMatch, "prepare", inputStr, match, mstrs[0]->getStr(), writeMstr.getStr());
writeMstr.getDataStr());
} }
} }
+5 -5
View File
@@ -59,7 +59,7 @@ int main(int argc, char** argv) {
if (result != RESULT_OK) { if (result != RESULT_OK) {
cout << "parse escaped error: " << getResultCode(result) << endl; cout << "parse escaped error: " << getResultCode(result) << endl;
} else { } else {
unsigned char gotCrc = mstr.calcCrc(); symbol_t gotCrc = mstr.calcCrc();
cout << "calculated CRC: 0x" cout << "calculated CRC: 0x"
<< nouppercase << setw(2) << hex << setfill('0') << nouppercase << setw(2) << hex << setfill('0')
<< static_cast<unsigned>(gotCrc) << endl; << static_cast<unsigned>(gotCrc) << endl;
@@ -73,9 +73,9 @@ int main(int argc, char** argv) {
cout << "parse unescaped error: " << getResultCode(result) << endl; cout << "parse unescaped error: " << getResultCode(result) << endl;
error = true; error = true;
} else { } else {
gotStr = mstr.getDataStr(), expectStr = "10feb5050427a915aa"; gotStr = mstr.getStr(), expectStr = "10feb5050427a915aa";
verify(false, "parse unescaped", "10feb5050427a915aa", true, expectStr, gotStr); verify(false, "parse unescaped", "10feb5050427a915aa", true, expectStr, gotStr);
unsigned char gotCrc = mstr.calcCrc(), expectCrc = 0x77; symbol_t gotCrc = mstr.calcCrc(), expectCrc = 0x77;
ostringstream ostr; ostringstream ostr;
ostr << nouppercase << setw(2) << hex << setfill('0') << static_cast<unsigned>(expectCrc); ostr << nouppercase << setw(2) << hex << setfill('0') << static_cast<unsigned>(expectCrc);
expectStr = ostr.str(); expectStr = ostr.str();
@@ -91,7 +91,7 @@ int main(int argc, char** argv) {
cout << "parse escaped error: " << getResultCode(result) << endl; cout << "parse escaped error: " << getResultCode(result) << endl;
error = true; error = true;
} else { } else {
gotStr = mstr.getDataStr(), expectStr = "10feb5050427a915aa"; gotStr = mstr.getStr(), expectStr = "10feb5050427a915aa";
verify(false, "parse escaped", "10feb5050427a90015a901", true, expectStr, gotStr); verify(false, "parse escaped", "10feb5050427a90015a901", true, expectStr, gotStr);
ostringstream ostr; ostringstream ostr;
ostr << dec << static_cast<unsigned>(4); ostr << dec << static_cast<unsigned>(4);
@@ -108,7 +108,7 @@ int main(int argc, char** argv) {
cout << "parse escaped error: " << getResultCode(result) << endl; cout << "parse escaped error: " << getResultCode(result) << endl;
error = true; error = true;
} else { } else {
gotStr = sstr.getDataStr(), expectStr = "0427a915aa"; gotStr = sstr.getStr(), expectStr = "0427a915aa";
verify(false, "parse escaped", "0427a90015a901", true, expectStr, gotStr); verify(false, "parse escaped", "0427a90015a901", true, expectStr, gotStr);
ostringstream ostr; ostringstream ostr;
ostr << dec << static_cast<unsigned>(4); ostr << dec << static_cast<unsigned>(4);
+1 -1
View File
@@ -160,7 +160,7 @@ int main(int argc, char* argv[]) {
fstream file(opt.dumpFile, ios::in | ios::binary); fstream file(opt.dumpFile, ios::in | ios::binary);
if (file.is_open()) { if (file.is_open()) {
while (true) { while (true) {
unsigned char byte = (unsigned char)file.get(); symbol_t byte = (symbol_t)file.get();
if (file.eof()) { if (file.eof()) {
break; break;
} }