From f75abd1037a5c2eb119533eb2f4c7c16d874abf2 Mon Sep 17 00:00:00 2001 From: Stephane D'Alu <sdalu@sdalu.com> Date: Thu, 7 Jul 2016 21:25:51 +0200 Subject: added qeiAdjustI. added new field and checking in STM32 --- os/hal/ports/NRF51/NRF51822/hal_qei_lld.c | 38 +---------------- os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.c | 2 + os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.h | 67 ++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 37 deletions(-) (limited to 'os/hal/ports') diff --git a/os/hal/ports/NRF51/NRF51822/hal_qei_lld.c b/os/hal/ports/NRF51/NRF51822/hal_qei_lld.c index fbaf3aa..0979551 100644 --- a/os/hal/ports/NRF51/NRF51822/hal_qei_lld.c +++ b/os/hal/ports/NRF51/NRF51822/hal_qei_lld.c @@ -85,7 +85,7 @@ static void serve_interrupt(QEIDriver *qeip) { acc = -acc; // acc is [-1024..+1023], its okay on int16_t /* Adjust counter */ - qei_lld_adjust_count(qeip, acc); + qeiAdjustI(qeip, acc); } } @@ -266,42 +266,6 @@ void qei_lld_disable(QEIDriver *qeip) { qeip->qdec->TASKS_STOP = 1; } -/** - * @brief Adjust counter - * - * @param[in] qeip pointer to the @p QEIDriver object - * @param[in] delta value to use for adjustement - * @return remaining adjustement that were not applied - * - * @notapi - */ -qeidelta_t qei_lld_adjust_count(QEIDriver *qeip, qeidelta_t delta) { - /* Get boundaries */ - qeicnt_t min = QEI_COUNT_MIN; - qeicnt_t max = QEI_COUNT_MAX; - if (qeip->config->min != qeip->config->max) { - min = qeip->config->min; - max = qeip->config->max; - } - - /* Snapshot counter for later comparison */ - qeicnt_t count = qeip->count; - - /* Adjust counter value */ - bool overflowed = qei_adjust_count(&qeip->count, &delta, - min, max, qeip->config->overflow); - - /* Notify for value change */ - if ((qeip->count != count) && qeip->config->notify_cb) - qeip->config->notify_cb(qeip); - - /* Notify for overflow (passing the remaining delta) */ - if (overflowed && qeip->config->overflow_cb) - qeip->config->overflow_cb(qeip, delta); - - /* Remaining delta */ - return delta; -} #endif /* HAL_USE_QEI */ diff --git a/os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.c b/os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.c index ea051f7..ffc4992 100644 --- a/os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.c +++ b/os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.c @@ -150,6 +150,8 @@ void qei_lld_init(void) { * @notapi */ void qei_lld_start(QEIDriver *qeip) { + osalDbgAssert((qeip->config->min == 0) || (qeip->config->max == 0), + "only min/max set to 0 is supported"); if (qeip->state == QEI_STOP) { /* Clock activation and timer reset.*/ diff --git a/os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.h b/os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.h index d0cb683..c708b5e 100644 --- a/os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.h +++ b/os/hal/ports/STM32/LLD/TIMv1/hal_qei_lld.h @@ -33,6 +33,16 @@ /* Driver constants. */ /*===========================================================================*/ +/** + * @brief Mininum usable value for defining counter underflow + */ +#define QEI_COUNT_MIN (0) + +/** + * @brief Maximum usable value for defining counter overflow + */ +#define QEI_COUNT_MAX (65535) + /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ @@ -202,6 +212,14 @@ #error "Invalid IRQ priority assigned to TIM8" #endif +#if QEI_USE_OVERFLOW_DISCARD +#error "QEI_USE_OVERFLOW_DISCARD not supported by this driver" +#endif + +#if QEI_USE_OVERFLOW_MINMAX +#error "QEI_USE_OVERFLOW_MINMAX not supported by this driver" +#endif + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ @@ -257,6 +275,45 @@ typedef struct { * @brief Direction inversion. */ qeidirinv_t dirinv; + /** + * @brief Handling of counter overflow/underflow + * + * @details When overflow occurs, the counter value is updated + * according to: + * - QEI_OVERFLOW_DISCARD: + * discard the update value, counter doesn't change + */ + qeioverflow_t overflow; + /** + * @brief Min count value. + * + * @note If min == max, then QEI_COUNT_MIN is used. + * + * @note Only min set to 0 / QEI_COUNT_MIN is supported. + */ + qeicnt_t min; + /** + * @brief Max count value. + * + * @note If min == max, then QEI_COUNT_MAX is used. + * + * @note Only max set to 0 / QEI_COUNT_MAX is supported. + */ + qeicnt_t max; + /** + * @brief Notify of value change + * + * @note Called from ISR context. + */ + qeicallback_t notify_cb; + /** + * @brief Notify of overflow + * + * @note Overflow notification is performed after + * value changed notification. + * @note Called from ISR context. + */ + void (*overflow_cb)(QEIDriver *qeip, qeidelta_t delta); /* End of the mandatory fields.*/ } QEIConfig; @@ -300,6 +357,16 @@ struct QEIDriver { */ #define qei_lld_get_count(qeip) ((qeip)->tim->CNT) +/** + * @brief Set the counter value. + * + * @param[in] qeip pointer to the @p QEIDriver object + * @param[in] qeip counter value + * + * @notapi + */ +#define qei_lld_set_count(qeip, value) + /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ -- cgit v1.2.3