mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-06-07 19:01:54 -07:00
Improve GPS NMEA UART plugin, update changelog
This commit is contained in:
+11
-7
@@ -1,11 +1,15 @@
|
||||
### New changes
|
||||
* SubGHz: AN-Motors AT4 + Alutech AT4N - Add Manually support
|
||||
* SubGHz: Aprimatic keeloq emulation support + Add Manually
|
||||
* NFC: MF Classic User Dict -> Fix deleting of the key in extra actions menu
|
||||
* Plugins: Update WiFi Marauder [(by 0xchocolate)](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion)
|
||||
* Plugins: Fix POCSAG pager `RIC:` text repetition and overlap (by @Willy-JL | PR #398)
|
||||
* OFW: NFC: MF Classic - Additional checks before invalidating the key (Fixes issues with not using MF keys from user dict)
|
||||
* OFW: Fix crash when emulating a DSGeneric key
|
||||
* SubGHz: Clear code in "Add Manually" scene (by @gid9798 | PR #403)
|
||||
* Infrared: Universal remote assets updated (by @amec0e | PR #404)
|
||||
* Plugins: GPS NMEA (UART) modifications
|
||||
```
|
||||
- Ability to change baudrate using Up button, hold button to switch between baudrates (9600, 57600, 115200) (i set 57600 as default)
|
||||
- Ok button will set backlight to always on mode, to disable press ok button again (it will restore default settings after app exit too)
|
||||
- Exit from app using long press on back button instead of short press, may be useful in case you want to turn backlight on and accidentally click back
|
||||
```
|
||||
* OFW: Picopass: Elite progress
|
||||
* OFW: Improved thread lifecycle
|
||||
* OFW: View Model: recursive mutex
|
||||
|
||||
#### [🎲 Download latest extra apps pack](https://github.com/xMasterX/all-the-plugins/archive/refs/heads/main.zip)
|
||||
|
||||
|
||||
@@ -9,6 +9,11 @@
|
||||
Heavy lifting (NMEA parsing) provided by [minmea], which is included in this
|
||||
repository.
|
||||
|
||||
## Modifications made by @xMasterX
|
||||
- Ability to change baudrate using Up button, hold button to switch between baudrates (9600, 57600, 115200) (i set 57600 as default)
|
||||
- Ok button will set backlight to always on mode, to disable press ok button again (it will restore default settings after app exit too)
|
||||
- Exit from app using long press on back button instead of short press, may be useful in case you want to turn backlight on and accidentally click back
|
||||
|
||||
## Hardware Setup
|
||||
|
||||
Connect the GPS module to power and the USART using GPIO pins 9 (3.3V), 11
|
||||
|
||||
+93
-40
@@ -16,45 +16,54 @@ typedef struct {
|
||||
|
||||
static void render_callback(Canvas* const canvas, void* context) {
|
||||
furi_assert(context);
|
||||
const GpsUart* gps_uart = context;
|
||||
GpsUart* gps_uart = context;
|
||||
furi_mutex_acquire(gps_uart->mutex, FuriWaitForever);
|
||||
|
||||
canvas_set_font(canvas, FontPrimary);
|
||||
canvas_draw_str_aligned(canvas, 32, 8, AlignCenter, AlignBottom, "Latitude");
|
||||
canvas_draw_str_aligned(canvas, 96, 8, AlignCenter, AlignBottom, "Longitude");
|
||||
canvas_draw_str_aligned(canvas, 21, 30, AlignCenter, AlignBottom, "Course");
|
||||
canvas_draw_str_aligned(canvas, 64, 30, AlignCenter, AlignBottom, "Speed");
|
||||
canvas_draw_str_aligned(canvas, 107, 30, AlignCenter, AlignBottom, "Altitude");
|
||||
canvas_draw_str_aligned(canvas, 32, 52, AlignCenter, AlignBottom, "Satellites");
|
||||
canvas_draw_str_aligned(canvas, 96, 52, AlignCenter, AlignBottom, "Last Fix");
|
||||
if(!gps_uart->changing_baudrate) {
|
||||
canvas_set_font(canvas, FontPrimary);
|
||||
canvas_draw_str_aligned(canvas, 32, 8, AlignCenter, AlignBottom, "Latitude");
|
||||
canvas_draw_str_aligned(canvas, 96, 8, AlignCenter, AlignBottom, "Longitude");
|
||||
canvas_draw_str_aligned(canvas, 21, 30, AlignCenter, AlignBottom, "Course");
|
||||
canvas_draw_str_aligned(canvas, 64, 30, AlignCenter, AlignBottom, "Speed");
|
||||
canvas_draw_str_aligned(canvas, 107, 30, AlignCenter, AlignBottom, "Altitude");
|
||||
canvas_draw_str_aligned(canvas, 32, 52, AlignCenter, AlignBottom, "Satellites");
|
||||
canvas_draw_str_aligned(canvas, 96, 52, AlignCenter, AlignBottom, "Last Fix");
|
||||
|
||||
canvas_set_font(canvas, FontSecondary);
|
||||
char buffer[64];
|
||||
snprintf(buffer, 64, "%f", (double)gps_uart->status.latitude);
|
||||
canvas_draw_str_aligned(canvas, 32, 18, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(buffer, 64, "%f", (double)gps_uart->status.longitude);
|
||||
canvas_draw_str_aligned(canvas, 96, 18, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(buffer, 64, "%.1f", (double)gps_uart->status.course);
|
||||
canvas_draw_str_aligned(canvas, 21, 40, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(buffer, 64, "%.2f kn", (double)gps_uart->status.speed);
|
||||
canvas_draw_str_aligned(canvas, 64, 40, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(
|
||||
buffer,
|
||||
64,
|
||||
"%.1f %c",
|
||||
(double)gps_uart->status.altitude,
|
||||
tolower(gps_uart->status.altitude_units));
|
||||
canvas_draw_str_aligned(canvas, 107, 40, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(buffer, 64, "%d", gps_uart->status.satellites_tracked);
|
||||
canvas_draw_str_aligned(canvas, 32, 62, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(
|
||||
buffer,
|
||||
64,
|
||||
"%02d:%02d:%02d UTC",
|
||||
gps_uart->status.time_hours,
|
||||
gps_uart->status.time_minutes,
|
||||
gps_uart->status.time_seconds);
|
||||
canvas_draw_str_aligned(canvas, 96, 62, AlignCenter, AlignBottom, buffer);
|
||||
canvas_set_font(canvas, FontSecondary);
|
||||
char buffer[64];
|
||||
snprintf(buffer, 64, "%f", (double)gps_uart->status.latitude);
|
||||
canvas_draw_str_aligned(canvas, 32, 18, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(buffer, 64, "%f", (double)gps_uart->status.longitude);
|
||||
canvas_draw_str_aligned(canvas, 96, 18, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(buffer, 64, "%.1f", (double)gps_uart->status.course);
|
||||
canvas_draw_str_aligned(canvas, 21, 40, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(buffer, 64, "%.2f kn", (double)gps_uart->status.speed);
|
||||
canvas_draw_str_aligned(canvas, 64, 40, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(
|
||||
buffer,
|
||||
64,
|
||||
"%.1f %c",
|
||||
(double)gps_uart->status.altitude,
|
||||
tolower(gps_uart->status.altitude_units));
|
||||
canvas_draw_str_aligned(canvas, 107, 40, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(buffer, 64, "%d", gps_uart->status.satellites_tracked);
|
||||
canvas_draw_str_aligned(canvas, 32, 62, AlignCenter, AlignBottom, buffer);
|
||||
snprintf(
|
||||
buffer,
|
||||
64,
|
||||
"%02d:%02d:%02d UTC",
|
||||
gps_uart->status.time_hours,
|
||||
gps_uart->status.time_minutes,
|
||||
gps_uart->status.time_seconds);
|
||||
canvas_draw_str_aligned(canvas, 96, 62, AlignCenter, AlignBottom, buffer);
|
||||
} else {
|
||||
char buffer[64];
|
||||
canvas_set_font(canvas, FontPrimary);
|
||||
canvas_draw_str_aligned(canvas, 64, 32, AlignCenter, AlignBottom, "Baudrate set to:");
|
||||
|
||||
snprintf(buffer, 64, "%ld baud", gps_uart->baudrate);
|
||||
canvas_draw_str_aligned(canvas, 64, 47, AlignCenter, AlignBottom, buffer);
|
||||
}
|
||||
|
||||
furi_mutex_release(gps_uart->mutex);
|
||||
}
|
||||
@@ -98,13 +107,52 @@ int32_t gps_app(void* p) {
|
||||
if(event_status == FuriStatusOk) {
|
||||
// press events
|
||||
if(event.type == EventTypeKey) {
|
||||
if(event.input.type == InputTypePress) {
|
||||
if(event.input.type == InputTypeShort) {
|
||||
switch(event.input.key) {
|
||||
case InputKeyUp:
|
||||
case InputKeyDown:
|
||||
case InputKeyRight:
|
||||
case InputKeyLeft:
|
||||
case InputKeyBack:
|
||||
break;
|
||||
case InputKeyOk:
|
||||
if(!gps_uart->backlight_on) {
|
||||
notification_message_block(
|
||||
gps_uart->notifications, &sequence_display_backlight_enforce_on);
|
||||
gps_uart->backlight_on = true;
|
||||
} else {
|
||||
notification_message_block(
|
||||
gps_uart->notifications, &sequence_display_backlight_enforce_auto);
|
||||
notification_message(
|
||||
gps_uart->notifications, &sequence_display_backlight_off);
|
||||
gps_uart->backlight_on = false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if(event.input.type == InputTypeLong) {
|
||||
switch(event.input.key) {
|
||||
case InputKeyUp:
|
||||
gps_uart_deinit_thread(gps_uart);
|
||||
switch(gps_uart->baudrate) {
|
||||
case GPS_BAUDRATE_9k:
|
||||
gps_uart->baudrate = GPS_BAUDRATE_57k;
|
||||
break;
|
||||
case GPS_BAUDRATE_57k:
|
||||
gps_uart->baudrate = GPS_BAUDRATE_115k;
|
||||
break;
|
||||
case GPS_BAUDRATE_115k:
|
||||
gps_uart->baudrate = GPS_BAUDRATE_9k;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
gps_uart_init_thread(gps_uart);
|
||||
gps_uart->changing_baudrate = true;
|
||||
view_port_update(view_port);
|
||||
furi_mutex_release(gps_uart->mutex);
|
||||
break;
|
||||
case InputKeyBack:
|
||||
processing = false;
|
||||
@@ -115,11 +163,16 @@ int32_t gps_app(void* p) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
view_port_update(view_port);
|
||||
furi_mutex_release(gps_uart->mutex);
|
||||
if(!gps_uart->changing_baudrate) {
|
||||
view_port_update(view_port);
|
||||
furi_mutex_release(gps_uart->mutex);
|
||||
} else {
|
||||
furi_delay_ms(1000);
|
||||
gps_uart->changing_baudrate = false;
|
||||
}
|
||||
}
|
||||
|
||||
notification_message_block(gps_uart->notifications, &sequence_display_backlight_enforce_auto);
|
||||
view_port_enabled_set(view_port, false);
|
||||
gui_remove_view_port(gui, view_port);
|
||||
furi_record_close(RECORD_GUI);
|
||||
|
||||
+22
-10
@@ -22,7 +22,7 @@ static void gps_uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
|
||||
static void gps_uart_serial_init(GpsUart* gps_uart) {
|
||||
furi_hal_console_disable();
|
||||
furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, gps_uart_on_irq_cb, gps_uart);
|
||||
furi_hal_uart_set_br(FuriHalUartIdUSART1, GPS_BAUDRATE);
|
||||
furi_hal_uart_set_br(FuriHalUartIdUSART1, gps_uart->baudrate);
|
||||
}
|
||||
|
||||
static void gps_uart_serial_deinit(GpsUart* gps_uart) {
|
||||
@@ -133,9 +133,8 @@ static int32_t gps_uart_worker(void* context) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
GpsUart* gps_uart_enable() {
|
||||
GpsUart* gps_uart = malloc(sizeof(GpsUart));
|
||||
|
||||
void gps_uart_init_thread(GpsUart* gps_uart) {
|
||||
furi_assert(gps_uart);
|
||||
gps_uart->status.valid = false;
|
||||
gps_uart->status.latitude = 0.0;
|
||||
gps_uart->status.longitude = 0.0;
|
||||
@@ -149,8 +148,6 @@ GpsUart* gps_uart_enable() {
|
||||
gps_uart->status.time_minutes = 0;
|
||||
gps_uart->status.time_seconds = 0;
|
||||
|
||||
gps_uart->notifications = furi_record_open(RECORD_NOTIFICATION);
|
||||
|
||||
gps_uart->thread = furi_thread_alloc();
|
||||
furi_thread_set_name(gps_uart->thread, "GpsUartWorker");
|
||||
furi_thread_set_stack_size(gps_uart->thread, 1024);
|
||||
@@ -158,15 +155,30 @@ GpsUart* gps_uart_enable() {
|
||||
furi_thread_set_callback(gps_uart->thread, gps_uart_worker);
|
||||
|
||||
furi_thread_start(gps_uart->thread);
|
||||
}
|
||||
|
||||
void gps_uart_deinit_thread(GpsUart* gps_uart) {
|
||||
furi_assert(gps_uart);
|
||||
furi_thread_flags_set(furi_thread_get_id(gps_uart->thread), WorkerEvtStop);
|
||||
furi_thread_join(gps_uart->thread);
|
||||
furi_thread_free(gps_uart->thread);
|
||||
}
|
||||
|
||||
GpsUart* gps_uart_enable() {
|
||||
GpsUart* gps_uart = malloc(sizeof(GpsUart));
|
||||
|
||||
gps_uart->notifications = furi_record_open(RECORD_NOTIFICATION);
|
||||
|
||||
gps_uart->baudrate = GPS_BAUDRATE_57k;
|
||||
|
||||
gps_uart_init_thread(gps_uart);
|
||||
|
||||
return gps_uart;
|
||||
}
|
||||
|
||||
void gps_uart_disable(GpsUart* gps_uart) {
|
||||
furi_assert(gps_uart);
|
||||
furi_thread_flags_set(furi_thread_get_id(gps_uart->thread), WorkerEvtStop);
|
||||
furi_thread_join(gps_uart->thread);
|
||||
furi_thread_free(gps_uart->thread);
|
||||
|
||||
gps_uart_deinit_thread(gps_uart);
|
||||
furi_record_close(RECORD_NOTIFICATION);
|
||||
|
||||
free(gps_uart);
|
||||
|
||||
+9
-1
@@ -3,7 +3,9 @@
|
||||
#include <furi_hal.h>
|
||||
#include <notification/notification_messages.h>
|
||||
|
||||
#define GPS_BAUDRATE 9600
|
||||
#define GPS_BAUDRATE_9k 9600
|
||||
#define GPS_BAUDRATE_57k 57600
|
||||
#define GPS_BAUDRATE_115k 115200
|
||||
#define RX_BUF_SIZE 1024
|
||||
|
||||
typedef struct {
|
||||
@@ -28,10 +30,16 @@ typedef struct {
|
||||
uint8_t rx_buf[RX_BUF_SIZE];
|
||||
|
||||
NotificationApp* notifications;
|
||||
uint32_t baudrate;
|
||||
bool changing_baudrate;
|
||||
bool backlight_on;
|
||||
|
||||
GpsStatus status;
|
||||
} GpsUart;
|
||||
|
||||
void gps_uart_init_thread(GpsUart* gps_uart);
|
||||
void gps_uart_deinit_thread(GpsUart* gps_uart);
|
||||
|
||||
GpsUart* gps_uart_enable();
|
||||
|
||||
void gps_uart_disable(GpsUart* gps_uart);
|
||||
|
||||
Reference in New Issue
Block a user