|  |  |  | @ -12,7 +12,11 @@ uint16_t crc16(const void *block, size_t length); | 
		
	
		
			
				|  |  |  |  | #define PACKED __attribute__((__packed__)) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | struct PACKED Header { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // The preamble marks the start of a message and is always 0x55
 | 
		
	
		
			
				|  |  |  |  |   uint8_t preamble; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // The length of the message includes the preamble and CRC16 at the end
 | 
		
	
		
			
				|  |  |  |  |   union { | 
		
	
		
			
				|  |  |  |  |       uint16_t length; | 
		
	
		
			
				|  |  |  |  |       struct { | 
		
	
	
		
			
				
					|  |  |  | @ -20,9 +24,20 @@ struct PACKED Header { | 
		
	
		
			
				|  |  |  |  | 	  uint8_t length_h; | 
		
	
		
			
				|  |  |  |  |       }; | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // This is a CRC8 checksum for the preamble and length together
 | 
		
	
		
			
				|  |  |  |  |   uint8_t crc; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // hostbyte of the message sender
 | 
		
	
		
			
				|  |  |  |  |   uint8_t sender; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // hostbyte of the message receiver
 | 
		
	
		
			
				|  |  |  |  |   uint8_t receiver; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // Each message has a sequence ID
 | 
		
	
		
			
				|  |  |  |  |   // The Robomaster will respond with the same ID for each request
 | 
		
	
		
			
				|  |  |  |  |   // The value of the sequence ID doesn't matter to the Robomaster
 | 
		
	
		
			
				|  |  |  |  |   // Repeating sequence IDs are acceptable
 | 
		
	
		
			
				|  |  |  |  |   union { | 
		
	
		
			
				|  |  |  |  |       int16_t seq_id; | 
		
	
		
			
				|  |  |  |  |       struct { | 
		
	
	
		
			
				
					|  |  |  | @ -30,6 +45,9 @@ struct PACKED Header { | 
		
	
		
			
				|  |  |  |  | 	  uint8_t seq_id_h; | 
		
	
		
			
				|  |  |  |  |       }; | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // The message attribute flags designate if a response is needed or if the
 | 
		
	
		
			
				|  |  |  |  |   // message is a response.
 | 
		
	
		
			
				|  |  |  |  |   union { | 
		
	
		
			
				|  |  |  |  |     uint8_t attribute; | 
		
	
		
			
				|  |  |  |  |     struct { | 
		
	
	
		
			
				
					|  |  |  | @ -38,8 +56,11 @@ struct PACKED Header { | 
		
	
		
			
				|  |  |  |  |       bool is_ack : 1; | 
		
	
		
			
				|  |  |  |  |     }; | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // Each command has a cmdset and cmdid that together make a cmd key
 | 
		
	
		
			
				|  |  |  |  |   uint8_t cmdset; | 
		
	
		
			
				|  |  |  |  |   uint8_t cmdid; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | struct PACKED Message { | 
		
	
	
		
			
				
					|  |  |  | 
 |