mirror of
				https://github.com/ShaYmez/MMDVM_CM.git
				synced 2025-11-04 05:00:20 -05:00 
			
		
		
		
	
						commit
						56f669af70
					
				@ -20,6 +20,6 @@
 | 
				
			|||||||
#if !defined(VERSION_H)
 | 
					#if !defined(VERSION_H)
 | 
				
			||||||
#define	VERSION_H
 | 
					#define	VERSION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* VERSION = "20180809";
 | 
					const char* VERSION = "20200503";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -33,6 +33,9 @@
 | 
				
			|||||||
const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00};
 | 
					const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00};
 | 
				
			||||||
const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08};
 | 
					const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Added by AD8DP for FICH FT=6 transmissions
 | 
				
			||||||
 | 
					const uint8_t dt1[10] = {0x01, 0x22, 0x61, 0x5f, 0x2b, 0x03, 0x11, 0x00, 0x00, 0x00};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const unsigned char CONN_RESP[] = {0x5DU, 0x41U, 0x5FU, 0x26U};
 | 
					const unsigned char CONN_RESP[] = {0x5DU, 0x41U, 0x5FU, 0x26U};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DMR_FRAME_PER       55U
 | 
					#define DMR_FRAME_PER       55U
 | 
				
			||||||
@ -48,6 +51,7 @@ const char* HEADER1 = "This software is for use on amateur radio networks only,"
 | 
				
			|||||||
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
 | 
					const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
 | 
				
			||||||
const char* HEADER3 = "commercial networks is strictly prohibited.";
 | 
					const char* HEADER3 = "commercial networks is strictly prohibited.";
 | 
				
			||||||
const char* HEADER4 = "Copyright(C) 2018 by CA6JAU, G4KLX and others";
 | 
					const char* HEADER4 = "Copyright(C) 2018 by CA6JAU, G4KLX and others";
 | 
				
			||||||
 | 
					const char ysf_radioid[] = {'H', '5', '0', '0', '0'};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <functional>
 | 
					#include <functional>
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
@ -649,17 +653,22 @@ int CDMR2YSF::run()
 | 
				
			|||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				fich.setFI(YSF_FI_HEADER);
 | 
									fich.setFI(YSF_FI_HEADER);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
									fich.setBN(0U);
 | 
				
			||||||
 | 
									fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(0U);
 | 
									fich.setFN(0U);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(2U);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
				fich.encode(m_ysfFrame + 35U);
 | 
									fich.encode(m_ysfFrame + 35U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned char csd1[20U], csd2[20U];
 | 
									unsigned char csd1[20U], csd2[20U];
 | 
				
			||||||
				memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
									memset(csd1, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
				memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
									memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -685,17 +694,22 @@ int CDMR2YSF::run()
 | 
				
			|||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				fich.setFI(YSF_FI_TERMINATOR);
 | 
									fich.setFI(YSF_FI_TERMINATOR);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
									fich.setBN(0U);
 | 
				
			||||||
 | 
									fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(0U);
 | 
									fich.setFN(0U);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(2U);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
				fich.encode(m_ysfFrame + 35U);
 | 
									fich.encode(m_ysfFrame + 35U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned char csd1[20U], csd2[20U];
 | 
									unsigned char csd1[20U], csd2[20U];
 | 
				
			||||||
				memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
									memset(csd1, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
				memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
									memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -708,8 +722,9 @@ int CDMR2YSF::run()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				CYSFPayload ysfPayload;
 | 
									CYSFPayload ysfPayload;
 | 
				
			||||||
 | 
									unsigned char dch[10U];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned int fn = (ysf_cnt - 1U) % 8U;
 | 
									unsigned int fn = (ysf_cnt - 1U) % 7U;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				::memcpy(m_ysfFrame + 0U, "YSFD", 4U);
 | 
									::memcpy(m_ysfFrame + 0U, "YSFD", 4U);
 | 
				
			||||||
				::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH);
 | 
									::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
@ -721,7 +736,9 @@ int CDMR2YSF::run()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				switch (fn) {
 | 
									switch (fn) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"**********");
 | 
											memset(dch, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
											memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str());
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str());
 | 
				
			||||||
@ -729,11 +746,16 @@ int CDMR2YSF::run()
 | 
				
			|||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str());
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str());
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
 | 
										case 5:
 | 
				
			||||||
 | 
											memset(dch, ' ', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
											memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch);	// Rem3/4
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
					case 6:
 | 
										case 6:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, gps_buffer);
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 7:
 | 
										case 7:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, gps_buffer+10U);
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2_temp);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					default:
 | 
										default:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"          ");
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"          ");
 | 
				
			||||||
