From 35f6c032b9f17e51c967af4d8c16e9dc3b9fdf9c Mon Sep 17 00:00:00 2001 From: Sil333033 <94360907+Sil333033@users.noreply.github.com> Date: Sun, 19 Nov 2023 17:25:05 +0100 Subject: [PATCH] Update NMEA app support deepsleep --nobuild also reworked the render cb to show the changed handlings by the user --- applications/external/gps_nmea/gps.c | 101 ++++++++++++++++++---- applications/external/gps_nmea/gps_uart.c | 7 +- applications/external/gps_nmea/gps_uart.h | 13 ++- 3 files changed, 99 insertions(+), 22 deletions(-) diff --git a/applications/external/gps_nmea/gps.c b/applications/external/gps_nmea/gps.c index ebff8618f..187a76c83 100644 --- a/applications/external/gps_nmea/gps.c +++ b/applications/external/gps_nmea/gps.c @@ -20,7 +20,53 @@ static void render_callback(Canvas* const canvas, void* context) { GpsUart* gps_uart = context; furi_mutex_acquire(gps_uart->mutex, FuriWaitForever); - if(!gps_uart->changing_baudrate) { + char buffer[64]; + + switch(gps_uart->view_state) { + case CHANGE_BAUDRATE: + 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); + break; + case CHANGE_BACKLIGHT: + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned( + canvas, + 64, + 32, + AlignCenter, + AlignBottom, + gps_uart->backlight_enabled ? "Backlight enabled" : "Backlight disabled"); + break; + case CHANGE_DEEPSLEEP: + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned( + canvas, + 64, + 32, + AlignCenter, + AlignBottom, + gps_uart->deep_sleep_enabled ? "Deep sleep enabled" : "Deep sleep disabled"); + break; + case CHANGE_SPEEDUNIT: + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned(canvas, 64, 32, AlignCenter, AlignBottom, "Speed unit set to:"); + switch(gps_uart->speed_units) { + case KPH: + canvas_draw_str_aligned(canvas, 64, 47, AlignCenter, AlignBottom, "km/h"); + break; + case MPH: + canvas_draw_str_aligned(canvas, 64, 47, AlignCenter, AlignBottom, "mi/h"); + break; + case KNOTS: + default: + canvas_draw_str_aligned(canvas, 64, 47, AlignCenter, AlignBottom, "kn"); + break; + } + break; + case NORMAL: + default: 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"); @@ -31,7 +77,6 @@ static void render_callback(Canvas* const canvas, void* context) { 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); @@ -70,13 +115,7 @@ static void render_callback(Canvas* const canvas, void* context) { 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); + break; } furi_mutex_release(gps_uart->mutex); @@ -135,17 +174,23 @@ int32_t gps_app(void* p) { processing = false; break; case InputKeyOk: - if(!gps_uart->backlight_on) { + if(!gps_uart->backlight_enabled) { notification_message_block( gps_uart->notifications, &sequence_display_backlight_enforce_on); - gps_uart->backlight_on = true; + gps_uart->backlight_enabled = 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; + gps_uart->backlight_enabled = false; } + + gps_uart->view_state = CHANGE_BACKLIGHT; + furi_mutex_release(gps_uart->mutex); + view_port_update(view_port); + furi_delay_ms(1000); + gps_uart->view_state = NORMAL; break; default: break; @@ -163,15 +208,37 @@ int32_t gps_app(void* p) { gps_uart->baudrate = gps_baudrates[current_gps_baudrate]; gps_uart_init_thread(gps_uart); - gps_uart->changing_baudrate = true; + gps_uart->view_state = CHANGE_BAUDRATE; + furi_mutex_release(gps_uart->mutex); view_port_update(view_port); + furi_delay_ms(1000); + gps_uart->view_state = NORMAL; break; case InputKeyRight: gps_uart->speed_units++; if(gps_uart->speed_units == INVALID) { gps_uart->speed_units = KNOTS; } + + gps_uart->view_state = CHANGE_SPEEDUNIT; + furi_mutex_release(gps_uart->mutex); + view_port_update(view_port); + furi_delay_ms(1000); + gps_uart->view_state = NORMAL; + break; + case InputKeyDown: + gps_uart->view_state = CHANGE_DEEPSLEEP; + gps_uart->deep_sleep_enabled = !gps_uart->deep_sleep_enabled; + + // tested on Telit SE868-A and SL871L-S + furi_hal_uart_tx( + UART_CH, (uint8_t*)"$PMTK161,0*28\r\n", strlen("$PMTK161,0*28\r\n")); + + furi_mutex_release(gps_uart->mutex); + view_port_update(view_port); + furi_delay_ms(1000); + gps_uart->view_state = NORMAL; break; case InputKeyBack: processing = false; @@ -182,12 +249,10 @@ int32_t gps_app(void* p) { } } } - if(!gps_uart->changing_baudrate) { + + if(gps_uart->view_state == NORMAL) { furi_mutex_release(gps_uart->mutex); view_port_update(view_port); - } else { - furi_delay_ms(1000); - gps_uart->changing_baudrate = false; } } @@ -205,4 +270,4 @@ int32_t gps_app(void* p) { } return 0; -} +} \ No newline at end of file diff --git a/applications/external/gps_nmea/gps_uart.c b/applications/external/gps_nmea/gps_uart.c index c5510e32a..00db5b7fa 100644 --- a/applications/external/gps_nmea/gps_uart.c +++ b/applications/external/gps_nmea/gps_uart.c @@ -28,6 +28,8 @@ static void gps_uart_serial_init(GpsUart* gps_uart) { furi_hal_uart_set_irq_cb(UART_CH, gps_uart_on_irq_cb, gps_uart); furi_hal_uart_set_br(UART_CH, gps_uart->baudrate); + + furi_hal_uart_tx(UART_CH, (uint8_t*)"wakey wakey\r\n", strlen("wakey wakey\r\n")); } static void gps_uart_serial_deinit(GpsUart* gps_uart) { @@ -211,9 +213,10 @@ GpsUart* gps_uart_enable() { gps_uart->notifications = furi_record_open(RECORD_NOTIFICATION); gps_uart->baudrate = gps_baudrates[current_gps_baudrate]; - gps_uart->changing_baudrate = false; - gps_uart->backlight_on = false; gps_uart->speed_units = KNOTS; + gps_uart->backlight_enabled = false; + gps_uart->deep_sleep_enabled = false; + gps_uart->view_state = NORMAL; gps_uart_init_thread(gps_uart); diff --git a/applications/external/gps_nmea/gps_uart.h b/applications/external/gps_nmea/gps_uart.h index 03fcf641e..8e231a795 100644 --- a/applications/external/gps_nmea/gps_uart.h +++ b/applications/external/gps_nmea/gps_uart.h @@ -30,6 +30,14 @@ typedef struct { typedef enum { KNOTS, KPH, MPH, INVALID } SpeedUnit; +typedef enum { + CHANGE_BAUDRATE, + CHANGE_BACKLIGHT, + CHANGE_DEEPSLEEP, + CHANGE_SPEEDUNIT, + NORMAL +} ViewState; + typedef struct { FuriMutex* mutex; FuriThread* thread; @@ -38,9 +46,10 @@ typedef struct { NotificationApp* notifications; uint32_t baudrate; - bool changing_baudrate; - bool backlight_on; + bool backlight_enabled; + bool deep_sleep_enabled; SpeedUnit speed_units; + ViewState view_state; GpsStatus status; } GpsUart;