From 75bf85ac4e79f1eeca8704fbe1b566a9325d735c Mon Sep 17 00:00:00 2001 From: Robert Middleton Date: Sun, 24 Sep 2023 18:39:15 -0400 Subject: [PATCH] Allow use of statically allocated buffers --- src/ACAN2515.cpp | 37 ++++++++++++++++++++++++++----------- src/ACAN2515Settings.h | 12 ++++++++++++ src/ACAN2515_Buffer16.h | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/src/ACAN2515.cpp b/src/ACAN2515.cpp index f651e15..366ffbd 100644 --- a/src/ACAN2515.cpp +++ b/src/ACAN2515.cpp @@ -317,17 +317,32 @@ uint16_t ACAN2515::internalBeginOperation (const ACAN2515Settings & inSettings, errorCode |= kInconsistentBitRateSettings ; } //----------------------------------- Allocate buffer - if (!mReceiveBuffer.initWithSize (inSettings.mReceiveBufferSize)) { - errorCode |= kCannotAllocateReceiveBuffer ; - } - if (!mTransmitBuffer [0].initWithSize (inSettings.mTransmitBuffer0Size)) { - errorCode |= kCannotAllocateTransmitBuffer0 ; - } - if (!mTransmitBuffer [1].initWithSize (inSettings.mTransmitBuffer1Size)) { - errorCode |= kCannotAllocateTransmitBuffer1 ; - } - if (!mTransmitBuffer [2].initWithSize (inSettings.mTransmitBuffer2Size)) { - errorCode |= kCannotAllocateTransmitBuffer2 ; + if (inSettings.mReceiveAndTxBuffersStatic) { + if (!mReceiveBuffer.initWithStaticSize (inSettings.mReceiveBuffer, inSettings.mReceiveBufferSize)) { + errorCode |= kCannotAllocateReceiveBuffer ; + } + if (!mTransmitBuffer [0].initWithStaticSize (inSettings.mTxb0Buffer, inSettings.mTransmitBuffer0Size)) { + errorCode |= kCannotAllocateTransmitBuffer0 ; + } + if (inSettings.mTransmitBuffer1Size > 0 && !mTransmitBuffer [1].initWithStaticSize (inSettings.mTxb1Buffer, inSettings.mTransmitBuffer1Size)) { + errorCode |= kCannotAllocateTransmitBuffer1 ; + } + if (inSettings.mTransmitBuffer2Size > 0 && !mTransmitBuffer [2].initWithStaticSize (inSettings.mTxb2Buffer, inSettings.mTransmitBuffer2Size)) { + errorCode |= kCannotAllocateTransmitBuffer2 ; + } + } else { + if (!mReceiveBuffer.initWithSize (inSettings.mReceiveBufferSize)) { + errorCode |= kCannotAllocateReceiveBuffer ; + } + if (!mTransmitBuffer [0].initWithSize (inSettings.mTransmitBuffer0Size)) { + errorCode |= kCannotAllocateTransmitBuffer0 ; + } + if (!mTransmitBuffer [1].initWithSize (inSettings.mTransmitBuffer1Size)) { + errorCode |= kCannotAllocateTransmitBuffer1 ; + } + if (!mTransmitBuffer [2].initWithSize (inSettings.mTransmitBuffer2Size)) { + errorCode |= kCannotAllocateTransmitBuffer2 ; + } } mTXBIsFree [0] = true ; mTXBIsFree [1] = true ; diff --git a/src/ACAN2515Settings.h b/src/ACAN2515Settings.h index a215ccd..f246373 100644 --- a/src/ACAN2515Settings.h +++ b/src/ACAN2515Settings.h @@ -10,6 +10,9 @@ #include + +class CANMessage ; + //·································································································· class ACAN2515Settings { @@ -155,6 +158,15 @@ class ACAN2515Settings { public: uint16_t CANBitSettingConsistency (void) const ; +//·································································································· +// Static buffer allocation +//·································································································· + + public: bool mReceiveAndTxBuffersStatic = false ; + public: CANMessage * mReceiveBuffer = nullptr ; + public: CANMessage * mTxb0Buffer = nullptr ; + public: CANMessage * mTxb1Buffer = nullptr ; + public: CANMessage * mTxb2Buffer = nullptr ; //·································································································· // Constants returned by CANBitSettingConsistency diff --git a/src/ACAN2515_Buffer16.h b/src/ACAN2515_Buffer16.h index a13a38f..038ee03 100644 --- a/src/ACAN2515_Buffer16.h +++ b/src/ACAN2515_Buffer16.h @@ -19,7 +19,8 @@ class ACAN2515_Buffer16 { mSize (0), mReadIndex (0), mCount (0), - mPeakCount (0) { + mPeakCount (0), + mDynamicAllocate (true) { } //································································································ @@ -27,7 +28,9 @@ class ACAN2515_Buffer16 { //································································································ public: ~ ACAN2515_Buffer16 (void) { - delete [] mBuffer ; + if (mDynamicAllocate) { + delete [] mBuffer ; + } } //································································································ @@ -39,6 +42,7 @@ class ACAN2515_Buffer16 { private: uint16_t mReadIndex ; private: uint16_t mCount ; private: uint16_t mPeakCount ; // > mSize if overflow did occur + private: bool mDynamicAllocate ; //································································································ // Accessors @@ -54,13 +58,34 @@ class ACAN2515_Buffer16 { //································································································ public: bool initWithSize (const uint16_t inSize) { - delete [] mBuffer ; + if (mDynamicAllocate) { + delete [] mBuffer ; + } mBuffer = new CANMessage [inSize] ; const bool ok = mBuffer != NULL ; mSize = ok ? inSize : 0 ; mReadIndex = 0 ; mCount = 0 ; mPeakCount = 0 ; + mDynamicAllocate = true; + return ok ; + } + + //································································································ + // initWithStaticSize + //································································································ + + public: bool initWithStaticSize (CANMessage * buffer, const uint16_t inSize) { + if (mDynamicAllocate) { + delete [] mBuffer ; + } + mBuffer = buffer ; + const bool ok = mBuffer != NULL ; + mSize = ok ? inSize : 0 ; + mReadIndex = 0 ; + mCount = 0 ; + mPeakCount = 0 ; + mDynamicAllocate = false; return ok ; } @@ -106,7 +131,9 @@ class ACAN2515_Buffer16 { //································································································ public: void free (void) { - delete [] mBuffer ; mBuffer = nullptr ; + if (mDynamicAllocate) { + delete [] mBuffer ; mBuffer = nullptr ; + } mSize = 0 ; mReadIndex = 0 ; mCount = 0 ;