Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b80243e

Browse files
authoredApr 3, 2019
Simplify debug message with variadic arguments (#44)
* Changing debug method to allow variadic arguments for simplifying debugging code * Using a enum class for improved readabilty on the currently used debug level * Adding function 'debugMessageNoTimestamp' to print a debug message without a timestamp * Changing bracing style to K&R employed in the rest of the file * Select your desired output stream for debug messages via 'setDebugOutputStream' * Adding missing header include guards
1 parent a43c6b4 commit b80243e

6 files changed

+162
-145
lines changed
 

‎src/ArduinoIoTCloud.cpp

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ static unsigned long getTime() {
4040
if (!getTimeConnection) return 0;
4141
unsigned long time = getTimeConnection->getTime();
4242
if (!NTPUtils::isTimeValid(time)) {
43-
debugMessage("Bogus NTP time from API, fallback to UDP method", 0);
43+
debugMessage(DebugLevel::Error, "Bogus NTP time from API, fallback to UDP method");
4444
time = NTPUtils(getTimeConnection->getUDP()).getTime();
4545
}
4646
#ifdef ARDUINO_ARCH_SAMD
@@ -109,18 +109,18 @@ int ArduinoIoTCloudClass::begin(Client& net, String brokerAddress, uint16_t brok
109109
byte deviceIdBytes[72];
110110

111111
if (!ECCX08.begin()) {
112-
debugMessage("Cryptography processor failure. Make sure you have a compatible board.", 0);
112+
debugMessage(DebugLevel::Error, "Cryptography processor failure. Make sure you have a compatible board.");
113113
return 0;
114114
}
115115

116116
if (!ECCX08.readSlot(deviceIdSlot, deviceIdBytes, sizeof(deviceIdBytes))) {
117-
debugMessage("Cryptography processor read failure.", 0);
117+
debugMessage(DebugLevel::Error, "Cryptography processor read failure.");
118118
return 0;
119119
}
120120
_device_id = (char*)deviceIdBytes;
121121

122122
if (!ECCX08Cert.beginReconstruction(keySlot, compressedCertSlot, serialNumberAndAuthorityKeyIdentifierSlot)) {
123-
debugMessage("Cryptography certificate reconstruction failure.", 0);
123+
debugMessage(DebugLevel::Error, "Cryptography certificate reconstruction failure.");
124124
return 0;
125125
}
126126

@@ -131,7 +131,7 @@ int ArduinoIoTCloudClass::begin(Client& net, String brokerAddress, uint16_t brok
131131
ECCX08Cert.setIssuerCommonName("Arduino");
132132

133133
if (!ECCX08Cert.endReconstruction()) {
134-
debugMessage("Cryptography certificate reconstruction failure.", 0);
134+
debugMessage(DebugLevel::Error, "Cryptography certificate reconstruction failure.");
135135
return 0;
136136
}
137137

@@ -386,49 +386,43 @@ void ArduinoIoTCloudClass::connectionCheck()
386386
}
387387
}
388388

389-
char msgBuffer[120];
390-
391-
392389
switch (iotStatus) {
393390
case IOT_STATUS_CLOUD_IDLE:
394391
setIoTConnectionState(IOT_STATUS_CLOUD_CONNECTING);
395392
break;
396393
case IOT_STATUS_CLOUD_ERROR:
397-
debugMessage("Cloud Error. Retrying...", 0);
394+
debugMessage(DebugLevel::Error, "Cloud Error. Retrying...");
398395
setIoTConnectionState(IOT_STATUS_CLOUD_RECONNECTING);
399396
break;
400397
case IOT_STATUS_CLOUD_CONNECTED:
401-
debugMessage(".", 4, false, true);
398+
debugMessageNoTimestamp(DebugLevel::Verbose, ".");
402399
if (!_mqttClient->connected()){
403400
setIoTConnectionState(IOT_STATUS_CLOUD_DISCONNECTED);
404401
}
405402
break;
406403
case IOT_STATUS_CLOUD_DISCONNECTED:
407404
setIoTConnectionState(IOT_STATUS_CLOUD_RECONNECTING);
408405
break;
409-
case IOT_STATUS_CLOUD_RECONNECTING:
410-
int arduinoIoTReconnectionAttempt;
411-
arduinoIoTReconnectionAttempt = reconnect(*_net);
412-
sprintf(msgBuffer, "ArduinoCloud.reconnect(): %d", arduinoIoTReconnectionAttempt);
413-
debugMessage(msgBuffer, 2);
414-
if (arduinoIoTReconnectionAttempt == 1) {
406+
case IOT_STATUS_CLOUD_RECONNECTING: {
407+
int const ret_code_reconnect = reconnect(*_net);
408+
debugMessage(DebugLevel::Info, "ArduinoCloud.reconnect(): %d", ret_code_reconnect);
409+
if (ret_code_reconnect == CONNECT_SUCCESS) {
415410
setIoTConnectionState(IOT_STATUS_CLOUD_CONNECTED);
416411
CloudSerial.begin(9600);
417412
CloudSerial.println("Hello from Cloud Serial!");
418413
}
414+
}
419415
break;
420416
case IOT_STATUS_CLOUD_CONNECTING:
421417
int const ret_code_connect = connect();
422-
sprintf(msgBuffer, "ArduinoCloud.connect(): %d", ret_code_connect);
423-
debugMessage(msgBuffer, 4);
418+
debugMessage(DebugLevel::Verbose, "ArduinoCloud.connect(): %d", ret_code_connect);
424419
if (ret_code_connect == CONNECT_SUCCESS) {
425420
setIoTConnectionState(IOT_STATUS_CLOUD_CONNECTED);
426421
CloudSerial.begin(9600);
427422
CloudSerial.println("Hello from Cloud Serial!");
428423
}
429424
else if (ret_code_connect == CONNECT_FAILURE_SUBSCRIBE) {
430-
sprintf(msgBuffer, "ERROR - Please verify your THING ID");
431-
debugMessage(msgBuffer, 0);
425+
debugMessage(DebugLevel::Info, "ERROR - Please verify your THING ID");
432426
}
433427
break;
434428
}
@@ -438,34 +432,30 @@ void ArduinoIoTCloudClass::setIoTConnectionState(ArduinoIoTConnectionStatus _new
438432
{
439433
switch(_newState){
440434
case IOT_STATUS_CLOUD_ERROR:
441-
debugMessage("Arduino, we have a problem.", 0);
435+
debugMessage(DebugLevel::Error, "Arduino, we have a problem.");
442436
break;
443437
case IOT_STATUS_CLOUD_CONNECTING:
444-
debugMessage("Connecting to Arduino IoT Cloud...", 0);
438+
debugMessage(DebugLevel::Error, "Connecting to Arduino IoT Cloud...");
445439
break;
446440
case IOT_STATUS_CLOUD_RECONNECTING:
447-
debugMessage("Reconnecting to Arduino IoT Cloud...", 0);
441+
debugMessage(DebugLevel::Error, "Reconnecting to Arduino IoT Cloud...");
448442
break;
449443
case IOT_STATUS_CLOUD_CONNECTED:
450-
debugMessage("Connected to Arduino IoT Cloud", 0);
444+
debugMessage(DebugLevel::Error, "Connected to Arduino IoT Cloud");
451445
break;
452446
case IOT_STATUS_CLOUD_DISCONNECTED:
453-
debugMessage("Disconnected from Arduino IoT Cloud", 0);
447+
debugMessage(DebugLevel::Error, "Disconnected from Arduino IoT Cloud");
454448
break;
455449
}
456450
iotStatus = _newState;
457451
}
458452

459453
void ArduinoIoTCloudClass::printDebugInfo()
460454
{
461-
char msgBuffer[120];
462-
debugMessage("***** Arduino IoT Cloud - configuration info *****", 2);
463-
sprintf(msgBuffer, "Device ID: %s", getDeviceId().c_str());
464-
debugMessage(msgBuffer, 2);
465-
sprintf(msgBuffer, "Thing ID: %s", getThingId().c_str());
466-
debugMessage(msgBuffer, 2);
467-
sprintf(msgBuffer, "MQTT Broker: %s:%d", _brokerAddress.c_str(), _brokerPort);
468-
debugMessage(msgBuffer, 2);
455+
debugMessage(DebugLevel::Info, "***** Arduino IoT Cloud - configuration info *****");
456+
debugMessage(DebugLevel::Info, "Device ID: %s", getDeviceId().c_str());
457+
debugMessage(DebugLevel::Info, "Thing ID: %s", getThingId().c_str());
458+
debugMessage(DebugLevel::Info, "MQTT Broker: %s:%d", _brokerAddress.c_str(), _brokerPort);
469459
}
470460

471461
ArduinoIoTCloudClass ArduinoCloud;

‎src/EthernetConnectionManager.cpp

Lines changed: 16 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ unsigned long EthConnectionManager::getTime() {
5353
}
5454

5555
void EthConnectionManager::check() {
56-
char msgBuffer[120];
5756
unsigned long const now = millis();
5857
int networkStatus = 0;
5958
if (now - lastConnectionTickTime > connectionTickTimeInterval) {
@@ -65,69 +64,50 @@ void EthConnectionManager::check() {
6564
networkStatus = Ethernet.begin(mac, ss_pin);
6665
}
6766
networkStatus = Ethernet.hardwareStatus();
68-
*msgBuffer = 0;
69-
sprintf(msgBuffer, "Eth hardware status(): %d", networkStatus);
70-
debugMessage(msgBuffer, 2);
67+
debugMessage(DebugLevel::Info, "Eth hardware status(): %d", networkStatus);
7168
if (networkStatus == EthernetNoHardware) {
72-
debugMessage("No Ethernet chip connected", 0);
69+
debugMessage(DebugLevel::Error, "No Ethernet chip connected");
7370
// don't continue:
7471
changeConnectionState(CONNECTION_STATE_ERROR);
7572
lastConnectionTickTime = now;
7673
return;
7774
}
7875
networkStatus = Ethernet.linkStatus();
79-
*msgBuffer = 0;
80-
sprintf(msgBuffer, "Eth link status(): %d", networkStatus);
81-
debugMessage(msgBuffer, 2);
76+
debugMessage(DebugLevel::Info, "Eth link status(): %d", networkStatus);
8277
if (networkStatus == LinkOFF) {
83-
debugMessage("Failed to configure Ethernet via dhcp", 0);
78+
debugMessage(DebugLevel::Error, "Failed to configure Ethernet via dhcp");
8479
// don't continue:
8580
changeConnectionState(CONNECTION_STATE_ERROR);
8681
lastConnectionTickTime = now;
8782
return;
8883
}
89-
*msgBuffer = 0;
90-
sprintf(msgBuffer, "Ethernet shield recognized: ID", Ethernet.hardwareStatus());
91-
debugMessage(msgBuffer, 0);
84+
debugMessage(DebugLevel::Error, "Ethernet shield recognized: ID", Ethernet.hardwareStatus());
9285
changeConnectionState(CONNECTION_STATE_CONNECTING);
9386
break;
9487
case CONNECTION_STATE_CONNECTING:
95-
*msgBuffer = 0;
96-
sprintf(msgBuffer, "Connecting via dhcp");
97-
debugMessage(msgBuffer, 2);
88+
debugMessage(DebugLevel::Info, "Connecting via dhcp");
9889
if (ss_pin == -1) {
9990
networkStatus = Ethernet.begin(mac);
10091
} else {
10192
networkStatus = Ethernet.begin(mac, ss_pin);
10293
}
103-
*msgBuffer = 0;
104-
sprintf(msgBuffer, "Ethernet.status(): %d", networkStatus);
105-
debugMessage(msgBuffer, 2);
94+
debugMessage(DebugLevel::Info, "Ethernet.status(): %d", networkStatus);
10695
if (networkStatus == 0) {
107-
*msgBuffer = 0;
108-
sprintf(msgBuffer, "Connection failed");
109-
debugMessage(msgBuffer, 0);
110-
111-
*msgBuffer = 0;
112-
sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
113-
debugMessage(msgBuffer, 2);
96+
debugMessage(DebugLevel::Error, "Connection failed");
97+
debugMessage(DebugLevel::Info, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
11498
//changeConnectionState(CONNECTION_STATE_CONNECTING);
11599
return;
116100
} else {
117-
*msgBuffer = 0;
118-
sprintf(msgBuffer, "Connected!");
119-
debugMessage(msgBuffer, 2);
101+
debugMessage(DebugLevel::Info, "Connected!");
120102
changeConnectionState(CONNECTION_STATE_GETTIME);
121103
return;
122104
}
123105
break;
124106
case CONNECTION_STATE_GETTIME:
125-
debugMessage("Acquiring Time from Network", 3);
107+
debugMessage(DebugLevel::Debug, "Acquiring Time from Network");
126108
unsigned long networkTime;
127109
networkTime = getTime();
128-
*msgBuffer = 0;
129-
sprintf(msgBuffer, "Network Time: %u", networkTime);
130-
debugMessage(msgBuffer, 3);
110+
debugMessage(DebugLevel::Debug, "Network Time: %u", networkTime);
131111
if(networkTime > lastValidTimestamp){
132112
lastValidTimestamp = networkTime;
133113
changeConnectionState(CONNECTION_STATE_CONNECTED);
@@ -137,22 +117,16 @@ void EthConnectionManager::check() {
137117
// keep testing connection
138118
Ethernet.maintain();
139119
networkStatus = Ethernet.linkStatus();
140-
*msgBuffer = 0;
141-
sprintf(msgBuffer, "Eth link status(): %d", networkStatus);
142-
debugMessage(msgBuffer, 4);
120+
debugMessage(DebugLevel::Verbose, "Eth link status(): %d", networkStatus);
143121
if (networkStatus != LinkON) {
144122
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
145123
return;
146124
}
147-
*msgBuffer = 0;
148-
sprintf(msgBuffer, "Connected");
149-
debugMessage(msgBuffer, 2);
125+
debugMessage(DebugLevel::Info, "Connected");
150126
break;
151127
case CONNECTION_STATE_DISCONNECTED:
152-
*msgBuffer = 0;
153-
sprintf(msgBuffer, "Connection lost.");
154-
debugMessage(msgBuffer, 0);
155-
debugMessage("Attempting reconnection", 1);
128+
debugMessage(DebugLevel::Error, "Connection lost.");
129+
debugMessage(DebugLevel::Info, "Attempting reconnection");
156130
changeConnectionState(CONNECTION_STATE_CONNECTING);
157131
//wifiClient.stop();
158132
break;

‎src/GSMConnectionManager.cpp

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ GSMConnectionManager::GSMConnectionManager(const char *pin, const char *apn, con
4949
void GSMConnectionManager::init() {
5050
char msgBuffer[120];
5151
if (gsmAccess.begin(pin) == GSM_READY) {
52-
debugMessage("SIM card ok", 2);
52+
debugMessage(DebugLevel::Info, "SIM card ok");
5353
gsmAccess.setTimeout(CHECK_INTERVAL_RETRYING);
5454
changeConnectionState(CONNECTION_STATE_CONNECTING);
5555
} else {
56-
debugMessage("SIM not present or wrong PIN", 0);
56+
debugMessage(DebugLevel::Error, "SIM not present or wrong PIN");
5757
while(1);
5858
}
5959
}
@@ -63,7 +63,6 @@ unsigned long GSMConnectionManager::getTime() {
6363
}
6464

6565
void GSMConnectionManager::check() {
66-
char msgBuffer[120];
6766
unsigned long const now = millis();
6867
int gsmAccessAlive;
6968
if (now - lastConnectionTickTime > connectionTickTimeInterval) {
@@ -75,40 +74,34 @@ void GSMConnectionManager::check() {
7574
// NOTE: Blocking Call when 4th parameter == true
7675
GSM3_NetworkStatus_t networkStatus;
7776
networkStatus = gprs.attachGPRS(apn, login, pass, true);
78-
sprintf(msgBuffer, "GPRS.attachGPRS(): %d", networkStatus);
79-
debugMessage(msgBuffer, 3);
77+
debugMessage(DebugLevel::Debug, "GPRS.attachGPRS(): %d", networkStatus);
8078
if (networkStatus == GSM3_NetworkStatus_t::ERROR) {
8179
// NO FURTHER ACTION WILL FOLLOW THIS
8280
changeConnectionState(CONNECTION_STATE_ERROR);
8381
return;
8482
}
85-
debugMessage("Sending PING to outer space...", 2);
83+
debugMessage(DebugLevel::Info, "Sending PING to outer space...");
8684
int pingResult;
8785
pingResult = gprs.ping("time.arduino.cc");
88-
sprintf(msgBuffer, "GSM.ping(): %d", pingResult);
89-
debugMessage(msgBuffer, 2);
86+
debugMessage(DebugLevel::Info, "GSM.ping(): %d", pingResult);
9087
if (pingResult < 0) {
91-
debugMessage("PING failed", 0);
92-
sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
93-
debugMessage(msgBuffer, 2);
88+
debugMessage(DebugLevel::Error, "PING failed");
89+
debugMessage(DebugLevel::Info, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
9490
return;
9591
} else {
96-
sprintf(msgBuffer, "Connected to GPRS Network");
97-
debugMessage(msgBuffer, 2);
92+
debugMessage(DebugLevel::Info, "Connected to GPRS Network");
9893
changeConnectionState(CONNECTION_STATE_CONNECTED);
9994
return;
10095
}
10196
break;
10297
case CONNECTION_STATE_CONNECTED:
10398
gsmAccessAlive = gsmAccess.isAccessAlive();
104-
sprintf(msgBuffer, "GPRS.isAccessAlive(): %d", gsmAccessAlive);
105-
debugMessage(msgBuffer, 4);
99+
debugMessage(DebugLevel::Verbose, "GPRS.isAccessAlive(): %d", gsmAccessAlive);
106100
if (gsmAccessAlive != 1) {
107101
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
108102
return;
109103
}
110-
sprintf(msgBuffer, "Connected to Cellular Network");
111-
debugMessage(msgBuffer, 4);
104+
debugMessage(DebugLevel::Verbose, "Connected to Cellular Network");
112105
break;
113106
case CONNECTION_STATE_DISCONNECTED:
114107
gprs.detachGPRS();
@@ -131,22 +124,21 @@ void GSMConnectionManager::changeConnectionState(NetworkConnectionState _newStat
131124
newInterval = CHECK_INTERVAL_INIT;
132125
break;
133126
case CONNECTION_STATE_CONNECTING:
134-
sprintf(msgBuffer, "Connecting to Cellular Network");
135-
debugMessage(msgBuffer, 2);
127+
debugMessage(DebugLevel::Info, "Connecting to Cellular Network");
136128
newInterval = CHECK_INTERVAL_CONNECTING;
137129
break;
138130
case CONNECTION_STATE_CONNECTED:
139131
newInterval = CHECK_INTERVAL_CONNECTED;
140132
break;
141133
case CONNECTION_STATE_DISCONNECTED:
142134
if(netConnectionState == CONNECTION_STATE_CONNECTED){
143-
debugMessage("Disconnected from Cellular Network", 0);
144-
debugMessage("Attempting reconnection", 0);
135+
debugMessage(DebugLevel::Error, "Disconnected from Cellular Network");
136+
debugMessage(DebugLevel::Error, "Attempting reconnection");
145137
}
146138
newInterval = CHECK_INTERVAL_DISCONNECTED;
147139
break;
148140
case CONNECTION_STATE_ERROR:
149-
debugMessage("GPRS attach failed\nMake sure the antenna is connected and reset your board.", 0);
141+
debugMessage(DebugLevel::Error, "GPRS attach failed\n\rMake sure the antenna is connected and reset your board.");
150142
break;
151143
}
152144
connectionTickTimeInterval = newInterval;

‎src/WiFiConnectionManager.cpp

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -52,60 +52,50 @@ unsigned long WiFiConnectionManager::getTime() {
5252
}
5353

5454
void WiFiConnectionManager::check() {
55-
char msgBuffer[120];
5655
unsigned long const now = millis();
5756
int networkStatus = 0;
5857
if (now - lastConnectionTickTime > connectionTickTimeInterval) {
5958
switch (netConnectionState) {
6059
case CONNECTION_STATE_INIT:
6160
networkStatus = WiFi.status();
62-
sprintf(msgBuffer, "WiFi.status(): %d", networkStatus);
63-
debugMessage(msgBuffer, 2);
61+
debugMessage(DebugLevel::Info, "WiFi.status(): %d", networkStatus);
6462
if (networkStatus == NETWORK_HARDWARE_ERROR) {
6563
// NO FURTHER ACTION WILL FOLLOW THIS
6664
changeConnectionState(CONNECTION_STATE_ERROR);
6765
lastConnectionTickTime = now;
6866
return;
6967
}
70-
sprintf(msgBuffer, "Current WiFi Firmware: %s", WiFi.firmwareVersion());
71-
debugMessage(msgBuffer, 0);
68+
debugMessage(DebugLevel::Error, "Current WiFi Firmware: %s", WiFi.firmwareVersion());
7269
if(WiFi.firmwareVersion() < WIFI_FIRMWARE_VERSION_REQUIRED){
73-
sprintf(msgBuffer, "Latest WiFi Firmware: %s", WIFI_FIRMWARE_VERSION_REQUIRED);
74-
debugMessage(msgBuffer, 0);
75-
debugMessage("Please update to the latest version for best performance.", 0);
70+
debugMessage(DebugLevel::Error, "Latest WiFi Firmware: %s", WIFI_FIRMWARE_VERSION_REQUIRED);
71+
debugMessage(DebugLevel::Error, "Please update to the latest version for best performance.");
7672
delay(5000);
7773
}
7874
changeConnectionState(CONNECTION_STATE_CONNECTING);
7975
break;
8076
case CONNECTION_STATE_CONNECTING:
8177
networkStatus = WiFi.begin(ssid, pass);
82-
sprintf(msgBuffer, "WiFi.status(): %d", networkStatus);
83-
debugMessage(msgBuffer, 4);
78+
debugMessage(DebugLevel::Verbose, "WiFi.status(): %d", networkStatus);
8479
if (networkStatus != NETWORK_CONNECTED) {
85-
sprintf(msgBuffer, "Connection to \"%s\" failed", ssid);
86-
debugMessage(msgBuffer, 0);
87-
sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
88-
debugMessage(msgBuffer, 2);
80+
debugMessage(DebugLevel::Error, "Connection to \"%s\" failed", ssid);
81+
debugMessage(DebugLevel::Info, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
8982
//changeConnectionState(CONNECTION_STATE_CONNECTING);
9083
return;
9184
} else {
92-
sprintf(msgBuffer, "Connected to \"%s\"", ssid);
93-
debugMessage(msgBuffer, 2);
85+
debugMessage(DebugLevel::Info, "Connected to \"%s\"", ssid);
9486
changeConnectionState(CONNECTION_STATE_CONNECTED);
9587
return;
9688
}
9789
break;
9890
case CONNECTION_STATE_CONNECTED:
9991
// keep testing connection
10092
networkStatus = WiFi.status();
101-
sprintf(msgBuffer, "WiFi.status(): %d", networkStatus);
102-
debugMessage(msgBuffer, 4);
93+
debugMessage(DebugLevel::Verbose, "WiFi.status(): %d", networkStatus);
10394
if (networkStatus != WL_CONNECTED) {
10495
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
10596
return;
10697
}
107-
sprintf(msgBuffer, "Connected to \"%s\"", ssid);
108-
debugMessage(msgBuffer, 4);
98+
debugMessage(DebugLevel::Verbose, "Connected to \"%s\"", ssid);
10999
break;
110100
case CONNECTION_STATE_DISCONNECTED:
111101
WiFi.end();
@@ -128,24 +118,21 @@ void WiFiConnectionManager::changeConnectionState(NetworkConnectionState _newSta
128118
newInterval = CHECK_INTERVAL_INIT;
129119
break;
130120
case CONNECTION_STATE_CONNECTING:
131-
sprintf(msgBuffer, "Connecting to \"%s\"", ssid);
132-
debugMessage(msgBuffer, 2);
121+
debugMessage(DebugLevel::Info, "Connecting to \"%s\"", ssid);
133122
newInterval = CHECK_INTERVAL_CONNECTING;
134123
break;
135124
case CONNECTION_STATE_CONNECTED:
136125
newInterval = CHECK_INTERVAL_CONNECTED;
137126
break;
138127
case CONNECTION_STATE_DISCONNECTED:
139-
sprintf(msgBuffer, "WiFi.status(): %d", WiFi.status());
140-
debugMessage(msgBuffer, 4);
141-
sprintf(msgBuffer, "Connection to \"%s\" lost.", ssid);
142-
debugMessage(msgBuffer, 0);
143-
debugMessage("Attempting reconnection", 0);
128+
debugMessage(DebugLevel::Verbose, "WiFi.status(): %d", WiFi.status());
129+
debugMessage(DebugLevel::Error, "Connection to \"%s\" lost.", ssid);
130+
debugMessage(DebugLevel::Error, "Attempting reconnection");
144131
newInterval = CHECK_INTERVAL_DISCONNECTED;
145132
break;
146133
case CONNECTION_STATE_ERROR:
147-
debugMessage("WiFi Hardware failure.\nMake sure you are using a WiFi enabled board/shield.", 0);
148-
debugMessage("Then reset and retry.", 0);
134+
debugMessage(DebugLevel::Error, "WiFi Hardware failure.\nMake sure you are using a WiFi enabled board/shield.");
135+
debugMessage(DebugLevel::Error, "Then reset and retry.");
149136
break;
150137
}
151138
connectionTickTimeInterval = newInterval;

‎src/utility/DebugUtils.cpp

Lines changed: 70 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,88 @@
2121

2222
#include "DebugUtils.h"
2323

24+
#include <stdarg.h>
25+
2426
/******************************************************************************
2527
* GLOBAL VARIABLES
2628
******************************************************************************/
2729

28-
static int debugMessageLevel = ARDUINO_IOT_CLOUD_DEFAULT_DEBUG_LEVEL;
30+
static DebugLevel current_debug_level = ARDUINO_IOT_CLOUD_DEFAULT_DEBUG_LEVEL;
31+
static Stream * debug_output_stream = &Serial;
32+
33+
/******************************************************************************
34+
* PRIVATE PROTOTYPES
35+
******************************************************************************/
36+
37+
void vDebugMessage(char const * fmt, va_list args);
2938

3039
/******************************************************************************
3140
* PUBLIC FUNCTIONS
3241
******************************************************************************/
3342

34-
void setDebugMessageLevel(int const debugLevel) {
35-
debugMessageLevel = debugLevel;
43+
void setDebugMessageLevel(int const debug_level)
44+
{
45+
switch(debug_level) {
46+
case -1: setDebugMessageLevel(DebugLevel::None ); break;
47+
case 0: setDebugMessageLevel(DebugLevel::Error ); break;
48+
case 1: setDebugMessageLevel(DebugLevel::Warning ); break;
49+
case 2: setDebugMessageLevel(DebugLevel::Info ); break;
50+
case 3: setDebugMessageLevel(DebugLevel::Debug ); break;
51+
case 4: setDebugMessageLevel(DebugLevel::Verbose ); break;
52+
default: setDebugMessageLevel(ARDUINO_IOT_CLOUD_DEFAULT_DEBUG_LEVEL); break;
53+
}
54+
}
55+
56+
void setDebugMessageLevel(DebugLevel const debug_level)
57+
{
58+
current_debug_level = debug_level;
59+
}
60+
61+
void setDebugOutputStream(Stream * stream)
62+
{
63+
debug_output_stream = stream;
3664
}
3765

38-
void debugMessage(char * msg, int const debugLevel, bool const timestamp, bool const newline) {
39-
if(debugLevel < 0){
40-
return;
66+
void debugMessage(DebugLevel const debug_level, char * fmt, ...)
67+
{
68+
if(debug_level >= DebugLevel::Error &&
69+
debug_level <= DebugLevel::Verbose &&
70+
debug_level <= current_debug_level) {
71+
72+
char timestamp[20];
73+
snprintf(timestamp, 20, "[ %d ] ", millis());
74+
debug_output_stream->print(timestamp);
75+
76+
va_list args;
77+
va_start(args, fmt);
78+
vDebugMessage(fmt, args);
79+
va_end(args);
4180
}
81+
}
82+
83+
void debugMessageNoTimestamp(DebugLevel const debug_level, char * fmt, ...)
84+
{
85+
if(debug_level >= DebugLevel::Error &&
86+
debug_level <= DebugLevel::Verbose &&
87+
debug_level <= current_debug_level) {
4288

43-
if (debugLevel <= debugMessageLevel) {
44-
if(timestamp) {
45-
char prepend[20];
46-
sprintf(prepend, "\n[ %d ] ", millis());
47-
Serial.print(prepend);
48-
}
49-
if (newline) Serial.println(msg);
50-
else Serial.print (msg);
89+
va_list args;
90+
va_start(args, fmt);
91+
vDebugMessage(fmt, args);
92+
va_end(args);
5193
}
5294
}
95+
96+
/******************************************************************************
97+
* PRIVATE FUNCTIONS
98+
******************************************************************************/
99+
100+
void vDebugMessage(char const * fmt, va_list args)
101+
{
102+
static size_t const MSG_BUF_SIZE = 120;
103+
char msg_buf[MSG_BUF_SIZE] = {0};
104+
105+
vsnprintf(msg_buf, MSG_BUF_SIZE, fmt, args);
106+
107+
debug_output_stream->println(msg_buf);
108+
}

‎src/utility/DebugUtils.h

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,42 @@
1515
* a commercial license, send an email to license@arduino.cc.
1616
*/
1717

18+
#ifndef DEBUG_UTILS_H_
19+
#define DEBUG_UTILS_H_
20+
1821
/******************************************************************************
1922
* INCLUDE
2023
******************************************************************************/
2124

2225
#include <Arduino.h>
2326

2427
/******************************************************************************
25-
* CONSTANTS
28+
* TYPEDEF
2629
******************************************************************************/
2730

28-
static int const ARDUINO_IOT_CLOUD_DEFAULT_DEBUG_LEVEL = 2;
31+
enum class DebugLevel : int {
32+
None = -1,
33+
Error = 0,
34+
Warning = 1,
35+
Info = 2,
36+
Debug = 3,
37+
Verbose = 4
38+
};
2939

3040
/******************************************************************************
31-
* PROTOTYPES
41+
* CONSTANTS
3242
******************************************************************************/
3343

34-
void setDebugMessageLevel(int debugLevel);
35-
void debugMessage(char * msg, int const debugLevel, bool const timestamp = true, bool const newline = true);
44+
static DebugLevel const ARDUINO_IOT_CLOUD_DEFAULT_DEBUG_LEVEL = DebugLevel::Info;
3645

46+
/******************************************************************************
47+
* PROTOTYPES
48+
******************************************************************************/
3749

50+
void setDebugMessageLevel (int const debug_level); /* For backwards compatibility */
51+
void setDebugMessageLevel (DebugLevel const debug_level);
52+
void setDebugOutputStream (Stream * stream);
53+
void debugMessage (DebugLevel const debug_level, char * fmt, ...);
54+
void debugMessageNoTimestamp(DebugLevel const debug_level, char * fmt, ...);
3855

56+
#endif /* DEBUG_UTILS_H_ */

0 commit comments

Comments
 (0)
Please sign in to comment.