#include "moter.h" #include "dev_flash.h" #include "debug.h" #include "commend.h" #include "mymisc.h" #include "board.h" // 运行状态 typedef enum{ STOP=0, INITING=1, DOWNING=2, UPING=3, }moter_stat; typedef struct{ int inited; pwm_def *pwm; rt_event_t event; int run; int want_count; int count; int max_count; moter_stat stat; }self_def; self_def g_self; #define MOTER_MAX_COUNT 22000 #define MOTER_END_EVENT 0x1 static void end_irq(void *t) { self_def *s=t; if(s->inited) rt_event_send(s->event,MOTER_END_EVENT); } static void moter_run(void *t) { self_def *s=t; uint32_t ev; while(s->run) { rt_event_recv(s->event,0xffffffff,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&ev); if(ev&MOTER_END_EVENT) { if(s->stat==INITING) { s->count=0; }else if(s->stat==DOWNING) { s->count+=s->want_count; }else if(s->stat==UPING) { // 向上时 s->want_count 为负数,所以依然是加 s->count+=s->want_count; if(s->count<0) s->count=0; } s->stat=STOP; DBG_LOG("moter stoped."); emit moter_end_signal(s); } ev=0; } } void moter_start(int fre,int step_count) { self_def *s=&g_self; if(s->inited==0) { DBG_WARN("moter object is not inited."); return; } moter_start_slot(s,fre,step_count); } void moter_start_slot(void *t,int fre,int step_count) { self_def *s=t; if(s->stat!=STOP) { DBG_WARN("moter is running!"); return ; } if(s->count+step_count>s->max_count) { DBG_WARN("steps count exceeded limit!,max=%d",s->max_count); return ; } else{ DBG_LOG("s->count=%d,step_count=%d,s->max_count=%d",s->count,step_count,s->max_count); } if(step_count>0){ s->stat=DOWNING; }else if(step_count<0){ s->stat=UPING; }else{ DBG_WARN("step_count can not == 0"); return ; } s->want_count=step_count; pwm_def *pwm=s->pwm; pwm->set_fre(pwm,fre); pwm->start(pwm,step_count); } void moter_init(void *t) { self_def *s=t; DBG_LOG("moter init to zero."); pwm_def *pwm=s->pwm; pwm->set_fre(pwm,2000); pwm->start(pwm,-22000); } int init_moter(void) { self_def *s=&g_self; const sys_param_def *par=sys_param(); if(strcmp(par->device_type,"checker")==0){ pwm_def *pwm=dev_get("pwm1"); if(pwm==0){ cmd_print("can not find device \"pwm1\""); return -1; } pwm->init(pwm); pwm->set_irq_fun(pwm,end_irq,s); s->pwm=pwm; s->stat=INITING; s->count=MOTER_MAX_COUNT; s->max_count=MOTER_MAX_COUNT; s->event=rt_event_create("moter_e",RT_IPC_FLAG_FIFO); s->inited=1; s->run=1; rt_thread_t rt_t=rt_thread_create("moter_t",moter_run,s,2048,3,20); rt_thread_startup(rt_t); later_execute(moter_init,s,500); app_variable("moter",s,0); } return 0; } app_init_export(init_moter)