void CDMRNetwork::clock(unsigned int ms) { if (m_status == WAITING_CONNECT) { m_retryTimer.clock(ms); if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) { bool ret = m_socket.open(); if (ret) { ret = writeLogin(); if (!ret) return; m_status = WAITING_LOGIN; m_timeoutTimer.start(); } m_retryTimer.start(); } return; } in_addr address; unsigned int port; int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, port); if (length < 0) { LogError("DMR, Socket has failed, retrying connection to the master"); close(); open(); return; } // if (m_debug && length > 0) // CUtils::dump(1U, "Network Received", m_buffer, length); if (length > 0 && m_address.s_addr == address.s_addr && m_port == port) { if (::memcmp(m_buffer, "DMRD", 4U) == 0) { if (m_enabled) { if (m_debug) CUtils::dump(1U, "Network Received", m_buffer, length); unsigned char len = length; m_rxData.addData(&len, 1U); m_rxData.addData(m_buffer, len); } } else if (::memcmp(m_buffer, "MSTNAK", 6U) == 0) { if (m_status == RUNNING) { LogWarning("DMR, The master is restarting, logging back in"); m_status = WAITING_LOGIN; m_timeoutTimer.start(); m_retryTimer.start(); } else { /* Once the modem death spiral has been prevented in Modem.cpp the Network sometimes times out and reaches here. We want it to reconnect so... */ LogError("DMR, Login to the master has failed, retrying ..."); close(); open(); return; } } else if (::memcmp(m_buffer, "RPTACK", 6U) == 0) { switch (m_status) { case WAITING_LOGIN: ::memcpy(m_salt, m_buffer + 6U, sizeof(uint32_t)); writeAuthorisation(); m_status = WAITING_AUTHORISATION; m_timeoutTimer.start(); m_retryTimer.start(); break; case WAITING_AUTHORISATION: if (m_options.empty()) { writeConfig(); m_status = WAITING_CONFIG; } else { writeOptions(); m_status = WAITING_OPTIONS; } m_timeoutTimer.start(); m_retryTimer.start(); break; case WAITING_OPTIONS: writeConfig(); m_status = WAITING_CONFIG; m_timeoutTimer.start(); m_retryTimer.start(); break; case WAITING_CONFIG: LogMessage("DMR, Logged into the master successfully"); m_status = RUNNING; m_timeoutTimer.start(); m_retryTimer.start(); break; default: break; } } else if (::memcmp(m_buffer, "MSTCL", 5U) == 0) { LogError("DMR, Master is closing down"); close(); open(); } else if (::memcmp(m_buffer, "MSTPONG", 7U) == 0) { m_timeoutTimer.start(); } else if (::memcmp(m_buffer, "RPTSBKN", 7U) == 0) { m_beacon = true; } else { CUtils::dump("Unknown packet from the master", m_buffer, length); } } m_retryTimer.clock(ms); if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) { switch (m_status) { case WAITING_LOGIN: writeLogin(); break; case WAITING_AUTHORISATION: writeAuthorisation(); break; case WAITING_OPTIONS: writeOptions(); break; case WAITING_CONFIG: writeConfig(); break; case RUNNING: writePing(); break; default: break; } m_retryTimer.start(); } m_timeoutTimer.clock(ms); if (m_timeoutTimer.isRunning() && m_timeoutTimer.hasExpired()) { LogError("DMR, Connection to the master has timed out, retrying connection"); close(); open(); } }
void CDMRIPSC::clock(unsigned int ms) { in_addr address; unsigned int port; int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, port); if (length < 0) { LogError("Socket has failed, retrying connection"); close(); open(); return; } // if (m_debug && length > 0) // CUtils::dump(1U, "IPSC Received", m_buffer, length); if (length > 0 && m_address.s_addr == address.s_addr && m_port == port) { if (::memcmp(m_buffer, "DMRD", 4U) == 0) { if (m_enabled) { if (m_debug) CUtils::dump(1U, "IPSC Received", m_buffer, length); unsigned char len = length; m_rxData.addData(&len, 1U); m_rxData.addData(m_buffer, len); } } else if (::memcmp(m_buffer, "MSTNAK", 6U) == 0) { if (m_status == RUNNING) { LogWarning("The master is restarting, logging back in"); m_status = WAITING_LOGIN; m_timeoutTimer.start(); m_retryTimer.start(); m_pingTimer.stop(); } else { LogError("Login to the master has failed"); m_status = DISCONNECTED; m_timeoutTimer.stop(); m_retryTimer.stop(); m_pingTimer.stop(); } } else if (::memcmp(m_buffer, "RPTACK", 6U) == 0) { switch (m_status) { case WAITING_LOGIN: ::memcpy(m_salt, m_buffer + 6U, sizeof(uint32_t)); writeAuthorisation(); m_status = WAITING_AUTHORISATION; m_timeoutTimer.start(); m_retryTimer.start(); break; case WAITING_AUTHORISATION: writeConfig(); m_status = WAITING_CONFIG; m_timeoutTimer.start(); m_retryTimer.start(); break; case WAITING_CONFIG: LogMessage("Logged into the master successfully"); m_status = RUNNING; m_timeoutTimer.start(); m_retryTimer.stop(); m_pingTimer.start(); break; default: break; } } else if (::memcmp(m_buffer, "MSTCL", 5U) == 0) { LogError("Master is closing down"); close(); open(); } else if (::memcmp(m_buffer, "MSTPONG", 7U) == 0) { m_timeoutTimer.start(); } else if (::memcmp(m_buffer, "RPTSBKN", 7U) == 0) { m_beacon = true; } else { CUtils::dump("Unknown packet from the master", m_buffer, length); } } if (m_status != RUNNING) { m_retryTimer.clock(ms); if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) { switch (m_status) { case WAITING_LOGIN: writeLogin(); break; case WAITING_AUTHORISATION: writeAuthorisation(); break; case WAITING_CONFIG: writeConfig(); break; default: break; } m_retryTimer.start(); } } else { m_pingTimer.clock(ms); if (m_pingTimer.isRunning() && m_pingTimer.hasExpired()) { writePing(); m_pingTimer.start(); } } m_timeoutTimer.clock(ms); if (m_timeoutTimer.isRunning() && m_timeoutTimer.hasExpired()) { LogError("Connection to the master has timed out, retrying connection"); close(); open(); } }