diff --git a/src/CANController.cpp b/src/CANController.cpp index 0890eec..8bbbf4e 100644 --- a/src/CANController.cpp +++ b/src/CANController.cpp @@ -167,6 +167,23 @@ int CANControllerClass::read() return _rxData[_rxIndex++]; } +size_t CANControllerClass::readBytes(char *buffer, size_t length) { + int bytesAvailable = available(); + if (bytesAvailable <= 0) { + // No data left to consume. + return 0; + } + + if (bytesAvailable < length) { + // Limit to actually available data. + length = bytesAvailable; + } + + memcpy(buffer, _rxData, length); + _rxIndex += length; // Consume the data. + return length; +} + int CANControllerClass::peek() { if (!available()) { diff --git a/src/CANController.h b/src/CANController.h index cdaeb94..88b100a 100644 --- a/src/CANController.h +++ b/src/CANController.h @@ -31,6 +31,10 @@ class CANControllerClass : public Stream { virtual int read(); virtual int peek(); virtual void flush(); + virtual size_t readBytes(char *buffer, size_t length); // read chars from stream into buffer + virtual size_t readBytes(uint8_t *buffer, size_t length) { + return readBytes((char*)buffer, length); + } virtual void onReceive(void(*callback)(int)); @@ -44,6 +48,9 @@ class CANControllerClass : public Stream { virtual int sleep(); virtual int wakeup(); + /// Return the raw RX buffer for more efficient data access in high-performance scenarios. + uint8_t* getRxBuf() { return _rxData; } + protected: CANControllerClass(); virtual ~CANControllerClass(); diff --git a/src/ESP32SJA1000.h b/src/ESP32SJA1000.h index b83cddc..f3d0e5e 100644 --- a/src/ESP32SJA1000.h +++ b/src/ESP32SJA1000.h @@ -26,6 +26,10 @@ class ESP32SJA1000Class : public CANControllerClass { virtual void onReceive(void(*callback)(int)); + uint8_t getRmc() { + return readRegister(29); + } + using CANControllerClass::filter; virtual int filter(int id, int mask); using CANControllerClass::filterExtended;