diff --git a/src/utility.c b/src/utility.c index d8a8bab7..c15f2c5c 100644 --- a/src/utility.c +++ b/src/utility.c @@ -1,4 +1,7 @@ +#include #include +#include +#include #include #include "utility.h" @@ -23,3 +26,28 @@ float poly_battery_level(const double terms[], const size_t numterms, uint16_t v percent = 0; return percent; } + +size_t hexdump(char* out, size_t out_size, unsigned char* data, size_t data_size) +{ + size_t i; + size_t used_buf = 0; + int rc; + for (i = 0; i < data_size; ++i) { + if (used_buf >= out_size) { + return 0; + } + rc = snprintf(out + used_buf, out_size - used_buf, "0x%02X ", data[i]); + if (rc < 0) { +#ifdef _WIN32 + printf("hexdump formatting failed\n"); +#elif __APPLE__ + printf("%s\n", strerror(errno)); +#else //__linux__ + printf("%s\n", strerror_l(errno, NULL)); +#endif + } else { + used_buf += rc; + } + } + return i; +} diff --git a/src/utility.h b/src/utility.h index 45778ecd..eb60003f 100644 --- a/src/utility.h +++ b/src/utility.h @@ -21,3 +21,14 @@ int map(int x, int in_min, int in_max, int out_min, int out_max); * @return battery level in percent */ float poly_battery_level(const double terms[], const size_t numterms, uint16_t voltage); + +/** + * @brief Helper function used during debugging for printing out binary data + * + * @param out buffer to write output example char tmp[128]; + * @param out_size sizeof(out) + * @param data data to be represented as hex string + * @param data_size sizeof(data) or sizeof(*data); + * @return 0 on failure or filled size of out + */ +size_t hexdump(char* out, size_t out_size, unsigned char* data, size_t data_size);