Compare commits

..

3 Commits

Author SHA1 Message Date
6a48dcd61e upd 2026-01-13 01:14:51 +01:00
eed612f457 test 2026-01-08 08:17:23 +01:00
47b4a51ca2 test 2026-01-08 07:56:53 +01:00
12 changed files with 185 additions and 73 deletions

View File

File diff suppressed because one or more lines are too long

View File

@@ -211,8 +211,9 @@ const char *getStringRole (uint8_t role) {
void populateDefaults() { void populateDefaults() {
uint8_t seed[32]; uint8_t seed[32];
// memcpy(seed, "vFt0FRugSOeqnkshImMCVfgHM5vBxz4", 32); //chat node identity //memcpy(seed, "vFt0FRugSOeqnkshImMCVfgHM5vBxz4", 32); //chat node identity
memcpy (seed, "vFt0FRugSOeqnkshImMCVfgHM5vBxz3", 32); // repeater identity //memcpy (seed, "vFt0FRugSOeqnkshImMCVfgHM5vBxz3", 32); // repeater identity
memcpy (seed, "vFt0FRugSOeqnkshImMCVfgHM5vBxz0", 32); // repeater identity
// genSeed(seed); //random identity // genSeed(seed); //random identity
ed25519_create_keypair (persistent.pubkey, persistent.privkey, seed); ed25519_create_keypair (persistent.pubkey, persistent.privkey, seed);
@@ -222,7 +223,8 @@ void populateDefaults() {
persistent.nodeType = NODE_TYPE_REPEATER; persistent.nodeType = NODE_TYPE_REPEATER;
memset (persistent.password, 0, sizeof (persistent.password)); memset (persistent.password, 0, sizeof (persistent.password));
strcpy (persistent.password, "hesielko"); strcpy (persistent.password, "hesielko");
strcpy (persistent.nodeName, "BRN RiscVpeater"); strcpy (persistent.nodeName, "BRN WCHNode RISCV");
//strcpy (persistent.nodeName, "BRN RiscVnode");
persistent.adcMultiplier = 0; persistent.adcMultiplier = 0;

View File

@@ -75,7 +75,7 @@ void RTC_Set_From_BuildTime(void) {
(date[5] - '0'); (date[5] - '0');
uint8_t hour = uint8_t hour =
(time[0] - '0') * 10 + (time[1] - '0'); (time[0] - '0') * 10 + (time[1] - '0') - 1;
uint8_t min = uint8_t min =
(time[3] - '0') * 10 + (time[4] - '0'); (time[3] - '0') * 10 + (time[4] - '0');
uint8_t sec = uint8_t sec =

View File

@@ -82,10 +82,16 @@ TaskHandle_t Task2Task_Handler;
// uint8_t bufIn[260]; // uint8_t bufIn[260];
uint8_t bootedUp = 0;
void task2_task (void *pvParameters) { void task2_task (void *pvParameters) {
char x; char x;
MESH_LOGD (TAG, "Task2 boot"); MESH_LOGD (TAG, "Task2 boot");
while (1) { while (1) {
if (bootedUp == 0) {
vTaskDelay(pdMS_TO_TICKS(1000));
continue;
}
if (USART_GetFlagStatus (USART1, USART_FLAG_RXNE) == SET) { if (USART_GetFlagStatus (USART1, USART_FLAG_RXNE) == SET) {
x = USART_ReceiveData (USART1); x = USART_ReceiveData (USART1);
if (x == 'M') { if (x == 'M') {
@@ -147,14 +153,17 @@ void task1_task (void *pvParameters) {
memset (&stats, 0, sizeof (stats)); memset (&stats, 0, sizeof (stats));
DiscoverRequestPayload discReq; /*
discReq.prefixOnly = 0; DiscoverRequestPayload discReq;
discReq.since = 0; discReq.prefixOnly = 0;
discReq.tag = RTC_GetCounter(); discReq.since = 0;
discReq.typeFilter = 0xFF; discReq.tag = RTC_GetCounter();
sendDiscoverRequest (&discReq); discReq.typeFilter = 0xFF;
sendDiscoverRequest (&discReq);
sendAdvert (1); */
sendAdvert (0);
bootedUp = 1;
while (1) { while (1) {
start_time = xTaskGetTickCount(); start_time = xTaskGetTickCount();

View File

@@ -218,19 +218,28 @@ void printFrameHeader (const FrameStruct *frame) {
} }
void LoRaTransmit (const FrameStruct *frame) { void LoRaTransmit (const FrameStruct *frame) {
uint8_t len = 2; // header + path_len addToNotReTX(frame);
uint16_t len = 2; // header + path_len
if ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT || if (
(frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT) ||
((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD)
) {
len += 4; len += 4;
} }
len += frame->path.pathLen; len += frame->path.pathLen;
len += frame->payloadLen; len += frame->payloadLen;
if (len > 255) {
MESH_LOGE(TAG, "%d is too big for sx1262", len);
}
uint16_t irqStatus; uint16_t irqStatus;
char rv = 0; char rv = 0;
size_t outCounter = 0;
if (txActive == 0) { if (txActive == 0) {
txActive = 1; txActive = 1;
@@ -262,6 +271,7 @@ void LoRaTransmit (const FrameStruct *frame) {
switch (state) { switch (state) {
case 0: // header case 0: // header
out = frame->header; out = frame->header;
outCounter = 0;
state = ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT || state = ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT ||
(frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD)
? 1 ? 1
@@ -293,6 +303,7 @@ void LoRaTransmit (const FrameStruct *frame) {
} }
while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_TXE) == RESET); while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_TXE) == RESET);
outCounter++;
SPI_I2S_SendData (SPI1, out); SPI_I2S_SendData (SPI1, out);
while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_RXNE) == RESET); while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_RXNE) == RESET);
@@ -303,14 +314,30 @@ void LoRaTransmit (const FrameStruct *frame) {
WaitForIdle (BUSY_WAIT, "end WriteBuffer", 0); WaitForIdle (BUSY_WAIT, "end WriteBuffer", 0);
SetTx (5000); MESH_LOGD(TAG,
"TX payloadLen=%u pathLen=%u totalLen=%u header=0x%02X",
frame->payloadLen,
frame->path.pathLen,
len,
frame->header);
MESH_LOGD(TAG, "Starting tx mode, sent %d, should %d", outCounter, len);
SetTx (3000);
MESH_LOGD(TAG, "SetTx running");
irqStatus = GetIrqStatus(); irqStatus = GetIrqStatus();
while (!(irqStatus & (SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT))) { while (!(irqStatus & (SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT))) {
vTaskDelay (1); vTaskDelay (pdMS_TO_TICKS(10));
irqStatus = GetIrqStatus(); irqStatus = GetIrqStatus();
if (debugPrint) {
MESH_LOGD(TAG, "irq: 0x%04X", irqStatus);
}
} }
MESH_LOGD(TAG, "Finished tx");
txActive = 0; txActive = 0;
SetRx (0xFFFFFF); SetRx (0xFFFFFF);
@@ -380,8 +407,54 @@ void sendFrame (const FrameStruct *frame) {
} }
*/ */
KnownPacketHistoryType dontReTXHistory[NON_RETX_HISTORY];
uint8_t dontReTXHistoryIndex = 0;
void getFrameHash(const FrameStruct *frame, uint8_t *hash) {
cf_sha256_context ctx;
// 1. Initialize
cf_sha256_init (&ctx);
// 2. Feed in your data
cf_sha256_update (&ctx, frame->payload, frame->payloadLen);
// 3. Compute digest
cf_sha256_digest (&ctx, hash);
}
void addToNotReTX(const FrameStruct *frame) {
KnownPacketHistoryType * knownHist = &(dontReTXHistory[dontReTXHistoryIndex]);
getFrameHash(frame, knownHist->hash);
knownHist->populated = 1;
dontReTXHistoryIndex++;
if (dontReTXHistoryIndex >= NON_RETX_HISTORY) {
dontReTXHistoryIndex = 0;
}
}
void retransmitFrame (FrameStruct *frame) { void retransmitFrame (FrameStruct *frame) {
uint8_t hashTmp[CF_SHA256_HASHSZ];
getFrameHash(frame, hashTmp);
uint8_t found = 0;
for (uint8_t i = 0; i < NON_RETX_HISTORY; i++) {
KnownPacketHistoryType * knownHist = &(dontReTXHistory[dontReTXHistoryIndex]);
if (knownHist->populated == 0) {
continue;
}
if (memcmp(knownHist->hash, hashTmp, CF_SHA256_HASHSZ) == 0) {
found = 1;
break;
}
}
if (found) {
return;
}
/* -------- FLOOD -------- */ /* -------- FLOOD -------- */
if (frame->header & ROUTE_TYPE_FLOOD || if (frame->header & ROUTE_TYPE_FLOOD ||
frame->header & ROUTE_TYPE_TRANSPORT_FLOOD) { frame->header & ROUTE_TYPE_TRANSPORT_FLOOD) {

View File

@@ -11,6 +11,7 @@
#define KEY_SIZE 16 // 128-bit AES #define KEY_SIZE 16 // 128-bit AES
#define HMAC_SIZE 2 // meshcore size #define HMAC_SIZE 2 // meshcore size
#define MAX_FLOOD_TTL 64 #define MAX_FLOOD_TTL 64
#define NON_RETX_HISTORY 64
int ReadFrame (FrameStruct *frame, int8_t *rssiPacket, int8_t *snrPacket, int8_t *rawSnr); int ReadFrame (FrameStruct *frame, int8_t *rssiPacket, int8_t *snrPacket, int8_t *rawSnr);
@@ -33,5 +34,12 @@ int encrypt_then_mac (const uint8_t *aes_key, const uint8_t keySize, const uint8
int mac_then_decrypt (const uint8_t *aes_key, const uint8_t keySize, const uint8_t *input, size_t ilen, uint8_t *plaintext); int mac_then_decrypt (const uint8_t *aes_key, const uint8_t keySize, const uint8_t *input, size_t ilen, uint8_t *plaintext);
void addToNotReTX(const FrameStruct *frame);
typedef struct KnownPacketHistoryType {
uint8_t hash[32];
uint8_t populated;
} KnownPacketHistoryType;
#endif #endif

View File

@@ -142,6 +142,7 @@ void decodeAnonReq (const FrameStruct *frame) {
if (foundNode == NULL) { if (foundNode == NULL) {
foundNode = getNextNode(); foundNode = getNextNode();
strcpy (foundNode->name, "Anonymous node"); strcpy (foundNode->name, "Anonymous node");
foundNode->path.pathLen = 0;
memcpy (foundNode->pubKey, anonReq.pubKey, sizeof (foundNode->pubKey)); memcpy (foundNode->pubKey, anonReq.pubKey, sizeof (foundNode->pubKey));
ed25519_key_exchange ((unsigned char *)foundNode->secret, anonReq.pubKey, persistent.privkey); ed25519_key_exchange ((unsigned char *)foundNode->secret, anonReq.pubKey, persistent.privkey);
foundNode->gps_latitude = 0; foundNode->gps_latitude = 0;

View File

@@ -24,7 +24,8 @@
void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const uint8_t *plain, size_t plainLen) { void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const uint8_t *plain, size_t plainLen) {
FrameStruct frame; FrameStruct frame;
uint8_t offset = 0; memset(&frame, 0, sizeof(frame));
size_t offset = 0;
// 1. Header // 1. Header
frame.header = frame.header =
@@ -46,6 +47,8 @@ void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const
frame.payload + offset, frame.payload + offset,
&encLen); &encLen);
MESH_LOGD(TAG, "Plain len: %d, enc len: %d", plainLen, encLen);
offset += encLen; offset += encLen;
// 5. Finalize // 5. Finalize
@@ -54,6 +57,7 @@ void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const
hexdump ("Encrypted frame", frame.payload, frame.payloadLen); hexdump ("Encrypted frame", frame.payload, frame.payloadLen);
LoRaTransmit (&frame); LoRaTransmit (&frame);
MESH_LOGD (TAG, "Encrypted frame tx finish\n");
} }
void sendEncryptedTextMessage (const NodeEntry *targetNode, const PlainTextMessagePayload *msg) { void sendEncryptedTextMessage (const NodeEntry *targetNode, const PlainTextMessagePayload *msg) {
@@ -317,52 +321,57 @@ void parseEncryptedPayload (const EncryptedPayloadStruct *enc) {
Response resp; Response resp;
resp.tag = req.timestamp; resp.tag = req.timestamp;
enc->remNode->last_seen_rt = req.timestamp; enc->remNode->last_seen_rt = req.timestamp;
uint8_t index2 = 0; resp.dataLen = 0;
resp.data[index2++] = TELEM_CHANNEL_SELF; resp.data[resp.dataLen++] = TELEM_CHANNEL_SELF;
resp.data[index2++] = LPP_TEMPERATURE; resp.data[resp.dataLen++] = LPP_TEMPERATURE;
int16_t dataTemp = getDeciTemperature(); int16_t dataTemp = getDeciTemperature();
printf ("The temperature is %d decicelsius\n", dataTemp); resp.data[resp.dataLen++] = (dataTemp >> 8) & 0xFF;
resp.data[index2++] = (dataTemp >> 8) & 0xFF; resp.data[resp.dataLen++] = dataTemp & 0xFF;
resp.data[index2++] = dataTemp & 0xFF; resp.data[resp.dataLen++] = TELEM_CHANNEL_SELF;
resp.data[resp.dataLen++] = LPP_VOLTAGE;
resp.data[index2++] = TELEM_CHANNEL_SELF;
resp.data[index2++] = LPP_VOLTAGE;
int16_t dataVolt = stats.millivolts / 10; int16_t dataVolt = stats.millivolts / 10;
resp.data[index2++] = (dataVolt >> 8) & 0xFF; resp.data[resp.dataLen++] = (dataVolt >> 8) & 0xFF;
resp.data[index2++] = dataVolt & 0xFF; resp.data[resp.dataLen++] = dataVolt & 0xFF;
resp.data[resp.dataLen++] = 2;
resp.data[resp.dataLen++] = LPP_VOLTAGE;
dataVolt = 1973;
resp.data[resp.dataLen++] = (dataVolt >> 8) & 0xFF;
resp.data[resp.dataLen++] = dataVolt & 0xFF;
if (enc->remNode->authenticated) { if (enc->remNode->authenticated) {
encode_gps (TELEM_CHANNEL_SELF, persistent.latitude / 1000000.0f, persistent.longitude / 1000000.0f, persistent.altitude / 100.0f, &(resp.data[index2])); resp.data[resp.dataLen++] = 2; // channel 2
// encode_gps(TELEM_CHANNEL_SELF, 48.1909f, 17.0303f, 234.0f, &(resp.data[index2])); resp.data[resp.dataLen++] = LPP_TEMPERATURE;
index2 += LPP_GPS_SIZE;
}
if (enc->remNode->authenticated) {
resp.data[index2++] = 2;
resp.data[index2++] = LPP_TEMPERATURE;
int16_t jokeTemp = 6942; int16_t jokeTemp = 6942;
resp.data[index2++] = (jokeTemp >> 8) & 0xFF; resp.data[resp.dataLen++] = (jokeTemp >> 8) & 0xFF;
resp.data[index2++] = jokeTemp & 0xFF; resp.data[resp.dataLen++] = jokeTemp & 0xFF;
resp.dataLen = index2;
encode_gps (TELEM_CHANNEL_SELF, persistent.latitude / 1000000.0f, persistent.longitude / 1000000.0f, persistent.altitude / 100.0f, &(resp.data[resp.dataLen]));
// encode_gps(TELEM_CHANNEL_SELF, 48.1909f, 17.0303f, 234.0f, &(resp.data[resp.dataLen]));
resp.dataLen += LPP_GPS_SIZE + 2;
} }
sendEncryptedResponse (enc->remNode, &resp); sendEncryptedResponse (enc->remNode, &resp);
printf ("Sent response, the temperature is %d decicelsius\n", dataTemp);
break; break;
} }
case REQUEST_GET_MIN_MAX_AVG: case REQUEST_GET_MIN_MAX_AVG:
@@ -421,7 +430,8 @@ void parseEncryptedPayload (const EncryptedPayloadStruct *enc) {
} }
} }
#define STR_EQ_LIT(s, lit) (memcmp ((s), (lit), sizeof (lit) - 1) == 0) // #define STR_EQ_LIT(s, lit) (memcmp ((s), (lit), sizeof (lit) - 1) == 0)
#define STR_EQ_LIT(s, lit) (strcmp (s, lit) == 0)
void processCommand (char *cmd, NodeEntry *remNode) { void processCommand (char *cmd, NodeEntry *remNode) {
PlainTextMessagePayload replyPayload; PlainTextMessagePayload replyPayload;
@@ -492,22 +502,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
} }
} }
/* ---------------- Neighbors ---------------- */ /*
else if (STR_EQ_LIT (cmd, "neighbors")) {
Callbacks_FormatNeighborsReply ((char *)reply);
} else if (STR_EQ_LIT (cmd, "neighbor.remove ")) {
const char *hex = cmd + 16;
uint8_t pubkey[PUB_KEY_SIZE];
int len = strlen (hex) / 2;
if (mesh_fromHex (pubkey, len, hex)) {
Callbacks_RemoveNeighbor (pubkey, len);
strcpy ((char *)reply, "OK");
} else {
strcpy ((char *)reply, "ERR: bad pubkey");
}
}
/* ---------------- Radio / Temp ---------------- */
else if (STR_EQ_LIT (cmd, "tempradio ")) { else if (STR_EQ_LIT (cmd, "tempradio ")) {
char tmp[64]; char tmp[64];
strcpy (tmp, &cmd[10]); strcpy (tmp, &cmd[10]);
@@ -529,6 +524,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
strcpy ((char *)reply, "Error, invalid params"); strcpy ((char *)reply, "Error, invalid params");
} }
} }
*/
/* ---------------- Password ---------------- */ /* ---------------- Password ---------------- */
else if (STR_EQ_LIT (cmd, "password ")) { else if (STR_EQ_LIT (cmd, "password ")) {
@@ -543,6 +539,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
if (memcmp (config, "af", 2) == 0) { if (memcmp (config, "af", 2) == 0) {
sprintf (reply, "> %f", persistent.airtimeFactor); sprintf (reply, "> %f", persistent.airtimeFactor);
/*
} else if (memcmp (config, "int.thresh", 10) == 0) { } else if (memcmp (config, "int.thresh", 10) == 0) {
sprintf (reply, "> %d", (uint32_t)_prefs->interference_threshold); sprintf (reply, "> %d", (uint32_t)_prefs->interference_threshold);
} else if (memcmp (config, "agc.reset.interval", 18) == 0) { } else if (memcmp (config, "agc.reset.interval", 18) == 0) {
@@ -554,7 +551,8 @@ void processCommand (char *cmd, NodeEntry *remNode) {
} else if (memcmp (config, "flood.advert.interval", 21) == 0) { } else if (memcmp (config, "flood.advert.interval", 21) == 0) {
sprintf (reply, "> %d", (uint32_t)_prefs->flood_advert_interval); sprintf (reply, "> %d", (uint32_t)_prefs->flood_advert_interval);
} else if (memcmp (config, "advert.interval", 15) == 0) { } else if (memcmp (config, "advert.interval", 15) == 0) {
sprintf (reply, "> %d", ((uint32_t)_prefs->advert_interval) * 2); sprintf (reply, "> %d", ((uint32_t)_prefs->advert_interval) * 2);1
*/
} else if (memcmp (config, "guest.password", 14) == 0) { } else if (memcmp (config, "guest.password", 14) == 0) {
sprintf (reply, "> %s", persistent.guestPassword); sprintf (reply, "> %s", persistent.guestPassword);
} else if (memcmp (config, "name", 4) == 0) { } else if (memcmp (config, "name", 4) == 0) {
@@ -565,6 +563,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
sprintf (reply, "> %d", persistent.latitude); sprintf (reply, "> %d", persistent.latitude);
} else if (memcmp (config, "lon", 3) == 0) { } else if (memcmp (config, "lon", 3) == 0) {
sprintf (reply, "> %d", persistent.longitude); sprintf (reply, "> %d", persistent.longitude);
/*
} else if (memcmp (config, "radio", 5) == 0) { } else if (memcmp (config, "radio", 5) == 0) {
char freq[16], bw[16]; char freq[16], bw[16];
snprintf(freq, sizeof(freq), "%lf", persistent.frequencyInHz / 1000000.0); snprintf(freq, sizeof(freq), "%lf", persistent.frequencyInHz / 1000000.0);
@@ -582,11 +581,12 @@ void processCommand (char *cmd, NodeEntry *remNode) {
sprintf (reply, "> %d", (uint32_t)_prefs->tx_power_dbm); sprintf (reply, "> %d", (uint32_t)_prefs->tx_power_dbm);
} else if (memcmp (config, "freq", 4) == 0) { } else if (memcmp (config, "freq", 4) == 0) {
sprintf (reply, "> %s", StrHelper::ftoa (_prefs->freq)); sprintf (reply, "> %s", StrHelper::ftoa (_prefs->freq));
*/
} else if (memcmp (config, "public.key", 10) == 0) { } else if (memcmp (config, "public.key", 10) == 0) {
strcpy (reply, "> "); strcpy (reply, "> ");
hexdump_compact(persistent.pubkey, sizeof(persistent.pubkey), &(reply[2]), 70); hexdump_compact (persistent.pubkey, sizeof (persistent.pubkey), &(reply[2]), 70);
} else if (memcmp (config, "role", 4) == 0) { } else if (memcmp (config, "role", 4) == 0) {
sprintf (reply, "> %s", getStringRole(persistent.nodeType)); sprintf (reply, "> %s", getStringRole (persistent.nodeType));
} else if (memcmp (config, "adc.multiplier", 14) == 0) { } else if (memcmp (config, "adc.multiplier", 14) == 0) {
sprintf (reply, "> %.3f", persistent.adcMultiplier); sprintf (reply, "> %.3f", persistent.adcMultiplier);
} else { } else {
@@ -600,6 +600,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
persistent.airtimeFactor = atof (&config[3]); persistent.airtimeFactor = atof (&config[3]);
// savePrefs(); // savePrefs();
strcpy (reply, "OK"); strcpy (reply, "OK");
/*
} else if (memcmp (config, "int.thresh ", 11) == 0) { } else if (memcmp (config, "int.thresh ", 11) == 0) {
_prefs->interference_threshold = atoi (&config[11]); _prefs->interference_threshold = atoi (&config[11]);
// savePrefs(); // savePrefs();
@@ -612,6 +613,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
_prefs->multi_acks = atoi (&config[11]); _prefs->multi_acks = atoi (&config[11]);
// savePrefs(); // savePrefs();
strcpy (reply, "OK"); strcpy (reply, "OK");
*/
} else if (memcmp (config, "allow.read.only ", 16) == 0) { } else if (memcmp (config, "allow.read.only ", 16) == 0) {
if (memcmp (&config[16], "on", 2) == 0) { if (memcmp (&config[16], "on", 2) == 0) {
persistent.allowReadOnly = 1; persistent.allowReadOnly = 1;
@@ -620,8 +622,8 @@ void processCommand (char *cmd, NodeEntry *remNode) {
persistent.allowReadOnly = 0; persistent.allowReadOnly = 0;
strcpy (reply, "OK"); strcpy (reply, "OK");
} }
//savePrefs(); // savePrefs();
/*
} else if (memcmp (config, "flood.advert.interval ", 22) == 0) { } else if (memcmp (config, "flood.advert.interval ", 22) == 0) {
int hours = _atoi (&config[22]); int hours = _atoi (&config[22]);
if ((hours > 0 && hours < 3) || (hours > 48)) { if ((hours > 0 && hours < 3) || (hours > 48)) {
@@ -642,6 +644,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
savePrefs(); savePrefs();
strcpy (reply, "OK"); strcpy (reply, "OK");
} }
*/
} else if (memcmp (config, "guest.password ", 15) == 0) { } else if (memcmp (config, "guest.password ", 15) == 0) {
strncpy (persistent.guestPassword, &config[15], sizeof (persistent.guestPassword)); strncpy (persistent.guestPassword, &config[15], sizeof (persistent.guestPassword));
// savePrefs(); // savePrefs();
@@ -658,12 +661,13 @@ void processCommand (char *cmd, NodeEntry *remNode) {
} }
// savePrefs(); // savePrefs();
strcpy (reply, persistent.doRepeat ? "OK - repeat is now ON" : "OK - repeat is now OFF"); strcpy (reply, persistent.doRepeat ? "OK - repeat is now ON" : "OK - repeat is now OFF");
/*
} else if (memcmp (config, "radio ", 6) == 0) { } else if (memcmp (config, "radio ", 6) == 0) {
strcpy (tmp, &config[6]); strcpy (tmp, &config[6]);
const char *parts[4]; const char *parts[4];
int num = mesh::Utils::parseTextParts (tmp, parts, 4); int num = mesh::Utils::parseTextParts (tmp, parts, 4);
float freq = num > 0 ? strtof (parts[0], nullptr) : 0.0f; float freq = num > 0 ? strtof (parts[0], 0) : 0.0f;
float bw = num > 1 ? strtof (parts[1], nullptr) : 0.0f; float bw = num > 1 ? strtof (parts[1], 0) : 0.0f;
uint8_t sf = num > 2 ? atoi (parts[2]) : 0; uint8_t sf = num > 2 ? atoi (parts[2]) : 0;
uint8_t cr = num > 3 ? atoi (parts[3]) : 0; uint8_t cr = num > 3 ? atoi (parts[3]) : 0;
if (freq >= 300.0f && freq <= 2500.0f && sf >= 5 && sf <= 12 && cr >= 5 && cr <= 8 && bw >= 7.0f && bw <= 500.0f) { if (freq >= 300.0f && freq <= 2500.0f && sf >= 5 && sf <= 12 && cr >= 5 && cr <= 8 && bw >= 7.0f && bw <= 500.0f) {
@@ -676,6 +680,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
} else { } else {
strcpy (reply, "Error, invalid radio params"); strcpy (reply, "Error, invalid radio params");
} }
*/
} else if (memcmp (config, "lat ", 4) == 0) { } else if (memcmp (config, "lat ", 4) == 0) {
double lat = atof (&config[4]); double lat = atof (&config[4]);
lat *= 1000000; lat *= 1000000;
@@ -688,6 +693,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
persistent.longitude = lon; persistent.longitude = lon;
// savePrefs(); // savePrefs();
strcpy (reply, "OK"); strcpy (reply, "OK");
/*
} else if (memcmp (config, "rxdelay ", 8) == 0) { } else if (memcmp (config, "rxdelay ", 8) == 0) {
float db = atof (&config[8]); float db = atof (&config[8]);
if (db >= 0) { if (db >= 0) {
@@ -729,14 +735,16 @@ void processCommand (char *cmd, NodeEntry *remNode) {
savePrefs(); savePrefs();
_callbacks->setTxPower (_prefs->tx_power_dbm); _callbacks->setTxPower (_prefs->tx_power_dbm);
strcpy (reply, "OK"); strcpy (reply, "OK");
*/
} else if (memcmp (config, "freq ", 5) == 0) { } else if (memcmp (config, "freq ", 5) == 0) {
double freq = atof (&config[5]); double freq = atof (&config[5]);
uint32_t newFreq = mhzToHzLimited (persistent.frequencyInHz); uint32_t newFreq = mhzToHzLimited (persistent.loraSettings.frequencyInHz);
if (newFreq != 0) { if (newFreq != 0) {
persistent.frequencyInHz = newFreq; persistent.loraSettings.frequencyInHz = newFreq;
} }
// savePrefs(); // savePrefs();
strcpy (reply, "OK - reboot to apply"); strcpy (reply, "OK - reboot to apply");
} else if (memcmp (config, "adc.multiplier ", 15) == 0) { } else if (memcmp (config, "adc.multiplier ", 15) == 0) {
persistent.adcMultiplier = atof (&config[15]); persistent.adcMultiplier = atof (&config[15]);
if (persistent.adcMultiplier == 0.0f) { if (persistent.adcMultiplier == 0.0f) {

View File

@@ -7,6 +7,7 @@
#include "util/log.h" #include "util/log.h"
#include <string.h> #include <string.h>
#define MIN_LOCAL_ADVERT_INTERVAL 60
void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const uint8_t *plain, size_t plainLen); void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const uint8_t *plain, size_t plainLen);

View File

@@ -2,6 +2,7 @@
#define PACKETSTRUCTS_FILE #define PACKETSTRUCTS_FILE
#include <stdint.h> #include <stdint.h>
#include "stddef.h"
#define ROUTE_TYPE_MASK 0x03 #define ROUTE_TYPE_MASK 0x03
#define PAYLOAD_TYPE_MASK 0x3C #define PAYLOAD_TYPE_MASK 0x3C
#define PAYLOAD_VERSION_MASK 0xC0 #define PAYLOAD_VERSION_MASK 0xC0
@@ -90,7 +91,7 @@ typedef struct FrameStruct {
uint8_t header; uint8_t header;
uint8_t transportCodes[4]; uint8_t transportCodes[4];
Path path; Path path;
uint8_t payloadLen; size_t payloadLen;
uint8_t payload[184]; uint8_t payload[184];
} FrameStruct; } FrameStruct;

View File

@@ -14,7 +14,7 @@
uint8_t PacketParams[6]; uint8_t PacketParams[6];
char txActive; char txActive;
int txLost = 0; int txLost = 0;
static char debugPrint; char debugPrint;
// Arduino compatible macros // Arduino compatible macros
#define delayMicroseconds(us) esp_rom_delay_us (us) #define delayMicroseconds(us) esp_rom_delay_us (us)
@@ -25,6 +25,7 @@ void LoRaError (int error) {
MESH_LOGE (TAG, "LoRaErrorDefault=%d", error); MESH_LOGE (TAG, "LoRaErrorDefault=%d", error);
} }
while (1) { while (1) {
printf("GONE WRONG\n");
vTaskDelay (1); vTaskDelay (1);
} }
} }
@@ -706,11 +707,18 @@ void SetTx (uint32_t timeoutInMs) {
buf[2] = (uint8_t)(tout & 0xFF); buf[2] = (uint8_t)(tout & 0xFF);
WriteCommand (SX126X_CMD_SET_TX, buf, 3); // 0x83 WriteCommand (SX126X_CMD_SET_TX, buf, 3); // 0x83
for (int retry = 0; retry < 10; retry++) { if (debugPrint) {
MESH_LOGD(TAG, "Written command, retrying");
}
for (int retry = 0; retry < 20; retry++) {
if ((GetStatus() & 0x70) == 0x60) if ((GetStatus() & 0x70) == 0x60)
break; break;
vTaskDelay (1); vTaskDelay (1);
} }
if (debugPrint) {
MESH_LOGI(TAG, "Broke out");
}
if ((GetStatus() & 0x70) != 0x60) { if ((GetStatus() & 0x70) != 0x60) {
MESH_LOGE (TAG, "SetTx Illegal Status"); MESH_LOGE (TAG, "SetTx Illegal Status");
LoRaError (ERR_INVALID_SETTX_STATE); LoRaError (ERR_INVALID_SETTX_STATE);

View File

@@ -448,5 +448,6 @@ void LoRaError (int error);
extern uint8_t PacketParams[6]; extern uint8_t PacketParams[6];
extern char txActive; extern char txActive;
extern int txLost; extern int txLost;
extern char debugPrint;
#endif #endif