mirror of
https://github.com/anklimov/lighthub
synced 2025-12-06 11:49:51 +03:00
Poll() refactoring, PWM fix, Hum preparation
This commit is contained in:
3
docs/html/search/upload.sh
Normal file
3
docs/html/search/upload.sh
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export PORT=cu.usbmodem14101
|
||||||
|
echo . | stty -f /dev/$PORT speed 1200
|
||||||
|
../tools/mac/tool-bossac/bossac -U false -p $PORT -i -e -w -v -b firmware.bin -R
|
||||||
@@ -9,7 +9,7 @@ class abstractCh {
|
|||||||
public:
|
public:
|
||||||
abstractCh(){};
|
abstractCh(){};
|
||||||
virtual ~abstractCh(){};
|
virtual ~abstractCh(){};
|
||||||
virtual int Poll(short cause) = 0;
|
virtual int Poll(short cause) {return 0;}
|
||||||
virtual int Setup() =0; //Should initialize hardware and reserve resources
|
virtual int Setup() =0; //Should initialize hardware and reserve resources
|
||||||
virtual int Anounce () {return 0;};
|
virtual int Anounce () {return 0;};
|
||||||
virtual int Stop() {return 0;}; //Should free resources
|
virtual int Stop() {return 0;}; //Should free resources
|
||||||
|
|||||||
@@ -57,6 +57,10 @@ e-mail anklimov@gmail.com
|
|||||||
#include "modules/out_elevator.h"
|
#include "modules/out_elevator.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HUMIDIFIER_ENABLE
|
||||||
|
#include "modules/out_humidifier.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
short modbusBusy = 0;
|
short modbusBusy = 0;
|
||||||
bool isPendedModbusWrites = false;
|
bool isPendedModbusWrites = false;
|
||||||
|
|
||||||
@@ -207,6 +211,13 @@ void Item::Parse() {
|
|||||||
// debugSerial<<F("AC driver created")<<endl;
|
// debugSerial<<F("AC driver created")<<endl;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HUMIDIFIER_ENABLE
|
||||||
|
case CH_HUMIDIFIER:
|
||||||
|
driver = new out_humidifier (this);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef COUNTER_DISABLE
|
#ifndef COUNTER_DISABLE
|
||||||
case CH_COUNTER:
|
case CH_COUNTER:
|
||||||
driver = new out_counter (this);
|
driver = new out_counter (this);
|
||||||
@@ -1341,7 +1352,8 @@ if (timestampObj)
|
|||||||
itemCmd st(ST_UINT32,cmd);
|
itemCmd st(ST_UINT32,cmd);
|
||||||
st.Int(remain);
|
st.Int(remain);
|
||||||
|
|
||||||
if (!(remain % 1000))
|
//if (!(remain % 1000))
|
||||||
|
if (cause == POLLING_1S)
|
||||||
{
|
{
|
||||||
SendStatusImmediate(st,SEND_DELAYED);
|
SendStatusImmediate(st,SEND_DELAYED);
|
||||||
debugSerial<< remain/1000 << F(" sec remaining") << endl;
|
debugSerial<< remain/1000 << F(" sec remaining") << endl;
|
||||||
@@ -1365,28 +1377,14 @@ switch (cause)
|
|||||||
case CH_MODBUS:
|
case CH_MODBUS:
|
||||||
checkModbusDimmer();
|
checkModbusDimmer();
|
||||||
sendDelayedStatus();
|
sendDelayedStatus();
|
||||||
return INTERVAL_SLOW_POLLING;
|
return true;
|
||||||
break;
|
break;
|
||||||
case CH_VC:
|
case CH_VC:
|
||||||
checkFM();
|
checkFM();
|
||||||
sendDelayedStatus();
|
sendDelayedStatus();
|
||||||
return INTERVAL_SLOW_POLLING;
|
return true;
|
||||||
break;
|
break;
|
||||||
/*
|
#endif
|
||||||
case CH_VCTEMP:
|
|
||||||
checkHeatRetry();
|
|
||||||
sendDelayedStatus();
|
|
||||||
return INTERVAL_SLOW_POLLING;
|
|
||||||
break; */
|
|
||||||
|
|
||||||
#endif
|
|
||||||
/* case CH_RGB: //All channels with slider generate too many updates
|
|
||||||
case CH_RGBW:
|
|
||||||
case CH_DIMMER:
|
|
||||||
case CH_PWM:
|
|
||||||
case CH_VCTEMP:
|
|
||||||
case CH_THERMO:
|
|
||||||
case CH_GROUP:*/
|
|
||||||
default:
|
default:
|
||||||
sendDelayedStatus();
|
sendDelayedStatus();
|
||||||
}
|
}
|
||||||
@@ -1397,7 +1395,7 @@ switch (cause)
|
|||||||
return driver->Poll(cause);
|
return driver->Poll(cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::sendDelayedStatus()
|
void Item::sendDelayedStatus()
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ e-mail anklimov@gmail.com
|
|||||||
#define CH_MULTIVENT 18
|
#define CH_MULTIVENT 18
|
||||||
#define CH_ELEVATOR 19
|
#define CH_ELEVATOR 19
|
||||||
#define CH_COUNTER 20
|
#define CH_COUNTER 20
|
||||||
|
#define CH_HUMIDIFIER 21
|
||||||
|
|
||||||
//#define CHANNEL_TYPES 13
|
//#define CHANNEL_TYPES 13
|
||||||
|
|
||||||
@@ -74,6 +75,7 @@ e-mail anklimov@gmail.com
|
|||||||
#define POLLING_SLOW 1
|
#define POLLING_SLOW 1
|
||||||
#define POLLING_FAST 2
|
#define POLLING_FAST 2
|
||||||
#define POLLING_INT 3
|
#define POLLING_INT 3
|
||||||
|
#define POLLING_1S 4
|
||||||
|
|
||||||
|
|
||||||
#define I_TYPE 0 //Type of item
|
#define I_TYPE 0 //Type of item
|
||||||
|
|||||||
@@ -2268,6 +2268,15 @@ infoSerial<<F("\n(+)MULTIVENT");
|
|||||||
infoSerial<<F("\n(-)MULTIVENT");
|
infoSerial<<F("\n(-)MULTIVENT");
|
||||||
#endif
|
#endif
|
||||||
infoSerial<<endl;
|
infoSerial<<endl;
|
||||||
|
|
||||||
|
#ifdef HUMIDIFIER_ENABLE
|
||||||
|
infoSerial<<F("\n(+)HUMIDIFIER");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ELEVATOR_ENABLE
|
||||||
|
infoSerial<<F("\n(+)ELEVATOR");
|
||||||
|
#endif
|
||||||
|
|
||||||
// WDT_Disable( WDT ) ;
|
// WDT_Disable( WDT ) ;
|
||||||
#if defined(__SAM3X8E__)
|
#if defined(__SAM3X8E__)
|
||||||
|
|
||||||
@@ -2564,17 +2573,21 @@ configLocked++;
|
|||||||
configLocked--;
|
configLocked--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// POLLINT_FAST - as often AS possible every item
|
||||||
|
// POLLING_1S - once per second every item
|
||||||
|
// POLLING_SLOW - just one item every 1S (Note: item::Poll() should return true if some action done - it will postpone next SLOW POLLING)
|
||||||
void pollingLoop(void) {
|
void pollingLoop(void) {
|
||||||
if (!items) return;
|
if (!items) return;
|
||||||
// FAST POLLINT - as often AS possible every item
|
bool secExpired = isTimeOver(timerPollingCheck,millis(),INTERVAL_SLOW_POLLING);
|
||||||
|
if (secExpired) timerPollingCheck = millis();
|
||||||
|
|
||||||
configLocked++;
|
configLocked++;
|
||||||
aJsonObject * item = items->child;
|
aJsonObject * item = items->child;
|
||||||
while (items && item)
|
while (items && item)
|
||||||
if (item->type == aJson_Array && aJson.getArraySize(item)>1) {
|
if (item->type == aJson_Array && aJson.getArraySize(item)>1) {
|
||||||
Item it(item);
|
Item it(item);
|
||||||
if (it.isValid()) {
|
if (it.isValid()) {
|
||||||
it.Poll(POLLING_FAST);
|
it.Poll((secExpired)?POLLING_1S:POLLING_FAST);
|
||||||
} //isValid
|
} //isValid
|
||||||
yield();
|
yield();
|
||||||
item = item->next;
|
item = item->next;
|
||||||
@@ -2583,8 +2596,8 @@ configLocked--;
|
|||||||
// SLOW POLLING
|
// SLOW POLLING
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
if (lanStatus == RETAINING_COLLECTING) return;
|
if (lanStatus == RETAINING_COLLECTING) return;
|
||||||
//if (millis() > timerPollingCheck)
|
|
||||||
if (isTimeOver(timerPollingCheck,millis(),INTERVAL_SLOW_POLLING))
|
if (secExpired)
|
||||||
{
|
{
|
||||||
while (pollingItem && !done) {
|
while (pollingItem && !done) {
|
||||||
if (pollingItem->type == aJson_Array) {
|
if (pollingItem->type == aJson_Array) {
|
||||||
@@ -2592,7 +2605,7 @@ configLocked--;
|
|||||||
uint32_t ret = it.Poll(POLLING_SLOW);
|
uint32_t ret = it.Poll(POLLING_SLOW);
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
timerPollingCheck = millis();// + ret; //INTERVAL_CHECK_MODBUS;
|
////// timerPollingCheck = millis();// + ret; //INTERVAL_CHECK_MODBUS;
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
}//if
|
}//if
|
||||||
|
|||||||
@@ -242,16 +242,14 @@ return (power & 1);
|
|||||||
|
|
||||||
int out_AC::Poll(short cause)
|
int out_AC::Poll(short cause)
|
||||||
{
|
{
|
||||||
if (cause!=POLLING_SLOW) return 0;
|
if (cause!=POLLING_SLOW) return false;
|
||||||
|
|
||||||
//long now = millis();
|
|
||||||
//if (now - prevPolling > INTERVAL_AC_POLLING) {
|
|
||||||
if (isTimeOver(prevPolling,millis(),INTERVAL_AC_POLLING)) {
|
if (isTimeOver(prevPolling,millis(),INTERVAL_AC_POLLING)) {
|
||||||
prevPolling = millisNZ();
|
prevPolling = millisNZ();
|
||||||
debugSerial.println(F("Polling"));
|
debugSerial.println(F("Polling"));
|
||||||
SendData(qstn, sizeof(qstn)/sizeof(byte)); //Опрос кондиционера
|
SendData(qstn, sizeof(qstn)/sizeof(byte)); //Опрос кондиционера
|
||||||
}
|
}
|
||||||
///delay(100);
|
|
||||||
if(AC_Serial.available() >= 37){ //was 0
|
if(AC_Serial.available() >= 37){ //was 0
|
||||||
AC_Serial.readBytes(data, 37);
|
AC_Serial.readBytes(data, 37);
|
||||||
while(AC_Serial.available()){
|
while(AC_Serial.available()){
|
||||||
@@ -263,10 +261,9 @@ if (cause!=POLLING_SLOW) return 0;
|
|||||||
InsertData(data, 37);
|
InsertData(data, 37);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return INTERVAL_SLOW_POLLING;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
//int out_AC::Ctrl(short cmd, short n, int * Parameters, int suffixCode, char* subItem)
|
|
||||||
int out_AC::Ctrl(itemCmd cmd, char* subItem , bool toExecute)
|
int out_AC::Ctrl(itemCmd cmd, char* subItem , bool toExecute)
|
||||||
{
|
{
|
||||||
//char s_mode[10];
|
//char s_mode[10];
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ return driverStatus;
|
|||||||
|
|
||||||
int out_counter::Poll(short cause)
|
int out_counter::Poll(short cause)
|
||||||
{
|
{
|
||||||
|
if (cause==POLLING_SLOW) return 0;
|
||||||
if (!item) return 0;
|
if (!item) return 0;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -31,12 +31,6 @@ int out_dmx::Status()
|
|||||||
return driverStatus;
|
return driverStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int out_dmx::Poll(short cause)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
int out_dmx::getChanType()
|
int out_dmx::getChanType()
|
||||||
{
|
{
|
||||||
if (item)
|
if (item)
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ public:
|
|||||||
|
|
||||||
out_dmx(Item * _item):colorChannel(_item){};
|
out_dmx(Item * _item):colorChannel(_item){};
|
||||||
int Setup() override;
|
int Setup() override;
|
||||||
int Poll(short cause) override;
|
|
||||||
int Stop() override;
|
int Stop() override;
|
||||||
int Status() override;
|
int Status() override;
|
||||||
|
|
||||||
|
|||||||
@@ -451,6 +451,7 @@ int out_Modbus::sendModbus(char * paramName, int32_t value, uint8_t regType)
|
|||||||
|
|
||||||
int out_Modbus::Poll(short cause)
|
int out_Modbus::Poll(short cause)
|
||||||
{
|
{
|
||||||
|
if (cause==POLLING_SLOW) return 0;
|
||||||
bool lineInitialized = false;
|
bool lineInitialized = false;
|
||||||
|
|
||||||
if (modbusBusy || (Status() != CST_INITIALIZED)) return 0;
|
if (modbusBusy || (Status() != CST_INITIALIZED)) return 0;
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ return st.getPercents255();
|
|||||||
*/
|
*/
|
||||||
int out_Motor::Poll(short cause)
|
int out_Motor::Poll(short cause)
|
||||||
{
|
{
|
||||||
|
if (cause==POLLING_SLOW) return 0;
|
||||||
int curPos = -1;
|
int curPos = -1;
|
||||||
int targetPos = -1;
|
int targetPos = -1;
|
||||||
int dif;
|
int dif;
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ return (item->getCmd()!=CMD_OFF);
|
|||||||
|
|
||||||
int out_pid::Poll(short cause)
|
int out_pid::Poll(short cause)
|
||||||
{
|
{
|
||||||
|
if (cause==POLLING_SLOW) return 0;
|
||||||
if (store && store->pid && (Status() == CST_INITIALIZED) && item && (item->getCmd()!=CMD_OFF))
|
if (store && store->pid && (Status() == CST_INITIALIZED) && item && (item->getCmd()!=CMD_OFF))
|
||||||
{
|
{
|
||||||
//double prevOut=store->output;
|
//double prevOut=store->output;
|
||||||
|
|||||||
@@ -85,12 +85,6 @@ return driverStatus;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int out_pwm::Poll(short cause)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
int out_pwm::getChanType()
|
int out_pwm::getChanType()
|
||||||
{
|
{
|
||||||
if (item)
|
if (item)
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ public:
|
|||||||
|
|
||||||
out_pwm(Item * _item):colorChannel(_item){};
|
out_pwm(Item * _item):colorChannel(_item){};
|
||||||
int Setup() override;
|
int Setup() override;
|
||||||
int Poll(short cause) override;
|
|
||||||
int Stop() override;
|
int Stop() override;
|
||||||
int Status() override;
|
int Status() override;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "dmx.h"
|
#include "dmx.h"
|
||||||
|
#include "utils.h"
|
||||||
static int driverStatus = CST_UNKNOWN;
|
static int driverStatus = CST_UNKNOWN;
|
||||||
|
|
||||||
void out_relay::getConfig()
|
void out_relay::getConfig()
|
||||||
@@ -44,7 +44,7 @@ if (item) item->setExt(0);
|
|||||||
//if (item->getCmd()) item->setFlag(SEND_COMMAND);
|
//if (item->getCmd()) item->setFlag(SEND_COMMAND);
|
||||||
//if (item->itemVal) item->setFlag(SEND_PARAMETERS);
|
//if (item->itemVal) item->setFlag(SEND_PARAMETERS);
|
||||||
driverStatus = CST_INITIALIZED;
|
driverStatus = CST_INITIALIZED;
|
||||||
if (!item->isActive())
|
if (item->isActive()>0) ///????
|
||||||
{
|
{
|
||||||
item->setExt(millisNZ());
|
item->setExt(millisNZ());
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ int out_relay::Status()
|
|||||||
{
|
{
|
||||||
return driverStatus;
|
return driverStatus;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
const char action_P[] PROGMEM = "action";
|
const char action_P[] PROGMEM = "action";
|
||||||
const char cooling_P[] PROGMEM = "cooling";
|
const char cooling_P[] PROGMEM = "cooling";
|
||||||
const char heating_P[] PROGMEM = "heating";
|
const char heating_P[] PROGMEM = "heating";
|
||||||
@@ -71,7 +71,7 @@ const char drying_P[] PROGMEM = "drying";
|
|||||||
const char idle_P[] PROGMEM = "idle";
|
const char idle_P[] PROGMEM = "idle";
|
||||||
const char fan_P[] PROGMEM = "fan";
|
const char fan_P[] PROGMEM = "fan";
|
||||||
const char off_P[] PROGMEM = "off";
|
const char off_P[] PROGMEM = "off";
|
||||||
|
*/
|
||||||
|
|
||||||
void out_relay::relay(bool state)
|
void out_relay::relay(bool state)
|
||||||
{
|
{
|
||||||
@@ -111,14 +111,9 @@ debugSerial << F("pub action ") << publishTopic(item->itemArr->name,val,subtopic
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool getPinVal(uint8_t pin)
|
|
||||||
{
|
|
||||||
return (0!=(*portOutputRegister( digitalPinToPort(pin) ) & digitalPinToBitMask(pin)));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int out_relay::Poll(short cause)
|
int out_relay::Poll(short cause)
|
||||||
{
|
{
|
||||||
|
if (cause==POLLING_SLOW) return 0;
|
||||||
if (!item) return 0;
|
if (!item) return 0;
|
||||||
itemCmd st;
|
itemCmd st;
|
||||||
st.loadItem(item);
|
st.loadItem(item);
|
||||||
|
|||||||
@@ -89,12 +89,6 @@ return driverStatus;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int out_SPILed::Poll(short cause)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
int out_SPILed::getChanType()
|
int out_SPILed::getChanType()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ public:
|
|||||||
|
|
||||||
out_SPILed(Item * _item):colorChannel(_item){getConfig();};
|
out_SPILed(Item * _item):colorChannel(_item){getConfig();};
|
||||||
int Setup() override;
|
int Setup() override;
|
||||||
int Poll(short cause) override;
|
|
||||||
int Stop() override;
|
int Stop() override;
|
||||||
int Status() override;
|
int Status() override;
|
||||||
int getChanType() override;
|
int getChanType() override;
|
||||||
|
|||||||
@@ -287,6 +287,7 @@ bufB[0]=0;
|
|||||||
|
|
||||||
int out_UARTbridge::Poll(short cause)
|
int out_UARTbridge::Poll(short cause)
|
||||||
{
|
{
|
||||||
|
if (cause==POLLING_SLOW) return 0;
|
||||||
uint8_t chA;
|
uint8_t chA;
|
||||||
uint8_t chB;
|
uint8_t chB;
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,16 @@ const char statsval_P[] PROGMEM = "uptime,freeheap";
|
|||||||
const char uptime_P[] PROGMEM = "uptime";
|
const char uptime_P[] PROGMEM = "uptime";
|
||||||
const char freeheap_P[] PROGMEM = "freeheap";
|
const char freeheap_P[] PROGMEM = "freeheap";
|
||||||
const char CMDTOPIC_P[] PROGMEM = CMDTOPIC;
|
const char CMDTOPIC_P[] PROGMEM = CMDTOPIC;
|
||||||
|
|
||||||
|
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";
|
||||||
|
const char on_P[] PROGMEM = "on";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
{"name": "Спальня LED",
|
{"name": "Спальня LED",
|
||||||
|
|||||||
@@ -581,7 +581,7 @@ bool isTimeOver(uint32_t timestamp, uint32_t currTime, uint32_t time, uint32_t m
|
|||||||
return ((currTime>endTime) && (currTime <timestamp)) ||
|
return ((currTime>endTime) && (currTime <timestamp)) ||
|
||||||
((timestamp<endTime) && ((currTime>endTime) || (currTime <timestamp)));
|
((timestamp<endTime) && ((currTime>endTime) || (currTime <timestamp)));
|
||||||
}
|
}
|
||||||
|
//millis() - tmr1 >= MY_PERIOD
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -721,10 +721,11 @@ itemCmd mapInt(int32_t arg, aJsonObject* map)
|
|||||||
return _itemCmd.Int(arg);
|
return _itemCmd.Int(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Same as millis() but never return 0 or -1
|
||||||
unsigned long millisNZ(uint8_t shift)
|
unsigned long millisNZ(uint8_t shift)
|
||||||
{
|
{
|
||||||
unsigned long now = millis()>>shift;
|
unsigned long now = millis()>>shift;
|
||||||
if (!now) now=1;
|
if (!now || !(now+1)) now=1;
|
||||||
return now;
|
return now;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -774,5 +775,11 @@ serialParamType str2SerialParam(char * str)
|
|||||||
debugSerial<< F("Default serial mode N81 used");
|
debugSerial<< F("Default serial mode N81 used");
|
||||||
return static_cast<serialParamType> (SERIAL_8N1);
|
return static_cast<serialParamType> (SERIAL_8N1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool getPinVal(uint8_t pin)
|
||||||
|
{
|
||||||
|
return (0!=(*portOutputRegister( digitalPinToPort(pin) ) & digitalPinToBitMask(pin)));
|
||||||
|
}
|
||||||
|
|
||||||
#pragma message(VAR_NAME_VALUE(debugSerial))
|
#pragma message(VAR_NAME_VALUE(debugSerial))
|
||||||
#pragma message(VAR_NAME_VALUE(SERIAL_BAUD))
|
#pragma message(VAR_NAME_VALUE(SERIAL_BAUD))
|
||||||
|
|||||||
@@ -75,3 +75,4 @@ itemCmd mapInt(int32_t arg, aJsonObject* map);
|
|||||||
unsigned long millisNZ(uint8_t shift=0);
|
unsigned long millisNZ(uint8_t shift=0);
|
||||||
serialParamType str2SerialParam(char * str);
|
serialParamType str2SerialParam(char * str);
|
||||||
String toString(const IPAddress& address);
|
String toString(const IPAddress& address);
|
||||||
|
bool getPinVal(uint8_t pin);
|
||||||
|
|||||||
Reference in New Issue
Block a user