@ -742,10 +764,14 @@ int CDMR2YSF::run()
 | 
				
			|||||||
				// Set the FICH
 | 
									// Set the FICH
 | 
				
			||||||
				fich.setFI(YSF_FI_COMMUNICATIONS);
 | 
									fich.setFI(YSF_FI_COMMUNICATIONS);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
									fich.setBN(0U);
 | 
				
			||||||
 | 
									fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(fn);
 | 
									fich.setFN(fn);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(YSF_MR_BUSY);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
 | 
				
			|||||||
@ -20,6 +20,6 @@
 | 
				
			|||||||
#if !defined(VERSION_H)
 | 
					#if !defined(VERSION_H)
 | 
				
			||||||
#define	VERSION_H
 | 
					#define	VERSION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* VERSION = "20181008";
 | 
					const char* VERSION = "20200503";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -232,6 +232,12 @@ void CYSFFICH::setCS(unsigned char cs)
 | 
				
			|||||||
	m_fich[0U] |= (cs << 4) & 0x30U;
 | 
						m_fich[0U] |= (cs << 4) & 0x30U;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CYSFFICH::setCM(unsigned char cm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						m_fich[0U] &= 0xF3U;
 | 
				
			||||||
 | 
						m_fich[0U] |= (cm << 2) & 0x0CU;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CYSFFICH::setFN(unsigned char fn)
 | 
					void CYSFFICH::setFN(unsigned char fn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_fich[1U] &= 0xC7U;
 | 
						m_fich[1U] &= 0xC7U;
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	void setFI(unsigned char fi);
 | 
						void setFI(unsigned char fi);
 | 
				
			||||||
	void setCS(unsigned char cs);
 | 
						void setCS(unsigned char cs);
 | 
				
			||||||
 | 
						void setCM(unsigned char cm);
 | 
				
			||||||
	void setFN(unsigned char fn);
 | 
						void setFN(unsigned char fn);
 | 
				
			||||||
	void setFT(unsigned char ft);
 | 
						void setFT(unsigned char ft);
 | 
				
			||||||
	void setBN(unsigned char bn);
 | 
						void setBN(unsigned char bn);
 | 
				
			||||||
 | 
				
			|||||||
@ -20,6 +20,7 @@
 | 
				
			|||||||
#if !defined(VERSION_H)
 | 
					#if !defined(VERSION_H)
 | 
				
			||||||
#define	VERSION_H
 | 
					#define	VERSION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* VERSION = "20180923";
 | 
					const char* VERSION = "20200503";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -20,6 +20,6 @@
 | 
				
			|||||||
#if !defined(VERSION_H)
 | 
					#if !defined(VERSION_H)
 | 
				
			||||||
#define	VERSION_H
 | 
					#define	VERSION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* VERSION = "20190204";
 | 
					const char* VERSION = "20200503";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -635,9 +635,10 @@ void CWiresX::sendDXReply()
 | 
				
			|||||||
		sprintf(buf, "%05d", m_dstID);
 | 
							sprintf(buf, "%05d", m_dstID);
 | 
				
			||||||
		::memcpy(data + 36U, buf, 5U);
 | 
							::memcpy(data + 36U, buf, 5U);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if (m_dstID > 99999U)
 | 
							//if (m_dstID > 99999U)
 | 
				
			||||||
			sprintf(buf1, "CALL %d", m_dstID);
 | 
							//	sprintf(buf1, "CALL %d", m_dstID);
 | 
				
			||||||
		else if (m_dstID == 9U)
 | 
							//else if (m_dstID == 9U)
 | 
				
			||||||
 | 
							if (m_dstID == 9U)
 | 
				
			||||||
			strcpy(buf1, "LOCAL");
 | 
								strcpy(buf1, "LOCAL");
 | 
				
			||||||
		else if (m_dstID == 9990U)
 | 
							else if (m_dstID == 9990U)
 | 
				
			||||||
			strcpy(buf1, "PARROT");
 | 
								strcpy(buf1, "PARROT");
 | 
				
			||||||
@ -721,9 +722,10 @@ void CWiresX::sendConnectReply(unsigned int dstID)
 | 
				
			|||||||
	sprintf(buf, "%05d", m_dstID);
 | 
						sprintf(buf, "%05d", m_dstID);
 | 
				
			||||||
	::memcpy(data + 36U, buf, 5U);
 | 
						::memcpy(data + 36U, buf, 5U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (m_dstID > 99999U)
 | 
						//if (m_dstID > 99999U)
 | 
				
			||||||
		sprintf(buf1, "CALL %d", m_dstID);
 | 
						//	sprintf(buf1, "CALL %d", m_dstID);
 | 
				
			||||||
	else if (m_dstID == 9U)
 | 
						//else if (m_dstID == 9U)
 | 
				
			||||||
 | 
						if (m_dstID == 9U)
 | 
				
			||||||
		strcpy(buf1, "LOCAL");
 | 
							strcpy(buf1, "LOCAL");
 | 
				
			||||||
	else if (m_dstID == 9990U)
 | 
						else if (m_dstID == 9990U)
 | 
				
			||||||
		strcpy(buf1, "PARROT");
 | 
							strcpy(buf1, "PARROT");
 | 
				
			||||||
 | 
				
			|||||||
@ -33,6 +33,7 @@
 | 
				
			|||||||
// DT1 and DT2, suggested by Manuel EA7EE
 | 
					// DT1 and DT2, suggested by Manuel EA7EE
 | 
				
			||||||
const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00};
 | 
					const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00};
 | 
				
			||||||
const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08};
 | 
					const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08};
 | 
				
			||||||
 | 
					const uint8_t dt1[10] = {0x01, 0x22, 0x61, 0x5f, 0x2b, 0x03, 0x11, 0x00, 0x00, 0x00};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DMR_FRAME_PER       55U
 | 
					#define DMR_FRAME_PER       55U
 | 
				
			||||||
