Skip to content

Commit de62fef

Browse files
committed
Amperka example
0 parents  commit de62fef

File tree

5 files changed

+185
-0
lines changed

5 files changed

+185
-0
lines changed

application.fam

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
App(
2+
appid="example_5",
3+
name="Example 5 application",
4+
apptype=FlipperAppType.EXTERNAL,
5+
entry_point="example_5_app",
6+
cdefines=["APP_EXAMPLE_5"],
7+
requires=[
8+
"gui",
9+
],
10+
stack_size=1 * 1024,
11+
order=90,
12+
fap_icon="emoji_smile_icon_10x10px.png",
13+
fap_category="Misc",
14+
fap_icon_assets="images",
15+
)

emoji_smile_icon_10x10px.png

973 Bytes
Loading

example_5_app.c

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
2+
#include "example_5_app.h"
3+
4+
#include <furi.h>
5+
#include <gui/gui.h>
6+
#include <gui/elements.h>
7+
#include <input/input.h>
8+
#include <notification/notification_messages.h>
9+
10+
static void example_5_app_draw_callback(Canvas* canvas, void* ctx) {
11+
furi_assert(ctx);
12+
Example5App* app = ctx;
13+
14+
canvas_clear(canvas);
15+
16+
DrawMode mode = app->draw_mode;
17+
if(mode == DRAW_ONLY_PICTURES || mode == DRAW_ALL)
18+
canvas_draw_icon(canvas, 0, 29, &I_amperka_ru_logo_128x35px);
19+
if(mode == DRAW_ONLY_TEXT || mode == DRAW_ALL) {
20+
canvas_set_font(canvas, FontPrimary);
21+
canvas_draw_str(canvas, 4, 8, "This is an example app!");
22+
canvas_set_font(canvas, FontSecondary);
23+
elements_multiline_text_aligned(
24+
canvas,
25+
127,
26+
15,
27+
AlignRight,
28+
AlignTop,
29+
"Some long long long long \n aligned multiline text");
30+
}
31+
}
32+
33+
static void example_5_app_input_callback(InputEvent* input_event, void* ctx) {
34+
furi_assert(ctx);
35+
36+
FuriMessageQueue* event_queue = ctx;
37+
furi_message_queue_put(event_queue, input_event, FuriWaitForever);
38+
}
39+
40+
Example5App* example_5_app_alloc() {
41+
Example5App* app = malloc(sizeof(Example5App));
42+
43+
app->view_port = view_port_alloc();
44+
app->event_queue = furi_message_queue_alloc(8, sizeof(InputEvent));
45+
46+
view_port_draw_callback_set(app->view_port, example_5_app_draw_callback, app);
47+
view_port_input_callback_set(app->view_port, example_5_app_input_callback, app->event_queue);
48+
49+
app->gui = furi_record_open(RECORD_GUI);
50+
gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen);
51+
52+
app->notifications = furi_record_open(RECORD_NOTIFICATION);
53+
54+
return app;
55+
}
56+
57+
void example_5_app_free(Example5App* app) {
58+
furi_assert(app);
59+
60+
view_port_enabled_set(app->view_port, false);
61+
gui_remove_view_port(app->gui, app->view_port);
62+
view_port_free(app->view_port);
63+
64+
furi_message_queue_free(app->event_queue);
65+
66+
furi_record_close(RECORD_GUI);
67+
furi_record_close(RECORD_NOTIFICATION);
68+
}
69+
70+
int32_t example_5_app(void* p) {
71+
UNUSED(p);
72+
Example5App* app = example_5_app_alloc();
73+
74+
InputEvent event;
75+
76+
while(1) {
77+
if(furi_message_queue_get(app->event_queue, &event, 100) == FuriStatusOk) {
78+
if(event.type == InputTypePress) {
79+
if(event.key == InputKeyBack)
80+
break;
81+
else if(event.key == InputKeyUp)
82+
notification_message(app->notifications, &example_led_sequence);
83+
else if(event.key == InputKeyDown)
84+
notification_message(app->notifications, &example_vibro_sequence);
85+
else if(event.key == InputKeyOk)
86+
notification_message(app->notifications, &example_sound_sequence);
87+
88+
} else if(event.type == InputTypeLong) {
89+
DrawMode mode = app->draw_mode;
90+
if(event.key == InputKeyLeft)
91+
app->draw_mode = (mode - 1 + TOTAL_DRAW_MODES) % TOTAL_DRAW_MODES;
92+
else if(event.key == InputKeyRight)
93+
app->draw_mode = (mode + 1) % TOTAL_DRAW_MODES;
94+
95+
view_port_update(app->view_port);
96+
}
97+
}
98+
}
99+
100+
example_5_app_free(app);
101+
return 0;
102+
}

example_5_app.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#pragma once
2+
3+
#include <furi.h>
4+
#include <gui/gui.h>
5+
#include <notification/notification_messages.h>
6+
7+
#include "example_5_icons.h"
8+
9+
typedef enum {
10+
DRAW_ALL,
11+
DRAW_ONLY_TEXT,
12+
DRAW_ONLY_PICTURES,
13+
TOTAL_DRAW_MODES = 3,
14+
} DrawMode;
15+
16+
struct Example5App {
17+
Gui* gui;
18+
ViewPort* view_port;
19+
FuriMessageQueue* event_queue;
20+
NotificationApp* notifications;
21+
22+
DrawMode draw_mode;
23+
};
24+
25+
typedef struct Example5App Example5App;
26+
27+
const NotificationSequence example_led_sequence = {
28+
&message_red_255,
29+
&message_blue_255,
30+
&message_delay_500,
31+
&message_red_0,
32+
&message_blue_0,
33+
&message_delay_500,
34+
&message_red_255,
35+
&message_blue_255,
36+
&message_delay_500,
37+
&message_red_0,
38+
&message_blue_0,
39+
&message_delay_500,
40+
&message_red_255,
41+
&message_blue_255,
42+
&message_delay_500,
43+
&message_red_0,
44+
&message_blue_0,
45+
NULL,
46+
};
47+
48+
const NotificationSequence example_vibro_sequence = {
49+
&message_vibro_on,
50+
&message_do_not_reset,
51+
&message_delay_1000,
52+
&message_delay_1000,
53+
&message_delay_1000,
54+
&message_vibro_off,
55+
NULL,
56+
};
57+
58+
const NotificationSequence example_sound_sequence = {
59+
&message_note_e5, &message_delay_100, &message_note_d5,
60+
&message_delay_100, &message_note_fs4, &message_delay_250,
61+
&message_note_gs4, &message_delay_250, &message_note_cs5,
62+
&message_delay_100, &message_note_b4, &message_delay_100,
63+
&message_note_d4, &message_delay_250, &message_note_e4,
64+
&message_delay_250, &message_note_b4, &message_delay_100,
65+
&message_note_a4, &message_delay_100, &message_note_cs4,
66+
&message_delay_250, &message_note_e4, &message_delay_250,
67+
&message_note_a4, &message_delay_500, NULL,
68+
};

images/amperka_ru_logo_128x35px.png

8.96 KB
Loading

0 commit comments

Comments
 (0)