22#include "constants.h"
33
44#include <furi.h>
5- #include <furi_hal_power.h>
65#include <gui/gui.h>
76#include <string.h>
87
@@ -21,7 +20,53 @@ static void render_callback(Canvas* const canvas, void* context) {
2120 GpsUart * gps_uart = context ;
2221 furi_mutex_acquire (gps_uart -> mutex , FuriWaitForever );
2322
24- if (!gps_uart -> changing_baudrate ) {
23+ char buffer [64 ];
24+
25+ switch (gps_uart -> view_state ) {
26+ case CHANGE_BAUDRATE :
27+ canvas_set_font (canvas , FontPrimary );
28+ canvas_draw_str_aligned (canvas , 64 , 32 , AlignCenter , AlignBottom , "Baudrate set to:" );
29+ snprintf (buffer , 64 , "%ld baud" , gps_uart -> baudrate );
30+ canvas_draw_str_aligned (canvas , 64 , 47 , AlignCenter , AlignBottom , buffer );
31+ break ;
32+ case CHANGE_BACKLIGHT :
33+ canvas_set_font (canvas , FontPrimary );
34+ canvas_draw_str_aligned (
35+ canvas ,
36+ 64 ,
37+ 32 ,
38+ AlignCenter ,
39+ AlignBottom ,
40+ gps_uart -> backlight_enabled ? "Backlight enabled" : "Backlight disabled" );
41+ break ;
42+ case CHANGE_DEEPSLEEP :
43+ canvas_set_font (canvas , FontPrimary );
44+ canvas_draw_str_aligned (
45+ canvas ,
46+ 64 ,
47+ 32 ,
48+ AlignCenter ,
49+ AlignBottom ,
50+ gps_uart -> deep_sleep_enabled ? "Deep sleep enabled" : "Deep sleep disabled" );
51+ break ;
52+ case CHANGE_SPEEDUNIT :
53+ canvas_set_font (canvas , FontPrimary );
54+ canvas_draw_str_aligned (canvas , 64 , 32 , AlignCenter , AlignBottom , "Speed unit set to:" );
55+ switch (gps_uart -> speed_units ) {
56+ case KPH :
57+ canvas_draw_str_aligned (canvas , 64 , 47 , AlignCenter , AlignBottom , "km/h" );
58+ break ;
59+ case MPH :
60+ canvas_draw_str_aligned (canvas , 64 , 47 , AlignCenter , AlignBottom , "mi/h" );
61+ break ;
62+ case KNOTS :
63+ default :
64+ canvas_draw_str_aligned (canvas , 64 , 47 , AlignCenter , AlignBottom , "kn" );
65+ break ;
66+ }
67+ break ;
68+ case NORMAL :
69+ default :
2570 canvas_set_font (canvas , FontPrimary );
2671 canvas_draw_str_aligned (canvas , 32 , 8 , AlignCenter , AlignBottom , "Latitude" );
2772 canvas_draw_str_aligned (canvas , 96 , 8 , AlignCenter , AlignBottom , "Longitude" );
@@ -32,7 +77,6 @@ static void render_callback(Canvas* const canvas, void* context) {
3277 canvas_draw_str_aligned (canvas , 96 , 52 , AlignCenter , AlignBottom , "Last Fix" );
3378
3479 canvas_set_font (canvas , FontSecondary );
35- char buffer [64 ];
3680 snprintf (buffer , 64 , "%f" , (double )gps_uart -> status .latitude );
3781 canvas_draw_str_aligned (canvas , 32 , 18 , AlignCenter , AlignBottom , buffer );
3882 snprintf (buffer , 64 , "%f" , (double )gps_uart -> status .longitude );
@@ -42,10 +86,10 @@ static void render_callback(Canvas* const canvas, void* context) {
4286
4387 switch (gps_uart -> speed_units ) {
4488 case KPH :
45- snprintf (buffer , 64 , "%.2f km" , (double )(gps_uart -> status .speed * KNOTS_TO_KPH ));
89+ snprintf (buffer , 64 , "%.2f km/h " , (double )(gps_uart -> status .speed * KNOTS_TO_KPH ));
4690 break ;
4791 case MPH :
48- snprintf (buffer , 64 , "%.2f mi" , (double )(gps_uart -> status .speed * KNOTS_TO_MPH ));
92+ snprintf (buffer , 64 , "%.2f mi/h " , (double )(gps_uart -> status .speed * KNOTS_TO_MPH ));
4993 break ;
5094 case KNOTS :
5195 default :
@@ -71,13 +115,7 @@ static void render_callback(Canvas* const canvas, void* context) {
71115 gps_uart -> status .time_minutes ,
72116 gps_uart -> status .time_seconds );
73117 canvas_draw_str_aligned (canvas , 96 , 62 , AlignCenter , AlignBottom , buffer );
74- } else {
75- char buffer [64 ];
76- canvas_set_font (canvas , FontPrimary );
77- canvas_draw_str_aligned (canvas , 64 , 32 , AlignCenter , AlignBottom , "Baudrate set to:" );
78-
79- snprintf (buffer , 64 , "%ld baud" , gps_uart -> baudrate );
80- canvas_draw_str_aligned (canvas , 64 , 47 , AlignCenter , AlignBottom , buffer );
118+ break ;
81119 }
82120
83121 furi_mutex_release (gps_uart -> mutex );
@@ -95,14 +133,6 @@ int32_t gps_app(void* p) {
95133
96134 FuriMessageQueue * event_queue = furi_message_queue_alloc (8 , sizeof (PluginEvent ));
97135
98- uint8_t attempts = 0 ;
99- bool otg_was_enabled = furi_hal_power_is_otg_enabled ();
100- while (!furi_hal_power_is_otg_enabled () && attempts ++ < 5 ) {
101- furi_hal_power_enable_otg ();
102- furi_delay_ms (10 );
103- }
104- furi_delay_ms (200 );
105-
106136 GpsUart * gps_uart = gps_uart_enable ();
107137
108138 gps_uart -> mutex = furi_mutex_alloc (FuriMutexTypeNormal );
@@ -112,6 +142,14 @@ int32_t gps_app(void* p) {
112142 return 255 ;
113143 }
114144
145+ uint8_t attempts = 0 ;
146+ bool otg_was_enabled = furi_hal_power_is_otg_enabled ();
147+ while (!furi_hal_power_is_otg_enabled () && attempts ++ < 5 ) {
148+ furi_hal_power_enable_otg ();
149+ furi_delay_ms (10 );
150+ }
151+ furi_delay_ms (200 );
152+
115153 // set system callbacks
116154 ViewPort * view_port = view_port_alloc ();
117155 view_port_draw_callback_set (view_port , render_callback , gps_uart );
@@ -132,24 +170,27 @@ int32_t gps_app(void* p) {
132170 if (event .type == EventTypeKey ) {
133171 if (event .input .type == InputTypeShort ) {
134172 switch (event .input .key ) {
135- case InputKeyUp :
136- case InputKeyDown :
137- case InputKeyRight :
138- case InputKeyLeft :
139173 case InputKeyBack :
174+ processing = false;
140175 break ;
141176 case InputKeyOk :
142- if (!gps_uart -> backlight_on ) {
177+ if (!gps_uart -> backlight_enabled ) {
143178 notification_message_block (
144179 gps_uart -> notifications , & sequence_display_backlight_enforce_on );
145- gps_uart -> backlight_on = true;
180+ gps_uart -> backlight_enabled = true;
146181 } else {
147182 notification_message_block (
148183 gps_uart -> notifications , & sequence_display_backlight_enforce_auto );
149184 notification_message (
150185 gps_uart -> notifications , & sequence_display_backlight_off );
151- gps_uart -> backlight_on = false;
186+ gps_uart -> backlight_enabled = false;
152187 }
188+
189+ gps_uart -> view_state = CHANGE_BACKLIGHT ;
190+ furi_mutex_release (gps_uart -> mutex );
191+ view_port_update (view_port );
192+ furi_delay_ms (1000 );
193+ gps_uart -> view_state = NORMAL ;
153194 break ;
154195 default :
155196 break ;
@@ -167,15 +208,39 @@ int32_t gps_app(void* p) {
167208 gps_uart -> baudrate = gps_baudrates [current_gps_baudrate ];
168209
169210 gps_uart_init_thread (gps_uart );
170- gps_uart -> changing_baudrate = true;
211+ gps_uart -> view_state = CHANGE_BAUDRATE ;
212+
171213 furi_mutex_release (gps_uart -> mutex );
172214 view_port_update (view_port );
215+ furi_delay_ms (1000 );
216+ gps_uart -> view_state = NORMAL ;
173217 break ;
174218 case InputKeyRight :
175219 gps_uart -> speed_units ++ ;
176220 if (gps_uart -> speed_units == INVALID ) {
177221 gps_uart -> speed_units = KNOTS ;
178222 }
223+
224+ gps_uart -> view_state = CHANGE_SPEEDUNIT ;
225+ furi_mutex_release (gps_uart -> mutex );
226+ view_port_update (view_port );
227+ furi_delay_ms (1000 );
228+ gps_uart -> view_state = NORMAL ;
229+ break ;
230+ case InputKeyDown :
231+ gps_uart -> view_state = CHANGE_DEEPSLEEP ;
232+ gps_uart -> deep_sleep_enabled = !gps_uart -> deep_sleep_enabled ;
233+
234+ // tested on Telit SE868-A and SL871L-S
235+ furi_hal_serial_tx (
236+ gps_uart -> serial_handle ,
237+ (uint8_t * )"$PMTK161,0*28\r\n" ,
238+ strlen ("$PMTK161,0*28\r\n" ));
239+
240+ furi_mutex_release (gps_uart -> mutex );
241+ view_port_update (view_port );
242+ furi_delay_ms (1000 );
243+ gps_uart -> view_state = NORMAL ;
179244 break ;
180245 case InputKeyBack :
181246 processing = false;
@@ -186,12 +251,10 @@ int32_t gps_app(void* p) {
186251 }
187252 }
188253 }
189- if (!gps_uart -> changing_baudrate ) {
254+
255+ if (gps_uart -> view_state == NORMAL ) {
190256 furi_mutex_release (gps_uart -> mutex );
191257 view_port_update (view_port );
192- } else {
193- furi_delay_ms (1000 );
194- gps_uart -> changing_baudrate = false;
195258 }
196259 }
197260
0 commit comments