//===========================================================================
//文件名称：task_run_rtc.c
//功能概要：定义task_run_rtc任务
//版权所有：苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//版本更新：2013-05-30  V2.0
//===========================================================================
#include "app_inc.h"

static void my_interrupt (pointer rtc_registers_ptr);
static void print_mqx_time(DATE_STRUCT_PTR time_rtc, TIME_STRUCT_PTR time_mqx);
static void print_rtc_time(DATE_STRUCT_PTR time_rtc, TIME_STRUCT_PTR time_mqx);
static void install_interrupt(void);
static void install_alarm(void);
static void print_current_time(void);

volatile uint_32               state = 0;

void task_run_rtc(uint_32 initial_data)
{

    //定义结构体,一个存放年月日,一个转换成s存放
    DATE_STRUCT     time_rtc;
    TIME_STRUCT     time_mqx;

    if (MQX_OK == _bsp_rtc_io_init())   {
        _rtc_init (RTC_INIT_FLAG_ENABLE);
        _rtc_sync_with_mqx (TRUE);
    }
    printf ("\n Start RTC \n\n");

    //初始化年月日
    time_rtc.YEAR     = 2013;
    time_rtc.MONTH    = 05;
    time_rtc.DAY      = 23;
    time_rtc.HOUR     = 10;
    time_rtc.MINUTE   = 8;
    time_rtc.SECOND   = 0;
    time_rtc.MILLISEC = 0;
    //将时间转化为以s为单位
    _time_from_date (&time_rtc, &time_mqx);
    //设置操作系统时间
      _time_set( &time_mqx);
      //同步,用MQX同步RTC
      if( _rtc_sync_with_mqx(FALSE) != MQX_OK )
      {
          printf("\n syntick error !\n");
          _task_block();
      }
      //注册中断服务历程
      install_interrupt();

      //使能闹钟功能,时间为 10s后
      install_alarm();

  	while(TRUE)
  	{
  		//打印当前时间
  		 print_current_time();
  		_time_delay(5000);
  	}
	printf("hello rtc!");
}

//===========================================================================
//函数名称：打印mqx和rtc时间
//功能概要：打印mqx和rtc时间
//参数：time_rtc:以年月日计数的结构体
//      time_mqx:以总秒数计数的结构体
//版本更新：2013-5-23  V2.0
//===========================================================================

static void print_mqx_time(DATE_STRUCT_PTR     time_rtc,
		                   TIME_STRUCT_PTR     time_mqx)
{
   printf ("MQX: %d s, %d ms (%02d.%02d.%4d %02d:%02d:%02d )\n",
		   time_mqx->SECONDS, time_mqx->MILLISECONDS,
		   time_rtc->DAY, time_rtc->MONTH, time_rtc->YEAR,
		   time_rtc->HOUR, time_rtc->MINUTE, time_rtc->SECOND);
}
//===========================================================================
//函数名称：打印rtc时间
//功能概要：打印mqx和rtc时间
//参数：time_rtc:以年月日计数的结构体
//      time_mqx:以总秒数计数的结构体
//版本更新：2013-5-23  V2.0
//===========================================================================
static void print_rtc_time(DATE_STRUCT_PTR     time_rtc,
                           TIME_STRUCT_PTR     time_mqx)
{
    printf ("RTC: %02d.%02d.%4d %02d:%02d:%02d (%02d s, %03d ms)\n",
    		time_rtc->DAY, time_rtc->MONTH, time_rtc->YEAR,
    		time_rtc->HOUR, time_rtc->MINUTE, time_rtc->SECOND,
    		time_mqx->SECONDS, time_mqx->MILLISECONDS);
}

//===========================================================================
//函数名称：注册RTC中断
//功能概要：注册RTC中断
//参数：无
//版本更新：2013-5-23  V2.0
//===========================================================================
static void install_interrupt(void)
{

    printf ("\ninstall interrupt ");
    if (MQX_OK != _rtc_int_install (my_interrupt))
    {
        printf ("install error!\n");
        _task_block();
    }
    //清空中断请求
    _rtc_clear_requests (RTC_RTCISR_SW | RTC_RTCISR_ALM);
    //使能SW和ALARM中断
    if (0 == _rtc_int_enable (TRUE, RTC_RTCIENR_SW | RTC_RTCIENR_ALM))
    {
        printf ("Error!\n");
        _task_block();
    }
    printf ("install success\n");
}

//===========================================================================
//函数名称：设置RTC闹钟
//功能概要：设置RTC闹钟
//参数：无
//版本更新：2013-5-23  V2.0
//===========================================================================
static void install_alarm(void)
{
    DATE_STRUCT     time_rtc;
    TIME_STRUCT     time_mqx;

    _rtc_get_time_mqxd (&time_rtc);
    _time_from_date (&time_rtc, &time_mqx);
    time_mqx.SECONDS += 10;
    _time_to_date (&time_mqx, &time_rtc);
    _rtc_set_alarm_mqxd (&time_rtc);
    printf ("\nSetting alarm to 10 seconds 10s later \n");
}

//===========================================================================
//函数名称：打印当前RTC时间
//功能概要：打印当前RTC时间
//参数：无
//版本更新：2013-5-23  V2.0
//===========================================================================
static void print_current_time(void)
{
    DATE_STRUCT     time_rtc;
    TIME_STRUCT     time_mqx;
    //获取系统RTC时间
    _rtc_get_time_mqxd (&time_rtc);
    _time_from_date (&time_rtc, &time_mqx);
    print_rtc_time(&time_rtc, &time_mqx);
}


//===========================================================================
//函数名称：RTC,ALARM中断服务例程
//功能概要：闹钟功能
//参数：无
//版本更新：2013-5-23  V2.0
//===========================================================================

static void my_interrupt (pointer rtc_registers_ptr)
{
    state = _rtc_get_status ();

    if( state &   RTC_RTCISR_ALM)
    {
        printf ("\n Alarm reach !\n");
    }
    //清标志
    _rtc_clear_requests (state);
}
