Merge remote-tracking branch 'ofw/dev' into mntm-dev --nobuild

This commit is contained in:
Willy-JL
2025-04-03 02:41:32 +01:00
77 changed files with 3102 additions and 1529 deletions

View File

@@ -7,6 +7,7 @@ Header,+,applications/services/applications.h,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
Header,+,applications/services/cli/cli.h,,
Header,+,applications/services/cli/cli_ansi.h,,
Header,+,applications/services/cli/cli_vcp.h,,
Header,+,applications/services/dialogs/dialogs.h,,
Header,+,applications/services/dolphin/dolphin.h,,
@@ -875,18 +876,17 @@ Function,-,ceill,long double,long double
Function,-,cfree,void,void*
Function,-,clearerr,void,FILE*
Function,-,clearerr_unlocked,void,FILE*
Function,+,cli_add_command,void,"Cli*, const char*, CliCommandFlag, CliCallback, void*"
Function,+,cli_cmd_interrupt_received,_Bool,Cli*
Function,+,cli_add_command,void,"Cli*, const char*, CliCommandFlag, CliExecuteCallback, void*"
Function,+,cli_add_command_ex,void,"Cli*, const char*, CliCommandFlag, CliExecuteCallback, void*, size_t"
Function,+,cli_ansi_parser_alloc,CliAnsiParser*,
Function,+,cli_ansi_parser_feed,CliAnsiParserResult,"CliAnsiParser*, char"
Function,+,cli_ansi_parser_feed_timeout,CliAnsiParserResult,CliAnsiParser*
Function,+,cli_ansi_parser_free,void,CliAnsiParser*
Function,+,cli_delete_command,void,"Cli*, const char*"
Function,+,cli_getc,char,Cli*
Function,+,cli_is_connected,_Bool,Cli*
Function,+,cli_nl,void,Cli*
Function,+,cli_is_pipe_broken_or_is_etx_next_char,_Bool,PipeSide*
Function,+,cli_print_usage,void,"const char*, const char*, const char*"
Function,+,cli_read,size_t,"Cli*, uint8_t*, size_t"
Function,+,cli_read_timeout,size_t,"Cli*, uint8_t*, size_t, uint32_t"
Function,+,cli_session_close,void,Cli*
Function,+,cli_session_open,void,"Cli*, const void*"
Function,+,cli_write,void,"Cli*, const uint8_t*, size_t"
Function,+,cli_vcp_disable,void,CliVcp*
Function,+,cli_vcp_enable,void,CliVcp*
Function,+,composite_api_resolver_add,void,"CompositeApiResolver*, const ElfApiInterface*"
Function,+,composite_api_resolver_alloc,CompositeApiResolver*,
Function,+,composite_api_resolver_free,void,CompositeApiResolver*
@@ -1301,6 +1301,7 @@ Function,+,furi_event_loop_subscribe_message_queue,void,"FuriEventLoop*, FuriMes
Function,+,furi_event_loop_subscribe_mutex,void,"FuriEventLoop*, FuriMutex*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*"
Function,+,furi_event_loop_subscribe_semaphore,void,"FuriEventLoop*, FuriSemaphore*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*"
Function,+,furi_event_loop_subscribe_stream_buffer,void,"FuriEventLoop*, FuriStreamBuffer*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*"
Function,+,furi_event_loop_subscribe_thread_flags,void,"FuriEventLoop*, FuriEventLoopThreadFlagsCallback, void*"
Function,+,furi_event_loop_tick_set,void,"FuriEventLoop*, uint32_t, FuriEventLoopTickCallback, void*"
Function,+,furi_event_loop_timer_alloc,FuriEventLoopTimer*,"FuriEventLoop*, FuriEventLoopTimerCallback, FuriEventLoopTimerType, void*"
Function,+,furi_event_loop_timer_free,void,FuriEventLoopTimer*
@@ -1311,6 +1312,7 @@ Function,+,furi_event_loop_timer_restart,void,FuriEventLoopTimer*
Function,+,furi_event_loop_timer_start,void,"FuriEventLoopTimer*, uint32_t"
Function,+,furi_event_loop_timer_stop,void,FuriEventLoopTimer*
Function,+,furi_event_loop_unsubscribe,void,"FuriEventLoop*, FuriEventLoopObject*"
Function,+,furi_event_loop_unsubscribe_thread_flags,void,FuriEventLoop*
Function,+,furi_get_tick,uint32_t,
Function,+,furi_hal_adc_acquire,FuriHalAdcHandle*,
Function,+,furi_hal_adc_configure,void,FuriHalAdcHandle*
@@ -3048,14 +3050,14 @@ Function,+,pipe_bytes_available,size_t,PipeSide*
Function,+,pipe_detach_from_event_loop,void,PipeSide*
Function,+,pipe_free,void,PipeSide*
Function,+,pipe_install_as_stdio,void,PipeSide*
Function,+,pipe_receive,size_t,"PipeSide*, void*, size_t, FuriWait"
Function,+,pipe_receive,size_t,"PipeSide*, void*, size_t"
Function,+,pipe_role,PipeRole,PipeSide*
Function,+,pipe_send,size_t,"PipeSide*, const void*, size_t, FuriWait"
Function,+,pipe_send,size_t,"PipeSide*, const void*, size_t"
Function,+,pipe_set_broken_callback,void,"PipeSide*, PipeSideBrokenCallback, FuriEventLoopEvent"
Function,+,pipe_set_callback_context,void,"PipeSide*, void*"
Function,+,pipe_set_data_arrived_callback,void,"PipeSide*, PipeSideDataArrivedCallback, FuriEventLoopEvent"
Function,+,pipe_set_space_freed_callback,void,"PipeSide*, PipeSideSpaceFreedCallback, FuriEventLoopEvent"
Function,+,pipe_set_stdout_timeout,void,"PipeSide*, FuriWait"
Function,+,pipe_set_state_check_period,void,"PipeSide*, FuriWait"
Function,+,pipe_spaces_available,size_t,PipeSide*
Function,+,pipe_state,PipeState,PipeSide*
Function,+,plugin_manager_alloc,PluginManager*,"const char*, uint32_t, const ElfApiInterface*"
@@ -4237,7 +4239,6 @@ Variable,-,_sys_errlist,const char* const[],
Variable,-,_sys_nerr,int,
Variable,-,ble_profile_hid,const FuriHalBleProfileTemplate*,
Variable,+,ble_profile_serial,const FuriHalBleProfileTemplate* const,
Variable,+,cli_vcp,const CliSession,
Variable,+,compress_config_heatshrink_default,const CompressConfigHeatshrink,
Variable,+,firmware_api_interface,const ElfApiInterface* const,
Variable,+,furi_hal_i2c_bus_external,FuriHalI2cBus,
1 entry status name type params
7 Header + applications/services/bt/bt_service/bt.h
8 Header + applications/services/bt/bt_service/bt_keys_storage.h
9 Header + applications/services/cli/cli.h
10 Header + applications/services/cli/cli_ansi.h
11 Header + applications/services/cli/cli_vcp.h
12 Header + applications/services/dialogs/dialogs.h
13 Header + applications/services/dolphin/dolphin.h
876 Function - cfree void void*
877 Function - clearerr void FILE*
878 Function - clearerr_unlocked void FILE*
879 Function + cli_add_command void Cli*, const char*, CliCommandFlag, CliCallback, void* Cli*, const char*, CliCommandFlag, CliExecuteCallback, void*
880 Function + cli_cmd_interrupt_received cli_add_command_ex _Bool void Cli* Cli*, const char*, CliCommandFlag, CliExecuteCallback, void*, size_t
881 Function + cli_ansi_parser_alloc CliAnsiParser*
882 Function + cli_ansi_parser_feed CliAnsiParserResult CliAnsiParser*, char
883 Function + cli_ansi_parser_feed_timeout CliAnsiParserResult CliAnsiParser*
884 Function + cli_ansi_parser_free void CliAnsiParser*
885 Function + cli_delete_command void Cli*, const char*
886 Function + cli_getc cli_is_pipe_broken_or_is_etx_next_char char _Bool Cli* PipeSide*
Function + cli_is_connected _Bool Cli*
Function + cli_nl void Cli*
887 Function + cli_print_usage void const char*, const char*, const char*
888 Function + cli_read cli_vcp_disable size_t void Cli*, uint8_t*, size_t CliVcp*
889 Function + cli_read_timeout cli_vcp_enable size_t void Cli*, uint8_t*, size_t, uint32_t CliVcp*
Function + cli_session_close void Cli*
Function + cli_session_open void Cli*, const void*
Function + cli_write void Cli*, const uint8_t*, size_t
890 Function + composite_api_resolver_add void CompositeApiResolver*, const ElfApiInterface*
891 Function + composite_api_resolver_alloc CompositeApiResolver*
892 Function + composite_api_resolver_free void CompositeApiResolver*
1301 Function + furi_event_loop_subscribe_mutex void FuriEventLoop*, FuriMutex*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*
1302 Function + furi_event_loop_subscribe_semaphore void FuriEventLoop*, FuriSemaphore*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*
1303 Function + furi_event_loop_subscribe_stream_buffer void FuriEventLoop*, FuriStreamBuffer*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*
1304 Function + furi_event_loop_subscribe_thread_flags void FuriEventLoop*, FuriEventLoopThreadFlagsCallback, void*
1305 Function + furi_event_loop_tick_set void FuriEventLoop*, uint32_t, FuriEventLoopTickCallback, void*
1306 Function + furi_event_loop_timer_alloc FuriEventLoopTimer* FuriEventLoop*, FuriEventLoopTimerCallback, FuriEventLoopTimerType, void*
1307 Function + furi_event_loop_timer_free void FuriEventLoopTimer*
1312 Function + furi_event_loop_timer_start void FuriEventLoopTimer*, uint32_t
1313 Function + furi_event_loop_timer_stop void FuriEventLoopTimer*
1314 Function + furi_event_loop_unsubscribe void FuriEventLoop*, FuriEventLoopObject*
1315 Function + furi_event_loop_unsubscribe_thread_flags void FuriEventLoop*
1316 Function + furi_get_tick uint32_t
1317 Function + furi_hal_adc_acquire FuriHalAdcHandle*
1318 Function + furi_hal_adc_configure void FuriHalAdcHandle*
3050 Function + pipe_detach_from_event_loop void PipeSide*
3051 Function + pipe_free void PipeSide*
3052 Function + pipe_install_as_stdio void PipeSide*
3053 Function + pipe_receive size_t PipeSide*, void*, size_t, FuriWait PipeSide*, void*, size_t
3054 Function + pipe_role PipeRole PipeSide*
3055 Function + pipe_send size_t PipeSide*, const void*, size_t, FuriWait PipeSide*, const void*, size_t
3056 Function + pipe_set_broken_callback void PipeSide*, PipeSideBrokenCallback, FuriEventLoopEvent
3057 Function + pipe_set_callback_context void PipeSide*, void*
3058 Function + pipe_set_data_arrived_callback void PipeSide*, PipeSideDataArrivedCallback, FuriEventLoopEvent
3059 Function + pipe_set_space_freed_callback void PipeSide*, PipeSideSpaceFreedCallback, FuriEventLoopEvent
3060 Function + pipe_set_stdout_timeout pipe_set_state_check_period void PipeSide*, FuriWait
3061 Function + pipe_spaces_available size_t PipeSide*
3062 Function + pipe_state PipeState PipeSide*
3063 Function + plugin_manager_alloc PluginManager* const char*, uint32_t, const ElfApiInterface*
4239 Variable - _sys_nerr int
4240 Variable - ble_profile_hid const FuriHalBleProfileTemplate*
4241 Variable + ble_profile_serial const FuriHalBleProfileTemplate* const
Variable + cli_vcp const CliSession
4242 Variable + compress_config_heatshrink_default const CompressConfigHeatshrink
4243 Variable + firmware_api_interface const ElfApiInterface* const
4244 Variable + furi_hal_i2c_bus_external FuriHalI2cBus

