Pin Radiolab for stm32 and replace ltoa

The major rev from 19.x to 20.x breaks Radiolab, so pin it for now. This should fix the failing wio-e5-mini_repeater builds.

ltoa is removed upstream, so it was replaced with snprintf. The p[] buffer is always 16 bytes. Copy/paste for why claude thinks this is fine below, but also if this is broken it wouldn't be new.
```
exp2 in [23, 30] (int_part = mantissa << (exp2 - 23)): this is where int_part can reach its true max, up to 2,147,483,520 — 10 digits. That's what the snprintf bound of 11 (10 digits + NUL) is sized for. But in this branch frac_part is never assigned anything other than its initial 0, so only *p++ = '0' runs for the fraction — 1 char, not 7.

exp2 in [0, 22] (int_part = mantissa >> (23 - exp2)): this is the only branch where frac_part can also be nonzero and enter the 7-digit loop. Here int_part < 2^23 by construction, so it's capped at 7 digits, never 10.
```
This commit is contained in:
Blake Latchford
2026-09-17 22:12:53 -04:00
parent 3244e3ec13
commit 8d2a5657ac
2 changed files with 7 additions and 6 deletions
+3 -1
View File
@@ -110,7 +110,9 @@ build_flags = ${arduino_base.build_flags}
[stm32_base]
extends = arduino_base
platform = ststm32
; Pinned pending upstream fix for upstream conversions.
; https://github.com/jgromes/RadioLib/issues/1873
platform = ststm32@19.7.1
extra_scripts = post:arch/stm32/build_hex.py
build_flags = ${arduino_base.build_flags}
-D STM32_PLATFORM
+4 -5
View File
@@ -27,8 +27,9 @@ bool StrHelper::isBlank(const char* str) {
}
#include <Arduino.h>
#include <stdio.h>
union int32_Float_t
union int32_Float_t
{
int32_t Long;
float Float;
@@ -100,11 +101,9 @@ static void _ftoa(float f, char *p, int *status)
*p++ = '-';
if (int_part == 0)
*p++ = '0';
else
else
{
ltoa(int_part, p, 10);
while (*p)
p++;
p += snprintf(p, 11, "%ld", (long)int_part);
}
*p++ = '.';
if (frac_part == 0)