From b6610a31e7f0dc0e163ba16f115baa6612fb0187 Mon Sep 17 00:00:00 2001 From: Andrey Klimov Date: Sat, 8 Aug 2020 00:21:21 +0300 Subject: [PATCH] Analog & I2C input reading cache New input configuration format many Discrete inputs on single analog in --- compiled/lighthub21/firmware.bin | Bin 139192 -> 139680 bytes lighthub/inputs.cpp | 117 ++++++++++++++++++++++++++----- lighthub/inputs.h | 24 +++++-- lighthub/main.cpp | 26 ++++++- 4 files changed, 141 insertions(+), 26 deletions(-) diff --git a/compiled/lighthub21/firmware.bin b/compiled/lighthub21/firmware.bin index 20f0365511501315eb64e260ea98980c3c232ac0..61ebb397a6f9250efb5347511deff62ae90106f8 100644 GIT binary patch delta 35547 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 delta 34827 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
  • 9DhwtL~(KwSIn`OS98uK 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 == aJson_Object) && root) { - aJsonObject *itemBuffer; - itemBuffer = aJson.getObjectItem(inputObj, "T"); + + if (!inputObj || !root) return; + if (!configObj) configObj = inputObj; + + if (configObj->type == aJson_Object) + { + // Retreive type and pin# + itemBuffer = aJson.getObjectItem(configObj, "T"); if (itemBuffer) inType = static_cast(itemBuffer->valueint); - pin = static_cast(atoi(inputObj->name)); + + itemBuffer = aJson.getObjectItem(configObj, "#"); + if (itemBuffer) pin = static_cast(itemBuffer->valueint); + else pin = static_cast(atoi(configObj->name)); + } + + // Persistant storage itemBuffer = aJson.getObjectItem(inputObj, "S"); if (!itemBuffer) { debugSerial<valueint; + +} + +void cleanStore(aJsonObject * input) +{ +if (input->type == aJson_Object) { + // Check for nested inputs + aJsonObject * inputArray = aJson.getObjectItem(input, "act"); + if (inputArray && (inputArray->type == aJson_Array)) + { + aJsonObject *inputObj = inputArray->child; + + while(inputObj) + { + Input in(inputObj,input); + in.store->aslong = 0; + + yield(); + inputObj = inputObj->next; + } + } + else + { + Input in(input); + in.Poll(CHECK_INPUT); } } +} void Input::setup() { if (!isValid() || (!root)) return; +cleanStore(inputObj); store->aslong=0; uint8_t inputPinMode = INPUT; //if IN_ACTIVE_HIGH @@ -146,7 +180,7 @@ switch (inType) case IN_I2C | IN_PUSH_ON | IN_ACTIVE_HIGH: case IN_I2C | IN_PUSH_TOGGLE | IN_ACTIVE_HIGH: - mcp.begin(); + mcp.begin(); //TBD - multiple chip mcp.pinMode(pin, INPUT); if (inputPinMode == INPUT_PULLUP) mcp.pullUp(0, HIGH); // turn on a 100K pullup internally @@ -676,16 +710,24 @@ void Input::contactPoll(short cause) { uint8_t inputOnLevel; + aJsonObject * mapObj; if (inType & IN_ACTIVE_HIGH) inputOnLevel = HIGH; else inputOnLevel = LOW; #ifdef MCP23017 if (inType & IN_I2C) - currentInputState = (mcp.digitalRead(pin) == inputOnLevel); + currentInputState = (inCache.I2CReadBit(IN_I2C,0,pin) == inputOnLevel); else #endif - currentInputState = (digitalRead(pin) == inputOnLevel); + if (isAnalogPin(pin) && (mapObj=aJson.getObjectItem(inputObj, "map")) && mapObj->type == aJson_Array) + { + int value = inCache.analogReadCached(pin); + if (value >= aJson.getArrayItem(mapObj, 0)->valueint && value <= aJson.getArrayItem(mapObj, 1)->valueint) + currentInputState = true; + else currentInputState = false; + } + else currentInputState = (digitalRead(pin) == inputOnLevel); switch (store->state) //Timer based transitions { case IS_PRESSED: @@ -870,7 +912,7 @@ void Input::analogPoll(short cause) { pinMode(pin, inputPinMode); */ - inputVal = analogRead(pin); + inputVal = inCache.analogReadCached(pin); // Mapping if (inputMap && inputMap->type == aJson_Array) { @@ -1045,3 +1087,42 @@ char* Input::getIdxField() { return idx->valuestring; return nullptr; } + + + +readCache::readCache() +{ + addr=0; + type=0; +} + +uint16_t readCache::analogReadCached (uint8_t _pin) +{ + if ((_pin==addr) && (IN_ANALOG==type)) return cached_data; + addr = _pin; + type = IN_ANALOG; + cached_data =analogRead(_pin); + return cached_data; +} + +uint8_t readCache::digitalReadCached(uint8_t _pin) +{ + ///TBD +} + +uint8_t readCache::I2CReadBit(uint8_t _type, uint8_t _addr, uint8_t _pin) +{ +if (addr!=_addr || type != _type) +{ + type=_type; + addr=_addr; + cached_data = mcp.readGPIOAB(); +} +return (cached_data >> _pin ) & 0x1; +} + +void readCache::invalidateInputCache() +{ + addr=0; + type=0; +} diff --git a/lighthub/inputs.h b/lighthub/inputs.h index e0038d0..ddf7144 100644 --- a/lighthub/inputs.h +++ b/lighthub/inputs.h @@ -135,10 +135,7 @@ public: uint8_t pin; inStore *store; - Input(int pin); - - Input(aJsonObject *obj); - + Input(aJsonObject *obj, aJsonObject * configObj = NULL); Input(char *name); boolean isValid(); @@ -160,7 +157,7 @@ public: protected: - void Parse(); + void Parse(aJsonObject * configObj = NULL); void contactPoll(short cause); void analogPoll(short cause); @@ -184,3 +181,20 @@ protected: bool changeState(uint8_t newState, short cause); //bool executeCommand(aJsonObject* cmd, int8_t toggle = -1, char* defCmd = NULL); }; + + + +class readCache { +public: + readCache(); + uint16_t analogReadCached (uint8_t pin); + uint8_t digitalReadCached(uint8_t pin); + uint8_t I2CReadBit(uint8_t type, uint8_t addr, uint8_t pin); + void invalidateInputCache(); +protected: + uint8_t addr; + uint8_t type; + uint16_t cached_data; +}; + +extern readCache inCache; diff --git a/lighthub/main.cpp b/lighthub/main.cpp index 7e95c49..b49f18b 100644 --- a/lighthub/main.cpp +++ b/lighthub/main.cpp @@ -1879,14 +1879,34 @@ configLocked++; aJsonObject *input = inputs->child; while (input) { - if ((input->type == aJson_Object)) { - Input in(input); - in.Poll(CHECK_INPUT); + if (input->type == aJson_Object) { + // Check for nested inputs + aJsonObject * inputArray = aJson.getObjectItem(input, "act"); + if (inputArray && (inputArray->type == aJson_Array)) + { + aJsonObject *inputObj = inputArray->child; + + while(inputObj) + { + Input in(inputObj,input); + in.Poll(CHECK_INPUT); + + yield(); + inputObj = inputObj->next; + + } + } + else + { + Input in(input); + in.Poll(CHECK_INPUT); + } } yield(); input = input->next; } nextInputCheck = millis() + INTERVAL_CHECK_INPUT; + inCache.invalidateInputCache(); } if (millis() > nextSensorCheck) {