upd
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user