
#include "config.h"
#include "opora.h"

#define	TIMEOUT	5	//каждые 5 секунд отправлять данные

uint32_t Sec=0;

int main()
{
	ClkConfig();
	PortConfig();
	Arinc429TxConfig();
	Arinc429RxConfig();
	SysTickInit();
	NVIC_EnableIRQ(ARINC429R_IRQn);
	while(1);
}

void ARINC429R_Handler(void)
{
	uint32_t err_status,fifo_status,temp;

	err_status=(ARINC429R->STATUS1>>14)&0x0F;	//так как включены только 4 канала
	fifo_status=ARINC429R->STATUS1&0x0F;		//так как включены только 4 канала
	PORTD->SETTX = 1<<7;
	if(err_status!=0)
	{
		switch(err_status)
		{
			case 0x01:
				if((ARINC429T->STATUS&0x10)!=0x10)	ARINC429T->DATA2_T = 0x1FFFFF01;
				ARINC429R->CONTROL1&=~(0x01);
				ARINC429R->CONTROL1|=0x01;
				PORTD->SETTX = 1<<8;
				break;
			case 0x02:
				if((ARINC429T->STATUS&0x10)!=0x10)	ARINC429T->DATA2_T = 0x1FFFFF02;
				ARINC429R->CONTROL1&=~(0x02);
				ARINC429R->CONTROL1|=0x02;
				PORTD->SETTX = 1<<9;
				break;
			case 0x04:
				if((ARINC429T->STATUS&0x10)!=0x10)	ARINC429T->DATA2_T = 0x1FFFFF03;
				ARINC429R->CONTROL1&=~(0x04);
				ARINC429R->CONTROL1|=0x04;
				PORTD->SETTX = 1<<10;
				break;
			case 0x08:
				if((ARINC429T->STATUS&0x10)!=0x10)	ARINC429T->DATA2_T = 0x1FFFFF04;
				ARINC429R->CONTROL1&=~(0x08);
				ARINC429R->CONTROL1|=0x08;
				PORTD->SETTX = 1<<11;
				break;
			default: PORTD->SETTX = 1<<12;
		}
		return;
	}

	for(temp=0;temp<4;temp++)
	{
		if(((fifo_status>>temp)&0x01) == 0x01)
		{
			ARINC429R->CHANNEL = temp;
			while((ARINC429R->STATUS1&(1<<temp))!=0)
			{
				if((ARINC429T->STATUS&0x10)!=0x10)	   //Бит полноты FIFO канала 2
					ARINC429T->DATA2_T = ARINC429R->DATA_R;
				else break;
			}
		}
	}
	PORTD->CLRTX = 1<<7;
}

void SysTick_Handler(void)
{
	static uint8_t ms100=0;
	static uint32_t LastTx=0;
		
	if(ms100++ ==10)	//инкриментирование переменной Sec каждую секунду
	{
		ms100=0;
		Sec++;
	}

	if(Sec==(LastTx+TIMEOUT))
	{
		ARINC429T->DATA1_T=((Sec<<10)&0x1FFFFF00)+0x01;
		LastTx=Sec;
	}
}

