Utilizzo "intelligente" di serial.print

Stesso metodo di @ORSO2001.

E aggiungo anche altre informazioni al print di debug come file e riga del sorgente, nome della funzione etcetc

Ci posti un esempio? :smile:

Con MCU che supportano il printf (ESPxx, STM32, etcetc) mi sono creato questo file che includo dove serve. Immagino che si possa adattare anche senza l’uso di printf.

#ifndef __LOG_H__
#define __LOG_H__

#ifdef __cplusplus
extern "C"
{
#endif

// Windows
#define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)

// Linux, Mac
// #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)

#define _LOG_FORMAT(letter, format)  "\n[" #letter "][%s:%u] %s():\t" format, __FILENAME__, __LINE__, __FUNCTION__

#if DEBUG_ENABLE
#define log_debug(format, ...) Serial.printf(_LOG_FORMAT(D, format), ##__VA_ARGS__)
#define log_error(format, ...) { Serial.println(); Serial.printf(_LOG_FORMAT(E, format), ##__VA_ARGS__); }
#define log_info(format, ...) Serial.printf(_LOG_FORMAT(I, format), ##__VA_ARGS__)
#define lineTrap() {Serial.printf("[%s:%u] - ", __FILENAME__, __LINE__); Serial.print(__func__); Serial.println("()");}
#else
#define log_debug(format, ...)
#define log_error(format, ...)
#define log_info(format, ...)
#define lineTrap()
#endif

#define DEBUG_F true
#if DEBUG_F
	#ifdef ESP32
		#define functionLog() { \
		Serial.printf("Heap memory %6d / %6d", heap_caps_get_free_size(0), heap_caps_get_largest_free_block(0));\
		Serial.print("\t\t\t--- "); Serial.print(millis()); Serial.print("mS > ");  Serial.print(__func__); Serial.println("()"); }
	#elif defined(ESP8266)
		#define functionLog() { \
		uint32_t free; uint16_t max; uint8_t frag; ESP.getHeapStats(&free, &max, &frag); Serial.printf("free: %5d - max: %5d <- ", free, max);\
		Serial.printf("[%s:%u]\t--- ", __FILE__, __LINE__); Serial.print(millis()); Serial.print("mS > ");  Serial.print(__func__); Serial.println("()"); }
	#endif
#else
    #define functionLog()
#endif


#ifdef __cplusplus
}
#endif

#endif

damngif

@giorgiogiorgio ahahahah :rofl:

È solo la versione “evoluta” dello schema di base già scritto da @ORSO2001
Ho preso quanto già presente nel core esp32 per Arduino e semplificato/modificato un po’ per le mie esigenze.

@giorgiogiorgio : essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

Quindi con il tuo metodo basta commentare //ATTIVA per non far compilare tutto ciò che diversamente verrebbe stampato?

Grazie

@droidprova …no…nella prima riga dove c’è #define DEBUG …se metti “0” o false non stampa…se metti “1” o true stampa.

Grazie!

e se avessi ad esempio una funzione di nome stampa() che viene lanciata dal loop() dove raccolgo tutti i print del programma utile al debug, come potrei disattivarla col tuo sistema?

Io attualmente la commento del tutto assieme alla serial.begin() nel setup().

Forse con due righe è meglio, che ne pensate? Certo non è a livelli top ma per il mio utilizzo potrebbe andare bene:

bool flag = true;

#define DEBUG flag    // 0 non stampa, 1 stampa

#if DEBUG
#define SERIALE Serial
#define ATTIVA SERIALE.begin(9600);
#define STAMPA_LN(x) SERIALE.println(x);
#else
#define ATTIVA
#define STAMPA_LN(x)
#endif


void setup() {
  ATTIVA
}

void loop() {
#ifdef DEBUG
  stampa();
#endif
}

void stampa() {
  STAMPA_LN("ciao");
  delay(1000);
}

domanda: lo stato della variabile flag posso cambiarla a programma caricato, che so usando una comunicazione con telegram?

però compilando il codice assegnando lo stato a DEBUG con la variabile flag non funziona, se invece gli assegno direttamente il valore 0 o 1 allora funziona. Perchè?

Curiosità…
a livello di “dita che premono sulla tastiera” che vantaggio c’è a cambiare true con false rispetto a cambiare 1 con 0?

non ho capito cosa intendi dire. Cmq si immagino che true o 1 e viceversa siano la stessa cosa

Lascia perdere la variabile. Usa solo da #define.

@fratt …in arduino, come riportato nel reference, false e 0 (zero) sono la stessa cosa…invece true si “traduce” in un qualsiasi numero diverso da 0 (zero)…con relativi problemi se non si sta attenti.

@droidprova …la direttiva #define istruisce il preprocessore, che legge la definizione della MACRO, che ogni volta che ne incontra il nome all’interno del file sorgente SOSTITUISCE al simbolo il corrispondente valore…tutto questo a compile time…e non a runtime…aggiungere una varialbile non ha senso…c’è già la #define che fa quel che deve fare ed è, dal mio punto di vista, più chiara.

Questo lo so. Polemizzavo solo sul fatto che sostituire true con false nella variabile implica premere almeno 4 pulsanti, mentre sostituire 1 con 0 nella define te ne fa premere solo 1.

Grazie Orso, quindi a programma compilato e riversato nel micro, al fine di stampare righe utili al debug, non è possibile cambiare lo stato di DEBUG e convertirlo da 0 a 1?

Grazie

No, in questo modo non è possibile. Dovresti invece vincolare il print allo stato di una variabile, ma questo comporta che tutto ciò che riguarda il debug viene compilato in ogni caso.
Ma nel momento che passi un programma dallo stato di “debug” a quello di “produzione”, non ha molto senso tenere in memoria funzionalità che non servono.

No

true si traduce in 1
È una macro definita dallo standard di C

È in ‘ingresso’ che diverso da 0 è sinonimo di true

Ok grazie a tutti!