radio_device_loader.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "radio_device_loader.h"
  2. #include <applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h>
  3. #include <lib/subghz/devices/cc1101_int/cc1101_int_interconnect.h>
  4. static void radio_device_loader_power_on() {
  5. uint8_t attempts = 0;
  6. while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) {
  7. furi_hal_power_enable_otg();
  8. //CC1101 power-up time
  9. furi_delay_ms(10);
  10. }
  11. }
  12. static void radio_device_loader_power_off() {
  13. if(furi_hal_power_is_otg_enabled()) furi_hal_power_disable_otg();
  14. }
  15. bool radio_device_loader_is_connect_external(const char* name) {
  16. bool is_connect = false;
  17. bool is_otg_enabled = furi_hal_power_is_otg_enabled();
  18. if(!is_otg_enabled) {
  19. radio_device_loader_power_on();
  20. }
  21. const SubGhzDevice* device = subghz_devices_get_by_name(name);
  22. if(device) {
  23. is_connect = subghz_devices_is_connect(device);
  24. }
  25. if(!is_otg_enabled) {
  26. radio_device_loader_power_off();
  27. }
  28. return is_connect;
  29. }
  30. const SubGhzDevice* radio_device_loader_set(
  31. const SubGhzDevice* current_radio_device,
  32. SubGhzRadioDeviceType radio_device_type) {
  33. const SubGhzDevice* radio_device;
  34. if(radio_device_type == SubGhzRadioDeviceTypeExternalCC1101 &&
  35. radio_device_loader_is_connect_external(SUBGHZ_DEVICE_CC1101_EXT_NAME)) {
  36. radio_device_loader_power_on();
  37. radio_device = subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_EXT_NAME);
  38. subghz_devices_begin(radio_device);
  39. } else if(current_radio_device == NULL) {
  40. radio_device = subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_INT_NAME);
  41. } else {
  42. radio_device_loader_end(current_radio_device);
  43. radio_device = subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_INT_NAME);
  44. }
  45. return radio_device;
  46. }
  47. void radio_device_loader_end(const SubGhzDevice* radio_device) {
  48. furi_assert(radio_device);
  49. radio_device_loader_power_off();
  50. if(radio_device != subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_INT_NAME)) {
  51. subghz_devices_end(radio_device);
  52. }
  53. }