#include "..\Header\foprogram.h"

void Number_write(int val, long addr)
{
	char str[5];
	long addr2;
	int i  = 0;
	str[0] = '\0';
	sprintf(str,"%05d",val);
	addr2  = addr + (long)strlen(str);
	for(addr; addr < addr2; addr++)
	{
		random_write(0x00, addr,str[i]);
		i++;
	}
}

void String_write(char* str, long addr)
{
	int i = 0;
	long addr2 = addr + (long)strlen(str) + (long)1;
	for(addr; addr < addr2; addr++)
	{
		random_write(0x00, addr,str[i]);
		i++;
	}
}

int Number_read(long addr)
{
	char str[5];
	int i       =   0 ;
	long addr2  = addr + (long)5;
	str[0]      = '\0';
	for(addr; addr < addr2; addr++)
	{
		str[i] = random_read(0x00, addr);
		i++;
	}
	return atoi(str);
}

void String_read(char* str, long addr1, int length)
{
	int i;
	long addr2 = addr1 + (long)length ;
	for(i = 0; i < strlen(str); i++) str[i] = '\0';
	i = 0;
	for(addr1; addr1 < addr2; addr1++)
	{
		str[i] = random_read(0x00, addr1);
		i++;
	}
}

void random_write(char dev_adr, long mem_adr, char dat)
{
	i2c_start();
	i2c_out_byte(0xa0 | (dev_adr << 1));
	i2c_nack();
	i2c_out_byte((mem_adr >> 8) & 0xff);
	i2c_nack();
	i2c_out_byte(mem_adr & 0xff);
	i2c_nack();
	i2c_out_byte(dat);
	i2c_nack();
	i2c_stop();
	Delay100TCYx(250); // 5 ms késleltetés! 
}

char random_read(char dev_adr, long mem_adr)
{
	char ch;
	i2c_start();
	i2c_out_byte(0xa0 | (dev_adr << 1));
	i2c_nack();
	i2c_out_byte((mem_adr >> 8) & 0xff);
	i2c_nack();
	i2c_out_byte(mem_adr & 0xff);
	i2c_nack();
	i2c_start();
	i2c_out_byte(0xa1 | (dev_adr << 1));
	i2c_nack();
	ch = i2c_in_byte();
	i2c_stop();
	return(ch);
}

char i2c_in_byte(void)
{
	char i_byte, n;
	i2c_high_sda();
	for (n=0; n<8; n++)
	{
		i2c_high_scl();

		if (SDA_PIN) 
			i_byte = (i_byte << 1) | 0x01; 
      	else
			i_byte = i_byte << 1;
		i2c_low_scl();
	}
	return(i_byte);
}

void i2c_out_byte(char o_byte)
{
   char n;
   for(n=0; n<8; n++)
   {
      if(o_byte&0x80)
         i2c_high_sda();
      else
         i2c_low_sda();
      i2c_high_scl();
      i2c_low_scl();
      o_byte = o_byte << 1;
   }
   i2c_high_sda();
}

void i2c_nack(void)
{
   i2c_high_sda();
   i2c_high_scl();
   i2c_low_scl();
}

void i2c_ack(void)
{
   i2c_low_sda();
   i2c_high_scl();
   i2c_low_scl();
   i2c_high_sda();
}

void i2c_start(void)
{
   i2c_low_scl();
   i2c_high_sda();
   i2c_high_scl();
   i2c_low_sda();
   i2c_low_scl();
}

void i2c_stop(void)
{
   i2c_low_scl();
   i2c_low_sda();
   i2c_high_scl();
   i2c_high_sda();
}

void i2c_high_sda(void)
{
	SDA_DIR = 1;
	Nop();
}

void i2c_low_sda(void)
{
	SDA_PIN = 0;
	SDA_DIR = 0;
	Nop();
}

void i2c_high_scl(void)
{
	SCL_DIR = 1;
	Nop();
}

void i2c_low_scl(void)
{
	SCL_PIN = 0;
	SCL_DIR = 0;
	Nop();
}
