From 63246ee815f330e7f28d2353694aff2a94bd28be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Koek?= Date: Thu, 1 Feb 2024 15:57:56 +0000 Subject: [PATCH] Trial this --- .../ebyte_lora_e220/ebyte_lora_e220.cpp | 133 +++- .../ebyte_lora_e220/ebyte_lora_e220.h | 23 +- .../components/ebyte_lora_e220/lora_e220.cpp | 710 ------------------ .../components/ebyte_lora_e220/lora_e220.h | 213 ------ .../components/ebyte_lora_e220/state_naming.h | 418 ----------- 5 files changed, 133 insertions(+), 1364 deletions(-) delete mode 100644 esphome/components/ebyte_lora_e220/lora_e220.cpp delete mode 100644 esphome/components/ebyte_lora_e220/lora_e220.h delete mode 100644 esphome/components/ebyte_lora_e220/state_naming.h diff --git a/esphome/components/ebyte_lora_e220/ebyte_lora_e220.cpp b/esphome/components/ebyte_lora_e220/ebyte_lora_e220.cpp index 0c9ff3f356..ce1ac4a4d3 100644 --- a/esphome/components/ebyte_lora_e220/ebyte_lora_e220.cpp +++ b/esphome/components/ebyte_lora_e220/ebyte_lora_e220.cpp @@ -1,20 +1,112 @@ #pragma once -#include -#include -#include "esphome/core/component.h" -#include "esphome/components/sensor/sensor.h" -#include "esphome/components/text_sensor/text_sensor.h" -#include "esphome/core/helpers.h" -#include "esphome/components/uart/uart.h" -#include "esphome/core/log.h" -#include "lora_e220.h" #include "ebyte_lora_e220.h" namespace esphome { namespace ebyte_lora_e220 { -static const char *const TAG = "ebyte_lora_e220"; +void EbyteLoraE220::setup() { + if (this->pin_aux != nullptr) { + this->pin_aux->pin_mode(gpio::FLAG_INPUT); + ESP_LOGD(TAG, "Init AUX pin!"); + } + if (this->pin_m0 != nullptr) { + this->pin_m0->pin_mode(gpio::FLAG_OUTPUT); + ESP_LOGD(TAG, "Init M0 pin!"); + this->pin_m0->digital_write(true); + } + if (this->pin_m1 != nullptr) { + this->pin_m1->pin_mode(gpio::FLAG_OUTPUT); + ESP_LOGD(TAG, "Init M1 pin!"); + this->pin_m1->digital_write(true); + } + bool status = setMode(MODE_0_NORMAL); + ESP_LOGD(TAG, "setup success %s", status); +} +bool EbyteLoraE220::setMode(MODE_TYPE mode) { + // data sheet claims module needs some extra time after mode setting (2ms) + // most of my projects uses 10 ms, but 40ms is safer + + delay(40); + + if (this->pin_m0 == nullptr && this->pin_m1 == nullptr) { + ESP_LOGD(TAG, "The M0 and M1 pins is not set, this mean that you are connect directly the pins as you need!"); + } else { + switch (mode) { + case MODE_0_NORMAL: + // Mode 0 | normal operation + this->pin_m0->digital_write(false); + this->pin_m1->digital_write(false); + ESP_LOGD(TAG, "MODE NORMAL!"); + break; + case MODE_1_WOR_TRANSMITTER: + this->pin_m0->digital_write(true); + this->pin_m1->digital_write(false); + ESP_LOGD(TAG, "MODE WOR!"); + break; + case MODE_2_WOR_RECEIVER: + // case MODE_2_PROGRAM: + this->pin_m0->digital_write(false); + this->pin_m1->digital_write(true); + ESP_LOGD(TAG, "MODE RECEIVING!"); + break; + case MODE_3_CONFIGURATION: + // Mode 3 | Setting operation + this->pin_m0->digital_write(true); + this->pin_m1->digital_write(true); + ESP_LOGD(TAG, "MODE SLEEP CONFIG!"); + break; + + default: + return false; + } + } + // data sheet says 2ms later control is returned, let's give just a bit more time + // these modules can take time to activate pins + delay(40); + + // wait until aux pin goes back low + bool result = this->waitCompleteResponse(1000); + + if (result) { + this->mode = mode; + } else { + ESP_LOGD(TAG, "No success"); + return false; + } + + return true; +} +bool EbyteLoraE220::waitCompleteResponse(unsigned long timeout, unsigned int waitNoAux) { + unsigned long t = millis(); + + // make darn sure millis() is not about to reach max data type limit and start over + if (((unsigned long) (t + timeout)) == 0) { + t = 0; + } + + // if AUX pin was supplied and look for HIGH state + // note you can omit using AUX if no pins are available, but you will have to use delay() to let module finish + if (this->pin_aux != nullptr) { + while (this->pin_aux->digital_read() == false) { + if ((millis() - t) > timeout) { + ESP_LOGD(TAG, "Timeout error!"); + return false; + } + } + ESP_LOGD(TAG, "AUX HIGH!"); + } else { + // if you can't use aux pin, use 4K7 pullup with Arduino + // you may need to adjust this value if transmissions fail + delay(waitNoAux); + ESP_LOGD(TAG, "Wait no AUX pin!"); + } + + // per data sheet control after aux goes high is 2ms so delay for at least that long) + delay(20); + ESP_LOGD(TAG, "Complete!"); + return true; +} void EbyteLoraE220::dump_config() { ESP_LOGCONFIG(TAG, "Ebyte Lora E220"); LOG_PIN(" Aux pin: ", this->pin_aux); @@ -24,18 +116,17 @@ void EbyteLoraE220::dump_config() { void EbyteLoraE220::update() { // This will be called by App.loop() - if (e220ttl.available() > 1) { - // read the String message - lora_e220::ResponseContainer rc = e220ttl.receiveMessageRSSI(); - // Is something goes wrong print error - if (rc.status.code != 1) { - this->status_text_sensor->publish_state(rc.status.getResponseDescription()); - } else { - // Print the data received - this->status_text_sensor->publish_state(rc.status.getResponseDescription()); - this->message_text_sensor->publish_state(rc.data); - this->rssi_sensor->publish_state(rc.rssi); + if (this->available() > 1) { + std::string buffer; + uint8_t data; + while (this->available() > 0) { + if (this->read_byte(&data)) { + buffer += (char) data; + } } + ESP_LOGD(TAG, "%s", buffer); + this->message_text_sensor->publish_state(buffer.substr(0, buffer.length() - 1)); + this->rssi_sensor->publish_state(atoi(buffer.substr(buffer.length() - 1, 1).c_str())); } } diff --git a/esphome/components/ebyte_lora_e220/ebyte_lora_e220.h b/esphome/components/ebyte_lora_e220/ebyte_lora_e220.h index ccc27f4b15..d41e3354fe 100644 --- a/esphome/components/ebyte_lora_e220/ebyte_lora_e220.h +++ b/esphome/components/ebyte_lora_e220/ebyte_lora_e220.h @@ -7,25 +7,44 @@ #include "esphome/core/helpers.h" #include "esphome/components/uart/uart.h" #include "esphome/core/log.h" -#include "lora_e220.h" namespace esphome { namespace ebyte_lora_e220 { static const char *const TAG = "ebyte_lora_e220"; +// the mode the receiver is in +enum MODE_TYPE { + MODE_0_NORMAL = 0, + MODE_0_TRANSMISSION = 0, + MODE_1_WOR_TRANSMITTER = 1, + MODE_1_WOR = 1, + MODE_2_WOR_RECEIVER = 2, + MODE_2_POWER_SAVING = 2, + MODE_3_CONFIGURATION = 3, + MODE_3_PROGRAM = 3, + MODE_3_SLEEP = 3, + MODE_INIT = 0xFF +}; class EbyteLoraE220 : public PollingComponent, public uart::UARTDevice { public: - lora_e220::LoRa_E220 e220ttl = lora_e220::LoRa_E220(this, pin_aux, pin_m0, pin_m1); // SERIAL AUX M0 M1 void set_message_sensor(text_sensor::TextSensor *s) { message_text_sensor = s; } void set_status_sensor(text_sensor::TextSensor *s) { status_text_sensor = s; } void set_rssi_sensor(sensor::Sensor *s) { rssi_sensor = s; } void set_pin_aux(GPIOPin *s) { pin_aux = s; } void set_pin_m0(GPIOPin *s) { pin_m0 = s; } void set_pin_m1(GPIOPin *s) { pin_m1 = s; } + void setup() override; void dump_config() override; void update() override; + private: + MODE_TYPE mode = MODE_0_NORMAL; + // set WOR mode + bool setMode(MODE_TYPE type); + // checks the aux port to see if it is done setting + bool waitCompleteResponse(unsigned long timeout = 1000, unsigned int waitNoAux = 100); + protected: std::vector buffer_; text_sensor::TextSensor *message_text_sensor; diff --git a/esphome/components/ebyte_lora_e220/lora_e220.cpp b/esphome/components/ebyte_lora_e220/lora_e220.cpp deleted file mode 100644 index a78a613764..0000000000 --- a/esphome/components/ebyte_lora_e220/lora_e220.cpp +++ /dev/null @@ -1,710 +0,0 @@ -#include "lora_e220.h" -#define bitRead(value, bit) (((value) >> (bit)) & 0x01) -namespace esphome { -namespace lora_e220 { -LoRa_E220::LoRa_E220(esphome::uart::UARTDevice *serial, GPIOPin *auxPin, GPIOPin *m0Pin, - GPIOPin *m1Pin) { //, uint32_t serialConfig - this->serial = serial; - this->auxPin = auxPin; - - this->m0Pin = m0Pin; - this->m1Pin = m1Pin; -} -bool LoRa_E220::begin() { - if (this->auxPin != nullptr) { - this->m0Pin->pin_mode(gpio::FLAG_INPUT); - ESP_LOGD(TAG, "Init AUX pin!"); - } - if (this->m0Pin != nullptr) { - this->m0Pin->pin_mode(gpio::FLAG_OUTPUT); - ESP_LOGD(TAG, "Init M0 pin!"); - this->m0Pin->digital_write(true); - } - if (this->m1Pin != nullptr) { - this->m0Pin->pin_mode(gpio::FLAG_OUTPUT); - ESP_LOGD(TAG, "Init M1 pin!"); - this->m1Pin->digital_write(true); - } - - ESP_LOGD(TAG, "Begin ex"); - - state_naming::Status status = setMode(MODE_0_NORMAL); - return status == state_naming::E220_SUCCESS; -} - -/* - -Utility method to wait until module is doen tranmitting -a timeout is provided to avoid an infinite loop - -*/ - -state_naming::Status LoRa_E220::waitCompleteResponse(unsigned long timeout, unsigned int waitNoAux) { - state_naming::Status result = state_naming::E220_SUCCESS; - - unsigned long t = millis(); - - // make darn sure millis() is not about to reach max data type limit and start over - if (((unsigned long) (t + timeout)) == 0) { - t = 0; - } - - // if AUX pin was supplied and look for HIGH state - // note you can omit using AUX if no pins are available, but you will have to use delay() to let module finish - if (this->auxPin != -1) { - while (this->auxPin->digital_read() == false) { - if ((millis() - t) > timeout) { - result = state_naming::ERR_E220_TIMEOUT; - ESP_LOGD(TAG, "Timeout error!"); - return result; - } - } - ESP_LOGD(TAG, "AUX HIGH!"); - } else { - // if you can't use aux pin, use 4K7 pullup with Arduino - // you may need to adjust this value if transmissions fail - this->managedDelay(waitNoAux); - ESP_LOGD(TAG, "Wait no AUX pin!"); - } - - // per data sheet control after aux goes high is 2ms so delay for at least that long) - this->managedDelay(20); - ESP_LOGD(TAG, "Complete!"); - return result; -} - -/* - -delay() in a library is not a good idea as it can stop interrupts -just poll internal time until timeout is reached - -*/ - -void LoRa_E220::managedDelay(unsigned long timeout) { - unsigned long t = millis(); - - // make darn sure millis() is not about to reach max data type limit and start over - if (((unsigned long) (t + timeout)) == 0) { - t = 0; - } - - while ((millis() - t) < timeout) { - } -} - -/* - -Method to indicate availability - -*/ - -int LoRa_E220::available() { return this->serial->available(); } - -void LoRa_E220::flush() { this->serial->flush(); } - -void LoRa_E220::cleanUARTBuffer() { - while (this->serial->available()) { - this->serial->read(); - } -} - -/* - -Method to send a chunk of data provided data is in a struct--my personal favorite as you -need not parse or worry about sprintf() inability to handle floats - -TTP: put your structure definition into a .h file and include in both the sender and reciever -sketches - -NOTE: of your sender and receiver MCU's are different (Teensy and Arduino) caution on the data -types each handle ints floats differently - -*/ - -state_naming::Status LoRa_E220::sendStruct(void *structureManaged, uint16_t size_) { - if (size_ > MAX_SIZE_TX_PACKET + 2) { - return state_naming::ERR_E220_PACKET_TOO_BIG; - } - - Status result = state_naming::E220_SUCCESS; - - uint8_t len = this->serial->write((uint8_t *) structureManaged, size_); - if (len != size_) { - ESP_LOGD(TAG, "Send... len:") - ESP_LOGD(TAG, "%d", len); - ESP_LOGD(TAG, " size:") - ESP_LOGD(TAG, "%d", size_); - if (len == 0) { - result = state_naming::ERR_E220_NO_RESPONSE_FROM_DEVICE; - } else { - result = state_naming::ERR_E220_DATA_SIZE_NOT_MATCH; - } - } - if (result != state_naming::E220_SUCCESS) - return result; - - result = this->waitCompleteResponse(5000, 5000); - if (result != state_naming::E220_SUCCESS) - return result; - ESP_LOGD(TAG, "Clear buffer...") - this->cleanUARTBuffer(); - - ESP_LOGD(TAG, "ok!") - - return result; -} - -/* - -Method to get a chunk of data provided data is in a struct--my personal favorite as you -need not parse or worry about sprintf() inability to handle floats - -TTP: put your structure definition into a .h file and include in both the sender and reciever -sketches - -NOTE: of your sender and receiver MCU's are different (Teensy and Arduino) caution on the data -types each handle ints floats differently - -*/ - -state_naming::Status LoRa_E220::receiveStruct(void *structureManaged, uint16_t size_) { - Status result = state_naming::E220_SUCCESS; - - uint8_t len = this->serialDef.stream->readBytes((uint8_t *) structureManaged, size_); - - ESP_LOGD(TAG, "Available buffer: "); - ESP_LOGD(TAG, "%d", len); - ESP_LOGD(TAG, " structure size: "); - ESP_LOGD(TAG, "%d", size_); - - if (len != size_) { - if (len == 0) { - result = state_naming::ERR_E220_NO_RESPONSE_FROM_DEVICE; - } else { - result = state_naming::ERR_E220_DATA_SIZE_NOT_MATCH; - } - } - if (result != state_naming::E220_SUCCESS) - return result; - - result = this->waitCompleteResponse(1000); - if (result != state_naming::E220_SUCCESS) - return result; - - return result; -} - -/* - -method to set the mode (program, normal, etc.) - -*/ - -state_naming::Status LoRa_E220::setMode(MODE_TYPE mode) { - // data sheet claims module needs some extra time after mode setting (2ms) - // most of my projects uses 10 ms, but 40ms is safer - - this->managedDelay(40); - - if (this->m0Pin == -1 && this->m1Pin == -1) { - ESP_LOGD(TAG, "The M0 and M1 pins is not set, this mean that you are connect directly the pins as you need!") - } else { - switch (mode) { - case MODE_0_NORMAL: - // Mode 0 | normal operation - this->m0Pin->digital_write(false); - this->m1Pin->digital_write(false); - ESP_LOGD(TAG, "MODE NORMAL!"); - break; - case MODE_1_WOR_TRANSMITTER: - this->m0Pin->digital_write(true); - this->m1Pin->digital_write(false); - ESP_LOGD(TAG, "MODE WOR!"); - break; - case MODE_2_WOR_RECEIVER: - // case MODE_2_PROGRAM: - this->m0Pin->digital_write(false); - this->m1Pin->digital_write(true); - ESP_LOGD(TAG, "MODE RECEIVING!"); - break; - case MODE_3_CONFIGURATION: - // Mode 3 | Setting operation - this->m0Pin->digital_write(true); - this->m1Pin->digital_write(true); - ESP_LOGD(TAG, "MODE SLEEP CONFIG!"); - break; - - default: - return state_naming::ERR_E220_INVALID_PARAM; - } - } - // data sheet says 2ms later control is returned, let's give just a bit more time - // these modules can take time to activate pins - this->managedDelay(40); - - // wait until aux pin goes back low - state_naming::Status res = this->waitCompleteResponse(1000); - - if (res == state_naming::E220_SUCCESS) { - this->mode = mode; - } - - return res; -} - -MODE_TYPE LoRa_E220::getMode() { return this->mode; } - -bool LoRa_E220::writeProgramCommand(PROGRAM_COMMAND cmd, REGISTER_ADDRESS addr, PACKET_LENGHT pl) { - uint8_t CMD[3] = {cmd, addr, pl}; - uint8_t size = this->serial->write_array(CMD, 3); - - ESP_LOGD(TAG, "%d", size); - - this->managedDelay(50); // need ti check - - return size != 2; -} - -ResponseStructContainer LoRa_E220::getConfiguration() { - ResponseStructContainer rc; - - rc.status.code = checkUARTConfiguration(MODE_3_PROGRAM); - if (rc.status.code != state_naming::E220_SUCCESS) - return rc; - - MODE_TYPE prevMode = this->mode; - - rc.status.code = this->setMode(MODE_3_PROGRAM); - if (rc.status.code != state_naming::E220_SUCCESS) - return rc; - - this->writeProgramCommand(READ_CONFIGURATION, REG_ADDRESS_CFG, PL_CONFIGURATION); - - rc.data = malloc(sizeof(Configuration)); - rc.status.code = this->receiveStruct((uint8_t *) rc.data, sizeof(Configuration)); - -#ifdef LoRa_E220_DEBUG - this->printParameters((Configuration *) rc.data); -#endif - - if (rc.status.code != state_naming::E220_SUCCESS) { - this->setMode(prevMode); - return rc; - } - - rc.status.code = this->setMode(prevMode); - if (rc.status.code != state_naming::E220_SUCCESS) - return rc; - - if (WRONG_FORMAT == ((Configuration *) rc.data)->COMMAND) { - rc.status.code = state_naming::ERR_E220_WRONG_FORMAT; - } - if (RETURNED_COMMAND != ((Configuration *) rc.data)->COMMAND || - REG_ADDRESS_CFG != ((Configuration *) rc.data)->STARTING_ADDRESS || - PL_CONFIGURATION != ((Configuration *) rc.data)->LENGHT) { - rc.status.code = state_naming::ERR_E220_HEAD_NOT_RECOGNIZED; - } - - return rc; -} - -state_naming::RESPONSE_STATUS LoRa_E220::checkUARTConfiguration(MODE_TYPE mode) { - if (mode == MODE_3_PROGRAM) { - return state_naming::ERR_E220_WRONG_UART_CONFIG; - } - return state_naming::E220_SUCCESS; -} - -ResponseStatus LoRa_E220::setConfiguration(Configuration configuration, PROGRAM_COMMAND saveType) { - ResponseStatus rc; - - rc.code = checkUARTConfiguration(MODE_3_PROGRAM); - if (rc.code != state_naming::E220_SUCCESS) - return rc; - - MODE_TYPE prevMode = this->mode; - - rc.code = this->setMode(MODE_3_PROGRAM); - if (rc.code != state_naming::E220_SUCCESS) - return rc; - - // this->writeProgramCommand(saveType, REG_ADDRESS_CFG); - - // configuration.HEAD = saveType; - configuration.COMMAND = saveType; - configuration.STARTING_ADDRESS = REG_ADDRESS_CFG; - configuration.LENGHT = PL_CONFIGURATION; - - rc.code = this->sendStruct((uint8_t *) &configuration, sizeof(Configuration)); - if (rc.code != state_naming::E220_SUCCESS) { - this->setMode(prevMode); - return rc; - } - - rc.code = this->receiveStruct((uint8_t *) &configuration, sizeof(Configuration)); - -#ifdef LoRa_E220_DEBUG - this->printParameters((Configuration *) &configuration); -#endif - - rc.code = this->setMode(prevMode); - if (rc.code != state_naming::E220_SUCCESS) - return rc; - - if (WRONG_FORMAT == ((Configuration *) &configuration)->COMMAND) { - rc.code = state_naming::ERR_E220_WRONG_FORMAT; - } - if (RETURNED_COMMAND != ((Configuration *) &configuration)->COMMAND || - REG_ADDRESS_CFG != ((Configuration *) &configuration)->STARTING_ADDRESS || - PL_CONFIGURATION != ((Configuration *) &configuration)->LENGHT) { - rc.code = state_naming::ERR_E220_HEAD_NOT_RECOGNIZED; - } - - return rc; -} - -ResponseStructContainer LoRa_E220::getModuleInformation() { - ResponseStructContainer rc; - - rc.status.code = checkUARTConfiguration(MODE_3_PROGRAM); - if (rc.status.code != state_naming::E220_SUCCESS) - return rc; - - MODE_TYPE prevMode = this->mode; - - rc.status.code = this->setMode(MODE_3_PROGRAM); - if (rc.status.code != state_naming::E220_SUCCESS) - return rc; - - this->writeProgramCommand(READ_CONFIGURATION, REG_ADDRESS_PID, PL_PID); - - rc.data = malloc(sizeof(ModuleInformation)); - - rc.status.code = this->receiveStruct((uint8_t *) rc.data, sizeof(ModuleInformation)); - if (rc.status.code != state_naming::E220_SUCCESS) { - this->setMode(prevMode); - return rc; - } - - rc.status.code = this->setMode(prevMode); - if (rc.status.code != state_naming::E220_SUCCESS) - return rc; - - // this->printParameters(*configuration); - - if (WRONG_FORMAT == ((ModuleInformation *) rc.data)->COMMAND) { - rc.status.code = state_naming::ERR_E220_WRONG_FORMAT; - } - if (RETURNED_COMMAND != ((ModuleInformation *) rc.data)->COMMAND || - REG_ADDRESS_PID != ((ModuleInformation *) rc.data)->STARTING_ADDRESS || - PL_PID != ((ModuleInformation *) rc.data)->LENGHT) { - rc.status.code = state_naming::ERR_E220_HEAD_NOT_RECOGNIZED; - } - - ESP_LOGD(TAG, "----------------------------------------"); - ESP_LOGD(TAG, "HEAD: "); - ESP_LOGD(TAG, "%d", ((ModuleInformation *) rc.data)->COMMAND); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, "%d", ((ModuleInformation *) rc.data)->STARTING_ADDRESS); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, "%s", format_hex_pretty(((ModuleInformation *) rc.data)->LENGHT).c_str()); - - ESP_LOGD(TAG, "Model no.: "); - ESP_LOGD(TAG, "%s", format_hex_pretty(((ModuleInformation *) rc.data)->model).c_str()); - ESP_LOGD(TAG, "Version : "); - ESP_LOGD(TAG, "%s", format_hex_pretty(((ModuleInformation *) rc.data)->version).c_str()); - ESP_LOGD(TAG, "Features : "); - ESP_LOGD(TAG, "%s", format_hex_pretty(((ModuleInformation *) rc.data)->features).c_str()); - ESP_LOGD(TAG, "Status : "); - ESP_LOGD(TAG, rc.status.getResponseDescription()); - ESP_LOGD(TAG, "----------------------------------------"); - return rc; -} - -ResponseStatus LoRa_E220::resetModule() { - ESP_LOGD(TAG, "No information to reset module!"); - ResponseStatus status; - status.code = state_naming::ERR_E220_NOT_IMPLEMENT; - return status; -} - -state_naming::ResponseContainer LoRa_E220::receiveMessage() { return LoRa_E220::receiveMessageComplete(false); } -state_naming::ResponseContainer LoRa_E220::receiveMessageRSSI() { return LoRa_E220::receiveMessageComplete(true); } - -state_naming::ResponseContainer LoRa_E220::receiveMessageComplete(bool rssiEnabled) { - ResponseContainer rc; - rc.status.code = state_naming::E220_SUCCESS; - std::string buffer; - uint8_t data; - while (this->available() > 0) { - if (this->read_byte(&data)) { - buffer += (char) data; - } - } - ESP_LOGD(TAG, buffer); - - if (rssiEnabled) { - rc.rssi = buffer.charAt(tmpData.length() - 1); - rc.data = buffer.substd::string(0, tmpData.length() - 1); - } else { - rc.data = tmpData; - } - this->cleanUARTBuffer(); - if (rc.status.code != state_naming::E220_SUCCESS) { - return rc; - } - - // rc.data = message; // malloc(sizeof (moduleInformation)); - - return rc; -} - -state_naming::ResponseContainer LoRa_E220::receiveInitialMessage(uint8_t size) { - ResponseContainer rc; - rc.status.code = state_naming::E220_SUCCESS; - char buff[size]; - uint8_t len = this->serialDef.stream->readBytes(buff, size); - if (len != size) { - if (len == 0) { - rc.status.code = state_naming::ERR_E220_NO_RESPONSE_FROM_DEVICE; - } else { - rc.status.code = state_naming::ERR_E220_DATA_SIZE_NOT_MATCH; - } - return rc; - } - - rc.data = buff; // malloc(sizeof (moduleInformation)); - - return rc; -} - -state_naming::ResponseStructContainer LoRa_E220::receiveMessage(const uint8_t size) { - return LoRa_E220::receiveMessageComplete(size, false); -} -state_naming::ResponseStructContainer LoRa_E220::receiveMessageRSSI(const uint8_t size) { - return LoRa_E220::receiveMessageComplete(size, true); -} - -state_naming::ResponseStructContainer LoRa_E220::receiveMessageComplete(const uint8_t size, bool rssiEnabled) { - ResponseStructContainer rc; - - rc.data = malloc(size); - rc.status.code = this->receiveStruct((uint8_t *) rc.data, size); - if (rc.status.code != state_naming::E220_SUCCESS) { - return rc; - } - - if (rssiEnabled) { - char rssi[1]; - this->serial->read_bytes(rssi, 1); - rc.rssi = rssi[0]; - } - this->cleanUARTBuffer(); - - return rc; -} - -ResponseStatus LoRa_E220::sendMessage(const void *message, const uint8_t size) { - ResponseStatus status; - status.code = this->sendStruct((uint8_t *) message, size); - if (status.code != state_naming::E220_SUCCESS) - return status; - - return status; -} -ResponseStatus LoRa_E220::sendMessage(const std::string message) { - ESP_LOGD(TAG, "Send message: "); - ESP_LOGD(TAG, message); - uint8_t size = message.length(); // sizeof(message.c_str())+1; - ESP_LOGD(TAG, " size: "); - ESP_LOGD(TAG, "%d", size); - char messageFixed[size]; - memcpy(messageFixed, message.c_str(), size); - ESP_LOGD(TAG, " memcpy "); - - ResponseStatus status; - status.code = this->sendStruct((uint8_t *) &messageFixed, size); - if (status.code != state_naming::E220_SUCCESS) - return status; - - // free(messageFixed); - return status; -} - -ResponseStatus LoRa_E220::sendFixedMessage(uint8_t ADDH, uint8_t ADDL, uint8_t CHAN, const std::string message) { - uint8_t size = message.length(); - char messageFixed[size]; - memcpy(messageFixed, message.c_str(), size); - return this->sendFixedMessage(ADDH, ADDL, CHAN, (uint8_t *) messageFixed, size); -} -ResponseStatus LoRa_E220::sendBroadcastFixedMessage(uint8_t CHAN, const std::string message) { - return this->sendFixedMessage(state_naming::BROADCAST_ADDRESS, state_naming::BROADCAST_ADDRESS, CHAN, message); -} - -typedef struct fixedStransmission { - uint8_t ADDH = 0; - uint8_t ADDL = 0; - uint8_t CHAN = 0; - unsigned char message[]; -} FixedStransmission; - -FixedStransmission *init_stack(int m) { - FixedStransmission *st = (FixedStransmission *) malloc(sizeof(FixedStransmission) + m * sizeof(int)); - return st; -} - -ResponseStatus LoRa_E220::sendFixedMessage(uint8_t ADDH, uint8_t ADDL, uint8_t CHAN, const void *message, - const uint8_t size) { - ESP_LOGD(TAG, ADDH); - FixedStransmission *fixedStransmission = init_stack(size); - fixedStransmission->ADDH = ADDH; - fixedStransmission->ADDL = ADDL; - fixedStransmission->CHAN = CHAN; - memcpy(fixedStransmission->message, (unsigned char *) message, size); - ResponseStatus status; - status.code = this->sendStruct((uint8_t *) fixedStransmission, size + 3); - free(fixedStransmission); - if (status.code != state_naming::E220_SUCCESS) - return status; - - return status; -} - -ConfigurationMessage *init_stack_conf(int m) { - ConfigurationMessage *st = (ConfigurationMessage *) malloc(sizeof(ConfigurationMessage) + m * sizeof(int)); - return st; -} - -ResponseStatus LoRa_E220::sendConfigurationMessage(uint8_t ADDH, uint8_t ADDL, uint8_t CHAN, - Configuration *configuration, PROGRAM_COMMAND programCommand) { - ResponseStatus rc; - - configuration->COMMAND = programCommand; - configuration->STARTING_ADDRESS = REG_ADDRESS_CFG; - configuration->LENGHT = PL_CONFIGURATION; - - ConfigurationMessage *fixedStransmission = init_stack_conf(sizeof(Configuration)); - - memcpy(fixedStransmission->message, (unsigned char *) configuration, sizeof(Configuration)); - - fixedStransmission->specialCommand1 = SPECIAL_WIFI_CONF_COMMAND; - fixedStransmission->specialCommand2 = SPECIAL_WIFI_CONF_COMMAND; - - ESP_LOGD(TAG, "%d", sizeof(Configuration) + 2); - - rc = sendFixedMessage(ADDH, ADDL, CHAN, fixedStransmission, sizeof(Configuration) + 2); - return rc; -} - -ResponseStatus LoRa_E220::sendBroadcastFixedMessage(uint8_t CHAN, const void *message, const uint8_t size) { - return this->sendFixedMessage(0xFF, 0xFF, CHAN, message, size); -} - -#define KeeLoq_NLF 0x3A5C742E - -unsigned long LoRa_E220::encrypt(unsigned long data) { - unsigned long x = data; - unsigned long r; - int keyBitNo, index; - unsigned long keyBitVal, bitVal; - - for (r = 0; r < 528; r++) { - keyBitNo = r & 63; - if (keyBitNo < 32) - keyBitVal = bitRead(this->halfKeyloqKey, keyBitNo); // key low - else - keyBitVal = bitRead(this->halfKeyloqKey, keyBitNo - 32); // key hight - index = 1 * bitRead(x, 1) + 2 * bitRead(x, 9) + 4 * bitRead(x, 20) + 8 * bitRead(x, 26) + 16 * bitRead(x, 31); - bitVal = bitRead(x, 0) ^ bitRead(x, 16) ^ bitRead(KeeLoq_NLF, index) ^ keyBitVal; - x = (x >> 1) ^ bitVal << 31; - } - return x; -} - -unsigned long LoRa_E220::decrypt(unsigned long data) { - unsigned long x = data; - unsigned long r; - int keyBitNo, index; - unsigned long keyBitVal, bitVal; - - for (r = 0; r < 528; r++) { - keyBitNo = (15 - r) & 63; - if (keyBitNo < 32) - keyBitVal = bitRead(this->halfKeyloqKey, keyBitNo); // key low - else - keyBitVal = bitRead(this->halfKeyloqKey, keyBitNo - 32); // key hight - index = 1 * bitRead(x, 0) + 2 * bitRead(x, 8) + 4 * bitRead(x, 19) + 8 * bitRead(x, 25) + 16 * bitRead(x, 30); - bitVal = bitRead(x, 31) ^ bitRead(x, 15) ^ bitRead(KeeLoq_NLF, index) ^ keyBitVal; - x = (x << 1) ^ bitVal; - } - return x; -} -#ifdef LoRa_E220_DEBUG -void LoRa_E220::printParameters(struct Configuration *configuration) { - ESP_LOGD(TAG, "----------------------------------------"); - - ESP_LOGD(TAG, "HEAD : "); - ESP_LOGD(TAG, "%s", format_hex_pretty(configuration->COMMAND).c_str()); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, format_hex_pretty(configuration->STARTING_ADDRESS).c_str()); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, format_hex_pretty(configuration->LENGHT).c_str()); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, "AddH : "); - ESP_LOGD(TAG, format_hex_pretty(configuration->ADDH).c_str(); - ESP_LOGD(TAG, "AddL : "); - ESP_LOGD(TAG, format_hex_pretty(configuration->ADDL).c_str()); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, "Chan : "); - ESP_LOGD(TAG, "%d", configuration->CHAN); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->getChannelDescription()); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, "SpeedParityBit : "); - ESP_LOGD(TAG, "%d", configuration->SPED.uartParity); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->SPED.getUARTParityDescription()); - ESP_LOGD(TAG, "SpeedUARTDatte : "); - ESP_LOGD(TAG,"%d", configuration->SPED.uartBaudRate); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->SPED.getUARTBaudRateDescription()); - ESP_LOGD(TAG, "SpeedAirDataRate : "); - ESP_LOGD(TAG,"%d", configuration->SPED.airDataRate); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->SPED.getAirDataRateDescription()); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, "OptionSubPacketSett: "); - ESP_LOGD(TAG,"%d", configuration->OPTION.subPacketSetting); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->OPTION.getSubPacketSetting()); - ESP_LOGD(TAG, "OptionTranPower : "); - ESP_LOGD(TAG, configuration->OPTION.transmissionPower); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->OPTION.getTransmissionPowerDescription()); - ESP_LOGD(TAG, "OptionRSSIAmbientNo: "); - ESP_LOGD(TAG,"%d", configuration->OPTION.RSSIAmbientNoise); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->OPTION.getRSSIAmbientNoiseEnable()); - ESP_LOGD(TAG, " "); - ESP_LOGD(TAG, "TransModeWORPeriod : "); - ESP_LOGD(TAG,"%d", configuration->TRANSMISSION_MODE.WORPeriod); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.getWORPeriodByParamsDescription()); - ESP_LOGD(TAG, "TransModeEnableLBT : "); - ESP_LOGD(TAG,"%d", configuration->TRANSMISSION_MODE.enableLBT); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.getLBTEnableByteDescription()); - ESP_LOGD(TAG, "TransModeEnableRSSI: "); - ESP_LOGD(TAG, "%d", configuration->TRANSMISSION_MODE.enableRSSI); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.getRSSIEnableByteDescription()); - ESP_LOGD(TAG, "TransModeFixedTrans: "); - ESP_LOGD(TAG, "%d", configuration->TRANSMISSION_MODE.fixedTransmission); - ESP_LOGD(TAG, " -> "); - ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.getFixedTransmissionDescription()); - - ESP_LOGD(TAG, "----------------------------------------"); -} -#endif -} // namespace lora_e220 -} // namespace esphome diff --git a/esphome/components/ebyte_lora_e220/lora_e220.h b/esphome/components/ebyte_lora_e220/lora_e220.h deleted file mode 100644 index 967aeaec7c..0000000000 --- a/esphome/components/ebyte_lora_e220/lora_e220.h +++ /dev/null @@ -1,213 +0,0 @@ -#pragma once -#include -#include -#include -#include "state_naming.h" -#include "esphome/core/component.h" -#include "esphome/components/uart/uart.h" -namespace esphome { -namespace lora_e220 { - -#define MAX_SIZE_TX_PACKET 200 - -static const char *const TAG = "ebyte_lora_e220"; -enum MODE_TYPE { - MODE_0_NORMAL = 0, - MODE_0_TRANSMISSION = 0, - MODE_1_WOR_TRANSMITTER = 1, - MODE_1_WOR = 1, - MODE_2_WOR_RECEIVER = 2, - MODE_2_POWER_SAVING = 2, - MODE_3_CONFIGURATION = 3, - MODE_3_PROGRAM = 3, - MODE_3_SLEEP = 3, - MODE_INIT = 0xFF -}; - -enum PROGRAM_COMMAND { - WRITE_CFG_PWR_DWN_SAVE = 0xC0, - READ_CONFIGURATION = 0xC1, - WRITE_CFG_PWR_DWN_LOSE = 0xC2, - WRONG_FORMAT = 0xFF, - RETURNED_COMMAND = 0xC1, - SPECIAL_WIFI_CONF_COMMAND = 0xCF -}; - -enum REGISTER_ADDRESS { - REG_ADDRESS_CFG = 0x00, - REG_ADDRESS_SPED = 0x02, - REG_ADDRESS_TRANS_MODE = 0x03, - REG_ADDRESS_CHANNEL = 0x04, - REG_ADDRESS_OPTION = 0x05, - REG_ADDRESS_CRYPT = 0x06, - REG_ADDRESS_PID = 0x08 -}; - -enum PACKET_LENGHT { - PL_CONFIGURATION = 0x08, - - PL_SPED = 0x01, - PL_OPTION = 0x01, - PL_TRANSMISSION_MODE = 0x01, - PL_CHANNEL = 0x01, - PL_CRYPT = 0x02, - PL_PID = 0x03 -}; - -struct Speed { - uint8_t airDataRate : 3; // bit 0-2 - std::string getAirDataRateDescription() { return state_naming::getAirDataRateDescriptionByParams(this->airDataRate); } - - uint8_t uartParity : 2; // bit 3-4 - std::string getUARTParityDescription() { return state_naming::getUARTParityDescriptionByParams(this->uartParity); } - - uint8_t uartBaudRate : 3; // bit 5-7 - std::string getUARTBaudRateDescription() { - return state_naming::getUARTBaudRateDescriptionByParams(this->uartBaudRate); - } -}; - -struct TransmissionMode { - uint8_t WORPeriod : 3; // bit 2,1,0 - std::string getWORPeriodByParamsDescription() { return state_naming::getWORPeriodByParams(this->WORPeriod); } - uint8_t reserved2 : 1; // bit 3 - uint8_t enableLBT : 1; // bit 4 - std::string getLBTEnableByteDescription() { return state_naming::getLBTEnableByteByParams(this->enableLBT); } - uint8_t reserved : 1; // bit 5 - - uint8_t fixedTransmission : 1; // bit 6 - std::string getFixedTransmissionDescription() { - return state_naming::getFixedTransmissionDescriptionByParams(this->fixedTransmission); - } - - uint8_t enableRSSI : 1; // bit 7 - std::string getRSSIEnableByteDescription() { return state_naming::getRSSIEnableByteByParams(this->enableRSSI); } -}; - -struct Option { - uint8_t transmissionPower : 2; // bit 0-1 - std::string getTransmissionPowerDescription() { - return state_naming::getTransmissionPowerDescriptionByParams(this->transmissionPower); - } - uint8_t reserved : 3; // bit 2-4 - - uint8_t RSSIAmbientNoise : 1; // bit 5 - std::string getRSSIAmbientNoiseEnable() { - return state_naming::getRSSIAmbientNoiseEnableByParams(this->RSSIAmbientNoise); - } - - uint8_t subPacketSetting : 2; // bit 6-7 - std::string getSubPacketSetting() { return state_naming::getSubPacketSettingByParams(this->subPacketSetting); } -}; - -struct Crypt { - uint8_t CRYPT_H = 0; - uint8_t CRYPT_L = 0; -}; - -struct Configuration { - uint8_t COMMAND = 0; - uint8_t STARTING_ADDRESS = 0; - uint8_t LENGHT = 0; - - uint8_t ADDH = 0; - uint8_t ADDL = 0; - - struct Speed SPED; - struct Option OPTION; - - uint8_t CHAN = 0; - std::string getChannelDescription() { return std::string(this->CHAN + OPERATING_FREQUENCY + "MHz"); } - - struct TransmissionMode TRANSMISSION_MODE; - - struct Crypt CRYPT; -}; - -struct ModuleInformation { - uint8_t COMMAND = 0; - uint8_t STARTING_ADDRESS = 0; - uint8_t LENGHT = 0; - - uint8_t model = 0; - uint8_t version = 0; - uint8_t features = 0; -}; - -struct ResponseStatus { - uint8_t code; - std::string getResponseDescription() { return state_naming::getResponseDescriptionByParams(this->code); } -}; - -struct ResponseStructContainer { - void *data; - uint8_t rssi; - ResponseStatus status; - void close() { free(this->data); } -}; -struct ResponseContainer { - std::string data; - uint8_t rssi; - ResponseStatus status; -}; - -struct ConfigurationMessage { - uint8_t specialCommand1 = 0xCF; - uint8_t specialCommand2 = 0xCF; - - unsigned char message[]; -}; - -class LoRa_E220 { - public: - LoRa_E220(uart::UARTDevice *device, GPIOPin *auxPin, GPIOPin *m0Pin, GPIOPin *m1Pin); - bool begin(); - state_naming::Status setMode(MODE_TYPE mode); - MODE_TYPE getMode(); - ResponseStructContainer getConfiguration(); - ResponseStatus setConfiguration(Configuration configuration, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE); - ResponseStructContainer getModuleInformation(); - ResponseStatus resetModule(); - ResponseStatus sendMessage(const void *message, const uint8_t size); - ResponseContainer receiveMessageUntil(char delimiter = '\0'); - ResponseStructContainer receiveMessage(const uint8_t size); - ResponseStructContainer receiveMessageRSSI(const uint8_t size); - ResponseStructContainer receiveMessageComplete(const uint8_t size, bool enableRSSI); - ResponseContainer receiveMessageComplete(bool enableRSSI); - ResponseStatus sendMessage(const std::string message); - ResponseContainer receiveMessage(); - ResponseContainer receiveMessageRSSI(); - ResponseStatus sendFixedMessage(uint8_t ADDH, uint8_t ADDL, uint8_t CHAN, const std::string message); - ResponseStatus sendFixedMessage(uint8_t ADDH, uint8_t ADDL, uint8_t CHAN, const void *message, const uint8_t size); - ResponseStatus sendBroadcastFixedMessage(uint8_t CHAN, const void *message, const uint8_t size); - ResponseStatus sendBroadcastFixedMessage(uint8_t CHAN, const std::string message); - ResponseContainer receiveInitialMessage(const uint8_t size); - ResponseStatus sendConfigurationMessage(uint8_t ADDH, uint8_t ADDL, uint8_t CHAN, Configuration *configuration, - PROGRAM_COMMAND programCommand = WRITE_CFG_PWR_DWN_SAVE); - int available(); - - private: - uart::UARTDevice *serial; - GPIOPin *auxPin; - GPIOPin *m0Pin; - GPIOPin *m1Pin; - - unsigned long halfKeyloqKey = 0x06660708; - unsigned long encrypt(unsigned long data); - unsigned long decrypt(unsigned long data); - - MODE_TYPE mode = MODE_0_NORMAL; - - void managedDelay(unsigned long timeout); - state_naming::Status waitCompleteResponse(unsigned long timeout = 1000, unsigned int waitNoAux = 100); - void flush(); - void cleanUARTBuffer(); - - state_naming::Status sendStruct(void *structureManaged, uint16_t size_); - state_naming::Status receiveStruct(void *structureManaged, uint16_t size_); - bool writeProgramCommand(PROGRAM_COMMAND cmd, REGISTER_ADDRESS addr, PACKET_LENGHT pl); - - state_naming::RESPONSE_STATUS checkUARTConfiguration(MODE_TYPE mode); -}; -} // namespace lora_e220 -} // namespace esphome diff --git a/esphome/components/ebyte_lora_e220/state_naming.h b/esphome/components/ebyte_lora_e220/state_naming.h deleted file mode 100644 index 868ceb0c0e..0000000000 --- a/esphome/components/ebyte_lora_e220/state_naming.h +++ /dev/null @@ -1,418 +0,0 @@ -#include -#include -#include -namespace esphome { -namespace state_naming { - -#ifdef FREQUENCY_433 -#define OPERATING_FREQUENCY 410 -#elif defined(FREQUENCY_400) -#define OPERATING_FREQUENCY 410 -#elif defined(FREQUENCY_230) -#define OPERATING_FREQUENCY 220 -#elif defined(FREQUENCY_868) -#define OPERATING_FREQUENCY 850 -#elif defined(FREQUENCY_900) -#define OPERATING_FREQUENCY 850 -#elif defined(FREQUENCY_915) -#define OPERATING_FREQUENCY 900 -#else -#define OPERATING_FREQUENCY 410 -#endif - -#define BROADCAST_ADDRESS 255 - -typedef enum RESPONSE_STATUS { -#ifndef ARDUINO_ARCH_STM32 - SUCCESS = 1, -#endif - E220_SUCCESS = 1, - ERR_E220_UNKNOWN, /* something shouldn't happened */ - ERR_E220_NOT_SUPPORT, - ERR_E220_NOT_IMPLEMENT, - ERR_E220_NOT_INITIAL, - ERR_E220_INVALID_PARAM, - ERR_E220_DATA_SIZE_NOT_MATCH, - ERR_E220_BUF_TOO_SMALL, - ERR_E220_TIMEOUT, - ERR_E220_HARDWARE, - ERR_E220_HEAD_NOT_RECOGNIZED, - ERR_E220_NO_RESPONSE_FROM_DEVICE, - ERR_E220_WRONG_UART_CONFIG, - ERR_E220_WRONG_FORMAT, - ERR_E220_PACKET_TOO_BIG -} Status; - -static std::string getResponseDescriptionByParams(uint8_t status) { - switch (status) { - case E220_SUCCESS: - return "Success"; - break; - case ERR_E220_UNKNOWN: - return "Unknown"; - break; - case ERR_E220_NOT_SUPPORT: - return "Not support!"; - break; - case ERR_E220_NOT_IMPLEMENT: - return "Not implement"; - break; - case ERR_E220_NOT_INITIAL: - return "Not initial!"; - break; - case ERR_E220_INVALID_PARAM: - return "Invalid param!"; - break; - case ERR_E220_DATA_SIZE_NOT_MATCH: - return "Data size not match!"; - break; - case ERR_E220_BUF_TOO_SMALL: - return "Buff too small!"; - break; - case ERR_E220_TIMEOUT: - return "Timeout!!"; - break; - case ERR_E220_HARDWARE: - return "Hardware error!"; - break; - case ERR_E220_HEAD_NOT_RECOGNIZED: - return "Save mode returned not recognized!"; - break; - case ERR_E220_NO_RESPONSE_FROM_DEVICE: - return "No response from device! (Check wiring)"; - break; - case ERR_E220_WRONG_UART_CONFIG: - return "Wrong UART configuration! (BPS must be 9600 for configuration)"; - break; - case ERR_E220_PACKET_TOO_BIG: - return "The device support only 200byte of data transmission!"; - break; - default: - return "Invalid status!"; - } -} - -enum E220_UART_PARITY { MODE_00_8N1 = 0b00, MODE_01_8O1 = 0b01, MODE_10_8E1 = 0b10, MODE_11_8N1 = 0b11 }; - -static std::string getUARTParityDescriptionByParams(uint8_t uartParity) { - switch (uartParity) { - case MODE_00_8N1: - return "8N1 (Default)"; - break; - case MODE_01_8O1: - return "8O1"; - break; - case MODE_10_8E1: - return "8E1"; - break; - case MODE_11_8N1: - return "8N1 (equal to 00"; - break; - default: - return "Invalid UART Parity!"; - } -} - -enum UART_BPS_TYPE { - UART_BPS_1200 = 0b000, - UART_BPS_2400 = 0b001, - UART_BPS_4800 = 0b010, - UART_BPS_9600 = 0b011, - UART_BPS_19200 = 0b100, - UART_BPS_38400 = 0b101, - UART_BPS_57600 = 0b110, - UART_BPS_115200 = 0b111 -}; - -enum UART_BPS_RATE { - UART_BPS_RATE_1200 = 1200, - UART_BPS_RATE_2400 = 2400, - UART_BPS_RATE_4800 = 4800, - UART_BPS_RATE_9600 = 9600, - UART_BPS_RATE_19200 = 19200, - UART_BPS_RATE_38400 = 38400, - UART_BPS_RATE_57600 = 57600, - UART_BPS_RATE_115200 = 115200 -}; - -static std::string getUARTBaudRateDescriptionByParams(uint8_t uartBaudRate) { - switch (uartBaudRate) { - case UART_BPS_1200: - return "1200bps"; - break; - case UART_BPS_2400: - return "2400bps"; - break; - case UART_BPS_4800: - return "4800bps"; - break; - case UART_BPS_9600: - return "9600bps (default)"; - break; - case UART_BPS_19200: - return "19200bps"; - break; - case UART_BPS_38400: - return "38400bps"; - break; - case UART_BPS_57600: - return "57600bps"; - break; - case UART_BPS_115200: - return "115200bps"; - break; - default: - return "Invalid UART Baud Rate!"; - } -} - -enum AIR_DATA_RATE { - AIR_DATA_RATE_000_24 = 0b000, - AIR_DATA_RATE_001_24 = 0b001, - AIR_DATA_RATE_010_24 = 0b010, - AIR_DATA_RATE_011_48 = 0b011, - AIR_DATA_RATE_100_96 = 0b100, - AIR_DATA_RATE_101_192 = 0b101, - AIR_DATA_RATE_110_384 = 0b110, - AIR_DATA_RATE_111_625 = 0b111 -}; - -static std::string getAirDataRateDescriptionByParams(uint8_t airDataRate) { - switch (airDataRate) { - case AIR_DATA_RATE_000_24: - return "2.4kbps"; - break; - case AIR_DATA_RATE_001_24: - return "2.4kbps"; - break; - case AIR_DATA_RATE_010_24: - return "2.4kbps (default)"; - break; - case AIR_DATA_RATE_011_48: - return "4.8kbps"; - break; - case AIR_DATA_RATE_100_96: - return "9.6kbps"; - break; - case AIR_DATA_RATE_101_192: - return "19.2kbps"; - break; - case AIR_DATA_RATE_110_384: - return "38.4kbps"; - break; - case AIR_DATA_RATE_111_625: - return "62.5kbps"; - break; - default: - return "Invalid Air Data Rate!"; - } -} - -enum SUB_PACKET_SETTING { - SPS_200_00 = 0b00, - SPS_128_01 = 0b01, - SPS_064_10 = 0b10, - SPS_032_11 = 0b11 - -}; -static std::string getSubPacketSettingByParams(uint8_t subPacketSetting) { - switch (subPacketSetting) { - case SPS_200_00: - return "200bytes (default)"; - break; - case SPS_128_01: - return "128bytes"; - break; - case SPS_064_10: - return "64bytes"; - break; - case SPS_032_11: - return "32bytes"; - break; - default: - return "Invalid Sub Packet Setting!"; - } -} - -enum RSSI_AMBIENT_NOISE_ENABLE { RSSI_AMBIENT_NOISE_ENABLED = 0b1, RSSI_AMBIENT_NOISE_DISABLED = 0b0 }; -static std::string getRSSIAmbientNoiseEnableByParams(uint8_t rssiAmbientNoiseEnabled) { - switch (rssiAmbientNoiseEnabled) { - case RSSI_AMBIENT_NOISE_ENABLED: - return "Enabled"; - break; - case RSSI_AMBIENT_NOISE_DISABLED: - return "Disabled (default)"; - break; - default: - return "Invalid RSSI Ambient Noise enabled!"; - } -} - -enum WOR_PERIOD { - WOR_500_000 = 0b000, - WOR_1000_001 = 0b001, - WOR_1500_010 = 0b010, - WOR_2000_011 = 0b011, - WOR_2500_100 = 0b100, - WOR_3000_101 = 0b101, - WOR_3500_110 = 0b110, - WOR_4000_111 = 0b111 - -}; -static std::string getWORPeriodByParams(uint8_t WORPeriod) { - switch (WORPeriod) { - case WOR_500_000: - return "500ms"; - break; - case WOR_1000_001: - return "1000ms"; - break; - case WOR_1500_010: - return "1500ms"; - break; - case WOR_2000_011: - return "2000ms (default)"; - break; - case WOR_2500_100: - return "2500ms"; - break; - case WOR_3000_101: - return "3000ms"; - break; - case WOR_3500_110: - return "3500ms"; - break; - case WOR_4000_111: - return "4000ms"; - break; - default: - return "Invalid WOR period!"; - } -} -enum LBT_ENABLE_BYTE { LBT_ENABLED = 0b1, LBT_DISABLED = 0b0 }; -static std::string getLBTEnableByteByParams(uint8_t LBTEnableByte) { - switch (LBTEnableByte) { - case LBT_ENABLED: - return "Enabled"; - break; - case LBT_DISABLED: - return "Disabled (default)"; - break; - default: - return "Invalid LBT enable byte!"; - } -} - -enum RSSI_ENABLE_BYTE { RSSI_ENABLED = 0b1, RSSI_DISABLED = 0b0 }; -static std::string getRSSIEnableByteByParams(uint8_t RSSIEnableByte) { - switch (RSSIEnableByte) { - case RSSI_ENABLED: - return "Enabled"; - break; - case RSSI_DISABLED: - return "Disabled (default)"; - break; - default: - return "Invalid RSSI enable byte!"; - } -} - -enum FIDEX_TRANSMISSION { FT_TRANSPARENT_TRANSMISSION = 0b0, FT_FIXED_TRANSMISSION = 0b1 }; - -static std::string getFixedTransmissionDescriptionByParams(uint8_t fixedTransmission) { - switch (fixedTransmission) { - case FT_TRANSPARENT_TRANSMISSION: - return "Transparent transmission (default)"; - break; - case FT_FIXED_TRANSMISSION: - return "Fixed transmission (first three bytes can be used as high/low address and channel)"; - break; - default: - return "Invalid fixed transmission param!"; - } -} - -#ifdef E220_22 -enum TRANSMISSION_POWER { - POWER_22 = 0b00, - POWER_17 = 0b01, - POWER_13 = 0b10, - POWER_10 = 0b11 - -}; - -static std::string getTransmissionPowerDescriptionByParams(uint8_t transmissionPower) { - switch (transmissionPower) { - case POWER_22: - return "22dBm (Default)"; - break; - case POWER_17: - return "17dBm"; - break; - case POWER_13: - return "13dBm"; - break; - case POWER_10: - return "10dBm"; - break; - default: - return "Invalid transmission power param"; - } -} -#elif defined(E220_30) -enum TRANSMISSION_POWER { - POWER_30 = 0b00, - POWER_27 = 0b01, - POWER_24 = 0b10, - POWER_21 = 0b11 - -}; - -static std::string getTransmissionPowerDescriptionByParams(uint8_t transmissionPower) { - switch (transmissionPower) { - case POWER_30: - return "30dBm (Default)"; - break; - case POWER_27: - return "27dBm"; - break; - case POWER_24: - return "24dBm"; - break; - case POWER_21: - return "21dBm"; - break; - default: - return "Invalid transmission power param"; - } -} -#else -enum TRANSMISSION_POWER { - POWER_22 = 0b00, - POWER_17 = 0b01, - POWER_13 = 0b10, - POWER_10 = 0b11 - -}; - -static std::string getTransmissionPowerDescriptionByParams(uint8_t transmissionPower) { - switch (transmissionPower) { - case POWER_22: - return "22dBm (Default)"; - break; - case POWER_17: - return "17dBm"; - break; - case POWER_13: - return "13dBm"; - break; - case POWER_10: - return "10dBm"; - break; - default: - return "Invalid transmission power param"; - } -} -#endif -} // namespace state_naming -} // namespace esphome