Bladeren bron

更新API更加方便和易用。

lizddong 2 jaren geleden
bovenliggende
commit
1be749c232
4 gewijzigde bestanden met toevoegingen van 140 en 232 verwijderingen
  1. 20 68
      README.md
  2. 83 96
      io_input_filter.c
  3. 4 24
      io_input_filter.h
  4. 33 44
      io_input_filter_example.c

+ 20 - 68
README.md

@@ -7,8 +7,9 @@
 ## 2 使用方法
 
 ### 2.1 配置宏
-	IIF_TIMES   // 滤波次数,连续 IIF_TIMES 次读取引脚电平持续为高/低的次数
-	IIF_PERIOD  // 滤波周期,每隔 IIF_PERIOD 毫秒读取一次引脚电平
+	IIF_TIMES       // 滤波次数,连续 IIF_TIMES 次读取引脚电平持续为高/低的次数
+	IIF_PERIOD      // 滤波周期,每隔 IIF_PERIOD 毫秒读取一次引脚电平
+	IIF_DEBUG_MODE  // IIF调试信息输出
 
 ### 2.2 接口说明
 
@@ -21,80 +22,31 @@ struct io_input_filter
     uint8_t filter_counts;    // 当前引脚电平已经持续稳定的次数
     struct io_input_filter *next;    // 单向链表 next
 };
