main.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 onSendPacket(const uint8_t* data, uint16_t len) {
  56. radio_driver.startSendRaw(data, len);
  57. }
  58. bool onIsSendComplete() {
  59. return radio_driver.isSendComplete();
  60. }
  61. void onSendFinished() {
  62. radio_driver.onSendFinished();
  63. }
  64. void setup() {
  65. board.begin();
  66. if (!radio_init()) {
  67. halt();
  68. }
  69. radio_driver.begin();
  70. rng.begin(radio_get_rng_seed());
  71. loadOrCreateIdentity();
  72. Serial.begin(115200);
  73. uint32_t start = millis();
  74. while (!Serial && millis() - start < 3000) delay(10);
  75. delay(100);
  76. sensors.begin();
  77. modem = new KissModem(Serial, identity, rng, radio_driver, board, sensors);
  78. modem->setRadioCallback(onSetRadio);
  79. modem->setTxPowerCallback(onSetTxPower);
  80. modem->setGetCurrentRssiCallback(onGetCurrentRssi);
  81. modem->setGetStatsCallback(onGetStats);
  82. modem->setSendPacketCallback(onSendPacket);
  83. modem->setIsSendCompleteCallback(onIsSendComplete);
  84. modem->setOnSendFinishedCallback(onSendFinished);
  85. modem->begin();
  86. }
  87. void loop() {
  88. modem->loop();
  89. if (!modem->isTxBusy()) {
  90. uint8_t rx_buf[256];
  91. int rx_len = radio_driver.recvRaw(rx_buf, sizeof(rx_buf));
  92. if (rx_len > 0) {
  93. int8_t snr = (int8_t)(radio_driver.getLastSNR() * 4);
  94. int8_t rssi = (int8_t)radio_driver.getLastRSSI();
  95. modem->onPacketReceived(snr, rssi, rx_buf, rx_len);
  96. }
  97. }
  98. radio_driver.loop();
  99. }