From 6b67760db18fa9d9402f7590d824eb16ef1ba8da Mon Sep 17 00:00:00 2001 From: peteGSX <97784652+peteGSX@users.noreply.github.com> Date: Thu, 9 Feb 2023 09:31:09 +1000 Subject: [PATCH] Fix dynamic RAM allocation --- IO_EXIOExpander.h | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/IO_EXIOExpander.h b/IO_EXIOExpander.h index aedb1ce..d6e0dde 100644 --- a/IO_EXIOExpander.h +++ b/IO_EXIOExpander.h @@ -72,6 +72,7 @@ private: _i2cAddress = i2cAddress; // To save RAM, space for servo configuration is not allocated unless a pin is used. // Initialise the pointers to NULL. + _servoData = (ServoData**) calloc(_nPins, sizeof(ServoData*)); for (int i=0; i<_nPins; i++) { _servoData[i] = NULL; } @@ -137,28 +138,6 @@ private: DIAG(F("Vpin %d cannot be used as a digital input pin"), (int)vpin); return false; } - } else if (configType == CONFIGURE_SERVO) { - if (paramCount != 5) return false; -#ifdef DIAG_IO - DIAG(F("Servo: Configure VPIN:%d Apos:%d Ipos:%d Profile:%d Duration:%d state:%d"), - vpin, params[0], params[1], params[2], params[3], params[4]); -#endif - struct ServoData *s = _servoData[pin]; - if (s == NULL) { - _servoData[pin] = (struct ServoData *)calloc(1, sizeof(struct ServoData)); - s = _servoData[pin]; - if (!s) return false; // Check for failed memory allocation - } - s->activePosition = params[0]; - s->inactivePosition = params[1]; - s->profile = params[2]; - s->duration = params[3]; - int state = params[4]; - if (state != -1) { - // Position servo to initial state - IODevice::writeAnalogue(pin, state ? s->activePosition : s->inactivePosition, 0, 0); - } - return true; } else { return false; } @@ -366,7 +345,8 @@ private: uint16_t duration; // time (tenths of a second) for animation to complete. }; // 14 bytes per element, i.e. per pin in use - struct ServoData *_servoData[256]; + // struct ServoData *_servoData[256]; + ServoData** _servoData; static const uint8_t _catchupSteps = 5; // number of steps to wait before switching servo off