main.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. StdRNG rng;
  14. mesh::LocalIdentity identity;
  15. KissModem* modem;
  16. void halt() {
  17. while (1) ;
  18. }
  19. void loadOrCreateIdentity() {
  20. #if defined(NRF52_PLATFORM)
  21. InternalFS.begin();
  22. IdentityStore store(InternalFS, "");
  23. #elif defined(ESP32)
  24. SPIFFS.begin(true);
  25. IdentityStore store(SPIFFS, "/identity");
  26. #elif defined(RP2040_PLATFORM)
  27. LittleFS.begin();
  28. IdentityStore store(LittleFS, "/identity");
  29. store.begin();
  30. #else
  31. #error "Filesystem not defined"
  32. #endif
  33. if (!store.load("_main", identity)) {
  34. identity = radio_new_identity();
  35. while (identity.pub_key[0] == 0x00 || identity.pub_key[0] == 0xFF) {
  36. identity = radio_new_identity();
  37. }
  38. store.save("_main", identity);
  39. }
  40. }
  41. void onSetRadio(float freq, float bw, uint8_t sf, uint8_t cr) {
  42. radio_set_params(freq, bw, sf, cr);
  43. }
  44. void onSetTxPower(uint8_t power) {
  45. radio_set_tx_power(power);
  46. }
  47. float onGetCurrentRssi() {
  48. return radio_driver.getCurrentRSSI();
  49. }
  50. void onGetStats(uint32_t* rx, uint32_t* tx, uint32_t* errors) {
  51. *rx = radio_driver.getPacketsRecv();
  52. *tx = radio_driver.getPacketsSent();
  53. *errors = radio_driver.getPacketsRecvErrors();
  54. }
  55. void setup() {
  56. board.begin();
  57. if (!radio_init()) {
  58. halt();
  59. }
  60. radio_driver.begin();
  61. rng.begin(radio_get_rng_seed());
  62. loadOrCreateIdentity();
  63. Serial.begin(115200);
  64. uint32_t start = millis();
  65. while (!Serial && millis() - start < 3000) delay(10);
  66. delay(100);
  67. sensors.begin();
  68. modem = new KissModem(Serial, identity, rng, radio_driver, board, sensors);
  69. modem->setRadioCallback(onSetRadio);
  70. modem->setTxPowerCallback(onSetTxPower);
  71. modem->setGetCurrentRssiCallback(onGetCurrentRssi);
  72. modem->setGetStatsCallback(onGetStats);
  73. modem->begin();
  74. }
  75. void loop() {
  76. modem->loop();
  77. uint8_t packet[KISS_MAX_PACKET_SIZE];
  78. uint16_t len;
  79. if (modem->getPacketToSend(packet, &len)) {
  80. radio_driver.startSendRaw(packet, len);
  81. while (!radio_driver.isSendComplete()) {
  82. delay(1);
  83. }
  84. radio_driver.onSendFinished();
  85. modem->onTxComplete(true);
  86. }
  87. uint8_t rx_buf[256];
  88. int rx_len = radio_driver.recvRaw(rx_buf, sizeof(rx_buf));
  89. if (rx_len > 0) {
  90. int8_t snr = (int8_t)(radio_driver.getLastSNR() * 4);
  91. int8_t rssi = (int8_t)radio_driver.getLastRSSI();
  92. modem->onPacketReceived(snr, rssi, rx_buf, rx_len);
  93. }
  94. radio_driver.loop();
  95. }