Update NMEA app support deepsleep --nobuild

also reworked the render cb to show the changed handlings by the user
This commit is contained in:
Sil333033
2023-11-19 17:25:05 +01:00
parent 8903b3350f
commit 35f6c032b9
3 changed files with 99 additions and 22 deletions

View File

@@ -20,7 +20,53 @@ static void render_callback(Canvas* const canvas, void* context) {
GpsUart* gps_uart = context; GpsUart* gps_uart = context;
furi_mutex_acquire(gps_uart->mutex, FuriWaitForever); 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_set_font(canvas, FontPrimary);
canvas_draw_str_aligned(canvas, 32, 8, AlignCenter, AlignBottom, "Latitude"); 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, 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_draw_str_aligned(canvas, 96, 52, AlignCenter, AlignBottom, "Last Fix");
canvas_set_font(canvas, FontSecondary); canvas_set_font(canvas, FontSecondary);
char buffer[64];
snprintf(buffer, 64, "%f", (double)gps_uart->status.latitude); snprintf(buffer, 64, "%f", (double)gps_uart->status.latitude);
canvas_draw_str_aligned(canvas, 32, 18, AlignCenter, AlignBottom, buffer); canvas_draw_str_aligned(canvas, 32, 18, AlignCenter, AlignBottom, buffer);
snprintf(buffer, 64, "%f", (double)gps_uart->status.longitude); 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_minutes,
gps_uart->status.time_seconds); gps_uart->status.time_seconds);
canvas_draw_str_aligned(canvas, 96, 62, AlignCenter, AlignBottom, buffer); canvas_draw_str_aligned(canvas, 96, 62, AlignCenter, AlignBottom, buffer);
} else { break;
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); furi_mutex_release(gps_uart->mutex);
@@ -135,17 +174,23 @@ int32_t gps_app(void* p) {
processing = false; processing = false;
break; break;
case InputKeyOk: case InputKeyOk:
if(!gps_uart->backlight_on) { if(!gps_uart->backlight_enabled) {
notification_message_block( notification_message_block(
gps_uart->notifications, &sequence_display_backlight_enforce_on); gps_uart->notifications, &sequence_display_backlight_enforce_on);
gps_uart->backlight_on = true; gps_uart->backlight_enabled = true;
} else { } else {
notification_message_block( notification_message_block(
gps_uart->notifications, &sequence_display_backlight_enforce_auto); gps_uart->notifications, &sequence_display_backlight_enforce_auto);
notification_message( notification_message(
gps_uart->notifications, &sequence_display_backlight_off); 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; break;
default: default:
break; break;
@@ -163,15 +208,37 @@ int32_t gps_app(void* p) {
gps_uart->baudrate = gps_baudrates[current_gps_baudrate]; gps_uart->baudrate = gps_baudrates[current_gps_baudrate];
gps_uart_init_thread(gps_uart); gps_uart_init_thread(gps_uart);
gps_uart->changing_baudrate = true; gps_uart->view_state = CHANGE_BAUDRATE;
furi_mutex_release(gps_uart->mutex); furi_mutex_release(gps_uart->mutex);
view_port_update(view_port); view_port_update(view_port);
furi_delay_ms(1000);
gps_uart->view_state = NORMAL;
break; break;
case InputKeyRight: case InputKeyRight:
gps_uart->speed_units++; gps_uart->speed_units++;
if(gps_uart->speed_units == INVALID) { if(gps_uart->speed_units == INVALID) {
gps_uart->speed_units = KNOTS; 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; break;
case InputKeyBack: case InputKeyBack:
processing = false; 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); furi_mutex_release(gps_uart->mutex);
view_port_update(view_port); view_port_update(view_port);
} else {
furi_delay_ms(1000);
gps_uart->changing_baudrate = false;
} }
} }

View File

@@ -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_irq_cb(UART_CH, gps_uart_on_irq_cb, gps_uart);
furi_hal_uart_set_br(UART_CH, gps_uart->baudrate); 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) { 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->notifications = furi_record_open(RECORD_NOTIFICATION);
gps_uart->baudrate = gps_baudrates[current_gps_baudrate]; 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->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); gps_uart_init_thread(gps_uart);

View File

@@ -30,6 +30,14 @@ typedef struct {
typedef enum { KNOTS, KPH, MPH, INVALID } SpeedUnit; typedef enum { KNOTS, KPH, MPH, INVALID } SpeedUnit;
typedef enum {
CHANGE_BAUDRATE,
CHANGE_BACKLIGHT,
CHANGE_DEEPSLEEP,
CHANGE_SPEEDUNIT,
NORMAL
} ViewState;
typedef struct { typedef struct {
FuriMutex* mutex; FuriMutex* mutex;
FuriThread* thread; FuriThread* thread;
@@ -38,9 +46,10 @@ typedef struct {
NotificationApp* notifications; NotificationApp* notifications;
uint32_t baudrate; uint32_t baudrate;
bool changing_baudrate; bool backlight_enabled;
bool backlight_on; bool deep_sleep_enabled;
SpeedUnit speed_units; SpeedUnit speed_units;
ViewState view_state;
GpsStatus status; GpsStatus status;
} GpsUart; } GpsUart;