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); | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 |