mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Move crc16 to helpers (#3780)
This commit is contained in:
		| @@ -4,33 +4,15 @@ | |||||||
| //  - Arduino - AM2320: https://github.com/EngDial/AM2320/blob/master/src/AM2320.cpp | //  - Arduino - AM2320: https://github.com/EngDial/AM2320/blob/master/src/AM2320.cpp | ||||||
|  |  | ||||||
| #include "am2320.h" | #include "am2320.h" | ||||||
| #include "esphome/core/log.h" |  | ||||||
| #include "esphome/core/hal.h" | #include "esphome/core/hal.h" | ||||||
|  | #include "esphome/core/helpers.h" | ||||||
|  | #include "esphome/core/log.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace am2320 { | namespace am2320 { | ||||||
|  |  | ||||||
| static const char *const TAG = "am2320"; | static const char *const TAG = "am2320"; | ||||||
|  |  | ||||||
| // ---=== Calc CRC16 ===--- |  | ||||||
| uint16_t crc_16(uint8_t *ptr, uint8_t length) { |  | ||||||
|   uint16_t crc = 0xFFFF; |  | ||||||
|   uint8_t i; |  | ||||||
|   //------------------------------ |  | ||||||
|   while (length--) { |  | ||||||
|     crc ^= *ptr++; |  | ||||||
|     for (i = 0; i < 8; i++) { |  | ||||||
|       if ((crc & 0x01) != 0) { |  | ||||||
|         crc >>= 1; |  | ||||||
|         crc ^= 0xA001; |  | ||||||
|       } else { |  | ||||||
|         crc >>= 1; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return crc; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void AM2320Component::update() { | void AM2320Component::update() { | ||||||
|   uint8_t data[8]; |   uint8_t data[8]; | ||||||
|   data[0] = 0; |   data[0] = 0; | ||||||
| @@ -98,7 +80,7 @@ bool AM2320Component::read_data_(uint8_t *data) { | |||||||
|   checksum = data[7] << 8; |   checksum = data[7] << 8; | ||||||
|   checksum += data[6]; |   checksum += data[6]; | ||||||
|  |  | ||||||
|   if (crc_16(data, 6) != checksum) { |   if (crc16(data, 6) != checksum) { | ||||||
|     ESP_LOGW(TAG, "AM2320 Checksum invalid!"); |     ESP_LOGW(TAG, "AM2320 Checksum invalid!"); | ||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -35,22 +35,6 @@ void Modbus::loop() { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| uint16_t crc16(const uint8_t *data, uint8_t len) { |  | ||||||
|   uint16_t crc = 0xFFFF; |  | ||||||
|   while (len--) { |  | ||||||
|     crc ^= *data++; |  | ||||||
|     for (uint8_t i = 0; i < 8; i++) { |  | ||||||
|       if ((crc & 0x01) != 0) { |  | ||||||
|         crc >>= 1; |  | ||||||
|         crc ^= 0xA001; |  | ||||||
|       } else { |  | ||||||
|         crc >>= 1; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return crc; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Modbus::parse_modbus_byte_(uint8_t byte) { | bool Modbus::parse_modbus_byte_(uint8_t byte) { | ||||||
|   size_t at = this->rx_buffer_.size(); |   size_t at = this->rx_buffer_.size(); | ||||||
|   this->rx_buffer_.push_back(byte); |   this->rx_buffer_.push_back(byte); | ||||||
|   | |||||||
| @@ -40,8 +40,6 @@ class Modbus : public uart::UARTDevice, public Component { | |||||||
|   std::vector<ModbusDevice *> devices_; |   std::vector<ModbusDevice *> devices_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| uint16_t crc16(const uint8_t *data, uint8_t len); |  | ||||||
|  |  | ||||||
| class ModbusDevice { | class ModbusDevice { | ||||||
|  public: |  public: | ||||||
|   void set_parent(Modbus *parent) { parent_ = parent; } |   void set_parent(Modbus *parent) { parent_ = parent; } | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| #include "senseair.h" | #include "senseair.h" | ||||||
|  | #include "esphome/core/helpers.h" | ||||||
| #include "esphome/core/log.h" | #include "esphome/core/log.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| @@ -42,7 +43,7 @@ void SenseAirComponent::update() { | |||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   uint16_t calc_checksum = this->senseair_checksum_(response, 11); |   uint16_t calc_checksum = crc16(response, 11); | ||||||
|   uint16_t resp_checksum = (uint16_t(response[12]) << 8) | response[11]; |   uint16_t resp_checksum = (uint16_t(response[12]) << 8) | response[11]; | ||||||
|   if (resp_checksum != calc_checksum) { |   if (resp_checksum != calc_checksum) { | ||||||
|     ESP_LOGW(TAG, "SenseAir checksum doesn't match: 0x%02X!=0x%02X", resp_checksum, calc_checksum); |     ESP_LOGW(TAG, "SenseAir checksum doesn't match: 0x%02X!=0x%02X", resp_checksum, calc_checksum); | ||||||
| @@ -60,23 +61,6 @@ void SenseAirComponent::update() { | |||||||
|     this->co2_sensor_->publish_state(ppm); |     this->co2_sensor_->publish_state(ppm); | ||||||
| } | } | ||||||
|  |  | ||||||
| uint16_t SenseAirComponent::senseair_checksum_(uint8_t *ptr, uint8_t length) { |  | ||||||
|   uint16_t crc = 0xFFFF; |  | ||||||
|   uint8_t i; |  | ||||||
|   while (length--) { |  | ||||||
|     crc ^= *ptr++; |  | ||||||
|     for (i = 0; i < 8; i++) { |  | ||||||
|       if ((crc & 0x01) != 0) { |  | ||||||
|         crc >>= 1; |  | ||||||
|         crc ^= 0xA001; |  | ||||||
|       } else { |  | ||||||
|         crc >>= 1; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return crc; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void SenseAirComponent::background_calibration() { | void SenseAirComponent::background_calibration() { | ||||||
|   // Responses are just echoes but must be read to clear the buffer |   // Responses are just echoes but must be read to clear the buffer | ||||||
|   ESP_LOGD(TAG, "SenseAir Starting background calibration"); |   ESP_LOGD(TAG, "SenseAir Starting background calibration"); | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ class SenseAirComponent : public PollingComponent, public uart::UARTDevice { | |||||||
|   void abc_disable(); |   void abc_disable(); | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   uint16_t senseair_checksum_(uint8_t *ptr, uint8_t length); |  | ||||||
|   bool senseair_write_command_(const uint8_t *command, uint8_t *response, uint8_t response_length); |   bool senseair_write_command_(const uint8_t *command, uint8_t *response, uint8_t response_length); | ||||||
|  |  | ||||||
|   sensor::Sensor *co2_sensor_{nullptr}; |   sensor::Sensor *co2_sensor_{nullptr}; | ||||||
|   | |||||||
| @@ -62,6 +62,21 @@ uint8_t crc8(uint8_t *data, uint8_t len) { | |||||||
|   } |   } | ||||||
|   return crc; |   return crc; | ||||||
| } | } | ||||||
|  | uint16_t crc16(const uint8_t *data, uint8_t len) { | ||||||
|  |   uint16_t crc = 0xFFFF; | ||||||
|  |   while (len--) { | ||||||
|  |     crc ^= *data++; | ||||||
|  |     for (uint8_t i = 0; i < 8; i++) { | ||||||
|  |       if ((crc & 0x01) != 0) { | ||||||
|  |         crc >>= 1; | ||||||
|  |         crc ^= 0xA001; | ||||||
|  |       } else { | ||||||
|  |         crc >>= 1; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   return crc; | ||||||
|  | } | ||||||
| uint32_t fnv1_hash(const std::string &str) { | uint32_t fnv1_hash(const std::string &str) { | ||||||
|   uint32_t hash = 2166136261UL; |   uint32_t hash = 2166136261UL; | ||||||
|   for (char c : str) { |   for (char c : str) { | ||||||
|   | |||||||
| @@ -149,6 +149,9 @@ template<typename T, typename U> T remap(U value, U min, U max, T min_out, T max | |||||||
| /// Calculate a CRC-8 checksum of \p data with size \p len. | /// Calculate a CRC-8 checksum of \p data with size \p len. | ||||||
| uint8_t crc8(uint8_t *data, uint8_t len); | uint8_t crc8(uint8_t *data, uint8_t len); | ||||||
|  |  | ||||||
|  | /// Calculate a CRC-16 checksum of \p data with size \p len. | ||||||
|  | uint16_t crc16(const uint8_t *data, uint8_t len); | ||||||
|  |  | ||||||
| /// Calculate a FNV-1 hash of \p str. | /// Calculate a FNV-1 hash of \p str. | ||||||
| uint32_t fnv1_hash(const std::string &str); | uint32_t fnv1_hash(const std::string &str); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user