Example ipc (#60)
* add blank example * add ipc example code, need to change FURI API * add ipc example code, need to change FURI API * change core API, add context * check handler at take * fix important bugs in furi * drawing example * add posix mq * fix unsigned demo counter * create at open * working local demo * russian version of IPC example * english version * add gif
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -6,6 +8,7 @@ extern "C" {
|
||||
#include "flipper_hal.h"
|
||||
#include "cmsis_os.h"
|
||||
#include "furi.h"
|
||||
#include "log.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
48
core/furi.c
48
core/furi.c
@@ -27,11 +27,27 @@ static FuriRecord* find_record(const char* name) {
|
||||
return res;
|
||||
}
|
||||
|
||||
// TODO: change open-create to only open
|
||||
bool furi_create(const char* name, void* value, size_t size) {
|
||||
#ifdef FURI_DEBUG
|
||||
printf("[FURI] creating %s record\n", name);
|
||||
#endif
|
||||
|
||||
FuriRecord* record = find_record(name);
|
||||
|
||||
if(record != NULL) {
|
||||
#ifdef FURI_DEBUG
|
||||
printf("[FURI] record already exist\n");
|
||||
#endif
|
||||
|
||||
record->value = value;
|
||||
record->size = size;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// record not exist, create new
|
||||
|
||||
if(current_buffer_idx >= MAX_RECORD_COUNT) {
|
||||
// max record count exceed
|
||||
#ifdef FURI_DEBUG
|
||||
@@ -50,6 +66,7 @@ bool furi_create(const char* name, void* value, size_t size) {
|
||||
|
||||
for(size_t i = 0; i < MAX_RECORD_SUBSCRIBERS; i++) {
|
||||
records[current_buffer_idx].subscribers[i].allocated = false;
|
||||
records[current_buffer_idx].subscribers[i].ctx = NULL;
|
||||
}
|
||||
|
||||
current_buffer_idx++;
|
||||
@@ -62,7 +79,8 @@ FuriRecordSubscriber* furi_open(
|
||||
bool solo,
|
||||
bool no_mute,
|
||||
FlipperRecordCallback value_callback,
|
||||
FlipperRecordStateCallback state_callback
|
||||
FlipperRecordStateCallback state_callback,
|
||||
void* ctx
|
||||
) {
|
||||
#ifdef FURI_DEBUG
|
||||
printf("[FURI] opening %s record\n", name);
|
||||
@@ -77,7 +95,16 @@ FuriRecordSubscriber* furi_open(
|
||||
printf("[FURI] cannot find record %s\n", name);
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
// create record if not exist
|
||||
if(!furi_create(name, NULL, 0)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
record = find_record(name);
|
||||
|
||||
if(record == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// allocate subscriber
|
||||
@@ -111,6 +138,7 @@ FuriRecordSubscriber* furi_open(
|
||||
subscriber->cb = value_callback;
|
||||
subscriber->state_cb = state_callback;
|
||||
subscriber->record = record;
|
||||
subscriber->ctx = ctx;
|
||||
|
||||
// register record in application
|
||||
FuriApp* current_task = find_task(xTaskGetCurrentTaskHandle());
|
||||
@@ -152,22 +180,36 @@ static void furi_notify(FuriRecordSubscriber* handler, const void* value, size_t
|
||||
for(size_t i = 0; i < MAX_RECORD_SUBSCRIBERS; i++) {
|
||||
if(handler->record->subscribers[i].allocated) {
|
||||
if(handler->record->subscribers[i].cb != NULL) {
|
||||
handler->record->subscribers[i].cb(value, size);
|
||||
handler->record->subscribers[i].cb(
|
||||
value,
|
||||
size,
|
||||
handler->record->subscribers[i].ctx
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void* furi_take(FuriRecordSubscriber* handler) {
|
||||
if(handler == NULL || handler->record == NULL) return NULL;
|
||||
// take mutex
|
||||
|
||||
return handler->record->value;
|
||||
}
|
||||
|
||||
void furi_give(FuriRecordSubscriber* handler) {
|
||||
if(handler == NULL || handler->record == NULL) return;
|
||||
|
||||
// release mutex
|
||||
}
|
||||
|
||||
void furi_commit(FuriRecordSubscriber* handler) {
|
||||
if(handler == NULL || handler->record == NULL) return;
|
||||
|
||||
furi_give(handler);
|
||||
furi_notify(handler, handler->record->value, handler->record->size);
|
||||
}
|
||||
|
||||
bool furi_read(FuriRecordSubscriber* handler, void* value, size_t size) {
|
||||
#ifdef FURI_DEBUG
|
||||
printf("[FURI] read from %s\n", handler->record->name);
|
||||
|
13
core/furi.h
13
core/furi.h
@@ -11,7 +11,7 @@
|
||||
typedef void(*FlipperApplication)(void*);
|
||||
|
||||
/// pointer to value callback function
|
||||
typedef void(*FlipperRecordCallback)(const void*, size_t);
|
||||
typedef void(*FlipperRecordCallback)(const void*, size_t, void*);
|
||||
|
||||
typedef enum {
|
||||
FlipperRecordStateMute, ///< record open and mute this handler
|
||||
@@ -20,7 +20,7 @@ typedef enum {
|
||||
} FlipperRecordState;
|
||||
|
||||
/// pointer to state callback function
|
||||
typedef void(*FlipperRecordStateCallback)(FlipperRecordState);
|
||||
typedef void(*FlipperRecordStateCallback)(FlipperRecordState, void*);
|
||||
|
||||
struct _FuriRecord;
|
||||
|
||||
@@ -31,6 +31,7 @@ typedef struct {
|
||||
uint8_t mute_counter; ///< see "wiki/FURI#mute-algorithm"
|
||||
bool no_mute;
|
||||
struct _FuriRecord* record; ///< parent record
|
||||
void* ctx;
|
||||
} FuriRecordSubscriber;
|
||||
|
||||
/// FURI record handler
|
||||
@@ -114,7 +115,8 @@ FuriRecordSubscriber* furi_open(
|
||||
bool solo,
|
||||
bool no_mute,
|
||||
FlipperRecordCallback value_callback,
|
||||
FlipperRecordStateCallback state_callback
|
||||
FlipperRecordStateCallback state_callback,
|
||||
void* ctx
|
||||
);
|
||||
|
||||
/*!
|
||||
@@ -155,3 +157,8 @@ void* furi_take(FuriRecordSubscriber* record);
|
||||
unlock value mutex.
|
||||
*/
|
||||
void furi_give(FuriRecordSubscriber* record);
|
||||
|
||||
/*!
|
||||
unlock value mutex and notify subscribers that data is chaned.
|
||||
*/
|
||||
void furi_commit(FuriRecordSubscriber* handler);
|
||||
|
@@ -21,5 +21,5 @@ void fuprintf(FuriRecordSubscriber* f, const char * format, ...) {
|
||||
}
|
||||
|
||||
FuriRecordSubscriber* get_default_log() {
|
||||
return furi_open("tty", false, false, NULL, NULL);
|
||||
return furi_open("tty", false, false, NULL, NULL, NULL);
|
||||
}
|
@@ -3,7 +3,7 @@
|
||||
|
||||
extern UART_HandleTypeDef DEBUG_UART;
|
||||
|
||||
void handle_uart_write(const void* data, size_t size) {
|
||||
void handle_uart_write(const void* data, size_t size, void* ctx) {
|
||||
HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)data, (uint16_t)size, HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ bool register_tty_uart() {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(furi_open("tty", false, false, handle_uart_write, NULL) == NULL) {
|
||||
if(furi_open("tty", false, false, handle_uart_write, NULL, NULL) == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user