[FL-2957] Unified Info API, App Error, Data Xchange (#1998)

* Update protobuf definitions
* Add Property subsystem entry point function
* Key-based system info and power info function stubs
* Remove unneeded functions
* Working power info
* Working system info
* Replace #defines with string literals
* Remove unneeded field
* Simplify system info formatting
* Refactor output callback handling
* Handle the last info element correctly
* Optimise power info, rename methods
* Add comments
* Add power debug
* Remove unneeded definitions
* Rename some files and functions
* Update protobuf definitions
* Implement App GetError and DataExchange APIs
* Send GetErrorReply with correct command_id
* Add RPC debug app stub
* Add more scenes
* Add warning, increase stack size
* Add receive data exchange scene
* Improve data exchange
* Add notifications
* Update application requirements
* Bump format version for property-based infos
* Correctly reset error text
* RCP: sync protobuf repo to latest release tag

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
Georgii Surkov
2022-11-29 12:08:08 +03:00
committed by GitHub
parent 849afc8798
commit 0261dc3075
30 changed files with 1452 additions and 222 deletions

33
lib/toolbox/property.c Normal file
View File

@@ -0,0 +1,33 @@
#include "property.h"
#include <core/check.h>
void property_value_out(PropertyValueContext* ctx, const char* fmt, unsigned int nparts, ...) {
furi_assert(ctx);
furi_string_reset(ctx->key);
va_list args;
va_start(args, nparts);
for(size_t i = 0; i < nparts; ++i) {
const char* keypart = va_arg(args, const char*);
furi_string_cat(ctx->key, keypart);
if(i < nparts - 1) {
furi_string_push_back(ctx->key, ctx->sep);
}
}
const char* value_str;
if(fmt) {
furi_string_vprintf(ctx->value, fmt, args);
value_str = furi_string_get_cstr(ctx->value);
} else {
// C string passthrough (no formatting)
value_str = va_arg(args, const char*);
}
va_end(args);
ctx->out(furi_string_get_cstr(ctx->key), value_str, ctx->last, ctx->context);
}

39
lib/toolbox/property.h Normal file
View File

@@ -0,0 +1,39 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
#include <core/string.h>
/** Callback type called every time another key-value pair of device information is ready
*
* @param key[in] device information type identifier
* @param value[in] device information value
* @param last[in] whether the passed key-value pair is the last one
* @param context[in] to pass to callback
*/
typedef void (*PropertyValueCallback)(const char* key, const char* value, bool last, void* context);
typedef struct {
FuriString* key; /**< key string buffer, must be initialised before use */
FuriString* value; /**< value string buffer, must be initialised before use */
PropertyValueCallback out; /**< output callback function */
char sep; /**< separator character between key parts */
bool last; /**< flag to indicate last element */
void* context; /**< user-defined context, passed through to out callback */
} PropertyValueContext;
/** Builds key and value strings and outputs them via a callback function
*
* @param ctx[in] local property context
* @param fmt[in] value format, set to NULL to bypass formatting
* @param nparts[in] number of key parts (separated by character)
* @param ...[in] list of key parts followed by value
*/
void property_value_out(PropertyValueContext* ctx, const char* fmt, unsigned int nparts, ...);
#ifdef __cplusplus
}
#endif