SinricPro Library
LockController.h
1 #pragma once
2 
3 #include "../SinricProRequest.h"
4 #include "../EventLimiter.h"
5 #include "../SinricProStrings.h"
6 
7 #include "../SinricProNamespace.h"
8 namespace SINRICPRO_NAMESPACE {
9 
10 FSTR(LOCK, setLockState); // "setLockState"
11 FSTR(LOCK, state); // "state"
12 FSTR(LOCK, LOCKED); // "LOCKED"
13 FSTR(LOCK, UNLOCKED); // "UNLOCKED"
14 FSTR(LOCK, lock); // "lock"
15 FSTR(LOCK, JAMMED); // "JAMMED"
16 
36 using LockStateCallback = std::function<bool(const String &, bool &)>; // void onLockState(const DeviceId &deviceId, bool& lockState);
37 
38 
43 template <typename T>
45  public:
47 
49  bool sendLockStateEvent(bool state, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
50 
51  protected:
52  bool handleLockController(SinricProRequest &request);
53 
54  private:
55  EventLimiter event_limiter;
56  LockStateCallback lockStateCallback;
57 };
58 
59 template <typename T>
61 : event_limiter(EVENT_LIMIT_STATE) {
62  T* device = static_cast<T*>(this);
63  device->registerRequestHandler(std::bind(&LockController<T>::handleLockController, this, std::placeholders::_1));
64 }
65 
73 template <typename T>
75  lockStateCallback = cb;
76 }
77 
87 template <typename T>
88 bool LockController<T>::sendLockStateEvent(bool state, String cause) {
89  if (event_limiter) return false;
90  T* device = static_cast<T*>(this);
91 
92  JsonDocument eventMessage = device->prepareEvent(FSTR_LOCK_setLockState, cause.c_str());
93  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
94  state ? event_value[FSTR_LOCK_state] = FSTR_LOCK_LOCKED : event_value[FSTR_LOCK_state] = FSTR_LOCK_UNLOCKED;
95  return device->sendEvent(eventMessage);
96 }
97 
98 template <typename T>
99 bool LockController<T>::handleLockController(SinricProRequest &request) {
100  T* device = static_cast<T*>(this);
101 
102  bool success = false;
103 
104  if (request.action == FSTR_LOCK_setLockState && lockStateCallback) {
105  bool lockState = request.request_value[FSTR_LOCK_state] == FSTR_LOCK_lock ? true : false;
106  success = lockStateCallback(device->deviceId, lockState);
107  request.response_value[FSTR_LOCK_state] = success ? lockState ? FSTR_LOCK_LOCKED : FSTR_LOCK_UNLOCKED : FSTR_LOCK_JAMMED;
108  return success;
109  }
110  return success;
111 }
112 
113 } // SINRICPRO_NAMESPACE
114 
115 template <typename T>
116 using LockController = SINRICPRO_NAMESPACE::LockController<T>;
LockController.
Definition: LockController.h:44
bool sendLockStateEvent(bool state, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send lockState event to SinricPro Server indicating actual lock state.
Definition: LockController.h:88
void onLockState(LockStateCallback cb)
Set callback function for setLockState request.
Definition: LockController.h:74
std::function< bool(const String &, bool &)> LockStateCallback
Callback definition for onLockState function.
Definition: LockController.h:36