netmon-multinode/MultiNode/MultiNode.ino

175 lines
5.2 KiB
Arduino
Raw Normal View History

2022-04-24 03:37:42 +02:00
#include <ArduinoLowPower.h>
#include <SPI.h>
#include "MNLib.h"
//#define IS_CLIENT
//#define IS_SERVER
2022-04-24 14:54:40 +02:00
unsigned long tick_tracker_sensors = 0;
unsigned long tick_tracker_device = 0;
unsigned long next_tick_sensors = 0;
unsigned long next_tick_device = 0;
2022-04-24 21:05:49 +02:00
unsigned long offset = 0;
2022-04-24 03:37:42 +02:00
void setup()
{
SerialUSB.begin(115200);
//while (!SerialUSB);
/*for (int i = 0; i < 5; i++)
2022-04-24 21:05:49 +02:00
{
2022-04-24 03:37:42 +02:00
delay(1000);
SerialUSB.println("owo");
2022-04-24 21:05:49 +02:00
}*/
2022-04-24 14:54:40 +02:00
initMN();
2022-04-24 03:37:42 +02:00
/*for (int i = 0; i < 2; i++)
2022-04-24 21:05:49 +02:00
{
2022-04-24 03:37:42 +02:00
delay(1000);
SerialUSB.println("awa");
2022-04-24 21:05:49 +02:00
}
printStatusReport();*/
2022-04-24 14:54:40 +02:00
tick_tracker_sensors = millis();
tick_tracker_device = millis();
2022-04-24 03:37:42 +02:00
}
void loop()
{
if (SerialUSB.available())
{
size_t config_size = sizeof(MNConfiguration) - sizeof(configuration.client_secret_key) - sizeof(configuration.server_secret_key); // Don't leak the secret key
char command = SerialUSB.read();
2022-04-24 21:05:49 +02:00
2022-04-24 03:37:42 +02:00
switch (command)
{
case 'C': // Print configuration for in the field debugging
SerialUSB.println("Configuration:");
SerialUSB.print("Frequency: ");
SerialUSB.print(configuration.modem_frequency);
SerialUSB.println(" MHz");
SerialUSB.print("Power: ");
SerialUSB.print(configuration.modem_power);
SerialUSB.println(" dBm");
SerialUSB.print("Client address: ");
SerialUSB.println(configuration.client_address);
SerialUSB.print("Server address: ");
SerialUSB.println(configuration.server_address);
for (int i = 0; i < N_DEVICES; i++)
{
SerialUSB.print("Pointer ");
SerialUSB.print(i);
SerialUSB.print(": ");
SerialUSB.println(configuration.devices[i]);
if (configuration.devices[i] != 255)
{
2022-04-24 21:05:49 +02:00
for (int j = 0; j < sizeof(AnalogInput); j++)
2022-04-24 03:37:42 +02:00
{
SerialUSB.print(reinterpret_cast<uint8_t*>(devices[i])[j]);
SerialUSB.print(" ");
}
SerialUSB.println();
devices[i]->printStatus();
}
}
2022-04-24 21:05:49 +02:00
2022-04-24 03:37:42 +02:00
SerialUSB.println();
SerialUSB.print("Battery voltage: ");
SerialUSB.println(batteryVoltage());
2022-04-24 21:05:49 +02:00
SerialUSB.print("RTC time: ");
SerialUSB.println(RTC->MODE1.COUNT.reg);
2022-04-24 03:37:42 +02:00
SerialUSB.println("END");
break;
case 'c':
SerialUSB.print("N_DEVICES: ");
SerialUSB.println(N_DEVICES);
SerialUSB.print("CFGMEM: ");
SerialUSB.println(CFGMEM);
SerialUSB.print("MNConfiguration: ");
SerialUSB.println(sizeof(MNConfiguration) - sizeof(configuration.client_secret_key) - sizeof(configuration.server_secret_key));
SerialUSB.print("Device: ");
SerialUSB.println(sizeof(Device) - 4);
SerialUSB.print("AnalogInput: ");
SerialUSB.println(sizeof(AnalogInput) - 4);
SerialUSB.println("END");
break;
2022-04-24 21:05:49 +02:00
2022-04-24 03:37:42 +02:00
case 'r': // Read configuration (Frequency, which sensors etc.)
SerialUSB.write(reinterpret_cast<char*>(&configuration), config_size);
break;
case 'w':
2022-04-24 21:05:49 +02:00
SerialUSB.readBytes(reinterpret_cast<char*>(&configuration), config_size);
2022-04-24 03:37:42 +02:00
refreshConfig();
2022-04-24 14:54:40 +02:00
tick_tracker_sensors = millis();
tick_tracker_device = millis();
2022-04-24 03:37:42 +02:00
break;
2022-04-24 21:05:49 +02:00
2022-04-24 03:37:42 +02:00
case 'R': // Read configuration memory (extended configuration for each sensor)
SerialUSB.write(reinterpret_cast<char*>(&configuration_memory), sizeof(configuration_memory));
break;
case 'W':
2022-04-24 21:05:49 +02:00
SerialUSB.readBytes(reinterpret_cast<char*>(&configuration_memory), sizeof(configuration_memory));
2022-04-24 03:37:42 +02:00
refreshConfig();
break;
case 'k':
char data[sizeof(MNConfiguration)];
SerialUSB.readBytes(reinterpret_cast<char*>(&configuration) + config_size, sizeof(configuration.client_secret_key) + sizeof(configuration.server_secret_key));
SerialUSB.write(reinterpret_cast<char*>(&configuration) + config_size, sizeof(configuration.client_secret_key) + sizeof(configuration.server_secret_key));
2022-04-24 21:05:49 +02:00
2022-04-24 03:37:42 +02:00
refreshConfig();
break;
case 's':
saveMemory();
}
}
2022-04-24 14:54:40 +02:00
loopMN();
2022-04-24 03:37:42 +02:00
2022-04-24 21:05:49 +02:00
long now_time = millis() + offset;
if (now_time >= next_tick_sensors)
2022-04-24 03:37:42 +02:00
{
sendSensorData();
2022-04-24 14:54:40 +02:00
tick_tracker_sensors = tick_tracker_sensors + configuration.sensor_update_interval;
next_tick_sensors = tick_tracker_sensors + random(configuration.jitter);
digitalWrite(LED_BUILTIN, HIGH);
delay(2);
digitalWrite(LED_BUILTIN, LOW);
}
2022-04-24 21:05:49 +02:00
if (now_time >= next_tick_device)
2022-04-24 14:54:40 +02:00
{
sendDeviceData();
tick_tracker_device = tick_tracker_device + configuration.device_update_interval;
next_tick_device = tick_tracker_device + random(configuration.jitter);
2022-04-24 03:37:42 +02:00
digitalWrite(LED_BUILTIN, HIGH);
delay(2);
digitalWrite(LED_BUILTIN, LOW);
}
2022-04-24 21:05:49 +02:00
long next_tick_device_dt = next_tick_device - now_time;
long next_tick_sensors_dt = next_tick_sensors - now_time;
long min_delay = min(next_tick_device_dt, next_tick_sensors_dt);
if (min_delay > 1000 && !USBDevice.connected())
{
power_sleep(min_delay);
offset += min_delay;
//USBDevice.init()
}
}
void power_sleep(uint32_t milliseconds)
{
radio.setModeIdle();
//radio.sleep(); Doesn't work
setLoopPower(OFF);
LowPower.sleep(milliseconds);
radio.setModeIdle();
delay(100);
2022-04-24 03:37:42 +02:00
}