Skip to content

Commit

Permalink
Merged in bugfix/modbus/MTM-31190 (pull request #18)
Browse files Browse the repository at this point in the history
[MTM-31190][fix]mbbase.cc: Make the addAddress() not rely on the order of SrTemplate received messages

Approved-by: Özge Akin
Approved-by: Torsten Schmidt
  • Loading branch information
rina23q committed Mar 12, 2020
2 parents 469571e + c45d6d5 commit fff4225
Showing 1 changed file with 43 additions and 5 deletions.
48 changes: 43 additions & 5 deletions src/modbus/mbbase.cc
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,52 @@ void ModbusModel::addAddress(uint8_t type, uint16_t addr)
break;
}

if (pm->empty() || pm->back().second + 1 < addr || pm->back().first + limit < addr + 1)
{
if (pm->empty()) {
pm->emplace_back(addr, addr);
return;
}
else
{
pm->back().second = addr;

// Make a pair (start addr, end addr) to queue
for(auto itr = pm->begin(); itr != pm->end(); ++itr) {
if (itr->first <= addr && addr <= itr->second){
// addr is within the pair's address range
return;
} else if (itr->second + 1 == itr->first + limit) {
// The pair's address range is already limit
continue;
} else if (itr->second + 2 == itr->first + limit) {
// The pair's address range will be limit after extension
if (addr + 1 == itr->first) {
itr->first = addr;
return;
} else if (addr == itr->second + 1) {
itr->second = addr;
return;
}
} else if (addr + 1 == itr->first) {
itr->first = addr;
for(auto i = pm->begin(); i != pm->end(); ++i) {
// Extend the pair's address range with another consecutive pair
if (addr == i->second + 1) {
itr->first = i->first;
pm->erase(i);
break;
}
}
return;
} else if (addr == itr->second + 1){
itr->second = addr;
for(auto i = pm->begin(); i != pm->end(); ++i) {
if (addr + 1 == i->first) {
itr->second = i->second;
pm->erase(i);
break;
}
}
return;
}
}
pm->emplace_back(addr, addr);
}

int ModbusBase::readCO(int addr, int nb, uint8_t *dest)
Expand Down

0 comments on commit fff4225

Please sign in to comment.