loads more changes

This commit is contained in:
Daniël Koek 2024-01-30 19:14:44 +00:00
parent b70d44e6c2
commit 7b55449229
4 changed files with 1246 additions and 1361 deletions

View file

@ -4,15 +4,18 @@
#include <HardwareSerial.h>
#include "esphome/core/helpers.h"
#include "lora_e220.h"
#include "esphome/components/uart/uart.h"
namespace esphome {
namespace ebyte_lora_e220 {
static const char *const TAG = "ebyte_lora_e220";
// there are 3 UART ports, we are going to be using 0, which is D6 and D7
HardwareSerial LoraSerial(0);
LoRa_E220 e220ttl(&LoraSerial, D2, D0, D1); // SERIAL AUX M0 M1
class LoRaSensors : public text_sensor::TextSensor, public PollingComponent {
class LoRaSensors : public text_sensor::TextSensor, public PollingComponent, public uart::UARTDevice {
public:
LoRaSensors() : PollingComponent(4000) {}

View file

@ -1,42 +1,5 @@
#include "lora_e220.h"
#ifdef ACTIVATE_SOFTWARE_SERIAL
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, UART_BPS_RATE bpsRate){
this->txE220pin = txE220pin;
this->rxE220pin = rxE220pin;
SoftwareSerial* mySerial = new SoftwareSerial((uint8_t)this->txE220pin, (uint8_t)this->rxE220pin); // "RX TX" // @suppress("Abstract class cannot be instantiated")
this->ss = mySerial;
this->hs = NULL;
this->bpsRate = bpsRate;
}
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, byte auxPin, UART_BPS_RATE bpsRate){
this->txE220pin = txE220pin;
this->rxE220pin = rxE220pin;
this->auxPin = auxPin;
SoftwareSerial* mySerial = new SoftwareSerial((uint8_t)this->txE220pin, (uint8_t)this->rxE220pin); // "RX TX" // @suppress("Abstract class cannot be instantiated")
this->ss = mySerial;
this->hs = NULL;
this->bpsRate = bpsRate;
}
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate){
this->txE220pin = txE220pin;
this->rxE220pin = rxE220pin;
this->auxPin = auxPin;
this->m0Pin = m0Pin;
this->m1Pin = m1Pin;
SoftwareSerial* mySerial = new SoftwareSerial((uint8_t)this->txE220pin, (uint8_t)this->rxE220pin); // "RX TX" // @suppress("Abstract class cannot be instantiated")
this->ss = mySerial;
this->hs = NULL;
this->bpsRate = bpsRate;
}
#endif
LoRa_E220::LoRa_E220(HardwareSerial *serial, UART_BPS_RATE bpsRate) { //, uint32_t serialConfig
this->txE220pin = txE220pin;
this->rxE220pin = rxE220pin;
@ -66,7 +29,8 @@ LoRa_E220::LoRa_E220(HardwareSerial* serial, byte auxPin, UART_BPS_RATE bpsRate)
this->bpsRate = bpsRate;
}
LoRa_E220::LoRa_E220(HardwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate){ //, uint32_t serialConfig
LoRa_E220::LoRa_E220(HardwareSerial *serial, byte auxPin, byte m0Pin, byte m1Pin,
UART_BPS_RATE bpsRate) { //, uint32_t serialConfig
this->txE220pin = txE220pin;
this->rxE220pin = rxE220pin;
@ -86,7 +50,8 @@ LoRa_E220::LoRa_E220(HardwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin
}
#ifdef HARDWARE_SERIAL_SELECTABLE_PIN
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial* serial, UART_BPS_RATE bpsRate, uint32_t serialConfig){
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial *serial, UART_BPS_RATE bpsRate,
uint32_t serialConfig) {
this->txE220pin = txE220pin;
this->rxE220pin = rxE220pin;
@ -100,7 +65,8 @@ LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial* serial, UAR
this->bpsRate = bpsRate;
}
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial* serial, byte auxPin, UART_BPS_RATE bpsRate, uint32_t serialConfig){
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial *serial, byte auxPin, UART_BPS_RATE bpsRate,
uint32_t serialConfig) {
this->txE220pin = txE220pin;
this->rxE220pin = rxE220pin;
this->auxPin = auxPin;
@ -115,7 +81,8 @@ LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial* serial, byt
this->bpsRate = bpsRate;
}
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate, uint32_t serialConfig){
LoRa_E220::LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial *serial, byte auxPin, byte m0Pin, byte m1Pin,
UART_BPS_RATE bpsRate, uint32_t serialConfig) {
this->txE220pin = txE220pin;
this->rxE220pin = rxE220pin;
@ -174,41 +141,39 @@ LoRa_E220::LoRa_E220(SoftwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin
#endif
bool LoRa_E220::begin() {
DEBUG_PRINT("RX MIC ---> ");
DEBUG_PRINTLN(this->txE220pin);
DEBUG_PRINT("TX MIC ---> ");
DEBUG_PRINTLN(this->rxE220pin);
DEBUG_PRINT("AUX ---> ");
DEBUG_PRINTLN(this->auxPin);
DEBUG_PRINT("M0 ---> ");
DEBUG_PRINTLN(this->m0Pin);
DEBUG_PRINT("M1 ---> ");
DEBUG_PRINTLN(this->m1Pin);
ESP_LOGD(TAG, "RX MIC ---> ");
ESP_LOGD(TAG, this->txE220pin);
ESP_LOGD(TAG, "TX MIC ---> ");
ESP_LOGD(TAG, this->rxE220pin);
ESP_LOGD(TAG, "AUX ---> ");
ESP_LOGD(TAG, this->auxPin);
ESP_LOGD(TAG, "M0 ---> ");
ESP_LOGD(TAG, this->m0Pin);
ESP_LOGD(TAG, "M1 ---> ");
ESP_LOGD(TAG, this->m1Pin);
if (this->auxPin != -1) {
pinMode(this->auxPin, INPUT);
DEBUG_PRINTLN("Init AUX pin!");
ESP_LOGD(TAG, "Init AUX pin!");
}
if (this->m0Pin != -1) {
pinMode(this->m0Pin, OUTPUT);
DEBUG_PRINTLN("Init M0 pin!");
ESP_LOGD(TAG, "Init M0 pin!");
digitalWrite(this->m0Pin, HIGH);
}
if (this->m1Pin != -1) {
pinMode(this->m1Pin, OUTPUT);
DEBUG_PRINTLN("Init M1 pin!");
ESP_LOGD(TAG, "Init M1 pin!");
digitalWrite(this->m1Pin, HIGH);
}
DEBUG_PRINTLN("Begin ex");
ESP_LOGD(TAG, "Begin ex");
if (this->hs) {
DEBUG_PRINTLN("Begin Hardware Serial");
ESP_LOGD(TAG, "Begin Hardware Serial");
#ifdef HARDWARE_SERIAL_SELECTABLE_PIN
if (this->txE220pin != -1 && this->rxE220pin != -1) {
DEBUG_PRINTLN("PIN SELECTED!!");
ESP_LOGD(TAG, "PIN SELECTED!!");
this->serialDef.begin(*this->hs, this->bpsRate, this->serialConfig, this->txE220pin, this->rxE220pin);
} else {
this->serialDef.begin(*this->hs, this->bpsRate, this->serialConfig);
@ -223,19 +188,20 @@ bool LoRa_E220::begin(){
#ifdef ACTIVATE_SOFTWARE_SERIAL
} else if (this->ss) {
DEBUG_PRINTLN("Begin Software Serial");
ESP_LOGD(TAG, "Begin Software Serial");
this->serialDef.begin(*this->ss, this->bpsRate);
} else {
DEBUG_PRINTLN("Begin Software Serial Pin");
SoftwareSerial* mySerial = new SoftwareSerial((int)this->txE220pin, (int)this->rxE220pin); // "RX TX" // @suppress("Abstract class cannot be instantiated")
ESP_LOGD(TAG, "Begin Software Serial Pin");
SoftwareSerial *mySerial = new SoftwareSerial(
(int) this->txE220pin, (int) this->rxE220pin); // "RX TX" // @suppress("Abstract class cannot be instantiated")
this->ss = mySerial;
// SoftwareSerial mySerial(this->txE220pin, this->rxE220pin);
DEBUG_PRINT("RX Pin: ");
DEBUG_PRINT((int)this->txE220pin);
DEBUG_PRINT("TX Pin: ");
DEBUG_PRINTLN((int)this->rxE220pin);
ESP_LOGD(TAG, "RX Pin: ");
ESP_LOGD(TAG, (int) this->txE220pin);
ESP_LOGD(TAG, "TX Pin: ");
ESP_LOGD(TAG, (int) this->rxE220pin);
this->serialDef.begin(*this->ss, this->bpsRate);
#endif
@ -254,7 +220,6 @@ a timeout is provided to avoid an infinite loop
*/
Status LoRa_E220::waitCompleteResponse(unsigned long timeout, unsigned int waitNoAux) {
Status result = E220_SUCCESS;
unsigned long t = millis();
@ -270,23 +235,21 @@ Status LoRa_E220::waitCompleteResponse(unsigned long timeout, unsigned int waitN
while (digitalRead(this->auxPin) == LOW) {
if ((millis() - t) > timeout) {
result = ERR_E220_TIMEOUT;
DEBUG_PRINTLN("Timeout error!");
ESP_LOGD(TAG, "Timeout error!");
return result;
}
}
DEBUG_PRINTLN("AUX HIGH!");
}
else {
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);
DEBUG_PRINTLN(F("Wait no AUX pin!"));
ESP_LOGD(TAG, F("Wait no AUX pin!"));
}
// per data sheet control after aux goes high is 2ms so delay for at least that long)
this->managedDelay(20);
DEBUG_PRINTLN(F("Complete!"));
ESP_LOGD(TAG, F("Complete!"));
return result;
}
@ -297,9 +260,7 @@ 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
@ -307,8 +268,8 @@ void LoRa_E220::managedDelay(unsigned long timeout) {
t = 0;
}
while ((millis() - t) < timeout) { }
while ((millis() - t) < timeout) {
}
}
/*
@ -332,11 +293,11 @@ int LoRa_E220::available() {
// }else{
// while (digitalRead(this->auxPin) == LOW) {
// if ((millis() - t) > timeout){
// DEBUG_PRINTLN("Timeout error!");
// ESP_LOGD(TAG, "Timeout error!");
// return 0;
// }
// }
// DEBUG_PRINTLN("AUX HIGH!");
// ESP_LOGD(TAG, "AUX HIGH!");
// return 2;
// }
// }else{
@ -350,24 +311,18 @@ Method to indicate availability
*/
void LoRa_E220::flush() {
this->serialDef.stream->flush();
}
void LoRa_E220::flush() { this->serialDef.stream->flush(); }
void LoRa_E220::cleanUARTBuffer()
{
void LoRa_E220::cleanUARTBuffer() {
// bool IsNull = true;
while (this->available())
{
while (this->available()) {
// IsNull = false;
this->serialDef.stream->read();
}
}
/*
Method to send a chunk of data provided data is in a struct--my personal favorite as you
@ -390,29 +345,30 @@ Status LoRa_E220::sendStruct(void *structureManaged, uint16_t size_) {
uint8_t len = this->serialDef.stream->write((uint8_t *) structureManaged, size_);
if (len != size_) {
DEBUG_PRINT(F("Send... len:"))
DEBUG_PRINT(len);
DEBUG_PRINT(F(" size:"))
DEBUG_PRINT(size_);
ESP_LOGD(TAG, F("Send... len:"))
ESP_LOGD(TAG, len);
ESP_LOGD(TAG, F(" size:"))
ESP_LOGD(TAG, size_);
if (len == 0) {
result = ERR_E220_NO_RESPONSE_FROM_DEVICE;
} else {
result = ERR_E220_DATA_SIZE_NOT_MATCH;
}
}
if (result != E220_SUCCESS) return result;
if (result != E220_SUCCESS)
return result;
result = this->waitCompleteResponse(5000, 5000);
if (result != E220_SUCCESS) return result;
DEBUG_PRINT(F("Clear buffer..."))
if (result != E220_SUCCESS)
return result;
ESP_LOGD(TAG, F("Clear buffer..."))
this->cleanUARTBuffer();
DEBUG_PRINTLN(F("ok!"))
ESP_LOGD(TAG, F("ok!"))
return result;
}
/*
Method to get a chunk of data provided data is in a struct--my personal favorite as you
@ -426,16 +382,15 @@ types each handle ints floats differently
*/
Status LoRa_E220::receiveStruct(void *structureManaged, uint16_t size_) {
Status result = E220_SUCCESS;
uint8_t len = this->serialDef.stream->readBytes((uint8_t *) structureManaged, size_);
DEBUG_PRINT("Available buffer: ");
DEBUG_PRINT(len);
DEBUG_PRINT(" structure size: ");
DEBUG_PRINTLN(size_);
ESP_LOGD(TAG, "Available buffer: ");
ESP_LOGD(TAG, len);
ESP_LOGD(TAG, " structure size: ");
ESP_LOGD(TAG, size_);
if (len != size_) {
if (len == 0) {
@ -444,10 +399,12 @@ Status LoRa_E220::receiveStruct(void *structureManaged, uint16_t size_) {
result = ERR_E220_DATA_SIZE_NOT_MATCH;
}
}
if (result != E220_SUCCESS) return result;
if (result != E220_SUCCESS)
return result;
result = this->waitCompleteResponse(1000);
if (result != E220_SUCCESS) return result;
if (result != E220_SUCCESS)
return result;
return result;
}
@ -459,39 +416,37 @@ method to set the mode (program, normal, etc.)
*/
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) {
DEBUG_PRINTLN(F("The M0 and M1 pins is not set, this mean that you are connect directly the pins as you need!"))
ESP_LOGD(TAG, F("The M0 and M1 pins is not set, this mean that you are connect directly the pins as you need!"))
} else {
switch (mode)
{
switch (mode) {
case MODE_0_NORMAL:
// Mode 0 | normal operation
digitalWrite(this->m0Pin, LOW);
digitalWrite(this->m1Pin, LOW);
DEBUG_PRINTLN("MODE NORMAL!");
ESP_LOGD(TAG, "MODE NORMAL!");
break;
case MODE_1_WOR_TRANSMITTER:
digitalWrite(this->m0Pin, HIGH);
digitalWrite(this->m1Pin, LOW);
DEBUG_PRINTLN("MODE WOR!");
ESP_LOGD(TAG, "MODE WOR!");
break;
case MODE_2_WOR_RECEIVER:
// case MODE_2_PROGRAM:
digitalWrite(this->m0Pin, LOW);
digitalWrite(this->m1Pin, HIGH);
DEBUG_PRINTLN("MODE RECEIVING!");
ESP_LOGD(TAG, "MODE RECEIVING!");
break;
case MODE_3_CONFIGURATION:
// Mode 3 | Setting operation
digitalWrite(this->m0Pin, HIGH);
digitalWrite(this->m1Pin, HIGH);
DEBUG_PRINTLN("MODE SLEEP CONFIG!");
ESP_LOGD(TAG, "MODE SLEEP CONFIG!");
break;
default:
@ -512,15 +467,13 @@ Status LoRa_E220::setMode(MODE_TYPE mode) {
return res;
}
MODE_TYPE LoRa_E220::getMode(){
return this->mode;
}
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->serialDef.stream->write(CMD, 3);
DEBUG_PRINTLN(size);
ESP_LOGD(TAG, size);
this->managedDelay(50); // need ti check
@ -531,12 +484,14 @@ ResponseStructContainer LoRa_E220::getConfiguration(){
ResponseStructContainer rc;
rc.status.code = checkUARTConfiguration(MODE_3_PROGRAM);
if (rc.status.code!=E220_SUCCESS) return rc;
if (rc.status.code != E220_SUCCESS)
return rc;
MODE_TYPE prevMode = this->mode;
rc.status.code = this->setMode(MODE_3_PROGRAM);
if (rc.status.code!=E220_SUCCESS) return rc;
if (rc.status.code != E220_SUCCESS)
return rc;
this->writeProgramCommand(READ_CONFIGURATION, REG_ADDRESS_CFG, PL_CONFIGURATION);
@ -553,12 +508,15 @@ ResponseStructContainer LoRa_E220::getConfiguration(){
}
rc.status.code = this->setMode(prevMode);
if (rc.status.code!=E220_SUCCESS) return rc;
if (rc.status.code != E220_SUCCESS)
return rc;
if (WRONG_FORMAT == ((Configuration *) rc.data)->COMMAND) {
rc.status.code = 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){
if (RETURNED_COMMAND != ((Configuration *) rc.data)->COMMAND ||
REG_ADDRESS_CFG != ((Configuration *) rc.data)->STARTING_ADDRESS ||
PL_CONFIGURATION != ((Configuration *) rc.data)->LENGHT) {
rc.status.code = ERR_E220_HEAD_NOT_RECOGNIZED;
}
@ -576,12 +534,14 @@ ResponseStatus LoRa_E220::setConfiguration(Configuration configuration, PROGRAM_
ResponseStatus rc;
rc.code = checkUARTConfiguration(MODE_3_PROGRAM);
if (rc.code!=E220_SUCCESS) return rc;
if (rc.code != E220_SUCCESS)
return rc;
MODE_TYPE prevMode = this->mode;
rc.code = this->setMode(MODE_3_PROGRAM);
if (rc.code!=E220_SUCCESS) return rc;
if (rc.code != E220_SUCCESS)
return rc;
// this->writeProgramCommand(saveType, REG_ADDRESS_CFG);
@ -602,14 +562,16 @@ ResponseStatus LoRa_E220::setConfiguration(Configuration configuration, PROGRAM_
this->printParameters((Configuration *) &configuration);
#endif
rc.code = this->setMode(prevMode);
if (rc.code!=E220_SUCCESS) return rc;
if (rc.code != E220_SUCCESS)
return rc;
if (WRONG_FORMAT == ((Configuration *) &configuration)->COMMAND) {
rc.code = ERR_E220_WRONG_FORMAT;
}
if (RETURNED_COMMAND != ((Configuration *)&configuration)->COMMAND || REG_ADDRESS_CFG!= ((Configuration *)&configuration)->STARTING_ADDRESS || PL_CONFIGURATION!= ((Configuration *)&configuration)->LENGHT){
if (RETURNED_COMMAND != ((Configuration *) &configuration)->COMMAND ||
REG_ADDRESS_CFG != ((Configuration *) &configuration)->STARTING_ADDRESS ||
PL_CONFIGURATION != ((Configuration *) &configuration)->LENGHT) {
rc.code = ERR_E220_HEAD_NOT_RECOGNIZED;
}
@ -620,12 +582,14 @@ ResponseStructContainer LoRa_E220::getModuleInformation(){
ResponseStructContainer rc;
rc.status.code = checkUARTConfiguration(MODE_3_PROGRAM);
if (rc.status.code!=E220_SUCCESS) return rc;
if (rc.status.code != E220_SUCCESS)
return rc;
MODE_TYPE prevMode = this->mode;
rc.status.code = this->setMode(MODE_3_PROGRAM);
if (rc.status.code!=E220_SUCCESS) return rc;
if (rc.status.code != E220_SUCCESS)
return rc;
this->writeProgramCommand(READ_CONFIGURATION, REG_ADDRESS_PID, PL_PID);
@ -639,25 +603,37 @@ ResponseStructContainer LoRa_E220::getModuleInformation(){
}
rc.status.code = this->setMode(prevMode);
if (rc.status.code!=E220_SUCCESS) return rc;
if (rc.status.code != E220_SUCCESS)
return rc;
// this->printParameters(*configuration);
if (WRONG_FORMAT == ((ModuleInformation *) rc.data)->COMMAND) {
rc.status.code = 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){
if (RETURNED_COMMAND != ((ModuleInformation *) rc.data)->COMMAND ||
REG_ADDRESS_PID != ((ModuleInformation *) rc.data)->STARTING_ADDRESS ||
PL_PID != ((ModuleInformation *) rc.data)->LENGHT) {
rc.status.code = ERR_E220_HEAD_NOT_RECOGNIZED;
}
DEBUG_PRINTLN("----------------------------------------");
DEBUG_PRINT(F("HEAD: ")); DEBUG_PRINT(((ModuleInformation *)rc.data)->COMMAND, BIN);DEBUG_PRINT(" ");DEBUG_PRINT(((ModuleInformation *)rc.data)->STARTING_ADDRESS, DEC);DEBUG_PRINT(" ");DEBUG_PRINTLN(((ModuleInformation *)rc.data)->LENGHT, HEX);
ESP_LOGD(TAG, "----------------------------------------");
ESP_LOGD(TAG, F("HEAD: "));
ESP_LOGD(TAG, ((ModuleInformation *) rc.data)->COMMAND, BIN);
ESP_LOGD(TAG, " ");
ESP_LOGD(TAG, ((ModuleInformation *) rc.data)->STARTING_ADDRESS, DEC);
ESP_LOGD(TAG, " ");
ESP_LOGD(TAG, ((ModuleInformation *) rc.data)->LENGHT, HEX);
DEBUG_PRINT(F("Model no.: ")); DEBUG_PRINTLN(((ModuleInformation *)rc.data)->model, HEX);
DEBUG_PRINT(F("Version : ")); DEBUG_PRINTLN(((ModuleInformation *)rc.data)->version, HEX);
DEBUG_PRINT(F("Features : ")); DEBUG_PRINTLN(((ModuleInformation *)rc.data)->features, HEX);
DEBUG_PRINT(F("Status : ")); DEBUG_PRINTLN(rc.status.getResponseDescription());
DEBUG_PRINTLN("----------------------------------------");
ESP_LOGD(TAG, F("Model no.: "));
ESP_LOGD(TAG, ((ModuleInformation *) rc.data)->model, HEX);
ESP_LOGD(TAG, F("Version : "));
ESP_LOGD(TAG, ((ModuleInformation *) rc.data)->version, HEX);
ESP_LOGD(TAG, F("Features : "));
ESP_LOGD(TAG, (ModuleInformation *) rc.data)->features, HEX);
ESP_LOGD(TAG, F("Status : "));
ESP_LOGD(TAG, rc.status.getResponseDescription());
ESP_LOGD(TAG, "----------------------------------------");
// if (rc.status.code!=E220_SUCCESS) return rc;
@ -666,7 +642,6 @@ ResponseStructContainer LoRa_E220::getModuleInformation(){
return rc;
}
ResponseStatus LoRa_E220::resetModule() {
// ResponseStatus status;
//
@ -691,25 +666,21 @@ ResponseStatus LoRa_E220::resetModule(){
// if (status.code!=E220_SUCCESS) return status;
//
// return status;
DEBUG_PRINT(F("No information to reset module!"));
ESP_LOGD(TAG, F("No information to reset module!"));
ResponseStatus status;
status.code = ERR_E220_NOT_IMPLEMENT;
return status;
}
ResponseContainer LoRa_E220::receiveMessage(){
return LoRa_E220::receiveMessageComplete(false);
}
ResponseContainer LoRa_E220::receiveMessageRSSI(){
return LoRa_E220::receiveMessageComplete(true);
}
ResponseContainer LoRa_E220::receiveMessage() { return LoRa_E220::receiveMessageComplete(false); }
ResponseContainer LoRa_E220::receiveMessageRSSI() { return LoRa_E220::receiveMessageComplete(true); }
ResponseContainer LoRa_E220::receiveMessageComplete(bool rssiEnabled) {
ResponseContainer rc;
rc.status.code = E220_SUCCESS;
std::string tmpData = this->serialDef.stream->readstd::string();
DEBUG_PRINTLN(tmpData);
ESP_LOGD(TAG, tmpData);
if (rssiEnabled) {
rc.rssi = tmpData.charAt(tmpData.length() - 1);
@ -759,7 +730,6 @@ ResponseContainer LoRa_E220::receiveInitialMessage(uint8_t size){
return rc;
}
ResponseStructContainer LoRa_E220::receiveMessage(const uint8_t size) {
return LoRa_E220::receiveMessageComplete(size, false);
}
@ -777,7 +747,6 @@ ResponseStructContainer LoRa_E220::receiveMessageComplete(const uint8_t size, bo
}
if (rssiEnabled) {
char rssi[1];
this->serialDef.stream->readBytes(rssi, 1);
rc.rssi = rssi[0];
@ -790,34 +759,36 @@ ResponseStructContainer LoRa_E220::receiveMessageComplete(const uint8_t size, bo
ResponseStatus LoRa_E220::sendMessage(const void *message, const uint8_t size) {
ResponseStatus status;
status.code = this->sendStruct((uint8_t *) message, size);
if (status.code!=E220_SUCCESS) return status;
if (status.code != E220_SUCCESS)
return status;
return status;
}
ResponseStatus LoRa_E220::sendMessage(const std::string message) {
DEBUG_PRINT(F("Send message: "));
DEBUG_PRINT(message);
ESP_LOGD(TAG, F("Send message: "));
ESP_LOGD(TAG, message);
byte size = message.length(); // sizeof(message.c_str())+1;
DEBUG_PRINT(F(" size: "));
DEBUG_PRINTLN(size);
ESP_LOGD(TAG, F(" size: "));
ESP_LOGD(TAG, size);
char messageFixed[size];
memcpy(messageFixed, message.c_str(), size);
DEBUG_PRINTLN(F(" memcpy "));
ESP_LOGD(TAG, F(" memcpy "));
ResponseStatus status;
status.code = this->sendStruct((uint8_t *) &messageFixed, size);
if (status.code!=E220_SUCCESS) return status;
if (status.code != E220_SUCCESS)
return status;
// free(messageFixed);
return status;
}
ResponseStatus LoRa_E220::sendFixedMessage(byte ADDH, byte ADDL, byte CHAN, const std::string message) {
// DEBUG_PRINT("std::string/size: ");
// DEBUG_PRINT(message);
// DEBUG_PRINT("/");
// ESP_LOGD(TAG,"std::string/size: ");
// ESP_LOGD(TAG,message);
// ESP_LOGD(TAG,"/");
byte size = message.length(); // sizeof(message.c_str())+1;
// DEBUG_PRINTLN(size);
// ESP_LOGD(TAG, size);
//
// #pragma pack(push, 1)
// struct FixedStransmissionstd::string {
@ -835,8 +806,8 @@ ResponseStatus LoRa_E220::sendFixedMessage(byte ADDH, byte ADDL, byte CHAN, cons
// memcpy(fixedStransmission.message, (char*)msg, size);
//// fixedStransmission.message = message;
//
// DEBUG_PRINT("Message: ");
// DEBUG_PRINTLN(fixedStransmission.message);
// ESP_LOGD(TAG,"Message: ");
// ESP_LOGD(TAG, fixedStransmission.message);
//
// ResponseStatus status;
// status.code = this->sendStruct((uint8_t *)&fixedStransmission, sizeof(fixedStransmission));
@ -851,8 +822,7 @@ ResponseStatus LoRa_E220::sendBroadcastFixedMessage(byte CHAN, const std::string
return this->sendFixedMessage(BROADCAST_ADDRESS, BROADCAST_ADDRESS, CHAN, message);
}
typedef struct fixedStransmission
{
typedef struct fixedStransmission {
byte ADDH = 0;
byte ADDL = 0;
byte CHAN = 0;
@ -874,9 +844,7 @@ ResponseStatus LoRa_E220::sendFixedMessage( byte ADDH,byte ADDL, byte CHAN, cons
// } fixedStransmission;
// #pragma pack(pop)
DEBUG_PRINT(ADDH);
ESP_LOGD(TAG, ADDH);
FixedStransmission *fixedStransmission = init_stack(size);
@ -901,18 +869,19 @@ ResponseStatus LoRa_E220::sendFixedMessage( byte ADDH,byte ADDL, byte CHAN, cons
free(fixedStransmission);
if (status.code!=E220_SUCCESS) return status;
if (status.code != 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( byte ADDH,byte ADDL, byte CHAN, Configuration *configuration, PROGRAM_COMMAND programCommand){
ResponseStatus LoRa_E220::sendConfigurationMessage(byte ADDH, byte ADDL, byte CHAN, Configuration *configuration,
PROGRAM_COMMAND programCommand) {
ResponseStatus rc;
// rc.code = this->setMode(MODE_2_PROGRAM);
@ -926,13 +895,12 @@ ResponseStatus LoRa_E220::sendConfigurationMessage( byte ADDH,byte ADDL, byte CH
// fixedStransmission.message = &message;
memcpy(fixedStransmission->message, (unsigned char *) configuration, sizeof(Configuration));
fixedStransmission->specialCommand1 = SPECIAL_WIFI_CONF_COMMAND;
fixedStransmission->specialCommand2 = SPECIAL_WIFI_CONF_COMMAND;
DEBUG_PRINTLN(sizeof(Configuration)+2);
ESP_LOGD(TAG, sizeof(Configuration) + 2);
rc = sendFixedMessage(ADDH, ADDL, CHAN, fixedStransmission, sizeof(Configuration) + 2);
//
@ -951,15 +919,13 @@ ResponseStatus LoRa_E220::sendBroadcastFixedMessage(byte CHAN, const void *messa
#define KeeLoq_NLF 0x3A5C742E
unsigned long LoRa_E220::encrypt(unsigned long data)
{
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++)
{
for (r = 0; r < 528; r++) {
keyBitNo = r & 63;
if (keyBitNo < 32)
keyBitVal = bitRead(this->halfKeyloqKey, keyBitNo); // key low
@ -972,15 +938,13 @@ unsigned long LoRa_E220::encrypt(unsigned long data)
return x;
}
unsigned long LoRa_E220::decrypt(unsigned long data)
{
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++)
{
for (r = 0; r < 528; r++) {
keyBitNo = (15 - r) & 63;
if (keyBitNo < 32)
keyBitVal = bitRead(this->halfKeyloqKey, keyBitNo); // key low
@ -994,29 +958,68 @@ unsigned long LoRa_E220::decrypt(unsigned long data)
}
#ifdef LoRa_E220_DEBUG
void LoRa_E220::printParameters(struct Configuration *configuration) {
DEBUG_PRINTLN("----------------------------------------");
ESP_LOGD(TAG, "----------------------------------------");
DEBUG_PRINT(F("HEAD : ")); DEBUG_PRINT(configuration->COMMAND, HEX);DEBUG_PRINT(" ");DEBUG_PRINT(configuration->STARTING_ADDRESS, HEX);DEBUG_PRINT(" ");DEBUG_PRINTLN(configuration->LENGHT, HEX);
DEBUG_PRINTLN(F(" "));
DEBUG_PRINT(F("AddH : ")); DEBUG_PRINTLN(configuration->ADDH, HEX);
DEBUG_PRINT(F("AddL : ")); DEBUG_PRINTLN(configuration->ADDL, HEX);
DEBUG_PRINTLN(F(" "));
DEBUG_PRINT(F("Chan : ")); DEBUG_PRINT(configuration->CHAN, DEC); DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->getChannelDescription());
DEBUG_PRINTLN(F(" "));
DEBUG_PRINT(F("SpeedParityBit : ")); DEBUG_PRINT(configuration->SPED.uartParity, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->SPED.getUARTParityDescription());
DEBUG_PRINT(F("SpeedUARTDatte : ")); DEBUG_PRINT(configuration->SPED.uartBaudRate, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->SPED.getUARTBaudRateDescription());
DEBUG_PRINT(F("SpeedAirDataRate : ")); DEBUG_PRINT(configuration->SPED.airDataRate, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->SPED.getAirDataRateDescription());
DEBUG_PRINTLN(F(" "));
DEBUG_PRINT(F("OptionSubPacketSett: ")); DEBUG_PRINT(configuration->OPTION.subPacketSetting, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->OPTION.getSubPacketSetting());
DEBUG_PRINT(F("OptionTranPower : ")); DEBUG_PRINT(configuration->OPTION.transmissionPower, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->OPTION.getTransmissionPowerDescription());
DEBUG_PRINT(F("OptionRSSIAmbientNo: ")); DEBUG_PRINT(configuration->OPTION.RSSIAmbientNoise, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->OPTION.getRSSIAmbientNoiseEnable());
DEBUG_PRINTLN(F(" "));
DEBUG_PRINT(F("TransModeWORPeriod : ")); DEBUG_PRINT(configuration->TRANSMISSION_MODE.WORPeriod, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->TRANSMISSION_MODE.getWORPeriodByParamsDescription());
DEBUG_PRINT(F("TransModeEnableLBT : ")); DEBUG_PRINT(configuration->TRANSMISSION_MODE.enableLBT, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->TRANSMISSION_MODE.getLBTEnableByteDescription());
DEBUG_PRINT(F("TransModeEnableRSSI: ")); DEBUG_PRINT(configuration->TRANSMISSION_MODE.enableRSSI, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->TRANSMISSION_MODE.getRSSIEnableByteDescription());
DEBUG_PRINT(F("TransModeFixedTrans: ")); DEBUG_PRINT(configuration->TRANSMISSION_MODE.fixedTransmission, BIN);DEBUG_PRINT(" -> "); DEBUG_PRINTLN(configuration->TRANSMISSION_MODE.getFixedTransmissionDescription());
ESP_LOGD(TAG, F("HEAD : "));
ESP_LOGD(TAG, configuration->COMMAND, HEX);
ESP_LOGD(TAG, " ");
ESP_LOGD(TAG, configuration->STARTING_ADDRESS, HEX);
ESP_LOGD(TAG, " ");
ESP_LOGD(TAG, configuration->LENGHT, HEX);
ESP_LOGD(TAG, F(" "));
ESP_LOGD(TAG, F("AddH : "));
ESP_LOGD(TAG, configuration->ADDH, HEX);
ESP_LOGD(TAG, F("AddL : "));
ESP_LOGD(TAG, configuration->ADDL, HEX);
ESP_LOGD(TAG, F(" "));
ESP_LOGD(TAG, F("Chan : "));
ESP_LOGD(TAG, configuration->CHAN, DEC);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->getChannelDescription());
ESP_LOGD(TAG, F(" "));
ESP_LOGD(TAG, F("SpeedParityBit : "));
ESP_LOGD(TAG, configuration->SPED.uartParity, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->SPED.getUARTParityDescription());
ESP_LOGD(TAG, F("SpeedUARTDatte : "));
ESP_LOGD(TAG, configuration->SPED.uartBaudRate, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->SPED.getUARTBaudRateDescription());
ESP_LOGD(TAG, F("SpeedAirDataRate : "));
ESP_LOGD(TAG, configuration->SPED.airDataRate, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->SPED.getAirDataRateDescription());
ESP_LOGD(TAG, F(" "));
ESP_LOGD(TAG, F("OptionSubPacketSett: "));
ESP_LOGD(TAG, configuration->OPTION.subPacketSetting, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->OPTION.getSubPacketSetting());
ESP_LOGD(TAG, F("OptionTranPower : "));
ESP_LOGD(TAG, configuration->OPTION.transmissionPower, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->OPTION.getTransmissionPowerDescription());
ESP_LOGD(TAG, F("OptionRSSIAmbientNo: "));
ESP_LOGD(TAG, configuration->OPTION.RSSIAmbientNoise, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->OPTION.getRSSIAmbientNoiseEnable());
ESP_LOGD(TAG, F(" "));
ESP_LOGD(TAG, F("TransModeWORPeriod : "));
ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.WORPeriod, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.getWORPeriodByParamsDescription());
ESP_LOGD(TAG, F("TransModeEnableLBT : "));
ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.enableLBT, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.getLBTEnableByteDescription());
ESP_LOGD(TAG, F("TransModeEnableRSSI: "));
ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.enableRSSI, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.getRSSIEnableByteDescription());
ESP_LOGD(TAG, F("TransModeFixedTrans: "));
ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.fixedTransmission, BIN);
ESP_LOGD(TAG, " -> ");
ESP_LOGD(TAG, configuration->TRANSMISSION_MODE.getFixedTransmissionDescription());
DEBUG_PRINTLN("----------------------------------------");
ESP_LOGD(TAG, "----------------------------------------");
}
#endif

View file

@ -1,22 +1,14 @@
#ifndef LoRa_E220_h
#define LoRa_E220_h
#if !USE_ESP32 && !defined(__STM32F1__) && !defined(__STM32F4__)
#define ACTIVATE_SOFTWARE_SERIAL
#endif
#ifdef USE_ESP32
#define HARDWARE_SERIAL_SELECTABLE_PIN
#endif
#ifdef ACTIVATE_SOFTWARE_SERIAL
#include <SoftwareSerial.h>
#endif
#include "state_naming.h"
#include "Arduino.h"
#define MAX_SIZE_TX_PACKET 200
// Uncomment to enable printing out nice debug messages.
@ -25,15 +17,7 @@
// Define where debug output will be printed.
#define DEBUG_PRINTER Serial
// Setup debug printing macros.
#ifdef LoRa_E220_DEBUG
#define DEBUG_PRINT(...) { DEBUG_PRINTER.print(__VA_ARGS__); }
#define DEBUG_PRINTLN(...) { DEBUG_PRINTER.println(__VA_ARGS__); }
#else
#define DEBUG_PRINT(...) {}
#define DEBUG_PRINTLN(...) {}
#endif
static const char *const TAG = "ebyte_lora_e220";
enum MODE_TYPE {
MODE_0_NORMAL = 0,
MODE_0_TRANSMISSION = 0,
@ -80,32 +64,21 @@ enum PACKET_LENGHT {
#pragma pack(push, 1)
struct Speed {
uint8_t airDataRate : 3; // bit 0-2
std::string getAirDataRateDescription() {
return getAirDataRateDescriptionByParams(this->airDataRate);
}
std::string getAirDataRateDescription() { return getAirDataRateDescriptionByParams(this->airDataRate); }
uint8_t uartParity : 2; // bit 3-4
std::string getUARTParityDescription() {
return getUARTParityDescriptionByParams(this->uartParity);
}
std::string getUARTParityDescription() { return getUARTParityDescriptionByParams(this->uartParity); }
uint8_t uartBaudRate : 3; // bit 5-7
std::string getUARTBaudRateDescription() {
return getUARTBaudRateDescriptionByParams(this->uartBaudRate);
}
std::string getUARTBaudRateDescription() { return getUARTBaudRateDescriptionByParams(this->uartBaudRate); }
};
struct TransmissionMode {
byte WORPeriod : 3; // bit 2,1,0
std::string getWORPeriodByParamsDescription() {
return getWORPeriodByParams(this->WORPeriod);
}
std::string getWORPeriodByParamsDescription() { return getWORPeriodByParams(this->WORPeriod); }
byte reserved2 : 1; // bit 3
byte enableLBT : 1; // bit 4
std::string getLBTEnableByteDescription() {
return getLBTEnableByteByParams(this->enableLBT);
}
std::string getLBTEnableByteDescription() { return getLBTEnableByteByParams(this->enableLBT); }
byte reserved : 1; // bit 5
byte fixedTransmission : 1; // bit 6
@ -114,9 +87,7 @@ struct TransmissionMode {
}
byte enableRSSI : 1; // bit 7
std::string getRSSIEnableByteDescription() {
return getRSSIEnableByteByParams(this->enableRSSI);
}
std::string getRSSIEnableByteDescription() { return getRSSIEnableByteByParams(this->enableRSSI); }
};
struct Option {
@ -127,15 +98,10 @@ struct Option {
uint8_t reserved : 3; // bit 2-4
uint8_t RSSIAmbientNoise : 1; // bit 5
std::string getRSSIAmbientNoiseEnable() {
return getRSSIAmbientNoiseEnableByParams(this->RSSIAmbientNoise);
}
std::string getRSSIAmbientNoiseEnable() { return getRSSIAmbientNoiseEnableByParams(this->RSSIAmbientNoise); }
uint8_t subPacketSetting : 2; // bit 6-7
std::string getSubPacketSetting() {
return getSubPacketSettingByParams(this->subPacketSetting);
}
std::string getSubPacketSetting() { return getSubPacketSettingByParams(this->subPacketSetting); }
};
struct Crypt {
@ -155,9 +121,7 @@ struct Configuration {
struct Option OPTION;
byte CHAN = 0;
std::string getChannelDescription() {
return std::string(this->CHAN + OPERATING_FREQUENCY) + F("MHz");
}
std::string getChannelDescription() { return std::string(this->CHAN + OPERATING_FREQUENCY) + F("MHz"); }
struct TransmissionMode TRANSMISSION_MODE;
@ -176,18 +140,14 @@ struct ModuleInformation {
struct ResponseStatus {
std::std::string code;
std::std::string getResponseDescription() {
return getResponseDescriptionByParams(this->code);
}
std::std::string getResponseDescription() { return getResponseDescriptionByParams(this->code); }
};
struct ResponseStructContainer {
void *data;
byte rssi;
ResponseStatus status;
void close() {
free(this->data);
}
void close() { free(this->data); }
};
struct ResponseContainer {
std::string data;
@ -195,8 +155,7 @@ struct ResponseContainer {
ResponseStatus status;
};
struct ConfigurationMessage
{
struct ConfigurationMessage {
byte specialCommand1 = 0xCF;
byte specialCommand2 = 0xCF;
@ -213,32 +172,17 @@ struct ConfigurationMessage
class LoRa_E220 {
public:
#ifdef ACTIVATE_SOFTWARE_SERIAL
LoRa_E220(byte txE220pin, byte rxE220pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E220(byte txE220pin, byte rxE220pin, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E220(byte txE220pin, byte rxE220pin, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
#endif
LoRa_E220(HardwareSerial *serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E220(HardwareSerial *serial, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E220(HardwareSerial *serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
#ifdef HARDWARE_SERIAL_SELECTABLE_PIN
LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial* serial, UART_BPS_RATE bpsRate, uint32_t serialConfig = SERIAL_8N1);
LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial* serial, byte auxPin, UART_BPS_RATE bpsRate, uint32_t serialConfig = SERIAL_8N1);
LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate, uint32_t serialConfig = SERIAL_8N1);
LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial *serial, UART_BPS_RATE bpsRate,
uint32_t serialConfig = SERIAL_8N1);
LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial *serial, byte auxPin, UART_BPS_RATE bpsRate,
uint32_t serialConfig = SERIAL_8N1);
LoRa_E220(byte txE220pin, byte rxE220pin, HardwareSerial *serial, byte auxPin, byte m0Pin, byte m1Pin,
UART_BPS_RATE bpsRate, uint32_t serialConfig = SERIAL_8N1);
#endif
#ifdef ACTIVATE_SOFTWARE_SERIAL
LoRa_E220(SoftwareSerial* serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E220(SoftwareSerial* serial, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E220(SoftwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
#endif
// LoRa_E220(byte txE220pin, byte rxE220pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600, MODE_TYPE mode = MODE_0_NORMAL);
// LoRa_E220(HardwareSerial* serial = &Serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600, MODE_TYPE mode = MODE_0_NORMAL);
// LoRa_E220(SoftwareSerial* serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600, MODE_TYPE mode = MODE_0_NORMAL);
bool begin();
Status setMode(MODE_TYPE mode);
MODE_TYPE getMode();
@ -270,16 +214,13 @@ class LoRa_E220 {
ResponseContainer receiveInitialMessage(const uint8_t size);
ResponseStatus sendConfigurationMessage( byte ADDH,byte ADDL, byte CHAN, Configuration *configuration, PROGRAM_COMMAND programCommand = WRITE_CFG_PWR_DWN_SAVE);
ResponseStatus sendConfigurationMessage(byte ADDH, byte ADDL, byte CHAN, Configuration *configuration,
PROGRAM_COMMAND programCommand = WRITE_CFG_PWR_DWN_SAVE);
int available();
private:
HardwareSerial *hs;
#ifdef ACTIVATE_SOFTWARE_SERIAL
SoftwareSerial* ss;
#endif
bool isSoftwareSerial = true;
int8_t txE220pin = -1;
@ -300,34 +241,23 @@ class LoRa_E220 {
UART_BPS_RATE bpsRate = UART_BPS_RATE_9600;
struct NeedsStream {
template<typename T>
void begin(T &t, uint32_t baud) {
DEBUG_PRINTLN("Begin ");
template<typename T> void begin(T &t, uint32_t baud) {
ESP_LOGD(TAG, "Begin ");
t.setTimeout(500);
t.begin(baud);
stream = &t;
}
#ifdef HARDWARE_SERIAL_SELECTABLE_PIN
// template< typename T >
// void begin( T &t, uint32_t baud, SerialConfig config ){
// DEBUG_PRINTLN("Begin ");
// t.setTimeout(500);
// t.begin(baud, config);
// stream = &t;
// }
//
template< typename T >
void begin( T &t, uint32_t baud, uint32_t config ) {
DEBUG_PRINTLN("Begin ");
template<typename T> void begin(T &t, uint32_t baud, uint32_t config) {
ESP_LOGD(TAG, "Begin ");
t.setTimeout(500);
t.begin(baud, config);
stream = &t;
}
template< typename T >
void begin( T &t, uint32_t baud, uint32_t config, int8_t txE220pin, int8_t rxE220pin ) {
DEBUG_PRINTLN("Begin ");
template<typename T> void begin(T &t, uint32_t baud, uint32_t config, int8_t txE220pin, int8_t rxE220pin) {
ESP_LOGD(TAG, "Begin ");
t.setTimeout(500);
t.begin(baud, config, txE220pin, rxE220pin);
stream = &t;

View file

@ -39,86 +39,77 @@ typedef enum RESPONSE_STATUS {
ERR_E220_PACKET_TOO_BIG
} Status;
static String getResponseDescriptionByParams(byte status){
switch (status)
{
static std::string getResponseDescriptionByParams(byte status) {
switch (status) {
case E220_SUCCESS:
return F("Success");
return "Success";
break;
case ERR_E220_UNKNOWN:
return F("Unknown");
return "Unknown";
break;
case ERR_E220_NOT_SUPPORT:
return F("Not support!");
return "Not support!";
break;
case ERR_E220_NOT_IMPLEMENT:
return F("Not implement");
return "Not implement";
break;
case ERR_E220_NOT_INITIAL:
return F("Not initial!");
return "Not initial!";
break;
case ERR_E220_INVALID_PARAM:
return F("Invalid param!");
return "Invalid param!";
break;
case ERR_E220_DATA_SIZE_NOT_MATCH:
return F("Data size not match!");
return "Data size not match!";
break;
case ERR_E220_BUF_TOO_SMALL:
return F("Buff too small!");
return "Buff too small!";
break;
case ERR_E220_TIMEOUT:
return F("Timeout!!");
return "Timeout!!";
break;
case ERR_E220_HARDWARE:
return F("Hardware error!");
return "Hardware error!";
break;
case ERR_E220_HEAD_NOT_RECOGNIZED:
return F("Save mode returned not recognized!");
return "Save mode returned not recognized!";
break;
case ERR_E220_NO_RESPONSE_FROM_DEVICE:
return F("No response from device! (Check wiring)");
return "No response from device! (Check wiring)";
break;
case ERR_E220_WRONG_UART_CONFIG:
return F("Wrong UART configuration! (BPS must be 9600 for configuration)");
return "Wrong UART configuration! (BPS must be 9600 for configuration)";
break;
case ERR_E220_PACKET_TOO_BIG:
return F("The device support only 200byte of data transmission!");
return "The device support only 200byte of data transmission!";
break;
default:
return F("Invalid status!");
return "Invalid status!";
}
}
enum E220_UART_PARITY
{
MODE_00_8N1 = 0b00,
MODE_01_8O1 = 0b01,
MODE_10_8E1 = 0b10,
MODE_11_8N1 = 0b11
};
enum E220_UART_PARITY { MODE_00_8N1 = 0b00, MODE_01_8O1 = 0b01, MODE_10_8E1 = 0b10, MODE_11_8N1 = 0b11 };
static String getUARTParityDescriptionByParams(byte uartParity){
switch (uartParity)
{
static std::string getUARTParityDescriptionByParams(byte uartParity) {
switch (uartParity) {
case MODE_00_8N1:
return F("8N1 (Default)");
return "8N1 (Default)";
break;
case MODE_01_8O1:
return F("8O1");
return "8O1";
break;
case MODE_10_8E1:
return F("8E1");
return "8E1";
break;
case MODE_11_8N1:
return F("8N1 (equal to 00");
return "8N1 (equal to 00";
break;
default:
return F("Invalid UART Parity!");
return "Invalid UART Parity!";
}
}
enum UART_BPS_TYPE
{
enum UART_BPS_TYPE {
UART_BPS_1200 = 0b000,
UART_BPS_2400 = 0b001,
UART_BPS_4800 = 0b010,
@ -129,8 +120,7 @@ enum UART_BPS_TYPE
UART_BPS_115200 = 0b111
};
enum UART_BPS_RATE
{
enum UART_BPS_RATE {
UART_BPS_RATE_1200 = 1200,
UART_BPS_RATE_2400 = 2400,
UART_BPS_RATE_4800 = 4800,
@ -141,41 +131,38 @@ enum UART_BPS_RATE
UART_BPS_RATE_115200 = 115200
};
static String getUARTBaudRateDescriptionByParams(byte uartBaudRate)
{
switch (uartBaudRate)
{
static std::string getUARTBaudRateDescriptionByParams(byte uartBaudRate) {
switch (uartBaudRate) {
case UART_BPS_1200:
return F("1200bps");
return "1200bps";
break;
case UART_BPS_2400:
return F("2400bps");
return "2400bps";
break;
case UART_BPS_4800:
return F("4800bps");
return "4800bps";
break;
case UART_BPS_9600:
return F("9600bps (default)");
return "9600bps (default)";
break;
case UART_BPS_19200:
return F("19200bps");
return "19200bps";
break;
case UART_BPS_38400:
return F("38400bps");
return "38400bps";
break;
case UART_BPS_57600:
return F("57600bps");
return "57600bps";
break;
case UART_BPS_115200:
return F("115200bps");
return "115200bps";
break;
default:
return F("Invalid UART Baud Rate!");
return "Invalid UART Baud Rate!";
}
}
enum AIR_DATA_RATE
{
enum AIR_DATA_RATE {
AIR_DATA_RATE_000_24 = 0b000,
AIR_DATA_RATE_001_24 = 0b001,
AIR_DATA_RATE_010_24 = 0b010,
@ -186,37 +173,34 @@ enum AIR_DATA_RATE
AIR_DATA_RATE_111_625 = 0b111
};
static String getAirDataRateDescriptionByParams(byte airDataRate)
{
switch (airDataRate)
{
static std::string getAirDataRateDescriptionByParams(byte airDataRate) {
switch (airDataRate) {
case AIR_DATA_RATE_000_24:
return F("2.4kbps");
return "2.4kbps";
break;
case AIR_DATA_RATE_001_24:
return F("2.4kbps");
return "2.4kbps";
break;
case AIR_DATA_RATE_010_24:
return F("2.4kbps (default)");
return "2.4kbps (default)";
break;
case AIR_DATA_RATE_011_48:
return F("4.8kbps");
return "4.8kbps";
break;
case AIR_DATA_RATE_100_96:
return F("9.6kbps");
return "9.6kbps";
break;
case AIR_DATA_RATE_101_192:
return F("19.2kbps");
return "19.2kbps";
break;
case AIR_DATA_RATE_110_384:
return F("38.4kbps");
return "38.4kbps";
break;
case AIR_DATA_RATE_111_625:
return F("62.5kbps");
return "62.5kbps";
break;
default:
return F("Invalid Air Data Rate!");
return "Invalid Air Data Rate!";
}
}
@ -227,43 +211,36 @@ enum SUB_PACKET_SETTING {
SPS_032_11 = 0b11
};
static String getSubPacketSettingByParams(byte subPacketSetting)
{
switch (subPacketSetting)
{
static std::string getSubPacketSettingByParams(byte subPacketSetting) {
switch (subPacketSetting) {
case SPS_200_00:
return F("200bytes (default)");
return "200bytes (default)";
break;
case SPS_128_01:
return F("128bytes");
return "128bytes";
break;
case SPS_064_10:
return F("64bytes");
return "64bytes";
break;
case SPS_032_11:
return F("32bytes");
return "32bytes";
break;
default:
return F("Invalid Sub Packet Setting!");
return "Invalid Sub Packet Setting!";
}
}
enum RSSI_AMBIENT_NOISE_ENABLE {
RSSI_AMBIENT_NOISE_ENABLED = 0b1,
RSSI_AMBIENT_NOISE_DISABLED = 0b0
};
static String getRSSIAmbientNoiseEnableByParams(byte rssiAmbientNoiseEnabled)
{
switch (rssiAmbientNoiseEnabled)
{
enum RSSI_AMBIENT_NOISE_ENABLE { RSSI_AMBIENT_NOISE_ENABLED = 0b1, RSSI_AMBIENT_NOISE_DISABLED = 0b0 };
static std::string getRSSIAmbientNoiseEnableByParams(byte rssiAmbientNoiseEnabled) {
switch (rssiAmbientNoiseEnabled) {
case RSSI_AMBIENT_NOISE_ENABLED:
return F("Enabled");
return "Enabled";
break;
case RSSI_AMBIENT_NOISE_DISABLED:
return F("Disabled (default)");
return "Disabled (default)";
break;
default:
return F("Invalid RSSI Ambient Noise enabled!");
return "Invalid RSSI Ambient Noise enabled!";
}
}
@ -278,101 +255,81 @@ enum WOR_PERIOD {
WOR_4000_111 = 0b111
};
static String getWORPeriodByParams(byte WORPeriod)
{
switch (WORPeriod)
{
static std::string getWORPeriodByParams(byte WORPeriod) {
switch (WORPeriod) {
case WOR_500_000:
return F("500ms");
return "500ms";
break;
case WOR_1000_001:
return F("1000ms");
return "1000ms";
break;
case WOR_1500_010:
return F("1500ms");
return "1500ms";
break;
case WOR_2000_011:
return F("2000ms (default)");
return "2000ms (default)";
break;
case WOR_2500_100:
return F("2500ms");
return "2500ms";
break;
case WOR_3000_101:
return F("3000ms");
return "3000ms";
break;
case WOR_3500_110:
return F("3500ms");
return "3500ms";
break;
case WOR_4000_111:
return F("4000ms");
return "4000ms";
break;
default:
return F("Invalid WOR period!");
return "Invalid WOR period!";
}
}
enum LBT_ENABLE_BYTE {
LBT_ENABLED = 0b1,
LBT_DISABLED = 0b0
};
static String getLBTEnableByteByParams(byte LBTEnableByte)
{
switch (LBTEnableByte)
{
enum LBT_ENABLE_BYTE { LBT_ENABLED = 0b1, LBT_DISABLED = 0b0 };
static std::string getLBTEnableByteByParams(byte LBTEnableByte) {
switch (LBTEnableByte) {
case LBT_ENABLED:
return F("Enabled");
return "Enabled";
break;
case LBT_DISABLED:
return F("Disabled (default)");
return "Disabled (default)";
break;
default:
return F("Invalid LBT enable byte!");
return "Invalid LBT enable byte!";
}
}
enum RSSI_ENABLE_BYTE {
RSSI_ENABLED = 0b1,
RSSI_DISABLED = 0b0
};
static String getRSSIEnableByteByParams(byte RSSIEnableByte)
{
switch (RSSIEnableByte)
{
enum RSSI_ENABLE_BYTE { RSSI_ENABLED = 0b1, RSSI_DISABLED = 0b0 };
static std::string getRSSIEnableByteByParams(byte RSSIEnableByte) {
switch (RSSIEnableByte) {
case RSSI_ENABLED:
return F("Enabled");
return "Enabled";
break;
case RSSI_DISABLED:
return F("Disabled (default)");
return "Disabled (default)";
break;
default:
return F("Invalid RSSI enable byte!");
return "Invalid RSSI enable byte!";
}
}
enum FIDEX_TRANSMISSION
{
FT_TRANSPARENT_TRANSMISSION = 0b0,
FT_FIXED_TRANSMISSION = 0b1
};
enum FIDEX_TRANSMISSION { FT_TRANSPARENT_TRANSMISSION = 0b0, FT_FIXED_TRANSMISSION = 0b1 };
static String getFixedTransmissionDescriptionByParams(byte fixedTransmission)
{
switch (fixedTransmission)
{
static std::string getFixedTransmissionDescriptionByParams(byte fixedTransmission) {
switch (fixedTransmission) {
case FT_TRANSPARENT_TRANSMISSION:
return F("Transparent transmission (default)");
return "Transparent transmission (default)";
break;
case FT_FIXED_TRANSMISSION:
return F("Fixed transmission (first three bytes can be used as high/low address and channel)");
return "Fixed transmission (first three bytes can be used as high/low address and channel)";
break;
default:
return F("Invalid fixed transmission param!");
return "Invalid fixed transmission param!";
}
}
#ifdef E220_22
enum TRANSMISSION_POWER
{
enum TRANSMISSION_POWER {
POWER_22 = 0b00,
POWER_17 = 0b01,
POWER_13 = 0b10,
@ -380,29 +337,26 @@ static String getFixedTransmissionDescriptionByParams(byte fixedTransmission)
};
static String getTransmissionPowerDescriptionByParams(byte transmissionPower)
{
switch (transmissionPower)
{
static std::string getTransmissionPowerDescriptionByParams(byte transmissionPower) {
switch (transmissionPower) {
case POWER_22:
return F("22dBm (Default)");
return "22dBm (Default)";
break;
case POWER_17:
return F("17dBm");
return "17dBm";
break;
case POWER_13:
return F("13dBm");
return "13dBm";
break;
case POWER_10:
return F("10dBm");
return "10dBm";
break;
default:
return F("Invalid transmission power param");
return "Invalid transmission power param";
}
}
#elif defined(E220_30)
enum TRANSMISSION_POWER
{
enum TRANSMISSION_POWER {
POWER_30 = 0b00,
POWER_27 = 0b01,
POWER_24 = 0b10,
@ -410,29 +364,26 @@ static String getFixedTransmissionDescriptionByParams(byte fixedTransmission)
};
static String getTransmissionPowerDescriptionByParams(byte transmissionPower)
{
switch (transmissionPower)
{
static std::string getTransmissionPowerDescriptionByParams(byte transmissionPower) {
switch (transmissionPower) {
case POWER_30:
return F("30dBm (Default)");
return "30dBm (Default)";
break;
case POWER_27:
return F("27dBm");
return "27dBm";
break;
case POWER_24:
return F("24dBm");
return "24dBm";
break;
case POWER_21:
return F("21dBm");
return "21dBm";
break;
default:
return F("Invalid transmission power param");
return "Invalid transmission power param";
}
}
#else
enum TRANSMISSION_POWER
{
enum TRANSMISSION_POWER {
POWER_22 = 0b00,
POWER_17 = 0b01,
POWER_13 = 0b10,
@ -440,24 +391,22 @@ static String getFixedTransmissionDescriptionByParams(byte fixedTransmission)
};
static String getTransmissionPowerDescriptionByParams(byte transmissionPower)
{
switch (transmissionPower)
{
static std::string getTransmissionPowerDescriptionByParams(byte transmissionPower) {
switch (transmissionPower) {
case POWER_22:
return F("22dBm (Default)");
return "22dBm (Default)";
break;
case POWER_17:
return F("17dBm");
return "17dBm";
break;
case POWER_13:
return F("13dBm");
return "13dBm";
break;
case POWER_10:
return F("10dBm");
return "10dBm";
break;
default:
return F("Invalid transmission power param");
return "Invalid transmission power param";
}
}
#endif