subghz_scene_receiver_config.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. #include "../subghz_i.h"
  2. #include <lib/toolbox/value_index.h>
  3. enum SubGhzSettingIndex {
  4. SubGhzSettingIndexFrequency,
  5. SubGhzSettingIndexHopping,
  6. SubGhzSettingIndexModulation,
  7. SubGhzSettingIndexSound,
  8. SubGhzSettingIndexLock,
  9. SubGhzSettingIndexRAWThesholdRSSI,
  10. };
  11. #define RAW_THRESHOLD_RSSI_COUNT 11
  12. const char* const raw_theshold_rssi_text[RAW_THRESHOLD_RSSI_COUNT] = {
  13. "-----",
  14. "-85.0",
  15. "-80.0",
  16. "-75.0",
  17. "-70.0",
  18. "-65.0",
  19. "-60.0",
  20. "-55.0",
  21. "-50.0",
  22. "-45.0",
  23. "-40.0",
  24. };
  25. const float raw_theshold_rssi_value[RAW_THRESHOLD_RSSI_COUNT] = {
  26. -90.0f,
  27. -85.0f,
  28. -80.0f,
  29. -75.0f,
  30. -70.0f,
  31. -65.0f,
  32. -60.0f,
  33. -55.0f,
  34. -50.0f,
  35. -45.0f,
  36. -40.0f,
  37. };
  38. #define HOPPING_COUNT 2
  39. const char* const hopping_text[HOPPING_COUNT] = {
  40. "OFF",
  41. "ON",
  42. };
  43. const uint32_t hopping_value[HOPPING_COUNT] = {
  44. SubGhzHopperStateOFF,
  45. SubGhzHopperStateRunnig,
  46. };
  47. #define SPEAKER_COUNT 2
  48. const char* const speaker_text[SPEAKER_COUNT] = {
  49. "OFF",
  50. "ON",
  51. };
  52. const uint32_t speaker_value[SPEAKER_COUNT] = {
  53. SubGhzSpeakerStateShutdown,
  54. SubGhzSpeakerStateEnable,
  55. };
  56. uint8_t subghz_scene_receiver_config_next_frequency(const uint32_t value, void* context) {
  57. furi_assert(context);
  58. SubGhz* subghz = context;
  59. uint8_t index = 0;
  60. for(uint8_t i = 0; i < subghz_setting_get_frequency_count(subghz->setting); i++) {
  61. if(value == subghz_setting_get_frequency(subghz->setting, i)) {
  62. index = i;
  63. break;
  64. } else {
  65. index = subghz_setting_get_frequency_default_index(subghz->setting);
  66. }
  67. }
  68. return index;
  69. }
  70. uint8_t subghz_scene_receiver_config_next_preset(const char* preset_name, void* context) {
  71. furi_assert(context);
  72. SubGhz* subghz = context;
  73. uint8_t index = 0;
  74. for(uint8_t i = 0; i < subghz_setting_get_preset_count(subghz->setting); i++) {
  75. if(!strcmp(subghz_setting_get_preset_name(subghz->setting, i), preset_name)) {
  76. index = i;
  77. break;
  78. } else {
  79. // index = subghz_setting_get_frequency_default_index(subghz->setting);
  80. }
  81. }
  82. return index;
  83. }
  84. uint8_t subghz_scene_receiver_config_hopper_value_index(
  85. const uint32_t value,
  86. const uint32_t values[],
  87. uint8_t values_count,
  88. void* context) {
  89. furi_assert(context);
  90. UNUSED(values_count);
  91. SubGhz* subghz = context;
  92. if(value == values[0]) {
  93. return 0;
  94. } else {
  95. variable_item_set_current_value_text(
  96. (VariableItem*)scene_manager_get_scene_state(
  97. subghz->scene_manager, SubGhzSceneReceiverConfig),
  98. " -----");
  99. return 1;
  100. }
  101. }
  102. static void subghz_scene_receiver_config_set_frequency(VariableItem* item) {
  103. SubGhz* subghz = variable_item_get_context(item);
  104. uint8_t index = variable_item_get_current_value_index(item);
  105. if(subghz->txrx->hopper_state == SubGhzHopperStateOFF) {
  106. char text_buf[10] = {0};
  107. snprintf(
  108. text_buf,
  109. sizeof(text_buf),
  110. "%lu.%02lu",
  111. subghz_setting_get_frequency(subghz->setting, index) / 1000000,
  112. (subghz_setting_get_frequency(subghz->setting, index) % 1000000) / 10000);
  113. variable_item_set_current_value_text(item, text_buf);
  114. subghz->txrx->preset->frequency = subghz_setting_get_frequency(subghz->setting, index);
  115. } else {
  116. variable_item_set_current_value_index(
  117. item, subghz_setting_get_frequency_default_index(subghz->setting));
  118. }
  119. }
  120. static void subghz_scene_receiver_config_set_preset(VariableItem* item) {
  121. SubGhz* subghz = variable_item_get_context(item);
  122. uint8_t index = variable_item_get_current_value_index(item);
  123. variable_item_set_current_value_text(
  124. item, subghz_setting_get_preset_name(subghz->setting, index));
  125. subghz_preset_init(
  126. subghz,
  127. subghz_setting_get_preset_name(subghz->setting, index),
  128. subghz->txrx->preset->frequency,
  129. subghz_setting_get_preset_data(subghz->setting, index),
  130. subghz_setting_get_preset_data_size(subghz->setting, index));
  131. }
  132. static void subghz_scene_receiver_config_set_hopping_running(VariableItem* item) {
  133. SubGhz* subghz = variable_item_get_context(item);
  134. uint8_t index = variable_item_get_current_value_index(item);
  135. variable_item_set_current_value_text(item, hopping_text[index]);
  136. if(hopping_value[index] == SubGhzHopperStateOFF) {
  137. char text_buf[10] = {0};
  138. snprintf(
  139. text_buf,
  140. sizeof(text_buf),
  141. "%lu.%02lu",
  142. subghz_setting_get_default_frequency(subghz->setting) / 1000000,
  143. (subghz_setting_get_default_frequency(subghz->setting) % 1000000) / 10000);
  144. variable_item_set_current_value_text(
  145. (VariableItem*)scene_manager_get_scene_state(
  146. subghz->scene_manager, SubGhzSceneReceiverConfig),
  147. text_buf);
  148. subghz->txrx->preset->frequency = subghz_setting_get_default_frequency(subghz->setting);
  149. variable_item_set_current_value_index(
  150. (VariableItem*)scene_manager_get_scene_state(
  151. subghz->scene_manager, SubGhzSceneReceiverConfig),
  152. subghz_setting_get_frequency_default_index(subghz->setting));
  153. } else {
  154. variable_item_set_current_value_text(
  155. (VariableItem*)scene_manager_get_scene_state(
  156. subghz->scene_manager, SubGhzSceneReceiverConfig),
  157. " -----");
  158. variable_item_set_current_value_index(
  159. (VariableItem*)scene_manager_get_scene_state(
  160. subghz->scene_manager, SubGhzSceneReceiverConfig),
  161. subghz_setting_get_frequency_default_index(subghz->setting));
  162. }
  163. subghz->txrx->hopper_state = hopping_value[index];
  164. }
  165. static void subghz_scene_receiver_config_set_speaker(VariableItem* item) {
  166. SubGhz* subghz = variable_item_get_context(item);
  167. uint8_t index = variable_item_get_current_value_index(item);
  168. variable_item_set_current_value_text(item, speaker_text[index]);
  169. subghz->txrx->speaker_state = speaker_value[index];
  170. }
  171. static void subghz_scene_receiver_config_set_raw_threshold_rssi(VariableItem* item) {
  172. SubGhz* subghz = variable_item_get_context(item);
  173. uint8_t index = variable_item_get_current_value_index(item);
  174. variable_item_set_current_value_text(item, raw_theshold_rssi_text[index]);
  175. subghz->txrx->raw_threshold_rssi = raw_theshold_rssi_value[index];
  176. }
  177. static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) {
  178. furi_assert(context);
  179. SubGhz* subghz = context;
  180. if(index == SubGhzSettingIndexLock) {
  181. view_dispatcher_send_custom_event(
  182. subghz->view_dispatcher, SubGhzCustomEventSceneSettingLock);
  183. }
  184. }
  185. void subghz_scene_receiver_config_on_enter(void* context) {
  186. SubGhz* subghz = context;
  187. VariableItem* item;
  188. uint8_t value_index;
  189. item = variable_item_list_add(
  190. subghz->variable_item_list,
  191. "Frequency:",
  192. subghz_setting_get_frequency_count(subghz->setting),
  193. subghz_scene_receiver_config_set_frequency,
  194. subghz);
  195. value_index =
  196. subghz_scene_receiver_config_next_frequency(subghz->txrx->preset->frequency, subghz);
  197. scene_manager_set_scene_state(
  198. subghz->scene_manager, SubGhzSceneReceiverConfig, (uint32_t)item);
  199. variable_item_set_current_value_index(item, value_index);
  200. char text_buf[10] = {0};
  201. snprintf(
  202. text_buf,
  203. sizeof(text_buf),
  204. "%lu.%02lu",
  205. subghz_setting_get_frequency(subghz->setting, value_index) / 1000000,
  206. (subghz_setting_get_frequency(subghz->setting, value_index) % 1000000) / 10000);
  207. variable_item_set_current_value_text(item, text_buf);
  208. if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
  209. SubGhzCustomEventManagerSet) {
  210. item = variable_item_list_add(
  211. subghz->variable_item_list,
  212. "Hopping:",
  213. HOPPING_COUNT,
  214. subghz_scene_receiver_config_set_hopping_running,
  215. subghz);
  216. value_index = subghz_scene_receiver_config_hopper_value_index(
  217. subghz->txrx->hopper_state, hopping_value, HOPPING_COUNT, subghz);
  218. variable_item_set_current_value_index(item, value_index);
  219. variable_item_set_current_value_text(item, hopping_text[value_index]);
  220. }
  221. item = variable_item_list_add(
  222. subghz->variable_item_list,
  223. "Modulation:",
  224. subghz_setting_get_preset_count(subghz->setting),
  225. subghz_scene_receiver_config_set_preset,
  226. subghz);
  227. value_index = subghz_scene_receiver_config_next_preset(
  228. furi_string_get_cstr(subghz->txrx->preset->name), subghz);
  229. variable_item_set_current_value_index(item, value_index);
  230. variable_item_set_current_value_text(
  231. item, subghz_setting_get_preset_name(subghz->setting, value_index));
  232. item = variable_item_list_add(
  233. subghz->variable_item_list,
  234. "Sound:",
  235. SPEAKER_COUNT,
  236. subghz_scene_receiver_config_set_speaker,
  237. subghz);
  238. value_index = value_index_uint32(subghz->txrx->speaker_state, speaker_value, SPEAKER_COUNT);
  239. variable_item_set_current_value_index(item, value_index);
  240. variable_item_set_current_value_text(item, speaker_text[value_index]);
  241. if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
  242. SubGhzCustomEventManagerSet) {
  243. variable_item_list_add(subghz->variable_item_list, "Lock Keyboard", 1, NULL, NULL);
  244. variable_item_list_set_enter_callback(
  245. subghz->variable_item_list,
  246. subghz_scene_receiver_config_var_list_enter_callback,
  247. subghz);
  248. }
  249. if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) ==
  250. SubGhzCustomEventManagerSet) {
  251. item = variable_item_list_add(
  252. subghz->variable_item_list,
  253. "RSSI Threshold:",
  254. RAW_THRESHOLD_RSSI_COUNT,
  255. subghz_scene_receiver_config_set_raw_threshold_rssi,
  256. subghz);
  257. value_index = value_index_float(
  258. subghz->txrx->raw_threshold_rssi, raw_theshold_rssi_value, RAW_THRESHOLD_RSSI_COUNT);
  259. variable_item_set_current_value_index(item, value_index);
  260. variable_item_set_current_value_text(item, raw_theshold_rssi_text[value_index]);
  261. }
  262. view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList);
  263. }
  264. bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent event) {
  265. SubGhz* subghz = context;
  266. bool consumed = false;
  267. if(event.type == SceneManagerEventTypeCustom) {
  268. if(event.event == SubGhzCustomEventSceneSettingLock) {
  269. subghz->lock = SubGhzLockOn;
  270. scene_manager_previous_scene(subghz->scene_manager);
  271. consumed = true;
  272. }
  273. }
  274. return consumed;
  275. }
  276. void subghz_scene_receiver_config_on_exit(void* context) {
  277. SubGhz* subghz = context;
  278. variable_item_list_set_selected_item(subghz->variable_item_list, 0);
  279. variable_item_list_reset(subghz->variable_item_list);
  280. scene_manager_set_scene_state(
  281. subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet);
  282. }