mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-03-30 17:05:52 +00:00
REPO: 1. Flash a repeater 2. Connect over lora 3. Set bw to 42.7 KHZ It will revert back due to converting a double to a float. REPO2: 1.Flash Repeater 2. Apply float fix 3. Set to say 20.8 4. try to get value via app or web cli repeater config It wil show blank because it doesnt return a good value. It would be something like 20.7999992 which the app and web apps dont like so the ftoa3 rounds it and returns a 3 decimal point float
175 lines
3.3 KiB
C++
175 lines
3.3 KiB
C++
#include "TxtDataHelpers.h"
|
||
|
||
void StrHelper::strncpy(char* dest, const char* src, size_t buf_sz) {
|
||
while (buf_sz > 1 && *src) {
|
||
*dest++ = *src++;
|
||
buf_sz--;
|
||
}
|
||
*dest = 0; // truncates if needed
|
||
}
|
||
|
||
void StrHelper::strzcpy(char* dest, const char* src, size_t buf_sz) {
|
||
while (buf_sz > 1 && *src) {
|
||
*dest++ = *src++;
|
||
buf_sz--;
|
||
}
|
||
while (buf_sz > 0) { // pad remaining with nulls
|
||
*dest++ = 0;
|
||
buf_sz--;
|
||
}
|
||
}
|
||
|
||
bool StrHelper::isBlank(const char* str) {
|
||
while (*str) {
|
||
if (*str++ != ' ') return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
#include <Arduino.h>
|
||
|
||
union int32_Float_t
|
||
{
|
||
int32_t Long;
|
||
float Float;
|
||
};
|
||
|
||
#ifndef FLT_MIN_EXP
|
||
#define FLT_MIN_EXP (-999)
|
||
#endif
|
||
|
||
#ifndef FLT_MAX_EXP
|
||
#define FLT_MAX_EXP (999)
|
||
#endif
|
||
|
||
#define _FTOA_TOO_LARGE -2 // |input| > 2147483520
|
||
#define _FTOA_TOO_SMALL -1 // |input| < 0.0000001
|
||
|
||
//precision 0-9
|
||
#define PRECISION 7
|
||
|
||
//_ftoa function
|
||
static void _ftoa(float f, char *p, int *status)
|
||
{
|
||
int32_t mantissa, int_part, frac_part;
|
||
int16_t exp2;
|
||
int32_Float_t x;
|
||
|
||
*status = 0;
|
||
if (f == 0.0)
|
||
{
|
||
*p++ = '0';
|
||
*p++ = '.';
|
||
*p++ = '0';
|
||
*p = 0;
|
||
return;
|
||
}
|
||
|
||
x.Float = f;
|
||
exp2 = (unsigned char)(x.Long>>23) - 127;
|
||
mantissa = (x.Long&0xFFFFFF) | 0x800000;
|
||
frac_part = 0;
|
||
int_part = 0;
|
||
|
||
if (exp2 >= 31)
|
||
{
|
||
*status = _FTOA_TOO_LARGE;
|
||
return;
|
||
}
|
||
else if (exp2 < -23)
|
||
{
|
||
*status = _FTOA_TOO_SMALL;
|
||
return;
|
||
}
|
||
else if (exp2 >= 23)
|
||
{
|
||
int_part = mantissa<<(exp2 - 23);
|
||
}
|
||
else if (exp2 >= 0)
|
||
{
|
||
int_part = mantissa>>(23 - exp2);
|
||
frac_part = (mantissa<<(exp2 + 1))&0xFFFFFF;
|
||
}
|
||
else
|
||
{
|
||
//if (exp2 < 0)
|
||
frac_part = (mantissa&0xFFFFFF)>>-(exp2 + 1);
|
||
}
|
||
|
||
if (x.Long < 0)
|
||
*p++ = '-';
|
||
if (int_part == 0)
|
||
*p++ = '0';
|
||
else
|
||
{
|
||
ltoa(int_part, p, 10);
|
||
while (*p)
|
||
p++;
|
||
}
|
||
*p++ = '.';
|
||
if (frac_part == 0)
|
||
*p++ = '0';
|
||
else
|
||
{
|
||
char m;
|
||
|
||
for (m=0; m<PRECISION; m++)
|
||
{
|
||
//frac_part *= 10;
|
||
frac_part = (frac_part<<3) + (frac_part<<1);
|
||
*p++ = (frac_part>>24) + '0';
|
||
frac_part &= 0xFFFFFF;
|
||
}
|
||
|
||
//delete ending zeroes
|
||
for (--p; p[0] == '0' && p[-1] != '.'; --p)
|
||
;
|
||
++p;
|
||
}
|
||
*p = 0;
|
||
}
|
||
|
||
const char* StrHelper::ftoa(float f) {
|
||
static char tmp[16];
|
||
int status;
|
||
_ftoa(f, tmp, &status);
|
||
if (status) {
|
||
tmp[0] = '0'; // fallback/error value
|
||
tmp[1] = 0;
|
||
}
|
||
return tmp;
|
||
}
|
||
|
||
const char* StrHelper::ftoa3(float f) {
|
||
static char s[16];
|
||
int v = (int)(f * 1000.0f + (f >= 0 ? 0.5f : -0.5f)); // rounded ×1000
|
||
int w = v / 1000; // whole
|
||
int d = abs(v % 1000); // decimals
|
||
snprintf(s, sizeof(s), "%d.%03d", w, d);
|
||
for (int i = strlen(s) - 1; i > 0 && s[i] == '0'; i--)
|
||
s[i] = 0;
|
||
int L = strlen(s);
|
||
if (s[L - 1] == '.') s[L - 1] = 0;
|
||
return s;
|
||
}
|
||
|
||
uint32_t StrHelper::fromHex(const char* src) {
|
||
uint32_t n = 0;
|
||
while (*src) {
|
||
if (*src >= '0' && *src <= '9') {
|
||
n <<= 4;
|
||
n |= (*src - '0');
|
||
} else if (*src >= 'A' && *src <= 'F') {
|
||
n <<= 4;
|
||
n |= (*src - 'A' + 10);
|
||
} else if (*src >= 'a' && *src <= 'f') {
|
||
n <<= 4;
|
||
n |= (*src - 'a' + 10);
|
||
} else {
|
||
break; // non-hex char encountered, stop parsing
|
||
}
|
||
src++;
|
||
}
|
||
return n;
|
||
}
|