Skip to content
This repository has been archived by the owner on Aug 18, 2024. It is now read-only.

Commit

Permalink
storage (disabled for now)
Browse files Browse the repository at this point in the history
  • Loading branch information
Milk-Cool committed Oct 20, 2023
1 parent a2f51ab commit aa0c0d4
Show file tree
Hide file tree
Showing 49 changed files with 5,359 additions and 29 deletions.
9 changes: 8 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,14 @@
"thread": "c",
"cblas.h": "c",
"message_queue.h": "c",
"args.h": "c"
"args.h": "c",
"typeinfo": "cpp",
"cstdio": "c",
"dirent.h": "c",
"kernel.h": "c",
"semaphore.h": "c",
"pubsub.h": "c",
"string": "c"
},
"[python]": {
"editor.defaultFormatter": "ms-python.autopep8"
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ $(OUT_DIR): $(OUT_APP) $(SRC_FONT)

$(OUT_APP):
mkdir $(OUT_DIR)
$(CC_PREFIX_FINAL) $(CC_EXTRA) -I$(LIBS) -I$(LIBS_HAL) -I$(HELPERS) -I$(EXT_LIB_ALL) $(SRC_APP) $(SOURCES) -lSDL2 -lSDL2_ttf -lm -o $(OUT_APP)
$(CC_PREFIX_FINAL) $(CC_EXTRA) -I$(LIBS) -I$(LIBS_HAL) -I$(HELPERS) -I$(EXT_LIB_ALL) $(SRC_APP) $(SOURCES) -lSDL2 -lSDL2_ttf -lm -lbsd -o $(OUT_APP)

#$(BUILD_LIB_heatshrink):
# make -C lib/heatshrink libraries
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ Packages `make`, `gcc`, `libsdl2-dev`
- FuriSemaphores
- FuriMutexes
- FuriPubSubs
- FuriEventFlags
- FuriApiLocks
- Timers
- Crashing
- CLI (although very limited)
Expand All @@ -39,6 +41,7 @@ Packages `make`, `gcc`, `libsdl2-dev`
- [x] Use ~~GTK~~ SDL instead of ncurses
- [ ] Write support for FuriTypes (FuriString, FuriMutex, etc.)
- [ ] Add settings to the notification service
- [ ] Storage CLI


### Uhm, akstually, it is not an emulator 🤓☝️...
Expand Down
6 changes: 3 additions & 3 deletions flipper/core/check.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@

#define furi_assert( ... ) \
if(!(__VA_ARGS__)) \
crash(CRASH_ASSERT_FAILED, "Assertion failed!");
crash(CRASH_ASSERT_FAILED, CRASHTEXT_ASSERT_FAILED);

#define furi_check( ... ) \
if(!(__VA_ARGS__)) \
crash(CRASH_CHECK_FAILED, "Check failed!");
crash(CRASH_CHECK_FAILED, CRASHTEXT_CHECK_FAILED);

#define furi_crash( ... ) \
crash(CRASH_UNKNOWN, "Unknown error!");
crash(CRASH_UNKNOWN, CRASHTEXT_UNKNOWN);
77 changes: 77 additions & 0 deletions flipper/core/event_flag.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#include "event_flag.h"
#include "common_defines.h"
#include "check.h"

#include <pthread.h>
#include <time.h>

#define FURI_EVENT_FLAG_MAX_BITS_EVENT_GROUPS 24U
#define FURI_EVENT_FLAG_INVALID_BITS (~((1UL << FURI_EVENT_FLAG_MAX_BITS_EVENT_GROUPS) - 1U))

FuriEventFlag* furi_event_flag_alloc() {
uint32_t* flags = malloc(sizeof(uint32_t));
return (FuriEventFlag*)flags;
}

void furi_event_flag_free(FuriEventFlag* instance) {
free(instance);
}

uint32_t furi_event_flag_set(FuriEventFlag* instance, uint32_t flags) {
furi_assert(instance);

(*instance) = flags;
return flags;
}

uint32_t furi_event_flag_clear(FuriEventFlag* instance, uint32_t flags) {
furi_assert(instance);

(*instance) = 0;
return 0;
}

uint32_t furi_event_flag_get(FuriEventFlag* instance) {
furi_assert(instance);

return *instance;
}

bool done;

typedef struct {
FuriEventFlag* flag;
uint32_t val;
} FuriEventFlagCtx;

static void* acquire_cb(void* ctx_) {
FuriEventFlagCtx* ctx = ctx_;
while((*ctx->flag) != ctx->val)
furi_delay_tick(1);
done = true;
return NULL;
}

uint32_t furi_event_flag_wait(
FuriEventFlag* instance,
uint32_t flags,
uint32_t options,
uint32_t timeout) {
UNUSED(options);

furi_assert(instance);
done = false;
pthread_t thread_id;
FuriEventFlagCtx ctx = { instance, flags };
pthread_create(&thread_id, NULL, acquire_cb, &ctx);
uint64_t start_time = (uint64_t)time(NULL);
while(true) {
furi_delay_tick(1);
if(done) break;
if((uint64_t)time(NULL) >= start_time + timeout) {
pthread_cancel(thread_id);
return 0;
}
}
return flags;
}
71 changes: 71 additions & 0 deletions flipper/core/event_flag.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/**
* @file event_flag.h
* Furi Event Flag
*/
#pragma once

#include "base.h"
#include "kernel.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef uint32_t FuriEventFlag;

/** Allocate FuriEventFlag
*
* @return pointer to FuriEventFlag
*/
FuriEventFlag* furi_event_flag_alloc();

/** Deallocate FuriEventFlag
*
* @param instance pointer to FuriEventFlag
*/
void furi_event_flag_free(FuriEventFlag* instance);

/** Set flags
*
* @param instance pointer to FuriEventFlag
* @param[in] flags The flags
*
* @return Resulting flags or error (FuriStatus)
*/
uint32_t furi_event_flag_set(FuriEventFlag* instance, uint32_t flags);

/** Clear flags
*
* @param instance pointer to FuriEventFlag
* @param[in] flags The flags
*
* @return Resulting flags or error (FuriStatus)
*/
uint32_t furi_event_flag_clear(FuriEventFlag* instance, uint32_t flags);

/** Get flags
*
* @param instance pointer to FuriEventFlag
*
* @return Resulting flags
*/
uint32_t furi_event_flag_get(FuriEventFlag* instance);

/** Wait flags
*
* @param instance pointer to FuriEventFlag
* @param[in] flags The flags
* @param[in] options The option flags
* @param[in] timeout The timeout
*
* @return Resulting flags or error (FuriStatus)
*/
uint32_t furi_event_flag_wait(
FuriEventFlag* instance,
uint32_t flags,
uint32_t options,
uint32_t timeout);

#ifdef __cplusplus
}
#endif
9 changes: 9 additions & 0 deletions flipper/core/message_queue.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "message_queue.h"
#include "core_defines.h"
#include "kernel.h"
#include "check.h"
#include <flippulator_defines.h>

