.. index:: pair: UniServ; MT protocol single: Table download protocol =================================================== Table download protocol specification (MT protocol) =================================================== Special constants ----------------- Here are the protocol constants:: ESC 0x80000000 LIT 0x80000001 C_MASK 0x10000000 C_START 0x20000000 C_CKLOW 0x30000000 C_CKHIGH 0x40000000 C_DATMASK 0x0FFFFFFF C_CMDMASK 0xF0000000 Special functions ----------------- There are the definitions of some special functions:: C_MASK(n) 0x10000000 + n C_CKLOW(n) 0x30000000 + n C_CKHIGH(n) 0x40000000 + n C_START(n) 0x20000000 + n The table of values ------------------- Table to transmit: X[i] Y[i], i=0..l checksum= Sum(i=0..l,X[i]+Y[i]) Sender ------ Start transmission (everything with a delay of "T"), all integers are transmitted as little endian integers axle mask: MASK array length: l This is the sender pseudo code:: send ESC send ESC send C_MASK(MASK) send C_CKHIGH(checksum >> 16) send C_CKLOW(checksum & 0xFFFF) send C_START(l) last= ESC for i in 0..l for val in X[i],Y[i] if val==ESC or val==LIT or val==last send LIT send val last= val send ESC send ESC Receiver -------- This is the receiver pseudo code:: mode= MODE_COMMAND is_selected= False table_checksum= 0 table_status= STATUS_OK checksum= 0 current_checksum= 0 status= STATUS_OK length= 0 current_length= 0 transfer_y= True loop val= read() // it is ensured that the read value is different each time if mode==MODE_VALUE or mode==MODE_LITERAL new_data= true if mode==MODE_LITERAL mode= MODE_VALUE else if val==ESC mode= MODE_COMMAND new_data= false if is_selected status= STATUS_OK if current_checksum != checksum status= STATUS_CHECKSUM_ERROR if current_length != length status= STATUS_LENGTH_ERROR if status != STATUS_OK else TABLE_LENGTH= current_length table_status= status elsif val==LIT mode= MODE_LITERAL new_data= false if is_selected and new_data if not transfer_y X[current_length]= val transfer_y= true else Y[current_length]= val transfer_y= false current_length= current_length + 1 current_checksum = current_checksum + val elsif mode==MODE_COMMAND code= val & C_CMDMASK if code==C_MASK if val & (1<<(my_axle_index-1)) is_selected= true else is_selected= false elsif code==C_CKHIGH if is_selected checksum= (val & C_DATMASK)<<16 elsif code==C_CKLOW: if is_selected checksum= checksum | (val & C_DATMASK) elsif code==C_START if is_selected length= val & C_DATMASK current_length= 0 transfer_y= false current_checksum= 0 status= STATUS_TRANSMITTING mode= MODE_VALUE