diff --git a/code/base/config_file_names.h b/code/base/config_file_names.h index f3df91bf..c2181713 100644 --- a/code/base/config_file_names.h +++ b/code/base/config_file_names.h @@ -125,6 +125,7 @@ #define FILE_FORCE_ROUTER "/boot/forcerouter" #define FILE_FORCE_RESET "/boot/forcereset" #define FILE_BOOT_LOG_STEPS "/boot/bootstepslog.txt" +#define FILE_FORCE_SHOW_ANTENNA_VALUES "/boot/showantennavalues" //#define VIDEO_RECORDER_COMMAND "raspivid" //#define VIDEO_RECORDER_COMMAND_VEYE "/usr/local/bin/veye_raspivid" @@ -173,6 +174,7 @@ #define FILE_FORCE_ROUTER "/config/forcerouter" #define FILE_FORCE_RESET "/config/forcereset" #define FILE_BOOT_LOG_STEPS "/config/bootstepslog.txt" +#define FILE_FORCE_SHOW_ANTENNA_VALUES "/config/showantennavalues" #define VIDEO_PLAYER_PIPE "ruby_player_radxa" #define VIDEO_PLAYER_SM "ruby_player_radxa" diff --git a/code/base/hardware_radio.c b/code/base/hardware_radio.c index 9560c2a0..7bcbbbda 100644 --- a/code/base/hardware_radio.c +++ b/code/base/hardware_radio.c @@ -80,6 +80,11 @@ void reset_runtime_radio_rx_info(type_runtime_radio_rx_info* pRuntimeRadioRxInfo pRuntimeRadioRxInfo->nDataRateBPSMCS = 0; // positive: bps, negative: mcs rate, 0: never pRuntimeRadioRxInfo->nRadiotapFlags = 0; pRuntimeRadioRxInfo->nAntennaCount = 1; + for( int i=0; iiAntennaDBM[i] = 1000; + pRuntimeRadioRxInfo->iAntennaDBMNoise[i] = 1000; + } reset_runtime_radio_rx_signal_info(&(pRuntimeRadioRxInfo->signalInfoAll)); reset_runtime_radio_rx_signal_info(&(pRuntimeRadioRxInfo->signalInfoVideo)); reset_runtime_radio_rx_signal_info(&(pRuntimeRadioRxInfo->signalInfoData)); diff --git a/code/base/hardware_radio.h b/code/base/hardware_radio.h index 16799c5c..ed481ec6 100644 --- a/code/base/hardware_radio.h +++ b/code/base/hardware_radio.h @@ -113,6 +113,8 @@ typedef struct int nDataRateBPSMCS; // positive: bps, negative: mcs rate, 0: never int nRadiotapFlags; int nAntennaCount; + int iAntennaDBM[MAX_RADIO_ANTENNAS]; + int iAntennaDBMNoise[MAX_RADIO_ANTENNAS]; type_runtime_radio_rx_signal_info signalInfoAll; type_runtime_radio_rx_signal_info signalInfoVideo; type_runtime_radio_rx_signal_info signalInfoData; diff --git a/code/base/shared_mem_radio.h b/code/base/shared_mem_radio.h index bb8d3e34..2ad8152b 100644 --- a/code/base/shared_mem_radio.h +++ b/code/base/shared_mem_radio.h @@ -54,6 +54,8 @@ typedef struct typedef struct { int iAntennaCount; + int iAntennaDBM[MAX_RADIO_ANTENNAS]; + int iAntennaDBMNoise[MAX_RADIO_ANTENNAS]; type_runtime_radio_rx_signal_info signalInfoAll; type_runtime_radio_rx_signal_info signalInfoVideo; type_runtime_radio_rx_signal_info signalInfoData; diff --git a/code/common/radio_stats.c b/code/common/radio_stats.c index fe66183f..2882624a 100644 --- a/code/common/radio_stats.c +++ b/code/common/radio_stats.c @@ -1030,6 +1030,8 @@ int radio_stats_update_on_new_radio_packet_received(shared_mem_radio_stats* pSMR if ( pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.nAntennaCount > pSMRS->radio_interfaces[iInterfaceIndex].signalInfo.iAntennaCount ) pSMRS->radio_interfaces[iInterfaceIndex].signalInfo.iAntennaCount = pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.nAntennaCount; + memcpy((u8*)&(pSMRS->radio_interfaces[iInterfaceIndex].signalInfo.iAntennaDBM), (u8*)&(pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.iAntennaDBM), sizeof(pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.iAntennaDBM)); + memcpy((u8*)&(pSMRS->radio_interfaces[iInterfaceIndex].signalInfo.iAntennaDBMNoise), (u8*)&(pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.iAntennaDBMNoise), sizeof(pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.iAntennaDBMNoise)); memcpy((u8*)&(pSMRS->radio_interfaces[iInterfaceIndex].signalInfo.signalInfoAll), (u8*)&(pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.signalInfoAll), sizeof(type_runtime_radio_rx_signal_info)); memcpy((u8*)&(pSMRS->radio_interfaces[iInterfaceIndex].signalInfo.signalInfoVideo), (u8*)&(pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.signalInfoVideo), sizeof(type_runtime_radio_rx_signal_info)); diff --git a/code/r_central/osd/osd_links.cpp b/code/r_central/osd/osd_links.cpp index bcb60dba..89c5f8ed 100644 --- a/code/r_central/osd/osd_links.cpp +++ b/code/r_central/osd/osd_links.cpp @@ -263,7 +263,34 @@ float _osd_get_radio_link_new_height() return fHeightLink; } -float _osd_show_radio_bars_info(float xPos, float yPos, u32 uLastRxTime, int iMaxRxQuality, int dbm, int iSNR, bool bShowBars, bool bShowNumbers, bool bUplink, bool bHorizontal, u32 uRadioLinkNumbersFlags, bool bDraw, bool bDatarateChanged) +// Cached feature switch - showantennavalues file must exist for this to work +bool _osd_show_antenna_values_enabled() +{ + static bool s_bChecked = false; + static bool s_bEnabled = false; + if ( ! s_bChecked ) + { + s_bChecked = true; + s_bEnabled = ( access(FILE_FORCE_SHOW_ANTENNA_VALUES, R_OK) != -1 ); + } + return s_bEnabled; +} + +//show two antennas -65/-70 dBm as "65 70" due to the screen real estate limitation +void _osd_format_antenna_values(char* szOut, const int* piValues, int iCount) +{ + szOut[0] = 0; + for( int k=0; k 0 ) + strcat(szOut, " "); + sprintf(szTmp, "%02d", abs(piValues[k])); + strcat(szOut, szTmp); + } +} + +float _osd_show_radio_bars_info(float xPos, float yPos, u32 uLastRxTime, int iMaxRxQuality, int dbm, int iSNR, bool bShowBars, bool bShowNumbers, bool bUplink, bool bHorizontal, u32 uRadioLinkNumbersFlags, bool bDraw, bool bDatarateChanged, const int* piAntennaDBM = NULL, const int* piAntennaSNR = NULL, int iAntennaValidCount = 0) { if ( ! bShowNumbers ) if ( ! bShowBars ) @@ -348,7 +375,9 @@ float _osd_show_radio_bars_info(float xPos, float yPos, u32 uLastRxTime, int iMa } else if ( uRadioLinkNumbersFlags & OSD_FLAG3_SHOW_RADIO_LINK_QUALITY_NUMBERS_DBM ) { - if ( dbm < -120 ) + if ( iAntennaValidCount > 1 ) + _osd_format_antenna_values(szLine1, piAntennaDBM, iAntennaValidCount); + else if ( dbm < -120 ) strcpy(szLine1, "--- dBm"); else sprintf(szLine1, "%d dBm", dbm); @@ -356,7 +385,9 @@ float _osd_show_radio_bars_info(float xPos, float yPos, u32 uLastRxTime, int iMa } else if ( uRadioLinkNumbersFlags & OSD_FLAG3_SHOW_RADIO_LINK_QUALITY_NUMBERS_SNR ) { - if ( iSNR <= 0 ) + if ( iAntennaValidCount > 1 ) + _osd_format_antenna_values(szLine1, piAntennaSNR, iAntennaValidCount); + else if ( iSNR <= 0 ) strcpy(szLine1, "SNR: ---"); else sprintf(szLine1, "SNR: %d", iSNR); @@ -372,7 +403,9 @@ float _osd_show_radio_bars_info(float xPos, float yPos, u32 uLastRxTime, int iMa if ( ! bAddedDBM ) if ( uRadioLinkNumbersFlags & OSD_FLAG3_SHOW_RADIO_LINK_QUALITY_NUMBERS_DBM ) { - if ( dbm < -120 ) + if ( iAntennaValidCount > 1 ) + _osd_format_antenna_values(szLine2, piAntennaDBM, iAntennaValidCount); + else if ( dbm < -120 ) strcpy(szLine2, "--- dBm"); else sprintf(szLine2, "%d dBm", dbm); @@ -381,7 +414,9 @@ float _osd_show_radio_bars_info(float xPos, float yPos, u32 uLastRxTime, int iMa if ( ! bAddedSNR ) if ( uRadioLinkNumbersFlags & OSD_FLAG3_SHOW_RADIO_LINK_QUALITY_NUMBERS_SNR ) { - if ( iSNR <= 0 ) + if ( iAntennaValidCount > 1 ) + _osd_format_antenna_values(szLine2, piAntennaSNR, iAntennaValidCount); + else if ( iSNR <= 0 ) strcpy(szLine2, "SNR: ---"); else sprintf(szLine2, "SNR: %d", iSNR); @@ -901,7 +936,23 @@ float _osd_show_radio_link_new(float xPos, float yPos, int iLocalRadioLinkId, in } } - float fSize = _osd_show_radio_bars_info(xPos, yPos+dySignalBars, uLastRxTime, nRxQuality, g_fOSDDbm[i], g_fOSDSNR[i], bShowBars, bShowNumbers, false, bHorizontal, uRadioLinkNumbersFlags, false, false); + // count valid antennas globally (per-packet count is unreliable) + int aAntennaDBM[MAX_RADIO_ANTENNAS]; + int aAntennaSNR[MAX_RADIO_ANTENNAS]; + int iAntennaValidCount = 0; + if ( _osd_show_antenna_values_enabled() ) + for( int k=0; kdrawTextLeft(xPos + widthCol - 2.0*padding, y, fontId, szBuff); y += lineHeight; + // count antenna the reliable way + int iValidAntennas = 0; + int iHighestValidAntenna = -1; + for( int k=0; k 1 ) + { + g_pRenderEngine->drawText(xPos, y, fontId, "Rx Dbm/Antenna:"); + szBuff[0] = 0; + for( int k=0; k<=iHighestValidAntenna; k++ ) + { + if ( g_SM_RadioStats.radio_interfaces[i].signalInfo.iAntennaDBM[k] < 500 ) + sprintf(szBuff2, "%d%s ", g_SM_RadioStats.radio_interfaces[i].signalInfo.iAntennaDBM[k], (kdrawTextLeft(xPos + widthCol - 2.0*padding, y, fontId, szBuff); + y += lineHeight; + } + if ( iRadioLinkId >= 0 ) { sprintf(szBuff, "TX Time/Sec (link %d):", iRadioLinkId+1); diff --git a/code/radio/radiolink.c b/code/radio/radiolink.c index 1e6a81dd..fa2142c0 100644 --- a/code/radio/radiolink.c +++ b/code/radio/radiolink.c @@ -1251,6 +1251,13 @@ u8* radio_process_wlan_data_in(int interfaceNumber, int* piOutPacketLength, int* } if ( iAntennaCount > pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.nAntennaCount ) pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.nAntennaCount = iAntennaCount; + for( int i=0; iruntimeInterfaceInfoRx.radioHwRxInfo.iAntennaDBM[i] = iAntennaDBM[i]; + if ( iAntennaDBMNoise[i] < 500 ) + pRadioHWInfo->runtimeInterfaceInfoRx.radioHwRxInfo.iAntennaDBMNoise[i] = iAntennaDBMNoise[i]; + } #ifdef FEATURE_RADIO_SYNCHRONIZE_RXTX_THREADS