1 /*
2 * Copyright (c) 2006-2023, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2019-08-08 balanceTWK the first version
9 */
10
11 #include <rtdevice.h>
12
rt_pulse_encoder_init(struct rt_device * dev)13 static rt_err_t rt_pulse_encoder_init(struct rt_device *dev)
14 {
15 struct rt_pulse_encoder_device *pulse_encoder;
16
17 pulse_encoder = (struct rt_pulse_encoder_device *)dev;
18 if (pulse_encoder->ops->init)
19 {
20 return pulse_encoder->ops->init(pulse_encoder);
21 }
22 else
23 {
24 return -RT_ENOSYS;
25 }
26 }
27
rt_pulse_encoder_open(struct rt_device * dev,rt_uint16_t oflag)28 static rt_err_t rt_pulse_encoder_open(struct rt_device *dev, rt_uint16_t oflag)
29 {
30 struct rt_pulse_encoder_device *pulse_encoder;
31
32 pulse_encoder = (struct rt_pulse_encoder_device *)dev;
33 if (pulse_encoder->ops->control)
34 {
35 return pulse_encoder->ops->control(pulse_encoder, PULSE_ENCODER_CMD_ENABLE, RT_NULL);
36 }
37 else
38 {
39 return -RT_ENOSYS;
40 }
41 }
42
rt_pulse_encoder_close(struct rt_device * dev)43 static rt_err_t rt_pulse_encoder_close(struct rt_device *dev)
44 {
45 struct rt_pulse_encoder_device *pulse_encoder;
46
47 pulse_encoder = (struct rt_pulse_encoder_device *)dev;
48 if (pulse_encoder->ops->control)
49 {
50 return pulse_encoder->ops->control(pulse_encoder, PULSE_ENCODER_CMD_DISABLE, RT_NULL);
51 }
52 else
53 {
54 return -RT_ENOSYS;
55 }
56 }
57
rt_pulse_encoder_read(struct rt_device * dev,rt_off_t pos,void * buffer,rt_size_t size)58 static rt_ssize_t rt_pulse_encoder_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size)
59 {
60 struct rt_pulse_encoder_device *pulse_encoder;
61
62 pulse_encoder = (struct rt_pulse_encoder_device *)dev;
63 if (pulse_encoder->ops->get_count)
64 {
65 *(rt_int32_t *)buffer = pulse_encoder->ops->get_count(pulse_encoder);
66 }
67 return 1;
68 }
69
rt_pulse_encoder_control(struct rt_device * dev,int cmd,void * args)70 static rt_err_t rt_pulse_encoder_control(struct rt_device *dev, int cmd, void *args)
71 {
72 rt_err_t result;
73 struct rt_pulse_encoder_device *pulse_encoder;
74
75 result = RT_EOK;
76 pulse_encoder = (struct rt_pulse_encoder_device *)dev;
77 switch (cmd)
78 {
79 case PULSE_ENCODER_CMD_CLEAR_COUNT:
80 result = pulse_encoder->ops->clear_count(pulse_encoder);
81 break;
82 case PULSE_ENCODER_CMD_GET_TYPE:
83 *(enum rt_pulse_encoder_type *)args = pulse_encoder->type;
84 break;
85 case PULSE_ENCODER_CMD_ENABLE:
86 case PULSE_ENCODER_CMD_DISABLE:
87 result = pulse_encoder->ops->control(pulse_encoder, cmd, args);
88 break;
89 default:
90 result = -RT_ENOSYS;
91 break;
92 }
93
94 return result;
95 }
96
97 #ifdef RT_USING_DEVICE_OPS
98 const static struct rt_device_ops pulse_encoder_ops =
99 {
100 rt_pulse_encoder_init,
101 rt_pulse_encoder_open,
102 rt_pulse_encoder_close,
103 rt_pulse_encoder_read,
104 RT_NULL,
105 rt_pulse_encoder_control
106 };
107 #endif
108
rt_device_pulse_encoder_register(struct rt_pulse_encoder_device * pulse_encoder,const char * name,void * user_data)109 rt_err_t rt_device_pulse_encoder_register(struct rt_pulse_encoder_device *pulse_encoder, const char *name, void *user_data)
110 {
111 struct rt_device *device;
112
113 RT_ASSERT(pulse_encoder != RT_NULL);
114 RT_ASSERT(pulse_encoder->ops != RT_NULL);
115
116 device = &(pulse_encoder->parent);
117
118 device->type = RT_Device_Class_Miscellaneous;
119 device->rx_indicate = RT_NULL;
120 device->tx_complete = RT_NULL;
121
122 #ifdef RT_USING_DEVICE_OPS
123 device->ops = &pulse_encoder_ops;
124 #else
125 device->init = rt_pulse_encoder_init;
126 device->open = rt_pulse_encoder_open;
127 device->close = rt_pulse_encoder_close;
128 device->read = rt_pulse_encoder_read;
129 device->write = RT_NULL;
130 device->control = rt_pulse_encoder_control;
131 #endif
132 device->user_data = user_data;
133
134 return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE);
135 }
136