Initial coding of protectPinISR(pin) method
Works for all NVS calls in homeSpan.h. To Do: Add logic to all other NVS calls.
This commit is contained in:
parent
d2bbd4f56c
commit
852a916d61
|
|
@ -1387,6 +1387,24 @@ void Span::checkRanges(){
|
||||||
homeSpan.configLog+="\n\n";
|
homeSpan.configLog+="\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
|
||||||
|
void Span::protectGPIOs(boolean suspend){
|
||||||
|
|
||||||
|
auto gp=ProtectedGPIOs.begin();
|
||||||
|
while(gp!=ProtectedGPIOs.end()){
|
||||||
|
if(suspend){
|
||||||
|
Serial.printf("PIN: %d Status: %d : ",gp->first,GPIO.pin[gp->first].int_type);
|
||||||
|
gp->second=GPIO.pin[gp->first].int_type;
|
||||||
|
GPIO.pin[gp->first].int_type=0;
|
||||||
|
Serial.printf("PIN: %d Status: %d\n",gp->first,GPIO.pin[gp->first].int_type);
|
||||||
|
} else {
|
||||||
|
GPIO.pin[gp->first].int_type=gp->second;
|
||||||
|
}
|
||||||
|
gp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
// SpanAccessory //
|
// SpanAccessory //
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -145,6 +145,7 @@ struct Span{
|
||||||
vector<SpanBuf> Notifications; // vector of SpanBuf objects that store info for Characteristics that are updated with setVal() and require a Notification Event
|
vector<SpanBuf> Notifications; // vector of SpanBuf objects that store info for Characteristics that are updated with setVal() and require a Notification Event
|
||||||
vector<SpanButton *> PushButtons; // vector of pointer to all PushButtons
|
vector<SpanButton *> PushButtons; // vector of pointer to all PushButtons
|
||||||
unordered_map<uint64_t, uint32_t> TimedWrites; // map of timed-write PIDs and Alarm Times (based on TTLs)
|
unordered_map<uint64_t, uint32_t> TimedWrites; // map of timed-write PIDs and Alarm Times (based on TTLs)
|
||||||
|
unordered_map<uint8_t, uint8_t> ProtectedGPIOs; // map of pins to protect when running an ISR during NVS operations
|
||||||
|
|
||||||
unordered_map<char, SpanUserCommand *> UserCommands; // map of pointers to all UserCommands
|
unordered_map<char, SpanUserCommand *> UserCommands; // map of pointers to all UserCommands
|
||||||
|
|
||||||
|
|
@ -159,6 +160,7 @@ struct Span{
|
||||||
void commandMode(); // allows user to control and reset HomeSpan settings with the control button
|
void commandMode(); // allows user to control and reset HomeSpan settings with the control button
|
||||||
void processSerialCommand(const char *c); // process command 'c' (typically from readSerial, though can be called with any 'c')
|
void processSerialCommand(const char *c); // process command 'c' (typically from readSerial, though can be called with any 'c')
|
||||||
void checkRanges(); // checks values of all Characteristics to ensure they are each within range
|
void checkRanges(); // checks values of all Characteristics to ensure they are each within range
|
||||||
|
void protectGPIOs(boolean suspend); // true - disable ISRs on protectedGPIOs; false - re-enable ISRs on protectedGPIOs
|
||||||
|
|
||||||
int sprintfAttributes(char *cBuf); // prints Attributes JSON database into buf, unless buf=NULL; return number of characters printed, excluding null terminator, even if buf=NULL
|
int sprintfAttributes(char *cBuf); // prints Attributes JSON database into buf, unless buf=NULL; return number of characters printed, excluding null terminator, even if buf=NULL
|
||||||
void prettyPrint(char *buf, int nsp=2); // print arbitrary JSON from buf to serial monitor, formatted with indentions of 'nsp' spaces
|
void prettyPrint(char *buf, int nsp=2); // print arbitrary JSON from buf to serial monitor, formatted with indentions of 'nsp' spaces
|
||||||
|
|
@ -190,6 +192,7 @@ struct Span{
|
||||||
const char *getSketchVersion(){return sketchVersion;} // get sketch version number
|
const char *getSketchVersion(){return sketchVersion;} // get sketch version number
|
||||||
void setWifiCallback(void (*f)()){wifiCallback=f;} // sets an optional user-defined function to call once WiFi connectivity is established
|
void setWifiCallback(void (*f)()){wifiCallback=f;} // sets an optional user-defined function to call once WiFi connectivity is established
|
||||||
void setApFunction(void (*f)()){apFunction=f;} // sets an optional user-defined function to call when activating the WiFi Access Point
|
void setApFunction(void (*f)()){apFunction=f;} // sets an optional user-defined function to call when activating the WiFi Access Point
|
||||||
|
void protectPinISR(uint8_t pin){ProtectedGPIOs[pin]=0;} // protects ISR on pin from NVS operations
|
||||||
|
|
||||||
void setPairingCode(const char *s){sprintf(pairingCodeCommand,"S %9s",s);} // sets the Pairing Code - use is NOT recommended. Use 'S' from CLI instead
|
void setPairingCode(const char *s){sprintf(pairingCodeCommand,"S %9s",s);} // sets the Pairing Code - use is NOT recommended. Use 'S' from CLI instead
|
||||||
|
|
||||||
|
|
@ -409,6 +412,7 @@ struct SpanCharacteristic{
|
||||||
uvSet(value,val);
|
uvSet(value,val);
|
||||||
|
|
||||||
if(nvsStore){
|
if(nvsStore){
|
||||||
|
homeSpan.protectGPIOs(true);
|
||||||
nvsKey=(char *)malloc(16);
|
nvsKey=(char *)malloc(16);
|
||||||
uint16_t t;
|
uint16_t t;
|
||||||
sscanf(type,"%x",&t);
|
sscanf(type,"%x",&t);
|
||||||
|
|
@ -438,6 +442,7 @@ struct SpanCharacteristic{
|
||||||
nvsFlag=1;
|
nvsFlag=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
homeSpan.protectGPIOs(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
uvSet(newValue,value);
|
uvSet(newValue,value);
|
||||||
|
|
@ -534,8 +539,10 @@ struct SpanCharacteristic{
|
||||||
homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector
|
homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector
|
||||||
|
|
||||||
if(nvsKey){
|
if(nvsKey){
|
||||||
|
homeSpan.protectGPIOs(true);
|
||||||
nvs_set_str(homeSpan.charNVS,nvsKey,value.STRING); // store data
|
nvs_set_str(homeSpan.charNVS,nvsKey,value.STRING); // store data
|
||||||
nvs_commit(homeSpan.charNVS);
|
nvs_commit(homeSpan.charNVS);
|
||||||
|
homeSpan.protectGPIOs(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // setString()
|
} // setString()
|
||||||
|
|
@ -566,8 +573,10 @@ struct SpanCharacteristic{
|
||||||
homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector
|
homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector
|
||||||
|
|
||||||
if(nvsKey){
|
if(nvsKey){
|
||||||
|
homeSpan.protectGPIOs(true);
|
||||||
nvs_set_blob(homeSpan.charNVS,nvsKey,&value,sizeof(UVal)); // store data
|
nvs_set_blob(homeSpan.charNVS,nvsKey,&value,sizeof(UVal)); // store data
|
||||||
nvs_commit(homeSpan.charNVS);
|
nvs_commit(homeSpan.charNVS);
|
||||||
|
homeSpan.protectGPIOs(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue