adds ability to set txPower from console, related to #78

This commit is contained in:
paidforby
2020-08-18 19:24:04 -04:00
parent 3125320ffe
commit 0edaa5c550
6 changed files with 88 additions and 11 deletions

View File

@@ -334,6 +334,7 @@ void setupWebSocket()
void setupLoRa()
{
char cfgStr[DATAGRAM_MESSAGE];
#ifdef LORA_CS
Serial.println("* Initializing LoRa...");
#ifdef LOPY4
@@ -341,8 +342,9 @@ void setupLoRa()
#endif
#ifdef ARDUINO_LORA
Layer1Class *Layer1_1 = new Layer1Class();
Layer1->setPins(LORA_CS, LORA_RST, LORA_IRQ);
Layer1->setLoRaFrequency(LORA_FREQ);
Layer1_1->setPins(LORA_CS, LORA_RST, LORA_IRQ);
Layer1_1->setLoRaFrequency(LORA_FREQ);
Layer1_1->setTxPower(txPower);
#endif
#ifdef RL_SX1276
pinMode(LORA_CS, OUTPUT);
@@ -374,7 +376,8 @@ void setupLoRa()
if (lora_client->init())
{
Serial.printf(" --> LL2 init succeeded\r\n");
Serial.printf(" --> LL2 node address: %s\n", nodeAddress);
LL2->getCurrentConfig(cfgStr);
Serial.printf("%s", cfgStr);
radio->connect(lora_client);
loraInitialized = true;
return;

View File

@@ -34,7 +34,7 @@ lib_deps =
ESP Async WebServer@1.2.3
LoRa@0.7.2
https://github.com/jgromes/RadioLib#3682c6c9215891e3afb7672f1235fde1c3bd75fd
https://github.com/sudomesh/LoRaLayer2#326a5705754dc6dc80996fb9c9fe58a55b16c2e1
https://github.com/sudomesh/LoRaLayer2#4b1a55c3b66e290c534ac62e77838480a6e3425e
https://github.com/paidforby/AsyncSDServer#13375c6be978cb34180378ecf4042a3a4a1f5eab
ESP8266 and ESP32 OLED driver for SSD1306 displays
TinyGPSPlus@1.0.2

View File

@@ -20,6 +20,9 @@ void LoRaClient::loop()
void LoRaClient::receive(struct Datagram datagram, size_t len)
{
struct Datagram response = {0};
int value;
int ret;
size_t msgLen;
// forward all messages to LL2, except those of type 'i'(info)
if(datagram.type == 'i'){
@@ -28,7 +31,7 @@ void LoRaClient::receive(struct Datagram datagram, size_t len)
LL2->getLocalAddress(localAddr);
memcpy(response.destination, BROADCAST, ADDR_LENGTH);
response.type = 'i';
size_t msgLen = sprintf((char *)response.message, "%s", localAddr);
msgLen = sprintf((char *)response.message, "%s", localAddr);
server->transmit(this, response, msgLen + DATAGRAM_HEADER);
}
else if(memcmp(&datagram.message[0], "lora", 4) == 0){
@@ -36,15 +39,28 @@ void LoRaClient::receive(struct Datagram datagram, size_t len)
LL2->getRoutingTable(r_table);
memcpy(response.destination, BROADCAST, ADDR_LENGTH);
response.type = 'i';
size_t msgLen = sprintf((char *)response.message, "%s", r_table);
msgLen = sprintf((char *)response.message, "%s", r_table);
server->transmit(this, response, msgLen + DATAGRAM_HEADER);
}
if(memcmp(&datagram.message[0], "config", 4) == 0){
else if(memcmp(&datagram.message[0], "config", 4) == 0){
char config[256] = {'\0'};
LL2->getCurrentConfig(config);
memcpy(response.destination, BROADCAST, ADDR_LENGTH);
response.type = 'i';
size_t msgLen = sprintf((char *)response.message, "%s", config);
msgLen = sprintf((char *)response.message, "%s", config);
server->transmit(this, response, msgLen + DATAGRAM_HEADER);
}
else if(memcmp(&datagram.message[0], "txpower", 4) == 0){
sscanf((char *)&datagram.message[8], "%d", &value);
ret = LL2->setTxPower(value, 1);
memcpy(response.destination, BROADCAST, ADDR_LENGTH);
response.type = 'i';
if(ret > 0){
msgLen = sprintf((char *)response.message, "TxPower on LoRa%d set to %ddB\r\n", ret, value);
}
else{
msgLen = sprintf((char *)response.message, "TxPower setting failed\r\n");
}
server->transmit(this, response, msgLen + DATAGRAM_HEADER);
}
}

View File

@@ -50,6 +50,7 @@ void Console::processLine(char *message, size_t len)
struct Datagram response;
memset(&response, 0, DATAGRAM_MESSAGE);
int msgLen;
int value;
// message might not be NULL ended
char msgBuff[len + 2] = {0};
@@ -72,7 +73,7 @@ void Console::processLine(char *message, size_t len)
if (strncmp(&args[0][1], "help", 4) == 0)
{
printf("Commands: /help /join /nick /raw /lora /set /restart\r\n");
printf("Commands: /help /join /nick /raw /lora /get /set /restart\r\n");
}
else if (strncmp(&args[0][1], "raw", 3) == 0)
{
@@ -90,6 +91,11 @@ void Console::processLine(char *message, size_t len)
server->transmit(this, response, msgLen + DATAGRAM_HEADER);
}
}
else if ((strncmp(&args[0][1], "get", 3) == 0) && (args.size() == 1)){
printf("No option provided, type '/get OPTION'\r\n");
printf("OPTIONs include,\r\n");
printf("'config' - print the current configuration of Layer1 interface and LL2 options\r\n");
}
else if ((strncmp(&args[0][1], "set", 3) == 0) && (args.size() > 1))
{
@@ -98,11 +104,46 @@ void Console::processLine(char *message, size_t len)
delay(500);
ESP.restart();
}
else if ((strncmp(&args[1][0], "txpower", 7) == 0) && (args.size() > 2)){
sscanf(&args[2][0], "%d", &value);
if((value < 2) || (value > 20)){
printf("Invalid value provided, type '/set txpower VAL'\r\n");
printf("'txpower VAL' - sets the transmit power of LoRa transceiver,\r\n");
printf(" where VAL is desired power in dB between 2 and 20\r\n");
}
else{
// save txPower to preferences, so it is maintained on next boot
saveTxPower(value);
// transmit setting change to LoRaClient
memcpy(response.destination, BROADCAST, ADDR_LENGTH);
response.type = 'i';
msgLen = sprintf((char *)response.message, "txpower %d", value);
server->transmit(this, response, msgLen + DATAGRAM_HEADER);
}
}
else if ((strncmp(&args[1][0], "txpower", 7) == 0) && (args.size() == 2)){
printf("No value provided, type '/set txpower VAL'\r\n");
printf("'txpower VAL' - sets the transmit power of LoRa transceiver,\r\n");
printf(" where VAL is desired power in dB between 2 and 20\r\n");
}
else{
printf("Setting provided does not exist, type '/set SETTING'\r\n");
printf("SETTINGs include,\r\n");
printf("'ui' - toggles between WiFi and BLE user interface\r\n");
printf("'txpower VAL' - sets the transmit power of LoRa transceiver,\r\n");
printf(" where VAL is desired power in dB between 2 and 20\r\n");
}
}
else if ((strncmp(&args[0][1], "set", 3) == 0) && (args.size() == 1)){
printf("No setting provided, type '/set SETTING'\r\n");
printf("SETTINGs include,\r\n");
printf("'ui' - toggles between WiFi and BLE user interface\r\n");
printf("'txpower VAL' - sets the transmit power of LoRa transceiver,\r\n");
printf(" where VAL is desired power in dB between 2 and 20\r\n");
}
else if (((strncmp(&args[0][1], "join", 4) == 0) || (strncmp(&args[0][1], "nick", 4) == 0)) && (args.size() > 1))

View File

@@ -4,6 +4,7 @@ Preferences preferences;
String username = "";
bool useBLE = true;
int txPower = 17;
void getSettings(void)
{
@@ -25,8 +26,10 @@ void getSettings(void)
// Try to get UI settings, defaults to WiFi!
useBLE = preferences.getBool("ble", false);
Serial.printf("Got IF setting %s\n", useBLE ? "BLE" : "WiFi");
txPower = preferences.getInt("txPwr", false);
Serial.printf("Got txPwr setting %d\n", txPower);
preferences.end();
return;
@@ -64,6 +67,18 @@ void saveUI(bool useBLE)
preferences.end();
}
void saveTxPower(int txPower)
{
if (!preferences.begin("dr", false))
{
Serial.println("Error opening preferences");
return;
}
preferences.putInt("txPwr", txPower);
preferences.end();
}
/*
void saveLRFQ(int lrfq)
{

View File

@@ -5,6 +5,8 @@
void getSettings(void);
void saveUsername(String newUserName);
void saveUI(bool useBLE);
void saveTxPower(int txPower);
extern String username;
extern bool useBLE;
extern bool useBLE;
extern int txPower;