diff --git a/openrtx/include/core/utils.h b/openrtx/include/core/utils.h index 98f975c3..de6f4965 100644 --- a/openrtx/include/core/utils.h +++ b/openrtx/include/core/utils.h @@ -54,6 +54,16 @@ uint8_t interpCalParameter(const freq_t freq, const freq_t *calPoints, */ uint32_t bcdToBin(uint32_t bcd); +/** + * Given a string containing a number expressed in decimal notation, remove all + * the unnecessary trailing zeroes. I.e. the string "123.4560000" will be trimmed + * down to "123.456". This function requires that the input string has at least + * one decimal point and proceeds stripping the zeroes from the end to the beginning. + * + * @param str: string to be processed. + */ +void stripTrailingZeroes(char *str); + #ifdef __cplusplus } #endif diff --git a/openrtx/src/core/utils.c b/openrtx/src/core/utils.c index a7974170..a3eb14d2 100644 --- a/openrtx/src/core/utils.c +++ b/openrtx/src/core/utils.c @@ -17,6 +17,7 @@ * along with this program; if not, see * ***************************************************************************/ +#include #include #include #include @@ -63,3 +64,15 @@ uint32_t bcdToBin(uint32_t bcd) ((bcd >> 4) & 0x0F) * 10 + (bcd & 0x0F); } + +void stripTrailingZeroes(char *str) +{ + for(size_t i = strlen(str); i > 2; i--) + { + if((str[i - 1] != '0') || (str[i - 2] == '.')) + { + str[i] = '\0'; + return; + } + } +} diff --git a/openrtx/src/core/voicePromptUtils.c b/openrtx/src/core/voicePromptUtils.c index e2b349f9..94694c04 100644 --- a/openrtx/src/core/voicePromptUtils.c +++ b/openrtx/src/core/voicePromptUtils.c @@ -60,20 +60,6 @@ static void addSilenceIfNeeded(const vpQueueFlags_t flags) vp_queuePrompt(PROMPT_SILENCE); } -static void removeUnnecessaryZerosFromVoicePrompts(char* str) -{ - const int NUM_DECIMAL_PLACES = 1; - int len = strlen(str); - for (int i = len; i > 2; i--) - { - if ((str[i - 1] != '0') || (str[i - (NUM_DECIMAL_PLACES + 1)] == '.')) - { - str[i] = '\0'; - return; - } - } -} - void vp_announceChannelName(const channel_t* channel, @@ -106,11 +92,11 @@ void vp_queueFrequency(const freq_t freq) { char buffer[16]; int MHz = (freq / 1000000); - int kHz = ((freq % 1000000) / 10); + int kHz = ((freq % 1000000) / 100); snprintf(buffer, 16, "%d.%05d", MHz, kHz); - removeUnnecessaryZerosFromVoicePrompts(buffer); + stripTrailingZeroes(buffer); vp_queueString(buffer, vpAnnounceCommonSymbols); vp_queuePrompt(PROMPT_MEGAHERTZ); @@ -191,7 +177,7 @@ void vp_announcePower(const uint32_t power, const vpQueueFlags_t flags) // Compute x.y format avoiding to pull in floating point math. // Remember that power is expressed in mW! char buffer[16] = "\0"; - snprintf(buffer, 16, "%d.%d", (power / 1000), (power % 1000) / 100); + snprintf(buffer, 16, "%lu.%lu", (power / 1000), (power % 1000) / 100); vp_queueString(buffer, vpAnnounceCommonSymbols); vp_queuePrompt(PROMPT_WATTS); @@ -705,7 +691,7 @@ void vp_announceGPSInfo(vpGPSInfoFlags_t gpsInfoFlags) { // lat/long snprintf(buffer, 16, "%8.6f", state.gps_data.latitude); - removeUnnecessaryZerosFromVoicePrompts(buffer); + stripTrailingZeroes(buffer); vp_queuePrompt(PROMPT_LATITUDE); vp_queueString(buffer, vpAnnounceCommonSymbols); vp_queuePrompt(PROMPT_NORTH); @@ -717,7 +703,7 @@ void vp_announceGPSInfo(vpGPSInfoFlags_t gpsInfoFlags) voicePrompt_t direction = (longitude < 0) ? PROMPT_WEST : PROMPT_EAST; longitude = (longitude < 0) ? -longitude : longitude; snprintf(buffer, 16, "%8.6f", longitude); - removeUnnecessaryZerosFromVoicePrompts(buffer); + stripTrailingZeroes(buffer); vp_queuePrompt(PROMPT_LONGITUDE); vp_queueString(buffer, vpAnnounceCommonSymbols);