diff --git a/DMR2YSF/DMR2YSF.cpp b/DMR2YSF/DMR2YSF.cpp index 5490f83..8037c9b 100644 --- a/DMR2YSF/DMR2YSF.cpp +++ b/DMR2YSF/DMR2YSF.cpp @@ -677,7 +677,7 @@ int CDMR2YSF::run() // Net frame counter m_ysfFrame[34U] = (ysf_cnt & 0x7FU) << 1; - // Send data to MMDVMHost + // Send data m_ysfNetwork->write(m_ysfFrame); ysf_cnt++; @@ -769,6 +769,84 @@ std::string CDMR2YSF::getSrcYSF(const unsigned char* buffer) return trimmed; } +void CDMR2YSF::sendYSFConn(unsigned int id) +{ + unsigned char data[] = {0x00U, 0x5DU, 0x23U, 0x5FU, 0x24U, 0x20U, 0x20U, 0x20U, 0x20U, + 0x20U, 0x20U, 0x20U, 0x20U, 0x20U, 0x20U, 0x03U, 0x00U, 0x00U, + 0x00U, 0x00U}; + + if (id > 99999U) + return; + + sprintf((char*) (data + 5U), "%05u", id); + data[16U] = CCRC::addCRC(data, 16U); + + // Setup net header + ::memcpy(m_ysfFrame + 0U, "YSFD", 4U); + ::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH); + ::memcpy(m_ysfFrame + 14U, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); + ::memcpy(m_ysfFrame + 24U, "ALL ", YSF_CALLSIGN_LENGTH); + m_ysfFrame[34U] = 0U; + + CSync::addYSFSync(m_ysfFrame + 35U); + + // Set the FICH + CYSFFICH fich; + fich.setFI(YSF_FI_COMMUNICATIONS); + fich.setCS(2U); + fich.setFN(1U); + fich.setFT(1U); + fich.setDev(0U); + fich.setMR(2U); + fich.setDT(YSF_DT_DATA_FR_MODE); + fich.setSQL(0U); + fich.setSQ(0U); + fich.encode(m_ysfFrame + 35U); + + CYSFPayload payload; + payload.writeDataFRModeData2(data, m_ysfFrame + 35U); + + m_ysfNetwork->write(m_ysfFrame); + + LogMessage("Sending YSF connect command to reflector ID: %u", id); +} + +void CDMR2YSF::sendYSFDisc() +{ + unsigned char data[] = {0x00U, 0x5DU, 0x2AU, 0x5FU, 0x24U, 0x20U, 0x20U, 0x20U, 0x20U, + 0x20U, 0x20U, 0x20U, 0x20U, 0x20U, 0x20U, 0x03U, 0x4DU, 0x00U, + 0x00U, 0x00U}; + + // Setup net header + ::memcpy(m_ysfFrame + 0U, "YSFD", 4U); + ::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH); + ::memcpy(m_ysfFrame + 14U, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); + ::memcpy(m_ysfFrame + 24U, "ALL ", YSF_CALLSIGN_LENGTH); + m_ysfFrame[34U] = 0U; + + CSync::addYSFSync(m_ysfFrame + 35U); + + // Set the FICH + CYSFFICH fich; + fich.setFI(YSF_FI_COMMUNICATIONS); + fich.setCS(2U); + fich.setFN(1U); + fich.setFT(1U); + fich.setDev(0U); + fich.setMR(2U); + fich.setDT(YSF_DT_DATA_FR_MODE); + fich.setSQL(0U); + fich.setSQ(0U); + fich.encode(m_ysfFrame + 35U); + + CYSFPayload payload; + payload.writeDataFRModeData2(data, m_ysfFrame + 35U); + + m_ysfNetwork->write(m_ysfFrame); + + LogMessage("Sending YSF disconnect command"); +} + bool CDMR2YSF::createMMDVM() { std::string rptAddress = m_conf.getDMRRptAddress(); diff --git a/DMR2YSF/DMR2YSF.h b/DMR2YSF/DMR2YSF.h index 54db7c5..7ee54ad 100644 --- a/DMR2YSF/DMR2YSF.h +++ b/DMR2YSF/DMR2YSF.h @@ -80,6 +80,8 @@ private: unsigned int findYSFID(std::string cs, bool showdst); std::string getSrcYSF(const unsigned char* source); + void sendYSFConn(unsigned int id); + void sendYSFDisc(); bool createMMDVM(); };