View File

@@ -23,6 +23,8 @@ typedef struct {
uint16_t connection_handle;
uint8_t adv_svc_uuid_len;
uint8_t adv_svc_uuid[20];
uint8_t mfg_data_len;
uint8_t mfg_data[20];
char* adv_name;
} GapSvc;
@@ -216,11 +218,10 @@ BleEventFlowStatus ble_event_app_notification(void* pckt) {
gap->service.connection_handle = event->Connection_Handle;
gap_verify_connection_parameters(gap);
// Save rssi for current connection
fetch_rssi();
// Start pairing by sending security request
aci_gap_slave_security_req(event->Connection_Handle);
if(gap->config->pairing_method != GapPairingNone) {
// Start pairing by sending security request
aci_gap_slave_security_req(event->Connection_Handle);
}
} break;
default:
@@ -345,6 +346,14 @@ static void set_advertisment_service_uid(uint8_t* uid, uint8_t uid_len) {
gap->service.adv_svc_uuid_len += uid_len;
}
static void set_manufacturer_data(uint8_t* mfg_data, uint8_t mfg_data_len) {
furi_check(mfg_data_len < sizeof(gap->service.mfg_data) - 2);
gap->service.mfg_data[0] = mfg_data_len + 1;
gap->service.mfg_data[1] = AD_TYPE_MANUFACTURER_SPECIFIC_DATA;
memcpy(&gap->service.mfg_data[gap->service.mfg_data_len], mfg_data, mfg_data_len);
gap->service.mfg_data_len += mfg_data_len;
}
static void gap_init_svc(Gap* gap) {
tBleStatus status;
uint32_t srd_bd_addr[2];
@@ -464,6 +473,11 @@ static void gap_advertise_start(GapState new_state) {
FURI_LOG_D(TAG, "set_non_discoverable success");
}
}
if(gap->service.mfg_data_len > 0) {
hci_le_set_scan_response_data(gap->service.mfg_data_len, gap->service.mfg_data);
}
// Configure advertising
status = aci_gap_set_discoverable(
ADV_IND,
@@ -577,11 +591,26 @@ bool gap_init(GapConfig* config, GapEventCallback on_event_cb, void* context) {
gap->is_secure = false;
gap->negotiation_round = 0;
uint8_t adv_service_uid[2];
gap->service.adv_svc_uuid_len = 1;
adv_service_uid[0] = gap->config->adv_service_uuid & 0xff;
adv_service_uid[1] = gap->config->adv_service_uuid >> 8;
set_advertisment_service_uid(adv_service_uid, sizeof(adv_service_uid));
if(gap->config->mfg_data_len > 0) {
// Offset by 2 for length + AD_TYPE_MANUFACTURER_SPECIFIC_DATA
gap->service.mfg_data_len = 2;
set_manufacturer_data(gap->config->mfg_data, gap->config->mfg_data_len);
}
if(gap->config->adv_service.UUID_Type == UUID_TYPE_16) {
uint8_t adv_service_uid[2];
gap->service.adv_svc_uuid_len = 1;
adv_service_uid[0] = gap->config->adv_service.Service_UUID_16 & 0xff;
adv_service_uid[1] = gap->config->adv_service.Service_UUID_16 >> 8;
set_advertisment_service_uid(adv_service_uid, sizeof(adv_service_uid));
} else if(gap->config->adv_service.UUID_Type == UUID_TYPE_128) {
gap->service.adv_svc_uuid_len = 1;
set_advertisment_service_uid(
gap->config->adv_service.Service_UUID_128,
sizeof(gap->config->adv_service.Service_UUID_128));
} else {
furi_crash("Invalid UUID type");
}
// Set callback
gap->on_event_cb = on_event_cb;

View File

@@ -69,7 +69,13 @@ typedef struct {
} GapConnectionParamsRequest;
typedef struct {
uint16_t adv_service_uuid;
struct {
uint8_t UUID_Type;
uint16_t Service_UUID_16;
uint8_t Service_UUID_128[16];
} adv_service;
uint8_t mfg_data[20];
uint8_t mfg_data_len;
uint16_t appearance_char;
bool bonding_mode;
GapPairing pairing_method;

View File

@@ -6,6 +6,7 @@
#include <services/battery_service.h>
#include <services/serial_service.h>
#include <furi.h>
#include <ble/core/ble_defs.h>
typedef struct {
FuriHalBleProfileBase base;
@@ -47,7 +48,11 @@ static void ble_profile_serial_stop(FuriHalBleProfileBase* profile) {
#define CONNECTION_INTERVAL_MAX (0x24)
static const GapConfig serial_template_config = {
.adv_service_uuid = 0x3080,
.adv_service =
{
.UUID_Type = UUID_TYPE_16,
.Service_UUID_16 = 0x3080,
},
.appearance_char = 0x8600,
.bonding_mode = true,
.pairing_method = GapPairingPinCodeShow,
@@ -71,7 +76,8 @@ static void
config->adv_name,
furi_hal_version_get_ble_local_device_name_ptr(),
FURI_HAL_VERSION_DEVICE_NAME_LENGTH);
config->adv_service_uuid |= furi_hal_version_get_hw_color();
config->adv_service.UUID_Type = UUID_TYPE_16;
config->adv_service.Service_UUID_16 |= furi_hal_version_get_hw_color();
}
static const FuriHalBleProfileTemplate profile_callbacks = {

View File

@@ -9,11 +9,21 @@
extern "C" {
#endif
typedef enum {
CdcStateDisconnected,
CdcStateConnected,
} CdcState;
typedef enum {
CdcCtrlLineDTR = (1 << 0),
CdcCtrlLineRTS = (1 << 1),
} CdcCtrlLine;
typedef struct {
void (*tx_ep_callback)(void* context);
void (*rx_ep_callback)(void* context);
void (*state_callback)(void* context, uint8_t state);
void (*ctrl_line_callback)(void* context, uint8_t state);
void (*state_callback)(void* context, CdcState state);
void (*ctrl_line_callback)(void* context, CdcCtrlLine ctrl_lines);
void (*config_callback)(void* context, struct usb_cdc_line_coding* config);
void (*break_callback)(void* context, uint16_t duration);
} CdcCallbacks;