115 lines
2.1 KiB
C
115 lines
2.1 KiB
C
/*
|
|
* Copyright (c) 2020 Jabil Inc.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#define DT_DRV_COMPAT zephyr_sdl_kscan
|
|
|
|
#include <zephyr/drivers/kscan.h>
|
|
#include <zephyr/logging/log.h>
|
|
|
|
#include <SDL.h>
|
|
|
|
LOG_MODULE_REGISTER(kscan, CONFIG_KSCAN_LOG_LEVEL);
|
|
|
|
struct sdl_data {
|
|
const struct device *dev;
|
|
kscan_callback_t callback;
|
|
bool enabled;
|
|
};
|
|
|
|
static int sdl_filter(void *arg, SDL_Event *event)
|
|
{
|
|
struct sdl_data *data = arg;
|
|
uint32_t row = 0;
|
|
uint32_t column = 0;
|
|
bool pressed = 0;
|
|
|
|
switch (event->type) {
|
|
case SDL_MOUSEBUTTONDOWN: {
|
|
pressed = 1;
|
|
column = event->button.x;
|
|
row = event->button.y;
|
|
} break;
|
|
case SDL_MOUSEBUTTONUP: {
|
|
pressed = 0;
|
|
column = event->button.x;
|
|
row = event->button.y;
|
|
} break;
|
|
case SDL_MOUSEMOTION: {
|
|
if (!event->motion.state)
|
|
break;
|
|
pressed = 1;
|
|
column = event->button.x;
|
|
row = event->button.y;
|
|
} break;
|
|
default:
|
|
return 1;
|
|
}
|
|
|
|
if (data->enabled && data->callback) {
|
|
data->callback(data->dev, row, column, pressed);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int sdl_configure(const struct device *dev, kscan_callback_t callback)
|
|
{
|
|
struct sdl_data *data = dev->data;
|
|
|
|
if (!callback) {
|
|
LOG_ERR("Callback is null");
|
|
return -EINVAL;
|
|
}
|
|
LOG_DBG("%s: set callback", dev->name);
|
|
|
|
data->callback = callback;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int sdl_enable_callback(const struct device *dev)
|
|
{
|
|
struct sdl_data *data = dev->data;
|
|
|
|
LOG_DBG("%s: enable cb", dev->name);
|
|
data->enabled = true;
|
|
return 0;
|
|
}
|
|
|
|
static int sdl_disable_callback(const struct device *dev)
|
|
{
|
|
struct sdl_data *data = dev->data;
|
|
|
|
LOG_DBG("%s: disable cb", dev->name);
|
|
data->enabled = false;
|
|
return 0;
|
|
}
|
|
|
|
static int sdl_init(const struct device *dev)
|
|
{
|
|
struct sdl_data *data = dev->data;
|
|
|
|
data->dev = dev;
|
|
|
|
LOG_INF("Init '%s' device", dev->name);
|
|
SDL_AddEventWatch(sdl_filter, data);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
static const struct kscan_driver_api sdl_driver_api = {
|
|
.config = sdl_configure,
|
|
.enable_callback = sdl_enable_callback,
|
|
.disable_callback = sdl_disable_callback,
|
|
};
|
|
|
|
static struct sdl_data sdl_data;
|
|
|
|
DEVICE_DT_INST_DEFINE(0, sdl_init,
|
|
NULL, &sdl_data, NULL,
|
|
POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY,
|
|
&sdl_driver_api);
|