upd
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -212,7 +212,8 @@ void populateDefaults() {
|
||||
|
||||
uint8_t seed[32];
|
||||
//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
|
||||
|
||||
ed25519_create_keypair (persistent.pubkey, persistent.privkey, seed);
|
||||
@@ -222,7 +223,7 @@ void populateDefaults() {
|
||||
persistent.nodeType = NODE_TYPE_REPEATER;
|
||||
memset (persistent.password, 0, sizeof (persistent.password));
|
||||
strcpy (persistent.password, "hesielko");
|
||||
strcpy (persistent.nodeName, "BRN RiscVpeater");
|
||||
strcpy (persistent.nodeName, "BRN WCHNode RISCV");
|
||||
//strcpy (persistent.nodeName, "BRN RiscVnode");
|
||||
|
||||
persistent.adcMultiplier = 0;
|
||||
|
||||
23
User/main.c
23
User/main.c
@@ -82,10 +82,16 @@ TaskHandle_t Task2Task_Handler;
|
||||
|
||||
// uint8_t bufIn[260];
|
||||
|
||||
uint8_t bootedUp = 0;
|
||||
|
||||
void task2_task (void *pvParameters) {
|
||||
char x;
|
||||
MESH_LOGD (TAG, "Task2 boot");
|
||||
while (1) {
|
||||
if (bootedUp == 0) {
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
continue;
|
||||
}
|
||||
if (USART_GetFlagStatus (USART1, USART_FLAG_RXNE) == SET) {
|
||||
x = USART_ReceiveData (USART1);
|
||||
if (x == 'M') {
|
||||
@@ -147,14 +153,17 @@ void task1_task (void *pvParameters) {
|
||||
memset (&stats, 0, sizeof (stats));
|
||||
|
||||
|
||||
DiscoverRequestPayload discReq;
|
||||
discReq.prefixOnly = 0;
|
||||
discReq.since = 0;
|
||||
discReq.tag = RTC_GetCounter();
|
||||
discReq.typeFilter = 0xFF;
|
||||
sendDiscoverRequest (&discReq);
|
||||
/*
|
||||
DiscoverRequestPayload discReq;
|
||||
discReq.prefixOnly = 0;
|
||||
discReq.since = 0;
|
||||
discReq.tag = RTC_GetCounter();
|
||||
discReq.typeFilter = 0xFF;
|
||||
sendDiscoverRequest (&discReq);
|
||||
|
||||
sendAdvert (1);
|
||||
*/
|
||||
sendAdvert (0);
|
||||
bootedUp = 1;
|
||||
|
||||
while (1) {
|
||||
start_time = xTaskGetTickCount();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define KEY_SIZE 16 // 128-bit AES
|
||||
#define HMAC_SIZE 2 // meshcore size
|
||||
#define MAX_FLOOD_TTL 64
|
||||
#define NON_RETX_HISTORY 64
|
||||
|
||||
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);
|
||||
|
||||
void addToNotReTX(const FrameStruct *frame);
|
||||
|
||||
typedef struct KnownPacketHistoryType {
|
||||
uint8_t hash[32];
|
||||
uint8_t populated;
|
||||
} KnownPacketHistoryType;
|
||||
|
||||
|
||||
#endif
|
||||
@@ -142,6 +142,7 @@ void decodeAnonReq (const FrameStruct *frame) {
|
||||
if (foundNode == NULL) {
|
||||
foundNode = getNextNode();
|
||||
strcpy (foundNode->name, "Anonymous node");
|
||||
foundNode->path.pathLen = 0;
|
||||
memcpy (foundNode->pubKey, anonReq.pubKey, sizeof (foundNode->pubKey));
|
||||
ed25519_key_exchange ((unsigned char *)foundNode->secret, anonReq.pubKey, persistent.privkey);
|
||||
foundNode->gps_latitude = 0;
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
|
||||
void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const uint8_t *plain, size_t plainLen) {
|
||||
FrameStruct frame;
|
||||
uint8_t offset = 0;
|
||||
memset(&frame, 0, sizeof(frame));
|
||||
size_t offset = 0;
|
||||
|
||||
// 1. Header
|
||||
frame.header =
|
||||
@@ -46,6 +47,8 @@ void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const
|
||||
frame.payload + offset,
|
||||
&encLen);
|
||||
|
||||
MESH_LOGD(TAG, "Plain len: %d, enc len: %d", plainLen, encLen);
|
||||
|
||||
offset += encLen;
|
||||
|
||||
// 5. Finalize
|
||||
@@ -54,6 +57,7 @@ void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const
|
||||
|
||||
hexdump ("Encrypted frame", frame.payload, frame.payloadLen);
|
||||
LoRaTransmit (&frame);
|
||||
MESH_LOGD (TAG, "Encrypted frame tx finish\n");
|
||||
}
|
||||
|
||||
void sendEncryptedTextMessage (const NodeEntry *targetNode, const PlainTextMessagePayload *msg) {
|
||||
@@ -317,52 +321,57 @@ void parseEncryptedPayload (const EncryptedPayloadStruct *enc) {
|
||||
Response resp;
|
||||
resp.tag = req.timestamp;
|
||||
enc->remNode->last_seen_rt = req.timestamp;
|
||||
uint8_t index2 = 0;
|
||||
resp.data[index2++] = TELEM_CHANNEL_SELF;
|
||||
resp.data[index2++] = LPP_TEMPERATURE;
|
||||
resp.dataLen = 0;
|
||||
resp.data[resp.dataLen++] = TELEM_CHANNEL_SELF;
|
||||
resp.data[resp.dataLen++] = LPP_TEMPERATURE;
|
||||
|
||||
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[index2++] = TELEM_CHANNEL_SELF;
|
||||
resp.data[index2++] = LPP_VOLTAGE;
|
||||
resp.data[resp.dataLen++] = TELEM_CHANNEL_SELF;
|
||||
resp.data[resp.dataLen++] = LPP_VOLTAGE;
|
||||
|
||||
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) {
|
||||
|
||||
encode_gps (TELEM_CHANNEL_SELF, persistent.latitude / 1000000.0f, persistent.longitude / 1000000.0f, persistent.altitude / 100.0f, &(resp.data[index2]));
|
||||
// encode_gps(TELEM_CHANNEL_SELF, 48.1909f, 17.0303f, 234.0f, &(resp.data[index2]));
|
||||
|
||||
index2 += LPP_GPS_SIZE;
|
||||
}
|
||||
|
||||
if (enc->remNode->authenticated) {
|
||||
|
||||
resp.data[index2++] = 2;
|
||||
resp.data[index2++] = LPP_TEMPERATURE;
|
||||
resp.data[resp.dataLen++] = 2; // channel 2
|
||||
resp.data[resp.dataLen++] = LPP_TEMPERATURE;
|
||||
|
||||
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);
|
||||
|
||||
printf ("Sent response, the temperature is %d decicelsius\n", dataTemp);
|
||||
|
||||
break;
|
||||
}
|
||||
case REQUEST_GET_MIN_MAX_AVG:
|
||||
@@ -421,8 +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) (strcmp(s, lit) == 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) {
|
||||
PlainTextMessagePayload replyPayload;
|
||||
@@ -575,9 +584,9 @@ void processCommand (char *cmd, NodeEntry *remNode) {
|
||||
*/
|
||||
} else if (memcmp (config, "public.key", 10) == 0) {
|
||||
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) {
|
||||
sprintf (reply, "> %s", getStringRole(persistent.nodeType));
|
||||
sprintf (reply, "> %s", getStringRole (persistent.nodeType));
|
||||
} else if (memcmp (config, "adc.multiplier", 14) == 0) {
|
||||
sprintf (reply, "> %.3f", persistent.adcMultiplier);
|
||||
} else {
|
||||
@@ -613,7 +622,7 @@ void processCommand (char *cmd, NodeEntry *remNode) {
|
||||
persistent.allowReadOnly = 0;
|
||||
strcpy (reply, "OK");
|
||||
}
|
||||
//savePrefs();
|
||||
// savePrefs();
|
||||
/*
|
||||
} else if (memcmp (config, "flood.advert.interval ", 22) == 0) {
|
||||
int hours = _atoi (&config[22]);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define PACKETSTRUCTS_FILE
|
||||
|
||||
#include <stdint.h>
|
||||
#include "stddef.h"
|
||||
#define ROUTE_TYPE_MASK 0x03
|
||||
#define PAYLOAD_TYPE_MASK 0x3C
|
||||
#define PAYLOAD_VERSION_MASK 0xC0
|
||||
@@ -90,7 +91,7 @@ typedef struct FrameStruct {
|
||||
uint8_t header;
|
||||
uint8_t transportCodes[4];
|
||||
Path path;
|
||||
uint8_t payloadLen;
|
||||
size_t payloadLen;
|
||||
uint8_t payload[184];
|
||||
} FrameStruct;
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
uint8_t PacketParams[6];
|
||||
char txActive;
|
||||
int txLost = 0;
|
||||
static char debugPrint;
|
||||
char debugPrint;
|
||||
|
||||
// Arduino compatible macros
|
||||
#define delayMicroseconds(us) esp_rom_delay_us (us)
|
||||
@@ -25,6 +25,7 @@ void LoRaError (int error) {
|
||||
MESH_LOGE (TAG, "LoRaErrorDefault=%d", error);
|
||||
}
|
||||
while (1) {
|
||||
printf("GONE WRONG\n");
|
||||
vTaskDelay (1);
|
||||
}
|
||||
}
|
||||
@@ -706,11 +707,18 @@ void SetTx (uint32_t timeoutInMs) {
|
||||
buf[2] = (uint8_t)(tout & 0xFF);
|
||||
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)
|
||||
break;
|
||||
vTaskDelay (1);
|
||||
}
|
||||
if (debugPrint) {
|
||||
MESH_LOGI(TAG, "Broke out");
|
||||
}
|
||||
if ((GetStatus() & 0x70) != 0x60) {
|
||||
MESH_LOGE (TAG, "SetTx Illegal Status");
|
||||
LoRaError (ERR_INVALID_SETTX_STATE);
|
||||
|
||||
@@ -448,5 +448,6 @@ void LoRaError (int error);
|
||||
extern uint8_t PacketParams[6];
|
||||
extern char txActive;
|
||||
extern int txLost;
|
||||
extern char debugPrint;
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user