Added ability to encode power into dbm
This commit is contained in:
		
							parent
							
								
									92117aa791
								
							
						
					
					
						commit
						fe405cfba8
					
				
							
								
								
									
										94
									
								
								varicode.cpp
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								varicode.cpp
									
									
									
									
									
								
							| @ -46,6 +46,7 @@ QMap<QString, int> directed_cmds = { | ||||
|     {"|",     4  }, // relay message
 | ||||
| 
 | ||||
|     // directed responses
 | ||||
|     {" PWR",  24  }, // power level
 | ||||
|     {" SNR",  25  }, // seen a station at the provided snr
 | ||||
|     {" NO",   26  }, // negative confirm
 | ||||
|     {" YES",  27  }, // confirm
 | ||||
| @ -55,12 +56,14 @@ QMap<QString, int> directed_cmds = { | ||||
|     {" ",     31 },  // send freetext
 | ||||
| }; | ||||
| 
 | ||||
| QSet<int> allowed_cmds = {0, 1, 2,      25, 26, 27, 28, 29, 30, 31}; | ||||
| QSet<int> allowed_cmds = {0, 1, 2,      24, 25, 26, 27, 28, 29, 30, 31}; | ||||
| 
 | ||||
| QRegularExpression directed_re("^" | ||||
|                                "(?<to>[A-Z0-9/]+)" | ||||
|                                "(?<cmd>\\s?(?:AGN[?]|RR|73|YES|NO|SNR|[?$@&| ]))" | ||||
|                                "(?<num>\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?"); | ||||
|                                "(?<cmd>\\s?(?:AGN[?]|RR|73|YES|NO|SNR|PWR|[?$@&| ]))" | ||||
|                                "(?<pwr>\\s?\\d+\\s?[KM]?W)?" | ||||
|                                "(?<num>\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?" | ||||
|                                ); | ||||
| 
 | ||||
