mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-13 00:28:36 -07:00
Merge remote-tracking branch 'OFW/dev' into dev
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
entry,status,name,type,params
|
||||
Version,+,59.0,,
|
||||
Version,+,60.3,,
|
||||
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
|
||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||
Header,+,applications/services/cli/cli.h,,
|
||||
@@ -789,7 +789,6 @@ Function,+,calloc,void*,"size_t, size_t"
|
||||
Function,+,canvas_clear,void,Canvas*
|
||||
Function,+,canvas_commit,void,Canvas*
|
||||
Function,+,canvas_current_font_height,size_t,const Canvas*
|
||||
Function,+,canvas_current_font_width,size_t,const Canvas*
|
||||
Function,+,canvas_draw_bitmap,void,"Canvas*, int32_t, int32_t, size_t, size_t, const uint8_t*"
|
||||
Function,+,canvas_draw_box,void,"Canvas*, int32_t, int32_t, size_t, size_t"
|
||||
Function,+,canvas_draw_circle,void,"Canvas*, int32_t, int32_t, size_t"
|
||||
@@ -799,7 +798,6 @@ Function,+,canvas_draw_frame,void,"Canvas*, int32_t, int32_t, size_t, size_t"
|
||||
Function,+,canvas_draw_glyph,void,"Canvas*, int32_t, int32_t, uint16_t"
|
||||
Function,+,canvas_draw_icon,void,"Canvas*, int32_t, int32_t, const Icon*"
|
||||
Function,+,canvas_draw_icon_animation,void,"Canvas*, int32_t, int32_t, IconAnimation*"
|
||||
Function,+,canvas_draw_icon_bitmap,void,"Canvas*, uint8_t, uint8_t, int16_t, int16_t, const Icon*"
|
||||
Function,+,canvas_draw_icon_ex,void,"Canvas*, int32_t, int32_t, const Icon*, IconRotation"
|
||||
Function,+,canvas_draw_line,void,"Canvas*, int32_t, int32_t, int32_t, int32_t"
|
||||
Function,+,canvas_draw_rbox,void,"Canvas*, int32_t, int32_t, size_t, size_t, size_t"
|
||||
@@ -930,26 +928,25 @@ Function,-,dprintf,int,"int, const char*, ..."
|
||||
Function,-,drand48,double,
|
||||
Function,-,drem,double,"double, double"
|
||||
Function,-,dremf,float,"float, float"
|
||||
Function,+,elements_bold_rounded_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
|
||||
Function,+,elements_bubble,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
|
||||
Function,+,elements_bubble_str,void,"Canvas*, uint8_t, uint8_t, const char*, Align, Align"
|
||||
Function,+,elements_bold_rounded_frame,void,"Canvas*, int32_t, int32_t, size_t, size_t"
|
||||
Function,+,elements_bubble,void,"Canvas*, int32_t, int32_t, size_t, size_t"
|
||||
Function,+,elements_bubble_str,void,"Canvas*, int32_t, int32_t, const char*, Align, Align"
|
||||
Function,+,elements_button_center,void,"Canvas*, const char*"
|
||||
Function,+,elements_button_left,void,"Canvas*, const char*"
|
||||
Function,+,elements_button_right,void,"Canvas*, const char*"
|
||||
Function,+,elements_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
|
||||
Function,+,elements_multiline_text,void,"Canvas*, uint8_t, uint8_t, const char*"
|
||||
Function,+,elements_multiline_text_aligned,void,"Canvas*, uint8_t, uint8_t, Align, Align, const char*"
|
||||
Function,+,elements_multiline_text_framed,void,"Canvas*, uint8_t, uint8_t, const char*"
|
||||
Function,+,elements_progress_bar,void,"Canvas*, uint8_t, uint8_t, uint8_t, float"
|
||||
Function,+,elements_progress_bar_with_text,void,"Canvas*, uint8_t, uint8_t, uint8_t, float, const char*"
|
||||
Function,+,elements_scrollable_text_line,void,"Canvas*, uint8_t, uint8_t, uint8_t, FuriString*, size_t, _Bool"
|
||||
Function,+,elements_scrollable_text_line_str,void,"Canvas*, uint8_t, uint8_t, uint8_t, const char*, size_t, _Bool, _Bool"
|
||||
Function,+,elements_scrollbar,void,"Canvas*, uint16_t, uint16_t"
|
||||
Function,+,elements_scrollbar_pos,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint16_t, uint16_t"
|
||||
Function,+,elements_slightly_rounded_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
|
||||
Function,+,elements_slightly_rounded_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
|
||||
Function,+,elements_string_fit_width,void,"Canvas*, FuriString*, uint8_t"
|
||||
Function,+,elements_text_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, Align, Align, const char*, _Bool"
|
||||
Function,+,elements_frame,void,"Canvas*, int32_t, int32_t, size_t, size_t"
|
||||
Function,+,elements_multiline_text,void,"Canvas*, int32_t, int32_t, const char*"
|
||||
Function,+,elements_multiline_text_aligned,void,"Canvas*, int32_t, int32_t, Align, Align, const char*"
|
||||
Function,+,elements_multiline_text_framed,void,"Canvas*, int32_t, int32_t, const char*"
|
||||
Function,+,elements_progress_bar,void,"Canvas*, int32_t, int32_t, size_t, float"
|
||||
Function,+,elements_progress_bar_with_text,void,"Canvas*, int32_t, int32_t, size_t, float, const char*"
|
||||
Function,+,elements_scrollable_text_line,void,"Canvas*, int32_t, int32_t, size_t, FuriString*, size_t, _Bool"
|
||||
Function,+,elements_scrollbar,void,"Canvas*, size_t, size_t"
|
||||
Function,+,elements_scrollbar_pos,void,"Canvas*, int32_t, int32_t, size_t, size_t, size_t"
|
||||
Function,+,elements_slightly_rounded_box,void,"Canvas*, int32_t, int32_t, size_t, size_t"
|
||||
Function,+,elements_slightly_rounded_frame,void,"Canvas*, int32_t, int32_t, size_t, size_t"
|
||||
Function,+,elements_string_fit_width,void,"Canvas*, FuriString*, size_t"
|
||||
Function,+,elements_text_box,void,"Canvas*, int32_t, int32_t, size_t, size_t, Align, Align, const char*, _Bool"
|
||||
Function,+,elf_resolve_from_hashtable,_Bool,"const ElfApiInterface*, uint32_t, Elf32_Addr*"
|
||||
Function,+,elf_symbolname_hash,uint32_t,const char*
|
||||
Function,+,empty_screen_alloc,EmptyScreen*,
|
||||
@@ -1308,6 +1305,7 @@ Function,+,furi_hal_gpio_init_simple,void,"const GpioPin*, const GpioMode"
|
||||
Function,+,furi_hal_gpio_remove_int_callback,void,const GpioPin*
|
||||
Function,+,furi_hal_hid_consumer_key_press,_Bool,uint16_t
|
||||
Function,+,furi_hal_hid_consumer_key_release,_Bool,uint16_t
|
||||
Function,+,furi_hal_hid_consumer_key_release_all,_Bool,
|
||||
Function,+,furi_hal_hid_get_led_state,uint8_t,
|
||||
Function,+,furi_hal_hid_is_connected,_Bool,
|
||||
Function,+,furi_hal_hid_kb_press,_Bool,uint16_t
|
||||
@@ -1358,9 +1356,9 @@ Function,+,furi_hal_infrared_async_tx_set_signal_sent_isr_callback,void,"FuriHal
|
||||
Function,+,furi_hal_infrared_async_tx_start,void,"uint32_t, float"
|
||||
Function,+,furi_hal_infrared_async_tx_stop,void,
|
||||
Function,+,furi_hal_infrared_async_tx_wait_termination,void,
|
||||
Function,+,furi_hal_infrared_get_debug_out_status,_Bool,
|
||||
Function,+,furi_hal_infrared_detect_tx_output,FuriHalInfraredTxPin,
|
||||
Function,+,furi_hal_infrared_is_busy,_Bool,
|
||||
Function,+,furi_hal_infrared_set_debug_out,void,_Bool
|
||||
Function,+,furi_hal_infrared_set_tx_output,void,FuriHalInfraredTxPin
|
||||
Function,-,furi_hal_init,void,
|
||||
Function,-,furi_hal_init_early,void,
|
||||
Function,-,furi_hal_interrupt_init,void,
|
||||
|
||||
|
@@ -1,6 +1,7 @@
|
||||
#include <furi_hal_infrared.h>
|
||||
#include <furi_hal_interrupt.h>
|
||||
#include <furi_hal_resources.h>
|
||||
#include <furi_hal_cortex.h>
|
||||
#include <furi_hal_bus.h>
|
||||
|
||||
#include <stm32wbxx_ll_tim.h>
|
||||
@@ -75,11 +76,17 @@ typedef enum {
|
||||
InfraredStateMAX,
|
||||
} InfraredState;
|
||||
|
||||
static FuriHalInfraredTxPin infrared_tx_output = FuriHalInfraredTxPinInternal;
|
||||
static volatile InfraredState furi_hal_infrared_state = InfraredStateIdle;
|
||||
static InfraredTimTx infrared_tim_tx;
|
||||
static InfraredTimRx infrared_tim_rx;
|
||||
static bool infrared_external_output;
|
||||
|
||||
static const GpioPin* infrared_tx_pins[FuriHalInfraredTxPinMax] = {
|
||||
[FuriHalInfraredTxPinInternal] = &gpio_infrared_tx,
|
||||
[FuriHalInfraredTxPinExtPA7] = &gpio_ext_pa7,
|
||||
};
|
||||
|
||||
static void furi_hal_infrared_tx_fill_buffer(uint8_t buf_num, uint8_t polarity_shift);
|
||||
static void furi_hal_infrared_async_tx_free_resources(void);
|
||||
static void furi_hal_infrared_tx_dma_set_polarity(uint8_t buf_num, uint8_t polarity_shift);
|
||||
@@ -355,18 +362,8 @@ static void furi_hal_infrared_configure_tim_pwm_tx(uint32_t freq, float duty_cyc
|
||||
LL_TIM_SetAutoReload(
|
||||
INFRARED_DMA_TIMER,
|
||||
__LL_TIM_CALC_ARR(SystemCoreClock, LL_TIM_GetPrescaler(INFRARED_DMA_TIMER), freq));
|
||||
if(infrared_external_output) {
|
||||
LL_TIM_OC_SetCompareCH1(
|
||||
INFRARED_DMA_TIMER,
|
||||
((LL_TIM_GetAutoReload(INFRARED_DMA_TIMER) + 1) * (1 - duty_cycle)));
|
||||
LL_TIM_OC_EnablePreload(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1);
|
||||
/* LL_TIM_OCMODE_PWM2 set by DMA */
|
||||
LL_TIM_OC_SetMode(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1, LL_TIM_OCMODE_FORCED_INACTIVE);
|
||||
LL_TIM_OC_SetPolarity(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1N, LL_TIM_OCPOLARITY_HIGH);
|
||||
LL_TIM_OC_DisableFast(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1);
|
||||
LL_TIM_CC_EnableChannel(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1N);
|
||||
LL_TIM_DisableIT_CC1(INFRARED_DMA_TIMER);
|
||||
} else {
|
||||
|
||||
if(infrared_tx_output == FuriHalInfraredTxPinInternal) {
|
||||
LL_TIM_OC_SetCompareCH3(
|
||||
INFRARED_DMA_TIMER,
|
||||
((LL_TIM_GetAutoReload(INFRARED_DMA_TIMER) + 1) * (1 - duty_cycle)));
|
||||
@@ -377,7 +374,19 @@ static void furi_hal_infrared_configure_tim_pwm_tx(uint32_t freq, float duty_cyc
|
||||
LL_TIM_OC_DisableFast(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH3);
|
||||
LL_TIM_CC_EnableChannel(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH3N);
|
||||
LL_TIM_DisableIT_CC3(INFRARED_DMA_TIMER);
|
||||
} else if(infrared_tx_output == FuriHalInfraredTxPinExtPA7) {
|
||||
LL_TIM_OC_SetCompareCH1(
|
||||
INFRARED_DMA_TIMER,
|
||||
((LL_TIM_GetAutoReload(INFRARED_DMA_TIMER) + 1) * (1 - duty_cycle)));
|
||||
LL_TIM_OC_EnablePreload(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1);
|
||||
/* LL_TIM_OCMODE_PWM2 set by DMA */
|
||||
LL_TIM_OC_SetMode(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1, LL_TIM_OCMODE_FORCED_INACTIVE);
|
||||
LL_TIM_OC_SetPolarity(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1N, LL_TIM_OCPOLARITY_HIGH);
|
||||
LL_TIM_OC_DisableFast(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1);
|
||||
LL_TIM_CC_EnableChannel(INFRARED_DMA_TIMER, LL_TIM_CHANNEL_CH1N);
|
||||
LL_TIM_DisableIT_CC1(INFRARED_DMA_TIMER);
|
||||
}
|
||||
|
||||
LL_TIM_DisableMasterSlaveMode(INFRARED_DMA_TIMER);
|
||||
LL_TIM_EnableAllOutputs(INFRARED_DMA_TIMER);
|
||||
LL_TIM_DisableIT_UPDATE(INFRARED_DMA_TIMER);
|
||||
@@ -386,11 +395,13 @@ static void furi_hal_infrared_configure_tim_pwm_tx(uint32_t freq, float duty_cyc
|
||||
|
||||
static void furi_hal_infrared_configure_tim_cmgr2_dma_tx(void) {
|
||||
LL_DMA_InitTypeDef dma_config = {0};
|
||||
if(infrared_external_output) {
|
||||
dma_config.PeriphOrM2MSrcAddress = (uint32_t) & (INFRARED_DMA_TIMER->CCMR1);
|
||||
} else {
|
||||
dma_config.PeriphOrM2MSrcAddress = (uint32_t) & (INFRARED_DMA_TIMER->CCMR2);
|
||||
|
||||
if(infrared_tx_output == FuriHalInfraredTxPinInternal) {
|
||||
dma_config.PeriphOrM2MSrcAddress = (uint32_t)(&(INFRARED_DMA_TIMER->CCMR2));
|
||||
} else if(infrared_tx_output == FuriHalInfraredTxPinExtPA7) {
|
||||
dma_config.PeriphOrM2MSrcAddress = (uint32_t)(&(INFRARED_DMA_TIMER->CCMR1));
|
||||
}
|
||||
|
||||
dma_config.MemoryOrM2MDstAddress = (uint32_t)NULL;
|
||||
dma_config.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH;
|
||||
dma_config.Mode = LL_DMA_MODE_NORMAL;
|
||||
@@ -587,11 +598,8 @@ static void furi_hal_infrared_async_tx_free_resources(void) {
|
||||
(furi_hal_infrared_state == InfraredStateIdle) ||
|
||||
(furi_hal_infrared_state == InfraredStateAsyncTxStopped));
|
||||
|
||||
if(infrared_external_output) {
|
||||
furi_hal_gpio_init(&gpio_ext_pa7, GpioModeAnalog, GpioPullDown, GpioSpeedLow);
|
||||
} else {
|
||||
furi_hal_gpio_init(&gpio_infrared_tx, GpioModeAnalog, GpioPullDown, GpioSpeedLow);
|
||||
}
|
||||
furi_hal_gpio_init(
|
||||
infrared_tx_pins[infrared_tx_output], GpioModeAnalog, GpioPullDown, GpioSpeedLow);
|
||||
furi_hal_interrupt_set_isr(INFRARED_DMA_CH1_IRQ, NULL, NULL);
|
||||
furi_hal_interrupt_set_isr(INFRARED_DMA_CH2_IRQ, NULL, NULL);
|
||||
|
||||
@@ -652,22 +660,11 @@ void furi_hal_infrared_async_tx_start(uint32_t freq, float duty_cycle) {
|
||||
furi_delay_us(5);
|
||||
LL_TIM_GenerateEvent_UPDATE(INFRARED_DMA_TIMER); /* DMA -> TIMx_RCR */
|
||||
furi_delay_us(5);
|
||||
if(infrared_external_output) {
|
||||
LL_GPIO_ResetOutputPin(
|
||||
gpio_ext_pa7.port, gpio_ext_pa7.pin); /* when disable it prevents false pulse */
|
||||
furi_hal_gpio_init_ex(
|
||||
&gpio_ext_pa7, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedHigh, GpioAltFn1TIM1);
|
||||
} else {
|
||||
LL_GPIO_ResetOutputPin(
|
||||
gpio_infrared_tx.port,
|
||||
gpio_infrared_tx.pin); /* when disable it prevents false pulse */
|
||||
furi_hal_gpio_init_ex(
|
||||
&gpio_infrared_tx,
|
||||
GpioModeAltFunctionPushPull,
|
||||
GpioPullUp,
|
||||
GpioSpeedHigh,
|
||||
GpioAltFn1TIM1);
|
||||
}
|
||||
|
||||
const GpioPin* tx_gpio = infrared_tx_pins[infrared_tx_output];
|
||||
LL_GPIO_ResetOutputPin(tx_gpio->port, tx_gpio->pin); /* when disable it prevents false pulse */
|
||||
furi_hal_gpio_init_ex(
|
||||
tx_gpio, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedHigh, GpioAltFn1TIM1);
|
||||
|
||||
FURI_CRITICAL_ENTER();
|
||||
LL_TIM_GenerateEvent_UPDATE(INFRARED_DMA_TIMER); /* TIMx_RCR -> Repetition counter */
|
||||
@@ -712,3 +709,23 @@ void furi_hal_infrared_async_tx_set_signal_sent_isr_callback(
|
||||
infrared_tim_tx.signal_sent_callback = callback;
|
||||
infrared_tim_tx.signal_sent_context = context;
|
||||
}
|
||||
|
||||
FuriHalInfraredTxPin furi_hal_infrared_detect_tx_output(void) {
|
||||
for(FuriHalInfraredTxPin pin = FuriHalInfraredTxPinInternal + 1; //-V1008
|
||||
pin < FuriHalInfraredTxPinMax;
|
||||
++pin) {
|
||||
const GpioPin* gpio = infrared_tx_pins[pin];
|
||||
furi_hal_gpio_init(gpio, GpioModeInput, GpioPullUp, GpioSpeedLow);
|
||||
furi_hal_cortex_delay_us(1000U);
|
||||
const bool level = furi_hal_gpio_read(gpio);
|
||||
furi_hal_gpio_init(gpio, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
|
||||
if(!level) return pin;
|
||||
}
|
||||
|
||||
return FuriHalInfraredTxPinInternal;
|
||||
}
|
||||
|
||||
void furi_hal_infrared_set_tx_output(FuriHalInfraredTxPin tx_pin) {
|
||||
furi_check(tx_pin < FuriHalInfraredTxPinMax);
|
||||
infrared_tx_output = tx_pin;
|
||||
}
|
||||
|
||||
@@ -354,6 +354,13 @@ bool furi_hal_hid_consumer_key_release(uint16_t button) {
|
||||
return hid_send_report(ReportIdConsumer);
|
||||
}
|
||||
|
||||
bool furi_hal_hid_consumer_key_release_all(void) {
|
||||
for(uint8_t key_nb = 0; key_nb < HID_CONSUMER_MAX_KEYS; key_nb++) {
|
||||
hid_report.consumer.btn[key_nb] = 0;
|
||||
}
|
||||
return hid_send_report(ReportIdConsumer);
|
||||
}
|
||||
|
||||
static void* hid_set_string_descr(char* str) {
|
||||
furi_assert(str);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user