loader_cli.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <furi.h>
  2. #include <cli/cli.h>
  3. #include <applications.h>
  4. #include <lib/toolbox/args.h>
  5. #include "loader.h"
  6. static void loader_cli_print_usage() {
  7. printf("Usage:\r\n");
  8. printf("loader <cmd> <args>\r\n");
  9. printf("Cmd list:\r\n");
  10. printf("\tlist\t - List available applications\r\n");
  11. printf("\topen <Application Name:string>\t - Open application by name\r\n");
  12. printf("\tinfo\t - Show loader state\r\n");
  13. }
  14. static void loader_cli_list() {
  15. printf("Applications:\r\n");
  16. for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) {
  17. printf("\t%s\r\n", FLIPPER_APPS[i].name);
  18. }
  19. printf("Settings:\r\n");
  20. for(size_t i = 0; i < FLIPPER_SETTINGS_APPS_COUNT; i++) {
  21. printf("\t%s\r\n", FLIPPER_SETTINGS_APPS[i].name);
  22. }
  23. }
  24. static void loader_cli_info(Loader* loader) {
  25. if(!loader_is_locked(loader)) {
  26. printf("No application is running\r\n");
  27. } else {
  28. // TODO: print application name ???
  29. printf("Application is running\r\n");
  30. }
  31. }
  32. static void loader_cli_open(FuriString* args, Loader* loader) {
  33. FuriString* app_name = furi_string_alloc();
  34. do {
  35. if(!args_read_probably_quoted_string_and_trim(args, app_name)) {
  36. printf("No application provided\r\n");
  37. break;
  38. }
  39. furi_string_trim(args);
  40. const char* args_str = furi_string_get_cstr(args);
  41. if(strlen(args_str) == 0) {
  42. args_str = NULL;
  43. }
  44. const char* app_name_str = furi_string_get_cstr(app_name);
  45. LoaderStatus status = loader_start(loader, app_name_str, args_str);
  46. switch(status) {
  47. case LoaderStatusOk:
  48. break;
  49. case LoaderStatusErrorAppStarted:
  50. printf("Can't start, application is running");
  51. break;
  52. case LoaderStatusErrorUnknownApp:
  53. printf("%s doesn't exists\r\n", app_name_str);
  54. break;
  55. case LoaderStatusErrorInternal:
  56. printf("Internal error\r\n");
  57. break;
  58. }
  59. } while(false);
  60. furi_string_free(app_name);
  61. }
  62. static void loader_cli(Cli* cli, FuriString* args, void* context) {
  63. UNUSED(cli);
  64. UNUSED(context);
  65. Loader* loader = furi_record_open(RECORD_LOADER);
  66. FuriString* cmd;
  67. cmd = furi_string_alloc();
  68. do {
  69. if(!args_read_string_and_trim(args, cmd)) {
  70. loader_cli_print_usage();
  71. break;
  72. }
  73. if(furi_string_cmp_str(cmd, "list") == 0) {
  74. loader_cli_list();
  75. break;
  76. }
  77. if(furi_string_cmp_str(cmd, "open") == 0) {
  78. loader_cli_open(args, loader);
  79. break;
  80. }
  81. if(furi_string_cmp_str(cmd, "info") == 0) {
  82. loader_cli_info(loader);
  83. break;
  84. }
  85. loader_cli_print_usage();
  86. } while(false);
  87. furi_string_free(cmd);
  88. furi_record_close(RECORD_LOADER);
  89. }
  90. void loader_on_system_start() {
  91. #ifdef SRV_CLI
  92. Cli* cli = furi_record_open(RECORD_CLI);
  93. cli_add_command(cli, RECORD_LOADER, CliCommandFlagParallelSafe, loader_cli, NULL);
  94. furi_record_close(RECORD_CLI);
  95. #else
  96. UNUSED(loader_cli);
  97. #endif
  98. }