Handle relinking cleanly.

This commit is contained in:
Jonathan Naylor 2016-10-11 22:46:28 +01:00
parent 820fd5471a
commit ce94d72fc6

View File

@ -267,7 +267,12 @@ void CP25Gateway::run()
srcId |= (buffer[3U] << 0) & 0x0000FFU; srcId |= (buffer[3U] << 0) & 0x0000FFU;
if (dstId != currentId) { if (dstId != currentId) {
if (dstId == 9999U) { CP25Reflector* reflector = NULL;
if (dstId != 9999U)
reflector = reflectors.find(dstId);
// If we're unlinking or changing reflectors, unlink from the current one
if (dstId == 9999U || reflector != NULL) {
std::string callsign = lookup->find(srcId); std::string callsign = lookup->find(srcId);
LogMessage("Unlinked from reflector %u by %s", currentId, callsign.c_str()); LogMessage("Unlinked from reflector %u by %s", currentId, callsign.c_str());
currentId = dstId; currentId = dstId;
@ -279,23 +284,23 @@ void CP25Gateway::run()
pollTimer.stop(); pollTimer.stop();
lostTimer.stop(); lostTimer.stop();
} }
} else { }
CP25Reflector* reflector = reflectors.find(dstId);
if (reflector != NULL) {
currentId = dstId;
currentAddr = reflector->m_address;
currentPort = reflector->m_port;
std::string callsign = lookup->find(srcId); // Link to the new reflector
LogMessage("Linked to reflector %u by %s", currentId, callsign.c_str()); if (reflector != NULL) {
currentId = dstId;
currentAddr = reflector->m_address;
currentPort = reflector->m_port;
if (remoteNetwork != NULL) { std::string callsign = lookup->find(srcId);
remoteNetwork->writePoll(currentAddr, currentPort); LogMessage("Linked to reflector %u by %s", currentId, callsign.c_str());
remoteNetwork->writePoll(currentAddr, currentPort);
remoteNetwork->writePoll(currentAddr, currentPort); if (remoteNetwork != NULL) {
pollTimer.start(); remoteNetwork->writePoll(currentAddr, currentPort);
lostTimer.start(); remoteNetwork->writePoll(currentAddr, currentPort);
} remoteNetwork->writePoll(currentAddr, currentPort);
pollTimer.start();
lostTimer.start();
} }
} }
} }