Alors voilà les sources en clair
#ifndef printInt_h
#define printInt_h
#include <stdint.h>
#include <Printable.h>
class printInt : public Printable {
private :
bool _neg;
uint32_t _value;
uint8_t _digits;
void setSigned(int32_t value, uint8_t digits);
void setUnsigned(uint32_t value, uint8_t digits);
public :
printInt(int16_t value, uint8_t digits) {setSigned(value, digits);}
printInt(int32_t value, uint8_t digits) {setSigned(value, digits);}
printInt(uint16_t value, uint8_t digits) {setUnsigned(value, digits);}
printInt(uint32_t value, uint8_t digits) {setUnsigned(value, digits);}
virtual size_t printTo(Print& p) const;
};
inline printInt I(int16_t value, uint8_t digits=2) {return printInt::printInt(value, digits);}
inline printInt I(int32_t value, uint8_t digits=2) {return printInt::printInt(value, digits);}
inline printInt I(uint16_t value, uint8_t digits=2) {return printInt::printInt(value, digits);}
inline printInt I(uint32_t value, uint8_t digits=2) {return printInt::printInt(value, digits);}
#endif
#include <Print.h>
#include "printInt.h"
void printInt::setUnsigned(uint32_t value, uint8_t digits) {
_digits = digits > 10 ? 10 : digits;
_neg = false;
_value = value;
}
void printInt::setSigned(int32_t value, uint8_t digits) {
_digits = digits > 10 ? 10 : digits;
if (value < 0) {
_neg = true;
_value = -value;
} else {
_neg = false;
_value = value;
}
}
size_t printInt::printTo(Print& p) const {
size_t n = 0;
if (_neg) n += p.print('-');
uint32_t mask = 1;
for (uint8_t i = 1; i<_digits; i++) mask *= 10;
while (mask > _value) {
n += p.print('0');
mask /= 10;
}
if (_value > 0) n += p.print(_value);
return n;
}
Pas certain que ce soit complètement académique mais c'est fonctionnel (aussi sur ESP).
Le plus simple aurait été de modifier directement la classe Print, mais celle-ci fait partie du core arduino relivré à chaque nouvelle version.
Je me suis donc appuyé sur la seule possibilité qui nous est offerte (déjà c'est bien que ce soit prévu) : passer par la classe abstraite Printable, gérée par la méthode print() de la classe Print.
Sur le principe il suffit de créer sa propre classe dérivée de Printable, et de lui définir la méthode virtuelle printTo().
C'est en zieutant "comment ils ont fait dans IPAddress.h pour qu'on puisse imprimer une adresse ip complète avec un simple print()?" que j'ai découvert cette possibilité.
Bon d'accord tout ça nécessite de connaître un peu la poo...
Mais mettre des espaces ou des séparateurs de milliers, c'est juste une histoire de code dans printTo(). D'ailleurs le code de cette fonction est certainement améliorable.
Comme là je n'ai pas trop le temps de m'en occuper, vous pouvez jouer aussi et partager le code ici.
A la fin on arrivera peut-être à un patch collégial qui répond au maximum de besoins.