
//޸ļ¼

//2014.5.6
//޸ַ͵ײ㺯, ȥ˷ѡ˿, ھģװļȥṩӿ
//ȥ˷ʱ, ǼӲĴжַǷԷԼǷ
//˲úΪӿ

//2015.12.27
//ȥЭ, ֻڻ

	public const int16 max_length = 32;
	public [int8*max_length] buffer;
	public int16 length;
	public int16 start;

	int16 cindex;

	public const int32 XTAL = $freq$;

	//оƬײ
	#include "$chip$.txt"
	
	unit reader0
	{
		public link bool IsReady() {}
		public link int32 GetData() {}
		public link void SetData( int32 d ) {}
		public link void SetStart() {}
		public link int32 ReadBuffer( int32 i ) {}
	}
	reader0.IsReady = is_ready;
	reader0.GetData = get_data;
	reader0.SetData = print_char;
	reader0.SetStart = SetStart;
	reader0.ReadBuffer = ReadBuffer;
	
	//----------------------------------------------------
	//ڳʼ,:9600,8λ,1ֹͣλ,ûżУ
	public void uart_OS_init()
	{
		//io.RDE_DIR = 1;
		//io.RDE_OUT = 0;
		
		//io.RXD_DIR = 0;
		//io.RXD_OUT = 1;
		
		//io.TXD_DIR = 1;
		//io.TXD_OUT = 1;
		
		PORT.D2_DIR = 0;
		PORT.D2_OUT = 1;
		
		PORT.D3_DIR = 1;
		PORT.D3_OUT = 1;
		
		//Ĭϲ
		set_baud( baud );
		
		length = 0;
		start = 0;
		cindex = 0;
	}
	//---------------------------------------------------
	//ɨ
	public void OS_thread()
	{
		OS_EventFlag.1(bit) = 1;
		if( is_ready() ) {
			OS_EventFlag.2(bit) = 1;
		}
	}
	//---------------------------------------------------
	//ȡǰ
	public int32 get_data()
	{
		int16 n = start;
		start + 1;
		start % max_length;
		return buffer[n];
	}
	//---------------------------------------------------
	//жϵǰǷЧ
	public bool is_ready()
	{
		//ע length ٽ,ֱӷ
		#asm "cli"
		int16 t_length = length;
		#asm "sei"
		
		return start != t_length;
	}
	void SetStart()
	{
		cindex = start;
	}
	int32 ReadBuffer( int32 n )
	{
		int16 i = cindex + (int16)n;
		i % max_length;
		uint32 data = (uint)buffer[i];
		return (int)data;
	}
	//=================================================================================
	
	//һַ
	public void print_char( int32 data )
	{
		uint32 d = (uint)data;
		print_byte( (int)d.0(uint8) );
	}

//=================================================================================
	//һֽ
	public void print_byte( int8 data )
	{
		WAIT_SEND_OK();
		UDR = (uint)data;
	}
	//ʱ
	void delay()
	{
		loop( 15 ) loop( 100 ) {}
	}
	//ݽж
	INTERRUPT_UART
	void RXC()
	{
		//жϳжȡ UDR,˳½ж
		buffer[length] = (int)UDR;
		length + 1;
		length % max_length;
	}

	#include "uart_extend.txt"


	//----------------------------------------------------
	//һַ
//	public void print_char( int8 data )
//	{
//		io.RDE_OUT = 1;
//		delay();
//		CHIP.UDR = (uint)data;
//		repeat until CHIP.UCSRA.5(bit) == 1; {}
//		CHIP.UCSRA.5(bit) = 1;
//		delay();//ʱҪ! ȥ֮ԽյǷд
//		io.RDE_OUT = 0;
//	}