#define YSF_FRAME_PER       90U
 | 
					#define YSF_FRAME_PER       90U
 | 
				
			||||||
@ -50,6 +51,7 @@ const char* HEADER1 = "This software is for use on amateur radio networks only,"
 | 
				
			|||||||
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
 | 
					const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
 | 
				
			||||||
const char* HEADER3 = "commercial networks is strictly prohibited.";
 | 
					const char* HEADER3 = "commercial networks is strictly prohibited.";
 | 
				
			||||||
const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, EA7EE, G4KLX and others";
 | 
					const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, EA7EE, G4KLX and others";
 | 
				
			||||||
 | 
					const char ysf_radioid[] = {'H', '5', '0', '0', '0'};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <functional>
 | 
					#include <functional>
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
@ -942,13 +944,17 @@ int CYSF2DMR::run()
 | 
				
			|||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				fich.setFI(YSF_FI_HEADER);
 | 
									fich.setFI(YSF_FI_HEADER);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(0U);
 | 
									fich.setFN(0U);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
					 				fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(false);
 | 
									fich.setSQL(false);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
				fich.setMR(2U);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (m_remoteGateway) {
 | 
									if (m_remoteGateway) {
 | 
				
			||||||
					fich.setVoIP(false);
 | 
										fich.setVoIP(false);
 | 
				
			||||||
@ -961,7 +967,8 @@ int CYSF2DMR::run()
 | 
				
			|||||||
				fich.encode(m_ysfFrame + 35U);
 | 
									fich.encode(m_ysfFrame + 35U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned char csd1[20U], csd2[20U];
 | 
									unsigned char csd1[20U], csd2[20U];
 | 
				
			||||||
				memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
									memset(csd1, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 				memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
				memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
									memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -986,13 +993,17 @@ int CYSF2DMR::run()
 | 
				
			|||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				fich.setFI(YSF_FI_TERMINATOR);
 | 
									fich.setFI(YSF_FI_TERMINATOR);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(0U);
 | 
									fich.setFN(0U);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
					 				fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(false);
 | 
									fich.setSQL(false);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
				fich.setMR(2U);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (m_remoteGateway) {
 | 
									if (m_remoteGateway) {
 | 
				
			||||||
					fich.setVoIP(false);
 | 
										fich.setVoIP(false);
 | 
				
			||||||
@ -1005,7 +1016,8 @@ int CYSF2DMR::run()
 | 
				
			|||||||
				fich.encode(m_ysfFrame + 35U);
 | 
									fich.encode(m_ysfFrame + 35U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned char csd1[20U], csd2[20U];
 | 
									unsigned char csd1[20U], csd2[20U];
 | 
				
			||||||
				memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
									memset(csd1, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 				memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
				memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
									memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1017,8 +1029,9 @@ int CYSF2DMR::run()
 | 
				
			|||||||
			else if (ysfFrameType == TAG_DATA) {
 | 
								else if (ysfFrameType == TAG_DATA) {
 | 
				
			||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				CYSFPayload ysfPayload;
 | 
									CYSFPayload ysfPayload;
 | 
				
			||||||
 | 
									unsigned char dch[10U];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned int fn = (ysf_cnt - 1U) % 8U;
 | 
									unsigned int fn = (ysf_cnt - 1U) % 7U;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				::memcpy(m_ysfFrame + 0U, "YSFD", 4U);
 | 
									::memcpy(m_ysfFrame + 0U, "YSFD", 4U);
 | 
				
			||||||
				::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH);
 | 
									::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
@ -1030,7 +1043,9 @@ int CYSF2DMR::run()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				switch (fn) {
 | 
									switch (fn) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"**********");
 | 
											memset(dch, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 						memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str());
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str());
 | 
				
			||||||
@ -1038,11 +1053,16 @@ int CYSF2DMR::run()
 | 
				
			|||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str());
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str());
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
 | 
										case 5:
 | 
				
			||||||
 | 
					 						memset(dch, ' ', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 						memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch);	// Rem3/4
 | 
				
			||||||
 | 
					 						break;
 | 
				
			||||||
					case 6:
 | 
										case 6:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, gps_buffer);
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 7:
 | 
										case 7:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, gps_buffer+10U);
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2_temp);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					default:
 | 
										default:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"          ");
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"          ");
 | 
				
			||||||
@ -1051,9 +1071,14 @@ int CYSF2DMR::run()
 | 
				
			|||||||
				// Set the FICH
 | 
									// Set the FICH
 | 
				
			||||||
				fich.setFI(YSF_FI_COMMUNICATIONS);
 | 
									fich.setFI(YSF_FI_COMMUNICATIONS);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(fn);
 | 
									fich.setFN(fn);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
					 				fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(false);
 | 
									fich.setSQL(false);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
 | 
				
			|||||||
@ -20,6 +20,6 @@
 | 
				
			|||||||
#if !defined(VERSION_H)
 | 
					#if !defined(VERSION_H)
 | 
				
			||||||
#define	VERSION_H
 | 
					#define	VERSION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* VERSION = "20190204";
 | 
					const char* VERSION = "20200503";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -33,6 +33,7 @@
 | 
				
			|||||||
// DT1 and DT2, suggested by Manuel EA7EE
 | 
					// DT1 and DT2, suggested by Manuel EA7EE
 | 
				
			||||||
const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00};
 | 
					const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00};
 | 
				
			||||||
