FEATURE: Displays all the queue there's room for on the screen in NMEA passthrough, tracking real estate used. Always prints available text buffer and two self-genned messages. Prints whatever else in the queue (from start) there's room for.

This commit is contained in:
Kragg Malak
2023-12-16 23:43:50 -07:00
parent b6cf6b600a
commit 41bbcae40c
3 changed files with 112 additions and 38 deletions
+9 -9
View File
@@ -102,8 +102,8 @@ void GpsInterface::enqueue(MicroNMEA& nmea){
if(this->text_in){
int size=text_in->size();
if(size){
#ifdef GPS_TEXT_MAXCOPIES
if(this->text_cycles>=GPS_TEXT_MAXCOPIES){
#ifdef GPS_TEXT_MAXCYCLES
if(this->text_cycles>=GPS_TEXT_MAXCYCLES){
#else
if(this->text_cycles){
#endif
@@ -158,8 +158,8 @@ void GpsInterface::enqueue(MicroNMEA& nmea){
#else
if(size>=5){
#endif
#ifdef GPS_TEXT_MAXCOPIES
if(this->text_cycles>=GPS_TEXT_MAXCOPIES){
#ifdef GPS_TEXT_MAXCYCLES
if(this->text_cycles>=GPS_TEXT_MAXCYCLES){
#else
if(this->text_cycles){
#endif
@@ -198,8 +198,8 @@ void GpsInterface::enqueue(MicroNMEA& nmea){
if(this->queue_enabled_flag){
if(!this->queue) this->new_queue();
if(enqueue){
String enqueue_me=nmea_sentence.c_str();
this->queue->add(enqueue_me);
nmea_sentence_t line = { unparsed, msg_id, nmea_sentence.c_str() };
this->queue->add(line);
}
}
else
@@ -234,12 +234,12 @@ bool GpsInterface::queue_enabled(){
return this->queue_enabled_flag;
}
LinkedList<String>* GpsInterface::get_queue(){
LinkedList<nmea_sentence_t>* GpsInterface::get_queue(){
return this->queue;
}
void GpsInterface::new_queue(){
this->queue=new LinkedList<String>;
this->queue=new LinkedList<nmea_sentence_t>;
}
void GpsInterface::flush_queue(){
@@ -250,7 +250,7 @@ void GpsInterface::flush_queue(){
void GpsInterface::flush_queue_nmea(){
if(this->queue){
if(this->queue->size()){
LinkedList<String> *delme=this->queue;
LinkedList<nmea_sentence_t> *delme=this->queue;
this->new_queue();
delete delme;
}
+23 -4
View File
@@ -10,7 +10,26 @@
#include "configs.h"
//#define GPS_TEXT_MAXLINES 5 //default:5 lines in the buffer maximum
//#define GPS_TEXT_MAXCOPIES 1 //default:any nonzero number resets, i.e. one copy
//#define GPS_TEXT_MAXCYCLES 1 //default:1
//#define GPS_NMEA_SCRNLINES TEXT_HEIGHT //default: defined TEXT_HEIGHT from configs.h
//#define GPS_NMEA_SCRNWRAP true //default:true, except on MARAUDER_MINI where false
#ifdef MARAUDER_MINI
#ifndef GPS_NMEA_SCRNWRAP
#define GPS_NMEA_SCRNWRAP false
#endif
#else
#ifndef GPS_NMEA_SCRNWRAP
#define GPS_NMEA_SCRNWRAP true
#endif
#endif
struct nmea_sentence_t {
bool unparsed;
String type;
String sentence;
};
void gps_nmea_notimp(MicroNMEA& nmea);
@@ -38,7 +57,7 @@ class GpsInterface {
void setType(String t);
void enqueue(MicroNMEA& nmea);
LinkedList<String>* get_queue();
LinkedList<nmea_sentence_t>* get_queue();
void flush_queue();
void flush_text();
void new_queue();
@@ -84,9 +103,9 @@ class GpsInterface {
type_t type_flag = GPSTYPE_NATIVE;
bool queue_enabled_flag=0;
LinkedList<String> *queue=NULL;
LinkedList<nmea_sentence_t> *queue=NULL;
int text_cycles=0;
unsigned int text_cycles=0;
LinkedList<String> *text_in=NULL;
LinkedList<String> *text=NULL;
+80 -25
View File
@@ -1204,9 +1204,12 @@ void WiFiScan::RunGPSInfo() {
void WiFiScan::RunGPSNmea() {
#ifdef HAS_GPS
LinkedList<String> *buffer=gps_obj.get_queue();
LinkedList<nmea_sentence_t> *buffer=gps_obj.get_queue();
bool queue_enabled=gps_obj.queue_enabled();
String gxgga = gps_obj.generateGXgga();
String gxrmc = gps_obj.generateGXrmc();
if(!buffer||!queue_enabled)
gps_obj.flush_queue();
#ifndef HAS_SCREEN
@@ -1214,29 +1217,54 @@ void WiFiScan::RunGPSNmea() {
gps_obj.flush_text();
#else
// Get screen position ready
display_obj.tft.setTextWrap(true);
int offset=100;
if((SCREEN_HEIGHT / 3)<offset)
offset=SCREEN_HEIGHT/3; //for smaller screens
if(offset<(TOP_FIXED_AREA+6))
offset=TOP_FIXED_AREA+6; //absolute minimium
display_obj.tft.setTextWrap(false);
display_obj.tft.setFreeFont(NULL);
display_obj.tft.setCursor(0, SCREEN_HEIGHT / 3);
display_obj.tft.setCursor(0, offset);
display_obj.tft.setTextSize(1);
display_obj.tft.setTextColor(TFT_CYAN);
display_obj.tft.setTextColor(TFT_GREEN);
// Clean up screen first
display_obj.tft.fillRect(0, (SCREEN_HEIGHT / 3) - 6, SCREEN_WIDTH, SCREEN_HEIGHT - ((SCREEN_HEIGHT / 3) - 6), TFT_BLACK);
display_obj.tft.fillRect(0, offset-6, SCREEN_WIDTH, SCREEN_HEIGHT - (offset-6), TFT_BLACK);
display_obj.tft.setCursor(0, SCREEN_HEIGHT / 3);
#ifdef GPS_NMEA_SCRNLINES
int lines=GPS_NMEA_SCRNLINES;
#else
int lines=TEXT_HEIGHT;
if(lines>((TFT_HEIGHT-offset-BOT_FIXED_AREA)/10))
lines=(TFT_HEIGHT-offset-BOT_FIXED_AREA)/10;
#endif
String text=gps_obj.getText();
if(queue_enabled){
if(gps_obj.getTextQueueSize()>0)
display_obj.tft.print(gps_obj.getTextQueue());
int queue=gps_obj.getTextQueueSize();
if(queue>0){
display_obj.tft.println(gps_obj.getTextQueue());
lines-=queue; //used lines for text display
}
else
if(text != "") display_obj.tft.print(text);
if(text != ""){
display_obj.tft.println(text);
lines--;
}
}
else
if(text != "") display_obj.tft.print(text);
if(text != ""){
display_obj.tft.println(text);
lines--;
}
//This one doesn't contain self-genned GxGGA or GxRMC, nor does it contain GxTXT, processed above
String display_nmea_sentence=gps_obj.getNmeaNotparsed();
#if GPS_NMEA_SCRNWRAP
lines-=((gxgga.length()-1)/STANDARD_FONT_CHAR_LIMIT) + 1;
lines-=((gxrmc.length()-1)/STANDARD_FONT_CHAR_LIMIT) + 1;
display_obj.tft.setTextWrap(GPS_NMEA_SCRNWRAP);
#else
lines-=2; //two self-genned messages
#endif
#endif
if(buffer && queue_enabled){
@@ -1244,15 +1272,35 @@ void WiFiScan::RunGPSNmea() {
if(size){
gps_obj.new_queue();
for(int i=0;i<size;i++){
Serial.println(buffer->get(i));
nmea_sentence_t line=buffer->get(i);
Serial.println(line.sentence);
#ifdef HAS_SCREEN
if(lines>0){
if(line.unparsed){
if(line.type != "" && line.type != "TXT" && line.type != "GGA" && line.type != "RMC"){
int length=line.sentence.length();
if(length){
#if GPS_NMEA_SCRNWRAP
if((((length-1)/STANDARD_FONT_CHAR_LIMIT) + 1)<=lines){
#endif
display_obj.tft.println(line.sentence);
#if GPS_NMEA_SCRNWRAP
lines-=((length-1)/STANDARD_FONT_CHAR_LIMIT) + 1;
#else
lines--;
#endif
#if GPS_NMEA_SCRNWRAP
}
#endif
}
}
}
}
#endif
}
delete buffer;
}
#ifdef HAS_SCREEN
//This matches the else block, but could later display more of the queue...
display_obj.tft.print(display_nmea_sentence);
#endif
} else {
static String old_nmea_sentence="";
String nmea_sentence=gps_obj.getNmeaNotimp();
@@ -1263,17 +1311,24 @@ void WiFiScan::RunGPSNmea() {
}
#ifdef HAS_SCREEN
display_obj.tft.print(display_nmea_sentence);
if(lines>0){
String display_nmea_sentence=gps_obj.getNmeaNotparsed();
int length=display_nmea_sentence.length();
if(length)
#if GPS_NMEA_SCRNWRAP
if((((length-1)/STANDARD_FONT_CHAR_LIMIT) + 1)<=lines)
#endif
display_obj.tft.println(display_nmea_sentence);
}
#endif
}
String gxgga = gps_obj.generateGXgga();
String gxrmc = gps_obj.generateGXrmc();
#ifdef HAS_SCREEN
display_obj.tft.print(gxgga);
display_obj.tft.print(gxrmc);
display_obj.tft.setTextWrap(false);
display_obj.tft.println(gxgga);
display_obj.tft.println(gxrmc);
#if GPS_NMEA_SCRNWRAP
display_obj.tft.setTextWrap(false);
#endif
#endif
gps_obj.sendSentence(Serial, gxgga.c_str());