I2C autoreset, driver status refactor, VC_TEMP fix

This commit is contained in:
2023-11-12 01:04:53 +03:00
parent fe054c3c4e
commit 2e21362fd8
32 changed files with 102 additions and 187 deletions

View File

@@ -2,8 +2,8 @@
#include "Arduino.h"
#define CST_UNKNOWN 0
#define CST_INITIALIZED 1
#define CST_FAILED -1
#define CST_FAILED 1
#define CST_INITIALIZED 2
class abstractCh {
public:
@@ -14,6 +14,7 @@ public:
virtual int Anounce () {return 0;};
virtual int Stop() {return 0;}; //Should free resources
virtual int Status() {return CST_UNKNOWN;}
virtual void setStatus(uint8_t status) {}
protected:

View File

@@ -1,4 +1,5 @@
#include "item.h"
#include "abstractout.h"
#include "itemCmd.h"
@@ -25,3 +26,15 @@ int abstractOut::Setup()
if (item && (item->getCmd()==-1)) item->setCmd(CMD_OFF);
return 1;
}
int abstractOut::Status()
{
if (item && item->itemArr)
return item->itemArr->subtype;
return CST_UNKNOWN;
}
void abstractOut::setStatus(uint8_t status)
{
if (item && item->itemArr) item->itemArr->subtype = status & 0xF;
}

View File

@@ -14,6 +14,8 @@ public:
virtual itemCmd getDefaultOnVal(){return itemCmd().Percents255(255);};
virtual int getChanType(){return 0;}
virtual int getDefaultStorageType(){return 0;} /// Remove?? Now getChanType used instead
virtual int Status() override;
virtual void setStatus(uint8_t status) override;
int Setup() override;
protected:
Item * item;

View File

