pocsag_pager_app_i.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "pocsag_pager_app_i.h"
  2. #define TAG "POCSAGPager"
  3. #include <flipper_format/flipper_format_i.h>
  4. void pcsg_preset_init(
  5. void* context,
  6. const char* preset_name,
  7. uint32_t frequency,
  8. uint8_t* preset_data,
  9. size_t preset_data_size) {
  10. furi_assert(context);
  11. POCSAGPagerApp* app = context;
  12. furi_string_set(app->txrx->preset->name, preset_name);
  13. app->txrx->preset->frequency = frequency;
  14. app->txrx->preset->data = preset_data;
  15. app->txrx->preset->data_size = preset_data_size;
  16. }
  17. void pcsg_get_frequency_modulation(
  18. POCSAGPagerApp* app,
  19. FuriString* frequency,
  20. FuriString* modulation) {
  21. furi_assert(app);
  22. if(frequency != NULL) {
  23. furi_string_printf(
  24. frequency,
  25. "%03ld.%02ld",
  26. app->txrx->preset->frequency / 1000000 % 1000,
  27. app->txrx->preset->frequency / 10000 % 100);
  28. }
  29. if(modulation != NULL) {
  30. furi_string_printf(modulation, "%.2s", furi_string_get_cstr(app->txrx->preset->name));
  31. }
  32. }
  33. void pcsg_begin(POCSAGPagerApp* app, uint8_t* preset_data) {
  34. furi_assert(app);
  35. subghz_devices_reset(app->txrx->radio_device);
  36. subghz_devices_idle(app->txrx->radio_device);
  37. subghz_devices_load_preset(app->txrx->radio_device, FuriHalSubGhzPresetCustom, preset_data);
  38. // furi_hal_gpio_init(furi_hal_subghz.cc1101_g0_pin, GpioModeInput, GpioPullNo, GpioSpeedLow);
  39. app->txrx->txrx_state = PCSGTxRxStateIDLE;
  40. }
  41. uint32_t pcsg_rx(POCSAGPagerApp* app, uint32_t frequency) {
  42. furi_assert(app);
  43. if(!subghz_devices_is_frequency_valid(app->txrx->radio_device, frequency)) {
  44. furi_crash("POCSAGPager: Incorrect RX frequency.");
  45. }
  46. furi_assert(
  47. app->txrx->txrx_state != PCSGTxRxStateRx && app->txrx->txrx_state != PCSGTxRxStateSleep);
  48. subghz_devices_idle(app->txrx->radio_device);
  49. uint32_t value = subghz_devices_set_frequency(app->txrx->radio_device, frequency);
  50. // Not need. init in subghz_devices_start_async_tx
  51. // furi_hal_gpio_init(furi_hal_subghz.cc1101_g0_pin, GpioModeInput, GpioPullNo, GpioSpeedLow);
  52. subghz_devices_flush_rx(app->txrx->radio_device);
  53. subghz_devices_set_rx(app->txrx->radio_device);
  54. subghz_devices_start_async_rx(
  55. app->txrx->radio_device, subghz_worker_rx_callback, app->txrx->worker);
  56. subghz_worker_start(app->txrx->worker);
  57. app->txrx->txrx_state = PCSGTxRxStateRx;
  58. return value;
  59. }
  60. void pcsg_idle(POCSAGPagerApp* app) {
  61. furi_assert(app);
  62. furi_assert(app->txrx->txrx_state != PCSGTxRxStateSleep);
  63. subghz_devices_idle(app->txrx->radio_device);
  64. app->txrx->txrx_state = PCSGTxRxStateIDLE;
  65. }
  66. void pcsg_rx_end(POCSAGPagerApp* app) {
  67. furi_assert(app);
  68. furi_assert(app->txrx->txrx_state == PCSGTxRxStateRx);
  69. if(subghz_worker_is_running(app->txrx->worker)) {
  70. subghz_worker_stop(app->txrx->worker);
  71. subghz_devices_stop_async_rx(app->txrx->radio_device);
  72. }
  73. subghz_devices_idle(app->txrx->radio_device);
  74. app->txrx->txrx_state = PCSGTxRxStateIDLE;
  75. }
  76. void pcsg_sleep(POCSAGPagerApp* app) {
  77. furi_assert(app);
  78. subghz_devices_sleep(app->txrx->radio_device);
  79. app->txrx->txrx_state = PCSGTxRxStateSleep;
  80. }
  81. void pcsg_hopper_update(POCSAGPagerApp* app) {
  82. furi_assert(app);
  83. switch(app->txrx->hopper_state) {
  84. case PCSGHopperStateOFF:
  85. return;
  86. break;
  87. case PCSGHopperStatePause:
  88. return;
  89. break;
  90. case PCSGHopperStateRSSITimeOut:
  91. if(app->txrx->hopper_timeout != 0) {
  92. app->txrx->hopper_timeout--;
  93. return;
  94. }
  95. break;
  96. default:
  97. break;
  98. }
  99. float rssi = -127.0f;
  100. if(app->txrx->hopper_state != PCSGHopperStateRSSITimeOut) {
  101. // See RSSI Calculation timings in CC1101 17.3 RSSI
  102. rssi = subghz_devices_get_rssi(app->txrx->radio_device);
  103. // Stay if RSSI is high enough
  104. if(rssi > -90.0f) {
  105. app->txrx->hopper_timeout = 10;
  106. app->txrx->hopper_state = PCSGHopperStateRSSITimeOut;
  107. return;
  108. }
  109. } else {
  110. app->txrx->hopper_state = PCSGHopperStateRunnig;
  111. }
  112. // Select next frequency
  113. if(app->txrx->hopper_idx_frequency <
  114. subghz_setting_get_hopper_frequency_count(app->setting) - 1) {
  115. app->txrx->hopper_idx_frequency++;
  116. } else {
  117. app->txrx->hopper_idx_frequency = 0;
  118. }
  119. if(app->txrx->txrx_state == PCSGTxRxStateRx) {
  120. pcsg_rx_end(app);
  121. };
  122. if(app->txrx->txrx_state == PCSGTxRxStateIDLE) {
  123. subghz_receiver_reset(app->txrx->receiver);
  124. app->txrx->preset->frequency =
  125. subghz_setting_get_hopper_frequency(app->setting, app->txrx->hopper_idx_frequency);
  126. pcsg_rx(app, app->txrx->preset->frequency);
  127. }
  128. }