123 #if QEI_ENABLE && defined(QEI_A_PIN) && defined(QEI_B_PIN)
147 uint8_t port_a, port_b, port_select;
148 volatile uint32_t dbl_click_timeout;
149 volatile uint32_t vel_timeout;
150 uint32_t vel_timestamp;
159 .settings.dbl_click_window = 500,
160 .encoder.caps.bidirectional =
On
163 static void qei_post_event (
void *data)
165 qei.on_event(&qei.encoder, &qei.event, qei.context);
168 static void qei_dblclk_event (
void *data)
170 qei.event.dbl_click =
On;
171 qei.on_event(&qei.encoder, &qei.event, qei.context);
177 qei.dir = QEI_DirUnknown;
178 qei.data.position = qei.vel_count = 0;
180 qei.vel_timeout = qei.settings.vel_timeout;
185 if(qei.vel_timeout !=
settings->vel_timeout)
198 static void qei_poll (
void *data)
200 if(qei.vel_timeout && !(--qei.vel_timeout)) {
204 qei.data.velocity = abs(qei.data.position - qei.vel_count) * 1000 / (time - qei.vel_timestamp);
205 qei.vel_timestamp = time;
206 qei.vel_timeout = qei.settings.vel_timeout;
207 if((qei.event.position_changed = !qei.dbl_click_timeout || qei.data.velocity == 0))
208 qei.on_event(&qei.encoder, &qei.event, qei.context);
209 qei.vel_count = qei.data.position;
212 if(qei.dbl_click_timeout && !(--qei.dbl_click_timeout)) {
213 qei.event.click =
On;
215 qei.on_event(&qei.encoder, &qei.event, qei.context);
219 static void qei_ab_irq (uint8_t port,
bool high)
221 const uint8_t encoder_valid_state[] = {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0};
223 static qei_state_t state = {0};
225 if(port == qei.port_a)
230 uint_fast8_t idx = (((qei.state << 2) & 0x0F) | state.pins);
232 if(encoder_valid_state[idx] ) {
236 qei.state = ((qei.state << 4) | idx) & 0xFF;
238 if(qei.state == 0x42 || qei.state == 0xD4 || qei.state == 0x2B || qei.state == 0xBD) {
240 if(qei.vel_timeout == 0 || qei.dir == QEI_DirCW) {
241 qei.dir = QEI_DirCCW;
242 qei.event.position_changed =
On;
245 }
else if(qei.state == 0x81 || qei.state == 0x17 || qei.state == 0xE8 || qei.state == 0x7E) {
247 if(qei.vel_timeout == 0 || qei.dir == QEI_DirCCW) {
249 qei.event.position_changed =
On;
256 static void qei_select_irq (uint8_t port,
bool high)
261 if(!qei.dbl_click_timeout) {
262 qei.dbl_click_timeout = qei.settings.dbl_click_window;
263 }
else if(qei.dbl_click_timeout < qei.settings.dbl_click_window) {
264 qei.dbl_click_timeout = 0;
272 if(event_handler == NULL || qei.on_event)
275 qei.context = context;
276 qei.on_event = event_handler;
277 qei.encoder.reset = qei_reset;
278 qei.encoder.get_data = qei_get_data;
279 qei.encoder.configure = qei_configure;
294 static inline void encoder_pin_claimed (uint8_t port,
xbar_t *pin)
304 qei.encoder.claim = qei_claim;
310 qei.port_select = port;
311 qei.encoder.caps.select =
On;
@ Input_QEI_A
Definition: crossbar.h:265
@ Input_QEI_Select
Definition: crossbar.h:267
@ Input_QEI_B
Definition: crossbar.h:266
@ IRQ_Mode_Change
0b00100 (0x04)
Definition: crossbar.h:578
bool(* encoder_configure_ptr)(encoder_t *encoder, encoder_cfg_t *settings)
Pointer to function for configuring an encoder.
Definition: encoders.h:105
encoder_data_t *(* encoder_get_data_ptr)(encoder_t *encoder)
Pointer to function for getting encoder data.
Definition: encoders.h:92
bool(* encoder_enumerate_callback_ptr)(encoder_t *encoder, void *data)
Pointer to the callbak function to be called by encoders_enumerate().
Definition: encoders.h:98
uint8_t encoders_get_num(void)
Definition: encoders.c:76
void encoder_register(encoder_t *encoder)
Definition: encoders.c:44
bool encoders_enumerate(encoder_enumerate_callback_ptr callback, void *data)
Definition: encoders.c:64
void(* encoder_reset_ptr)(encoder_t *encoder)
Pointer to function for resetting encoder data.
Definition: encoders.h:79
bool(* encoder_claim_ptr)(encoder_on_event_ptr event_handler, void *context)
Pointer to function for claiming an encoder.
Definition: encoders.h:86
void(* encoder_on_event_ptr)(encoder_t *encoder, encoder_event_t *events, void *context)
Pointer to callback function to receive encoder events.
Definition: encoders.h:74
ISR_CODE void task_delete(foreground_task_ptr fn, void *data)
Definition: grbllib.c:640
ISR_CODE bool ISR_FUNC() task_add_immediate(foreground_task_ptr fn, void *data)
Enqueue a function to be called once by the foreground process.
Definition: grbllib.c:714
DCRAM grbl_hal_t hal
Global HAL struct.
Definition: grbllib.c:91
ISR_CODE bool ISR_FUNC() task_add_systick(foreground_task_ptr fn, void *data)
Definition: grbllib.c:661
FLASHMEM bool ioport_enable_irq(uint8_t port, pin_irq_mode_t irq_mode, ioport_interrupt_callback_ptr handler)
Definition: ioports.c:632
#define IOPORT_UNASSIGNED
Definition: ioports.h:26
#define On
Definition: nuts_bolts.h:36
settings_t settings
Definition: settings.c:47
Definition: encoders.h:56
uint32_t dbl_click_window
ms.
Definition: encoders.h:58
uint32_t vel_timeout
Definition: encoders.h:57
Definition: encoders.h:61
int32_t position
Definition: encoders.h:62
uint32_t velocity
Definition: encoders.h:63
Definition: encoders.h:111
encoder_reset_ptr reset
Definition: encoders.h:114
encoder_configure_ptr configure
Definition: encoders.h:116
encoder_caps_t caps
Definition: encoders.h:112
encoder_claim_ptr claim
Definition: encoders.h:113
encoder_get_data_ptr get_data
Definition: encoders.h:115
uint32_t(* get_elapsed_ticks)(void)
Optional handler for getting number of elapsed 1 ms tics since startup. Rolls over every 49....
Definition: hal.h:663
Definition: crossbar.h:763
pin_function_t function
Pin function.
Definition: crossbar.h:766
Definition: encoders.h:43
uint8_t value
Definition: encoders.h:44
uint8_t spindle_rpm
Definition: encoders.h:50
uint8_t mask
Definition: encoders.h:45
uint8_t select
Definition: encoders.h:48
uint8_t index
Definition: encoders.h:49
uint8_t bidirectional
Definition: encoders.h:47
uint8_t spindle_pos
Definition: encoders.h:51
uint8_t unused
Definition: encoders.h:52
Definition: encoders.h:29
uint8_t direction_changed
Definition: encoders.h:34
uint8_t index_pulse
Definition: encoders.h:38
uint8_t value
Definition: encoders.h:30
uint8_t click
Definition: encoders.h:35
uint8_t long_click
Definition: encoders.h:37
uint8_t position_changed
Definition: encoders.h:33
uint8_t events
Definition: encoders.h:31
uint8_t dbl_click
Definition: encoders.h:36
uint8_t unused
Definition: encoders.h:39