subghz_scene_receiver_config.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "../subghz_i.h"
  2. #define PRESET_COUNT 4
  3. const char* const preset_text[PRESET_COUNT] = {
  4. "AM270",
  5. "AM650",
  6. "FM238",
  7. "FM476",
  8. };
  9. const uint32_t preset_value[PRESET_COUNT] = {
  10. FuriHalSubGhzPresetOok270Async, /** OOK, bandwidth 270kHz, asynchronous */
  11. FuriHalSubGhzPresetOok650Async, /** OOK, bandwidth 650kHz, asynchronous */
  12. FuriHalSubGhzPreset2FSKDev238Async, /** FM, deviation 2.380371 kHz, asynchronous */
  13. FuriHalSubGhzPreset2FSKDev476Async, /** FM, deviation 4.760742 kHz, asynchronous */
  14. };
  15. #define HOPPING_COUNT 2
  16. const char* const hopping_text[HOPPING_COUNT] = {
  17. "OFF",
  18. "ON",
  19. };
  20. const uint32_t hopping_value[HOPPING_COUNT] = {
  21. SubGhzHopperStateOFF,
  22. SubGhzHopperStateRunnig,
  23. };
  24. uint8_t subghz_scene_receiver_config_uint32_value_index(
  25. const uint32_t value,
  26. const uint32_t values[],
  27. uint8_t values_count) {
  28. int64_t last_value = INT64_MIN;
  29. uint8_t index = 0;
  30. for(uint8_t i = 0; i < values_count; i++) {
  31. if((value >= last_value) && (value <= values[i])) {
  32. index = i;
  33. break;
  34. }
  35. last_value = values[i];
  36. }
  37. return index;
  38. }
  39. uint8_t subghz_scene_receiver_config_next_frequency(const uint32_t value, void* context) {
  40. furi_assert(context);
  41. SubGhz* subghz = context;
  42. int64_t last_value = INT64_MIN;
  43. uint8_t index = 0;
  44. for(uint8_t i = 0; i < subghz_setting_get_frequency_count(subghz->setting); i++) {
  45. if((value >= last_value) && (value <= subghz_setting_get_frequency(subghz->setting, i))) {
  46. index = i;
  47. break;
  48. }
  49. last_value = subghz_setting_get_frequency(subghz->setting, i);
  50. }
  51. return index;
  52. }
  53. uint8_t subghz_scene_receiver_config_hopper_value_index(
  54. const uint32_t value,
  55. const uint32_t values[],
  56. uint8_t values_count,
  57. void* context) {
  58. furi_assert(context);
  59. UNUSED(values_count);
  60. SubGhz* subghz = context;
  61. if(value == values[0]) {
  62. return 0;
  63. } else {
  64. variable_item_set_current_value_text(
  65. (VariableItem*)scene_manager_get_scene_state(
  66. subghz->scene_manager, SubGhzSceneReceiverConfig),
  67. " -----");
  68. return 1;
  69. }
  70. }
  71. static void subghz_scene_receiver_config_set_frequency(VariableItem* item) {
  72. SubGhz* subghz = variable_item_get_context(item);
  73. uint8_t index = variable_item_get_current_value_index(item);
  74. if(subghz->txrx->hopper_state == SubGhzHopperStateOFF) {
  75. char text_buf[10] = {0};
  76. sprintf(
  77. text_buf,
  78. "%lu.%02lu",
  79. subghz_setting_get_frequency(subghz->setting, index) / 1000000,
  80. (subghz_setting_get_frequency(subghz->setting, index) % 1000000) / 10000);
  81. variable_item_set_current_value_text(item, text_buf);
  82. subghz->txrx->frequency = subghz_setting_get_frequency(subghz->setting, index);
  83. } else {
  84. variable_item_set_current_value_index(
  85. item, subghz_setting_get_frequency_default_index(subghz->setting));
  86. }
  87. }
  88. static void subghz_scene_receiver_config_set_preset(VariableItem* item) {
  89. SubGhz* subghz = variable_item_get_context(item);
  90. uint8_t index = variable_item_get_current_value_index(item);
  91. variable_item_set_current_value_text(item, preset_text[index]);
  92. subghz->txrx->preset = preset_value[index];
  93. }
  94. static void subghz_scene_receiver_config_set_hopping_runing(VariableItem* item) {
  95. SubGhz* subghz = variable_item_get_context(item);
  96. uint8_t index = variable_item_get_current_value_index(item);
  97. variable_item_set_current_value_text(item, hopping_text[index]);
  98. if(hopping_value[index] == SubGhzHopperStateOFF) {
  99. char text_buf[10] = {0};
  100. sprintf(
  101. text_buf,
  102. "%lu.%02lu",
  103. subghz_setting_get_default_frequency(subghz->setting) / 1000000,
  104. (subghz_setting_get_default_frequency(subghz->setting) % 1000000) / 10000);
  105. variable_item_set_current_value_text(
  106. (VariableItem*)scene_manager_get_scene_state(
  107. subghz->scene_manager, SubGhzSceneReceiverConfig),
  108. text_buf);
  109. subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting);
  110. variable_item_set_current_value_index(
  111. (VariableItem*)scene_manager_get_scene_state(
  112. subghz->scene_manager, SubGhzSceneReceiverConfig),
  113. subghz_setting_get_frequency_default_index(subghz->setting));
  114. } else {
  115. variable_item_set_current_value_text(
  116. (VariableItem*)scene_manager_get_scene_state(
  117. subghz->scene_manager, SubGhzSceneReceiverConfig),
  118. " -----");
  119. variable_item_set_current_value_index(
  120. (VariableItem*)scene_manager_get_scene_state(
  121. subghz->scene_manager, SubGhzSceneReceiverConfig),
  122. subghz_setting_get_frequency_default_index(subghz->setting));
  123. }
  124. subghz->txrx->hopper_state = hopping_value[index];
  125. }
  126. void subghz_scene_receiver_config_on_enter(void* context) {
  127. SubGhz* subghz = context;
  128. VariableItem* item;
  129. uint8_t value_index;
  130. item = variable_item_list_add(
  131. subghz->variable_item_list,
  132. "Frequency:",
  133. subghz_setting_get_frequency_count(subghz->setting),
  134. subghz_scene_receiver_config_set_frequency,
  135. subghz);
  136. value_index = subghz_scene_receiver_config_next_frequency(subghz->txrx->frequency, subghz);
  137. scene_manager_set_scene_state(
  138. subghz->scene_manager, SubGhzSceneReceiverConfig, (uint32_t)item);
  139. variable_item_set_current_value_index(item, value_index);
  140. char text_buf[10] = {0};
  141. sprintf(
  142. text_buf,
  143. "%lu.%02lu",
  144. subghz_setting_get_frequency(subghz->setting, value_index) / 1000000,
  145. (subghz_setting_get_frequency(subghz->setting, value_index) % 1000000) / 10000);
  146. variable_item_set_current_value_text(item, text_buf);
  147. if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
  148. SubGhzCustomEventManagerSet) {
  149. item = variable_item_list_add(
  150. subghz->variable_item_list,
  151. "Hopping:",
  152. HOPPING_COUNT,
  153. subghz_scene_receiver_config_set_hopping_runing,
  154. subghz);
  155. value_index = subghz_scene_receiver_config_hopper_value_index(
  156. subghz->txrx->hopper_state, hopping_value, HOPPING_COUNT, subghz);
  157. variable_item_set_current_value_index(item, value_index);
  158. variable_item_set_current_value_text(item, hopping_text[value_index]);
  159. }
  160. item = variable_item_list_add(
  161. subghz->variable_item_list,
  162. "Modulation:",
  163. PRESET_COUNT,
  164. subghz_scene_receiver_config_set_preset,
  165. subghz);
  166. value_index = subghz_scene_receiver_config_uint32_value_index(
  167. subghz->txrx->preset, preset_value, PRESET_COUNT);
  168. variable_item_set_current_value_index(item, value_index);
  169. variable_item_set_current_value_text(item, preset_text[value_index]);
  170. view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList);
  171. }
  172. bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent event) {
  173. UNUSED(context);
  174. UNUSED(event);
  175. return false;
  176. }
  177. void subghz_scene_receiver_config_on_exit(void* context) {
  178. SubGhz* subghz = context;
  179. variable_item_list_reset(subghz->variable_item_list);
  180. scene_manager_set_scene_state(
  181. subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet);
  182. }