-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdrive_dio.h
More file actions
261 lines (224 loc) · 9.6 KB
/
drive_dio.h
File metadata and controls
261 lines (224 loc) · 9.6 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
/**
* @file drive_dio.h Библиотека цифровых входов-выходов привода.
*/
#ifndef DRIVE_DIO_H
#define DRIVE_DIO_H
#include <stdint.h>
#include <stdbool.h>
#include "stm32f10x.h"
#include "errors/errors.h"
#include "fixed/fixed32.h"
//! Количество цифровых входов.
#define DRIVE_DIO_INPUTS_COUNT 5
//! Количество цифровых выходов.
#define DRIVE_DIO_OUTPUTS_COUNT 4
//! Перечисление инвертированности логического уровня сигнала.
typedef enum _Drive_Dio_Inversion {
DRIVE_DIO_INVERSION_NONE = 0,
DRIVE_DIO_INVERSION_INVERTED = 1,
} drive_dio_inversion_t;
//! Перечисление типов цифровых входов.
typedef enum _Drive_Dio_Input_Type {
DRIVE_DIO_IN_NONE = 0,
DRIVE_DIO_IN_START_STOP = 1,
DRIVE_DIO_IN_EMERGENCY_STOP = 2,
DRIVE_DIO_IN_REFERENCE_INC = 3,
DRIVE_DIO_IN_REFERENCE_DEC = 4,
DRIVE_DIO_IN_CLEAR_ERRORS = 5,
DRIVE_DIO_IN_USER = 6,
} drive_dio_input_type_t;
//! Перечисление типов цифровых выходов.
typedef enum _Drive_Dio_Output_Type {
DRIVE_DIO_OUT_NONE = 0,
DRIVE_DIO_OUT_OK = 1,
DRIVE_DIO_OUT_READY = 2,
DRIVE_DIO_OUT_RUNNING = 3,
DRIVE_DIO_OUT_ERROR = 4,
DRIVE_DIO_OUT_WARNING = 5,
DRIVE_DIO_OUT_USER = 6,
} drive_dio_output_type_t;
//! Перечисление номеров цифровых входов.
typedef enum _Drive_Dio_Input {
DRIVE_DIO_INPUT_1 = 0,
DRIVE_DIO_INPUT_2 = 1,
DRIVE_DIO_INPUT_3 = 2,
DRIVE_DIO_INPUT_4 = 3,
DRIVE_DIO_INPUT_5 = 4,
} drive_dio_input_t;
//! Перечисление номеров цифровых выходов.
typedef enum _Drive_Dio_Output {
DRIVE_DIO_OUTPUT_1 = 0,
DRIVE_DIO_OUTPUT_2 = 1,
DRIVE_DIO_OUTPUT_3 = 2,
DRIVE_DIO_OUTPUT_4 = 3,
} drive_dio_output_t;
//! Структура инициализации цифрового входа.
typedef struct _Drive_Dio_Input_Init {
drive_dio_input_t input;
drive_dio_input_type_t type;
drive_dio_inversion_t inversion;
GPIO_TypeDef* GPIO;
uint16_t pin;
} drive_dio_input_init_t;
//! Структура инициализации цифрового выхода.
typedef struct _Drive_Dio_Output_Init {
drive_dio_output_t output;
drive_dio_output_type_t type;
drive_dio_inversion_t inversion;
GPIO_TypeDef* GPIO;
uint16_t pin;
} drive_dio_output_init_t;
//! Перечисление состояния цифровых входов / выходов.
typedef enum _Drive_Dio_State {
DRIVE_DIO_OFF = 0,
DRIVE_DIO_ON = 1
} drive_dio_state_t;
//! Каллбэк при изменении состояния цифрового входа.
typedef void (*drive_dio_on_input_changed_callback_t)(drive_dio_input_type_t type, drive_dio_state_t state);
/**
* Инициализирует цифровые входа/выхода привода.
* @return Код ошибки.
*/
extern err_t drive_dio_init(void);
/**
* Устанавливает время игнорирования измненения сигнала.
* @param dead_time Время игнорирования изменения сигнала.
*/
extern void drive_dio_set_deadtime(fixed32_t dead_time);
/**
* Инициализирует цифровой вход.
* @param input_init Структура инициализации цифрового входа.
* @return Код ошибки.
*/
extern err_t drive_dio_input_init(drive_dio_input_init_t* input_init);
/**
* Инициализирует цифровой выход.
* @param output_init Структура инициализации цифрового выхода.
* @return Код ошибки.
*/
extern err_t drive_dio_output_init(drive_dio_output_init_t* output_init);
/**
* Устанавливает пин для цифрового входа.
* @param input Цифровой вход.
* @param GPIO Порт.
* @param pin Пин.
* @return Код ошибки.
*/
extern err_t drive_dio_input_set_gpio(drive_dio_input_t input, GPIO_TypeDef* GPIO, uint16_t pin);
/**
* Настраивает цифровой вход.
* @param input Цифровой вход.
* @param type Тип цифрового входа.
* @param inversion Инверсия значения.
* @return Код ошибки.
*/
extern err_t drive_dio_input_setup(drive_dio_input_t input,
drive_dio_input_type_t type, drive_dio_inversion_t inversion);
/**
* Устанавливает пин для цифрового выхода.
* @param output Цифровой выход.
* @param GPIO Порт.
* @param pin Пин.
* @return Код ошибки.
*/
extern err_t drive_dio_output_set_gpio(drive_dio_output_t output, GPIO_TypeDef* GPIO, uint16_t pin);
/**
* Настраивает цифровой выход.
* @param output Цифровой выход.
* @param type Тип цифрового выхода.
* @param inversion Инверсия значения.
* @return Код ошибки.
*/
extern err_t drive_dio_output_setup(drive_dio_output_t output,
drive_dio_output_type_t type, drive_dio_inversion_t inversion);
/**
* Устанавливает каллбэк при изменении состояния цифрового входа.
* @param callback Каллбэк.
*/
extern void drive_dio_set_on_input_changed_callback(drive_dio_on_input_changed_callback_t callback);
/**
* Обрабатывает цифровые входа.
* @param time Время с последней обработки.
*/
extern void drive_dio_process_inputs(fixed32_t dt);
/**
* Получает состояние заданного цифрового входа.
* @param input Цифровой вход.
* @return Состояние цифрового входа.
*/
extern drive_dio_state_t drive_dio_input_state(drive_dio_input_t input);
/**
* Получает флаг изменения состояния заданного цифрового входа.
* @param input Цифровой вход.
* @return Флаг изменения состояния цифрового входа.
*/
extern bool drive_dio_input_state_changed(drive_dio_input_t input);
/**
* Получает состояние типа цифрового входа.
* @param type Тип цифрового входа.
* @return Состояние типа цифрового входа.
*/
extern drive_dio_state_t drive_dio_input_type_state(drive_dio_input_type_t type);
/**
* Получает изменения состояния типа цифрового входа.
* @param type Тип цифрового входа.
* @return Флаг изменения состояния типа цифрового входа.
*/
extern bool drive_dio_input_type_state_changed(drive_dio_input_type_t type);
/**
* Получает состояние типа цифрового входа.
* @param type Тип цифрового входа.
* @param state Состояние типа цифрового входа.
* @return Наличие цифрового входа с заданным типом.
*/
extern bool drive_dio_input_get_type_state(drive_dio_input_type_t type, drive_dio_state_t* state);
/**
* Получает состояние заданного цифрового выхода.
* @param output Цифровой выход.
* @return Состояние цифрового выхода.
*/
extern drive_dio_state_t drive_dio_output_state(drive_dio_output_t output);
/**
* Получает состояние типа цифрового выхода.
* @param type Тип цифрового выхода.
* @return Состояние типа цифрового выхода.
*/
extern drive_dio_state_t drive_dio_output_type_state(drive_dio_output_type_t type);
/**
* Получает состояние типа цифрового выхода.
* @param type Тип цифрового выхода.
* @param state Состояние типа цифрового выхода.
* @return Наличие цифрового выхода с заданным типом.
*/
extern bool drive_dio_output_get_type_state(drive_dio_output_type_t type, drive_dio_state_t* state);
/**
* Устанавливает состояние заданного цифрового выхода.
* @param output Цифровой выход.
* @param state Состояние цифрового выхода.
* @return Код ошибки.
*/
extern err_t drive_dio_set_output_state(drive_dio_output_t output, drive_dio_state_t state);
/**
* Устанавливает состояние типа цифрового выхода.
* @param type Тип цифрового выхода.
* @param state Состояние типа цифрового выхода.
*/
extern void drive_dio_set_output_type_state(drive_dio_output_type_t type, drive_dio_state_t state);
/**
* Устанавливает состояние заданного цифрового выхода.
* @param output Цифровой выход.
* @return Код ошибки.
*/
extern err_t drive_dio_toggle_output_state(drive_dio_output_t output);
/**
* Устанавливает состояние типа цифрового выхода.
* @param type Тип цифрового выхода.
*/
extern void drive_dio_toggle_output_type_state(drive_dio_output_type_t type);
/**
* Обработчик изменения состояния цифрового входа.
* @param input Цифровой вход.
* @return Код ошибки.
*/
extern err_t drive_dio_input_changed(drive_dio_input_t input);
#endif /* DRIVE_DIO_H */