/* * * Copyright (c) 2021-2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include LOG_MODULE_REGISTER(ButtonManager, CONFIG_CHIP_APP_LOG_LEVEL); ButtonManager & ButtonManager::getInstance() { static ButtonManager instance; return instance; } ButtonManager::ButtonManager() : m_events{} {} void ButtonManager::addCallback(void (*callback)(void), size_t button, bool pressed) { Event event = { .button = button, .pressed = pressed, .callback = callback }; m_events.insert(event); } void ButtonManager::rmCallback(void (*callback)(void)) { for (auto it = m_events.begin(); it != m_events.end();) { if (it->callback == callback) { it = m_events.erase(it); } else { ++it; } } } void ButtonManager::rmCallback(size_t button, bool pressed) { for (auto it = m_events.begin(); it != m_events.end();) { if (it->button == button && it->pressed == pressed) { it = m_events.erase(it); } else { ++it; } } } void ButtonManager::linkBackend(ButtonBackend & backend) { if (!backend.linkHW(onButton, this)) { LOG_ERR("Button backend not inited!"); } } void ButtonManager::onButton(size_t button, bool pressed, void * buttonMgr) { ButtonManager * buttonManager = static_cast(buttonMgr); for (auto it = buttonManager->m_events.begin(); it != buttonManager->m_events.end(); ++it) { if (it->button == button && it->pressed == pressed && it->callback) { it->callback(); } } } #if CONFIG_CHIP_BUTTON_MANAGER_IRQ_MODE #include static KEY_POOL_DEFINE(key_pool); ButtonPool & ButtonPool::getInstance() { static ButtonPool instance; return instance; } bool ButtonPool::linkHW(void (*on_button_change)(size_t button, bool pressed, void * context), void * context) { bool result = false; if (key_pool_init(&key_pool)) { key_pool_set_callback(&key_pool, on_button_change, context); LOG_INF("Key pool inited"); result = true; } else { LOG_ERR("Key pool not inited!"); } return result; } #else #include static KEY_MATRIX_DEFINE(key_matrix); ButtonMatrix & ButtonMatrix::getInstance() { static ButtonMatrix instance; return instance; } bool ButtonMatrix::linkHW(void (*on_button_change)(size_t button, bool pressed, void * context), void * context) { bool result = false; if (key_matrix_init(&key_matrix)) { key_matrix_set_callback(&key_matrix, on_button_change, context); LOG_INF("Key matrix inited"); result = true; } else { LOG_ERR("Key matrix not inited!"); } return result; } #endif // CONFIG_CHIP_BUTTON_MANAGER_IRQ_MODE