const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08};
 | 
					const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08};
 | 
				
			||||||
 | 
					const uint8_t dt1[10] = {0x01, 0x22, 0x61, 0x5f, 0x2b, 0x03, 0x11, 0x00, 0x00, 0x00};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NXDN_FRAME_PER      75U
 | 
					#define NXDN_FRAME_PER      75U
 | 
				
			||||||
#define YSF_FRAME_PER       90U
 | 
					#define YSF_FRAME_PER       90U
 | 
				
			||||||
@ -47,6 +48,7 @@ const char* HEADER1 = "This software is for use on amateur radio networks only,"
 | 
				
			|||||||
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
 | 
					const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
 | 
				
			||||||
const char* HEADER3 = "commercial networks is strictly prohibited.";
 | 
					const char* HEADER3 = "commercial networks is strictly prohibited.";
 | 
				
			||||||
const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, G4KLX and others";
 | 
					const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, G4KLX and others";
 | 
				
			||||||
 | 
					const char ysf_radioid[] = {'H', '5', '0', '0', '0'};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <functional>
 | 
					#include <functional>
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
@ -545,7 +547,8 @@ int CYSF2NXDN::run()
 | 
				
			|||||||
						::memcpy(gps_buffer + 10U, dt2_temp, 10U);
 | 
											::memcpy(gps_buffer + 10U, dt2_temp, 10U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						m_netSrc = m_lookup->findCS(srcId);
 | 
											m_netSrc = m_lookup->findCS(srcId);
 | 
				
			||||||
						m_netDst = m_lookup->findCS(dstId);
 | 
											//m_netDst = m_lookup->findCS(dstId);
 | 
				
			||||||
 | 
											m_netDst = "TG " + std::to_string(dstId);
 | 
				
			||||||
                                                LogMessage("Received NXDN Header: Src: %s Dst: %s", m_netSrc.c_str(), m_netDst.c_str());
 | 
					                                                LogMessage("Received NXDN Header: Src: %s Dst: %s", m_netSrc.c_str(), m_netDst.c_str());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						m_conv.putNXDNHeader();
 | 
											m_conv.putNXDNHeader();
 | 
				
			||||||
@ -604,17 +607,23 @@ int CYSF2NXDN::run()
 | 
				
			|||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				fich.setFI(YSF_FI_HEADER);
 | 
									fich.setFI(YSF_FI_HEADER);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(0U);
 | 
									fich.setFN(0U);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(2U);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
				fich.encode(m_ysfFrame + 35U);
 | 
									fich.encode(m_ysfFrame + 35U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned char csd1[20U], csd2[20U];
 | 
									unsigned char csd1[20U], csd2[20U];
 | 
				
			||||||
				memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
									memset(csd1, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
									//memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
									memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -639,17 +648,23 @@ int CYSF2NXDN::run()
 | 
				
			|||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				fich.setFI(YSF_FI_TERMINATOR);
 | 
									fich.setFI(YSF_FI_TERMINATOR);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(0U);
 | 
									fich.setFN(0U);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(2U);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
				fich.encode(m_ysfFrame + 35U);
 | 
									fich.encode(m_ysfFrame + 35U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned char csd1[20U], csd2[20U];
 | 
									unsigned char csd1[20U], csd2[20U];
 | 
				
			||||||
				memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
									memset(csd1, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 				memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
									//memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
									memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -661,8 +676,9 @@ int CYSF2NXDN::run()
 | 
				
			|||||||
			else if (ysfFrameType == TAG_DATA) {
 | 
								else if (ysfFrameType == TAG_DATA) {
 | 
				
			||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				CYSFPayload ysfPayload;
 | 
									CYSFPayload ysfPayload;
 | 
				
			||||||
 | 
									unsigned char dch[10U];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned int fn = (ysf_cnt - 1U) % 8U;
 | 
									unsigned int fn = (ysf_cnt - 1U) % 7U;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				::memcpy(m_ysfFrame + 0U, "YSFD", 4U);
 | 
									::memcpy(m_ysfFrame + 0U, "YSFD", 4U);
 | 
				
			||||||
				::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH);
 | 
									::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
@ -674,7 +690,10 @@ int CYSF2NXDN::run()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				switch (fn) {
 | 
									switch (fn) {
 | 
				
			||||||
					case 0:
 | 
										case 0:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"**********");
 | 
											memset(dch, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 						memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch);
 | 
				
			||||||
 | 
											//ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"**********");
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 1:
 | 
										case 1:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str());
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str());
 | 
				
			||||||
@ -682,11 +701,16 @@ int CYSF2NXDN::run()
 | 
				
			|||||||
					case 2:
 | 
										case 2:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str());
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str());
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
 | 
										case 5:
 | 
				
			||||||
 | 
					 						memset(dch, ' ', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 						memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch);	// Rem3/4
 | 
				
			||||||
 | 
					 						break;
 | 
				
			||||||
					case 6:
 | 
										case 6:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, gps_buffer);
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					case 7:
 | 
										case 7:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, gps_buffer + 10U);
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2_temp);
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					default:
 | 
										default:
 | 
				
			||||||
						ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"          ");
 | 
											ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"          ");
 | 
				
			||||||
