#include "can200.h"

extern unsigned int far BASE;
unsigned char far ResetRequest(unsigned char);
unsigned char far TestResetRequest(void);

unsigned char far P_SetRxErrorCounter(unsigned char newRxErrorCounter)
{
  if (GetWorkMode()!=PeliCAN) return 1;
  if (TestResetRequest()==NormalMode)
   {                         // если канал находится в рабочем режиме
	ResetRequest(ResetMode); // переводим его в режим сброса
	while(TestResetRequest()!=ResetMode);
   }

   outportb(BASE+14,newRxErrorCounter);
   ResetRequest(NormalMode);
   return 0;
}

int far P_GetRxErrorCounter(void)
{
  if (GetWorkMode()!=PeliCAN) return -1;
  return inportb(BASE+14);
}

unsigned char far P_SetTxErrorCounter(unsigned char newTxErrorCounter)
{
  if (GetWorkMode()!=PeliCAN) return 1;
  if (TestResetRequest()==NormalMode)
   {                         // если канал находится в рабочем режиме
	ResetRequest(ResetMode); // переводим его в режим сброса
	while(TestResetRequest()!=ResetMode);
   }

   outportb(BASE+15,newTxErrorCounter);
   ResetRequest(NormalMode);
   return 0;
}

int far P_GetTxErrorCounter(void)
{
  if (GetWorkMode()!=PeliCAN) return -1;
  return inportb(BASE+15);
}

unsigned char far P_SetErrorWarningLimit(unsigned char newErrorWarningLimit)
{
  if (GetWorkMode()!=PeliCAN) return 1;
  if (TestResetRequest()==NormalMode)
   {                         // если канал находится в рабочем режиме
	ResetRequest(ResetMode); // переводим его в режим сброса
	while(TestResetRequest()!=ResetMode);
   }

   outportb(BASE+13,newErrorWarningLimit);
   ResetRequest(NormalMode);
   return 0;
}

int far P_GetErrorWarningLimit(void)
{
  if (GetWorkMode()!=PeliCAN) return -1;
  return inportb(BASE+13);
}

int far P_GetArbitrationLostCapture(void)
{
  if (GetWorkMode()!=PeliCAN) return -1;
  return (inportb(BASE+11)&0x1F);
}

int far P_GetRxMessageCounter(void)
{
  if (GetWorkMode()!=PeliCAN) return -1;
  return inportb(BASE+29);
}

int far P_GetErrorCode(void)
{
  if (GetWorkMode()!=PeliCAN) return -1;
  return inportb(BASE+12);
}

unsigned char far P_SetInputFilter(unsigned char mode, unsigned char ACR0, unsigned char ACR1,unsigned char ACR2,unsigned char ACR3,unsigned char AMR0,unsigned char AMR1,unsigned char AMR2,unsigned char AMR3)
{
  if (GetWorkMode()!=PeliCAN) return 1;
  if(mode!=0 && mode!=1) return 2;
  if (TestResetRequest()==NormalMode)
   {                         // если канал находится в рабочем режиме
	ResetRequest(ResetMode); // переводим его в режим сброса
	while(TestResetRequest()!=ResetMode);
   }
   outportb(BASE,(inportb(BASE)&0xF7)+(mode<<3) );
   outportb(BASE+16,ACR0);
   outportb(BASE+17,ACR1);
   outportb(BASE+18,ACR2);
   outportb(BASE+19,ACR3);

   outportb(BASE+20,AMR0);
   outportb(BASE+21,AMR1);
   outportb(BASE+22,AMR2);
   outportb(BASE+23,AMR3);

   ResetRequest(NormalMode); // переводим канал в нормальный режим

   return 0;
}