mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	refactored xiaomi ble data parsing (#823)
This commit is contained in:
		
				
					committed by
					
						 Otto Winter
						Otto Winter
					
				
			
			
				
	
			
			
			
						parent
						
							09fd505f08
						
					
				
				
					commit
					90f909d2ea
				
			| @@ -91,17 +91,6 @@ optional<XiaomiParseResult> parse_xiaomi(const esp32_ble_tracker::ESPBTDevice &d | ||||
|     return {}; | ||||
|   } | ||||
|  | ||||
|   uint8_t raw_offset = is_lywsdcgq || is_cgg1 ? 11 : 12; | ||||
|  | ||||
|   const uint8_t raw_type = raw[raw_offset]; | ||||
|   const uint8_t data_length = raw[raw_offset + 2]; | ||||
|   const uint8_t *data = &raw[raw_offset + 3]; | ||||
|   const uint8_t expected_length = data_length + raw_offset + 3; | ||||
|   const uint8_t actual_length = device.get_service_data().size(); | ||||
|   if (expected_length != actual_length) { | ||||
|     // ESP_LOGV(TAG, "Xiaomi %s data length mismatch (%u != %d)", type, expected_length, actual_length); | ||||
|     return {}; | ||||
|   } | ||||
|   XiaomiParseResult result; | ||||
|   result.type = XiaomiParseResult::TYPE_HHCCJCY01; | ||||
|   if (is_lywsdcgq) { | ||||
| @@ -111,7 +100,42 @@ optional<XiaomiParseResult> parse_xiaomi(const esp32_ble_tracker::ESPBTDevice &d | ||||
|   } else if (is_cgg1) { | ||||
|     result.type = XiaomiParseResult::TYPE_CGG1; | ||||
|   } | ||||
|   bool success = parse_xiaomi_data_byte(raw_type, data, data_length, result); | ||||
|  | ||||
|   uint8_t raw_offset = is_lywsdcgq || is_cgg1 ? 11 : 12; | ||||
|  | ||||
|   // Data point specs | ||||
|   // Byte 0: type | ||||
|   // Byte 1: fixed 0x10 | ||||
|   // Byte 2: length | ||||
|   // Byte 3..3+len-1: data point value | ||||
|  | ||||
|   const uint8_t *raw_data = &raw[raw_offset]; | ||||
|   uint8_t data_offset = 0; | ||||
|   uint8_t data_length = device.get_service_data().size() - raw_offset; | ||||
|   bool success = false; | ||||
|  | ||||
|   while (true) { | ||||
|     if (data_length < 4) | ||||
|       // at least 4 bytes required | ||||
|       // type, fixed 0x10, length, 1 byte value | ||||
|       break; | ||||
|  | ||||
|     const uint8_t datapoint_type = raw_data[data_offset + 0]; | ||||
|     const uint8_t datapoint_length = raw_data[data_offset + 2]; | ||||
|  | ||||
|     if (data_length < 3 + datapoint_length) | ||||
|       // 3 fixed bytes plus value length | ||||
|       break; | ||||
|  | ||||
|     const uint8_t *datapoint_data = &raw_data[data_offset + 3]; | ||||
|  | ||||
|     if (parse_xiaomi_data_byte(datapoint_type, datapoint_data, datapoint_length, result)) | ||||
|       success = true; | ||||
|  | ||||
|     data_length -= data_offset + 3 + datapoint_length; | ||||
|     data_offset += 3 + datapoint_length; | ||||
|   } | ||||
|  | ||||
|   if (!success) | ||||
|     return {}; | ||||
|   return result; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user