mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-18 19:01:47 +03:00
commit
202a97eb74
@ -54,7 +54,7 @@ Our Discord Community:
|
|||||||
Also check the changelog in releases for latest updates!
|
Also check the changelog in releases for latest updates!
|
||||||
|
|
||||||
### Current modified and new Sub-GHz protocols list:
|
### Current modified and new Sub-GHz protocols list:
|
||||||
Thanks to Official team (to thier SubGHz Developer, Skorp) for implementing decoders for these protocols.
|
Thanks to Official team (to their SubGHz Developer, Skorp) for implementing decoders for these protocols.
|
||||||
|
|
||||||
Encoders/sending made by Eng1n33r & @xMasterX:
|
Encoders/sending made by Eng1n33r & @xMasterX:
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ if GetOption("fullenv") or any(
|
|||||||
basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"])
|
basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"])
|
||||||
distenv.Default(basic_dist)
|
distenv.Default(basic_dist)
|
||||||
|
|
||||||
dist_dir = distenv.GetProjetDirName()
|
dist_dir = distenv.GetProjectDirName()
|
||||||
fap_dist = [
|
fap_dist = [
|
||||||
distenv.Install(
|
distenv.Install(
|
||||||
distenv.Dir(f"#/dist/{dist_dir}/apps/debug_elf"),
|
distenv.Dir(f"#/dist/{dist_dir}/apps/debug_elf"),
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Anonumous instance */
|
/** Anonymous instance */
|
||||||
typedef struct InfraredProgressView InfraredProgressView;
|
typedef struct InfraredProgressView InfraredProgressView;
|
||||||
|
|
||||||
/** Callback for back button handling */
|
/** Callback for back button handling */
|
||||||
|
@ -14,7 +14,7 @@ static void lfrfid_clear_t5577_password_and_config_to_EM(LfRfid* app) {
|
|||||||
T55xxTiming* t55xxtiming = malloc(sizeof(T55xxTiming));
|
T55xxTiming* t55xxtiming = malloc(sizeof(T55xxTiming));
|
||||||
Popup* popup = app->popup;
|
Popup* popup = app->popup;
|
||||||
char curr_buf[32] = {};
|
char curr_buf[32] = {};
|
||||||
//TODO: use .txt file in resourses for passwords.
|
//TODO: use .txt file in resources for passwords.
|
||||||
const uint32_t default_passwords[] = {
|
const uint32_t default_passwords[] = {
|
||||||
0x51243648, 0x000D8787, 0x19920427, 0x50524F58, 0xF9DCEBA0, 0x65857569, 0x05D73B9F,
|
0x51243648, 0x000D8787, 0x19920427, 0x50524F58, 0xF9DCEBA0, 0x65857569, 0x05D73B9F,
|
||||||
0x89A69E60, 0x314159E0, 0xAA55BBBB, 0xA5B4C3D2, 0x1C0B5848, 0x00434343, 0x444E4752,
|
0x89A69E60, 0x314159E0, 0xAA55BBBB, 0xA5B4C3D2, 0x1C0B5848, 0x00434343, 0x444E4752,
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
* @param aid - AID number array
|
* @param aid - AID number array
|
||||||
* @param aid_len - AID length
|
* @param aid_len - AID length
|
||||||
* @param aid_name - string to keep AID name
|
* @param aid_name - string to keep AID name
|
||||||
* @return - true if AID found, false otherwies
|
* @return - true if AID found, false otherwise
|
||||||
*/
|
*/
|
||||||
bool nfc_emv_parser_get_aid_name(
|
bool nfc_emv_parser_get_aid_name(
|
||||||
Storage* storage,
|
Storage* storage,
|
||||||
@ -21,7 +21,7 @@ bool nfc_emv_parser_get_aid_name(
|
|||||||
* @param storage Storage instance
|
* @param storage Storage instance
|
||||||
* @param country_code - ISO 3166 country code
|
* @param country_code - ISO 3166 country code
|
||||||
* @param country_name - string to keep country name
|
* @param country_name - string to keep country name
|
||||||
* @return - true if country found, false otherwies
|
* @return - true if country found, false otherwise
|
||||||
*/
|
*/
|
||||||
bool nfc_emv_parser_get_country_name(
|
bool nfc_emv_parser_get_country_name(
|
||||||
Storage* storage,
|
Storage* storage,
|
||||||
@ -32,7 +32,7 @@ bool nfc_emv_parser_get_country_name(
|
|||||||
* @param storage Storage instance
|
* @param storage Storage instance
|
||||||
* @param currency_code - ISO 3166 currency code
|
* @param currency_code - ISO 3166 currency code
|
||||||
* @param currency_name - string to keep currency name
|
* @param currency_name - string to keep currency name
|
||||||
* @return - true if currency found, false otherwies
|
* @return - true if currency found, false otherwise
|
||||||
*/
|
*/
|
||||||
bool nfc_emv_parser_get_currency_name(
|
bool nfc_emv_parser_get_currency_name(
|
||||||
Storage* storage,
|
Storage* storage,
|
||||||
|
@ -9,7 +9,7 @@ struct SubGhzChatWorker {
|
|||||||
SubGhzTxRxWorker* subghz_txrx;
|
SubGhzTxRxWorker* subghz_txrx;
|
||||||
|
|
||||||
volatile bool worker_running;
|
volatile bool worker_running;
|
||||||
volatile bool worker_stoping;
|
volatile bool worker_stopping;
|
||||||
FuriMessageQueue* event_queue;
|
FuriMessageQueue* event_queue;
|
||||||
uint32_t last_time_rx_data;
|
uint32_t last_time_rx_data;
|
||||||
|
|
||||||
|
@ -117,15 +117,15 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
|
|||||||
|
|
||||||
// First stage: coarse scan
|
// First stage: coarse scan
|
||||||
for(size_t i = 0; i < subghz_setting_get_frequency_count(instance->setting); i++) {
|
for(size_t i = 0; i < subghz_setting_get_frequency_count(instance->setting); i++) {
|
||||||
uint32_t current_frequnecy = subghz_setting_get_frequency(instance->setting, i);
|
uint32_t current_frequency = subghz_setting_get_frequency(instance->setting, i);
|
||||||
if(furi_hal_subghz_is_frequency_valid(current_frequnecy) &&
|
if(furi_hal_subghz_is_frequency_valid(current_frequency) &&
|
||||||
(current_frequnecy != 467750000) &&
|
(current_frequency != 467750000) &&
|
||||||
!((furi_hal_subghz.radio_type == SubGhzRadioExternal) &&
|
!((furi_hal_subghz.radio_type == SubGhzRadioExternal) &&
|
||||||
(current_frequnecy >= 311900000 && current_frequnecy <= 312200000))) {
|
(current_frequency >= 311900000 && current_frequency <= 312200000))) {
|
||||||
furi_hal_spi_acquire(furi_hal_subghz.spi_bus_handle);
|
furi_hal_spi_acquire(furi_hal_subghz.spi_bus_handle);
|
||||||
cc1101_switch_to_idle(furi_hal_subghz.spi_bus_handle);
|
cc1101_switch_to_idle(furi_hal_subghz.spi_bus_handle);
|
||||||
frequency =
|
frequency =
|
||||||
cc1101_set_frequency(furi_hal_subghz.spi_bus_handle, current_frequnecy);
|
cc1101_set_frequency(furi_hal_subghz.spi_bus_handle, current_frequency);
|
||||||
|
|
||||||
cc1101_calibrate(furi_hal_subghz.spi_bus_handle);
|
cc1101_calibrate(furi_hal_subghz.spi_bus_handle);
|
||||||
do {
|
do {
|
||||||
|
@ -23,7 +23,7 @@ typedef enum {
|
|||||||
/** SubGhzHopperState state */
|
/** SubGhzHopperState state */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SubGhzHopperStateOFF,
|
SubGhzHopperStateOFF,
|
||||||
SubGhzHopperStateRunnig,
|
SubGhzHopperStateRunning,
|
||||||
SubGhzHopperStatePause,
|
SubGhzHopperStatePause,
|
||||||
SubGhzHopperStateRSSITimeOut,
|
SubGhzHopperStateRSSITimeOut,
|
||||||
} SubGhzHopperState;
|
} SubGhzHopperState;
|
||||||
|
@ -368,7 +368,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
|
|||||||
|
|
||||||
float rssi = furi_hal_subghz_get_rssi();
|
float rssi = furi_hal_subghz_get_rssi();
|
||||||
|
|
||||||
if(float_is_equal(subghz->txrx->raw_threshold_rssi, SUBGHZ_RAW_TRESHOLD_MIN)) {
|
if(float_is_equal(subghz->txrx->raw_threshold_rssi, SUBGHZ_RAW_THRESHOLD_MIN)) {
|
||||||
subghz_read_raw_add_data_rssi(subghz->subghz_read_raw, rssi, true);
|
subghz_read_raw_add_data_rssi(subghz->subghz_read_raw, rssi, true);
|
||||||
subghz_protocol_raw_save_to_file_pause(
|
subghz_protocol_raw_save_to_file_pause(
|
||||||
(SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result, false);
|
(SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result, false);
|
||||||
|
@ -8,11 +8,11 @@ enum SubGhzSettingIndex {
|
|||||||
SubGhzSettingIndexBinRAW,
|
SubGhzSettingIndexBinRAW,
|
||||||
SubGhzSettingIndexSound,
|
SubGhzSettingIndexSound,
|
||||||
SubGhzSettingIndexLock,
|
SubGhzSettingIndexLock,
|
||||||
SubGhzSettingIndexRAWThesholdRSSI,
|
SubGhzSettingIndexRAWThresholdRSSI,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define RAW_THRESHOLD_RSSI_COUNT 11
|
#define RAW_THRESHOLD_RSSI_COUNT 11
|
||||||
const char* const raw_theshold_rssi_text[RAW_THRESHOLD_RSSI_COUNT] = {
|
const char* const raw_threshold_rssi_text[RAW_THRESHOLD_RSSI_COUNT] = {
|
||||||
"-----",
|
"-----",
|
||||||
"-85.0",
|
"-85.0",
|
||||||
"-80.0",
|
"-80.0",
|
||||||
@ -26,7 +26,7 @@ const char* const raw_theshold_rssi_text[RAW_THRESHOLD_RSSI_COUNT] = {
|
|||||||
"-40.0",
|
"-40.0",
|
||||||
|
|
||||||
};
|
};
|
||||||
const float raw_theshold_rssi_value[RAW_THRESHOLD_RSSI_COUNT] = {
|
const float raw_threshold_rssi_value[RAW_THRESHOLD_RSSI_COUNT] = {
|
||||||
-90.0f,
|
-90.0f,
|
||||||
-85.0f,
|
-85.0f,
|
||||||
-80.0f,
|
-80.0f,
|
||||||
@ -47,7 +47,7 @@ const char* const hopping_text[HOPPING_COUNT] = {
|
|||||||
};
|
};
|
||||||
const uint32_t hopping_value[HOPPING_COUNT] = {
|
const uint32_t hopping_value[HOPPING_COUNT] = {
|
||||||
SubGhzHopperStateOFF,
|
SubGhzHopperStateOFF,
|
||||||
SubGhzHopperStateRunnig,
|
SubGhzHopperStateRunning,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SPEAKER_COUNT 2
|
#define SPEAKER_COUNT 2
|
||||||
@ -213,8 +213,8 @@ static void subghz_scene_receiver_config_set_raw_threshold_rssi(VariableItem* it
|
|||||||
SubGhz* subghz = variable_item_get_context(item);
|
SubGhz* subghz = variable_item_get_context(item);
|
||||||
uint8_t index = variable_item_get_current_value_index(item);
|
uint8_t index = variable_item_get_current_value_index(item);
|
||||||
|
|
||||||
variable_item_set_current_value_text(item, raw_theshold_rssi_text[index]);
|
variable_item_set_current_value_text(item, raw_threshold_rssi_text[index]);
|
||||||
subghz->txrx->raw_threshold_rssi = raw_theshold_rssi_value[index];
|
subghz->txrx->raw_threshold_rssi = raw_threshold_rssi_value[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) {
|
static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) {
|
||||||
@ -320,9 +320,9 @@ void subghz_scene_receiver_config_on_enter(void* context) {
|
|||||||
subghz_scene_receiver_config_set_raw_threshold_rssi,
|
subghz_scene_receiver_config_set_raw_threshold_rssi,
|
||||||
subghz);
|
subghz);
|
||||||
value_index = value_index_float(
|
value_index = value_index_float(
|
||||||
subghz->txrx->raw_threshold_rssi, raw_theshold_rssi_value, RAW_THRESHOLD_RSSI_COUNT);
|
subghz->txrx->raw_threshold_rssi, raw_threshold_rssi_value, RAW_THRESHOLD_RSSI_COUNT);
|
||||||
variable_item_set_current_value_index(item, value_index);
|
variable_item_set_current_value_index(item, value_index);
|
||||||
variable_item_set_current_value_text(item, raw_theshold_rssi_text[value_index]);
|
variable_item_set_current_value_text(item, raw_threshold_rssi_text[value_index]);
|
||||||
}
|
}
|
||||||
view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList);
|
view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList);
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ bool subghz_scene_receiver_info_on_event(void* context, SceneManagerEvent event)
|
|||||||
subghz_rx(subghz, subghz->txrx->preset->frequency);
|
subghz_rx(subghz, subghz->txrx->preset->frequency);
|
||||||
}
|
}
|
||||||
if(subghz->txrx->hopper_state == SubGhzHopperStatePause) {
|
if(subghz->txrx->hopper_state == SubGhzHopperStatePause) {
|
||||||
subghz->txrx->hopper_state = SubGhzHopperStateRunnig;
|
subghz->txrx->hopper_state = SubGhzHopperStateRunning;
|
||||||
}
|
}
|
||||||
subghz->state_notifications = SubGhzNotificationStateRx;
|
subghz->state_notifications = SubGhzNotificationStateRx;
|
||||||
} else {
|
} else {
|
||||||
@ -175,7 +175,7 @@ bool subghz_scene_receiver_info_on_event(void* context, SceneManagerEvent event)
|
|||||||
subghz_rx(subghz, subghz->txrx->preset->frequency);
|
subghz_rx(subghz, subghz->txrx->preset->frequency);
|
||||||
}
|
}
|
||||||
if(subghz->txrx->hopper_state == SubGhzHopperStatePause) {
|
if(subghz->txrx->hopper_state == SubGhzHopperStatePause) {
|
||||||
subghz->txrx->hopper_state = SubGhzHopperStateRunnig;
|
subghz->txrx->hopper_state = SubGhzHopperStateRunning;
|
||||||
}
|
}
|
||||||
subghz->state_notifications = SubGhzNotificationStateRx;
|
subghz->state_notifications = SubGhzNotificationStateRx;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ void subghz_scene_set_seed_bft_on_enter(void* context) {
|
|||||||
SubGhz* subghz = context;
|
SubGhz* subghz = context;
|
||||||
|
|
||||||
// Setup view
|
// Setup view
|
||||||
// roguemaster don't steal!!!
|
// RogueMaster don't steal!!!
|
||||||
ByteInput* byte_input = subghz->byte_input;
|
ByteInput* byte_input = subghz->byte_input;
|
||||||
byte_input_set_header_text(byte_input, "Enter SEED in hex");
|
byte_input_set_header_text(byte_input, "Enter SEED in hex");
|
||||||
byte_input_set_result_callback(
|
byte_input_set_result_callback(
|
||||||
|
@ -65,7 +65,7 @@ bool subghz_scene_set_seed_faac_on_event(void* context, SceneManagerEvent event)
|
|||||||
seed,
|
seed,
|
||||||
"FAAC_SLH",
|
"FAAC_SLH",
|
||||||
subghz->txrx->preset);
|
subghz->txrx->preset);
|
||||||
// rogueemaster dont steal!
|
// RogueMaster dont steal!
|
||||||
uint8_t seed_data[sizeof(uint32_t)] = {0};
|
uint8_t seed_data[sizeof(uint32_t)] = {0};
|
||||||
for(size_t i = 0; i < sizeof(uint32_t); i++) {
|
for(size_t i = 0; i < sizeof(uint32_t); i++) {
|
||||||
seed_data[sizeof(uint32_t) - i - 1] = (seed >> i * 8) & 0xFF;
|
seed_data[sizeof(uint32_t) - i - 1] = (seed >> i * 8) & 0xFF;
|
||||||
|
@ -275,7 +275,7 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) {
|
|||||||
subghz->txrx->history = subghz_history_alloc();
|
subghz->txrx->history = subghz_history_alloc();
|
||||||
}
|
}
|
||||||
|
|
||||||
subghz->txrx->raw_threshold_rssi = SUBGHZ_RAW_TRESHOLD_MIN;
|
subghz->txrx->raw_threshold_rssi = SUBGHZ_RAW_THRESHOLD_MIN;
|
||||||
subghz->txrx->worker = subghz_worker_alloc();
|
subghz->txrx->worker = subghz_worker_alloc();
|
||||||
|
|
||||||
subghz->txrx->fff_data = flipper_format_string_alloc();
|
subghz->txrx->fff_data = flipper_format_string_alloc();
|
||||||
|
@ -80,7 +80,7 @@ void subghz_history_get_text_item_menu(SubGhzHistory* instance, FuriString* outp
|
|||||||
*
|
*
|
||||||
* @param instance - SubGhzHistory instance
|
* @param instance - SubGhzHistory instance
|
||||||
* @param output - FuriString* output
|
* @param output - FuriString* output
|
||||||
* @return bool - is FUUL
|
* @return bool - is FULL
|
||||||
*/
|
*/
|
||||||
bool subghz_history_get_text_space_left(SubGhzHistory* instance, FuriString* output);
|
bool subghz_history_get_text_space_left(SubGhzHistory* instance, FuriString* output);
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ uint32_t subghz_history_rand_range(uint32_t min, uint32_t max);
|
|||||||
*
|
*
|
||||||
* @param file - Stream*
|
* @param file - Stream*
|
||||||
* @param is_negative_start - first value is negative or positive?
|
* @param is_negative_start - first value is negative or positive?
|
||||||
* @param current_position - 0 if started from begining
|
* @param current_position - 0 if started from beginning
|
||||||
* @param empty_line - add RAW_Data to this line
|
* @param empty_line - add RAW_Data to this line
|
||||||
* @return true
|
* @return true
|
||||||
* @return false
|
* @return false
|
||||||
|
@ -575,7 +575,7 @@ void subghz_hopper_update(SubGhz* subghz) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
subghz->txrx->hopper_state = SubGhzHopperStateRunnig;
|
subghz->txrx->hopper_state = SubGhzHopperStateRunning;
|
||||||
}
|
}
|
||||||
// Select next frequency
|
// Select next frequency
|
||||||
if(subghz->txrx->hopper_idx_frequency <
|
if(subghz->txrx->hopper_idx_frequency <
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#define MENU_ITEMS 4u
|
#define MENU_ITEMS 4u
|
||||||
#define UNLOCK_CNT 3
|
#define UNLOCK_CNT 3
|
||||||
|
|
||||||
#define SUBGHZ_RAW_TRESHOLD_MIN -90.0f
|
#define SUBGHZ_RAW_THRESHOLD_MIN -90.0f
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
FuriString* item_str;
|
FuriString* item_str;
|
||||||
@ -80,10 +80,10 @@ void subghz_receiver_rssi(SubGhzViewReceiver* instance, float rssi) {
|
|||||||
instance->view,
|
instance->view,
|
||||||
SubGhzViewReceiverModel * model,
|
SubGhzViewReceiverModel * model,
|
||||||
{
|
{
|
||||||
if(rssi < SUBGHZ_RAW_TRESHOLD_MIN) {
|
if(rssi < SUBGHZ_RAW_THRESHOLD_MIN) {
|
||||||
model->u_rssi = 0;
|
model->u_rssi = 0;
|
||||||
} else {
|
} else {
|
||||||
model->u_rssi = (uint8_t)(rssi - SUBGHZ_RAW_TRESHOLD_MIN);
|
model->u_rssi = (uint8_t)(rssi - SUBGHZ_RAW_THRESHOLD_MIN);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
true);
|
true);
|
||||||
|
@ -23,7 +23,7 @@ typedef struct {
|
|||||||
FuriString* sample_write;
|
FuriString* sample_write;
|
||||||
FuriString* file_name;
|
FuriString* file_name;
|
||||||
uint8_t* rssi_history;
|
uint8_t* rssi_history;
|
||||||
uint8_t rssi_curret;
|
uint8_t rssi_current;
|
||||||
bool rssi_history_end;
|
bool rssi_history_end;
|
||||||
uint8_t ind_write;
|
uint8_t ind_write;
|
||||||
uint8_t ind_sin;
|
uint8_t ind_sin;
|
||||||
@ -62,17 +62,17 @@ void subghz_read_raw_add_data_rssi(SubGhzReadRAW* instance, float rssi, bool tra
|
|||||||
furi_assert(instance);
|
furi_assert(instance);
|
||||||
uint8_t u_rssi = 0;
|
uint8_t u_rssi = 0;
|
||||||
|
|
||||||
if(rssi < SUBGHZ_RAW_TRESHOLD_MIN) {
|
if(rssi < SUBGHZ_RAW_THRESHOLD_MIN) {
|
||||||
u_rssi = 0;
|
u_rssi = 0;
|
||||||
} else {
|
} else {
|
||||||
u_rssi = (uint8_t)((rssi - SUBGHZ_RAW_TRESHOLD_MIN) / 2.7);
|
u_rssi = (uint8_t)((rssi - SUBGHZ_RAW_THRESHOLD_MIN) / 2.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
with_view_model(
|
with_view_model(
|
||||||
instance->view,
|
instance->view,
|
||||||
SubGhzReadRAWModel * model,
|
SubGhzReadRAWModel * model,
|
||||||
{
|
{
|
||||||
model->rssi_curret = u_rssi;
|
model->rssi_current = u_rssi;
|
||||||
if(trace) {
|
if(trace) {
|
||||||
model->rssi_history[model->ind_write++] = u_rssi;
|
model->rssi_history[model->ind_write++] = u_rssi;
|
||||||
} else {
|
} else {
|
||||||
@ -206,10 +206,10 @@ void subghz_read_raw_draw_rssi(Canvas* canvas, SubGhzReadRAWModel* model) {
|
|||||||
canvas_draw_line(canvas, i, 47, i, 47 - model->rssi_history[i]);
|
canvas_draw_line(canvas, i, 47, i, 47 - model->rssi_history[i]);
|
||||||
}
|
}
|
||||||
canvas_draw_line(
|
canvas_draw_line(
|
||||||
canvas, model->ind_write + 1, 47, model->ind_write + 1, 47 - model->rssi_curret);
|
canvas, model->ind_write + 1, 47, model->ind_write + 1, 47 - model->rssi_current);
|
||||||
if(model->ind_write > 3) {
|
if(model->ind_write > 3) {
|
||||||
canvas_draw_line(
|
canvas_draw_line(
|
||||||
canvas, model->ind_write - 1, 47, model->ind_write - 1, 47 - model->rssi_curret);
|
canvas, model->ind_write - 1, 47, model->ind_write - 1, 47 - model->rssi_current);
|
||||||
|
|
||||||
for(uint8_t i = 13; i < 47; i += width * 2) {
|
for(uint8_t i = 13; i < 47; i += width * 2) {
|
||||||
canvas_draw_line(canvas, model->ind_write, i, model->ind_write, i + width);
|
canvas_draw_line(canvas, model->ind_write, i, model->ind_write, i + width);
|
||||||
@ -231,13 +231,13 @@ void subghz_read_raw_draw_rssi(Canvas* canvas, SubGhzReadRAWModel* model) {
|
|||||||
SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - 1,
|
SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - 1,
|
||||||
47,
|
47,
|
||||||
SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - 1,
|
SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - 1,
|
||||||
47 - model->rssi_curret);
|
47 - model->rssi_current);
|
||||||
canvas_draw_line(
|
canvas_draw_line(
|
||||||
canvas,
|
canvas,
|
||||||
SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE + 1,
|
SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE + 1,
|
||||||
47,
|
47,
|
||||||
SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE + 1,
|
SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE + 1,
|
||||||
47 - model->rssi_curret);
|
47 - model->rssi_current);
|
||||||
|
|
||||||
for(uint8_t i = 13; i < 47; i += width * 2) {
|
for(uint8_t i = 13; i < 47; i += width * 2) {
|
||||||
canvas_draw_line(
|
canvas_draw_line(
|
||||||
@ -266,9 +266,9 @@ void subghz_read_raw_draw_threshold_rssi(Canvas* canvas, SubGhzReadRAWModel* mod
|
|||||||
uint8_t x = 118;
|
uint8_t x = 118;
|
||||||
uint8_t y = 48;
|
uint8_t y = 48;
|
||||||
|
|
||||||
if(model->raw_threshold_rssi > SUBGHZ_RAW_TRESHOLD_MIN) {
|
if(model->raw_threshold_rssi > SUBGHZ_RAW_THRESHOLD_MIN) {
|
||||||
uint8_t x = 118;
|
uint8_t x = 118;
|
||||||
y -= (uint8_t)((model->raw_threshold_rssi - SUBGHZ_RAW_TRESHOLD_MIN) / 2.7);
|
y -= (uint8_t)((model->raw_threshold_rssi - SUBGHZ_RAW_THRESHOLD_MIN) / 2.7);
|
||||||
|
|
||||||
uint8_t width = 3;
|
uint8_t width = 3;
|
||||||
for(uint8_t i = 0; i < x; i += width * 2) {
|
for(uint8_t i = 0; i < x; i += width * 2) {
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <gui/view.h>
|
#include <gui/view.h>
|
||||||
#include "../helpers/subghz_custom_event.h"
|
#include "../helpers/subghz_custom_event.h"
|
||||||
|
|
||||||
#define SUBGHZ_RAW_TRESHOLD_MIN -90.0f
|
#define SUBGHZ_RAW_THRESHOLD_MIN -90.0f
|
||||||
|
|
||||||
typedef struct SubGhzReadRAW SubGhzReadRAW;
|
typedef struct SubGhzReadRAW SubGhzReadRAW;
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ bool u2f_data_cert_key_load(uint8_t* cert_key) {
|
|||||||
uint8_t key_slot = 0;
|
uint8_t key_slot = 0;
|
||||||
uint32_t version = 0;
|
uint32_t version = 0;
|
||||||
|
|
||||||
// Check if unique key exists in secure eclave and generate it if missing
|
// Check if unique key exists in secure eclave(typo?) and generate it if missing
|
||||||
if(!furi_hal_crypto_verify_key(U2F_DATA_FILE_ENCRYPTION_KEY_SLOT_UNIQUE)) return false;
|
if(!furi_hal_crypto_verify_key(U2F_DATA_FILE_ENCRYPTION_KEY_SLOT_UNIQUE)) return false;
|
||||||
|
|
||||||
FuriString* filetype;
|
FuriString* filetype;
|
||||||
|
@ -640,7 +640,7 @@ static void render_callback(Canvas* canvas, void* ctx) {
|
|||||||
//canvas_draw_str(canvas, 0, 40, "D: ");
|
//canvas_draw_str(canvas, 0, 40, "D: ");
|
||||||
//canvas_draw_str(canvas, 0, 50, "Ok: ");
|
//canvas_draw_str(canvas, 0, 50, "Ok: ");
|
||||||
|
|
||||||
//PNGs are located in assets/icons/UniRFRemix before compiliation
|
//PNGs are located in assets/icons/UniRFRemix before compilation
|
||||||
|
|
||||||
//Icons for Labels
|
//Icons for Labels
|
||||||
//canvas_draw_icon(canvas, 0, 0, &I_UniRFRemix_LeftAlignedButtons_9x64);
|
//canvas_draw_icon(canvas, 0, 0, &I_UniRFRemix_LeftAlignedButtons_9x64);
|
||||||
|
@ -327,8 +327,9 @@ static void
|
|||||||
uint16_t oldNumLines = tetris_state->numLines;
|
uint16_t oldNumLines = tetris_state->numLines;
|
||||||
tetris_state->numLines += numLines;
|
tetris_state->numLines += numLines;
|
||||||
if((oldNumLines / 10) % 10 != (tetris_state->numLines / 10) % 10) {
|
if((oldNumLines / 10) % 10 != (tetris_state->numLines / 10) % 10) {
|
||||||
nextFallSpeed = tetris_state->fallSpeed - (100 / (tetris_state->numLines / 10));
|
nextFallSpeed =
|
||||||
if (nextFallSpeed >= MIN_FALL_SPEED){
|
tetris_state->fallSpeed - (100 / (tetris_state->numLines / 10));
|
||||||
|
if(nextFallSpeed >= MIN_FALL_SPEED) {
|
||||||
tetris_state->fallSpeed = nextFallSpeed;
|
tetris_state->fallSpeed = nextFallSpeed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,7 +137,7 @@ void cli_command_date(Cli* cli, FuriString* args, void* context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cli_command_src(Cli* cli, FuriString* args, void* context) {
|
void cli_command_src(Cli* cli, FuriString* args, void* context) {
|
||||||
// Quality of life feaature for people exploring CLI on lab.flipper.net/cli
|
// Quality of life feature for people exploring CLI on lab.flipper.net/cli
|
||||||
// By Yousef AK
|
// By Yousef AK
|
||||||
UNUSED(cli);
|
UNUSED(cli);
|
||||||
UNUSED(args);
|
UNUSED(args);
|
||||||
|
@ -14,7 +14,7 @@ void crypto_cli_print_usage() {
|
|||||||
"\tdecrypt <key_slot:int> <iv:hex>\t - Using key from secure enclave and IV decrypt hex encoded encrypted with AES256CBC data to plain text\r\n");
|
"\tdecrypt <key_slot:int> <iv:hex>\t - Using key from secure enclave and IV decrypt hex encoded encrypted with AES256CBC data to plain text\r\n");
|
||||||
printf("\thas_key <key_slot:int>\t - Check if secure enclave has key in slot\r\n");
|
printf("\thas_key <key_slot:int>\t - Check if secure enclave has key in slot\r\n");
|
||||||
printf(
|
printf(
|
||||||
"\tstore_key <key_slot:int> <key_type:str> <key_size:int> <key_data:hex>\t - Store key in secure enclave. !!! NON-REVERSABLE OPERATION - READ MANUAL FIRST !!!\r\n");
|
"\tstore_key <key_slot:int> <key_type:str> <key_size:int> <key_data:hex>\t - Store key in secure enclave. !!! NON-REVERSIBLE OPERATION - READ MANUAL FIRST !!!\r\n");
|
||||||
};
|
};
|
||||||
|
|
||||||
void crypto_cli_encrypt(Cli* cli, FuriString* args) {
|
void crypto_cli_encrypt(Cli* cli, FuriString* args) {
|
||||||
|
@ -152,7 +152,7 @@ bool animation_manager_is_animation_loaded(AnimationManager* animation_manager);
|
|||||||
void animation_manager_unload_and_stall_animation(AnimationManager* animation_manager);
|
void animation_manager_unload_and_stall_animation(AnimationManager* animation_manager);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load and Contunue execution of animation manager.
|
* Load and Continue execution of animation manager.
|
||||||
*
|
*
|
||||||
* @animation_manager instance
|
* @animation_manager instance
|
||||||
*/
|
*/
|
||||||
|
@ -363,7 +363,7 @@ void canvas_draw_rframe(
|
|||||||
uint8_t height,
|
uint8_t height,
|
||||||
uint8_t radius);
|
uint8_t radius);
|
||||||
|
|
||||||
/** Draw rounded-corner box of width, height at x,y, with round value raduis
|
/** Draw rounded-corner box of width, height at x,y, with round value radius
|
||||||
*
|
*
|
||||||
* @param canvas Canvas instance
|
* @param canvas Canvas instance
|
||||||
* @param x x coordinate
|
* @param x x coordinate
|
||||||
|
@ -635,8 +635,8 @@ void elements_text_box(
|
|||||||
ElementTextBoxLine line[ELEMENTS_MAX_LINES_NUM];
|
ElementTextBoxLine line[ELEMENTS_MAX_LINES_NUM];
|
||||||
bool bold = false;
|
bool bold = false;
|
||||||
bool mono = false;
|
bool mono = false;
|
||||||
bool inversed = false;
|
bool inverse = false;
|
||||||
bool inversed_present = false;
|
bool inverse_present = false;
|
||||||
Font current_font = FontSecondary;
|
Font current_font = FontSecondary;
|
||||||
Font prev_font = FontSecondary;
|
Font prev_font = FontSecondary;
|
||||||
const CanvasFontParameters* font_params = canvas_get_font_params(canvas, current_font);
|
const CanvasFontParameters* font_params = canvas_get_font_params(canvas, current_font);
|
||||||
@ -692,8 +692,8 @@ void elements_text_box(
|
|||||||
canvas_set_font(canvas, FontKeyboard);
|
canvas_set_font(canvas, FontKeyboard);
|
||||||
mono = !mono;
|
mono = !mono;
|
||||||
}
|
}
|
||||||
if(text[i] == ELEMENTS_INVERSED_MARKER) {
|
if(text[i] == ELEMENTS_INVERSE_MARKER) {
|
||||||
inversed_present = true;
|
inverse_present = true;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -709,10 +709,10 @@ void elements_text_box(
|
|||||||
if(text[i] == '\0') {
|
if(text[i] == '\0') {
|
||||||
full_text_processed = true;
|
full_text_processed = true;
|
||||||
}
|
}
|
||||||
if(inversed_present) {
|
if(inverse_present) {
|
||||||
line_leading_min += 1;
|
line_leading_min += 1;
|
||||||
line_leading_default += 1;
|
line_leading_default += 1;
|
||||||
inversed_present = false;
|
inverse_present = false;
|
||||||
}
|
}
|
||||||
line[line_num].leading_min = line_leading_min;
|
line[line_num].leading_min = line_leading_min;
|
||||||
line[line_num].leading_default = line_leading_default;
|
line[line_num].leading_default = line_leading_default;
|
||||||
@ -775,7 +775,7 @@ void elements_text_box(
|
|||||||
canvas_set_font(canvas, FontSecondary);
|
canvas_set_font(canvas, FontSecondary);
|
||||||
bold = false;
|
bold = false;
|
||||||
mono = false;
|
mono = false;
|
||||||
inversed = false;
|
inverse = false;
|
||||||
for(uint8_t i = 0; i < line_num; i++) {
|
for(uint8_t i = 0; i < line_num; i++) {
|
||||||
for(uint8_t j = 0; j < line[i].len; j++) {
|
for(uint8_t j = 0; j < line[i].len; j++) {
|
||||||
// Process format symbols
|
// Process format symbols
|
||||||
@ -799,11 +799,11 @@ void elements_text_box(
|
|||||||
mono = !mono;
|
mono = !mono;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(line[i].text[j] == ELEMENTS_INVERSED_MARKER) {
|
if(line[i].text[j] == ELEMENTS_INVERSE_MARKER) {
|
||||||
inversed = !inversed;
|
inverse = !inverse;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(inversed) {
|
if(inverse) {
|
||||||
canvas_draw_box(
|
canvas_draw_box(
|
||||||
canvas,
|
canvas,
|
||||||
line[i].x - 1,
|
line[i].x - 1,
|
||||||
|
@ -19,7 +19,7 @@ extern "C" {
|
|||||||
#define ELEMENTS_MAX_LINES_NUM (7)
|
#define ELEMENTS_MAX_LINES_NUM (7)
|
||||||
#define ELEMENTS_BOLD_MARKER '#'
|
#define ELEMENTS_BOLD_MARKER '#'
|
||||||
#define ELEMENTS_MONO_MARKER '*'
|
#define ELEMENTS_MONO_MARKER '*'
|
||||||
#define ELEMENTS_INVERSED_MARKER '!'
|
#define ELEMENTS_INVERSE_MARKER '!'
|
||||||
|
|
||||||
/** Draw progress bar.
|
/** Draw progress bar.
|
||||||
*
|
*
|
||||||
@ -240,7 +240,7 @@ void elements_scrollable_text_line(
|
|||||||
* @param[in] text Formatted text. The following formats are available:
|
* @param[in] text Formatted text. The following formats are available:
|
||||||
* "\e#Bold text\e#" - bold font is used
|
* "\e#Bold text\e#" - bold font is used
|
||||||
* "\e*Monospaced text\e*" - monospaced font is used
|
* "\e*Monospaced text\e*" - monospaced font is used
|
||||||
* "\e!Inversed text\e!" - white text on black background
|
* "\e!Inverted text\e!" - white text on black background
|
||||||
* @param strip_to_dots Strip text to ... if does not fit to width
|
* @param strip_to_dots Strip text to ... if does not fit to width
|
||||||
*/
|
*/
|
||||||
void elements_text_box(
|
void elements_text_box(
|
||||||
|
@ -61,7 +61,7 @@ void button_panel_reserve(ButtonPanel* button_panel, size_t reserve_x, size_t re
|
|||||||
* @param matrix_place_x coordinates by x-axis on virtual grid, it
|
* @param matrix_place_x coordinates by x-axis on virtual grid, it
|
||||||
* is only used for navigation
|
* is only used for navigation
|
||||||
* @param matrix_place_y coordinates by y-axis on virtual grid, it
|
* @param matrix_place_y coordinates by y-axis on virtual grid, it
|
||||||
* is only used for naviagation
|
* is only used for navigation
|
||||||
* @param x x-coordinate to draw icon on
|
* @param x x-coordinate to draw icon on
|
||||||
* @param y y-coordinate to draw icon on
|
* @param y y-coordinate to draw icon on
|
||||||
* @param icon_name name of the icon to draw
|
* @param icon_name name of the icon to draw
|
||||||
|
@ -309,9 +309,9 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b
|
|||||||
char selected = get_selected_char(model);
|
char selected = get_selected_char(model);
|
||||||
size_t text_length = strlen(model->text_buffer);
|
size_t text_length = strlen(model->text_buffer);
|
||||||
|
|
||||||
bool toogle_case = text_length == 0;
|
bool toggle_case = text_length == 0;
|
||||||
if(shift) toogle_case = !toogle_case;
|
if(shift) toggle_case = !toggle_case;
|
||||||
if(toogle_case) {
|
if(toggle_case) {
|
||||||
selected = char_to_uppercase(selected);
|
selected = char_to_uppercase(selected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ void widget_add_string_element(
|
|||||||
* @param[in] text Formatted text. The following formats are available:
|
* @param[in] text Formatted text. The following formats are available:
|
||||||
* "\e#Bold text\e#" - bold font is used
|
* "\e#Bold text\e#" - bold font is used
|
||||||
* "\e*Monospaced text\e*" - monospaced font is used
|
* "\e*Monospaced text\e*" - monospaced font is used
|
||||||
* "\e!Inversed text\e!" - white text on black background
|
* "\e!Inverted text\e!" - white text on black background
|
||||||
* @param strip_to_dots Strip text to ... if does not fit to width
|
* @param strip_to_dots Strip text to ... if does not fit to width
|
||||||
*/
|
*/
|
||||||
void widget_add_text_box_element(
|
void widget_add_text_box_element(
|
||||||
|
@ -10,7 +10,7 @@ SceneManager* scene_manager_alloc(const SceneManagerHandlers* app_scene_handlers
|
|||||||
scene_manager->scene_handlers = app_scene_handlers;
|
scene_manager->scene_handlers = app_scene_handlers;
|
||||||
// Allocate all scenes
|
// Allocate all scenes
|
||||||
scene_manager->scene = malloc(sizeof(AppScene) * app_scene_handlers->scene_num);
|
scene_manager->scene = malloc(sizeof(AppScene) * app_scene_handlers->scene_num);
|
||||||
// Initialize ScaneManager array for navigation
|
// Initialize SceneManager array for navigation
|
||||||
SceneManagerIdStack_init(scene_manager->scene_id_stack);
|
SceneManagerIdStack_init(scene_manager->scene_id_stack);
|
||||||
|
|
||||||
return scene_manager;
|
return scene_manager;
|
||||||
@ -19,7 +19,7 @@ SceneManager* scene_manager_alloc(const SceneManagerHandlers* app_scene_handlers
|
|||||||
void scene_manager_free(SceneManager* scene_manager) {
|
void scene_manager_free(SceneManager* scene_manager) {
|
||||||
furi_assert(scene_manager);
|
furi_assert(scene_manager);
|
||||||
|
|
||||||
// Clear ScaneManager array
|
// Clear SceneManager array
|
||||||
SceneManagerIdStack_clear(scene_manager->scene_id_stack);
|
SceneManagerIdStack_clear(scene_manager->scene_id_stack);
|
||||||
// Clear allocated scenes
|
// Clear allocated scenes
|
||||||
free(scene_manager->scene);
|
free(scene_manager->scene);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* GUI: ViewStack API
|
* GUI: ViewStack API
|
||||||
*
|
*
|
||||||
* ViewStack accumulates several Views in one stack.
|
* ViewStack accumulates several Views in one stack.
|
||||||
* Draw callbacks are called sequenctially starting from
|
* Draw callbacks are called sequentially starting from
|
||||||
* first added. Input callbacks are called in reverse order.
|
* first added. Input callbacks are called in reverse order.
|
||||||
* Consumed input is not passed on underlying layers.
|
* Consumed input is not passed on underlying layers.
|
||||||
*/
|
*/
|
||||||
|
@ -66,7 +66,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) {
|
|||||||
4.2)) { // not looking nice with low voltage indicator
|
4.2)) { // not looking nice with low voltage indicator
|
||||||
canvas_set_font(canvas, FontBatteryPercent);
|
canvas_set_font(canvas, FontBatteryPercent);
|
||||||
|
|
||||||
// align charge dispaly value with digits to draw
|
// align charge display value with digits to draw
|
||||||
uint8_t bar_charge = power->info.charge;
|
uint8_t bar_charge = power->info.charge;
|
||||||
if(bar_charge > 23 && bar_charge < 38) {
|
if(bar_charge > 23 && bar_charge < 38) {
|
||||||
bar_charge = 23;
|
bar_charge = 23;
|
||||||
@ -158,7 +158,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) {
|
|||||||
canvas_set_color(canvas, ColorWhite);
|
canvas_set_color(canvas, ColorWhite);
|
||||||
canvas_draw_box(canvas, 1, 1, 22, 6);
|
canvas_draw_box(canvas, 1, 1, 22, 6);
|
||||||
|
|
||||||
// align charge dispaly value with digits to draw
|
// align charge display value with digits to draw
|
||||||
uint8_t bar_charge = power->info.charge;
|
uint8_t bar_charge = power->info.charge;
|
||||||
|
|
||||||
if(bar_charge > 48 && bar_charge < 63) {
|
if(bar_charge > 48 && bar_charge < 63) {
|
||||||
|
@ -145,8 +145,8 @@ void rpc_session_set_terminated_callback(
|
|||||||
|
|
||||||
/* Doesn't forbid using rpc_feed_bytes() after session close - it's safe.
|
/* Doesn't forbid using rpc_feed_bytes() after session close - it's safe.
|
||||||
* Because any bytes received in buffer will be flushed before next session.
|
* Because any bytes received in buffer will be flushed before next session.
|
||||||
* If bytes get into stream buffer before it's get epmtified and this
|
* If bytes get into stream buffer before it's get emptied and this
|
||||||
* command is gets processed - it's safe either. But case of it is quite
|
* command is gets processed - it's safe either way. But case of it is quite
|
||||||
* odd: client sends close request and sends command after.
|
* odd: client sends close request and sends command after.
|
||||||
*/
|
*/
|
||||||
size_t
|
size_t
|
||||||
|
@ -305,14 +305,14 @@ typedef void (*Storage_name_converter)(FuriString*);
|
|||||||
|
|
||||||
/** Backs up internal storage to a tar archive
|
/** Backs up internal storage to a tar archive
|
||||||
* @param api pointer to the api
|
* @param api pointer to the api
|
||||||
* @param dstmane destination archive path
|
* @param dstname destination archive path
|
||||||
* @return FS_Error operation result
|
* @return FS_Error operation result
|
||||||
*/
|
*/
|
||||||
FS_Error storage_int_backup(Storage* api, const char* dstname);
|
FS_Error storage_int_backup(Storage* api, const char* dstname);
|
||||||
|
|
||||||
/** Restores internal storage from a tar archive
|
/** Restores internal storage from a tar archive
|
||||||
* @param api pointer to the api
|
* @param api pointer to the api
|
||||||
* @param dstmane archive path
|
* @param dstname archive path
|
||||||
* @param converter pointer to filename conversion function, may be NULL
|
* @param converter pointer to filename conversion function, may be NULL
|
||||||
* @return FS_Error operation result
|
* @return FS_Error operation result
|
||||||
*/
|
*/
|
||||||
|
@ -39,11 +39,11 @@ PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene) {
|
|||||||
view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
|
view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
|
||||||
|
|
||||||
// Views
|
// Views
|
||||||
app->batery_info = battery_info_alloc();
|
app->battery_info = battery_info_alloc();
|
||||||
view_dispatcher_add_view(
|
view_dispatcher_add_view(
|
||||||
app->view_dispatcher,
|
app->view_dispatcher,
|
||||||
PowerSettingsAppViewBatteryInfo,
|
PowerSettingsAppViewBatteryInfo,
|
||||||
battery_info_get_view(app->batery_info));
|
battery_info_get_view(app->battery_info));
|
||||||
app->submenu = submenu_alloc();
|
app->submenu = submenu_alloc();
|
||||||
view_dispatcher_add_view(
|
view_dispatcher_add_view(
|
||||||
app->view_dispatcher, PowerSettingsAppViewSubmenu, submenu_get_view(app->submenu));
|
app->view_dispatcher, PowerSettingsAppViewSubmenu, submenu_get_view(app->submenu));
|
||||||
@ -60,7 +60,7 @@ void power_settings_app_free(PowerSettingsApp* app) {
|
|||||||
furi_assert(app);
|
furi_assert(app);
|
||||||
// Views
|
// Views
|
||||||
view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewBatteryInfo);
|
view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewBatteryInfo);
|
||||||
battery_info_free(app->batery_info);
|
battery_info_free(app->battery_info);
|
||||||
view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewSubmenu);
|
view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewSubmenu);
|
||||||
submenu_free(app->submenu);
|
submenu_free(app->submenu);
|
||||||
view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewDialog);
|
view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewDialog);
|
||||||
|
@ -19,7 +19,7 @@ typedef struct {
|
|||||||
Gui* gui;
|
Gui* gui;
|
||||||
SceneManager* scene_manager;
|
SceneManager* scene_manager;
|
||||||
ViewDispatcher* view_dispatcher;
|
ViewDispatcher* view_dispatcher;
|
||||||
BatteryInfo* batery_info;
|
BatteryInfo* battery_info;
|
||||||
Submenu* submenu;
|
Submenu* submenu;
|
||||||
DialogEx* dialog;
|
DialogEx* dialog;
|
||||||
PowerInfo info;
|
PowerInfo info;
|
||||||
|
@ -11,7 +11,7 @@ static void power_settings_scene_battery_info_update_model(PowerSettingsApp* app
|
|||||||
.charge = app->info.charge,
|
.charge = app->info.charge,
|
||||||
.health = app->info.health,
|
.health = app->info.health,
|
||||||
};
|
};
|
||||||
battery_info_set_data(app->batery_info, &battery_info_data);
|
battery_info_set_data(app->battery_info, &battery_info_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void power_settings_scene_battery_info_on_enter(void* context) {
|
void power_settings_scene_battery_info_on_enter(void* context) {
|
||||||
|
@ -71,21 +71,21 @@ static void heap_trace_mode_changed(VariableItem* item) {
|
|||||||
furi_hal_rtc_set_heap_track_mode(heap_trace_mode_value[index]);
|
furi_hal_rtc_set_heap_track_mode(heap_trace_mode_value[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* const mesurement_units_text[] = {
|
const char* const measurement_units_text[] = {
|
||||||
"Metric",
|
"Metric",
|
||||||
"Imperial",
|
"Imperial",
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint32_t mesurement_units_value[] = {
|
const uint32_t measurement_units_value[] = {
|
||||||
LocaleMeasurementUnitsMetric,
|
LocaleMeasurementUnitsMetric,
|
||||||
LocaleMeasurementUnitsImperial,
|
LocaleMeasurementUnitsImperial,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void mesurement_units_changed(VariableItem* item) {
|
static void measurement_units_changed(VariableItem* item) {
|
||||||
// SystemSettings* app = variable_item_get_context(item);
|
// SystemSettings* app = variable_item_get_context(item);
|
||||||
uint8_t index = variable_item_get_current_value_index(item);
|
uint8_t index = variable_item_get_current_value_index(item);
|
||||||
variable_item_set_current_value_text(item, mesurement_units_text[index]);
|
variable_item_set_current_value_text(item, measurement_units_text[index]);
|
||||||
locale_set_measurement_unit(mesurement_units_value[index]);
|
locale_set_measurement_unit(measurement_units_value[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* const time_format_text[] = {
|
const char* const time_format_text[] = {
|
||||||
@ -148,13 +148,13 @@ SystemSettings* system_settings_alloc() {
|
|||||||
item = variable_item_list_add(
|
item = variable_item_list_add(
|
||||||
app->var_item_list,
|
app->var_item_list,
|
||||||
"Units",
|
"Units",
|
||||||
COUNT_OF(mesurement_units_text),
|
COUNT_OF(measurement_units_text),
|
||||||
mesurement_units_changed,
|
measurement_units_changed,
|
||||||
app);
|
app);
|
||||||
value_index = value_index_uint32(
|
value_index = value_index_uint32(
|
||||||
locale_get_measurement_unit(), mesurement_units_value, COUNT_OF(mesurement_units_value));
|
locale_get_measurement_unit(), measurement_units_value, COUNT_OF(measurement_units_value));
|
||||||
variable_item_set_current_value_index(item, value_index);
|
variable_item_set_current_value_index(item, value_index);
|
||||||
variable_item_set_current_value_text(item, mesurement_units_text[value_index]);
|
variable_item_set_current_value_text(item, measurement_units_text[value_index]);
|
||||||
|
|
||||||
item = variable_item_list_add(
|
item = variable_item_list_add(
|
||||||
app->var_item_list, "Time Format", COUNT_OF(time_format_text), time_format_changed, app);
|
app->var_item_list, "Time Format", COUNT_OF(time_format_text), time_format_changed, app);
|
||||||
|
@ -22,7 +22,7 @@ If you notice you get a parsed code when capturing it's best to click "Retry" a
|
|||||||
|
|
||||||
**Parsed data**
|
**Parsed data**
|
||||||
|
|
||||||
This is the cleanest type of data because it means it is a recognised code.
|
This is the cleanest type of data because it means it is a recognized code.
|
||||||
|
|
||||||
```
|
```
|
||||||
name: EXAMPLE
|
name: EXAMPLE
|
||||||
|
@ -14,7 +14,7 @@ I wrote it with the idea of _expanding the unit list_ on mind, so adding new one
|
|||||||
## Current conversions
|
## Current conversions
|
||||||
|
|
||||||
- `Decimal / Hexadecimal / Binary`
|
- `Decimal / Hexadecimal / Binary`
|
||||||
- `Celsius / Fahernheit / Kelvin`
|
- `Celsius / Fahrenheit / Kelvin`
|
||||||
- `Kilometers / Meters / Centimeters / Miles / Feet / Inches`
|
- `Kilometers / Meters / Centimeters / Miles / Feet / Inches`
|
||||||
- `Degree / Radian`
|
- `Degree / Radian`
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ if you need your custom one, make sure it doesn't listed here
|
|||||||
|
|
||||||
### User frequencies added AFTER that default list! You need to continue until you reach the end of that list
|
### User frequencies added AFTER that default list! You need to continue until you reach the end of that list
|
||||||
|
|
||||||
### If you want to disable default list and use ONLY user added frequecies from user settings file
|
### If you want to disable default list and use ONLY user added frequencies from user settings file
|
||||||
Change that line
|
Change that line
|
||||||
`#Add_standard_frequencies: true`
|
`#Add_standard_frequencies: true`
|
||||||
to
|
to
|
||||||
@ -81,7 +81,7 @@ Just add new line
|
|||||||
`Frequency: 928000000` - where `928000000` is your frequency, keep it in that format! it should be 9 digits!
|
`Frequency: 928000000` - where `928000000` is your frequency, keep it in that format! it should be 9 digits!
|
||||||
|
|
||||||
### Hopper frequency list
|
### Hopper frequency list
|
||||||
To add new frequecy to hopper:
|
To add new frequency to hopper:
|
||||||
add new line `Hopper_frequency: 345000000`<br>
|
add new line `Hopper_frequency: 345000000`<br>
|
||||||
But remember! You should keep it as small as possible, or hopper functionality would be useless!<br>
|
But remember! You should keep it as small as possible, or hopper functionality would be useless!<br>
|
||||||
If `#Add_standard_frequencies: true` is not changed<br>
|
If `#Add_standard_frequencies: true` is not changed<br>
|
||||||
|
@ -72,7 +72,7 @@ To run cleanup (think of `make clean`) for specified targets, add the `-c` optio
|
|||||||
- `get_stlink` - output serial numbers for attached STLink probes. Used for specifying an adapter with `OPENOCD_ADAPTER_SERIAL=...`.
|
- `get_stlink` - output serial numbers for attached STLink probes. Used for specifying an adapter with `OPENOCD_ADAPTER_SERIAL=...`.
|
||||||
- `lint`, `format` - run clang-format on the C source code to check and reformat it according to the `.clang-format` specs.
|
- `lint`, `format` - run clang-format on the C source code to check and reformat it according to the `.clang-format` specs.
|
||||||
- `lint_py`, `format_py` - run [black](https://black.readthedocs.io/en/stable/index.html) on the Python source code, build system files & application manifests.
|
- `lint_py`, `format_py` - run [black](https://black.readthedocs.io/en/stable/index.html) on the Python source code, build system files & application manifests.
|
||||||
- `firmware_pvs` - generate a PVS Studio report for the firmware. Requires PVS Studio to be availabe on your system's `PATH`.
|
- `firmware_pvs` - generate a PVS Studio report for the firmware. Requires PVS Studio to be available on your system's `PATH`.
|
||||||
- `cli` - start a Flipper CLI session over USB.
|
- `cli` - start a Flipper CLI session over USB.
|
||||||
|
|
||||||
### Firmware targets
|
### Firmware targets
|
||||||
|
@ -141,7 +141,7 @@ Long payload not fitting into internal memory buffer and consisting of short dur
|
|||||||
Frequency: 433920000
|
Frequency: 433920000
|
||||||
Preset: FuriHalSubGhzPresetCustom
|
Preset: FuriHalSubGhzPresetCustom
|
||||||
Custom_preset_module: CC1101
|
Custom_preset_module: CC1101
|
||||||
Сustom_preset_data: 02 0D 03 07 08 32 0B 06 14 00 13 00 12 30 11 32 10 17 18 18 19 18 1D 91 1C 00 1B 07 20 FB 22 11 21 B6 00 00 00 C0 00 00 00 00 00 00
|
Custom_preset_data: 02 0D 03 07 08 32 0B 06 14 00 13 00 12 30 11 32 10 17 18 18 19 18 1D 91 1C 00 1B 07 20 FB 22 11 21 B6 00 00 00 C0 00 00 00 00 00 00
|
||||||
Protocol: RAW
|
Protocol: RAW
|
||||||
RAW_Data: 29262 361 -68 2635 -66 24113 -66 11 ...
|
RAW_Data: 29262 361 -68 2635 -66 24113 -66 11 ...
|
||||||
RAW_Data: -424 205 -412 159 -412 381 -240 181 ...
|
RAW_Data: -424 205 -412 159 -412 381 -240 181 ...
|
||||||
|
@ -32,7 +32,7 @@ COPRO_STACK_TYPE = "ble_light"
|
|||||||
# Leave 0 to let scripts automatically calculate it
|
# Leave 0 to let scripts automatically calculate it
|
||||||
COPRO_STACK_ADDR = "0x0"
|
COPRO_STACK_ADDR = "0x0"
|
||||||
|
|
||||||
# If you override COPRO_CUBE_DIR on commandline, override this as well
|
# If you override COPRO_CUBE_DIR on command-line, override this as well
|
||||||
COPRO_STACK_BIN_DIR = posixpath.join(
|
COPRO_STACK_BIN_DIR = posixpath.join(
|
||||||
COPRO_CUBE_DIR,
|
COPRO_CUBE_DIR,
|
||||||
"Projects",
|
"Projects",
|
||||||
|
@ -31,7 +31,7 @@ typedef enum {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Init UART
|
* Init UART
|
||||||
* Configures GPIO to UART function, сonfigures UART hardware, enables UART hardware
|
* Configures GPIO to UART function, configures UART hardware, enables UART hardware
|
||||||
* @param channel UART channel
|
* @param channel UART channel
|
||||||
* @param baud baudrate
|
* @param baud baudrate
|
||||||
*/
|
*/
|
||||||
|
@ -16,7 +16,7 @@ struct SubGhzFileEncoderWorker {
|
|||||||
FlipperFormat* flipper_format;
|
FlipperFormat* flipper_format;
|
||||||
|
|
||||||
volatile bool worker_running;
|
volatile bool worker_running;
|
||||||
volatile bool worker_stoping;
|
volatile bool worker_stopping;
|
||||||
bool level;
|
bool level;
|
||||||
bool is_storage_slow;
|
bool is_storage_slow;
|
||||||
FuriString* str_data;
|
FuriString* str_data;
|
||||||
@ -105,7 +105,7 @@ LevelDuration subghz_file_encoder_worker_get_level_duration(void* context) {
|
|||||||
} else if(duration == 0) { //-V547
|
} else if(duration == 0) { //-V547
|
||||||
level_duration = level_duration_reset();
|
level_duration = level_duration_reset();
|
||||||
FURI_LOG_I(TAG, "Stop transmission");
|
FURI_LOG_I(TAG, "Stop transmission");
|
||||||
instance->worker_stoping = true;
|
instance->worker_stopping = true;
|
||||||
}
|
}
|
||||||
return level_duration;
|
return level_duration;
|
||||||
} else {
|
} else {
|
||||||
@ -142,7 +142,7 @@ static int32_t subghz_file_encoder_worker_thread(void* context) {
|
|||||||
//skip the end of the previous line "\n"
|
//skip the end of the previous line "\n"
|
||||||
stream_seek(stream, 1, StreamOffsetFromCurrent);
|
stream_seek(stream, 1, StreamOffsetFromCurrent);
|
||||||
res = true;
|
res = true;
|
||||||
instance->worker_stoping = false;
|
instance->worker_stopping = false;
|
||||||
FURI_LOG_I(TAG, "Start transmission");
|
FURI_LOG_I(TAG, "Start transmission");
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
@ -174,7 +174,7 @@ static int32_t subghz_file_encoder_worker_thread(void* context) {
|
|||||||
}
|
}
|
||||||
FURI_LOG_I(TAG, "End transmission");
|
FURI_LOG_I(TAG, "End transmission");
|
||||||
while(instance->worker_running) {
|
while(instance->worker_running) {
|
||||||
if(instance->worker_stoping) {
|
if(instance->worker_stopping) {
|
||||||
if(instance->callback_end) instance->callback_end(instance->context_end);
|
if(instance->callback_end) instance->callback_end(instance->context_end);
|
||||||
}
|
}
|
||||||
furi_delay_ms(50);
|
furi_delay_ms(50);
|
||||||
@ -198,7 +198,7 @@ SubGhzFileEncoderWorker* subghz_file_encoder_worker_alloc() {
|
|||||||
instance->str_data = furi_string_alloc();
|
instance->str_data = furi_string_alloc();
|
||||||
instance->file_path = furi_string_alloc();
|
instance->file_path = furi_string_alloc();
|
||||||
instance->level = false;
|
instance->level = false;
|
||||||
instance->worker_stoping = true;
|
instance->worker_stopping = true;
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ struct SubGhzTxRxWorker {
|
|||||||
FuriStreamBuffer* stream_rx;
|
FuriStreamBuffer* stream_rx;
|
||||||
|
|
||||||
volatile bool worker_running;
|
volatile bool worker_running;
|
||||||
volatile bool worker_stoping;
|
volatile bool worker_stopping;
|
||||||
|
|
||||||
SubGhzTxRxWorkerStatus status;
|
SubGhzTxRxWorkerStatus status;
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ static int32_t subghz_tx_rx_worker_thread(void* context) {
|
|||||||
subghz_tx_rx_worker_tx(instance, data, size_tx);
|
subghz_tx_rx_worker_tx(instance, data, size_tx);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//recive
|
//receive
|
||||||
if(subghz_tx_rx_worker_rx(instance, data, size_rx)) {
|
if(subghz_tx_rx_worker_rx(instance, data, size_rx)) {
|
||||||
if(furi_stream_buffer_spaces_available(instance->stream_rx) >= size_rx[0]) {
|
if(furi_stream_buffer_spaces_available(instance->stream_rx) >= size_rx[0]) {
|
||||||
if(instance->callback_have_read &&
|
if(instance->callback_have_read &&
|
||||||
@ -211,7 +211,7 @@ SubGhzTxRxWorker* subghz_tx_rx_worker_alloc() {
|
|||||||
furi_stream_buffer_alloc(sizeof(uint8_t) * SUBGHZ_TXRX_WORKER_BUF_SIZE, sizeof(uint8_t));
|
furi_stream_buffer_alloc(sizeof(uint8_t) * SUBGHZ_TXRX_WORKER_BUF_SIZE, sizeof(uint8_t));
|
||||||
|
|
||||||
instance->status = SubGhzTxRxWorkerStatusIDLE;
|
instance->status = SubGhzTxRxWorkerStatusIDLE;
|
||||||
instance->worker_stoping = true;
|
instance->worker_stopping = true;
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ from SCons.Script import Mkdir
|
|||||||
from SCons.Defaults import Touch
|
from SCons.Defaults import Touch
|
||||||
|
|
||||||
|
|
||||||
def GetProjetDirName(env, project=None):
|
def GetProjectDirName(env, project=None):
|
||||||
parts = [f"f{env['TARGET_HW']}"]
|
parts = [f"f{env['TARGET_HW']}"]
|
||||||
if project:
|
if project:
|
||||||
parts.append(project)
|
parts.append(project)
|
||||||
@ -21,7 +21,7 @@ def GetProjetDirName(env, project=None):
|
|||||||
|
|
||||||
|
|
||||||
def create_fw_build_targets(env, configuration_name):
|
def create_fw_build_targets(env, configuration_name):
|
||||||
flavor = GetProjetDirName(env, configuration_name)
|
flavor = GetProjectDirName(env, configuration_name)
|
||||||
build_dir = env.Dir("build").Dir(flavor)
|
build_dir = env.Dir("build").Dir(flavor)
|
||||||
return env.SConscript(
|
return env.SConscript(
|
||||||
"firmware.scons",
|
"firmware.scons",
|
||||||
@ -49,7 +49,7 @@ def AddFwProject(env, base_env, fw_type, fw_env_key):
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
env.Replace(DIST_DIR=env.GetProjetDirName())
|
env.Replace(DIST_DIR=env.GetProjectDirName())
|
||||||
return project_env
|
return project_env
|
||||||
|
|
||||||
|
|
||||||
@ -115,7 +115,7 @@ def generate(env):
|
|||||||
env.AddMethod(AddFwProject)
|
env.AddMethod(AddFwProject)
|
||||||
env.AddMethod(DistCommand)
|
env.AddMethod(DistCommand)
|
||||||
env.AddMethod(AddOpenOCDFlashTarget)
|
env.AddMethod(AddOpenOCDFlashTarget)
|
||||||
env.AddMethod(GetProjetDirName)
|
env.AddMethod(GetProjectDirName)
|
||||||
env.AddMethod(AddJFlashTarget)
|
env.AddMethod(AddJFlashTarget)
|
||||||
env.AddMethod(AddUsbFlashTarget)
|
env.AddMethod(AddUsbFlashTarget)
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ Other:
|
|||||||
cli:
|
cli:
|
||||||
Open a Flipper CLI session over USB
|
Open a Flipper CLI session over USB
|
||||||
firmware_cdb, updater_cdb:
|
firmware_cdb, updater_cdb:
|
||||||
Generate сompilation_database.json
|
Generate compilation_database.json
|
||||||
lint, lint_py:
|
lint, lint_py:
|
||||||
run linters
|
run linters
|
||||||
format, format_py:
|
format, format_py:
|
||||||
|
@ -93,7 +93,7 @@ class HardwareTargetLoader:
|
|||||||
sdk_headers = []
|
sdk_headers = []
|
||||||
seen_sdk_headers = set(self.excluded_headers)
|
seen_sdk_headers = set(self.excluded_headers)
|
||||||
for sdk_path in self.sdk_header_paths:
|
for sdk_path in self.sdk_header_paths:
|
||||||
# dirty, but fast - exclude headers from overlayed targets by name
|
# dirty, but fast - exclude headers from overlaid targets by name
|
||||||
# proper way would be to use relative paths, but names will do for now
|
# proper way would be to use relative paths, but names will do for now
|
||||||
for header in self.env.GlobRecursive("*.h", sdk_path, "*_i.h"):
|
for header in self.env.GlobRecursive("*.h", sdk_path, "*_i.h"):
|
||||||
if header.name not in seen_sdk_headers:
|
if header.name not in seen_sdk_headers:
|
||||||
|
Loading…
Reference in New Issue
Block a user