55
66#if PBDRV_CONFIG_COUNTER
77
8- #include <assert.h>
9- #include <stdbool.h>
10- #include <stdio.h>
11-
12- #include <contiki.h>
8+ #include <stdint.h>
139
1410#include <pbdrv/counter.h>
1511#include <pbio/error.h>
16- #include "counter.h"
17- #include "counter_nxt .h"
12+
13+ #include "../src/uartdev .h"
1814#include "counter_ev3dev_stretch_iio.h"
15+ #include "counter_nxt.h"
1916#include "counter_stm32f0_gpio_quad_enc.h"
17+ #include "counter.h"
2018
21- PROCESS (pbdrv_counter_process , "counter driver" );
22-
23- static pbdrv_counter_dev_t * pbdrv_counters [PBDRV_CONFIG_COUNTER_NUM_DEV ];
24-
25- pbio_error_t pbdrv_counter_register (uint8_t id , pbdrv_counter_dev_t * dev ) {
26- if (id >= PBDRV_CONFIG_COUNTER_NUM_DEV ) {
27- return PBIO_ERROR_INVALID_ARG ;
28- }
29-
30- assert (pbdrv_counters [id ] == NULL );
31-
32- pbdrv_counters [id ] = dev ;
33-
34- return PBIO_SUCCESS ;
35- }
36-
37- pbio_error_t pbdrv_counter_unregister (pbdrv_counter_dev_t * dev ) {
38- for (int i = 0 ; i < PBDRV_CONFIG_COUNTER_NUM_DEV ; i ++ ) {
39- if (pbdrv_counters [i ] == dev ) {
40- pbdrv_counters [i ] = NULL ;
41- return PBIO_SUCCESS ;
42- }
43- }
19+ static pbdrv_counter_dev_t pbdrv_counter_devs [PBDRV_CONFIG_COUNTER_NUM_DEV ];
4420
45- return PBIO_ERROR_INVALID_ARG ;
21+ void pbdrv_counter_init () {
22+ pbdrv_counter_ev3dev_stretch_iio_init (pbdrv_counter_devs );
23+ pbdrv_counter_nxt_init (pbdrv_counter_devs );
24+ pbdrv_counter_stm32f0_gpio_quad_enc_init (pbdrv_counter_devs );
25+ pbio_uartdev_counter_init (pbdrv_counter_devs );
4626}
4727
48- pbio_error_t pbdrv_counter_get (uint8_t id , pbdrv_counter_dev_t * * dev ) {
28+ pbio_error_t pbdrv_counter_get_dev (uint8_t id , pbdrv_counter_dev_t * * dev ) {
4929 if (id >= PBDRV_CONFIG_COUNTER_NUM_DEV ) {
50- return PBIO_ERROR_INVALID_ARG ;
30+ return PBIO_ERROR_NO_DEV ;
5131 }
5232
53- if (pbdrv_counters [id ] == NULL || !pbdrv_counters [id ]-> initalized ) {
33+ * dev = & pbdrv_counter_devs [id ];
34+
35+ if ((* dev )-> funcs == NULL ) {
36+ // has not been intialized yet
5437 return PBIO_ERROR_AGAIN ;
5538 }
5639
57- * dev = pbdrv_counters [id ];
58-
5940 return PBIO_SUCCESS ;
6041}
6142
43+ /**
44+ * Gets the absolute count if the counter supports it.
45+ * @param [in] dev Pointer to the counter device
46+ * @param [out] count Returns the count on success
47+ * @return ::PBIO_SUCCESS on success, ::PBIO_ERROR_NO_DEV if the
48+ * counter has not been initialized, ::PBIO_ERROR_NOT_SUPPORTED
49+ * if this counter does not support reading the absolute count.
50+ */
6251pbio_error_t pbdrv_counter_get_count (pbdrv_counter_dev_t * dev , int32_t * count ) {
63- if (!dev -> initalized ) {
64- return PBIO_ERROR_NO_DEV ;
65- }
66-
67- return dev -> get_count (dev , count );
52+ return dev -> funcs -> get_count (dev , count );
6853}
6954
7055/**
@@ -76,57 +61,23 @@ pbio_error_t pbdrv_counter_get_count(pbdrv_counter_dev_t *dev, int32_t *count) {
7661 * if this counter does not support reading the absolute count.
7762 */
7863pbio_error_t pbdrv_counter_get_abs_count (pbdrv_counter_dev_t * dev , int32_t * count ) {
79- if (!dev -> initalized ) {
80- return PBIO_ERROR_NO_DEV ;
81- }
82-
83- if (!dev -> get_abs_count ) {
64+ if (!dev -> funcs -> get_abs_count ) {
8465 return PBIO_ERROR_NOT_SUPPORTED ;
8566 }
8667
87- return dev -> get_abs_count (dev , count );
68+ return dev -> funcs -> get_abs_count (dev , count );
8869}
8970
71+ /**
72+ * Gets the counter rate in counts per second.
73+ * @param [in] dev Pointer to the counter device
74+ * @param [out] rate Returns the rate on success
75+ * @return ::PBIO_SUCCESS on success, ::PBIO_ERROR_NO_DEV if the
76+ * counter has not been initialized, ::PBIO_ERROR_NOT_SUPPORTED
77+ * if this counter does not support reading the rate.
78+ */
9079pbio_error_t pbdrv_counter_get_rate (pbdrv_counter_dev_t * dev , int32_t * rate ) {
91- if (!dev -> initalized ) {
92- return PBIO_ERROR_NO_DEV ;
93- }
94-
95- return dev -> get_rate (dev , rate );
96- }
97-
98- static void pbdrv_counter_process_exit () {
99- #if PBDRV_CONFIG_COUNTER_NXT
100- pbdrv_counter_nxt_drv .exit ();
101- #endif
102- #if PBDRV_CONFIG_COUNTER_EV3DEV_STRETCH_IIO
103- pbdrv_counter_ev3dev_stretch_iio_drv .exit ();
104- #endif
105- #if PBDRV_CONFIG_COUNTER_STM32F0_GPIO_QUAD_ENC
106- pbdrv_counter_stm32f0_gpio_quad_enc_drv .exit ();
107- #endif
108- }
109-
110- PROCESS_THREAD (pbdrv_counter_process , ev , data ) {
111- PROCESS_EXITHANDLER (pbdrv_counter_process_exit ());
112-
113- PROCESS_BEGIN ();
114-
115- #if PBDRV_CONFIG_COUNTER_NXT
116- pbdrv_counter_nxt_drv .init ();
117- #endif
118- #if PBDRV_CONFIG_COUNTER_EV3DEV_STRETCH_IIO
119- pbdrv_counter_ev3dev_stretch_iio_drv .init ();
120- #endif
121- #if PBDRV_CONFIG_COUNTER_STM32F0_GPIO_QUAD_ENC
122- pbdrv_counter_stm32f0_gpio_quad_enc_drv .init ();
123- #endif
124-
125- while (true) {
126- PROCESS_WAIT_EVENT ();
127- }
128-
129- PROCESS_END ();
80+ return dev -> funcs -> get_rate (dev , rate );
13081}
13182
13283#endif // PBDRV_CONFIG_COUNTER
0 commit comments