summaryrefslogtreecommitdiff
path: root/zephyr/emul/vcmp_mock.c
blob: 9dffdd606b4ae09f23f6a02ca557620558807fdd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Copyright 2022 Google LLC
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define DT_DRV_COMPAT cros_vcmp_mock

#include "vcmp_mock.h"

#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(SENSOR_GENERIC_EMUL, CONFIG_SENSOR_LOG_LEVEL);

struct vcmp_mock_data {
	sensor_trigger_handler_t handler;
	const struct sensor_trigger *trigger;
	bool alert_enabled;
};

void vcmp_mock_trigger(const struct device *dev)
{
	struct vcmp_mock_data *data = dev->data;

	if (data->handler) {
		data->handler(dev, data->trigger);
	}
}

static int vcmp_mock_attr_set(const struct device *dev,
			      enum sensor_channel chan,
			      enum sensor_attribute attr,
			      const struct sensor_value *val)
{
	struct vcmp_mock_data *data = dev->data;

	if (chan != SENSOR_CHAN_VOLTAGE) {
		return -ENOTSUP;
	}

	switch (attr) {
	case SENSOR_ATTR_ALERT:
		data->alert_enabled = val->val1;
		break;
	default:
		return -ENOTSUP;
	}

	return 0;
}

static int vcmp_mock_attr_get(const struct device *dev,
			      enum sensor_channel chan,
			      enum sensor_attribute attr,
			      struct sensor_value *val)
{
	struct vcmp_mock_data *data = dev->data;

	if (chan != SENSOR_CHAN_VOLTAGE) {
		return -ENOTSUP;
	}

	switch (attr) {
	case SENSOR_ATTR_ALERT:
		val->val1 = data->alert_enabled;
		break;
	default:
		return -ENOTSUP;
	}

	return 0;
}

static int vcmp_mock_trigger_set(const struct device *dev,
				 const struct sensor_trigger *trig,
				 sensor_trigger_handler_t handler)
{
	struct vcmp_mock_data *data = dev->data;

	data->handler = handler;
	data->trigger = trig;

	return -ENOTSUP;
}

static int vcmp_mock_sample_fetch(const struct device *dev,
				  enum sensor_channel chan)
{
	return -ENOTSUP;
}

static int vcmp_mock_channel_get(const struct device *dev,
				 enum sensor_channel chan,
				 struct sensor_value *val)
{
	return -ENOTSUP;
}

static const struct sensor_driver_api vcmp_mock_driver_api = {
	.attr_set = vcmp_mock_attr_set,
	.channel_get = vcmp_mock_channel_get,
	.sample_fetch = vcmp_mock_sample_fetch,
	.attr_get = vcmp_mock_attr_get,
	.trigger_set = vcmp_mock_trigger_set,
};

int vcmp_mock_init(const struct device *dev)
{
	return 0;
}

#define VCMP_MOCK_INST(inst)                                                   \
	static struct vcmp_mock_data vcmp_mock_data_##inst;                    \
	SENSOR_DEVICE_DT_INST_DEFINE(inst, vcmp_mock_init, NULL,               \
				     &vcmp_mock_data_##inst, NULL,             \
				     POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, \
				     &vcmp_mock_driver_api);

DT_INST_FOREACH_STATUS_OKAY(VCMP_MOCK_INST)