main.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include <Arduino.h>
  2. #include <target.h>
  3. #include <helpers/ArduinoHelpers.h>
  4. #include <helpers/IdentityStore.h>
  5. #include "KissModem.h"
  6. #if defined(NRF52_PLATFORM)
  7. #include <InternalFileSystem.h>
  8. #elif defined(RP2040_PLATFORM)
  9. #include <LittleFS.h>
  10. #elif defined(ESP32)
  11. #include <SPIFFS.h>
  12. #endif
  13. #if defined(KISS_UART_RX) && defined(KISS_UART_TX)
  14. #include <HardwareSerial.h>
  15. #endif
  16. #define NOISE_FLOOR_CALIB_INTERVAL_MS 2000
  17. #define AGC_RESET_INTERVAL_MS 30000
  18. StdRNG rng;
  19. mesh::LocalIdentity identity;
  20. KissModem* modem;
  21. static uint32_t next_noise_floor_calib_ms = 0;
  22. static uint32_t next_agc_reset_ms = 0;
  23. void halt() {
  24. while (1) ;
  25. }
  26. void loadOrCreateIdentity() {
  27. #if defined(NRF52_PLATFORM)
  28. InternalFS.begin();
  29. IdentityStore store(InternalFS, "");
  30. #elif defined(ESP32)
  31. SPIFFS.begin(true);
  32. IdentityStore store(SPIFFS, "/identity");
  33. #elif defined(RP2040_PLATFORM)
  34. LittleFS.begin();
  35. IdentityStore store(LittleFS, "/identity");
  36. store.begin();
  37. #else
  38. #error "Filesystem not defined"
  39. #endif
  40. if (!store.load("_main", identity)) {
  41. identity = radio_new_identity();
  42. while (identity.pub_key[0] == 0x00 || identity.pub_key[0] == 0xFF) {
  43. identity = radio_new_identity();
  44. }
  45. store.save("_main", identity);
  46. }
  47. }
  48. void onSetRadio(float freq, float bw, uint8_t sf, uint8_t cr) {
  49. radio_set_params(freq, bw, sf, cr);
  50. }
  51. void onSetTxPower(uint8_t power) {
  52. radio_set_tx_power(power);
  53. }
  54. float onGetCurrentRssi() {
  55. return radio_driver.getCurrentRSSI();
  56. }
  57. void onGetStats(uint32_t* rx, uint32_t* tx, uint32_t* errors) {
  58. *rx = radio_driver.getPacketsRecv();
  59. *tx = radio_driver.getPacketsSent();
  60. *errors = radio_driver.getPacketsRecvErrors();
  61. }
  62. void setup() {
  63. board.begin();
  64. if (!radio_init()) {
  65. halt();
  66. }
  67. radio_driver.begin();
  68. rng.begin(radio_get_rng_seed());
  69. loadOrCreateIdentity();
  70. sensors.begin();
  71. #if defined(KISS_UART_RX) && defined(KISS_UART_TX)
  72. #if defined(ESP32)
  73. Serial1.setPins(KISS_UART_RX, KISS_UART_TX);
  74. Serial1.begin(115200);
  75. #elif defined(NRF52_PLATFORM)
  76. ((Uart *)&Serial1)->setPins(KISS_UART_RX, KISS_UART_TX);
  77. Serial1.begin(115200);
  78. #elif defined(RP2040_PLATFORM)
  79. ((SerialUART *)&Serial1)->setRX(KISS_UART_RX);
  80. ((SerialUART *)&Serial1)->setTX(KISS_UART_TX);
  81. Serial1.begin(115200);
  82. #elif defined(STM32_PLATFORM)
  83. ((HardwareSerial *)&Serial1)->setRx(KISS_UART_RX);
  84. ((HardwareSerial *)&Serial1)->setTx(KISS_UART_TX);
  85. Serial1.begin(115200);
  86. #else
  87. #error "KISS UART not supported on this platform"
  88. #endif
  89. modem = new KissModem(Serial1, identity, rng, radio_driver, board, sensors);
  90. #else
  91. Serial.begin(115200);
  92. uint32_t start = millis();
  93. while (!Serial && millis() - start < 3000) delay(10);
  94. delay(100);
  95. modem = new KissModem(Serial, identity, rng, radio_driver, board, sensors);
  96. #endif
  97. modem->setRadioCallback(onSetRadio);
  98. modem->setTxPowerCallback(onSetTxPower);
  99. modem->setGetCurrentRssiCallback(onGetCurrentRssi);
  100. modem->setGetStatsCallback(onGetStats);
  101. modem->begin();
  102. }
  103. void loop() {
  104. modem->loop();
  105. if (!modem->isActuallyTransmitting()) {
  106. if (!modem->isTxBusy()) {
  107. if ((uint32_t)(millis() - next_agc_reset_ms) >= AGC_RESET_INTERVAL_MS) {
  108. radio_driver.resetAGC();
  109. next_agc_reset_ms = millis();
  110. }
  111. }
  112. uint8_t rx_buf[256];
  113. int rx_len = radio_driver.recvRaw(rx_buf, sizeof(rx_buf));
  114. if (rx_len > 0) {
  115. int8_t snr = (int8_t)(radio_driver.getLastSNR() * 4);
  116. int8_t rssi = (int8_t)radio_driver.getLastRSSI();
  117. modem->onPacketReceived(snr, rssi, rx_buf, rx_len);
  118. }
  119. }
  120. if ((uint32_t)(millis() - next_noise_floor_calib_ms) >= NOISE_FLOOR_CALIB_INTERVAL_MS) {
  121. radio_driver.triggerNoiseFloorCalibrate(0);
  122. next_noise_floor_calib_ms = millis();
  123. }
  124. radio_driver.loop();
  125. }