
//4λ,޹س

unit number
{
	public const uint16 ID = 0;
	
	public link unit DIN {}
	public link unit CLK {}
	
	link bit DATA_IN = DIN.D0_IN;
	link bit DATA_OUT = DIN.D0_OUT;
	link bit DATA_DIR = DIN.D0_DIR;
	
	link bit SHIFT_IN = CLK.D0_IN;
	link bit SHIFT_OUT = CLK.D0_OUT;
	link bit SHIFT_DIR = CLK.D0_DIR;
	
	//---------------------------------------------------
	//ṩĽӿ
	//[i] interface_char char;
	unit char
	{
		link void clear() {}
		link void clear_line(int32 l) {}
		link void write_char(int32 l,int32 c, int32 ch) {}
		public const int8 PerWidth = 1;
	}
	char.clear = clear;
	char.clear_line = clear_line;
	char.write_char = write_char;
	
	//ĸʾԪСλ
	[uint8*4] data;
	bool is_changed;
	
	uint8 point;
	
	//==============================================
	//[i] function_void OS_init;
	public void OS_init()
	{
		is_changed = false;
		
		TM1637.init();
		clear();
		clear_point();
	}
	//==============================================
	//[i] function_void OS_thread;
	public void OS_thread()
	{
		if( is_changed ) {
			is_changed = false;
			TM1637.send( data, point );
		}
	}
	//==============================================
	//[i] function_void clear;
	public void clear()
	{
		data[0] = NO_SEG;
		data[1] = NO_SEG;
		data[2] = NO_SEG;
		data[3] = NO_SEG;
		is_changed = true;
	}
	void clear_line(int32 l)
	{
		if( l == 1 ) {
			clear();
		}
	}
	//==============================================
	//[i] function_void print_char int32 int32;
	public void print_char( int32 c, int32 ch )
	{
		write_char( 1, c, ch );
	}
	public void write_char( int32 l, int32 c, int32 ch )
	{
		if( l != 1 ) return;
		int16 cc = (int16)c;
		if( cc < 1 || cc > 4 ) return;
		if( ch < 0x20 ) {
			ch + 0x10;
		}
		else {
			ch - 0x20;
		}
		data[cc - 1] = seg_table[(int16)ch];
		
		is_changed = true;
	}
	//==============================================
	//[i] function_void show_dot;
	public void show_dot()
	{
		point | 0B0000_0010;
		is_changed = true;
	}
	//==============================================
	//[i] function_void hide_dot;
	public void hide_dot()
	{
		point & ~0B0000_0010;
		is_changed = true;
	}
	//==============================================
	////[i] function_void show_point int32;
	public void show_point( int32 column )
	{
		if( column < 1 || column > 8 ) return;
		int8 c = (int8)(int16)column;
		switch( c ) {
			== 1: point | 0B0000_0001; break;
			== 2: point | 0B0000_0010; break;
			== 3: point | 0B0000_0100; break;
			== 4: point | 0B0000_1000; break;
			== 5: point | 0B0001_0000; break;
			== 6: point | 0B0010_0000; break;
			== 7: point | 0B0100_0000; break;
			== 8: point | 0B1000_0000; break;
			default: break;
		}
		is_changed = true;
	}
	//==============================================
	////[i] function_void hide_point int32;
	public void hide_point( int32 column )
	{
		if( column < 1 || column > 8 ) return;
		int8 c = (int8)(int16)column;
		switch( c ) {
			== 1: point & ~0B0000_0001; break;
			== 2: point & ~0B0000_0010; break;
			== 3: point & ~0B0000_0100; break;
			== 4: point & ~0B0000_1000; break;
			== 5: point & ~0B0001_0000; break;
			== 6: point & ~0B0010_0000; break;
			== 7: point & ~0B0100_0000; break;
			== 8: point & ~0B1000_0000; break;
			default: break;
		}
		is_changed = true;
	}
	//==============================================
	////[i] function_void clear_point;
	public void clear_point()
	{
		point = 0B0000_0000;
		is_changed = true;
	}
	//==============================================
	//[i] function_void set_light int32;
	public void set_light( int32 light )
	{
		TM1637.set_light( (uint8)(uint16)(uint)light );
	}
	//==============================================
	const uint8 SELECT_DATA0 = 0B0000_0001;
	const uint8 NO_SELECT = 0X00;
	const uint8 NO_SEG = 0X00;
	
	//α
	[#.code uint8*?] seg_table =
	[
		//SP     !     "     #
		0x00, 0x00, 0x00, 0x00,
		// $     &     %     '
		0x00, 0x00, 0x00, 0x00,
		// (     )     *     +
		0x00, 0x00, 0x00, 0x00,
		// ,            -     .     /
		0x00, 0b0100_0000, 0x00, 0x00,
		
		0b0011_1111, 0b0000_0110, 0b0101_1011, 0b0100_1111,	//00-- 0 1 2 3
		0b0110_0110, 0b0110_1101, 0b0111_1101, 0b0000_0111,	//04-- 4 5 6 7
		0b0111_1111, 0b0110_1111, 					//08-- 8 9
		
		0b0111_0111, 0b0111_1100, //A B
		0b0011_1001, 0b0101_1110, 0b0111_1001, 0b0111_0001, //0C-- C D E F
		0b0000_0000, 0b0000_0001, 0b0100_0000, 0b0000_1000, //10-- N ^ - _
		0b0000_0001, 0b0000_0010, 0b0000_0100, 0b0000_1000, //14--
		0b0001_0000, 0b0010_0000, //CIRCLE_0 1 2 3 4 5
		0b0000_1001, 0b0001_0010, 0b0010_0100, //1A-- DCIRCLE_0 1 2
		0b0000_0011, 0b0000_0110, 0b0000_1100, 0b0001_1000, 0b0011_0000, 0b0010_0001, //1D-- BCIRCLE_0 1 2 3 4 5
		0b0000_0111, 0b0000_1110, 0b0001_1100, 0b0011_1000, 0b0011_0001, 0b0010_0011  //23-- ECIRCLE_0 1 2 3 4 5
	];
	
	
	#include "$run$.txt"
}








