Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of WIZwiki-7500_Blynk by
BlynkDebug.h
00001 /** 00002 * @file BlynkDebug.h 00003 * @author Volodymyr Shymanskyy 00004 * @license This project is released under the MIT License (MIT) 00005 * @copyright Copyright (c) 2015 Volodymyr Shymanskyy 00006 * @date Jan 2015 00007 * @brief Debug utilities 00008 * 00009 */ 00010 00011 #ifndef BlynkDebug_h 00012 #define BlynkDebug_h 00013 00014 #include <Blynk/BlynkConfig.h> 00015 #include <stddef.h> 00016 #ifdef ESP8266 00017 extern "C" { 00018 #include "ets_sys.h" 00019 #include "os_type.h" 00020 #include "mem.h" 00021 } 00022 #else 00023 #include <inttypes.h> 00024 #endif 00025 00026 #if defined(ARDUINO_ARCH_ARC32) 00027 typedef uint64_t millis_time_t; 00028 #else 00029 typedef uint32_t millis_time_t; 00030 #endif 00031 00032 #if defined(SPARK) || defined(PARTICLE) 00033 #include "application.h" 00034 #endif 00035 00036 #if defined(ARDUINO) 00037 #if ARDUINO >= 100 00038 #include <Arduino.h> 00039 #else 00040 #include <WProgram.h> 00041 #endif 00042 #endif 00043 00044 #if defined(LINUX) 00045 #if defined(RASPBERRY) 00046 #include <wiringPi.h> 00047 #else 00048 #define _POSIX_C_SOURCE 200809L 00049 #include <time.h> 00050 #include <unistd.h> 00051 00052 static inline 00053 void delay(unsigned long ms) 00054 { 00055 usleep(ms * 1000); 00056 } 00057 00058 static 00059 millis_time_t millis() 00060 { 00061 struct timespec ts; 00062 clock_gettime(CLOCK_MONOTONIC, &ts ); 00063 return ( ts.tv_sec * 1000 + ts.tv_nsec / 1000000L ); 00064 } 00065 #endif 00066 #endif 00067 00068 #if !defined(BLYNK_RUN_YIELD) 00069 #if defined(BLYNK_NO_YIELD) 00070 #define BLYNK_RUN_YIELD() {} 00071 #elif defined(SPARK) || defined(PARTICLE) 00072 #define BLYNK_RUN_YIELD() { Particle.process(); } 00073 #elif !defined(ARDUINO) || (ARDUINO < 151) 00074 #define BLYNK_RUN_YIELD() {} 00075 #else 00076 #define BLYNK_RUN_YIELD() { ::delay(0); } 00077 #endif 00078 #endif 00079 00080 #if defined(__AVR__) 00081 #include <avr/pgmspace.h> 00082 #define BLYNK_HAS_PROGMEM 00083 #define BLYNK_PROGMEM PROGMEM 00084 #define BLYNK_F(s) F(s) 00085 #define BLYNK_PSTR(s) PSTR(s) 00086 #else 00087 #define BLYNK_PROGMEM 00088 #define BLYNK_F(s) s 00089 #define BLYNK_PSTR(s) s 00090 #endif 00091 00092 #ifdef ARDUINO_AVR_DIGISPARK 00093 typedef fstr_t __FlashStringHelper; 00094 #endif 00095 00096 #if defined(BLYNK_DEBUG_ALL) && !(__cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)) 00097 #warning "Compiler features not enabled -> please contact yor board vendor to enable c++0x" 00098 #endif 00099 00100 // Diagnostic defines 00101 00102 size_t BlynkFreeRam(); 00103 void BlynkReset() BLYNK_NORETURN; 00104 void BlynkFatal() BLYNK_NORETURN; 00105 00106 #define BLYNK_FATAL(msg) { BLYNK_LOG1(msg); BlynkFatal(); } 00107 #define BLYNK_LOG_RAM() { BLYNK_LOG2(BLYNK_F("Free RAM: "), BlynkFreeRam()); } 00108 #define BLYNK_LOG_FN() BLYNK_LOG3(BLYNK_F(__FUNCTION__), '@', __LINE__); 00109 #define BLYNK_LOG_TROUBLE(t) BLYNK_LOG2(BLYNK_F("Trouble detected: http://docs.blynk.cc/#troubleshooting-"), t) 00110 00111 #ifndef BLYNK_PRINT 00112 #undef BLYNK_DEBUG 00113 #endif 00114 00115 #ifdef BLYNK_PRINT 00116 00117 #if defined(ARDUINO) || defined(SPARK) || defined(PARTICLE) 00118 00119 #if defined(ARDUINO_ARCH_ARC32) 00120 // This will cause error - on purpose 00121 #define BLYNK_LOG(msg, ...) BLYNK_LOG_UNAVAILABLE(msg, ##__VA_ARGS__) 00122 #else 00123 #define BLYNK_LOG(msg, ...) blynk_dbg_print(BLYNK_PSTR(msg), ##__VA_ARGS__) 00124 #endif 00125 00126 #define BLYNK_LOG1(p1) { BLYNK_LOG_TIME(); BLYNK_PRINT.println(p1); } 00127 #define BLYNK_LOG2(p1,p2) { BLYNK_LOG_TIME(); BLYNK_PRINT.print(p1); BLYNK_PRINT.println(p2); } 00128 #define BLYNK_LOG3(p1,p2,p3) { BLYNK_LOG_TIME(); BLYNK_PRINT.print(p1); BLYNK_PRINT.print(p2); BLYNK_PRINT.println(p3); } 00129 #define BLYNK_LOG4(p1,p2,p3,p4) { BLYNK_LOG_TIME(); BLYNK_PRINT.print(p1); BLYNK_PRINT.print(p2); BLYNK_PRINT.print(p3); BLYNK_PRINT.println(p4); } 00130 #define BLYNK_LOG6(p1,p2,p3,p4,p5,p6) { BLYNK_LOG_TIME(); BLYNK_PRINT.print(p1); BLYNK_PRINT.print(p2); BLYNK_PRINT.print(p3); BLYNK_PRINT.print(p4); BLYNK_PRINT.print(p5); BLYNK_PRINT.println(p6); } 00131 #define BLYNK_LOG_IP(msg, ip) { BLYNK_LOG_TIME(); BLYNK_PRINT.print(BLYNK_F(msg)); \ 00132 BLYNK_PRINT.print(ip[0]); BLYNK_PRINT.print('.'); \ 00133 BLYNK_PRINT.print(ip[1]); BLYNK_PRINT.print('.'); \ 00134 BLYNK_PRINT.print(ip[2]); BLYNK_PRINT.print('.'); \ 00135 BLYNK_PRINT.println(ip[3]); } 00136 #define BLYNK_LOG_IP_REV(msg, ip) { BLYNK_LOG_TIME(); BLYNK_PRINT.print(BLYNK_F(msg)); \ 00137 BLYNK_PRINT.print(ip[3]); BLYNK_PRINT.print('.'); \ 00138 BLYNK_PRINT.print(ip[2]); BLYNK_PRINT.print('.'); \ 00139 BLYNK_PRINT.print(ip[1]); BLYNK_PRINT.print('.'); \ 00140 BLYNK_PRINT.println(ip[0]); } 00141 00142 static 00143 void BLYNK_LOG_TIME() { 00144 BLYNK_PRINT.print('['); 00145 BLYNK_PRINT.print(millis()); 00146 BLYNK_PRINT.print(BLYNK_F("] ")); 00147 } 00148 00149 #ifdef BLYNK_DEBUG 00150 #include <ctype.h> 00151 #define BLYNK_DBG_BREAK() { for(;;); } 00152 #define BLYNK_ASSERT(expr) { if(!(expr)) { BLYNK_LOG2(BLYNK_F("Assertion failed: "), BLYNK_F(#expr)); BLYNK_DBG_BREAK() } } 00153 00154 static 00155 void BLYNK_DBG_DUMP(const char* msg, const void* addr, size_t len) { 00156 if (len) { 00157 BLYNK_LOG_TIME(); 00158 BLYNK_PRINT.print(msg); 00159 int l2 = len; 00160 const uint8_t* octets = (const uint8_t*)addr; 00161 bool prev_print = true; 00162 while (l2--) { 00163 const uint8_t c = *octets++ & 0xFF; 00164 if (c >= 32 && c < 127) { 00165 if (!prev_print) { BLYNK_PRINT.print(']'); } 00166 BLYNK_PRINT.print((char)c); 00167 prev_print = true; 00168 } else { 00169 BLYNK_PRINT.print(prev_print?'[':'|'); 00170 if (c < 0x10) { BLYNK_PRINT.print('0'); } 00171 BLYNK_PRINT.print(c, HEX); 00172 prev_print = false; 00173 } 00174 } 00175 if (!prev_print) { 00176 BLYNK_PRINT.print(']'); 00177 } 00178 BLYNK_PRINT.println(); 00179 } 00180 } 00181 #endif 00182 00183 #if !defined(ARDUINO_ARCH_ARC32) 00184 #include <stdio.h> 00185 #include <stdarg.h> 00186 00187 BLYNK_UNUSED 00188 void blynk_dbg_print(const char* BLYNK_PROGMEM fmt, ...) 00189 { 00190 va_list ap; 00191 va_start(ap, fmt); 00192 char buff[128]; 00193 BLYNK_PRINT.print('['); 00194 BLYNK_PRINT.print(millis()); 00195 BLYNK_PRINT.print(BLYNK_F("] ")); 00196 #if defined(__AVR__) 00197 vsnprintf_P(buff, sizeof(buff), fmt, ap); 00198 #else 00199 vsnprintf(buff, sizeof(buff), fmt, ap); 00200 #endif 00201 BLYNK_PRINT.println(buff); 00202 va_end(ap); 00203 } 00204 #endif // ARDUINO_ARCH_ARC32 00205 00206 #elif defined(MBED_LIBRARY_VERSION) 00207 00208 //TODO 00209 00210 #elif defined(LINUX) 00211 00212 #include <assert.h> 00213 #include <stdio.h> 00214 #include <string.h> 00215 #include <errno.h> 00216 #include <signal.h> 00217 00218 #include <iostream> 00219 using namespace std; 00220 #define BLYNK_LOG(msg, ...) { fprintf(BLYNK_PRINT, "[%ld] " msg "\n", millis(), ##__VA_ARGS__); } 00221 #define BLYNK_LOG1(p1) { BLYNK_LOG_TIME(); cout << p1 << endl; } 00222 #define BLYNK_LOG2(p1,p2) { BLYNK_LOG_TIME(); cout << p1 << p2 << endl; } 00223 #define BLYNK_LOG3(p1,p2,p3) { BLYNK_LOG_TIME(); cout << p1 << p2 << p3 << endl; } 00224 #define BLYNK_LOG4(p1,p2,p3,p4) { BLYNK_LOG_TIME(); cout << p1 << p2 << p3 << p4 << endl; } 00225 #define BLYNK_LOG6(p1,p2,p3,p4,p5,p6) { BLYNK_LOG_TIME(); cout << p1 << p2 << p3 << p4 << p5 << p6 << endl; } 00226 00227 #define BLYNK_LOG_TIME() cout << '[' << millis() << "] "; 00228 00229 #ifdef BLYNK_DEBUG 00230 #define BLYNK_DBG_BREAK() raise(SIGTRAP); 00231 #define BLYNK_ASSERT(expr) assert(expr) 00232 00233 static 00234 void BLYNK_DBG_DUMP(const char* msg, const void* addr, size_t len) { 00235 BLYNK_LOG_TIME(); 00236 fprintf(BLYNK_PRINT, msg); 00237 int l2 = len; 00238 const uint8_t* octets = (const uint8_t*)addr; 00239 bool prev_print = true; 00240 while (l2--) { 00241 const uint8_t c = *octets++ & 0xFF; 00242 if (c > 31) { 00243 if (!prev_print) { fputc(']', BLYNK_PRINT); } 00244 fputc((char)c, BLYNK_PRINT); 00245 prev_print = true; 00246 } else { 00247 fputc(prev_print?'[':'|', BLYNK_PRINT); 00248 fprintf(BLYNK_PRINT, "%02x", c); 00249 prev_print = false; 00250 } 00251 } 00252 fprintf(BLYNK_PRINT, "%s\n", prev_print?"":"]"); 00253 } 00254 #endif 00255 00256 #else 00257 00258 #warning "Cannot detect platform" 00259 00260 #endif 00261 00262 #endif 00263 00264 #ifndef BLYNK_LOG 00265 #define BLYNK_LOG(...) 00266 #define BLYNK_LOG1(p1) 00267 #define BLYNK_LOG2(p1,p2) 00268 #define BLYNK_LOG3(p1,p2,p3) 00269 #define BLYNK_LOG4(p1,p2,p3,p4) 00270 #define BLYNK_LOG6(p1,p2,p3,p4,p5,p6) 00271 #define BLYNK_LOG_IP(msg, ip) 00272 #define BLYNK_LOG_IP_REV(msg, ip) 00273 #endif 00274 00275 #ifndef BLYNK_DBG_BREAK 00276 #define BLYNK_DBG_BREAK() 00277 #define BLYNK_ASSERT(expr) 00278 #define BLYNK_DBG_DUMP(msg, addr, len) 00279 #endif 00280 00281 #endif
Generated on Thu Jul 14 2022 00:21:50 by
1.7.2