FuriMessageQueue* furi_message_queue_alloc(uint32_t msg_count, uint32_t msg_size) {
Expand All @@ -16,11 +17,13 @@ FuriMessageQueue* furi_message_queue_alloc(uint32_t msg_count, uint32_t msg_size
}

void furi_message_queue_free(FuriMessageQueue* queue) {
furi_assert(queue);
free(queue);
}

FuriStatus furi_message_queue_put(FuriMessageQueue* queue, const void* msg_ptr, uint32_t timeout) {
UNUSED(timeout);
furi_assert(queue);
const uint32_t pointer = ((uint32_t*) queue)[0];
const uint32_t count = ((uint32_t*) queue)[1];
const uint32_t size = ((uint32_t*) queue)[2];
Expand All @@ -32,6 +35,7 @@ FuriStatus furi_message_queue_put(FuriMessageQueue* queue, const void* msg_ptr,

FuriStatus furi_message_queue_get(FuriMessageQueue* queue, void* msg_ptr, uint32_t timeout) {
UNUSED(timeout);
furi_assert(queue);
const uint32_t pointer = ((uint32_t*) queue)[0];
const uint32_t size = ((uint32_t*) queue)[2];
if(pointer == 0) return FuriStatusError;
Expand All @@ -45,22 +49,27 @@ FuriStatus furi_message_queue_get(FuriMessageQueue* queue, void* msg_ptr, uint32
}

uint32_t furi_message_queue_get_capacity(FuriMessageQueue* queue) {
furi_assert(queue);
return ((uint32_t*) queue)[1];
}

uint32_t furi_message_queue_get_message_size(FuriMessageQueue* queue) {
furi_assert(queue);
return ((uint32_t*) queue)[2];
}

uint32_t furi_message_queue_get_count(FuriMessageQueue* queue) {
furi_assert(queue);
return ((uint32_t*) queue)[0];
}

uint32_t furi_message_queue_get_space(FuriMessageQueue* queue) {
furi_assert(queue);
return furi_message_queue_get_capacity(queue) - furi_message_queue_get_count(queue);
}

FuriStatus furi_message_queue_reset(FuriMessageQueue* queue) {
furi_assert(queue);
((uint32_t*) queue)[0] = 0;
return FuriStatusOk;
}
18 changes: 3 additions & 15 deletions flipper/furi.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,12 @@
#include "gui/gui_srv.h"
#include "notification/notification_app.h"
#include "cli/cli.h"
#include "storage/storage.h"

// Termios
#include <termios.h>

/*void furi_assert(void* expr) {
if(!expr)
crash(CRASH_ASSERT_FAILED, "Assertion failed!");
}
void furi_check(void* expr) {
if(!expr)
crash(CRASH_CHECK_FAILED, "Check failed!");
}*/

void furi_init() {
/*setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);*/
// setbuf(stdin, NULL);
// setbuf(stdout, NULL);
// setbuf(stderr, NULL);
printf("Started initializing...\n");
if(!furi_record_status()) {
furi_record_init();
Expand All @@ -33,6 +19,8 @@ void furi_init() {
printf("Initialized the GUI service.\n");
notification_srv_init();
printf("Initialized the notification service.\n");
// storage_srv(NULL);
// printf("Initialized the storage service.\n");
cli_srv(NULL);
printf("Initialized the CLI service.\n");
}
1 change: 1 addition & 0 deletions flipper/furi.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@
#include "core/mutex.h"
#include "core/semaphore.h"
#include "core/pubsub.h"
#include "core/event_flag.h"

void furi_init();
2 changes: 1 addition & 1 deletion flipper/notification/notification_app.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ static void* notification_cb(void* ctx) {
case NotificationMessageTypeLcdContrastUpdate:
break;
default:
crash(CRASH_UNKNOWN_NOTIFICATION_MESSAGE_TYPE, "Unknown notification type");
crash(CRASH_UNKNOWN_NOTIFICATION_MESSAGE_TYPE, CRASHTEXT_UNKNOWN_NOTIFICATION_MESSAGE_TYPE);
}
notification_message = (*message.sequence)[++notification_message_index];
}
Expand Down
4 changes: 4 additions & 0 deletions flipper/storage/filesystem_api_internal.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#pragma once
#include <furi.h>
#include <stdio.h>
#include <dirent.h>
#include "filesystem_api_defines.h"

#ifdef __cplusplus
Expand All @@ -15,6 +17,8 @@ typedef enum {

/** Structure that hold file index and returned api errors */
struct File {
FILE* file; /**< File sturct */
DIR* dir;
uint32_t file_id; /**< File ID for internal references */
FileType type;
FS_Error error_id; /**< Standard API error from FS_Error enum */
Expand Down
Loading

0 comments on commit aa0c0d4

Please sign in to comment.