-typedef struct io_input_filter *io_input_filter_t;
 ```
 #### 2.2.2 函数说明:
-1. `io_input_filter_t iif_create(rt_base_t pin);`
-在堆中申请一段内存注册滤波器,并初始化数据内容
+1. `void iif_init(void);`
+初始化函数,使用之前请先进行初始化
 
-2. `rt_err_t iif_init(io_input_filter_t iif, rt_base_t pin);`
-初始化一个静态滤波器。
-
-3. `uint8_t iif_read(struct io_input_filter *iif);`
-读取引脚状态。
-
-## 3 例程
+2. `int iif_add_pin(rt_base_t pin);`
+将一个引脚加入滤波控制器中,例如:
+```
+#define IO_IN1  GET_PIN(D, 11)
+iif_add_pin(IO_IN1);
 ```
-#include "io_input_filter.h"
-
-io_input_filter_t g_input_1 = RT_NULL;
-io_input_filter_t g_input_2 = RT_NULL;
-io_input_filter_t g_input_3 = RT_NULL;
-
-struct io_input_filter g_input_4;
-struct io_input_filter g_input_5;
-
-void iif_example(void *para)
-{
-    // Created in the heap
-    g_input_1 = iif_create(GET_PIN(B, 0));
-    g_input_2 = iif_create(GET_PIN(B, 1));
-    g_input_3 = iif_create(GET_PIN(B, 2));
-
-    // Created using static variables
-    iif_init(&g_input_4, GET_PIN(D, 10));
-    iif_init(&g_input_5, GET_PIN(D, 11));
-
-    while(1)
-    {
-        if(iif_read(g_input_1) == 1)
-        {
-            rt_kprintf("input_1 status: High\n");
-        }
-
-        if(iif_read(g_input_2) == 1)
-        {
-            rt_kprintf("input_2 status: High\n");
-        }
-
-        if(iif_read(g_input_3) == 1)
-        {
-            rt_kprintf("input_3 status: High\n");
-        }
-
-        if(iif_read(&g_input_4) == 1)
-        {
-            rt_kprintf("input_4 status: High\n");
-        }
-
-        if(iif_read(&g_input_5) == 1)
-        {
-            rt_kprintf("input_5 status: High\n");
-        }
-
-        rt_kprintf("\n");
-        rt_thread_mdelay(100);
-    }
-}
-
-MSH_CMD_EXPORT(iif_example, io input filter example);
 
+3. `int iif_read_pin(rt_base_t pin);`
+读取引脚状态,例如:
+```
+if(iif_read_pin(IO_IN1) == PIN_HIGH)
+	rt_kprintf("IO_IN1 Changed to HIGH\n");
+else
+	rt_kprintf("IO_IN1 Changed to LOW\n");
 ```
 
-## 4 注意事项
-软件包需要使能软件定时器`RT_USING_TIMER_SOFT`和PIN设备驱动`RT_USING_PIN`。
+## 3 注意事项
+软件包需要使能软件定时器`RT_USING_TIMER_SOFT`。
 
-## 5 联系方式
+## 4 联系方式
 https://github.com/lizdDong/io_input_filter
 
 

+ 83 - 96
io_input_filter.c

@@ -11,152 +11,139 @@
 #include "io_input_filter.h"
 
 #define DBG_TAG "iif"
-#define DBG_LVL DBG_INFO
+#define DBG_LVL DBG_LOG
 #include <rtdbg.h>
 
-static struct io_input_filter *s_iif_head = RT_NULL;
-static rt_timer_t s_iif_timer = RT_NULL;
+/* Input Filter Times */
+#ifndef IIF_TIMES
+#define IIF_TIMES     10
+#endif
+
+/* Input Filter Period */
+#ifndef IIF_PERIOD
+#define IIF_PERIOD    5
+#endif
+
+#ifdef IIF_DEBUG_MODE
+#ifndef IIF_DEBUG
+#define IIF_DEBUG(...) rt_kprintf(__VA_ARGS__)
+#endif
+#else
+#define IIF_DEBUG(...)
+#endif
+
+typedef struct io_input_filter
+{
+    uint8_t pin_id;
+    uint8_t pin_status;
+    uint8_t filter_counts;
+    struct io_input_filter *next;
+} iif_t;
 
-static rt_err_t _iif_initialize(io_input_filter_t iif, rt_base_t pin);
-static void _iif_period_task(void *parameter);
+static iif_t iif;
+static rt_timer_t iif_timer;
 
+static void iif_list_append(iif_t *l, iif_t *n);
+static void iif_handle(void *parameter);
 
-#ifdef RT_USING_HEAP
-io_input_filter_t iif_create(rt_base_t pin)
+void iif_init(void)
 {
-    io_input_filter_t iif;
+    iif.next = NULL;
 
-    iif = rt_malloc(sizeof(struct io_input_filter));
-    if (iif == RT_NULL)
-    {
-        LOG_E("iif_create() failed: no free memory was found!");
-        return RT_NULL;
-    }
+    iif_timer = rt_timer_create("iif_handle", iif_handle, RT_NULL, IIF_PERIOD,
+            RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
+    rt_timer_start(iif_timer);
+}
 
-    if(_iif_initialize(iif, pin) != RT_EOK)
+int iif_add_pin(rt_base_t pin)
+{
+    iif_t *iif_new;
+
+    iif_new = rt_malloc(sizeof(iif_t));
+    if (iif_new == RT_NULL)
     {
-        return RT_NULL;
+        rt_kprintf("error: iif_add_pin() failed, no free memory was found!");
+        return -1;
     }
 
-    return iif;
-}
-#endif /* #endif RT_USING_HEAP */
+    rt_pin_mode(pin, PIN_MODE_INPUT);
+    iif_new->pin_id = pin;
+    iif_new->filter_counts = 0;
+    iif_new->pin_status = rt_pin_read(pin);
 
-rt_err_t iif_init(io_input_filter_t iif, rt_base_t pin)
-{
-    return _iif_initialize(iif, pin);
+    iif_list_append(&iif, iif_new);
+    return 0;
 }
 
-static rt_err_t _iif_initialize(io_input_filter_t iif, rt_base_t pin)
+int iif_read_pin(rt_base_t pin)
 {
-    // Initialize iif structure, Must be initialized before appending list,
-    // Otherwise, May cause scheduled tasks to execute uninitialized parameters
-    iif->next = RT_NULL;
-    iif->pin_status = PIN_LOW;
-    iif->filter_counts = 0;
-    iif->pin_id = pin;
-    rt_pin_mode(pin, PIN_MODE_INPUT);
-
-    // Append to iif list
-    if(s_iif_head == RT_NULL)
-    {
-        s_iif_head = iif;
-        LOG_I("list head: 0x%08X", s_iif_head);
-    }
-    else
-    {
-        struct io_input_filter *list = s_iif_head;
-        while(1)
-        {
-            if(list->next == RT_NULL)
-            {
-                list->next = iif;
-                LOG_I("iif list:  0x%08X -> 0x%08X", list, list->next);
-                break;
-            }
-            list = list->next;
-        }
-    }
-
-    // Create A Timer Task
-    if(s_iif_timer == RT_NULL)
+    iif_t *note = iif.next;
+    while(note)
     {
-        s_iif_timer = rt_timer_create("iif task", _iif_period_task,
-                            RT_NULL, IIF_PERIOD, RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
-        if(s_iif_timer != RT_NULL)
+        if(note->pin_id == pin)
         {
-            rt_timer_start(s_iif_timer);
-            LOG_I("iif task start.");
-        }
-        else
-        {
-            LOG_E("iif task timer create failed!");
-            return RT_ERROR;
+            return note->pin_status;
         }
+        note = note->next;
     }
-
-    return RT_EOK;
+    return -1;
 }
 
-uint8_t iif_read(struct io_input_filter *iif)
+static void iif_handle(void *parameter)
 {
-    RT_ASSERT(iif != RT_NULL);
-
-    return iif->pin_status;
-}
-
-static void io_input_filter_poll(void)
-{
-    struct io_input_filter *list = RT_NULL;
-
-    for(list = s_iif_head; list != NULL; list = list->next)
+    iif_t *note = iif.next;
+    while(note)
     {
-        // When IO is low
-        if(rt_pin_read(list->pin_id) == PIN_LOW)
+        if(rt_pin_read(note->pin_id) == PIN_LOW)
         {
-            if(list->pin_status == PIN_HIGH)
+            if(note->pin_status == PIN_HIGH)
             {
-                if(list->filter_counts > 0)
+                if(note->filter_counts > 0)
                 {
-                    list->filter_counts--;
+                    note->filter_counts--;
                 }
                 else
                 {
-                    list->pin_status = PIN_LOW;
-                    LOG_I("iif 0x%08X, pin status changed: %d", list, list->pin_status);
+                    note->pin_status = PIN_LOW;
+                    IIF_DEBUG("pin %d changed to %d\n", note->pin_id, note->pin_status);
                 }
             }
             else
             {
-                list->filter_counts = 0;
+                note->filter_counts = 0;
             }
         }
         else
         {
-            if(list->pin_status == PIN_LOW)
+            if(note->pin_status == PIN_LOW)
             {
-                if(list->filter_counts < IIF_TIMES)
+                if(note->filter_counts < IIF_TIMES)
                 {
-                    list->filter_counts++;
+                    note->filter_counts++;
                 }
                 else
                 {
-                    list->pin_status = PIN_HIGH;
-                    LOG_I("iif 0x%08X, pin status changed: %d", list, list->pin_status);
+                    note->pin_status = PIN_HIGH;
+                    IIF_DEBUG("pin %d changed to %d\n", note->pin_id, note->pin_status);
                 }
             }
             else
             {
-                list->filter_counts = IIF_TIMES;
+                note->filter_counts = IIF_TIMES;
             }
         }
-
-        LOG_D("iif 0x%08X, filter_counts %d, pin_status %d", list, list->filter_counts, list->pin_status);
+        note = note->next;
     }
 }
 
-static void _iif_period_task(void *parameter)
+static void iif_list_append(iif_t *l, iif_t *n)
 {
-    io_input_filter_poll();
-}
+    iif_t *node = l;
 
+    while (node->next)
+    {
+        node = node->next;
+    }
+    node->next = n;
+    n->next = NULL;
+}

+ 4 - 24
io_input_filter.h

@@ -12,31 +12,11 @@
 
 #include <rtthread.h>
 #include <rtdevice.h>
-#include <drv_common.h>
+#include "drv_common.h"
 
-/* Input Filter Times */
-#ifndef IIF_TIMES
-#define IIF_TIMES     10
-#endif
 
-/* Input Filter Period */
-#ifndef IIF_PERIOD
-#define IIF_PERIOD    5
-#endif
-
-
-struct io_input_filter
-{
-    uint8_t pin_id;
-    uint8_t pin_status;
-    uint8_t filter_counts;
-    struct io_input_filter *next;
-};
-typedef struct io_input_filter *io_input_filter_t;
-
-
-io_input_filter_t iif_create(rt_base_t pin);
-rt_err_t iif_init(io_input_filter_t iif, rt_base_t pin);
-uint8_t iif_read(struct io_input_filter *iif);
+void iif_init(void);
+int iif_add_pin(rt_base_t pin);
+int iif_read_pin(rt_base_t pin);
 
 #endif /* PACKAGES_IO_INPUT_FILTER_H_ */

+ 33 - 44
io_input_filter_example.c

@@ -8,59 +8,48 @@
  * 2022-07-05     lizd       the first version
  */
 
+#include <rtthread.h>
 #include "io_input_filter.h"
 
 
-io_input_filter_t g_input_1 = RT_NULL;
-io_input_filter_t g_input_2 = RT_NULL;
-io_input_filter_t g_input_3 = RT_NULL;
+#define IO_IN1  GET_PIN(D, 11)
+#define IO_IN2  GET_PIN(D, 12)
+#define IO_IN3  GET_PIN(D, 13)
+#define IO_IN4  GET_PIN(D, 14)
 
-struct io_input_filter g_input_4;
-struct io_input_filter g_input_5;
-
-void iif_example(void *para)
+int iif_example(void)
 {
-    // Created in the heap
-    g_input_1 = iif_register(GET_PIN(B, 0));
-    g_input_2 = iif_register(GET_PIN(B, 1));
-    g_input_3 = iif_register(GET_PIN(B, 2));
+    iif_init();
 
-    // Created using static variables
-    iif_init(&g_input_4, GET_PIN(D, 10));
-    iif_init(&g_input_5, GET_PIN(D, 11));
+    iif_add_pin(IO_IN1);
+    iif_add_pin(IO_IN2);
+    iif_add_pin(IO_IN3);
+    iif_add_pin(IO_IN4);
 
-    while(1)
+    while (1)
     {
-        if(iif_read(g_input_1) == 1)
-        {
-            rt_kprintf("input_1 status: High\n");
-        }
-
-        if(iif_read(g_input_2) == 1)
-        {
-            rt_kprintf("input_2 status: High\n");
-        }
-
-        if(iif_read(g_input_3) == 1)
-        {
-            rt_kprintf("input_3 status: High\n");
-        }
-
-        if(iif_read(&g_input_4) == 1)
-        {
-            rt_kprintf("input_4 status: High\n");
-        }
-
-        if(iif_read(&g_input_5) == 1)
-        {
-            rt_kprintf("input_5 status: High\n");
-        }
+        if(iif_read_pin(IO_IN1) == PIN_HIGH)
+            rt_kprintf("IO_IN1 Changed to HIGH\n");
+        else
+            rt_kprintf("IO_IN1 Changed to LOW\n");
+
+        if(iif_read_pin(IO_IN2) == PIN_HIGH)
+            rt_kprintf("IO_IN2 Changed to HIGH\n");
+        else
+            rt_kprintf("IO_IN2 Changed to LOW\n");
+
+        if(iif_read_pin(IO_IN3) == PIN_HIGH)
+            rt_kprintf("IO_IN3 Changed to HIGH\n");
+        else
+            rt_kprintf("IO_IN3 Changed to LOW\n");
+
+        if(iif_read_pin(IO_IN4) == PIN_HIGH)
+            rt_kprintf("IO_IN4 Changed to HIGH\n");
+        else
+            rt_kprintf("IO_IN4 Changed to LOW\n");
 
-        rt_kprintf("\n");
         rt_thread_mdelay(100);
     }
-}
-
-MSH_CMD_EXPORT(iif_example, io input filter example);
-
 
+    return RT_EOK;
+}