Skip to content

Commit

Permalink
Add basic downlink packet trasmission implementation (#4)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhgzhg committed Apr 22, 2021
1 parent eb39e53 commit 6784aef
Show file tree
Hide file tree
Showing 5 changed files with 183 additions and 57 deletions.
46 changes: 24 additions & 22 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "smtUdpPacketForwarder/ConfigFileParser.h"
#include "smtUdpPacketForwarder/UdpUtils.h"
#include "smtUdpPacketForwarder/Radio.h"
#include "smtUdpPacketForwarder/TimeUtils.h"

extern char **environ;

Expand All @@ -36,8 +37,8 @@ void appIntubator(char* const argv[]) { // {{{
} else if (std::time(nullptr) - lastObtained > 180) { // 3 minutes
time_t currTime{std::time(nullptr)};
char asciiTime[25];
std::strftime(asciiTime, sizeof(asciiTime), "%c", std::localtime(&currTime));
printf("(%s) Main thread block detected! Restarting the application...\n", asciiTime);
printf("(%s) Main thread block detected! Restarting the application...\n",
ts_asciitime(currTime, asciiTime, sizeof(asciiTime)));
fflush(stdout);

char exePath[PATH_MAX];
Expand Down Expand Up @@ -128,7 +129,7 @@ void networkPacketExhangeWorker(LoRaPacketTrafficStats_t *loraPacketStats,
{
time_t currTime{std::time(nullptr)};
char asciiTime[25];
std::strftime(asciiTime, sizeof(asciiTime), "%c", std::localtime(&currTime));
ts_asciitime(currTime, asciiTime, sizeof(asciiTime));
printf("(%s) No %s ACK received from %s\n", asciiTime, (direction == UP_TX ? "uplink" : "downlink fetch request"),
packet.destination.address.c_str());
if (RequeuePacket(std::move(packet), 4, direction))
Expand All @@ -150,7 +151,7 @@ int main(int argc, char **argv) {
time_t currTime{std::time(nullptr)};
char asciiTime[25];

std::strftime(asciiTime, sizeof(asciiTime), "%c", std::localtime(&currTime));
ts_asciitime(currTime, asciiTime, sizeof(asciiTime));
printf("(%s) Started %s...\n", asciiTime, argv[0]);

char networkIfaceName[64] = "eth0";
Expand Down Expand Up @@ -189,7 +190,7 @@ int main(int argc, char **argv) {

if (state != ERR_NONE) {
currTime = std::time(nullptr);
std::strftime(asciiTime, sizeof(asciiTime), "%c", std::localtime(&currTime));
ts_asciitime(currTime, asciiTime, sizeof(asciiTime));
printf("Giving up due to failing LoRa chip setup!\n(%.24s) Exiting!\n", asciiTime);
SPI.endTransaction();
return 1;
Expand All @@ -208,7 +209,6 @@ int main(int argc, char **argv) {
signal(SIGXFSZ, signalHandler); // Creation of a file so large that
// it's not allowed anymore to grow

bool receiveOnAllChannels = cfg.lora_chip_settings.all_spreading_factors;

const uint16_t delayIntervalMs = 20;
const uint32_t sendStatPktIntervalSeconds = 20;
Expand All @@ -222,36 +222,31 @@ int main(int argc, char **argv) {
uint8_t msg[SX127X_MAX_PACKET_LENGTH];

std::thread packetExchanger{networkPacketExhangeWorker, &loraPacketStats, &cfg.servers};
std::thread intubator{appIntubator, argv};
intubator.detach();
#ifndef NOINTUBATION
std::thread intubator{appIntubator, argv};
intubator.detach();
#endif

while (keepRunning) {
++hearthbeat;
currTime = std::time(nullptr);

if (keepRunning && currTime >= nextStatUpdateTime) {
nextStatUpdateTime = currTime + sendStatPktIntervalSeconds;
//std::strftime(asciiTime, sizeof(asciiTime), "%c", std::localtime(&currTime));
//printf("(%s) Sending stat update to server(s)... ", asciiTime);

PublishStatProtocolPacket(cfg, loraPacketStats);
++loraPacketStats.forw_packets_crc_good;
++loraPacketStats.forw_packets;
//printf("done\n");
fflush(stdout);

//std::strftime(asciiTime, sizeof(asciiTime), "%c", std::localtime(&currTime));
//printf("(%s) Sending downlink packet keepalive request to server(s)... ", asciiTime);
PublishLoRaDownlinkProtocolPacket(cfg);
++loraPacketStats.forw_packets_crc_good;
++loraPacketStats.forw_packets;
//printf("done\n");
fflush(stdout);
}

if (!keepRunning) break;

LoRaRecvStat lastRecvResult = recvLoRaUplinkData(
lora, receiveOnAllChannels, loraDataPacket, msg, loraPacketStats);
lora, cfg, loraDataPacket, msg, loraPacketStats);

if (lastRecvResult == LoRaRecvStat::DATARECV) {
PublishLoRaUplinkProtocolPacket(cfg, loraDataPacket);
Expand All @@ -262,28 +257,35 @@ int main(int argc, char **argv) {

do {
state = restartLoRaChip(lora, cfg);
std::strftime(asciiTime, sizeof(asciiTime), "%c", std::localtime(&currTime));
ts_asciitime(currTime, asciiTime, sizeof(asciiTime));
printf("(%s) Regular LoRa chip reset done - code %d, %s success\n",
asciiTime, state, (state == ERR_NONE ? "with" : "WITHOUT"));
fflush(stdout);
delay(delayIntervalMs);
} while (state != ERR_NONE);

} else if (!receiveOnAllChannels) {
delay(delayIntervalMs);
}

PackagedDataToSend_t downlinkPacket{DequeuePacket(DOWN_RX)};
if (downlinkPacket.data_len > 0)
{
sendLoRaDownlinkData(lora, downlinkPacket, loraPacketStats);
if (sendLoRaDownlinkData(lora, cfg, downlinkPacket, loraPacketStats) == LoRaRecvStat::NODATA)
{
ts_asciitime(currTime, asciiTime, sizeof(asciiTime));
printf("(%s) Downlink packet has been trasmitted with success!\n", asciiTime);
fflush(stdout);
}
}

if (!cfg.lora_chip_settings.all_spreading_factors) {
delay(delayIntervalMs);
}
}

}

currTime = std::time(nullptr);
std::strftime(asciiTime, sizeof(asciiTime), "%c", std::localtime(&currTime));
ts_asciitime(currTime, asciiTime, sizeof(asciiTime));

printf("\n(%s) Shutting down...\n", asciiTime);
fflush(stdout);
Expand Down
Loading

0 comments on commit 6784aef

Please sign in to comment.