clock

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers myclosenr.cpp Source File

myclosenr.cpp

00001 #include "myclosenr.h"
00002 #include "myclodriv.h"
00003 
00004 int cloSAct::gsstpSe=0;  int cloSAct::gmstpSe=0;  int cloSAct::tick2cnt=0;
00005 /*****************************
00006 Fun.: closenr initialization。
00007 Desc.:
00008 Auth. Vesion:2018.1.5
00009 *****************************/
00010 void cloSAct::init(void)
00011 {
00012     know::TestIn.fall(&get_min);
00013     know::time2.attach(&isr_systick2,1.0);                  //定时器中断设置  
00014     know::time1.attach_us(&isr_systick1,15625);
00015     know::time3.attach_us(&isr_systick3,15625); 
00016 }
00017 
00018 /*****************************
00019 Fun.: 
00020 Desc.:
00021 Auth. Vesion:2018.1.5
00022 *****************************/
00023 void cloSAct::start(void)
00024 {
00025 
00026 }
00027 
00028 /*****************************
00029 Fun.: 
00030 Desc.:
00031 Auth. Vesion:2018.1.5
00032 *****************************/
00033 void cloSAct::data(void)
00034 {
00035     know::TestO_S=0;
00036     know::TestO_M=0;
00037 }
00038 
00039 /*****************************
00040 Fun.: 
00041 Desc.:
00042 Auth.:ZY
00043 Vesion:2018.1.5
00044 *****************************/
00045 void cloSAct::ready(void)
00046 {
00047 
00048 }
00049 
00050 /*****************************
00051 Fun.: closenr revoke。
00052 Desc.:
00053 Auth. Vesion:2018.1.5
00054 *****************************/
00055 void cloSAct::revok(void)
00056 {
00057 
00058 }
00059 
00060 /*****************************
00061 Fun.: 打开光耦。
00062 Desc.:
00063 Auth. Vesion:2017.7.2
00064 *****************************/
00065 void cloSAct::put_open(void)
00066 {  
00067     tm *tim;
00068     time_t seconds=time(NULL);
00069     tim=localtime(&seconds);
00070 
00071     if(tim->tm_hour==11&&tim->tm_min==45){
00072         know::TestO_S=0;
00073         know::TestO_M=1;                              //分针检测输出引脚置
00074         know::polSta[42]='2';                               //putopenS
00075     }
00076     else if(tim->tm_sec==50&&(tim->tm_min==15|| tim->tm_min ==25||tim->tm_min ==35)){
00077         know::TestO_M=0;
00078         know::TestO_S=1;                             //秒针检测输出引脚置高
00079         know::polSta[42]='3';   //putopenS
00080     } 
00081 
00082     if(tim->tm_sec==10) {                           //关闭秒光耦
00083         know::TestO_S=0;
00084         know::polSta[42]='0';
00085     }
00086     if(tim->tm_min==10){                               //关闭分光耦
00087         know::TestO_M=0;
00088         know::polSta[42]='0';
00089     }
00090 } 
00091 
00092 /*****************************
00093 Fun.: 秒针检测及判断校准方式(停,正常)。
00094 Desc.:
00095 Auth. Vesion:2017.7.2
00096 *****************************/
00097 void cloSAct::get_sec(void)
00098 {
00099     gsstpSe++;
00100     if(gsstpSe>=128) gsstpSe=0;                     //防止stpSe溢出              
00101 
00102     switch(know::TestIn.read()){
00103         case 0:
00104             if(gsstpSe>=6&&gsstpSe<=128){
00105                 know::TestO_S=0;                         //关闭秒光耦
00106                 judg_sec();                             //判断校准方式(停,正常)
00107             }
00108         break;
00109         case 1:
00110             gsstpSe=0;
00111         break; 
00112         default:
00113         break; 
00114     }  
00115 }
00116 
00117 /***判断秒校准方式(停,正常)*****/
00118 void cloSAct::judg_sec(void)
00119 {
00120     tm *tim;
00121     time_t seconds=time(NULL);
00122     tim=localtime(&seconds);
00123  
00124     if(tim->tm_sec!=56) know::polSta[40]='1';                        //getsecS
00125     else know::polSta[40]='2';                                        //getsecS  return =55正常
00126 }  
00127 
00128 /*****************************
00129 Fun.: 分针检测判断校准方式(停,追、正常)。
00130 Desc.:
00131 Auth. Vesion:2017.7.2
00132 *****************************/
00133 void cloSAct::get_min(void)
00134 {
00135     if(gmstpSe>=0&& gmstpSe<=3){
00136     wait_ms(20);
00137         if(know::TestIn.read()==0){
00138             gmstpSe++;
00139             if(gmstpSe>10) gmstpSe=0;                //防止Step溢出
00140             if(gmstpSe==4){
00141                 know::TestO_M=0;                           //关闭分光耦
00142                 judg_min();                           //判断分位置
00143             }
00144         }
00145         else gmstpSe=0;
00146         return;
00147     }
00148 }
00149 
00150 /***判断分校准方式(停,正常)********/    
00151 void cloSAct::judg_min(void)
00152 {
00153     tm *tim;
00154     time_t seconds=time(NULL);
00155     tim=localtime(&seconds);
00156 
00157     tim->tm_hour=tim->tm_hour%12;
00158     
00159     if(tim->tm_hour==11&&tim->tm_min==54)  know::polSta[41]='2';                             //getminS 正常
00160     else if(tim->tm_hour==11&&tim->tm_min<54&&tim->tm_min>=49)  know::polSta[41]='1';        //getminS; 停
00161     else know::polSta[41]='3';                                                               //getminS  追
00162 } 
00163 
00164 /*****************************
00165 Fun.: 定时器1中断。
00166 Desc.:
00167 Auth. Vesion:2018.1.27
00168 *****************************/ 
00169 void cloSAct::isr_systick1(void)
00170 {
00171     cloDAct::put_snorm();
00172     cloDAct::put_mnorm();
00173 }
00174     
00175 /*****************************
00176 Fun.: 定时器2中断。
00177 Desc.:
00178 Auth. Vesion:2018.1.27
00179 *****************************/ 
00180 void cloSAct::isr_systick2(void)
00181 {
00182     put_open();                                                                 //判断是否开/关秒、分光耦
00183 
00184     if(know::polSta[42]=='2'&&know::polSta[47]=='0') know::time3.attach_us(&isr_systick3,15625); //putsecS,定时器3打开,运行其中的秒检测
00185 
00186     if(know::polSta[42]=='3') {                                                 //检测分
00187         get_min();                                                              
00188         if(know::polSta[41]=='1'||know::polSta[41]=='3') {                           //getminS
00189             know::time1.attach_us(0,15625);                                          //停或者追都关闭定时器1
00190             if(know::polSta[41]=='3'&&know::polSta[47]=='0') know::time3.attach_us(&isr_systick3,15625);  //打开定时器3,运行其中的分追
00191             if(know::polSta[41]=='1'&&know::polSta[29]=='0') {                                           //put mstop S
00192                 cloDAct::put_mstop();
00193                 if(know::polSta[29]=='1') {                                                      //停分针结束
00194                     know::polSta[29]='0';                                                        //状态复位
00195                     know::polSta[41]='0';
00196                     know::polSta[42]='0';
00197                     know::time1.attach_us(&isr_systick1,15625);
00198                     know::time3.attach_us(0,15625);                                  //任务互斥,关闭定时器3
00199                     know::polSta[47]='0';
00200                 }
00201             }
00202         }
00203     }
00204 
00205     tick2cnt++;
00206     if(tick2cnt>=20) {
00207         tick2cnt=0;
00208         know::polSta[46]='1';                                     //state of tick2S
00209     }
00210     if(tick2cnt>=40) tick2cnt=0;
00211 
00212 }
00213 
00214 /*****************************
00215 Fun.: 定时器3中断。
00216 Desc.:
00217 Auth. Vesion:2018.1.27
00218 *****************************/ 
00219 void cloSAct::isr_systick3(void)
00220 {
00221     know::polSta[47]='1';
00222 
00223     if(know::polSta[42]=='1'&& know::polSta[40]=='0') get_sec();              //putsecS,getsecS
00224 
00225     if(know::polSta[40]=='1'&& know::polSta[28]=='0'){                   //getsecS, putsstopS
00226         know::time1.attach_us(0,15625);
00227         cloDAct::put_sstop();                           //停止秒针
00228         if(know::polSta[28]=='1'){                               //校秒结束
00229             know::polSta[28]='0';                                 //状态复位
00230             know::polSta[40]='0';
00231             know::polSta[42]='0';
00232             know::polSta[47]='0';
00233             know::time1.attach_us(&isr_systick1,15625);
00234             know::time3.attach_us(0,15625); 
00235         }
00236     } 
00237        
00238     if(know::polSta[41]=='3'&&know::polSta[27]=='0'){                    // getminS, putmchasS分针追针
00239         cloDAct::put_mchas();     
00240         if(know::polSta[27]=='1'){                              //追分完成
00241             know::polSta[27]='0';                                //状态复位
00242             know::polSta[41]='0';
00243             know::polSta[42]='0';
00244             know::polSta[47]='0';    
00245             know::time1.attach_us(&isr_systick1,15625);
00246             know::time3.attach_us(0,15625);
00247         }
00248     }
00249 }
00250 
00251