Revamping APRSIS spots to be more specific and properly controlled
This commit is contained in:
		
							parent
							
								
									eedd62cf0b
								
							
						
					
					
						commit
						40eb00eff3
					
				| @ -224,8 +224,6 @@ bool DecodedText::tryUnpackDirected(){ | ||||
|       message_ = QString(parts.join("")); | ||||
|     } | ||||
| 
 | ||||
|     message_ = message_.replace("APRS: ", "APRS:"); | ||||
| 
 | ||||
|     directed_ = parts; | ||||
|     frameType_ = type; | ||||
|     return true; | ||||
|  | ||||
| @ -4713,6 +4713,37 @@ void MainWindow::spotCmd(CommandDetail cmd){ | ||||
|     m_spotClient->enqueueCmd(cmdStr, cmd.from, cmd.to, cmd.relayPath, cmd.text, cmd.grid, cmd.extra, m_freqNominal + cmd.freq, cmd.snr); | ||||
| } | ||||
| 
 | ||||
| void MainWindow::spotAPRSCmd(CommandDetail d){ | ||||
|     if(!m_config.spot_to_reporting_networks()) return; | ||||
| 
 | ||||
|     if(d.cmd == " GRID"){ | ||||
|         auto grids = Varicode::parseGrids(d.text); | ||||
|         foreach(auto grid, grids){ | ||||
|             CallDetail cd = {}; | ||||
|             cd.bits = d.bits; | ||||
|             cd.call = d.from; | ||||
|             cd.freq = d.freq; | ||||
|             cd.grid = grid; | ||||
|             cd.snr = d.snr; | ||||
|             cd.utcTimestamp = d.utcTimestamp; | ||||
|             cd.tdrift = d.tdrift; | ||||
|             cd.mode = currentMode(); | ||||
| 
 | ||||
|             m_aprsCallCache.remove(cd.call); | ||||
|             m_aprsCallCache.remove(APRSISClient::replaceCallsignSuffixWithSSID(cd.call, Radio::base_callsign(cd.call))); | ||||
| 
 | ||||
|             logCallActivity(cd, true); | ||||
|         } | ||||
| 
 | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // for raw messages, ensure the passcode is valid first
 | ||||
|     if(!m_aprsClient->isPasscodeValid()) return; | ||||
|     qDebug() << "enqueueing third party text" << d.from << d.text; | ||||
|     m_aprsClient->enqueueThirdParty(Radio::base_callsign(d.from), d.text); | ||||
| } | ||||
| 
 | ||||
| void MainWindow::pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid){ | ||||
|     if(!m_config.spot_to_reporting_networks()) return; | ||||
| 
 | ||||
| @ -6185,8 +6216,8 @@ bool MainWindow::ensureCreateMessageReady(const QString &text){ | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     if(text.contains("APRS:") && !m_aprsClient->isPasscodeValid()){ | ||||
|         MessageBox::warning_message(this, tr ("Please ensure a valid APRS passcode is set in the settings when sending an APRS packet.")); | ||||
|     if(text.contains("@APRSIS") && !m_aprsClient->isPasscodeValid()){ | ||||
|         MessageBox::warning_message(this, tr ("Please ensure a valid APRS passcode is set in the settings when sending to the @APRSIS group.")); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
| @ -10310,32 +10341,6 @@ void MainWindow::processCommandActivity() { | ||||
|         logCallActivity(cd, true); | ||||
|         logHeardGraph(d.from, d.to); | ||||
| 
 | ||||
|         // PROCESS BUFFERED GRID FOR EVERYONE
 | ||||
|         if (d.cmd == " GRID"){ | ||||
|            // 1. parse grids
 | ||||
|            // 2. log it to reporting networks
 | ||||
|            auto grids = Varicode::parseGrids(d.text); | ||||
|            foreach(auto grid, grids){ | ||||
|                CallDetail cd = {}; | ||||
|                cd.bits = d.bits; | ||||
|                cd.call = d.from; | ||||
|                cd.freq = d.freq; | ||||
|                cd.grid = grid; | ||||
|                cd.snr = d.snr; | ||||
|                cd.utcTimestamp = d.utcTimestamp; | ||||
|                cd.tdrift = d.tdrift; | ||||
|                cd.mode = currentMode(); | ||||
| 
 | ||||
|                m_aprsCallCache.remove(cd.call); | ||||
|                m_aprsCallCache.remove(APRSISClient::replaceCallsignSuffixWithSSID(cd.call, Radio::base_callsign(cd.call))); | ||||
| 
 | ||||
|                logCallActivity(cd, true); | ||||
|            } | ||||
| 
 | ||||
|            // make sure this is explicit
 | ||||
|            continue; | ||||
|         } | ||||
| 
 | ||||
|         // PROCESS BUFFERED HEARING FOR EVERYONE
 | ||||
|         if (d.cmd == " HEARING"){ | ||||
|             // 1. parse callsigns
 | ||||
| @ -10354,6 +10359,11 @@ void MainWindow::processCommandActivity() { | ||||
|             spotCmd(d); | ||||
|         } | ||||
| 
 | ||||
|         // PROCESS @APRSIS SPOTS FOR EVERYONE
 | ||||
|         if (d.to == "@APRSIS"){ | ||||
|             spotAPRSCmd(d); | ||||
|         } | ||||
| 
 | ||||
|         // PREPARE CMD TEXT STRING
 | ||||
|         QStringList textList = { | ||||
|             QString("%1: %2%3").arg(d.from).arg(d.to).arg(d.cmd) | ||||
| @ -10930,14 +10940,6 @@ void MainWindow::processCommandActivity() { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // PROCESS BUFFERED APRS:
 | ||||
|         else if(d.cmd == " APRS:" && m_config.spot_to_reporting_networks() && m_aprsClient->isPasscodeValid()){ | ||||
|             m_aprsClient->enqueueThirdParty(Radio::base_callsign(d.from), d.text); | ||||
| 
 | ||||
|             // make sure this is explicit
 | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
| #if 0 | ||||
|         // PROCESS ALERT
 | ||||
|         else if (d.cmd == "!" && !isAllCall) { | ||||
|  | ||||
| @ -945,6 +945,7 @@ private: | ||||
|   void aprsSetLocal (); | ||||
|   void spotReport(int offset, int snr, QString callsign, QString grid); | ||||
|   void spotCmd(CommandDetail cmd); | ||||
|   void spotAPRSCmd(CommandDetail d); | ||||
|   void pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid); | ||||
|   void aprsLogReport(int offset, int snr, QString callsign, QString grid); | ||||
|   Radio::Frequency dialFrequency(); | ||||
|  | ||||
							
								
								
									
										21
									
								
								varicode.cpp
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								varicode.cpp
									
									
									
									
									
								
							| @ -77,7 +77,7 @@ QMap<QString, int> directed_cmds = { | ||||
| 
 | ||||
|     {" QUERY CALL",   13  }, // can you transmit a ping to callsign?
 | ||||
| 
 | ||||
|     {" APRS:",        14  }, // send an aprs packet
 | ||||
|     // {" ",          14  }, // reserved
 | ||||
| 
 | ||||
|     {" GRID",         15  }, // this is my current grid locator
 | ||||
| 
 | ||||
| @ -105,13 +105,13 @@ QMap<QString, int> directed_cmds = { | ||||
| }; | ||||
| 
 | ||||
| // commands allowed to be processed
 | ||||
| QSet<int> allowed_cmds = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; | ||||
| QSet<int> allowed_cmds = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, /*14,*/ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; | ||||
| 
 | ||||
| // commands that result in an autoreply (which can be relayed)
 | ||||
| QSet<int> autoreply_cmds = {0, 3, 4, 6, 9, 10, 11, 12, 13, 16, 30}; | ||||
| 
 | ||||
| // commands that should be buffered
 | ||||
| QSet<int> buffered_cmds = {5, 9, 10, 11, 12, 13, 14, 15, 24}; | ||||
| QSet<int> buffered_cmds = {5, 9, 10, 11, 12, 13, 15, 24}; | ||||
| 
 | ||||
| // commands that may include an SNR value
 | ||||
| QSet<int> snr_cmds = {25, 29}; | ||||
| @ -124,13 +124,12 @@ QMap<int, int> checksum_cmds = { | ||||
|     { 11, 16 }, | ||||
|     { 12, 16 }, | ||||
|     { 13, 16 }, | ||||
|     { 14, 16 }, | ||||
|     { 15,  0 }, | ||||
|     { 24, 16 } | ||||
| }; | ||||
| 
 | ||||
| QString callsign_pattern = QString("(?<callsign>[@]?[A-Z0-9/]+)"); | ||||
| QString optional_cmd_pattern = QString("(?<cmd>\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|MSG TO[:]|SNR[?]|INFO[?]|GRID[?]|STATUS[?]|QUERY MSGS[?]|HEARING[?]|(?:(?:STATUS|HEARING|QUERY CALL|QUERY MSGS|QUERY|CMD|MSG|NACK|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|INFO|GRID|DIT DIT)(?=[ ]|$))|[?> ]))?"); | ||||
| QString optional_cmd_pattern = QString("(?<cmd>\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|MSG TO[:]|SNR[?]|INFO[?]|GRID[?]|STATUS[?]|QUERY MSGS[?]|HEARING[?]|(?:(?:STATUS|HEARING|QUERY CALL|QUERY MSGS|QUERY|CMD|MSG|NACK|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|INFO|GRID|DIT DIT)(?=[ ]|$))|[?> ]))?"); | ||||
| QString optional_grid_pattern = QString("(?<grid>\\s?[A-R]{2}[0-9]{2})?"); | ||||
| QString optional_extended_grid_pattern = QString("^(?<grid>\\s?(?:[A-R]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*))?"); | ||||
| QString optional_num_pattern = QString("(?<num>(?<=SNR|\\bACK)\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?"); | ||||
| @ -242,6 +241,16 @@ QMap<QString, quint32> basecalls = { | ||||
|     { "@CONTROL",  nbasecall + 25 }, // Control group
 | ||||
|     { "@NET",      nbasecall + 26 }, // Net group
 | ||||
|     { "@NTS",      nbasecall + 27 }, // NTS group
 | ||||
| 
 | ||||
|     // reserved groups
 | ||||
|     { "@RESERVE/0", nbasecall + 28 }, // Reserved
 | ||||
|     { "@RESERVE/1", nbasecall + 29 }, // Reserved
 | ||||
|     { "@RESERVE/2", nbasecall + 30 }, // Reserved
 | ||||
|     { "@RESERVE/3", nbasecall + 31 }, // Reserved
 | ||||
|     { "@RESERVE/4", nbasecall + 32 }, // Reserved
 | ||||
| 
 | ||||
|     // special groups
 | ||||
|     { "@APRSIS",    nbasecall + 33 }, // APRS GROUP
 | ||||
| }; | ||||
| 
 | ||||
| QMap<quint32, QString> cqs = { | ||||
| @ -1036,7 +1045,7 @@ QPair<float, float> Varicode::grid2deg(QString const &grid){ | ||||
| // pack a 4-digit maidenhead grid locator into a 15-bit value
 | ||||
| quint16 Varicode::packGrid(QString const& value){ | ||||
|     QString grid = QString(value).trimmed(); | ||||
|     if(grid.length() < 4){       | ||||
|     if(grid.length() < 4){ | ||||
|         return (1<<15)-1; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Jordan Sherer
						Jordan Sherer