flipper_application.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /**
  2. * @file flipper_application.h
  3. * Flipper application
  4. */
  5. #pragma once
  6. #include "application_manifest.h"
  7. #include "elf/elf_api_interface.h"
  8. #include <furi.h>
  9. #include <storage/storage.h>
  10. #include <stdbool.h>
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. typedef enum {
  15. FlipperApplicationPreloadStatusSuccess = 0,
  16. FlipperApplicationPreloadStatusUnspecifiedError,
  17. FlipperApplicationPreloadStatusInvalidFile,
  18. FlipperApplicationPreloadStatusInvalidManifest,
  19. FlipperApplicationPreloadStatusApiMismatch,
  20. FlipperApplicationPreloadStatusTargetMismatch,
  21. } FlipperApplicationPreloadStatus;
  22. typedef enum {
  23. FlipperApplicationLoadStatusSuccess = 0,
  24. FlipperApplicationLoadStatusUnspecifiedError,
  25. FlipperApplicationLoadStatusNoFreeMemory,
  26. FlipperApplicationLoadStatusMissingImports,
  27. } FlipperApplicationLoadStatus;
  28. /**
  29. * @brief Get text description of preload status
  30. * @param status Status code
  31. * @return String pointer to description
  32. */
  33. const char* flipper_application_preload_status_to_string(FlipperApplicationPreloadStatus status);
  34. /**
  35. * @brief Get text description of load status
  36. * @param status Status code
  37. * @return String pointer to description
  38. */
  39. const char* flipper_application_load_status_to_string(FlipperApplicationLoadStatus status);
  40. typedef struct FlipperApplication FlipperApplication;
  41. typedef struct {
  42. const char* name;
  43. uint32_t address;
  44. } FlipperApplicationMemoryMapEntry;
  45. typedef struct {
  46. uint32_t mmap_entry_count;
  47. FlipperApplicationMemoryMapEntry* mmap_entries;
  48. uint32_t debug_link_size;
  49. uint8_t* debug_link;
  50. } FlipperApplicationState;
  51. /**
  52. * @brief Initialize FlipperApplication object
  53. * @param storage Storage instance
  54. * @param api_interface ELF API interface to use for pre-loading and symbol resolving
  55. * @return Application instance
  56. */
  57. FlipperApplication*
  58. flipper_application_alloc(Storage* storage, const ElfApiInterface* api_interface);
  59. /**
  60. * @brief Destroy FlipperApplication object
  61. * @param app Application pointer
  62. */
  63. void flipper_application_free(FlipperApplication* app);
  64. /**
  65. * @brief Validate elf file and load application metadata
  66. * @param app Application pointer
  67. * @return Preload result code
  68. */
  69. FlipperApplicationPreloadStatus
  70. flipper_application_preload(FlipperApplication* app, const char* path);
  71. /**
  72. * @brief Validate elf file and load application manifest
  73. * @param app Application pointer
  74. * @return Preload result code
  75. */
  76. FlipperApplicationPreloadStatus
  77. flipper_application_preload_manifest(FlipperApplication* app, const char* path);
  78. /**
  79. * @brief Get pointer to application manifest for preloaded application
  80. * @param app Application pointer
  81. * @return Pointer to application manifest
  82. */
  83. const FlipperApplicationManifest* flipper_application_get_manifest(FlipperApplication* app);
  84. /**
  85. * @brief Load sections and process relocations for already pre-loaded application
  86. * @param app Application pointer
  87. * @return Load result code
  88. */
  89. FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplication* app);
  90. /**
  91. * @brief Create application thread at entry point address, using app name and
  92. * stack size from metadata. Returned thread isn't started yet.
  93. * Can be only called once for application instance.
  94. * @param app Applicaiton pointer
  95. * @param args Object to pass to app's entry point
  96. * @return Created thread
  97. */
  98. FuriThread* flipper_application_spawn(FlipperApplication* app, void* args);
  99. /**
  100. * @brief Check if application is a plugin (not a runnable standalone app)
  101. * @param app Application pointer
  102. * @return true if application is a plugin, false otherwise
  103. */
  104. bool flipper_application_is_plugin(FlipperApplication* app);
  105. /**
  106. * @brief Entry point prototype for standalone applications
  107. */
  108. typedef int32_t (*FlipperApplicationEntryPoint)(void*);
  109. /**
  110. * @brief An object that describes a plugin - must be returned by plugin's entry point
  111. */
  112. typedef struct {
  113. const char* appid;
  114. const uint32_t ep_api_version;
  115. const void* entry_point;
  116. } FlipperAppPluginDescriptor;
  117. /**
  118. * @brief Entry point prototype for plugins
  119. */
  120. typedef const FlipperAppPluginDescriptor* (*FlipperApplicationPluginEntryPoint)(void);
  121. /**
  122. * @brief Get plugin descriptor for preloaded plugin
  123. * @param app Application pointer
  124. * @return Pointer to plugin descriptor
  125. */
  126. const FlipperAppPluginDescriptor*
  127. flipper_application_plugin_get_descriptor(FlipperApplication* app);
  128. #ifdef __cplusplus
  129. }
  130. #endif