Skip to content

Commit 606389c

Browse files
committed
Add all current updates
1 parent aaea283 commit 606389c

File tree

6 files changed

+805
-788
lines changed

6 files changed

+805
-788
lines changed

application.fam

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
App(
2-
appid="gps",
3-
name="GPS",
2+
appid="gps_nmea",
3+
name="[NMEA] GPS",
44
apptype=FlipperAppType.EXTERNAL,
55
entry_point="gps_app",
6-
cdefines=["APP_GPS"],
76
requires=["gui"],
87
stack_size=1 * 1024,
98
order=35,

gps.c

+165-101
Original file line numberDiff line numberDiff line change
@@ -4,123 +4,187 @@
44
#include <gui/gui.h>
55
#include <string.h>
66

7-
typedef enum
8-
{
9-
EventTypeTick,
10-
EventTypeKey,
7+
typedef enum {
8+
EventTypeTick,
9+
EventTypeKey,
1110
} EventType;
1211

13-
typedef struct
14-
{
15-
EventType type;
16-
InputEvent input;
12+
typedef struct {
13+
EventType type;
14+
InputEvent input;
1715
} PluginEvent;
1816

19-
static void render_callback(Canvas* const canvas, void* context)
20-
{
21-
const GpsUart* gps_uart = (GpsUart*)context;
22-
furi_mutex_acquire(gps_uart->mutex, FuriWaitForever);
23-
24-
canvas_set_font(canvas, FontPrimary);
25-
canvas_draw_str_aligned(canvas, 32, 8, AlignCenter, AlignBottom, "Latitude");
26-
canvas_draw_str_aligned(canvas, 96, 8, AlignCenter, AlignBottom, "Longitude");
27-
canvas_draw_str_aligned(canvas, 21, 30, AlignCenter, AlignBottom, "Course");
28-
canvas_draw_str_aligned(canvas, 64, 30, AlignCenter, AlignBottom, "Speed");
29-
canvas_draw_str_aligned(canvas, 107, 30, AlignCenter, AlignBottom, "Altitude");
30-
canvas_draw_str_aligned(canvas, 32, 52, AlignCenter, AlignBottom, "Satellites");
31-
canvas_draw_str_aligned(canvas, 96, 52, AlignCenter, AlignBottom, "Last Fix");
32-
33-
canvas_set_font(canvas, FontSecondary);
34-
char buffer[64];
35-
snprintf(buffer, 64, "%f", (double)gps_uart->status.latitude);
36-
canvas_draw_str_aligned(canvas, 32, 18, AlignCenter, AlignBottom, buffer);
37-
snprintf(buffer, 64, "%f", (double)gps_uart->status.longitude);
38-
canvas_draw_str_aligned(canvas, 96, 18, AlignCenter, AlignBottom, buffer);
39-
snprintf(buffer, 64, "%.1f", (double)gps_uart->status.course);
40-
canvas_draw_str_aligned(canvas, 21, 40, AlignCenter, AlignBottom, buffer);
41-
snprintf(buffer, 64, "%.2f kn", (double)gps_uart->status.speed);
42-
canvas_draw_str_aligned(canvas, 64, 40, AlignCenter, AlignBottom, buffer);
43-
snprintf(buffer, 64, "%.1f %c", (double)gps_uart->status.altitude, tolower(gps_uart->status.altitude_units));
44-
canvas_draw_str_aligned(canvas, 107, 40, AlignCenter, AlignBottom, buffer);
45-
snprintf(buffer, 64, "%d", gps_uart->status.satellites_tracked);
46-
canvas_draw_str_aligned(canvas, 32, 62, AlignCenter, AlignBottom, buffer);
47-
snprintf(buffer, 64, "%02d:%02d:%02d UTC", gps_uart->status.time_hours, gps_uart->status.time_minutes,
48-
gps_uart->status.time_seconds);
49-
canvas_draw_str_aligned(canvas, 96, 62, AlignCenter, AlignBottom, buffer);
50-
51-
furi_mutex_release(gps_uart->mutex);
52-
}
17+
static void render_callback(Canvas* const canvas, void* context) {
18+
furi_assert(context);
19+
GpsUart* gps_uart = context;
20+
furi_mutex_acquire(gps_uart->mutex, FuriWaitForever);
5321

54-
static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue)
55-
{
56-
furi_assert(event_queue);
22+
if(!gps_uart->changing_baudrate) {
23+
canvas_set_font(canvas, FontPrimary);
24+
canvas_draw_str_aligned(canvas, 32, 8, AlignCenter, AlignBottom, "Latitude");
25+
canvas_draw_str_aligned(canvas, 96, 8, AlignCenter, AlignBottom, "Longitude");
26+
canvas_draw_str_aligned(canvas, 21, 30, AlignCenter, AlignBottom, "Course");
27+
canvas_draw_str_aligned(canvas, 64, 30, AlignCenter, AlignBottom, "Speed");
28+
canvas_draw_str_aligned(canvas, 107, 30, AlignCenter, AlignBottom, "Altitude");
29+
canvas_draw_str_aligned(canvas, 32, 52, AlignCenter, AlignBottom, "Satellites");
30+
canvas_draw_str_aligned(canvas, 96, 52, AlignCenter, AlignBottom, "Last Fix");
31+
32+
canvas_set_font(canvas, FontSecondary);
33+
char buffer[64];
34+
snprintf(buffer, 64, "%f", (double)gps_uart->status.latitude);
35+
canvas_draw_str_aligned(canvas, 32, 18, AlignCenter, AlignBottom, buffer);
36+
snprintf(buffer, 64, "%f", (double)gps_uart->status.longitude);
37+
canvas_draw_str_aligned(canvas, 96, 18, AlignCenter, AlignBottom, buffer);
38+
snprintf(buffer, 64, "%.1f", (double)gps_uart->status.course);
39+
canvas_draw_str_aligned(canvas, 21, 40, AlignCenter, AlignBottom, buffer);
40+
if(!gps_uart->speed_in_kms) {
41+
snprintf(buffer, 64, "%.2f kn", (double)gps_uart->status.speed);
42+
} else {
43+
snprintf(buffer, 64, "%.2f km", (double)(gps_uart->status.speed * 1.852));
44+
}
45+
canvas_draw_str_aligned(canvas, 64, 40, AlignCenter, AlignBottom, buffer);
46+
snprintf(
47+
buffer,
48+
64,
49+
"%.1f %c",
50+
(double)gps_uart->status.altitude,
51+
tolower(gps_uart->status.altitude_units));
52+
canvas_draw_str_aligned(canvas, 107, 40, AlignCenter, AlignBottom, buffer);
53+
snprintf(buffer, 64, "%d", gps_uart->status.satellites_tracked);
54+
canvas_draw_str_aligned(canvas, 32, 62, AlignCenter, AlignBottom, buffer);
55+
snprintf(
56+
buffer,
57+
64,
58+
"%02d:%02d:%02d UTC",
59+
gps_uart->status.time_hours,
60+
gps_uart->status.time_minutes,
61+
gps_uart->status.time_seconds);
62+
canvas_draw_str_aligned(canvas, 96, 62, AlignCenter, AlignBottom, buffer);
63+
} else {
64+
char buffer[64];
65+
canvas_set_font(canvas, FontPrimary);
66+
canvas_draw_str_aligned(canvas, 64, 32, AlignCenter, AlignBottom, "Baudrate set to:");
67+
68+
snprintf(buffer, 64, "%ld baud", gps_uart->baudrate);
69+
canvas_draw_str_aligned(canvas, 64, 47, AlignCenter, AlignBottom, buffer);
70+
}
5771

58-
PluginEvent event = {.type = EventTypeKey, .input = *input_event};
59-
furi_message_queue_put(event_queue, &event, FuriWaitForever);
72+
furi_mutex_release(gps_uart->mutex);
6073
}
6174

62-
int32_t gps_app(void* p)
63-
{
64-
UNUSED(p);
65-
66-
FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent));
75+
static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
76+
furi_assert(event_queue);
6777

68-
GpsUart* gps_uart = gps_uart_enable();
69-
if (gps_uart == NULL)
70-
{
71-
return 255;
72-
}
78+
PluginEvent event = {.type = EventTypeKey, .input = *input_event};
79+
furi_message_queue_put(event_queue, &event, FuriWaitForever);
80+
}
7381

74-
// set system callbacks
75-
ViewPort* view_port = view_port_alloc();
76-
view_port_draw_callback_set(view_port, render_callback, gps_uart);
77-
view_port_input_callback_set(view_port, input_callback, event_queue);
82+
int32_t gps_app(void* p) {
83+
UNUSED(p);
7884

79-
// open GUI and register view_port
80-
Gui* gui = furi_record_open("gui");
81-
gui_add_view_port(gui, view_port, GuiLayerFullscreen);
85+
FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent));
8286

