// // FILE: SHEX.cpp // AUTHOR: Rob Tillaart // VERSION: 0.2.0 // PURPOSE: Arduino library to generate hex dump over Serial // DATE: 2020-05-24 // URL: https://github.com/RobTillaart/SHEX // // HISTORY: // 0.1.0 2020-05-24 initial version // 0.1.1 2020-06-19 fix library.json // 0.2.0 2021-01-07 Arduino-CI + unit tests + modifiers. #include "SHEX.h" SHEX::SHEX(Print* stream, uint8_t len) { _stream = stream; reset(); // force multiple of 4; max 32 _length = min(32, ((len + 3) / 4) * 4); }; void SHEX::reset() { _hexOutput = false; _length = 0; _charCount = 0; _separator = ' '; _countFlag = true; } /////////////////////////////////////////// // // WRITE - the core // size_t SHEX::write(uint8_t c) { // PASS THROUGH MODE if (_hexOutput == false) return _stream->write(c); // HEX MODE // handle end of line and position number if ((_charCount % _length) == 0) { _stream->println(); // separator line every 8 lines if ((_charCount % (_length * 8)) == 0) { _stream->println(); } // next line if (_countFlag) { uint32_t mask = 0xF0000000; while((mask > 0xF) && (mask & _charCount) == 0) { _stream->print('0'); mask >>= 4; } _stream->print(_charCount, HEX); _stream->print('\t'); } } // Print char as HEX if (c < 0x10) _stream->print('0'); _stream->print(c, HEX); _stream->print(_separator); _charCount++; if ((_charCount % 4) == 0) _stream->print(_separator); return 1; } void SHEX::setHEX(bool hexOutput) { _hexOutput = hexOutput; _charCount = 0; _stream->println(); }; void SHEX::setBytesPerLine(const uint8_t len) { _length = min(32, ((len + 3) / 4) * 4); // force multiple of 4; _charCount = 0; _stream->println(); } // -- END OF FILE --