#include "Keyboard.h"
#include "traces.h"
+#include <navigation.h>
+
+#define NAVI_CONFIG_FILEPATH "/etc/naviconfig.ini"
+
#define DEFAULT_TEXT "Select your destination with Yelp !"
#define URL_AUTH "https://api.yelp.com/oauth2/token"
#define URL_AUTOCOMPLETE "https://api.yelp.com/v3/autocomplete"
using namespace std;
-MainApp::MainApp():QMainWindow(Q_NULLPTR, Qt::FramelessWindowHint),
+MainApp::MainApp(Navigation *navigation):QMainWindow(Q_NULLPTR, Qt::FramelessWindowHint),
networkManager(this),searchBtn(QIcon(tr(":/images/loupe-90.png")), tr(""), this),
lineEdit(this),keyboard(QRect(0, 688, COMPLETE_W_WITH_KB, 720), this),
mutex(QMutex::Recursive),token(""),currentSearchingText(""),currentSearchedText(""),
- pSearchReply(NULL),pInfoPanel(NULL),pResultList(NULL),currentLatitude(0.0),currentLongitude(0.0),
+ pSearchReply(NULL),pInfoPanel(NULL),pResultList(NULL),currentLatitude(36.136261),currentLongitude(-115.151254),
navicoreSession(0),currentIndex(0),fontId(-1),isInfoScreen(false),
- isInputDisplayed(false),isKeyboard(false),isAglNavi(false)
+ isInputDisplayed(false),isKeyboard(false),isAglNavi(false), naviapi(navigation)
{
//this->setAttribute(Qt::WA_TranslucentBackground);
this->setStyleSheet("border: none;");
lineEdit.setGeometry(QRect(LEFT_OFFSET + searchBtn.width() + SPACER, 0, lineEdit.width(), lineEdit.height()));
lineEdit.setVisible(false);
+ QFile file(NAVI_CONFIG_FILEPATH);
+ if (file.open(QIODevice::ReadOnly | QIODevice::Text))
+ {
+ QByteArray data = file.readAll();
+ QJsonDocument jsonDoc(QJsonDocument::fromJson(data));
+ QJsonObject jsonObj(jsonDoc.object());
+
+ if (jsonObj.contains("latitude"))
+ currentLatitude = jsonObj["latitude"].toDouble();
+
+ if (jsonObj.contains("longitude"))
+ currentLongitude = jsonObj["longitude"].toDouble();
+ }
+
/* We might need a Japanese font: */
QFile fontFile(":/fonts/DroidSansJapanese.ttf");
if (!fontFile.open(QIODevice::ReadOnly))
isAglNavi = true;
connect(this, SIGNAL(positionGotSignal()), this, SLOT(positionGot()));
- connect(this, SIGNAL(allRoutesGotSignal()), this, SLOT(allRoutesGot()));
- connect(this, SIGNAL(routeCreatedSignal()), this, SLOT(routeCreated()));
this->setGeometry(QRect(this->pos().x(), this->pos().y(), COMPLETE_W_WITH_KB, COMPLETE_H_WITH_KB));
this->setStyleSheet("background-image: url(:/images/AGL_POI_Background.png);");
{
mutex.lock();
- this->setGeometry(QRect(this->pos().x(), this->pos().y(), COMPLETE_W_WITH_KB, COMPLETE_H_WITH_KB));
-
if (display)
{
lineEdit.setVisible(true);
if (pResultList)
{
pResultList->removeEventFilter(this);
- delete pResultList;
- pResultList = NULL;
+ pResultList->setVisible(false);
}
if (pInfoPanel)
{
- delete pInfoPanel;
- pInfoPanel = NULL;
+ pInfoPanel->setVisible(false);
}
lineEdit.setText(tr(""));
lineEdit.setVisible(false);
system(cmd);
}
-void MainApp::DisplayResultList(bool display, bool RefreshDisplay)
+void MainApp::DisplayResultList(bool display)
{
mutex.lock();
//font.setPointSize(FONT_SIZE_LIST);
//pResultList->setFont(font);
pResultList->installEventFilter(this);
- }
- pResultList->setGeometry(QRect( LEFT_OFFSET+searchBtn.width()+SPACER, searchBtn.height()+SPACER,
- DISPLAY_WIDTH, DISPLAY_HEIGHT));
- if (RefreshDisplay)
- {
- this->setGeometry(QRect(this->pos().x(), this->pos().y(), COMPLETE_W_WITH_KB, COMPLETE_H_WITH_KB));
+ pResultList->setGeometry(QRect(LEFT_OFFSET + searchBtn.width() + SPACER,
+ searchBtn.height() + SPACER,
+ DISPLAY_WIDTH,
+ DISPLAY_HEIGHT));
}
pResultList->setVisible(true);
pResultList->setFocus();
+ pResultList->update();
}
else
{
if (pResultList)
{
pResultList->removeEventFilter(this);
- pResultList->deleteLater();
- pResultList = NULL;
+ pResultList->setVisible(false);
+ pResultList->update();
}
-
lineEdit.setFocus();
-
- if (RefreshDisplay)
- {
- this->setGeometry(QRect(this->pos().x(), this->pos().y(), COMPLETE_W_WITH_KB, COMPLETE_H_WITH_KB));
- }
}
mutex.unlock();
TRACE_INFO("New text is: %s", qPrintable(text));
/* do not handle text input if info panel is displayed: */
- if (pInfoPanel) return;
+ if (pInfoPanel && pInfoPanel->isVisible())
+ return;
mutex.lock();
}
this->currentSearchingText = text;
- /* we need to know our current position */
- std::vector<int32_t> Params;
- Params.push_back(naviapi::NAVICORE_LONGITUDE);
- Params.push_back(naviapi::NAVICORE_LATITUDE);
- naviapi.getPosition(Params);
+ emit positionGotSignal();
mutex.unlock();
}
mutex.lock();
if (isInfoScreen)
{
- DisplayInformation(true, false);
+ DisplayInformation(true);
}
else
{
{
case Qt::Key_Escape:
TRACE_DEBUG("Escape !");
- DisplayInformation(false, false);
+ DisplayInformation(false);
DisplayResultList(true);
FillResultList(Businesses, currentIndex);
break;
this->destinationLatitude = Businesses[index].Latitude;
this->destinationLongitude = Businesses[index].Longitude;
- naviapi.getAllRoutes();
+ SetWayPoints(0);
mutex.unlock();
+
+ if (navWinRaiseCb) {
+ // Attempt to let any outstanding repaints finish by flushing
+ // and then waiting slightly before raising the nav window.
+ // It's currently unclear why repaints can be missed if this
+ // is not done.
+ qApp->processEvents();
+
+ //TRACE_DEBUG("Calling nav window raise callback");
+ QTimer::singleShot(100, this, SLOT(callNavWinRaiseCb()));
+ }
}
-void MainApp::DisplayInformation(bool display, bool RefreshDisplay)
+void MainApp::DisplayInformation(bool display)
{
mutex.lock();
if (display)
/* select the first selected item : */
currentIndex = pResultList->indexOfTopLevelItem(*SelectedItems.begin());
- /* Resize window: */
- DisplayResultList(false, false);
+ /* Hide results */
+ DisplayResultList(false);
/* Display info for the selected item: */
- QRect rect( LEFT_OFFSET+searchBtn.width()+SPACER, searchBtn.height()+SPACER,
- DISPLAY_WIDTH, DISPLAY_HEIGHT);
- pInfoPanel = new InfoPanel(this, Businesses[currentIndex], rect);
-
- if (RefreshDisplay)
- {
- this->setGeometry(QRect(this->pos().x(), this->pos().y(), COMPLETE_W_WITH_KB, COMPLETE_H_WITH_KB));
+ if (!pInfoPanel) {
+ QRect rect(LEFT_OFFSET + searchBtn.width() + SPACER,
+ searchBtn.height(),
+ DISPLAY_WIDTH,
+ DISPLAY_HEIGHT);
+ pInfoPanel = new InfoPanel(this, rect);
}
+ pInfoPanel->populateInfo(Businesses[currentIndex]);
+ pInfoPanel->setVisible(true);
+ pInfoPanel->update();
connect(pInfoPanel->getGoButton(), SIGNAL(clicked(bool)), this, SLOT(goClicked()));
connect(pInfoPanel->getCancelButton(), SIGNAL(clicked(bool)), this, SLOT(cancelClicked()));
{
if (pInfoPanel)
{
+ pInfoPanel->setVisible(false);
pInfoPanel->getGoButton()->disconnect();
pInfoPanel->getCancelButton()->disconnect();
- delete pInfoPanel;
- pInfoPanel = NULL;
+ pInfoPanel->update();
}
lineEdit.setFocus();
-
- if (RefreshDisplay)
- {
- this->setGeometry(QRect(this->pos().x(), this->pos().y(), COMPLETE_W_WITH_KB, COMPLETE_H_WITH_KB));
- }
}
mutex.unlock();
return;
}
-
-
currentIndex = 0;
Businesses.clear();
ParseJsonBusinessList(buf.data(), Businesses);
}
/* end of workaround */
-bool MainApp::CheckNaviApi(int argc, char *argv[])
-{
- bool ret = naviapi.connect(argc, argv, this);
-
- if (ret == true)
- {
- naviapi.getAllSessions();
- }
-
- return ret;
-}
-
int MainApp::AuthenticatePOI(const QString & CredentialsFile)
{
char buf[512];
void MainApp::SetWayPoints(uint32_t myRoute)
{
/* set the destination : */
- naviapi::Waypoint destWp(this->destinationLatitude, this->destinationLongitude);
- std::vector<naviapi::Waypoint> myWayPoints;
- myWayPoints.push_back(destWp);
- naviapi.setWaypoints(navicoreSession, myRoute, true, myWayPoints);
-
- naviapi.calculateRoute(navicoreSession, myRoute);
-
- /* reset search: */
- currentSearchingText = tr("");
- currentSearchedText = tr("");
- currentIndex = 0;
- Businesses.clear();
+ naviapi->broadcastStatus("stop");
+ naviapi->sendWaypoint(this->destinationLatitude, this->destinationLongitude);
}
void MainApp::goClicked()
{
TRACE_DEBUG("Go clicked !");
+ DisplayInformation(false);
+ DisplayResultList(true);
+
SetDestination(currentIndex);
- DisplayLineEdit(false);
}
void MainApp::cancelClicked()
{
TRACE_DEBUG("Cancel clicked !");
- DisplayInformation(false, false);
- DisplayResultList(true, false);
- FillResultList(Businesses, currentIndex);
+ DisplayInformation(false);
+ DisplayResultList(true);
}
void MainApp::getAllSessions_reply(const std::map< uint32_t, std::string >& allSessions)
mutex.unlock();
}
-
-void MainApp::getPosition_reply(std::map< int32_t, naviapi::variant > position)
-{
- mutex.lock();
-
- std::map< int32_t, naviapi::variant >::iterator it;
- for (it = position.begin(); it != position.end(); it++)
- {
- if (it->first == naviapi::NAVICORE_LATITUDE)
- {
- currentLatitude = it->second._double;
- }
- else if (it->first == naviapi::NAVICORE_LONGITUDE)
- {
- currentLongitude = it->second._double;
- }
- }
-
- TRACE_INFO("Current position: %f, %f", currentLatitude, currentLongitude);
-
- mutex.unlock();
-
- emit positionGotSignal();
-}
-
-void MainApp::getAllRoutes_reply(std::vector< uint32_t > allRoutes)
-{
- mutex.lock();
-
- uint32_t routeHandle = 0;
-
- if (allRoutes.size() != 0)
- {
- routeHandle = allRoutes[0];
- }
-
- this->currentRouteHandle = routeHandle;
-
- mutex.unlock();
-
- emit allRoutesGotSignal();
-}
-
-void MainApp::createRoute_reply(uint32_t routeHandle)
-{
- mutex.lock();
-
- this->currentRouteHandle = routeHandle;
-
- mutex.unlock();
-
- emit routeCreatedSignal();
-}
-
void MainApp::positionGot()
{
mutex.lock();
mutex.unlock();
}
-
-void MainApp::allRoutesGot()
-{
- mutex.lock();
-
- /* check if a route already exists, if not create it : */
- if (this->currentRouteHandle == 0)
- {
- naviapi.createRoute(navicoreSession);
- }
- else
- {
- naviapi.pauseSimulation(navicoreSession);
- naviapi.setSimulationMode(navicoreSession, false);
- naviapi.cancelRouteCalculation(navicoreSession, this->currentRouteHandle);
- sleep(1);
-
- SetWayPoints(this->currentRouteHandle);
- }
-
- mutex.unlock();
-}
-
-void MainApp::routeCreated()
-{
- mutex.lock();
-
- SetWayPoints(this->currentRouteHandle);
-
- mutex.unlock();
-}
-