| QMap<QChar, QString> huff = { | ||||
|     // char   code                 weight
 | ||||
| @ -121,6 +124,52 @@ QMap<QString, quint32> basecalls = { | ||||
|     { "ALLCALL", nbasecall + 3 }, | ||||
| }; | ||||
| 
 | ||||
| QMap<int, int> dbm2mw = { | ||||
|     {0  , 1}, | ||||
|     {3  , 2}, | ||||
|     {7  , 5}, | ||||
|     {10 , 10}, | ||||
|     {13 , 20}, | ||||
|     {17 , 50}, | ||||
|     {20 , 100}, | ||||
|     {23 , 200}, | ||||
|     {27 , 500}, | ||||
|     {30 , 1000},    //    1W
 | ||||
|     {33 , 2000},    //    2W
 | ||||
|     {37 , 5000},    //    5W
 | ||||
|     {40 , 10000},   //   10W
 | ||||
|     {43 , 20000},   //   20W
 | ||||
|     {47 , 50000},   //   50W
 | ||||
|     {50 , 100000},  //  100W
 | ||||
|     {53 , 200000},  //  200W
 | ||||
|     {57 , 500000},  //  500W
 | ||||
|     {60 , 1000000}, // 1000W
 | ||||
| }; | ||||
| 
 | ||||
| int mwattsToDbm(int mwatts){ | ||||
|     int dbm = 0; | ||||
|     auto values = dbm2mw.values(); | ||||
|     qSort(values); | ||||
|     foreach(auto mw, values){ | ||||
|         if(mw < mwatts){ continue; } | ||||
|         dbm = dbm2mw.key(mw); | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     return dbm; | ||||
| } | ||||
| 
 | ||||
| int dbmTomwatts(int dbm){ | ||||
|     if(dbm2mw.contains(dbm)){ | ||||
|         return dbm2mw[dbm]; | ||||
|     } | ||||
|     auto iter = dbm2mw.lowerBound(dbm); | ||||
|     if(iter == dbm2mw.end()){ | ||||
|         return dbm2mw.last(); | ||||
|     } | ||||
|     return iter.value(); | ||||
| } | ||||
| 
 | ||||
| QString Varicode::formatSNR(int snr){ | ||||
|     if(snr < -60 || snr > 60){ | ||||
|         return QString(); | ||||
| @ -129,6 +178,19 @@ QString Varicode::formatSNR(int snr){ | ||||
|     return QString("%1%2").arg(snr >= 0 ? "+" : "").arg(snr, snr < 0 ? 3 : 2, 10, QChar('0')); | ||||
| } | ||||
| 
 | ||||
| QString Varicode::formatPWR(int dbm){ | ||||
|     if(dbm < 0 || dbm > 60){ | ||||
|         return QString(); | ||||
|     } | ||||
| 
 | ||||
|     int mwatts = dbmTomwatts(dbm); | ||||
|     if(mwatts < 1000){ | ||||
|         return QString("%1MW").arg(mwatts); | ||||
|     } | ||||
| 
 | ||||
|     return QString("%1W").arg(mwatts/1000); | ||||
| } | ||||
| 
 | ||||
| QStringList Varicode::parseCallsigns(QString const &input){ | ||||
|     QStringList callsigns; | ||||
|     QRegularExpression re(callsign_pattern2); | ||||
| @ -535,6 +597,7 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &callsi | ||||
|         QString to = match.captured("to"); | ||||
|         QString cmd = match.captured("cmd"); | ||||
|         QString num = match.captured("num").trimmed(); | ||||
|         QString pwr = match.captured("pwr").trimmed(); | ||||
| 
 | ||||
|         int inum = -31; | ||||
|         bool hasnum = false; | ||||
| @ -542,9 +605,19 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &callsi | ||||
|             inum = qMax(-30, qMin(num.toInt(&hasnum, 10), 30)); | ||||
|         } | ||||
| 
 | ||||
|         qDebug() << "match" << match.captured(0); | ||||
|         qDebug() << "groups" << from << to << cmd << num; | ||||
|         qDebug() << "packed num" << num << inum << hasnum; | ||||
|         // if we are packing a PWR command, pack pwr into dbm
 | ||||
|         int ipwr = -31; | ||||
|         if(!pwr.isEmpty() && cmd.trimmed() == "PWR"){ | ||||
|             int factor = 1000; | ||||
|             if(pwr.endsWith("KW")){ | ||||
|                 factor = 1000000; | ||||
|             } | ||||
|             else if(pwr.endsWith("MW")){ | ||||
|                 factor = 1; | ||||
|             } | ||||
|             ipwr = pwr.replace(QRegExp("[KM]?W"), "").toInt() * factor; | ||||
|             inum = mwattsToDbm(ipwr) - 30; | ||||
|         } | ||||
| 
 | ||||
|         if(to == callsign){ | ||||
|             *n = 0; | ||||
| @ -625,7 +698,14 @@ QStringList Varicode::unpackDirectedMessage(const QString &text){ | ||||
| 
 | ||||
|     int num = (flag ? -1 : 1) * extra; | ||||
|     if(num != -31){ | ||||
|         unpacked.append(Varicode::formatSNR(num)); | ||||
|         // TODO: jsherer - should we decide which format to use on the command, or something else?
 | ||||
|         if(packed_cmd == directed_cmds[" PWR"]){ | ||||
|             unpacked.append(Varicode::formatPWR(num + 30)); | ||||
|         } else if(packed_cmd == directed_cmds[" SNR"]) { | ||||
|             unpacked.append(Varicode::formatSNR(num)); | ||||
|         } else { | ||||
|             unpacked.append(QString("%1").arg(num)); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return unpacked; | ||||
|  | ||||
| @ -28,6 +28,7 @@ public: | ||||
|     //Varicode();
 | ||||
| 
 | ||||
|     static QString formatSNR(int snr); | ||||
|     static QString formatPWR(int dbm); | ||||
| 
 | ||||
|     static QStringList parseCallsigns(QString const &input); | ||||
|     static QStringList parseGrids(QString const &input); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Jordan Sherer
						Jordan Sherer