mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-12-29 14:13:08 +00:00
b1850fd700
* Weather station: new external radio driver
69 lines
No EOL
2.2 KiB
C
69 lines
No EOL
2.2 KiB
C
#include "radio_device_loader.h"
|
|
|
|
#include <applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h>
|
|
#include <lib/subghz/devices/cc1101_int/cc1101_int_interconnect.h>
|
|
|
|
static void radio_device_loader_power_on() {
|
|
uint8_t attempts = 0;
|
|
while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) {
|
|
furi_hal_power_enable_otg();
|
|
//CC1101 power-up time
|
|
furi_delay_ms(10);
|
|
}
|
|
}
|
|
|
|
static void radio_device_loader_power_off() {
|
|
if(furi_hal_power_is_otg_enabled()) furi_hal_power_disable_otg();
|
|
}
|
|
|
|
bool radio_device_loader_is_connect_external(const char* name) {
|
|
bool is_connect = false;
|
|
bool is_otg_enabled = furi_hal_power_is_otg_enabled();
|
|
|
|
if(!is_otg_enabled) {
|
|
radio_device_loader_power_on();
|
|
}
|
|
|
|
const SubGhzDevice* device = subghz_devices_get_by_name(name);
|
|
if(device) {
|
|
is_connect = subghz_devices_is_connect(device);
|
|
}
|
|
|
|
if(!is_otg_enabled) {
|
|
radio_device_loader_power_off();
|
|
}
|
|
return is_connect;
|
|
}
|
|
|
|
const SubGhzDevice* radio_device_loader_set(
|
|
const SubGhzDevice* current_radio_device,
|
|
SubGhzRadioDeviceType radio_device_type) {
|
|
const SubGhzDevice* radio_device;
|
|
|
|
if(radio_device_type == SubGhzRadioDeviceTypeExternalCC1101 &&
|
|
radio_device_loader_is_connect_external(SUBGHZ_DEVICE_CC1101_EXT_NAME)) {
|
|
radio_device_loader_power_on();
|
|
radio_device = subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_EXT_NAME);
|
|
subghz_devices_begin(radio_device);
|
|
} else if(current_radio_device == NULL) {
|
|
radio_device = subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_INT_NAME);
|
|
} else {
|
|
radio_device_loader_end(current_radio_device);
|
|
radio_device = subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_INT_NAME);
|
|
}
|
|
|
|
return radio_device;
|
|
}
|
|
|
|
bool radio_device_loader_is_external(const SubGhzDevice* radio_device) {
|
|
furi_assert(radio_device);
|
|
return (radio_device != subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_INT_NAME));
|
|
}
|
|
|
|
void radio_device_loader_end(const SubGhzDevice* radio_device) {
|
|
furi_assert(radio_device);
|
|
radio_device_loader_power_off();
|
|
if(radio_device != subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_INT_NAME)) {
|
|
subghz_devices_end(radio_device);
|
|
}
|
|
} |