add opener gpio control

This commit is contained in:
technyon
2023-04-07 16:23:51 +02:00
parent a783750741
commit 0ae0fb6265
6 changed files with 139 additions and 25 deletions

View File

@@ -8,11 +8,12 @@
NukiOpenerWrapper* nukiOpenerInst;
NukiOpenerWrapper::NukiOpenerWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, NetworkOpener* network, Preferences* preferences)
NukiOpenerWrapper::NukiOpenerWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, NetworkOpener* network, Gpio* gpio, Preferences* preferences)
: _deviceName(deviceName),
_nukiOpener(deviceName, id),
_bleScanner(scanner),
_network(network),
_gpio(gpio),
_preferences(preferences)
{
nukiOpenerInst = this;
@@ -26,6 +27,8 @@ NukiOpenerWrapper::NukiOpenerWrapper(const std::string& deviceName, uint32_t id,
network->setLockActionReceivedCallback(nukiOpenerInst->onLockActionReceivedCallback);
network->setConfigUpdateReceivedCallback(nukiOpenerInst->onConfigUpdateReceivedCallback);
network->setKeypadCommandReceivedCallback(nukiOpenerInst->onKeypadCommandReceivedCallback);
_gpio->addCallback(NukiOpenerWrapper::gpioActionCallback);
}
@@ -252,6 +255,36 @@ void NukiOpenerWrapper::update()
memcpy(&_lastKeyTurnerState, &_keyTurnerState, sizeof(NukiOpener::OpenerState));
}
void NukiOpenerWrapper::electricStrikeActuation()
{
_nextLockAction = NukiOpener::LockAction::ElectricStrikeActuation;
}
void NukiOpenerWrapper::activateRTO()
{
_nextLockAction = NukiOpener::LockAction::ActivateRTO;
}
void NukiOpenerWrapper::activateCM()
{
_nextLockAction = NukiOpener::LockAction::ActivateCM;
}
void NukiOpenerWrapper::deactivateRtoCm()
{
if(_keyTurnerState.nukiState == NukiOpener::State::ContinuousMode)
{
_nextLockAction = NukiOpener::LockAction::DeactivateCM;
return;
}
if(_keyTurnerState.lockState == NukiOpener::LockState::RTOactive)
{
_nextLockAction = NukiOpener::LockAction::DeactivateRTO;
}
}
bool NukiOpenerWrapper::isPinSet()
{
return _nukiOpener.getSecurityPincode() != 0;
@@ -448,6 +481,25 @@ void NukiOpenerWrapper::onKeypadCommandReceivedCallback(const char *command, con
nukiOpenerInst->onKeypadCommandReceived(command, id, name, code, enabled);
}
void NukiOpenerWrapper::gpioActionCallback(const GpioAction &action)
{
switch(action)
{
case GpioAction::ElectricStrikeActuation:
nukiOpenerInst->electricStrikeActuation();
break;
case GpioAction::ActivateRTO:
nukiOpenerInst->activateRTO();
break;
case GpioAction::ActivateCM:
nukiOpenerInst->activateCM();
break;
case GpioAction::DeactivateRtoCm:
nukiOpenerInst->deactivateRtoCm();
break;
}
}
void NukiOpenerWrapper::onConfigUpdateReceived(const char *topic, const char *value)
{
if(strcmp(topic, mqtt_topic_config_button_enabled) == 0)