83-
PluginEvent event;
84-
for (bool processing = true; processing;)
85-
{
86-
FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
87+
GpsUart* gps_uart = gps_uart_enable();
8788

88-
furi_mutex_acquire(gps_uart->mutex, FuriWaitForever);
89+
gps_uart->mutex = furi_mutex_alloc(FuriMutexTypeNormal);
90+
if(!gps_uart->mutex) {
91+
FURI_LOG_E("GPS", "cannot create mutex\r\n");
92+
free(gps_uart);
93+
return 255;
94+
}
8995

90-
if (event_status == FuriStatusOk)
91-
{
92-
// press events
93-
if (event.type == EventTypeKey)
94-
{
95-
if (event.input.type == InputTypePress)
96-
{
97-
switch (event.input.key)
98-
{
99-
case InputKeyBack:
100-
processing = false;
101-
break;
102-
default:
103-
break;
104-
}
96+
// set system callbacks
97+
ViewPort* view_port = view_port_alloc();
98+
view_port_draw_callback_set(view_port, render_callback, gps_uart);
99+
view_port_input_callback_set(view_port, input_callback, event_queue);
100+
101+
// open GUI and register view_port
102+
Gui* gui = furi_record_open(RECORD_GUI);
103+
gui_add_view_port(gui, view_port, GuiLayerFullscreen);
104+
105+
PluginEvent event;
106+
for(bool processing = true; processing;) {
107+
FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
108+
109+
furi_mutex_acquire(gps_uart->mutex, FuriWaitForever);
110+
111+
if(event_status == FuriStatusOk) {
112+
// press events
113+
if(event.type == EventTypeKey) {
114+
if(event.input.type == InputTypeShort) {
115+
switch(event.input.key) {
116+
case InputKeyUp:
117+
case InputKeyDown:
118+
case InputKeyRight:
119+
case InputKeyLeft:
120+
case InputKeyBack:
121+
break;
122+
case InputKeyOk:
123+
if(!gps_uart->backlight_on) {
124+
notification_message_block(
125+
gps_uart->notifications, &sequence_display_backlight_enforce_on);
126+
gps_uart->backlight_on = true;
127+
} else {
128+
notification_message_block(
129+
gps_uart->notifications, &sequence_display_backlight_enforce_auto);
130+
notification_message(
131+
gps_uart->notifications, &sequence_display_backlight_off);
132+
gps_uart->backlight_on = false;
133+
}
134+
break;
135+
default:
136+
break;
137+
}
138+
} else if(event.input.type == InputTypeLong) {
139+
switch(event.input.key) {
140+
case InputKeyUp:
141+
gps_uart_deinit_thread(gps_uart);
142+
const int baudrate_length =
143+
sizeof(gps_baudrates) / sizeof(gps_baudrates[0]);
144+
current_gps_baudrate++;
145+
if(current_gps_baudrate >= baudrate_length) {
146+
current_gps_baudrate = 0;
147+
}
148+
gps_uart->baudrate = gps_baudrates[current_gps_baudrate];
149+
150+
gps_uart_init_thread(gps_uart);
151+
gps_uart->changing_baudrate = true;
152+
view_port_update(view_port);
153+
furi_mutex_release(gps_uart->mutex);
154+
break;
155+
case InputKeyRight:
156+
if(gps_uart->speed_in_kms) {
157+
gps_uart->speed_in_kms = false;
158+
} else {
159+
gps_uart->speed_in_kms = true;
160+
}
161+
break;
162+
case InputKeyBack:
163+
processing = false;
164+
break;
165+
default:
166+
break;
167+
}
168+
}
169+
}
170+
}
171+
if(!gps_uart->changing_baudrate) {
172+
view_port_update(view_port);
173+
furi_mutex_release(gps_uart->mutex);
174+
} else {
175+
furi_delay_ms(1000);
176+
gps_uart->changing_baudrate = false;
105177
}
106-
}
107-
}
108-
else
109-
{
110-
FURI_LOG_D("GPS", "FuriMessageQueue: event timeout");
111178
}
112179

113-
view_port_update(view_port);
114-
furi_mutex_release(gps_uart->mutex);
115-
}
116-
117-
view_port_enabled_set(view_port, false);
118-
gui_remove_view_port(gui, view_port);
119-
furi_record_close("gui");
120-
view_port_free(view_port);
121-
furi_message_queue_free(event_queue);
122-
furi_mutex_free(gps_uart->mutex);
123-
gps_uart_disable(gps_uart);
180+
notification_message_block(gps_uart->notifications, &sequence_display_backlight_enforce_auto);
181+
view_port_enabled_set(view_port, false);
182+
gui_remove_view_port(gui, view_port);
183+
furi_record_close(RECORD_GUI);
184+
view_port_free(view_port);
185+
furi_message_queue_free(event_queue);
186+
furi_mutex_free(gps_uart->mutex);
187+
gps_uart_disable(gps_uart);
124188

125-
return 0;
189+
return 0;
126190
}

0 commit comments

Comments
 (0)