diff --git a/lib/obp60task/PageSkyView.cpp b/lib/obp60task/PageSkyView.cpp index 0f9e9f8..8c506ab 100644 --- a/lib/obp60task/PageSkyView.cpp +++ b/lib/obp60task/PageSkyView.cpp @@ -4,23 +4,33 @@ #include "Pagedata.h" #include "OBP60Extensions.h" +#include +#include // for vector sorting + /* * SkyView / Satellites */ class PageSkyView : public Page { +private: + GwBoatData *bd; + public: PageSkyView(CommonData &common) : Page(common) { - logger->logDebug(GwLog::LOG, "Instantiate PageSkyView"); + // task name access is for example purpose only + TaskHandle_t currentTaskHandle = xTaskGetCurrentTaskHandle(); + const char* taskName = pcTaskGetName(currentTaskHandle); + logger->logDebug(GwLog::LOG, "Instantiate PageSkyView in task '%s'", taskName); } - int handleKey(int key){ - // Code for keylock - if(key == 11){ + int handleKey(int key) { + // return 0 to mark the key handled completely + // return the key to allow further action + if (key == 11) { commonData->keylock = !commonData->keylock; - return 0; // Commit the key + return 0; } return key; } @@ -33,12 +43,25 @@ public: setFlashLED(false); } #endif + bd = pageData.api->getBoatData(); }; + // Comparator function to sort by SNR + static bool compareBySNR(const GwSatInfo& a, const GwSatInfo& b) { + return a.SNR > b.SNR; // Sort in descending order + } + int displayPage(PageData &pageData) { - // Logging boat values - logger->logDebug(GwLog::LOG, "Drawing at PageSkyView"); + std::vector sats; + int nSat = bd->SatInfo->getNumSats(); + + logger->logDebug(GwLog::LOG, "Drawing at PageSkyView, %d satellites", nSat); + + for (int i = 0; i < nSat; i++) { + sats.push_back(*bd->SatInfo->getAt(i)); + } + std::sort(sats.begin(), sats.end(), compareBySNR); // Draw page //*********************************************************** @@ -49,6 +72,7 @@ public: // current position epd->setFont(&Ubuntu_Bold8pt8b); + GwApi::BoatValue *bv_lat = pageData.values[0]; String sv_lat = commonData->fmt->formatValue(bv_lat, *commonData).svalue; //epd->setCursor(300, 40); @@ -108,21 +132,37 @@ public: epd->setCursor(c.x - r + 2 , c.y + h / 2); epd->print("W"); - // satellites + epd->setFont(&Ubuntu_Bold8pt8b); + // show satellites in "map" + for (int i = 0; i < nSat; i++) { + float arad = sats[i].Azimut * M_PI / 180.0; + float erad = sats[i].Elevation * M_PI / 180.0; + uint16_t x = c.x + sin(arad) * erad * r; + uint16_t y = c.y + cos(arad) * erad * r; + epd->drawRect(x-4, y-4, 8, 8, commonData->fgcolor); + } // Signal / Noise bars - epd->setFont(&Ubuntu_Bold8pt8b); epd->setCursor(325, 34); epd->print("SNR"); epd->drawRect(270, 20, 125, 257, commonData->fgcolor); - for (int i = 0; i < 12; i++) { + int maxsat = std::min(nSat, 12); + for (int i = 0; i < maxsat; i++) { uint16_t y = 29 + (i + 1) * 20; epd->setCursor(276, y); char buffer[3]; - snprintf(buffer, 3, "%02d", i+1); + snprintf(buffer, 3, "%02d", static_cast(sats[i].PRN)); epd->print(String(buffer)); epd->drawRect(305, y-12, 85, 14, commonData->fgcolor); + epd->setCursor(315, y); + // TODO SNR as number or as bar via mode key? + if (sats[i].SNR <= 100) { + // epd->print(sats[i].SNR); + epd->fillRect(307, y-10, int(81 * sats[i].SNR / 100.0), 10, commonData->fgcolor); + } else { + epd->print("n/a"); + } } return PAGE_UPDATE; diff --git a/lib/obp60task/Pagedata.h b/lib/obp60task/Pagedata.h index b2f7d1e..fff24cc 100644 --- a/lib/obp60task/Pagedata.h +++ b/lib/obp60task/Pagedata.h @@ -128,6 +128,7 @@ typedef struct{ //a base class that all pages must inherit from class Page{ protected: + // TODO Future: GwApi *api; CommonData *commonData; GwConfigHandler *config; GwLog *logger; diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index 45df913..2f6fc86 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -120,13 +120,13 @@ void OBP60Init(GwApi *api){ } typedef struct { - int page0=0; - QueueHandle_t queue; - GwLog* logger = NULL; + int page0 = 0; + QueueHandle_t queue; + GwLog* logger = nullptr; // GwApi* api = NULL; - uint sensitivity = 100; - bool use_syspage = true; - } MyData; + uint sensitivity = 100; + bool use_syspage = true; +} MyData; // Keyboard Task void keyboardTask(void *param){ @@ -675,6 +675,7 @@ void OBP60Task(GwApi *api){ pages[i].page=description->creator(commonData); pages[i].parameters.pageName=pageType; pages[i].parameters.pageNumber = i + 1; + pages[i].parameters.api = api; LOG_DEBUG(GwLog::DEBUG,"found page %s for number %d",pageType.c_str(),i); //fill in all the user defined parameters for (int uid=0;uiduserParam;uid++){