@@ -2165,7 +2165,7 @@ int Item::VacomSetFan(itemCmd st) {
#define a 0.1842f
#define b -36.68f
///move to float todo
int Item::VacomSetHeat(itemCmd st)
{
float val=st.getFloat();
@@ -2176,7 +2176,10 @@ int addr;
if (itemArg->type != aJson_String) return 0;
Item it(itemArg->valuestring);
if (it.isValid() && it.itemType == CH_VC) addr=it.getArg();
if (it.isValid() && it.itemType == CH_VC)
{
addr=it.getArg();
}
else return 0;
debugSerial<<F("MB: VC_heat#")<<addr<<F("=")<<val<<F(" cmd=")<<cmd<<endl;
@@ -2197,17 +2200,18 @@ int addr;
switch (cmd) {
case CMD_OFF:
case CMD_HALT:
case CMD_FAN:
regval = 0;
it.itemArr->subtype = 0;
break;
default:
it.itemArr->subtype = 1;
regval = round(( val - b) * 10 / a);
}
//debugSerial<<regval);
result=node.writeSingleRegister(2004 - 1, regval);
modbusBusy = 0;
//resumeModbus();
if (result == node.ku8MBSuccess) return 1;
mb_fail(result);
return 0;

View File

@@ -126,7 +126,6 @@ if (reg!=0xff)
}
else //ESP I2C glitch
{
debugSerial.println("I2C Reset");
i2cReset();
}
return INTERVAL_SLOW_POLLING;

View File

@@ -19,10 +19,10 @@ extern bool disableCMD;
#define INTERVAL_AC_POLLING 5000L
#define AC_FAILED 15
#define AC_FAILED CST_FAILED
#define AC_UNKNOWN CST_UNKNOWN
#define AC_IDLE CST_INITIALIZED
#define AC_SENDING 2
#define AC_SENDING 3
//byte inCheck = 0;
byte qstn[] = {255,255,10,0,0,0,0,0,1,1,77,1,90}; // Команда опроса
@@ -273,7 +273,7 @@ byte getCRC(byte req[], size_t size){
void out_AC::SendData(byte req[], size_t size){
if (!store || !item) return;
if (item->itemArr->subtype == AC_SENDING)
if (Status() == AC_SENDING)
{
while (store->timestamp && !isTimeOver(store->timestamp,millis(),150)) yield();
}
@@ -299,7 +299,7 @@ if (item->itemArr->subtype == AC_SENDING)
}
}
debugSerial.println();
item->itemArr->subtype = AC_SENDING;
setStatus(AC_SENDING);
// #if defined (__SAM3X8E__)
// if (item->getArg(0)==2) postTransmission();
// #endif
@@ -340,9 +340,9 @@ if (!portNum)// && (g_APinDescription[0].ulPinType == PIO_PA8A_URXD))
#endif
}
ACSerial->begin(9600);
item->itemArr->subtype = AC_IDLE;
setStatus (AC_IDLE);
//driverStatus = CST_INITIALIZED;
return 1;
}
@@ -353,10 +353,11 @@ debugSerial<<F("AC: De-Init: ")<<portNum<<endl;
delete store;
item->setPersistent(NULL);
store = NULL;
item->itemArr->subtype = CST_UNKNOWN;
setStatus (CST_UNKNOWN);
return 1;
}
/*
int out_AC::Status()
{
if (!item) return 0;
@@ -368,7 +369,8 @@ default:
return CST_INITIALIZED;
//return item->itemArr->subtype;
}
}
}*/
int out_AC::isActive()
{
if (!store) return 0;
@@ -379,7 +381,7 @@ int out_AC::Poll(short cause)
{
if (!store) return -1;
switch (item->itemArr->subtype)
switch (Status())
{
case AC_FAILED: return -1;
case AC_UNKNOWN: return -1;
@@ -387,7 +389,7 @@ case AC_SENDING:
{
if (store->timestamp && isTimeOver(store->timestamp,millis(),150))
{
item->itemArr->subtype = AC_IDLE;
setStatus(AC_IDLE);
store->timestamp=millisNZ();
}
}
@@ -395,7 +397,7 @@ case AC_SENDING:
if (cause!=POLLING_SLOW) return false;
if ((item->itemArr->subtype == AC_IDLE) && isTimeOver(store->timestamp,millis(),INTERVAL_AC_POLLING))
if ((Status() == AC_IDLE) && isTimeOver(store->timestamp,millis(),INTERVAL_AC_POLLING))
{
debugSerial.println(F("AC: Polling"));
SendData(qstn, sizeof(qstn)/sizeof(byte)); //Опрос кондиционера

View File

@@ -40,7 +40,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
int isActive() override;
int getChanType() override;
int getDefaultStorageType(){return ST_FLOAT_CELSIUS;};

View File

@@ -8,25 +8,20 @@
#include "main.h"
static int driverStatus = CST_UNKNOWN;
int out_counter::Setup()
{
abstractOut::Setup();
driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
return 1;
}
int out_counter::Stop()
{
driverStatus = CST_UNKNOWN;
setStatus(CST_UNKNOWN);
return 1;
}
int out_counter::Status()
{
return driverStatus;
}
int out_counter::Poll(short cause)

View File

@@ -13,7 +13,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
int getChanType() override;
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true, bool authorized = false) override;
};

View File

@@ -9,28 +9,22 @@
#include "main.h"
#include "dmx.h"
static int driverStatus = CST_UNKNOWN;
int out_dmx::Setup()
{
abstractOut::Setup();
debugSerial<<F("DMX-Out Init: ")<< item->itemArr->name <<endl;
driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
return 1;
}
int out_dmx::Stop()
{
debugSerial<<F("DMX-Out stop: ")<< item->itemArr->name << endl;
driverStatus = CST_UNKNOWN;
setStatus(CST_UNKNOWN);
return 1;
}
int out_dmx::Status()
{
return driverStatus;
}
int out_dmx::getChanType()
{
if (item)

View File

@@ -13,7 +13,6 @@ public:
out_dmx(Item * _item):colorChannel(_item){};
int Setup() override;
int Stop() override;
int Status() override;
int getChanType() override;
// int Ctrl(itemCmd cmd, char* subItem=NULL) override;

View File

@@ -78,14 +78,14 @@ store->timestamp=millisNZ();
if (getConfig())
{
infoSerial<<F("Mercury: config loaded ")<< item->itemArr->name<<endl;
store->driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
store->lastSuccessTS = 0;
initLine(true);
return 1;
}
else
{ errorSerial<<F("Mercury: config error")<<endl;
store->driverStatus = CST_FAILED;
setStatus(CST_FAILED);
return 0;
}
@@ -101,18 +101,6 @@ store = NULL;
return 1;
}
int out_Mercury::Status()
{
if (store)
return store->driverStatus;
return CST_UNKNOWN;
}
void out_Mercury::setStatus(short status)
{
if (store) store->driverStatus=status;
}
short out_Mercury::connectMercury()
{
@@ -337,7 +325,7 @@ int out_Mercury::Poll(short cause)
//bool lineInitialized = false;
if (cause==POLLING_SLOW) return 0;
if (modbusBusy || ( mbusSlenceTimer && !isTimeOver(mbusSlenceTimer,millis(),100))) return 0;
if (store->driverStatus == CST_FAILED) return 0;
if (Status() == CST_FAILED) return 0;
if (!getConfig()) return 0;
switch (Status())

View File

@@ -12,7 +12,6 @@
class mercuryPersistent : public chPersistent {
public:
int8_t driverStatus;
uint32_t timestamp;
uint32_t lastSuccessTS;
};
@@ -47,7 +46,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
int getChanType() override;
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true, bool authorized = false) override;
int getDefaultStorageType(){return ST_INT32;};
@@ -58,7 +56,6 @@ protected:
uint16_t pollingInterval;
bool getConfig();
void initLine(bool full = false);
void setStatus(short);
short connectMercury();
short disconnectMercury();
short getCurrentVal12(byte param, String topic,int divisor=1);

View File

@@ -180,12 +180,12 @@ store->timestamp=millisNZ();
if (getConfig())
{
infoSerial<<F("MBUS: config loaded ")<< item->itemArr->name<<endl;
store->driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
return 1;
}
else
{ errorSerial<<F("MBUS: config error")<<endl;
store->driverStatus = CST_FAILED;
setStatus(CST_FAILED);
return 0;
}
@@ -202,12 +202,6 @@ store = NULL;
return 1;
}
int out_Modbus::Status()
{
if (store)
return store->driverStatus;
return CST_UNKNOWN;
}

View File

@@ -11,8 +11,7 @@
class mbPersistent : public chPersistent {
public:
// int addr
int8_t driverStatus;
int baud;
serialParamType serialParam;
uint16_t pollingInterval;
@@ -37,7 +36,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
int getChanType() override;
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true, bool authorized = false) override;
int getDefaultStorageType(){return ST_INT32;};

View File

@@ -8,7 +8,6 @@
#include "item.h"
#include "main.h"
static int driverStatus = CST_UNKNOWN;
void out_Motor::getConfig()
{
@@ -64,7 +63,7 @@ pinMode(pinFeedback, INPUT);
item->setExt(0);
item->clearFlag(FLAG_ACTION_NEEDED);
item->clearFlag(FLAG_ACTION_IN_PROCESS);
driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
motorQuote = MOTOR_QUOTE;
return 1;
}
@@ -73,7 +72,7 @@ int out_Motor::Stop()
{
debugSerial.println("Motor: De-Init");
item->setExt(0);
driverStatus = CST_UNKNOWN;
setStatus(CST_UNKNOWN);
if (isProtectedPin(pinUp)||isProtectedPin(pinDown)) {errorSerial<<F("pin disabled")<<endl;return 0;}
digitalWrite(pinUp,INACTIVE);
@@ -82,26 +81,6 @@ digitalWrite(pinDown,INACTIVE);
return 1;
}
int out_Motor::Status()
{
return driverStatus;
}
/*
int out_Motor::isActive()
{
itemCmd st;
switch (item->getCmd())
{
case CMD_OFF:
case CMD_HALT:
return 0;
break;
default:
st.loadItem(item);
return st.getPercents255();
}
}
*/
int out_Motor::Poll(short cause)
{
if (cause==POLLING_SLOW) return 0;

View File

@@ -24,7 +24,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
//int isActive() override;
int getChanType() override;
int getDefaultStorageType(){return ST_PERCENTS255;};

View File

@@ -8,7 +8,6 @@
#include "item.h"
#include "main.h"
static int driverStatus = CST_UNKNOWN;
void out_Multivent::getConfig()
{
@@ -46,7 +45,7 @@ if (gatesObj /*&& aJson.getArraySize(item->itemArg)>=2*/)
i=i->next;
}
debugSerial << F ("MultiVent init")<< endl;
driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
return 1;
}
@@ -58,30 +57,10 @@ return 0;
int out_Multivent::Stop()
{
debugSerial << F ("Multivent De-Init") << endl;
driverStatus = CST_UNKNOWN;
setStatus(CST_UNKNOWN);
return 1;
}
int out_Multivent::Status()
{
return driverStatus;
}
/*
int out_Multivent::isActive()
{
itemCmd st;
switch (item->getCmd())
{
case CMD_OFF:
case CMD_HALT:
return 0;
break;
default:
st.loadItem(item);
return st.getPercents255();
}
}
*/
int out_Multivent::Poll(short cause)
{
return 0;
@@ -93,7 +72,6 @@ int out_Multivent::getChanType()
}
int out_Multivent::Ctrl(itemCmd cmd, char* subItem , bool toExecute, bool authorized)
{

View File

@@ -15,7 +15,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
//int isActive() override;
int getChanType() override;
int getDefaultStorageType(){return ST_PERCENTS255;};

View File

@@ -125,12 +125,12 @@ if (getConfig())
// if (item->getCmd()) item->setFlag(FLAG_COMMAND);
// if (item->itemVal) item->setFlag(FLAG_PARAMETERS);
store->prevOut = -2.0;
store->driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
return 1;
}
else
{ errorSerial<<F("PID: config error")<<endl;
store->driverStatus = CST_FAILED;
setStatus(CST_FAILED);
return 0;
}
@@ -147,12 +147,6 @@ store = NULL;
return 1;
}
int out_pid::Status()
{
if (store)
return store->driverStatus;
return CST_UNKNOWN;
}
int out_pid::isActive()
{

View File

@@ -15,7 +15,6 @@ public:
double input;
double setpoint;
float prevOut;
int driverStatus;
uint32_t alarmTimer;
bool alarmArmed;
uint16_t alarmTimeout; //in sec
@@ -30,7 +29,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
int isActive() override;
int getChanType() override;
int getDefaultStorageType(){return ST_FLOAT;};

View File

@@ -8,7 +8,6 @@
#include "main.h"
#include "dmx.h"
static int driverStatus = CST_UNKNOWN;
#if defined(ARDUINO_ARCH_ESP32)
void analogWrite(int pin, int val)
@@ -55,7 +54,7 @@ switch (getChanType())
TCCR3B |= tval;
#endif
driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
return 1;
}
@@ -75,15 +74,10 @@ switch (getChanType())
default:
pinMode(iaddr, INPUT);
}
driverStatus = CST_UNKNOWN;
setStatus(CST_UNKNOWN);
return 1;
}
int out_pwm::Status()
{
return driverStatus;
}
int out_pwm::getChanType()
{

View File

@@ -13,7 +13,7 @@ public:
out_pwm(Item * _item):colorChannel(_item){numChannels=0;};
int Setup() override;
int Stop() override;
int Status() override;
int getChanType() override;
//int Ctrl(itemCmd cmd, char* subItem=NULL) override;

View File

@@ -8,7 +8,6 @@
#include "main.h"
#include "dmx.h"
#include "utils.h"
static int driverStatus = CST_UNKNOWN;
void out_relay::getConfig()
{
@@ -43,7 +42,7 @@ digitalWrite(pin,INACTIVE);
if (item) item->setExt(0);
//if (item->getCmd()) item->setFlag(FLAG_COMMAND);
//if (item->itemVal) item->setFlag(FLAG_PARAMETERS);
driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
if (item->isActive()>0) ///????
{
item->setExt(millisNZ());
@@ -55,24 +54,10 @@ int out_relay::Stop()
{
debugSerial<<F("Relay-Out #")<<pin<<F(" stop")<<endl;
pinMode(pin, INPUT);
driverStatus = CST_UNKNOWN;
setStatus(CST_UNKNOWN);
return 1;
}
int out_relay::Status()
{
return driverStatus;
}
/*
const char action_P[] PROGMEM = "action";
const char cooling_P[] PROGMEM = "cooling";
const char heating_P[] PROGMEM = "heating";
const char drying_P[] PROGMEM = "drying";
const char idle_P[] PROGMEM = "idle";
const char fan_P[] PROGMEM = "fan";
const char off_P[] PROGMEM = "off";
*/
void out_relay::relay(bool state)
{
char subtopic[10]="/";

View File

@@ -15,7 +15,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
int getChanType() override;
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true, bool authorized = false) override;

View File

@@ -24,7 +24,6 @@ static CRGB *leds = NULL;
#define NUM_LEDS 43
static int driverStatus = CST_UNKNOWN;
void out_SPILed::getConfig()
{
@@ -63,7 +62,7 @@ FastLED.addLeds<CONTROLLER, DATA_PIN, ORDER>(leds, numLeds);
#endif
}
driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED);
return 1;
}
@@ -78,15 +77,11 @@ delete leds;
FastLED.clear(true);
delete [] leds;
#endif
driverStatus = CST_UNKNOWN;
setStatus(CST_UNKNOWN);
return 1;
}
int out_SPILed::Status()
{
return driverStatus;
}
int out_SPILed::getChanType()

