main.cpp 3.8 KB

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