/* * Copyright (c) 2019 Actions Semiconductor Co., Ltd * * SPDX-License-Identifier: Apache-2.0 */ /** * @file input manager interface */ #include #include #include #include #include #include #include #include #include #include K_MSGQ_DEFINE(encoder_scan_msgq, sizeof(input_dev_data_t), 10, 4); #ifdef CONFIG_INPUT_DEV_ACTS_ADC_SR static void encoder_scan_callback(struct device *dev, uint32_t row, uint32_t col, bool pressed) { input_dev_data_t data = { .point.x = col, .point.y = row, .state = pressed ? INPUT_DEV_STATE_PR : INPUT_DEV_STATE_REL, }; if (k_msgq_put(&encoder_scan_msgq, &data, K_NO_WAIT) != 0) { SYS_LOG_ERR("Could put input data into queue"); } } static bool encoder_scan_read(input_drv_t *drv, input_dev_data_t *data) { static input_dev_data_t prev = { .point.x = 0, .point.y = 0, .state = INPUT_DEV_STATE_REL, }; input_dev_data_t curr; if (k_msgq_get(&encoder_scan_msgq, &curr, K_NO_WAIT) == 0) { prev = curr; } *data = prev; return k_msgq_num_used_get(&encoder_scan_msgq) > 0; } #endif int input_encoder_device_init(void) { #ifdef CONFIG_INPUT_DEV_ACTS_ADC_SR input_drv_t input_drv; struct device *input_dev = device_get_binding(CONFIG_INPUT_DEV_ACTS_ADC_SR_NAME); if (!input_dev) { SYS_LOG_ERR("cannot found key dev adckey\n"); return -ENODEV; } input_dev_register_notify(input_dev, encoder_scan_callback); input_drv.type = INPUT_DEV_TYPE_ENCODER; input_drv.read_cb = encoder_scan_read; input_driver_register(&input_drv); #endif return 0; }