#include "iodefine.h"
#include "intIRQ.h"
#include "intCMT.h"

int _intrupt_f;
static unsigned long _intrupt_count[4];

static unsigned long _intrupt_time[4];		//割り込み発生時刻
static unsigned long _intrupt_time_last[4];	//最終割り込み発生時刻
static long _intrupt_time_sub[4];	//割り込み発生間隔


//****************************************************************************
//	関数名	: init_IRQ
//	内容	:外部割込みの初期化関数
//****************************************************************************

void init_IRQ(void)
{
	int i=0;

	PFC.PACRL2.BIT.PA5MD=7;	//PA5を外部割込みに設定
	PFC.PACRL1.BIT.PA2MD=3;	//PA2を外部割込みに設定

	INTC.IRQCR.BIT.IRQ0S=2;	//立上り:2 立下り:1
	INTC.IRQCR.BIT.IRQ3S=2;	//立上り:2 立下り:1

	//	SCIの割り込みレベル（優先順位）を設定
	INTC.IPRA.BIT._IRQ0 = 0x9;	// ※(0x0:最低〜0xF:最高)
	INTC.IPRA.BIT._IRQ3 = 0x8;	// ※(0x0:最低〜0xF:最高)

	_intrupt_f=0;

	for(i=0;i<4;i++){
		_intrupt_count[i]=0;	// カウント値を初期化
		_intrupt_time[i]=0;
		_intrupt_time_last[i]=0;
		_intrupt_time_sub[i]=0;
	}

	INTC.IRQSR.BIT.IRQ0F=0;		// IRQ割込フラグをクリア
	INTC.IRQSR.BIT.IRQ3F=0;
}


//**************************
//	関数名	:IRQ_INT_IRQ0
//	内容	:IRQ0の外部割り込み関数
//			 外部割込みがあると自動的に実行される
//	
//			この関数は、intprg.cで定義しておく必要がある！！！
//			※IRQ0の送信割り込み発生時に、HEWのINT_IRQ0関数からコールされる 
//***************************
void IRQ_INT_IRQ0(void)
{
	unsigned long time;
	unsigned long time_o;
	time=getsystime2();			//現在の時刻を取得
	time_o=_intrupt_time_last[0];	//最終受信時刻を読み出し
	_intrupt_time_last[0]=time;		//最終受信時刻を更新
	if((time-time_o)>100){		//最終受信時刻から1ms以上経過
		_intrupt_time_sub[0]=(long)(time-_intrupt_time[0]);//差分を計算
		_intrupt_time[0]=time;	//有効最終受信時刻を更新

		_intrupt_f|=1;
		_intrupt_count[0]++;
	}
	INTC.IRQSR.BIT.IRQ0F=0;
}


//**************************
//	関数名	:IRQ_INT_IRQ3
//	内容	:IRQ3の外部割り込み関数
//			 外部割込みがあると自動的に実行される
//	
//			この関数は、intprg.cで定義しておく必要がある！！！
//			※IRQ3の送信割り込み発生時に、HEWのINT_IRQ3関数からコールされる 
//***************************
void IRQ_INT_IRQ3(void){

	unsigned long time;
	unsigned long time_o;
	time=getsystime2();			//現在の時刻(100倍分解能)を取得
	time_o=_intrupt_time_last[3];	//最終受信時刻を読み出し
	_intrupt_time_last[3]=time;		//最終受信時刻を更新
	if((time-time_o)>100){		//最終受信時刻から1ms以上経過
		_intrupt_time_sub[3]=time-_intrupt_time[3];//差分を計算
		_intrupt_time[3]=time;	//有効最終受信時刻を更新

		_intrupt_f|=8;
		_intrupt_count[3]++;
	}
	INTC.IRQSR.BIT.IRQ3F=0;
}

//割り込み検出を取得する
int get_intrupt_f(void){
	return 	_intrupt_f;
}
//割り込み検出を初期化する
int clr_intrupt_f(void){
	_intrupt_f=0;
}

//割り込み回数を取得する
unsigned long get_irq_cnt(int port){
	if(port<0||port>3)
		return 0;
	return _intrupt_count[port];
}

//割り込み時刻を取得する
unsigned long get_irq_time(int port){
	if(port<0||port>3)
		return 0;
	return _intrupt_time[port];
}

//差分時間を取得する
long get_irq_subtime(int port){
	if(port<0||port>3)
		return 0;
	return _intrupt_time_sub[port];
}

//差分時間を取得する
long get_irq_subtime2(int portA,int portB){
	if(portA<0||portA>3)
		return 0;
	if(portB<0||portB>3)
		return 0;
	return (long)(_intrupt_time[portB]-_intrupt_time[portA]);
}