View File

@@ -18,7 +18,6 @@ public:
out_SPILed(Item * _item):colorChannel(_item){getConfig();};
int Setup() override;
int Stop() override;
int Status() override;
int getChanType() override;
//int Ctrl(short cmd, short n=0, int * Parameters=NULL, int suffixCode=0, char* subItem=NULL) override;
//int Ctrl(itemCmd cmd, char* subItem=NULL) override;

View File

@@ -121,12 +121,12 @@ if (!store)
if (getConfig())
{
infoSerial<<F("UARTbridge config loaded ")<< item->itemArr->name<<endl;
store->driverStatus = CST_INITIALIZED;
setStatus(CST_INITIALIZED)
return 1;
}
else
{ errorSerial<<F("UARTbridge config error")<<endl;
store->driverStatus = CST_FAILED;
setStatus(CST_FAILED);
return 0;
}
@@ -146,12 +146,6 @@ store = NULL;
return 1;
}
int out_UARTbridge::Status()
{
if (store)
return store->driverStatus;
return CST_UNKNOWN;
}
String _RR_A;
String _WR_A;

View File

@@ -43,8 +43,7 @@
class ubPersistent : public chPersistent {
public:
// int addr
int8_t driverStatus;
int baud;
serialParamType serialParam;
//uint16_t pollingInterval;
@@ -63,7 +62,6 @@ public:
int Setup() override;
int Poll(short cause) override;
int Stop() override;
int Status() override;
int getChanType() override;
int Ctrl(itemCmd cmd, char* subItem=NULL, bool toExecute=true, bool authorized = false) override;
int getDefaultStorageType(){return ST_INT32;};

View File

@@ -126,8 +126,6 @@ int owSetup() {
//// todo - move memory allocation to here
if (oneWire) return true; // Already initialized
#ifdef DS2482_100_I2C_TO_1W_BRIDGE
//twi_setTimeoutInMicros()
i2cReset();
debugSerial<<F("DS2482_100_I2C_TO_1W_BRIDGE init")<<endl;
debugSerial<<F("Free:")<<freeRam()<<endl;
@@ -165,8 +163,14 @@ if (!oneWire)
}
else
{
errorSerial.println(F("1WT: DS2482-100 not present"));
return false;
i2cReset();
if (oneWire->checkPresence())
infoSerial<<F("1WT: DS2482-100 I2C restored")<<endl;
else
{
errorSerial.println(F("1WT: DS2482-100 not present"));
return false;
}
}
#else
// software driver
@@ -235,6 +239,11 @@ int sensors_loop(void) {
oneWire->wireReset();
return INTERVAL_1W;
}
if (!oneWire->checkPresence())
{
infoSerial.println(F("1WT: lost DS2482-100"));
i2cReset();
}
#endif

View File

@@ -879,14 +879,8 @@ bool checkToken(char * token, char * data)
void i2cReset(){
#if defined (SCL_RESET)
Wire.endTransmission(true);
SCL_LOW();
delay(300);
SCL_HIGH();
#endif
bool i2cReset(){
debugSerial.println("I2C Reset");
Wire.endTransmission(true);
Wire.end();
@@ -901,6 +895,23 @@ pinMode(SDA,INPUT);
delay(10);//10us мкс
}
Wire.begin();
#ifdef DS2482_100_I2C_TO_1W_BRIDGE
if (oneWire && oneWire->checkPresence())
{
oneWire->deviceReset();
#ifndef APU_OFF
oneWire->setActivePullup();
#endif
if (oneWire->wireReset())
debugSerial.println(F("\tReset done"));
else
debugSerial.println(F("\tDS2482 reset error"));
}
#endif
return true;
}
#pragma message(VAR_NAME_VALUE(debugSerial))

View File

@@ -79,5 +79,5 @@ bool getPinVal(uint8_t pin);
int str2regSize(char * str);
bool checkToken(char * token, char * data);
bool isProtectedPin(short pin);
void i2cReset();
bool i2cReset();