clock

Dependencies:   mbed

myScope/myclosenr.cpp

Committer:
donghuoyinzi
Date:
2018-05-22
Revision:
3:b8766d623f01
Parent:
2:e54d9d87c6cb

File content as of revision 3:b8766d623f01:

#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';
                }
            }
        }
    }

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