Denis Nelubin 3 лет назад
Родитель
Сommit
6189edcbe6
5 измененных файлов с 112 добавлено и 0 удалено
  1. 15 0
      Makefile
  2. BIN
      assets/dino.png
  3. 9 0
      assets_icons.c
  4. 5 0
      assets_icons.h
  5. 83 0
      trexrunner.c

+ 15 - 0
Makefile

@@ -0,0 +1,15 @@
+FLIPPER_FIRMWARE_PATH ?= /home/gelin/work/github/flipperzero-firmware/
+
+.PHONY: build
+build: $(FLIPPER_FIRMWARE_PATH)/applications_user/t-rex-runner
+	cd $(FLIPPER_FIRMWARE_PATH) && ./fbt firmware_t-rex-runner
+
+.PHONY: launch
+launch: $(FLIPPER_FIRMWARE_PATH)/applications_user/t-rex-runner
+	cd $(FLIPPER_FIRMWARE_PATH) && ./fbt launch_app APPSRC=applications_user/t-rex-runner
+
+assets_icons.c: $(FLIPPER_FIRMWARE_PATH)/applications_user/t-rex-runner
+	cd $(FLIPPER_FIRMWARE_PATH) && ./scripts/assets.py icons applications_user/t-rex-runner/assets/ applications_user/t-rex-runner/
+
+$(FLIPPER_FIRMWARE_PATH)/applications_user/t-rex-runner:
+	ln -s $(PWD) $(FLIPPER_FIRMWARE_PATH)/applications_user/t-rex-runner

BIN
assets/dino.png


+ 9 - 0
assets_icons.c

@@ -0,0 +1,9 @@
+#include "assets_icons.h"
+
+#include <gui/icon_i.h>
+
+const uint8_t _I_dino_0[] = {0x01,0x00,0x3d,0x00,0x80,0x7e,0x20,0xf0,0x0f,0xe4,0x3e,0x01,0xec,0x01,0x08,0x14,0x80,0x4b,0x7c,0x0a,0x0f,0xf2,0x07,0x01,0x9f,0x40,0x30,0x33,0xf8,0x07,0x0f,0xff,0x00,0xf3,0xef,0xe0,0x1f,0xf0,0x40,0x80,0x8b,0xfd,0x1f,0x0b,0x08,0x08,0x7f,0x01,0xf1,0xf8,0x0c,0x47,0xc1,0x06,0x80,0x58,0x20,0x90,0x09,0x00,0x08,0x6c,0x10,0xc8,0x00,};
+const uint8_t* const _I_dino[] = {_I_dino_0};
+
+const Icon I_dino = {.width=20,.height=22,.frame_count=1,.frame_rate=0,.frames=_I_dino};
+

+ 5 - 0
assets_icons.h

@@ -0,0 +1,5 @@
+#pragma once
+
+#include <gui/icon.h>
+
+extern const Icon I_dino;

+ 83 - 0
trexrunner.c

@@ -4,8 +4,91 @@
 #include <input/input.h>
 #include <stdlib.h>
 
+#include "assets_icons.h"
+
+typedef enum {
+    EventTypeTick,
+    EventTypeKey,
+} EventType;
+
+typedef struct {
+    EventType type;
+    InputEvent input;
+} PluginEvent;
+
+static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
+    furi_assert(event_queue);
+
+    PluginEvent event = {.type = EventTypeKey, .input = *input_event};
+    furi_message_queue_put(event_queue, &event, FuriWaitForever);
+}
+
+static void render_callback(Canvas* const canvas, void* ctx) {
+  UNUSED(ctx);
+
+//  canvas_draw_xbm(canvas, 0, 0, dino_width, dino_height, dino_bits);
+  canvas_draw_icon(canvas, 0, 0, &I_dino);
+}
+
 int32_t trexrunner_app(void* p) {
   UNUSED(p);
 
+  FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent));
+
+//  ValueMutex state_mutex;
+//  if (!init_mutex(&state_mutex, minesweeper_state, sizeof(minesweeper_state))) {
+//      FURI_LOG_E("t-rex runner", "cannot create mutex\r\n");
+//        free(minesweeper_state);
+//      return 255;
+//  }
+  // BEGIN IMPLEMENTATION
+
+  // Set system callbacks
+  ViewPort* view_port = view_port_alloc();
+  view_port_draw_callback_set(view_port, render_callback, view_port);
+  view_port_input_callback_set(view_port, input_callback, event_queue);
+
+  // Open GUI and register view_port
+  Gui* gui = furi_record_open("gui");
+  gui_add_view_port(gui, view_port, GuiLayerFullscreen);
+
+  PluginEvent event;
+  for (bool processing = true; processing;) {
+    FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
+//    Minesweeper* minesweeper_state = (Minesweeper*)acquire_mutex_block(&state_mutex);
+    if (event_status == FuriStatusOk) {
+      // press events
+      if (event.type == EventTypeKey) {
+        if (event.input.type == InputTypeShort) {
+          switch (event.input.key) {
+          case InputKeyUp: break;
+          case InputKeyDown: break;
+          case InputKeyLeft: break;
+          case InputKeyRight: break;
+          case InputKeyOk: break;
+          case InputKeyBack:
+            // Exit the app
+            processing = false;
+            break;
+          }
+        }
+      }
+    } else {
+      // event timeout
+      ;
+    }
+    view_port_update(view_port);
+//    release_mutex(&state_mutex, minesweeper_state);
+  }
+
+  view_port_enabled_set(view_port, false);
+  gui_remove_view_port(gui, view_port);
+  furi_record_close("gui");
+  view_port_free(view_port);
+  furi_message_queue_free(event_queue);
+//  delete_mutex(&state_mutex);
+//  furi_timer_free(minesweeper_state->timer);
+//  free(minesweeper_state);
+
   return 0;
 }