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:
coreglitch
2020-09-01 16:34:23 +06:00
committed by GitHub
parent f7882dbff4
commit 5b6ab7faf3
16 changed files with 538 additions and 33 deletions

View File

@@ -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
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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;
}