clock

Dependencies:   mbed

myScope/myclosenr.cpp

Committer:
donghuoyinzi
Date:
2018-05-14
Revision:
2:e54d9d87c6cb
Parent:
1:013b9fdc4e78
Child:
3:b8766d623f01

File content as of revision 2:e54d9d87c6cb:

#include "myclosenr.h"
#include "myclodriv.h"

int cloSAct::gsstpSe=0;  int cloSAct::gmstpSe=0;  int cloSAct::tick2cnt=0;
/*****************************
Fun.: closenr initialization。
Desc.:
Auth. Vesion:2018.1.5
*****************************/
void cloSAct::init(void)
{
    know::TestIn.fall(&get_min);
    know::time2.attach(&isr_systick2,1.0);                  //定时器中断设置  
    know::time1.attach_us(&isr_systick1,15625);
    know::time3.attach_us(&isr_systick3,15625); 
}

/*****************************
Fun.: 
Desc.:
Auth. Vesion:2018.1.5
*****************************/
void cloSAct::start(void)
{

}

/*****************************
Fun.: 
Desc.:
Auth. Vesion:2018.1.5
*****************************/
void cloSAct::data(void)
{
    know::TestO_S=0;
    know::TestO_M=0;
}

/*****************************
Fun.: 
Desc.:
Auth.:ZY
Vesion:2018.1.5
*****************************/
void cloSAct::ready(void)
{

}

/*****************************
Fun.: closenr revoke。
Desc.:
Auth. Vesion:2018.1.5
*****************************/
void cloSAct::revok(void)
{

}

/*****************************
Fun.: 打开光耦。
Desc.:
Auth. Vesion:2017.7.2
*****************************/
void cloSAct::put_open(void)
{  
    tm *tim;
    time_t seconds=time(NULL);
    tim=localtime(&seconds);

    if(tim->tm_hour==11&&tim->tm_min==45){
        know::TestO_S=0;
        know::TestO_M=1;                              //分针检测输出引脚置
        know::polSta[42]="2";                               //putopenS
    }
    else if(tim->tm_sec==50&&(tim->tm_min==15|| tim->tm_min ==25||tim->tm_min ==35)){
        know::TestO_M=0;
        know::TestO_S=1;                             //秒针检测输出引脚置高
        know::polSta[42]="3";   //putopenS
    } 

    if(tim->tm_sec==10) {                           //关闭秒光耦
        know::TestO_S=0;
        know::polSta[42]="0";
    }
    if(tim->tm_min==10){                               //关闭分光耦
        know::TestO_M=0;
        know::polSta[42]="0";
    }
} 

/*****************************
Fun.: 秒针检测及判断校准方式(停,正常)。
Desc.:
Auth. Vesion:2017.7.2
*****************************/
void cloSAct::get_sec(void)
{
    gsstpSe++;
    if(gsstpSe>=128) gsstpSe=0;                     //防止stpSe溢出              

    switch(know::TestIn.read()){
        case 0:
            if(gsstpSe>=6&&gsstpSe<=128){
                know::TestO_S=0;                         //关闭秒光耦
                judg_sec();                             //判断校准方式(停,正常)
            }
        break;
        case 1:
            gsstpSe=0;
        break; 
        default:
        break; 
    }  
}

/***判断秒校准方式(停,正常)*****/
void cloSAct::judg_sec(void)
{
    tm *tim;
    time_t seconds=time(NULL);
    tim=localtime(&seconds);
 
    if(tim->tm_sec!=56) know::polSta[40]="1";                        //getsecS
    else know::polSta[40]="2";                                        //getsecS  return =55正常
}  

/*****************************
Fun.: 分针检测判断校准方式(停,追、正常)。
Desc.:
Auth. Vesion:2017.7.2
*****************************/
void cloSAct::get_min(void)
{
    if(gmstpSe>=0&& gmstpSe<=3){
    wait_ms(20);
        if(know::TestIn.read()==0){
            gmstpSe++;
            if(gmstpSe>10) gmstpSe=0;                //防止Step溢出
            if(gmstpSe==4){
                know::TestO_M=0;                           //关闭分光耦
                judg_min();                           //判断分位置
            }
        }
        else gmstpSe=0;
        return;
    }
}