@ -695,10 +719,14 @@ int CYSF2NXDN::run()
 | 
				
			|||||||
				// Set the FICH
 | 
									// Set the FICH
 | 
				
			||||||
				fich.setFI(YSF_FI_COMMUNICATIONS);
 | 
									fich.setFI(YSF_FI_COMMUNICATIONS);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(fn);
 | 
									fich.setFN(fn);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(YSF_MR_BUSY);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VD_MODE2);
 | 
									fich.setDT(YSF_DT_VD_MODE2);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
 | 
				
			|||||||
@ -232,6 +232,12 @@ void CYSFFICH::setCS(unsigned char cs)
 | 
				
			|||||||
	m_fich[0U] |= (cs << 4) & 0x30U;
 | 
						m_fich[0U] |= (cs << 4) & 0x30U;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CYSFFICH::setCM(unsigned char cm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						m_fich[0U] &= 0xF3U;
 | 
				
			||||||
 | 
						m_fich[0U] |= (cm << 2) & 0x0CU;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CYSFFICH::setFN(unsigned char fn)
 | 
					void CYSFFICH::setFN(unsigned char fn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_fich[1U] &= 0xC7U;
 | 
						m_fich[1U] &= 0xC7U;
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	void setFI(unsigned char fi);
 | 
						void setFI(unsigned char fi);
 | 
				
			||||||
	void setCS(unsigned char cs);
 | 
						void setCS(unsigned char cs);
 | 
				
			||||||
 | 
						void setCM(unsigned char cm);
 | 
				
			||||||
	void setFN(unsigned char fn);
 | 
						void setFN(unsigned char fn);
 | 
				
			||||||
	void setFT(unsigned char ft);
 | 
						void setFT(unsigned char ft);
 | 
				
			||||||
	void setBN(unsigned char bn);
 | 
						void setBN(unsigned char bn);
 | 
				
			||||||
 | 
				
			|||||||
@ -20,6 +20,6 @@
 | 
				
			|||||||
#if !defined(VERSION_H)
 | 
					#if !defined(VERSION_H)
 | 
				
			||||||
#define	VERSION_H
 | 
					#define	VERSION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* VERSION = "20190204";
 | 
					const char* VERSION = "20200503";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -92,6 +92,8 @@ const unsigned char REC73[] = {
 | 
				
			|||||||
const unsigned char REC80[] = {
 | 
					const unsigned char REC80[] = {
 | 
				
			||||||
	0x80U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U};
 | 
						0x80U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const uint8_t dt1[10] = {0x01, 0x22, 0x61, 0x5f, 0x2b, 0x03, 0x11, 0x00, 0x00, 0x00};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define P25_FRAME_PER       15U
 | 
					#define P25_FRAME_PER       15U
 | 
				
			||||||
#define YSF_FRAME_PER       90U
 | 
					#define YSF_FRAME_PER       90U
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -105,6 +107,7 @@ const char* HEADER1 = "This software is for use on amateur radio networks only,"
 | 
				
			|||||||
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
 | 
					const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
 | 
				
			||||||
const char* HEADER3 = "commercial networks is strictly prohibited.";
 | 
					const char* HEADER3 = "commercial networks is strictly prohibited.";
 | 
				
			||||||
const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, G4KLX and others";
 | 
					const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, G4KLX and others";
 | 
				
			||||||
 | 
					const char ysf_radioid[] = {'H', '5', '0', '0', '0'};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <functional>
 | 
					#include <functional>
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
@ -621,17 +624,22 @@ int CYSF2P25::run()
 | 
				
			|||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				fich.setFI(YSF_FI_HEADER);
 | 
									fich.setFI(YSF_FI_HEADER);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(0U);
 | 
									fich.setFN(0U);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(2U);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VOICE_FR_MODE);
 | 
									fich.setDT(YSF_DT_VOICE_FR_MODE);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
				fich.encode(m_ysfFrame + 35U);
 | 
									fich.encode(m_ysfFrame + 35U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned char csd1[20U], csd2[20U];
 | 
									unsigned char csd1[20U], csd2[20U];
 | 
				
			||||||
				memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
									memset(csd1, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 				memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
				memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
									memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -656,17 +664,22 @@ int CYSF2P25::run()
 | 
				
			|||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				fich.setFI(YSF_FI_TERMINATOR);
 | 
									fich.setFI(YSF_FI_TERMINATOR);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(0U);
 | 
									fich.setFN(0U);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(2U);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VOICE_FR_MODE);
 | 
									fich.setDT(YSF_DT_VOICE_FR_MODE);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
				fich.encode(m_ysfFrame + 35U);
 | 
									fich.encode(m_ysfFrame + 35U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				unsigned char csd1[20U], csd2[20U];
 | 
									unsigned char csd1[20U], csd2[20U];
 | 
				
			||||||
				memset(csd1, '*', YSF_CALLSIGN_LENGTH);
 | 
									memset(csd1, '*', YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
 | 
					 				memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2);
 | 
				
			||||||
				memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
									memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
				memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
									memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -679,8 +692,8 @@ int CYSF2P25::run()
 | 
				
			|||||||
			else if (ysfFrameType == TAG_DATA) {
 | 
								else if (ysfFrameType == TAG_DATA) {
 | 
				
			||||||
				CYSFFICH fich;
 | 
									CYSFFICH fich;
 | 
				
			||||||
				CYSFPayload ysfPayload;
 | 
									CYSFPayload ysfPayload;
 | 
				
			||||||
 | 
									//unsigned char dch[10U];
 | 
				
			||||||
				unsigned int fn = (ysf_cnt - 1U) % 1U;
 | 
									unsigned int fn = (ysf_cnt - 1U) % 7U;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				::memcpy(m_ysfFrame + 0U, "YSFD", 4U);
 | 
									::memcpy(m_ysfFrame + 0U, "YSFD", 4U);
 | 
				
			||||||
				::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH);
 | 
									::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH);
 | 
				
			||||||
@ -693,10 +706,14 @@ int CYSF2P25::run()
 | 
				
			|||||||
				// Set the FICH
 | 
									// Set the FICH
 | 
				
			||||||
				fich.setFI(YSF_FI_COMMUNICATIONS);
 | 
									fich.setFI(YSF_FI_COMMUNICATIONS);
 | 
				
			||||||
				fich.setCS(2U);
 | 
									fich.setCS(2U);
 | 
				
			||||||
 | 
									fich.setCM(1U);
 | 
				
			||||||
 | 
					 				fich.setBN(0U);
 | 
				
			||||||
 | 
					 				fich.setBT(0U);
 | 
				
			||||||
				fich.setFN(fn);
 | 
									fich.setFN(fn);
 | 
				
			||||||
				fich.setFT(7U);
 | 
									fich.setFT(6U);
 | 
				
			||||||
				fich.setDev(0U);
 | 
									fich.setDev(0U);
 | 
				
			||||||
				fich.setMR(YSF_MR_BUSY);
 | 
									fich.setMR(0U);
 | 
				
			||||||
 | 
									fich.setVoIP(false);
 | 
				
			||||||
				fich.setDT(YSF_DT_VOICE_FR_MODE);
 | 
									fich.setDT(YSF_DT_VOICE_FR_MODE);
 | 
				
			||||||
				fich.setSQL(0U);
 | 
									fich.setSQL(0U);
 | 
				
			||||||
				fich.setSQ(0U);
 | 
									fich.setSQ(0U);
 | 
				
			||||||
 | 
				
			|||||||
@ -232,6 +232,12 @@ void CYSFFICH::setCS(unsigned char cs)
 | 
				
			|||||||
	m_fich[0U] |= (cs << 4) & 0x30U;
 | 
						m_fich[0U] |= (cs << 4) & 0x30U;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CYSFFICH::setCM(unsigned char cm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						m_fich[0U] &= 0xF3U;
 | 
				
			||||||
 | 
						m_fich[0U] |= (cm << 2) & 0x0CU;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CYSFFICH::setFN(unsigned char fn)
 | 
					void CYSFFICH::setFN(unsigned char fn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_fich[1U] &= 0xC7U;
 | 
						m_fich[1U] &= 0xC7U;
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	void setFI(unsigned char fi);
 | 
						void setFI(unsigned char fi);
 | 
				
			||||||
	void setCS(unsigned char cs);
 | 
						void setCS(unsigned char cs);
 | 
				
			||||||
 | 
						void setCM(unsigned char cm);
 | 
				
			||||||
	void setFN(unsigned char fn);
 | 
						void setFN(unsigned char fn);
 | 
				
			||||||
	void setFT(unsigned char ft);
 | 
						void setFT(unsigned char ft);
 | 
				
			||||||
	void setBN(unsigned char bn);
 | 
						void setBN(unsigned char bn);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user