/************************************************ ******************************
文 件 名：API.c
功能描述：API控制函数库文件
作    者：张暄
版    本：V1.0
日    期：2016.11.3
******************************************************************************/

#include "API.h"
#include "Stepper_Motor.h"
#include "Common.h"
#include "Buzzer.h"
 
extern void DoCAN_Timer_Update(uint16_t Interval);
extern void CoCAN_Init_Mode_Tx_ISR(void);
extern void Drive_Info_Speed_Plus_Conversion_ISR(void);
//extern void Drive_Info_Fuel_Plus_Conversion_ISR (void);

APImsTimerStruct  APImsTimer;
volatile uint16_t APIRollingCounter;
uint8_t  Time10ms;
uint8_t  Time2ms;
uint8_t  APIBGNMEnable;
uint8_t  PriorityLock;  //增加优先级锁是为了保证先执行网络管理部分 再执行应用报文外发部分

/******************************************************************************
函数名：API_Start
功  能：启动API
        API每隔API_INT_CYCLE周期会发生一次中断,系统以该中断为时基调度任务
        API_INT_CYCLE需要预先在API.h中定义
参  数：无
返回值：无
******************************************************************************/
void API_Start(void)
{
  VREGAPICL_APICLK  = 1;            //Bus Clock 做为API的时钟源

 #pragma MESSAGE DISABLE C2705
  VREGAPIR = (uint16_t)((BUSCLK / 1000000 ) * API_INT_CYCLE / 2); //设置API中断周期

  VREGAPICL_APIE    = 1;           //开API中断
  VREGAPICL_APIFE   = 1;			     //使能API,并开始计时

  APImsTimer.Cnt    = 0;
  APImsTimer.Flag   = 0;
  APIRollingCounter = 0;
}

/******************************************************************************
函数名：API_Stop
功  能：关闭API
参  数：无
返回值：无
******************************************************************************/
void API_Stop ( void )
{
  VREGAPICL_APIE = 0;           //禁用API
  VREGAPICL_APIFE = 0;			    //禁止API中断功能
}

/******************************************************************************
函数名：API_1ms_Timer_Update
功  能：获取毫秒定时更新标志
        用于指示一次1ms计时完成
参  数：无
返回值：1 - 1ms计时完成
        0 - 1ms计时未完成
******************************************************************************/
uint8_t API_1ms_Timer_Update ( void )
{
  if( APImsTimer.Flag )
  {
    APImsTimer.Flag = 0;
    return 1;
  }
  else
   return 0;
}

/******************************************************************************
中断函数
******************************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED   	//置中断函数放在FLASH的非分页区

void interrupt NONUSE1_ISR(void)
{
}

void interrupt NONUSE2_ISR(void)
{
}

void interrupt NONUSE3_ISR(void)
{
}

void interrupt NONUSE5_ISR(void)
{
}
/******************************************************************************
函数名：interrupt API_ISR
功  能：API中断服务函数
参  数：无
返回值：无
******************************************************************************/
uint8_t iTIME1MS;
uint8_t T1MS_SYB_FF;

static uint8_t tempCnt = 0;

//extern uint16_t StartCanOutTime0;
//extern uint16_t StartCanOutTime1;

void interrupt API_ISR ( void )
{
  VREGAPICL_APIF = 1;		            //通过写1清0中断标志
  Buzzer_Play_ISR();                //蜂鸣器
  APImsTimer.Cnt++;
  tempCnt++;
  
  if (tempCnt >= 20) 
  {
    tempCnt = 0;
    //StartCanOutTime0++;
    //StartCanOutTime1++;
    
    if ( APIBGNMEnable )
      CoCAN_Signal_Update_Service();
    
    MSCAN0_L_Data_Service();  
  }
  
  if ( APImsTimer.Cnt >= API_MS_CNT_TOP )
  {
    APImsTimer.Cnt  = 0;
    APImsTimer.Flag = 1;
  }
  
  if ( APIBGNMEnable )
  {
    //Time10ms++;
    //if ( Time10ms >= 200 )
    {
      //Time10ms = 0;
      
      PriorityLock = 1;
    }
  }
  else
  {
    PriorityLock = 0;
    Time10ms = 0;
  }
  APIRollingCounter++;

  DoCAN_Timer_Update(API_INT_CYCLE);
  
  if (PriorityLock == 1)
    CoCAN_Init_Mode_Tx_ISR();
  
  Stepper_Motor_Rotating_ISR();
  
  /*********************表针调试***************/
  //0.128MS列程
  if (SCI0SR1_RDRF)     	     	//串口接受缓存区中有数据
  {
    RX_BUF[RSB_P] = SCI0DRL;	//读SCI1DRL将自动清SCI1SR1_RDRF
    if (RSB_P != cnRSBufLen - 1)
      RSB_P++;
  }
  /***************1MS************************/
  //0.128MS列程
  iTIME1MS++;

  if ( iTIME1MS == 8 )		// 1.024MS
  {
    iTIME1MS = 0;
    T1MS_SYB_FF = 1;
  }
}
#pragma CODE_SEG DEFAULT