/***判断分校准方式(停,正常)********/    
void cloSAct::judg_min(void)
{
    tm *tim;
    time_t seconds=time(NULL);
    tim=localtime(&seconds);

    tim->tm_hour=tim->tm_hour%12;
    
    if(tim->tm_hour==11&&tim->tm_min==54)  know::polSta[41]="2";                             //getminS 正常
    else if(tim->tm_hour==11&&tim->tm_min<54&&tim->tm_min>=49)  know::polSta[41]="1";        //getminS; 停
    else know::polSta[41]="3";                                                               //getminS  追
} 

/*****************************
Fun.: 定时器1中断。
Desc.:
Auth. Vesion:2018.1.27
*****************************/ 
void cloSAct::isr_systick1(void)
{
    cloDAct::put_snorm();
    cloDAct::put_mnorm();
}
    
/*****************************
Fun.: 定时器2中断。
Desc.:
Auth. Vesion:2018.1.27
*****************************/ 
void cloSAct::isr_systick2(void)
{
    put_open();                                                                 //判断是否开/关秒、分光耦

    if(know::polSta[42]=="2"&&know::polSta[47]=="0") know::time3.attach_us(&isr_systick3,15625); //putsecS,定时器3打开,运行其中的秒检测

    if(know::polSta[42]=="3") {                                                 //检测分
        get_min();                                                              
        if(know::polSta[41]=="1"||know::polSta[41]=="3") {                           //getminS
            know::time1.attach_us(0,15625);                                          //停或者追都关闭定时器1
            if(know::polSta[41]=="3"&&know::polSta[47]=="0") know::time3.attach_us(&isr_systick3,15625);  //打开定时器3,运行其中的分追
            if(know::polSta[41]=="1"&&know::polSta[29]=="0") {                                           //put mstop S
                cloDAct::put_mstop();
                if(know::polSta[29]=="1") {                                                      //停分针结束
                    know::polSta[29]="0";                                                        //状态复位
                    know::polSta[41]="0";
                    know::polSta[42]="0";
                    know::time1.attach_us(&isr_systick1,15625);
                    know::time3.attach_us(0,15625);                                  //任务互斥,关闭定时器3
                    know::polSta[47]="0";
                }
            }
        }
    }

    //know::polSta[15]="1";                                     //state of step ???

    tick2cnt++;
    if(tick2cnt>=20) {
        tick2cnt=0;
        know::polSta[46]="1";                                     //state of tick2S
    }
    if(tick2cnt>=40) tick2cnt=0;

}

/*****************************
Fun.: 定时器3中断。
Desc.:
Auth. Vesion:2018.1.27
*****************************/ 
void cloSAct::isr_systick3(void)
{
    know::polSta[47]="1";

    if(know::polSta[42]=="1"&& know::polSta[40]=="0") get_sec();              //putsecS,getsecS

    if(know::polSta[40]=="1"&& know::polSta[28]=="0"){                   //getsecS, putsstopS
        know::time1.attach_us(0,15625);
        cloDAct::put_sstop();                           //停止秒针
        if(know::polSta[28]=="1"){                               //校秒结束
            know::polSta[28]="0";                                 //状态复位
            know::polSta[40]="0";
            know::polSta[42]="0";
            know::polSta[47]="0";
            know::time1.attach_us(&isr_systick1,15625);
            know::time3.attach_us(0,15625); 
        }
    } 
       
    if(know::polSta[41]=="3"&&know::polSta[27]=="0"){                    // getminS, putmchasS分针追针
        cloDAct::put_mchas();     
        if(know::polSta[27]=="1"){                              //追分完成
            know::polSta[27]="0";                                //状态复位
            know::polSta[41]="0";
            know::polSta[42]="0";
            know::polSta[47]="0";    
            know::time1.attach_us(&isr_systick1,15625);
            know::time3.attach_us(0,15625);
        }
    }
}