|
@@ -46,15 +46,13 @@ typedef struct
|
|
|
bool dpad;
|
|
bool dpad;
|
|
|
int row;
|
|
int row;
|
|
|
int column;
|
|
int column;
|
|
|
|
|
+ FuriMutex* mutex;
|
|
|
} Coleco;
|
|
} Coleco;
|
|
|
|
|
|
|
|
static void render_callback(Canvas* const canvas, void* context)
|
|
static void render_callback(Canvas* const canvas, void* context)
|
|
|
{
|
|
{
|
|
|
- Coleco* coleco = acquire_mutex((ValueMutex*)context, 25);
|
|
|
|
|
- if (coleco == NULL)
|
|
|
|
|
- {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ Coleco* coleco = (Coleco*)context;
|
|
|
|
|
+ furi_mutex_acquire(coleco->mutex, FuriWaitForever);
|
|
|
|
|
|
|
|
if (coleco->dpad)
|
|
if (coleco->dpad)
|
|
|
{
|
|
{
|
|
@@ -95,7 +93,7 @@ static void render_callback(Canvas* const canvas, void* context)
|
|
|
canvas_draw_icon(canvas, 109, 4,
|
|
canvas_draw_icon(canvas, 109, 4,
|
|
|
(coleco->row == 4 && coleco->column == 2) ? &I_ColecoPound_hvr_17x17 : &I_ColecoPound_17x17);
|
|
(coleco->row == 4 && coleco->column == 2) ? &I_ColecoPound_hvr_17x17 : &I_ColecoPound_17x17);
|
|
|
|
|
|
|
|
- release_mutex((ValueMutex*)context, coleco);
|
|
|
|
|
|
|
+ furi_mutex_release(coleco->mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue)
|
|
static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue)
|
|
@@ -146,6 +144,14 @@ static Coleco* coleco_alloc()
|
|
|
coleco->row = 0;
|
|
coleco->row = 0;
|
|
|
coleco->column = 1;
|
|
coleco->column = 1;
|
|
|
|
|
|
|
|
|
|
+ coleco->mutex = furi_mutex_alloc(FuriMutexTypeNormal);
|
|
|
|
|
+ if (!coleco->mutex)
|
|
|
|
|
+ {
|
|
|
|
|
+ FURI_LOG_E("Coleco", "cannot create mutex\r\n");
|
|
|
|
|
+ free(coleco);
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return coleco;
|
|
return coleco;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -153,6 +159,7 @@ static void coleco_free(Coleco* coleco)
|
|
|
{
|
|
{
|
|
|
furi_assert(coleco);
|
|
furi_assert(coleco);
|
|
|
|
|
|
|
|
|
|
+ furi_mutex_free(coleco->mutex);
|
|
|
free(coleco);
|
|
free(coleco);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -163,18 +170,14 @@ int32_t coleco_app(void* p)
|
|
|
FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent));
|
|
FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent));
|
|
|
|
|
|
|
|
Coleco* coleco = coleco_alloc();
|
|
Coleco* coleco = coleco_alloc();
|
|
|
-
|
|
|
|
|
- ValueMutex coleco_mutex;
|
|
|
|
|
- if (!init_mutex(&coleco_mutex, coleco, sizeof(Coleco)))
|
|
|
|
|
|
|
+ if (coleco == NULL)
|
|
|
{
|
|
{
|
|
|
- FURI_LOG_E("Coleco", "cannot create mutex\r\n");
|
|
|
|
|
- coleco_free(coleco);
|
|
|
|
|
return 255;
|
|
return 255;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// set system callbacks
|
|
// set system callbacks
|
|
|
ViewPort* view_port = view_port_alloc();
|
|
ViewPort* view_port = view_port_alloc();
|
|
|
- view_port_draw_callback_set(view_port, render_callback, &coleco_mutex);
|
|
|
|
|
|
|
+ view_port_draw_callback_set(view_port, render_callback, coleco);
|
|
|
view_port_input_callback_set(view_port, input_callback, event_queue);
|
|
view_port_input_callback_set(view_port, input_callback, event_queue);
|
|
|
|
|
|
|
|
// open GUI and register view_port
|
|
// open GUI and register view_port
|
|
@@ -189,7 +192,7 @@ int32_t coleco_app(void* p)
|
|
|
{
|
|
{
|
|
|
FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
|
|
FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
|
|
|
|
|
|
|
|
- Coleco* coleco = (Coleco*)acquire_mutex_block(&coleco_mutex);
|
|
|
|
|
|
|
+ furi_mutex_acquire(coleco->mutex, FuriWaitForever);
|
|
|
|
|
|
|
|
if (event_status == FuriStatusOk)
|
|
if (event_status == FuriStatusOk)
|
|
|
{
|
|
{
|
|
@@ -402,7 +405,7 @@ int32_t coleco_app(void* p)
|
|
|
FURI_LOG_D("Coleco", "FuriMessageQueue: event timeout");
|
|
FURI_LOG_D("Coleco", "FuriMessageQueue: event timeout");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- release_mutex(&coleco_mutex, coleco);
|
|
|
|
|
|
|
+ furi_mutex_release(coleco->mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
furi_hal_power_disable_otg();
|
|
furi_hal_power_disable_otg();
|
|
@@ -412,7 +415,6 @@ int32_t coleco_app(void* p)
|
|
|
furi_record_close("gui");
|
|
furi_record_close("gui");
|
|
|
view_port_free(view_port);
|
|
view_port_free(view_port);
|
|
|
furi_message_queue_free(event_queue);
|
|
furi_message_queue_free(event_queue);
|
|
|
- delete_mutex(&coleco_mutex);
|
|
|
|
|
coleco_free(coleco);
|
|
coleco_free(coleco);
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|