mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2025-12-12 04:34:43 +04:00
[FL-3954, FL-3955] New CLI architecture (#4111)
* feat: FuriThread stdin * ci: fix f18 * feat: stdio callback context * feat: FuriPipe * POTENTIALLY EXPLOSIVE pipe welding * fix: non-explosive welding * Revert welding * docs: furi_pipe * feat: pipe event loop integration * update f18 sdk * f18 * docs: make doxygen happy * fix: event loop not triggering when pipe attached to stdio * fix: partial stdout in pipe * allow simultaneous in and out subscription in event loop * feat: vcp i/o * feat: cli ansi stuffs and history * feat: more line editing * working but slow cli rewrite * restore previous speed after 4 days of debugging 🥲 * fix: cli_app_should_stop * fix: cli and event_loop memory leaks * style: remove commented out code * ci: fix pvs warnings * fix: unit tests, event_loop crash * ci: fix build * ci: silence pvs warning * feat: cli gpio * ci: fix formatting * Fix memory leak during event loop unsubscription * Event better memory leak fix * feat: cli completions * Merge remote-tracking branch 'origin/dev' into portasynthinca3/3928-cli-threads * merge fixups * temporarily exclude speaker_debug app * pvs and unit tests fixups * feat: commands in fals * move commands out of flash, code cleanup * ci: fix errors * fix: run commands in buffer when stopping session * speedup cli file transfer * fix f18 * separate cli_shell into modules * fix pvs warning * fix qflipper refusing to connect * remove temp debug logs * remove erroneous conclusion * Fix memory leak during event loop unsubscription * Event better memory leak fix * unit test for the fix * improve thread stdio callback signatures * pipe stdout timeout * update api symbols * fix f18, formatting * fix pvs warnings * increase stack size, hope to fix unit tests * cli: revert flag changes * cli: fix formatting * cli, fbt: loopback perf benchmark * thread, event_loop: subscribing to thread flags * cli: signal internal events using thread flags, improve performance * fix f18, formatting * event_loop: fix crash * storage_cli: increase write_chunk buffer size again * cli: explanation for order=0 * thread, event_loop: thread flags callback refactor * cli: increase stack size * cli: rename cli_app_should_stop -> cli_is_pipe_broken_or_is_etx_next_char * cli: use plain array instead of mlib for history * cli: prepend file name to static fns * cli: fix formatting * cli_shell: increase stack size * cli: fix rpc lockup * cli: better lockup fix * cli: fix f18 * fix merge --------- Co-authored-by: Georgii Surkov <georgii.surkov@outlook.com> Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
entry,status,name,type,params
|
||||
Version,+,83.0,,
|
||||
Version,+,84.0,,
|
||||
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,,
|
||||
@@ -778,18 +779,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*
|
||||
@@ -1138,6 +1138,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*
|
||||
@@ -1148,6 +1149,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*
|
||||
@@ -2329,14 +2331,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*"
|
||||
@@ -2939,7 +2941,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,9 +1,10 @@
|
||||
entry,status,name,type,params
|
||||
Version,+,83.0,,
|
||||
Version,+,84.0,,
|
||||
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.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,,
|
||||
@@ -855,18 +856,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*
|
||||
@@ -1250,6 +1250,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*
|
||||
@@ -1260,6 +1261,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*
|
||||
@@ -2967,14 +2969,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*"
|
||||
@@ -3791,7 +3793,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,
|
||||
|
||||
|
@@ -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);
|
||||
} CdcCallbacks;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user