Sfoglia il codice sorgente

GPS: Port GPIO Pins, Viewport, button fixes

Willy-JL 2 anni fa
parent
commit
ad3adeb05d
3 ha cambiato i file con 38 aggiunte e 14 eliminazioni
  1. 19 9
      gps_nmea/gps.c
  2. 14 5
      gps_nmea/gps_uart.c
  3. 5 0
      gps_nmea/gps_uart.h

+ 19 - 9
gps_nmea/gps.c

@@ -103,6 +103,14 @@ int32_t gps_app(void* p) {
         return 255;
     }
 
+    uint8_t attempts = 0;
+    bool otg_was_enabled = furi_hal_power_is_otg_enabled();
+    while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) {
+        furi_hal_power_enable_otg();
+        furi_delay_ms(10);
+    }
+    furi_delay_ms(200);
+
     // set system callbacks
     ViewPort* view_port = view_port_alloc();
     view_port_draw_callback_set(view_port, render_callback, gps_uart);
@@ -123,11 +131,8 @@ int32_t gps_app(void* p) {
             if(event.type == EventTypeKey) {
                 if(event.input.type == InputTypeShort) {
                     switch(event.input.key) {
-                    case InputKeyUp:
-                    case InputKeyDown:
-                    case InputKeyRight:
-                    case InputKeyLeft:
                     case InputKeyBack:
+                        processing = false;
                         break;
                     case InputKeyOk:
                         if(!gps_uart->backlight_on) {
@@ -159,6 +164,8 @@ int32_t gps_app(void* p) {
 
                         gps_uart_init_thread(gps_uart);
                         gps_uart->changing_baudrate = true;
+                        view_port_update(view_port);
+                        furi_mutex_release(gps_uart->mutex);
                         break;
                     case InputKeyRight:
                         gps_uart->speed_units++;
@@ -175,11 +182,10 @@ int32_t gps_app(void* p) {
                 }
             }
         }
-
-        view_port_update(view_port);
-        furi_mutex_release(gps_uart->mutex);
-
-        if(gps_uart->changing_baudrate) {
+        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;
         }
@@ -194,5 +200,9 @@ int32_t gps_app(void* p) {
     furi_mutex_free(gps_uart->mutex);
     gps_uart_disable(gps_uart);
 
+    if(furi_hal_power_is_otg_enabled() && !otg_was_enabled) {
+        furi_hal_power_disable_otg();
+    }
+
     return 0;
 }

+ 14 - 5
gps_nmea/gps_uart.c

@@ -20,15 +20,24 @@ 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_uart->baudrate);
+    if(UART_CH == FuriHalUartIdUSART1) {
+        furi_hal_console_disable();
+    } else if(UART_CH == FuriHalUartIdLPUART1) {
+        furi_hal_uart_init(UART_CH, gps_uart->baudrate);
+    }
+
+    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);
 }
 
 static void gps_uart_serial_deinit(GpsUart* gps_uart) {
     UNUSED(gps_uart);
-    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, NULL, NULL);
-    furi_hal_console_enable();
+    furi_hal_uart_set_irq_cb(UART_CH, NULL, NULL);
+    if(UART_CH == FuriHalUartIdLPUART1) {
+        furi_hal_uart_deinit(UART_CH);
+    } else {
+        furi_hal_console_enable();
+    }
 }
 
 static void gps_uart_parse_nmea(GpsUart* gps_uart, char* line) {

+ 5 - 0
gps_nmea/gps_uart.h

@@ -3,6 +3,11 @@
 #include <furi_hal.h>
 #include <notification/notification_messages.h>
 
+#include <xtreme.h>
+
+#define UART_CH \
+    (xtreme_settings.uart_nmea_channel == UARTDefault ? FuriHalUartIdUSART1 : FuriHalUartIdLPUART1)
+
 #define RX_BUF_SIZE 1024
 
 static const int gps_baudrates[6] = {4800, 9600, 19200, 38400, 57600, 115200};