KissModem.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #pragma once
  2. #include <Arduino.h>
  3. #include <Identity.h>
  4. #include <Utils.h>
  5. #include <Mesh.h>
  6. #include <helpers/SensorManager.h>
  7. #define KISS_FEND 0xC0
  8. #define KISS_FESC 0xDB
  9. #define KISS_TFEND 0xDC
  10. #define KISS_TFESC 0xDD
  11. #define KISS_MAX_FRAME_SIZE 512
  12. #define KISS_MAX_PACKET_SIZE 255
  13. #define KISS_CMD_DATA 0x00
  14. #define KISS_CMD_TXDELAY 0x01
  15. #define KISS_CMD_PERSISTENCE 0x02
  16. #define KISS_CMD_SLOTTIME 0x03
  17. #define KISS_CMD_TXTAIL 0x04
  18. #define KISS_CMD_FULLDUPLEX 0x05
  19. #define KISS_CMD_SETHARDWARE 0x06
  20. #define KISS_CMD_RETURN 0xFF
  21. #define KISS_DEFAULT_TXDELAY 50
  22. #define KISS_DEFAULT_PERSISTENCE 63
  23. #define KISS_DEFAULT_SLOTTIME 10
  24. #define HW_CMD_GET_IDENTITY 0x01
  25. #define HW_CMD_GET_RANDOM 0x02
  26. #define HW_CMD_VERIFY_SIGNATURE 0x03
  27. #define HW_CMD_SIGN_DATA 0x04
  28. #define HW_CMD_ENCRYPT_DATA 0x05
  29. #define HW_CMD_DECRYPT_DATA 0x06
  30. #define HW_CMD_KEY_EXCHANGE 0x07
  31. #define HW_CMD_HASH 0x08
  32. #define HW_CMD_SET_RADIO 0x09
  33. #define HW_CMD_SET_TX_POWER 0x0A
  34. #define HW_CMD_GET_RADIO 0x0C
  35. #define HW_CMD_GET_TX_POWER 0x0D
  36. #define HW_CMD_GET_VERSION 0x0F
  37. #define HW_CMD_GET_CURRENT_RSSI 0x10
  38. #define HW_CMD_IS_CHANNEL_BUSY 0x11
  39. #define HW_CMD_GET_AIRTIME 0x12
  40. #define HW_CMD_GET_NOISE_FLOOR 0x13
  41. #define HW_CMD_GET_STATS 0x14
  42. #define HW_CMD_GET_BATTERY 0x15
  43. #define HW_CMD_PING 0x16
  44. #define HW_CMD_GET_SENSORS 0x17
  45. #define HW_RESP_IDENTITY 0x21
  46. #define HW_RESP_RANDOM 0x22
  47. #define HW_RESP_VERIFY 0x23
  48. #define HW_RESP_SIGNATURE 0x24
  49. #define HW_RESP_ENCRYPTED 0x25
  50. #define HW_RESP_DECRYPTED 0x26
  51. #define HW_RESP_SHARED_SECRET 0x27
  52. #define HW_RESP_HASH 0x28
  53. #define HW_RESP_OK 0x29
  54. #define HW_RESP_RADIO 0x2A
  55. #define HW_RESP_TX_POWER 0x2B
  56. #define HW_RESP_VERSION 0x2D
  57. #define HW_RESP_ERROR 0x2E
  58. #define HW_RESP_TX_DONE 0x2F
  59. #define HW_RESP_CURRENT_RSSI 0x30
  60. #define HW_RESP_CHANNEL_BUSY 0x31
  61. #define HW_RESP_AIRTIME 0x32
  62. #define HW_RESP_NOISE_FLOOR 0x33
  63. #define HW_RESP_STATS 0x34
  64. #define HW_RESP_BATTERY 0x35
  65. #define HW_RESP_PONG 0x36
  66. #define HW_RESP_SENSORS 0x37
  67. #define HW_RESP_RX_META 0x38
  68. #define HW_ERR_INVALID_LENGTH 0x01
  69. #define HW_ERR_INVALID_PARAM 0x02
  70. #define HW_ERR_NO_CALLBACK 0x03
  71. #define HW_ERR_MAC_FAILED 0x04
  72. #define HW_ERR_UNKNOWN_CMD 0x05
  73. #define HW_ERR_ENCRYPT_FAILED 0x06
  74. #define KISS_FIRMWARE_VERSION 1
  75. typedef void (*SetRadioCallback)(float freq, float bw, uint8_t sf, uint8_t cr);
  76. typedef void (*SetTxPowerCallback)(uint8_t power);
  77. typedef float (*GetCurrentRssiCallback)();
  78. typedef void (*GetStatsCallback)(uint32_t* rx, uint32_t* tx, uint32_t* errors);
  79. typedef void (*SendPacketCallback)(const uint8_t* data, uint16_t len);
  80. typedef bool (*IsSendCompleteCallback)();
  81. typedef void (*OnSendFinishedCallback)();
  82. struct RadioConfig {
  83. uint32_t freq_hz;
  84. uint32_t bw_hz;
  85. uint8_t sf;
  86. uint8_t cr;
  87. uint8_t tx_power;
  88. };
  89. enum TxState {
  90. TX_IDLE,
  91. TX_WAIT_CLEAR,
  92. TX_SLOT_WAIT,
  93. TX_DELAY,
  94. TX_SENDING
  95. };
  96. class KissModem {
  97. Stream& _serial;
  98. mesh::LocalIdentity& _identity;
  99. mesh::RNG& _rng;
  100. mesh::Radio& _radio;
  101. mesh::MainBoard& _board;
  102. SensorManager& _sensors;
  103. uint8_t _rx_buf[KISS_MAX_FRAME_SIZE];
  104. uint16_t _rx_len;
  105. bool _rx_escaped;
  106. bool _rx_active;
  107. uint8_t _pending_tx[KISS_MAX_PACKET_SIZE];
  108. uint16_t _pending_tx_len;
  109. bool _has_pending_tx;
  110. uint8_t _txdelay;
  111. uint8_t _persistence;
  112. uint8_t _slottime;
  113. uint8_t _txtail;
  114. uint8_t _fullduplex;
  115. TxState _tx_state;
  116. uint32_t _tx_timer;
  117. SetRadioCallback _setRadioCallback;
  118. SetTxPowerCallback _setTxPowerCallback;
  119. GetCurrentRssiCallback _getCurrentRssiCallback;
  120. GetStatsCallback _getStatsCallback;
  121. SendPacketCallback _sendPacketCallback;
  122. IsSendCompleteCallback _isSendCompleteCallback;
  123. OnSendFinishedCallback _onSendFinishedCallback;
  124. RadioConfig _config;
  125. void writeByte(uint8_t b);
  126. void writeFrame(uint8_t type, const uint8_t* data, uint16_t len);
  127. void writeHardwareFrame(uint8_t sub_cmd, const uint8_t* data, uint16_t len);
  128. void writeHardwareError(uint8_t error_code);
  129. void processFrame();
  130. void handleHardwareCommand(uint8_t sub_cmd, const uint8_t* data, uint16_t len);
  131. void processTx();
  132. void handleGetIdentity();
  133. void handleGetRandom(const uint8_t* data, uint16_t len);
  134. void handleVerifySignature(const uint8_t* data, uint16_t len);
  135. void handleSignData(const uint8_t* data, uint16_t len);
  136. void handleEncryptData(const uint8_t* data, uint16_t len);
  137. void handleDecryptData(const uint8_t* data, uint16_t len);
  138. void handleKeyExchange(const uint8_t* data, uint16_t len);
  139. void handleHash(const uint8_t* data, uint16_t len);
  140. void handleSetRadio(const uint8_t* data, uint16_t len);
  141. void handleSetTxPower(const uint8_t* data, uint16_t len);
  142. void handleGetRadio();
  143. void handleGetTxPower();
  144. void handleGetVersion();
  145. void handleGetCurrentRssi();
  146. void handleIsChannelBusy();
  147. void handleGetAirtime(const uint8_t* data, uint16_t len);
  148. void handleGetNoiseFloor();
  149. void handleGetStats();
  150. void handleGetBattery();
  151. void handlePing();
  152. void handleGetSensors(const uint8_t* data, uint16_t len);
  153. public:
  154. KissModem(Stream& serial, mesh::LocalIdentity& identity, mesh::RNG& rng,
  155. mesh::Radio& radio, mesh::MainBoard& board, SensorManager& sensors);
  156. void begin();
  157. void loop();
  158. void setRadioCallback(SetRadioCallback cb) { _setRadioCallback = cb; }
  159. void setTxPowerCallback(SetTxPowerCallback cb) { _setTxPowerCallback = cb; }
  160. void setGetCurrentRssiCallback(GetCurrentRssiCallback cb) { _getCurrentRssiCallback = cb; }
  161. void setGetStatsCallback(GetStatsCallback cb) { _getStatsCallback = cb; }
  162. void setSendPacketCallback(SendPacketCallback cb) { _sendPacketCallback = cb; }
  163. void setIsSendCompleteCallback(IsSendCompleteCallback cb) { _isSendCompleteCallback = cb; }
  164. void setOnSendFinishedCallback(OnSendFinishedCallback cb) { _onSendFinishedCallback = cb; }
  165. void onPacketReceived(int8_t snr, int8_t rssi, const uint8_t* packet, uint16_t len);
  166. bool isTxBusy() const { return _tx_state != TX_IDLE; }
  167. };