mirror of
https://github.com/Genaker/LoraSA.git
synced 2026-05-18 07:16:04 +02:00
Add interaction over Serial0
This commit is contained in:
+111
-2
@@ -42,6 +42,7 @@
|
||||
#define RADIOLIB_GODMODE (1)
|
||||
|
||||
#include <charts.h>
|
||||
#include <comms.h>
|
||||
#include <config.h>
|
||||
#include <events.h>
|
||||
#include <scan.h>
|
||||
@@ -475,14 +476,50 @@ struct frequency_scan_result
|
||||
uint64_t end;
|
||||
uint64_t last_epoch;
|
||||
int16_t rssi; // deliberately not a float; floats can pin task to wrong core forever
|
||||
|
||||
ScanTaskResult dump;
|
||||
size_t readings_sz;
|
||||
} frequency_scan_result;
|
||||
|
||||
TaskHandle_t logToSerial = NULL;
|
||||
TaskHandle_t dumpToComms = NULL;
|
||||
|
||||
void eventListenerForMSP(void *arg, Event &e)
|
||||
void eventListenerForReport(void *arg, Event &e)
|
||||
{
|
||||
if (e.type == EventType::DETECTED)
|
||||
{
|
||||
if (e.epoch != frequency_scan_result.last_epoch)
|
||||
{
|
||||
frequency_scan_result.dump.sz = 0;
|
||||
}
|
||||
|
||||
if (frequency_scan_result.dump.sz >= frequency_scan_result.readings_sz)
|
||||
{
|
||||
size_t old_sz = frequency_scan_result.readings_sz;
|
||||
frequency_scan_result.readings_sz = frequency_scan_result.dump.sz + 1;
|
||||
uint32_t *f = new uint32_t[frequency_scan_result.readings_sz];
|
||||
int16_t *r = new int16_t[frequency_scan_result.readings_sz];
|
||||
|
||||
if (old_sz > 0)
|
||||
{
|
||||
memcpy(f, frequency_scan_result.dump.freqs_khz,
|
||||
old_sz * sizeof(uint32_t));
|
||||
memcpy(r, frequency_scan_result.dump.rssis, old_sz * sizeof(int16_t));
|
||||
|
||||
delete[] frequency_scan_result.dump.freqs_khz;
|
||||
delete[] frequency_scan_result.dump.rssis;
|
||||
}
|
||||
|
||||
frequency_scan_result.dump.freqs_khz = f;
|
||||
frequency_scan_result.dump.rssis = r;
|
||||
}
|
||||
|
||||
frequency_scan_result.dump.freqs_khz[frequency_scan_result.dump.sz] =
|
||||
e.detected.freq * 1000; // convert to kHz
|
||||
frequency_scan_result.dump.rssis[frequency_scan_result.dump.sz] =
|
||||
max(e.detected.rssi, -999.0f);
|
||||
frequency_scan_result.dump.sz++;
|
||||
|
||||
if (e.epoch != frequency_scan_result.last_epoch ||
|
||||
e.detected.rssi > frequency_scan_result.rssi)
|
||||
{
|
||||
@@ -500,10 +537,50 @@ void eventListenerForMSP(void *arg, Event &e)
|
||||
{
|
||||
xTaskNotifyGive(logToSerial);
|
||||
}
|
||||
|
||||
if (dumpToComms != NULL)
|
||||
{
|
||||
xTaskNotifyGive(dumpToComms);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ScanTask report_scans = ScanTask{
|
||||
count : 0, // 0 => report none; < 0 => report forever; > 0 => report that many
|
||||
delay : 0 // 0 => as and when it happens; > 0 => at least once that many ms
|
||||
};
|
||||
|
||||
void dumpToCommsTask(void *parameter)
|
||||
{
|
||||
uint64_t last_epoch = frequency_scan_result.last_epoch;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int64_t delay = report_scans.delay;
|
||||
if (delay == 0)
|
||||
{
|
||||
delay = (1 << 63) - 1;
|
||||
}
|
||||
|
||||
ulTaskNotifyTake(true, pdMS_TO_TICKS(delay));
|
||||
if (report_scans.count == 0 || frequency_scan_result.last_epoch == last_epoch)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (report_scans.count > 0)
|
||||
{
|
||||
report_scans.count--;
|
||||
}
|
||||
|
||||
Message m;
|
||||
m.type = MessageType::SCAN_RESULT;
|
||||
m.payload.dump = frequency_scan_result.dump;
|
||||
Comms0->send(m);
|
||||
}
|
||||
}
|
||||
|
||||
void logToSerialTask(void *parameter)
|
||||
{
|
||||
#ifdef HELTEC
|
||||
@@ -579,6 +656,15 @@ void setup(void)
|
||||
wf_start = millis();
|
||||
|
||||
config = Config::init();
|
||||
r.comms_initialized = Comms::initComms(config);
|
||||
if (r.comms_initialized)
|
||||
{
|
||||
Serial.println("Comms initialized fine");
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Comms did not initialize");
|
||||
}
|
||||
|
||||
pinMode(LED, OUTPUT);
|
||||
pinMode(BUZZER_PIN, OUTPUT);
|
||||
@@ -705,6 +791,7 @@ void setup(void)
|
||||
#ifdef LOG_DATA_JSON
|
||||
xTaskCreate(logToSerialTask, "LOG_DATA_JSON", 2048, NULL, 1, &logToSerial);
|
||||
#endif
|
||||
xTaskCreate(dumpToCommsTask, "DUMP_RESPONSE_PROCESS", 2048, NULL, 1, &dumpToComms);
|
||||
|
||||
r.trigger_level = TRIGGER_LEVEL;
|
||||
stacked.reset(0, 0, display.width(), display.height());
|
||||
@@ -741,7 +828,9 @@ void setup(void)
|
||||
r.addEventListener(DETECTED, drone_sound_alarm, &r);
|
||||
r.addEventListener(SCAN_TASK_COMPLETE, stacked);
|
||||
|
||||
r.addEventListener(ALL_EVENTS, eventListenerForMSP, NULL);
|
||||
frequency_scan_result.readings_sz = 0;
|
||||
frequency_scan_result.dump.sz = 0;
|
||||
r.addEventListener(ALL_EVENTS, eventListenerForReport, NULL);
|
||||
|
||||
#ifdef UPTIME_CLOCK
|
||||
uptime = new UptimeClock(display, millis());
|
||||
@@ -931,6 +1020,24 @@ void check_ranges()
|
||||
}
|
||||
}
|
||||
|
||||
void checkComms()
|
||||
{
|
||||
while (Comms0->available() > 0)
|
||||
{
|
||||
Message *m = Comms0->receive();
|
||||
if (m == NULL)
|
||||
continue;
|
||||
|
||||
switch (m->type)
|
||||
{
|
||||
case MessageType::SCAN:
|
||||
report_scans = m->payload.scan;
|
||||
break;
|
||||
}
|
||||
delete m;
|
||||
}
|
||||
}
|
||||
|
||||
// MAX Frequency RSSI BIN value of the samples
|
||||
int max_rssi_x = 999;
|
||||
|
||||
@@ -942,6 +1049,8 @@ void loop(void)
|
||||
drone_detected_frequency_start = 0;
|
||||
ranges_count = 0;
|
||||
|
||||
checkComms();
|
||||
|
||||
// reset scan time
|
||||
if (config.print_profile_time)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user