#include "xp_cds_status_bus.h"
//#include "xp_tools.h"


void clear_cur_stat_sbus(T_cds_status_serial_bus *v)
{
	v->cur_read_error = 0;
	v->cur_write_error = 0;
}

void clear_cur_stat_pbus(T_cds_status_parallel_bus *v)
{
	v->cur_read_error = 0;
	v->cur_write_error = 0;
}

void clear_cur_stat_hwpbus(T_cds_status_hwp_bus *v)
{
	v->cur_read_error = 0;
	v->cur_write_error = 0;
}


////////////////////////////////////////////
////////////////////////////////////////////


void clear_stat_sbus(T_cds_status_serial_bus *v)
{
	v->count_read_error = 0;
	v->count_write_error = 0;
	v->count_read_ok = 0;
	v->count_write_ok = 0;
	v->cur_read_error = 0;
	v->cur_write_error = 0;

	v->status      = 0;
}

void clear_stat_pbus(T_cds_status_parallel_bus *v)
{
	v->count_read_error = 0;
	v->count_write_error = 0;
	v->count_read_ok = 0;
	v->count_write_ok = 0;
	v->cur_read_error = 0;
	v->cur_write_error = 0;

	v->status      = 0;
}

void clear_stat_hwpbus(T_cds_status_hwp_bus *v)
{
	v->count_read_error = 0;
	v->count_write_error = 0;
	v->count_read_ok = 0;
	v->count_write_ok = 0;

	v->cur_read_error = 0;
	v->cur_write_error = 0;

	v->status      = 0;
}


int check_cds_ready_sbus(int err, int wr_rd, T_cds_status_serial_bus *v)
{

  if (wr_rd == ITS_WRITE_BUS) // write
  {
	if (err)
	{
		if (v->cur_write_error < v->max_write_error)
		   v->cur_write_error++;
	}
	else
	{
		if (v->cur_write_error > 0)
		   v->cur_write_error--;
	}
  }


  if (wr_rd == ITS_READ_BUS) // read
  {

	if (err)
	{
		if (v->cur_read_error < v->max_read_error)
		   v->cur_read_error++;
	}
	else
	{
		if (v->cur_read_error > 0)
		   v->cur_read_error--;
	}
  }


  if ( (v->cur_write_error >= v->max_write_error) || (  v->cur_read_error >= v->max_read_error) )
    return 1;


  return 0;
}



int check_cds_ready_pbus(int err, int wr_rd, T_cds_status_parallel_bus *v)
{

  if (wr_rd == ITS_WRITE_BUS) // write
  {
	if (err)
	{
		if (v->cur_write_error < v->max_write_error)
		   v->cur_write_error++;
	}
	else
	{
		if (v->cur_write_error > 0)
		   v->cur_write_error--;
	}
  }


  if (wr_rd == ITS_READ_BUS) // read
  {

	if (err)
	{
		if (v->cur_read_error < v->max_read_error)
		   v->cur_read_error++;
	}
	else
	{
		if (v->cur_read_error > 0)
		   v->cur_read_error--;
	}
  }


  if ( (v->cur_write_error >= v->max_write_error) || (  v->cur_read_error >= v->max_read_error) )
    return 1;


  return 0;
}



int check_cds_ready_hwpbus(int err, int wr_rd, T_cds_status_hwp_bus *v)
{

  if (wr_rd == ITS_WRITE_BUS) // write
  {
	if (err)
	{
	    v->count_write_error++;
		if (v->cur_write_error < v->max_write_error)
		   v->cur_write_error++;
	}
	else
	{
		if (v->cur_write_error > 0)
		   v->cur_write_error--;
        v->count_write_ok++;

	}
  }


  if (wr_rd == ITS_READ_BUS) // read
  {

	if (err)
	{
	    v->count_read_error++;
		if (v->cur_read_error < v->max_read_error)
		   v->cur_read_error++;
	}
	else
	{
		if (v->cur_read_error > 0)
		   v->cur_read_error--;
		v->count_read_ok++;
	}
  }


  if ( (v->cur_write_error >= v->max_write_error) || (  v->cur_read_error >= v->max_read_error) )
    return 1;


  return 0;
}




void set_status_cds(int err_ready, T_component_status *ss)
{

  if (err_ready == 0) // all ok
  {
	if ((*ss == component_NotReady) || (*ss ==  component_Started))
	  *ss = component_Ready;
  }

  if (err_ready == 1) // all !bad!
  {
	  *ss = component_ErrorSBus;//component_Error;
  }

}