This commit is contained in:
2026-01-13 01:14:51 +01:00
parent eed612f457
commit 6a48dcd61e
10 changed files with 163 additions and 52 deletions

View File

@@ -218,19 +218,28 @@ void printFrameHeader (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 ||
(frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) {
if (
((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT) ||
((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD)
) {
len += 4;
}
len += frame->path.pathLen;
len += frame->payloadLen;
if (len > 255) {
MESH_LOGE(TAG, "%d is too big for sx1262", len);
}
uint16_t irqStatus;
char rv = 0;
size_t outCounter = 0;
if (txActive == 0) {
txActive = 1;
@@ -262,6 +271,7 @@ void LoRaTransmit (const FrameStruct *frame) {
switch (state) {
case 0: // header
out = frame->header;
outCounter = 0;
state = ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT ||
(frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD)
? 1
@@ -293,6 +303,7 @@ void LoRaTransmit (const FrameStruct *frame) {
}
while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_TXE) == RESET);
outCounter++;
SPI_I2S_SendData (SPI1, out);
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);
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();
while (!(irqStatus & (SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT))) {
vTaskDelay (1);
vTaskDelay (pdMS_TO_TICKS(10));
irqStatus = GetIrqStatus();
if (debugPrint) {
MESH_LOGD(TAG, "irq: 0x%04X", irqStatus);
}
}
MESH_LOGD(TAG, "Finished tx");
txActive = 0;
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) {
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 -------- */
if (frame->header & ROUTE_TYPE_FLOOD ||
frame->header & ROUTE_TYPE_TRANSPORT_FLOOD) {