187 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | ||
| #include "board.h"
 | ||
| #include "rtthread.h"
 | ||
| #include "debug.h"
 | ||
| #include "string.h"
 | ||
| #include "dev_flash.h"
 | ||
| #include "prot_uc.h"
 | ||
| #include "input.h"
 | ||
| #include "mystdlib.h"
 | ||
| #include "transmit.h"
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /*
 | ||
| 
 | ||
| 读取所有输入通道
 | ||
| 
 | ||
| */
 | ||
| 
 | ||
| 
 | ||
| // 定义输入通道数
 | ||
| #define INPUT_CHANNEL_NUM   10
 | ||
| 
 | ||
| 
 | ||
| typedef struct{
 | ||
|   gpioin_def *dev;
 | ||
|   int input;
 | ||
|   int input_lock;
 | ||
|   int turn_true_call_always;// 为0时单次回调,为1时永久回调
 | ||
|   int turn_false_call_always;// 同上
 | ||
|   void (*turn_true_to_call)(void *turn_true_obj);
 | ||
|   void (*turn_false_to_call)(void *turn_false_obj);
 | ||
|   void *turn_true_obj;
 | ||
|   void *turn_false_obj;
 | ||
| }input_def;
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| // 判断此通道状态是否发生了翻转
 | ||
| // 0翻转为false,1翻转为true,-1未翻转
 | ||
| static int input_check_state(input_def *s)
 | ||
| {
 | ||
|   s->input=(s->dev->state(s->dev));
 | ||
|   if(s->input!=s->input_lock){
 | ||
|     DBG_LOG("%s=%d",s->dev->name, s->input);
 | ||
|     s->input_lock=s->input;
 | ||
|     
 | ||
|     if((s->input)==0){
 | ||
|       return 0;
 | ||
|     }else{
 | ||
|       return 1;
 | ||
|     }
 | ||
|   }else{
 | ||
|     return -1;
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| // 根据输入通道的状态调用回调函数
 | ||
| static void input_run(input_def *s)
 | ||
| {
 | ||
|   int state=input_check_state(s);
 | ||
|   if(state==1)
 | ||
|   {
 | ||
|     if(s->turn_true_to_call)
 | ||
|       s->turn_true_to_call(s->turn_true_obj);
 | ||
|     irq_disable();
 | ||
|     if(s->turn_true_call_always==0)
 | ||
|     {
 | ||
|       s->turn_true_to_call=0;
 | ||
|       s->turn_true_obj=0;
 | ||
|     }
 | ||
|     irq_enable();
 | ||
|   }else if(state==0)
 | ||
|   {
 | ||
|     if(s->turn_false_to_call)
 | ||
|       s->turn_false_to_call(s->turn_false_obj);
 | ||
|     irq_disable();
 | ||
|     if(s->turn_false_call_always==0)
 | ||
|     {
 | ||
|       s->turn_false_to_call=0;
 | ||
|       s->turn_false_obj=0;
 | ||
|     }
 | ||
|     irq_enable();
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| typedef struct{
 | ||
|   int inited;
 | ||
|   int run;
 | ||
|   void *tran;
 | ||
|   input_def input[INPUT_CHANNEL_NUM];
 | ||
| }self_def;
 | ||
| 
 | ||
| 
 | ||
| static self_def g_self;
 | ||
| 
 | ||
| 
 | ||
| static void input_thread(void *arg)
 | ||
| {
 | ||
|   self_def *s=arg;
 | ||
|   char gpioin_name[]="gpioin0";
 | ||
|   for(int i=0;i<INPUT_CHANNEL_NUM;i++)
 | ||
|   {
 | ||
|     gpioin_name[6]='0'+i;
 | ||
|     s->input[i].dev=dev_get(gpioin_name);
 | ||
|     s->input[i].dev->init(s->input[i].dev);
 | ||
|   }
 | ||
|   
 | ||
|   while (s->run)
 | ||
|   {
 | ||
|     rt_thread_mdelay(20);
 | ||
|     for(int i=0;i<INPUT_CHANNEL_NUM;i++)
 | ||
|     {
 | ||
|       input_run(&s->input[i]);
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| static int init_thread(void)
 | ||
| {
 | ||
|   self_def *s=&g_self;
 | ||
|   s->inited=1;
 | ||
|   s->run=1;
 | ||
|   rt_thread_t rt_t=rt_thread_create("input_t",input_thread,s,1024,15,20);
 | ||
|   rt_thread_startup(rt_t);
 | ||
|   return 0;
 | ||
| }
 | ||
| app_init_export(init_thread)
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| static int input_set_callback(int always,int channel,int state_to_call,void (*fun)(void *t),void *t)
 | ||
| {
 | ||
|   self_def *s=&g_self;
 | ||
|   input_def *in=0;
 | ||
|   if(channel<0||channel>=INPUT_CHANNEL_NUM)
 | ||
|     return -1;
 | ||
|   irq_disable();
 | ||
|   in=&s->input[channel];
 | ||
|   if(state_to_call){
 | ||
|     in->turn_true_to_call=fun;
 | ||
|     in->turn_true_obj=t;
 | ||
|     in->turn_true_call_always=always;
 | ||
|   }else{
 | ||
|     in->turn_false_to_call=fun;
 | ||
|     in->turn_false_obj=t;
 | ||
|     in->turn_false_call_always=always;
 | ||
|   }
 | ||
|   irq_enable();
 | ||
|   return 0;
 | ||
| }
 | ||
| 
 | ||
| // 设置永久回调函数
 | ||
| // channel:通道(0~9);state_to_call:回调调用时的输入状态;fun:回调函数
 | ||
| // 返回0成功
 | ||
| int input_set_callback_always(int channel,int state_to_call,void (*fun)(void *t),void *t)
 | ||
| {
 | ||
|   return input_set_callback(1,channel,state_to_call,fun,t);
 | ||
| }
 | ||
| 
 | ||
| // 设置单次回调函数
 | ||
| int input_set_callback_once(int channel,int state_to_call,void (*fun)(void *t),void *t)
 | ||
| {
 | ||
|   return input_set_callback(0,channel,state_to_call,fun,t);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | 
