From 910e4f32173ddbca2306d4c06400e8dcdf97686f Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 30 Mar 2023 02:22:01 +0300 Subject: [PATCH] Improve GPS NMEA UART plugin, update changelog --- CHANGELOG.md | 18 ++- applications/external/gps_nmea_uart/README.md | 5 + applications/external/gps_nmea_uart/gps.c | 133 ++++++++++++------ .../external/gps_nmea_uart/gps_uart.c | 32 +++-- .../external/gps_nmea_uart/gps_uart.h | 10 +- 5 files changed, 140 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 817aab18b..b19025666 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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) diff --git a/applications/external/gps_nmea_uart/README.md b/applications/external/gps_nmea_uart/README.md index 7af0fa3b3..26a54a08f 100644 --- a/applications/external/gps_nmea_uart/README.md +++ b/applications/external/gps_nmea_uart/README.md @@ -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 diff --git a/applications/external/gps_nmea_uart/gps.c b/applications/external/gps_nmea_uart/gps.c index b36fd080b..6df1de08f 100644 --- a/applications/external/gps_nmea_uart/gps.c +++ b/applications/external/gps_nmea_uart/gps.c @@ -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); diff --git a/applications/external/gps_nmea_uart/gps_uart.c b/applications/external/gps_nmea_uart/gps_uart.c index 52ba660bc..39538b74b 100644 --- a/applications/external/gps_nmea_uart/gps_uart.c +++ b/applications/external/gps_nmea_uart/gps_uart.c @@ -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); diff --git a/applications/external/gps_nmea_uart/gps_uart.h b/applications/external/gps_nmea_uart/gps_uart.h index fd33eb245..70ef53de6 100644 --- a/applications/external/gps_nmea_uart/gps_uart.h +++ b/applications/external/gps_nmea_uart/gps_uart.h @@ -3,7 +3,9 @@ #include #include -#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);